Wie erfolgt die Montage der TEST-Anweisung-arbeiten mit diesen jump-Anweisungen?
AT&T assembly-syntax, ich versuche zu verstehen, wie testl
verwendet wird, in Assembler-code. Speziell:
testl %edx, %edx
jle .L3
Ich weiß testl
führt eine bitweise and
mit dem gleichen Wert auf den Zustand festlegen, der Flaggen, aber wie kann ich das interpretieren 'springe wenn kleiner oder gleich', wenn es nicht zwei Werte verglichen?
- Nicht sicher, es ist eigentlich ein dup, aber sollte man sich ansehen, stackoverflow.com/questions/4557279/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ein Auszug aus der offiziellen Dokumentation von Intel im test:
Und das gleiche auf jle:
So, der Sprung wird durchgeführt, wenn
edx
ist 0 (weiledx AND edx = edx
und dass die 0 nur, wennedx
0 ist, und daZF
ist auf 1 gesetzt, wenn das ErgebnisAND
ist 0), oder wenn das höchstwertigste bit vonedx
ist 1 (weilSF = most significant bit
vonedx AND edx
(oder, was dasselbe ist, deredx
selbst) undOF
ist immer 0, was bedeutet, dassSF ≠ OF
ist nur wahr, wennSF ≠ 0
).IOW, der Sprung wird nur ausgeführt, wenn
edx
≤ 0, wenn Sie interpretiert wird als Ganzzahl oder, was dasselbe ist, wennedx
ist entweder 0 oder größer oder gleich als 0x80000000, wenn Sie interpretiert wird als unsigned integer.0 or >= 0x80000000
!cmp edx, 5
odersub edx, 5
wäre Sie betrachtenedx-5
vs 0 statt nuredx
vs 0.In x86 Assembler fast alle bedingten Sprünge basieren auf Fahnen (außer
jcxz
,jecxz
,loop
undloopne
/loopnz
). Dies bedeutet, dass alles, was zählt sind die Werte der flags haben.jle
ist gleichbedeutend mitjng
. Die Sprung-Bedingung istZF = 1 or SF <> OF
. Sie können prüfen wollen Intel x86 SPRINGEN quick reference.test
nicht gesetzt, alle Fahnen außerAF
link, so sieht alles gut aus so weit.Laut dieser link logischen Operationen, die immer null
OF
. Das bedeutet, dass Ihre springen wäre praktischZF = 1 or SF = 1
werden, also in deinem codejle
springen würde, wennedx
war0
oder zwischen reichen0x80000000
...0xffffffff
.TESTL
mit identische Argumente (wieedx
undedx
) setzt die flags entsprechend dem Wert, der das argument selbst (da x UND x ist identisch mit x). So können wir vergessen, über dieAND
insgesamt hier, da es verworfen - alle müssen wir uns auseinandersetzen, ist der Wert inedx
.Mit
TESTL
das zero-flagZF
nur auf 1 festgelegt, wenn der Wert null ist.TESTL
auch Kräfte, die überlauf-flagOF
auf 0 und setzt das sign-flagSF
nur, wenn das höchste bit gesetzt ist.JLE
wird dann springen, wenn entwederZF
auf 1 gesetzt ist, oderSF <> OF
.So, der Sprung wird ausgeführt, wenn entweder:
edx
null war; oderedx
hatte seine high-bit gesetzt.Daher wird es springen für
edx
Werte0
oder0x80000000 - 0xffffffff
.Wahrscheinlich ist dies ein überprüfen, um sicherzustellen, dass die Zahl eine Natürliche Zahl
0x00000001 - 0x7fffffff
, der Sprung wäre zu einer error-handling-routine irgendeiner Art und eine gültige Natürliche Zahl würde weiter ohne zu springen, so etwas wie:Für eine Beschreibung der verschiedenen Sprünge und die flags, die Sie verwenden, finden Sie unter hier.