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?
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?
Voir Pourquoi GCC LEA EIZ? :
Apparemment,
%eiz
est un pseudo-registre dont la valeur est zéro à tout moment (commer0
sur MIPS).
(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.
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 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.