J'essaie de comprendre l'Assemblée pour pouvoir résoudre un puzzle. Cependant, j'ai rencontré les instructions suivantes:
0x0000000000401136 <+44>: cmpl $0x7,0x14(%rsp)
0x000000000040113b <+49>: ja 0x401230 <phase_3+294>
Ce que je pense que c'est: la valeur de 0x14 (% rsp) est -7380. Selon ma compréhension, le cmpl compare les informations non signées. Le saut est également effectué. Alors peut-il être que (non signé) -7380> 7 (non signé) 7380> 7 -> sauter
En fait, je ne veux pas qu'il saute. Mais est-ce la bonne explication ou non? Suis-je renverser les arguments?
Aussi, si vous avez des conseils sur la façon de manipuler ce saut!
Selon ma compréhension,
cmpl
compare non signé.
Il fait les deux, en quelque sorte.
La différence entre signé et non signé est ici l'utilisation des instructions de saut.
Pour >
, il y a ja
pour non signé et jg
pour signé (sauter si au-dessus et sauter si plus).
Pour <
, il y a jb
pour non signé et jl
pour signé (sauter si en dessous et sauter si moins).
Pour être exact, voici la signification de plusieurs commandes de saut:
Pour les comparaisons non signées:
JB/JNAE (CF = 1) : Jump if below/not above or equal JAE/JNB (CF = 0) : Jump if above or equal/not below JBE/JNA (CF = 1 or ZF = 1) : Jump if below or equal/not above JA/JNBE (CF = 0 and ZF = 0): Jump if above/not below or equal
Pour les comparaisons signées:
JL/JNGE (SF <> OF) : Jump if less/not greater or equal JGE/JNL (SF = OF) : Jump if greater or equal/not less JLE/JNG (ZF = 1 or SF <> OF): Jump if less or equal/not greater JG/JNLE (ZF = 0 and SF = OF): Jump if greater/not less or equal
Je ne pense pas que x86 ait réellement une instruction appelée CMPL
. Cela fait probablement partie de la syntaxe de votre assembleur pour donner des conseils sur les opérandes ou autre chose (comme JZ
et JE
étant les mêmes).
Du manuel d'Intel sur ce qu'il fait:
Compare le premier opérande source avec le second opérande source et définit les indicateurs d'état dans le registre EFLAGS en fonction des résultats. La comparaison est effectuée en soustrayant le deuxième opérande du premier opérande et en définissant ensuite les indicateurs d'état de la même manière que l'instruction SUB. Lorsqu'une valeur immédiate est utilisée comme opérande, elle est étendue par signe jusqu'à la longueur du premier opérande.
La signature est donnée implicitement, en raison de la représentation complémentaire des nombres par les deux.
Comment manipuler le saut? Si vous êtes sûr que le saut doit faire exactement le contraire de ce qu'il fait, il vous suffit de changer JA
en JBE
.