2016-07-04 26 views
0

weiß nicht, wie es mit 80000000h funktioniert.Wie funktioniert "und eax, 80000000h" in der Montage

move eax, op1; 
    AND eax, 80000000h; 
    jz l1; 

Ich bin verwirrt, wie es negative und positive von op1 zu überprüfen arbeiten?

+0

Der üblichere Weg, wie man es testet, ist die Verwendung des zerstörungsfreien Tests (in deinem Beispiel wird die Kopie des 'op1' Wertes in' eax' durch 'und' zerstört. Es gibt eine x86 Anweisung namens' TEST' (deja vu?), die 'AND' der Operanden ausführt, die Flag-Register entsprechend dem Ergebnis setzt, aber das Ergebnis selbst wird weggeworfen (nicht gespeichert). In Ihrem Beispiel:' mov eax, op1' 'test eax, eax' 'jz zero'' jns positiv' 'js negativ' wird den sign/nosign Test machen, während die Kopie von op1 in eax bleibt, und auch ohne die Konstante (da alle negativen Zahlen 0x80000000 Bit gesetzt haben) – Ped7g

Antwort

2

Werte in Registern werden im Zweierkomplementformat gespeichert, und das höchste Bit entspricht dem negativen Vorzeichen. Die Konstante 80000000h entspricht dem höchsten Bit, das im Binärwert 1000 0000 0000 0000 0000 0000 0000 0000 gesetzt ist. Das Anwenden von and damit auf das Register eax führt nur dann zu einer Null, wenn das höchste Bit eax gesetzt ist, dh die in eax gespeicherte Zahl ist negativ. Der bedingte Sprung wird in diesem Fall nicht ausgelöst. Sie führt zu Null, wenn das oberste Bit nicht gesetzt ist, dh wenn der Wert nicht negativ ist (0 oder positiv) und der bedingte Sprung jz ausgelöst wird.