Aide à comprendre les instructions de test x64
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
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