Le sharepoint test% eax% eax

Duplication possible:
x86 Assembly – ‘testl’ eax contre eax?

Je suis très novice en matière de programmation en langage d’assemblage et j’essaie actuellement de lire le langage d’assemblage généré à partir d’un fichier binary. J’ai traversé

test %eax,%eax 

ou test %rdi, %rdi , etc. etc. Je suis très confus quant à ce que cela fait. Les valeurs dans %eax, %eax les mêmes? Qu’est-ce que c’est tester? J’ai lu quelque part qu’il fait l’opération AND ….. mais comme ils ont la même valeur, ne renverrait-il pas simplement %eax ?

Ce qui suit est une instance où j’ai trouvé cette utilisation:

  400e6e: 85 c0 test %eax,%eax 400e70: 74 05 je 400e77  

Je pensais que je saute si les deux valeurs comparées sont égales …… eh bien, parce que %eax porte bien, dans quelle situation ne sauterions-nous PAS?

Je suis un débutant à la programmation en général, alors je l’apprécierais beaucoup si quelqu’un pouvait m’expliquer. Merci!

CMP soustrait les opérandes et définit les indicateurs. À savoir, il définit le drapeau zéro si la différence est égale à zéro (les opérandes sont égaux).

TEST définit l’indicateur zéro, ZF , lorsque le résultat de l’opération AND est zéro. Si deux opérandes sont égaux, leur bit AND est nul lorsque les deux sont nuls. TEST définit également l’indicateur de signe, SF , lorsque le bit le plus significatif est défini dans le résultat, et l’indicateur de parité, PF , lorsque le nombre de bits définis est pair.

JE [Jump if Equals] teste le drapeau zéro et saute si le drapeau est défini. JE est un alias de JZ [Jump si Zero], donc le désassembleur ne peut pas en sélectionner un basé sur l’opcode. JE est nommé ainsi car l’indicateur zéro est défini si les arguments de CMP sont égaux.

Alors,

 TEST %eax, %eax JE 400e77  

saute si le %eax est nul.

Certaines instructions x86 sont conçues pour laisser le contenu des opérandes (registres) telles quelles et définir / désactiver uniquement des indicateurs de processeur internes spécifiques, tels que l’indicateur zéro (ZF). Vous pouvez penser au ZF comme un indicateur booléen true / false qui réside dans le CPU.

Dans ce cas particulier, l’instruction TEST exécute un ET logique au niveau du bit, supprime le résultat réel et définit / désélectionne le ZF en fonction du résultat du logique et: si le résultat est nul, il définit ZF = 1;

Les instructions de saut conditionnel comme JE sont conçues pour regarder le ZF pour sauter / sauter, donc utiliser TEST et JE ensemble équivaut à effectuer un saut conditionnel basé sur la valeur d’un registre spécifique:

Exemple:

TEST EAX, EAX
JE un_adresse

le CPU passera à “some_address” si et seulement si ZF = 1, autrement dit si et seulement si AND (EAX, EAX) = 0 qui à son tour peut apparaître si et seulement si EAX == 0

le code C équivalent est:

 if(eax == 0) { goto some_address } 

Cela vérifie si EAX est zéro. Le test instruction effectue un bit AND entre les arguments, et si EAX contient zéro, le résultat définit le ZF ou ZeroFlag.

test est non destructif and , il ne renvoie pas le résultat de l’opération, mais il définit le registre en conséquence. Pour savoir ce que cela teste vraiment, vous devez vérifier les instructions suivantes. Souvent, out est utilisé pour vérifier un registre contre 0, éventuellement couplé à un saut conditionnel jz .

Vous avez raison, ce test “et” s les deux opérandes. Mais le résultat est ignoré, la seule chose qui rest, et la partie la plus importante, ce sont les drapeaux. Ils sont définis et c’est la raison pour laquelle l’instruction de test est utilisée (et existe).

JE saute pas quand il est égal (il a le sens quand l’instruction précédente était une comparaison), ce qu’il fait vraiment, il saute quand le drapeau ZF est mis. Et comme il s’agit de l’un des indicateurs définis par test , cette séquence d’instructions (test x, x; je …) a la signification de sauter lorsque x vaut 0.

Pour des questions comme celle-ci (et pour plus de détails), je peux simplement recommander un livre sur les instructions x86.