2012-06-21 10 views
5

Me estoy poniendo la siguiente línea en el desmontaje de objdump -d de un programa de Linux x86 ...

4000b0: ba 0e 00 00 00   mov $0xe,%edx 

estoy tratando de entender cómo funciona el código máquina "ba 0e 00 00 00" mapas de "mov $ 0xe,% EDX"

En el manual del movimiento inmediato de 32 bits es:

B8 + rd ... MOV r32, imm32 

es decir, "B8" no "BA"

De hecho, ninguno de los códigos de operación MOV es "BA".

Si alguien pudiera descomponer "ba 0e 00 00 00" y explicar a bit-wise cómo llegar a "mov $ 0xe,% edx", sería de gran ayuda.

Respuesta

12

Opcode 0xba es "MOV EDX, imm32". La confusión proviene del manual de IA que toma demasiados atajos para presentar codificaciones de instrucciones, incluso para códigos de operación de un solo byte, como 0xba.

En el manual IA verá este:

 
B8+ rd MOV r32, imm32 OI Valid Valid Move imm32 to r32. 

lo que significa tomar 0xb8 y añadir la codificación de un r32 específica para obtener el byte de código de operación final.

Las codificaciones r32 específicas están en la Tabla 2-2 en el volumen 2A.

 
EAX 000 = 0 
ECX 001 = 1 
EDX 010 = 2 
EBX 011 = 3 
ESP 100 = 4 
EBP 101 = 5 
ESI 110 = 6 
EDI 111 = 7 

El Apéndice A en el Volumen 2C de las referencias de Intel también puede ayudar en estas situaciones. Este apéndice proporciona mapas de código de operación para instrucciones de 1, 2 y 3 bytes. En su caso, al buscar el código de operación 0xBA de un byte, dice que la instrucción es un MOV inmediato en el registro rDX, donde el ancho 'r' depende de otros factores.

Cuestiones relacionadas