129 votes

x86 Assemblée - ' testl ' eax contre eax ?

J’essaie de comprendre un assemblage.

L’Assemblée comme suit, je suis intéressé par la ligne testl :

J’essaie de comprendre ce point de « testl » entre % eax et %EAX ? Je pense que les détails de ce que ce code n’est pas important, j’essaie juste de comprendre le test avec lui-même - la valeur serait toujours vraie ?

Merci !

97voto

Chris Jester-Young Points 102876

Il teste si est 0, ou au-dessus, ou au-dessous. Dans ce cas, le saut est pris si est 0.

35voto

Nils Pipenbrinck Points 41006

L'instruction de test effectue une opération ET logique entre les opérandes, mais ne pas écrire le résultat dans un registre. Seuls les drapeaux sont mis à jour.

Dans votre exemple, le test eax, eax va définir l'indicateur de zéro si eax est égal à zéro, le signe-drapeau si le bit le plus élevé et certaines autres drapeaux.

Le Saut en cas d'Égalité (ej) l'enseignement des sauts si l'indicateur de zéro est réglé.

Vous pouvez traduire le code plus lisible le code comme ceci:

cmp eax, 0
je  somewhere

Qui a la même fonctionnalité, mais nécessite quelques octets de plus de code de l'espace. C'est la raison pour laquelle le compilateur émet un test au lieu de comparer.

5voto

DarenW Points 7817

Cet extrait de code est issu d'une sous-routine qui est un pointeur vers quelque chose, probablement une structure ou d'un objet. La 2e ligne déréférence le pointeur, la récupération d'une valeur de cette chose - peut-être lui-même un pointeur ou peut-être juste un int, stockées en 2ème membre (offset +4). Les 3e et 4e lignes de tester cette valeur nulle (NULL si c'est un pointeur) et passez les quelques opérations (non illustré) si elle est égale à zéro.

Le test à zéro parfois est codé comme une comparaison immédiate littérale valeur zéro, mais le compilateur (ou de l'homme?) qui a écrit cela pourrait avoir pensé un testl op irait plus vite - tenant compte de tous les modernes CPU trucs comme le pipelining et enregistrer un nouveau nom. C'est à partir de la même sac d'astuces qui détient l'idée de la compensation d'un registre avec XOR EAX,EAX (que j'ai vu sur quelqu'un de la plaque d'immatriculation dans le Colorado!) plutôt que de l'évident, mais peut-être plus lent MOV EAX, #0 (j'utilise un vieux de la notation).

En asm, comme perl, TMTOWTDI.

3voto

Mike Thompson Points 4178

Si eax est zéro, il va effectuer le saut conditionnel, sinon il continuera l’exécution au 319e9

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X