web-dev-qa-db-fra.com

Langue de montage fonction de saut je

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.

16
QAH

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 ...
20
bcat

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".
13
asveikau

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.

  • Si cx est égal à zéro, le test mettra le drapeau à zéro, puis je fera sauter à un certain endroit;
  • Si cx n'est pas nul, le test ne mettra pas le drapeau zéro, je continuera à exécuter l'instruction qui suit.

REMARQUE: je n'est pas pour tester l'égalité, mais pour tester le drapeau ZERO qui est défini par une instruction avant cela.

8
wljackhero

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
2
mrduclaw

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.

1
QAH