52 votes

Qu'est-ce que register% eiz?

Dans le code d'assemblage suivant que j'ai vidé en utilisant objdump :

 lea    0x0(%esi,%eiz,1),%esi
 

Qu'est-ce que register %eiz ? Que signifie le code précédent?

55voto

Sinan Ünür Points 76179

Voir Pourquoi GCC LEA EIZ? :

Apparemment, %eiz est un pseudo-registre dont la valeur est zéro à tout moment (comme r0 sur MIPS).

23voto

Andy Ross Points 7024

(Très en retard dans le jeu, mais cela semblait être un ajout intéressant): Ce n'est pas un registre à tous, c'est un caprice de l'Intel codage d'instruction. Lors de l'utilisation d'un ModRM octet de la charge à partir de la mémoire, il y a 3 bits utilisés pour le registre pour stocker des 8 registres. Mais l'endroit où l'ESP (le pointeur de pile) "serait" est plutôt interprété par le processeur comme "un SIB octet suit cette instruction" (c'est à dire que c'est un mode d'adressage étendu, pas une référence à l'ESP). Pour des raisons connues seulement pour les auteurs, l'assembleur GNU a toujours représenté ce "zéro où un registre autrement serait" comme un "%eiz" s'inscrire. La syntaxe Intel tombe il.

14voto

user3196531 Points 21

Andy Ross fournit beaucoup plus de le raisonnement sous-jacent, mais est malheureusement de mauvaises ou à tout le moins à confusion sur les détails techniques. Il est vrai que l'efficacité de l'adresse de juste (%esp) ne peut pas être codé avec juste le ModR/M octets qu'au lieu d'être décodé en (%esp), il est utilisé pour indiquer qu'un SIB octet est également inclus. Cependant, l' %eiz de pseudo-registre n'est pas toujours utilisé avec un SIB octet pour représenter un SIB octet est utilisé.

La SIB octet (échelle/index/base) contient trois éléments: l'index (un registre comme l' %eax ou %ecx que l'échelle est appliquée), l'échelle (d'une puissance de deux, de 1 à 8 de l'indice registre est multiplié par), et la base (un autre registre, qui est ajouté à l'échelle de l'indice). C'est ce qui permet pour des instructions telles que add %al,(%ebx,%ecx,2) (code machine: 00 04 4b -- opcode, modr/m, sib (note n %eiz vous inscrire même si la SIB octet est utilisé)) (ou Intel syntaxe, "ajouter BYTE PTR [ecx*2+ebx], al").

Toutefois, %esp ne peut pas être utilisé tant que l'indice s'inscrire dans un SIB octet. Au lieu de laisser cette option, Intel au lieu de cela ajoute une option pour utiliser la base de registre, comme sans aucune mise à l'échelle ou de l'indexation. Par conséquent, pour lever l'ambiguïté entre le cas d' add %al,(%ecx) (code machine: 00 01 -- opcode, modr/m) et add %al,(%ecx) (code machine: 00 04 21 -- opcode, modr/m, sib), la syntaxe add %al,(%ecx,%eiz,1) est utilisé (ou pour Intel syntaxe: add BYTE PTR [ecx+eiz*1],al).

Et comme expliqué dans l'article lié par Sinan, ce spécifique à l'enseignement (lea 0x0(%esi,%eiz,1),%esi) est simplement utilisé comme un multi-octets nop (équivalent à esi = &*esi) de sorte qu'une seule nop-comme l'instruction doit être exécutée à la place de plusieurs instructions nop.

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