Ich versuche die Montage zu verstehen, um ein Puzzle zu lösen. Ich habe jedoch die folgenden Anweisungen gefunden:
%Vor%Was ich denke, ist es: Der Wert von 0x14 (% rsp) ist -7380. Nach meinem Verständnis vergleicht cmpl unsigned. Auch der Sprung wird durchgeführt. So kann es sein, dass (unsigned) -7380 & gt; 7 (unsigniert) 7380 & gt; 7 - & gt; springe
Ich will eigentlich nicht, dass es springt. Aber ist das die richtige Erklärung oder nicht? Spreche ich Argumente?
Auch wenn Sie einen Rat haben, wie Sie diesen Sprung manipulieren können!
Nach meinem Verständnis vergleicht
cmpl
unsigned.
Es tut beides in gewisser Weise.
Der Unterschied zwischen signed und unsigned ist hier die Verwendung der Sprunganweisungen.
Für >
gibt es ja
für unsigned und jg
für signed (springe wenn über und springe wenn größer).
Für <
gibt es jb
für unsigned und jl
für signed (springe wenn unten und springe wenn weniger).
Um genau zu sein, hier ist die Bedeutung von mehreren Sprungbefehlen:
Für vorzeichenlose Vergleiche:
%Vor%Für vorzeichenbehaftete Vergleiche:
%Vor%
Ich glaube nicht, dass x86 tatsächlich eine Anweisung namens CMPL
hat. Es ist wahrscheinlich Teil Ihrer Assembler-Syntax, Hinweise zu Operanden oder etwas anderem zu geben (wie JZ
und JE
sind gleich).
Aus dem Intel-Handbuch, was es macht:
Vergleicht den ersten Quelloperanden mit dem zweiten Quelloperanden und setzt den Statusflags im EFLAGS-Register entsprechend den Ergebnissen. Der Vergleich ist durchgeführt, indem der zweite Operand vom ersten Operanden subtrahiert und dann gesetzt wird die Statusflags in der gleichen Weise wie der SUB-Befehl. Wenn eine sofortige Der Wert wird als Operand verwendet, er wird vorzeichenerweitert auf die Länge des ersten Operanden.
Sign-ness ist implizit gegeben, wegen der Zweierkomplement-Repräsentation von Zahlen.
Wie manipuliere ich den Sprung? Wenn Sie sicher sind, dass der Sprung das genaue Gegenteil von dem ist, was Sie tun, müssen Sie nur JA
in JBE
ändern.