J'essaie de trouver en ligne l'utilisation de la fonction de langage d'assemblage "je". J'ai lu que je signifie sauter si égal et c'est exactement ce que je veux. Quelle est l'utilisation réelle de cette fonction, ou en d'autres termes, comment puis-je taper cette fonction pour vérifier une valeur et sauter si elle est égale à quelque chose?
S'il vous plaît, faites-moi savoir.
BTW, j'utilise NASM si cela fait une différence.
Supposons que vous souhaitiez vérifier si EAX
est égal à 5
, et effectuez différentes actions en fonction du résultat de cette comparaison. Une instruction if, en d'autres termes.
; ... some code ...
cmp eax, 5
je .if_true
; Code to run if comparison is false goes here.
jmp short .end_if
.if_true:
; Code to run if comparison is true goes here.
.end_if:
; ... some code ...
Cela sautera si le "drapeau égal" (également appelé "drapeau zéro") dans le registre FLAGS
est défini. Cela est défini à la suite d'opérations arithmétiques ou d'instructions telles que TEST
et CMP
.
Par exemple: (si la mémoire est bonne, c'est correct :-)
cmp eax, ebx; Soustrayez EBX de EAX - le résultat est rejeté ; mais le registre FLAGS est défini en fonction du résultat. je .SomeLabel; Passez à une étiquette si le résultat est nul (c'est-à-dire qu'ils sont égaux). ; C'est aussi la même instruction que "jz".
Je dois dire que je func consiste à tester si le drapeau zéro est défini, puis à sauter ailleurs ou à passer à l'instruction suivante qui suit.
test cx, cx
je some_label
L'instruction de test fait juste un ET au niveau du bit des deux opérandes, et définit le FLAG en fonction du résultat ET. L'instruction je utilise ensuite le drapeau ZERO pour décider de sauter ou de continuer.
Le code ci-dessus est utilisé pour vérifier si cx est zéro ou non.
REMARQUE: je n'est pas pour tester l'égalité, mais pour tester le drapeau ZERO qui est défini par une instruction avant cela.
Vous précéderez le je
d'un cmp
(ou test
ou équivalent) généralement, ce qui définit un indicateur dans le registre EFLAGS. Voici un lien vers un serveur d'écho simple dans NASM qui pourrait aider en général. Ignorez les publicités Google ennuyeuses.
Un exemple d'utilisation de je
peut être:
cmp eax, ebx
je RET_FAIL
jmp RET_SUCCESS
RET_FAIL:
Push 1
pop eax
ret
RET_SUCCESS:
Push 0
pop eax
ret
Eh bien, j'ai finalement trouvé ma réponse. : P Fondamentalement, vous appelez je label_to_jump_to après un appel cmp.
Si cmp montre que les deux valeurs sont égales, je passera à l'étiquette spécifiée. Sinon, l'exécution se poursuivra.