web-dev-qa-db-fra.com

La différence entre cmpl et cmp

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!

11
Sarah cartenz

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
19
glglgl

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.

1
typ1232