Ok, estaba leyendo los manuales de AMD64 y sabiendo que nop
realmente es un xchg eax, eax
, miré xchg
y encontré algo interesante, que parece que se puede codificar un byte en las instrucciones para especificar los registros (disculpas, estoy en mi iPod) :imagen.
Entonces, lo que me pregunto es cómo sabe el procesador si hay un byte después con el que trabajar o si ese registro adicional tiene que ser de un tipo rAX
que haga que en realidad siga siendo el único byte.0x90
Respuesta1
Miré el xchg y encontré algo interesante: parece que se puede codificar un byte en la instrucción para especificar los registros.
Sí, así es como funcionan la mayoría de las instrucciones x86. Las instrucciones se obtienen de 32 o 64 bits a la vez (longitud de palabra de la máquina), no bytes a la vez.
Especificar un XCHG
de rAX
con rAX
(donde rAX
está EAX
en una máquina de 32 bits y RAX
en una máquina de 64 bits) será 0x90
, porque el código mux de registro rAX
es 0x00
(efectivamente, una operación de un ciclo que no hace nada). De manera similar, la instrucción XCHG rBX, rAX
se ensamblará en 0x93
(el código mux de rBX
Being 0b011
).
La codificación del código de operación debe aparecer en algún otro lugar del manual, o puede buscar en un mapa de código de operación x86 (que ayuda a comprender cómo se mezcla todo). Puedes encontrar uno en elManuales para desarrolladores de software de arquitecturas Intel 64 e IA-32(Volumen 2, Apéndice A.3).
Entonces, lo que me pregunto es cómo sabe el procesador si hay un byte después con el que trabajar o si ese registro adicional tiene que ser del tipo rAX, lo que hace que en realidad siga siendo el único byte 0x90.
Aquí es todo lo contrario. Para el modo de 64 bits, en realidad existe unaprefijoen la propia palabra de instrucción para indicar que ( REX
prefijo). El procesador sabe qué buscar en función de la presencia o ausencia del REX
prefijo y, en ausencia de él, la instrucción sigue siendo simplemente 0x90
.