2010-05-10 5 views
7

(ia32), par exemple,test si un registre lui-même est égal à ia32

test $eax, $eax 

pourquoi voudriez-vous jamais faire cela? il fait $eax & $eax, non? ne devrait-il pas toujours définir le registre de drapeau pour dire qu'ils sont égaux ..?

addendum: donc le test définira le ZF (comme mentionné ci-dessous) si le registre est zéro. Le test (utilisé ci-dessus) sert-il principalement à savoir si un registre est vide? et ZF est défini si oui?

+0

duplication possible de [x86 Assemblée - 'testl' eax contre eax?] (Http://stackoverflow.com/questions/147173/x86-assembly-testl-eax-against-eax) –

Répondre

9

Il va définir ZF (le drapeau zéro) si le registre est zéro. C'est probablement ce qui est le plus souvent utilisé pour tester. Il va également définir d'autres drapeaux de manière appropriée, mais il y a probablement beaucoup moins d'utilisation pour ceux-ci.

En outre, je devrais mentionner que test n'effectue pas vraiment une comparaison - il exécute un bit and opération (jetant le résultat, excepté les drapeaux).

Pour effectuer une comparaison des opérandes, l'instruction cmp serait utilisé, qui effectue une opération sub, jeter les résultats, sauf pour les drapeaux. Vous avez raison qu'un

cmp $eax, $eax 

aurait pas beaucoup de point, comme les drapeaux seraient fixés en fonction d'un résultat zéro à chaque fois.

+0

donc ce qui précède est utilisé sur en conjonction avec 'jne'. est-ce que 'jne' regarde le ZF? – sepiroth

+0

Oui - jne (jump not equal) vérifie le drapeau zéro conditionnellement pour un saut. –

+1

Oui - 'jne' va sauter si' ZF' n'est pas positionné ('jne' est équivalent'a' jnz' - car il s'agit du même opcode). –

1

Ceci définit le drapeau zéro, de la même façon que l'utilisation de or $eax,$eax peut également tester de manière non destructive le drapeau zéro.

+0

Bah, trop lent sur le tirage au sort ... –

1

Il définit les indicateurs Z et S sur le processeur, de sorte que vous pouvez dire après "test eax, eax" (ou tout autre registre 8, 16, 32 et je pense 64 bits) si la valeur est zéro, ou le bit de signe est défini, en utilisant "je/jne/jz/jnz" ou "js/jns" respectivement. En 30 ans de codage pour les architectures x80/​​x86, je l'ai fait un très grand nombre de fois, avec la plupart des combinaisons de registres. (Vous n'utilisez pas cela en pratique sur ESP!)

IIRC, il y a un bit de parité qui est calculé aussi, donc par ce test, vous pouvez dire si le nombre de bits dans le registre est pair ou impair, en utilisant "jp/jnp". J'ai jamais avait une utilisation pour cela.

1

Cette instruction n'est pas destinée à vérifier uniquement si la valeur de %eax est zéro. Il peut être utilisé dans son ensemble pour vérifier si la valeur %eax est zéro ou positive ou négative. Le plus grand avantage de l'utiliser de cette façon est qu'il ne modifie pas la valeur de %eax (après avoir exécuté %eax & %eax, il supprime simplement la valeur) et définit les indicateurs de condition comme suit.

si% valeur EAX est égale à zéro, OF, CF, ZF = 0 (à zéro)
autre SF = MSB of the result (ici, le résultat est %eax & %eax). Donc, si le nombre est négatif, nous obtenons SF = 1, sinon SF = 0.