Der Unterschied zwischen cmpl-und cmp
Ich versuche zu verstehen assembly in der Lage sein, ein puzzle zu lösen. Allerdings habe ich festgestellt, die folgenden Anweisungen:
0x0000000000401136 <+44>: cmpl $0x7,0x14(%rsp)
0x000000000040113b <+49>: ja 0x401230 <phase_3+294>
Was ich denke, sein tun ist:
Der Wert 0x14(%rsp) ist -7380. Nach meinem Verständnis cmpl vergleicht unsigned. Auch der Sprung durchgeführt wird.
So kann es sein, dass die (unsigned)-7380 > 7
(unsigned)7380 > 7--> springe
Ich eigentlich nicht wollen, es zu springen. Aber ist das die richtige Erklärung ist oder nicht? Bin ich blätterte Argumente?
Auch, wenn Sie irgendwelche Ratschläge darüber, wie zu manipulieren das springen!
- l in cmpl ist, legen Sie den 32-bit-Speicher-argument. ein Teil des ja ist anzugeben, signed/unsigned. Blick bis auf branch-Instruktionen.
- Wahrscheinlich eine gute Idee zu erwähnen (und tag), was Prozessor Architektur gemeint.
- es ist nur die AT&T-syntax Größe suffix
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tut es beide, in einer Art und Weise.
Den Unterschied im signed vs. unsigned ist hier die Verwendung des jump-Anweisungen.
Für
>
gibt esja
für unsigned undjg
für unterzeichnet (springen, wenn Sie die oben und springe wenn größer).Für
<
gibt esjb
für unsigned undjl
für unterzeichnet (springen, wenn unten und springe wenn kleiner).Um genau zu sein, hier ist der Sinn von mehreren Sprung-Befehle:
Ich glaube nicht, dass x86 eigentlich eine Anweisung genannt
CMPL
. Es ist wohl Teil Ihrer assembler-syntax geben Hinweise auf Operanden oder etwas anderes (wieJZ
undJE
sind die gleichen).Aus der intel-Handbuch auf, was Sie tut:
Sign-ness ist implizit gegeben, da der Zweierkomplement-Darstellung von zahlen.
Wie zu manipulieren, die springen? Wenn Sie sicher sind, dass der Sprung tun sollten, das genaue Gegenteil als das, was es tut, Sie nur zu ändern
JA
zuJBE
.