Frage

(ia32) zum Beispiel,

test $eax, $eax

Warum solltest du das jemals tun wollen?es tut $eax & $eax, Rechts?sollte das nicht sein stets Setzen Sie das Flag-Register, um anzuzeigen, dass sie gleich sind.?

Nachtrag:Daher wird test die ZF (wie unten erwähnt) festlegen, wenn das Register Null ist.Wird test (wie oben verwendet) also hauptsächlich nur verwendet, um festzustellen, ob ein Register leer ist?und ZF ist eingestellt, wenn ja?

War es hilfreich?

Lösung

Es wird gesetzt ZF (der Null-Flag), wenn das Register gleich Null ist. Das ist wahrscheinlich, was es am häufigsten zu Test verwendet. Es wird auch andere Flags in geeigneter Weise eingestellt, aber es ist wahrscheinlich weit weniger Gebrauch für diejenigen.

Auch sollte ich das test erwähnen führt nicht wirklich einen Vergleich -. Es führt eine bitweise and Operation (wirft das Ergebnis entfernt, mit Ausnahme der Flaggen)

einen Vergleich der Operanden auszuführen, die cmp Anweisung verwendet werden würde, die führt einen sub Betrieb, werfen die Ergebnisse weg mit Ausnahme der Flaggen. Sie sind richtig, dass ein

cmp $eax, $eax

würde nicht viel Sinn haben, als die Fahnen jedes Mal nach einem Null-Ergebnis gesetzt werden würde.

Andere Tipps

Dies ist den Null-Flag eingestellt wird, die gleiche Art und Weise, dass die Verwendung or $eax,$eax zerstörungs Test für den Null-Flag als auch.

Es setzt die Z- und S-Flags auf dem Prozessor, sodass Sie nach „test eax,eax“ (oder jedem anderen Register mit 8, 16, 32 und ich glaube 64 Bit) erkennen können, ob der Wert Null ist oder ob das Vorzeichenbit Null ist festgelegt, indem Sie „je/jne/jz/jnz“ bzw. „js/jns“ verwenden.In den 30 Jahren, in denen ich für x80/x86-Architekturen programmiert habe, habe ich das sehr oft gemacht, mit den meisten Registerkombinationen.(Sie verwenden dies in der Praxis nicht auf ESP!)

IIRC, es gibt auch ein Paritätsbit, das berechnet wird. Mit diesem Test können Sie mithilfe von „jp/jnp“ feststellen, ob die Anzahl der im Register gesetzten Bits gerade oder ungerade ist.Ich habe niemals hatte dafür eine Verwendung.

Mit dieser Anweisung soll nicht nur überprüft werden, ob der Wert von %eax ist Null.Es kann als Ganzes verwendet werden, um den Wert zu überprüfen %eax ist Null oder positiv oder negativ.Der größte Vorteil dieser Verwendung besteht darin, dass der Wert nicht verändert wird %eax (nach der Aufführung %eax & %eax, es verwirft einfach den Wert) und setzt die Bedingungsflags wie folgt.

wenn der %eax-Wert Null ist, OF, CF, ZF = 0 (auf Null gesetzt)
anders SF = MSB of the result (Hier ist das Ergebnis %eax & %eax).Wenn die Zahl also negativ ist, erhalten wir SF = 1, ansonsten SF = 0.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top