Aide à comprendre les instructions de test x64

Sep 23 2020

J'ai lu que TEST fait un peu au niveau du bit et sur les deux arguments. J'ai également lu que jz et je sont tous les deux équivalents et sautent si l'indicateur zéro est défini. Alors, voici le problème avec lequel je lutte. Considérez le code suivant (plutôt inutile):

mov ax, 0x2
test ax, 0x2
je equal
mov ax, 0x0
jmp done
equal:
mov ax, 0x1
done:

Logiquement, "sauter si égal" devrait sauter, mais 0x2 et 0x2 ne devraient pas définir l'indicateur zéro. Si je comprends bien, jz / je sautera si l'indicateur zéro est défini, cela signifie que je ne fait pas logiquement ce que cela implique ("sauter si égal"). Et dans la pratique, le code échouera et définira ax sur 0x0, plutôt que de sauter et de définir ax sur 0x1.

Quelqu'un peut-il expliquer où ma compréhension ne va pas? De toute évidence, je ne comprends pas quelque chose correctement.

Merci!

Réponses

3 blabb Sep 23 2020 at 16:15

je est normalement utilisé avec des instructions cmp comme

cmp Reg16/32/64,const
je someplace

tandis que jz est normalement utilisé pour vérifier spécifiquement 0 ou nul comme

dec reg16/32/64 
jz someplace

Je viens de modifier votre code en une boucle infinie et de l'émuler dans l'émulateur x86, voir ci-dessous pour le code et le gif.

code

mov ax, 0x2
dec     ax
and     ax, 0x1
jz  equal
je  equal
test    ax, 1
jz  equal
je  equal
cmp     ax, 1
redo:
jz  equal
equal:
je  redo