Avatar billede mahh Nybegynder
29. oktober 1999 - 08:42 Der er 3 kommentarer og
1 løsning

Inline assembler

Hvorfor kan jeg ikke lave en shift right i inline assembler?

Jeg har noget kode som ser nogenlunde sådan her ud!

asm {
MOV AL, 0x80
MOV AH, 7
SHR AL, AH
}

Når jeg kompilere med Borland C++ 3.1 får jeg følgende fejl:
Error: Invalid combination of opcode and operands

Hvorfor virker SHR ikke?
Avatar billede soepro Nybegynder
29. oktober 1999 - 11:15 #1
Jeg får ingen kompileringsfejl med d.o. eksempel i min TC++3.0, men mon ikke de er fordi SHR shifter hele registret, dvs. egentlig AX ? I såfald giver det jo mening at du ikke kan bruge AL og AH, som jo er low og high byte af AX. Prøv med dette i stedet for:

asm {
  MOV AX, 0X80
  MOV BX, 7
  SHR AX, BX
}

Noget helt andet er at jeg ikke forstår hvorfor du ikke bare bruge C's standard operation til nøjagtig det samme:

A >>= 7;

(Shift A's indhold 7 bits til højre. A <<=4 shifter analogt 4 bits til venstre.)
Avatar billede mahh Nybegynder
29. oktober 1999 - 12:17 #2
Soepro >> Jeg forstår godt at mit eksempel virker, det skal virke, og det virker også på min.

Mit problem er at det reelle program ikke har SHR AL, AH men SHR AL, BL og det virker ikke fordi når man laver et SHR kald skal count værdien det register der indeholder hvor mange gange der skal shiftes til højre være AL, AH eller AX.

Du får point for svaret alligevel.

Tak!
Avatar billede mahh Nybegynder
29. oktober 1999 - 12:18 #3
PS.

soepro >> Grunden til at jeg ikke bruger C's funktion er at jeg gerne vil skrive det hele i inline assembler.
Avatar billede soepro Nybegynder
29. oktober 1999 - 14:17 #4
Men så kan du jo bare bruge varianten med BX - den fungerer også. (Om du skriver BX eller BL, har jo ingen betydning, hvis du specifikt flytter værdien 7. Ellers kan du jo cleare HIGH-bittene ved at AND'e med 0XF: AND AX, 0xF)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester