CMP und overflow-flag
-
Bin ein Anfänger in Assembler hab nur ein Bisschen was darüber gelesen.
In welchem Fall würde bei CMP x,y das overflow-flag gesetzt? Ich hab mit vielen zahlen rumexpermentiert aber das overflow-flag war immer auf 0.
Mit diesem Prog hab ich das getestet:void main() { int x=???; int y=???; int overflow=0; __asm { MOV EAX,x MOV EBX,y CMP EAX,EBX JO overflowflag JMP ende overflowflag: MOV overflow,1 ende: } printf("overflow-flag: %i",overflow); }
Für die Fragezeichen hab ich natürlich zahlen eingesetzt
MfG
[ Dieser Beitrag wurde am 06.01.2003 um 18:30 Uhr von JokerXXL editiert. ]
-
Tja, gewusst wie
Cmp ist im Grunde eine Subtraktions-Anweisung, bei der nur die Flags gesetzt und das Ergebnis ignoriert wird.
Das OverflowFlag wird bei solchen Rechenoperationen bei einem Integer-Overflow gesetzt. (Grenze zwischen -/+ wird nicht bei 0 ueberschritten => bei einem 8Bit short int ist das der uebergang von -128 zu +127 d.h. von 80h zu 7Fh)
Folglich setzt der 8Bit-Vergleich von 9Eh (1. Operand) und 25h (2. Operand) das OF, da 9Eh-25h = 79h oder signed dezimal: -97 - 37 = +121Etwas veraenderter Beispielcode:
MOV al,0x9E MOV bl,0x25 CMP al,bl JO overflowflag JMP ende overflowflag: MOV overflow,1 ende:
-
Hmm, danke
Nächte Frage:
Es gibt: JA und JG usw...
Das bedeutet ja dann, dass man vor dem Vergleich wissen muss, ob in den variablen negative oder positive Zahlen stehen.
Gibt es keine Möglichkeit beliebige Zahl x mit einer beliebigen Zahl y zu vergleichen, ohne dass man weiß, ob sie negativ oder positiv sind?MfG
-
Dafür müsstest du JG verwenden, da nur JA von vorzeichenlosen Zahlen ausgeht.
Der Unterschied liegt darin, dass JG von vorzeichenbehafteten Zahlen ausgeht, JA von vorzeichenlosen.
Wenn du 2 positive 32Bit-Zahlen hast, beide unter 2^31, sollte es AFAIK keinen Unterschied machen. Zahlen über 2^31 sind logischerweise vorzeichenlos. Zahlen <0 sehen nämlich genauso aus wie Zahlen >2^31.[ Dieser Beitrag wurde am 06.01.2003 um 19:55 Uhr von cd9000 editiert. ]
-
Axo, danke