Question

(ia32) par exemple,

test $eax, $eax

pourquoi voudriez-vous faire ça ?Cela fait $eax & $eax, droite?ça ne devrait pas être le cas toujours définir le registre des drapeaux pour dire qu'ils sont égaux ..?

Addenda:donc le test définira le ZF (comme mentionné ci-dessous) si le registre est zéro.le test (tel qu'utilisé ci-dessus) est-il principalement utilisé uniquement pour savoir si un registre est vide ?et ZF est défini si oui ?

Était-ce utile?

La solution

Il va régler ZF (le drapeau zéro) si le registre est égal à zéro. C'est probablement ce qu'il est le plus souvent utilisé pour tester. Il va également définir d'autres drapeaux de façon appropriée, mais il y a probablement beaucoup moins utilisé pour ceux-ci.

En outre, je dois mentionner que test n'effectue pas vraiment une comparaison -. Il effectue une opération de and bitwise (jeter le résultat, à l'exception des drapeaux)

Pour effectuer une comparaison des opérandes, l'instruction cmp serait utilisé, qui effectue une opération de 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.

Autres conseils

donne le drapeau zéro, de la même façon que l'utilisation or $eax,$eax peut test non destructif pour le drapeau zéro aussi bien.

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

IIRC, il y a également un bit de parité qui est calculé, donc en effectuant ce test, vous pouvez savoir si le nombre de bits défini dans le registre est pair ou impair, en utilisant "jp/jnp".j'ai jamais avait une utilité pour cela.

Cette instruction ne vise pas à vérifier que si la valeur de %eax est égal à zéro. Il peut être dans son ensemble utilisé pour vérifier si la valeur %eax est nul ou positif ou négatif. Le plus grand avantage de l'utiliser de cette façon est qu'il ne modifie pas la vale de %eax (après avoir effectué %eax & %eax, il rejette la valeur à quelques pas) et définit les indicateurs de condition comme suit.

if% valeur EAX est égale à zéro, OF, CF, ZF = 0 (remise à zéro)
d'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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top