nivel maquina lenguaje historia ensamblador ejemplos bajo alto x86 disassembly

x86 - historia - lenguaje maquina ejemplos



x86 averiguar el tamaño de instrucción del operando dado solo el código máquina hexadecimal? (2)

Como dice harold, el tamaño predeterminado del operando no está codificado en la instrucción, sino que depende del modo del procesador actual.

En modo real y en modo protegido de 16 bits, el tamaño de operando predeterminado es de 16 bits, por lo que 83 E4 F0 decodifica and $-16, %sp .

En el modo de operación de 32 bits, el tamaño predeterminado es de 32 bits, por lo que es and $-16, %esp .

En el modo x64, la mayoría de las instrucciones vuelven por defecto al tamaño del operando de 32 bits (excepto las ramas y las que indirectamente usan la pila, como empujones, saltos, llamadas y devoluciones), por lo que decodifica de nuevo and $-16, %esp .

Es posible anular el tamaño predeterminado del operando usando prefijos. Por ejemplo, el prefijo 66h cambia entre el tamaño de operando de 32 bits y de 16 bits, por lo que 66 83 E4 F0 decodifica a and $-16, %esp en modo de 16 bits y a and $-16, %sp en 32 bits o Modo de 64 bits Para obtener el tamaño de operando de 64 bits, debe usar el prefijo REX con el bit W configurado, por lo que 48 83 E4 F0 decodifica and $-16, %rsp (¡pero solo en el modo de 64 bits!).

Por ejemplo, dado un hex: 83 E4 F0

Al mirar el manual del desarrollador de Intel, puedo deducir que 83 significa and y FO significa el -16 . Al mirar E4 , puedo descifrar que el registro fuente / destino es SP o ESP.

Por lo tanto, puedo concluir que el hex significa and $-16, %ESP o and $-16, %SP . Sin embargo, en el manual, ambos están listados como 83 /4 ib .

¿Cómo puedo diferenciar entre esos dos?


En el modo protegido, solo puede ser la versión de 32 bits, las versiones de 16 y 64 bits requieren un byte de anulación de tamaño prefijado, en este caso la versión de 16 bits requiere la anulación del prefijo 0x66, para que obtenga 66:83 E4 F0 . Intel lo dice claramente en la descripción de AND:

En el modo de 64 bits, el tamaño de operación predeterminado de la instrucción es de 32 bits.

y la referencia para 066H, Capítulo 2.2.1:

El prefijo de anulación de tamaño de operando permite que un programa cambie entre tamaños de operando de 16 y 32 bits. Cualquiera de los tamaños puede ser el predeterminado; el uso del prefijo selecciona el tamaño no predeterminado.