x86_64 ASM: ¿bytes máximos para una instrucción?

¿Cuál es la cantidad máxima de bytes que requeriría una instrucción completa en el código de x64 asm?

Algo así como un salto a la dirección podría ocupar hasta 9 bytes, supongo: FF 00 00 00 00 11 12 3F 1F, pero no sé si ese es el número máximo de bytes que puede usar una instrucción x64.

El conjunto de instrucciones x86 (16, 32 o 64 bit, todas las variantes / modos) garantiza / requiere que las instrucciones tengan un máximo de 15 bytes. Cualquier cosa más allá dará un “código de operación inválido”. No puede lograr eso sin usar prefijos redundantes (por ejemplo, múltiples prefijos 0x66 o 0x67, por ejemplo).

La única instrucción que realmente toma 64 bits como un elemento de datos es la constante de carga para registrar (syntax Intel: mov reg, 12345678ABCDEF00h , syntax at & t: movabs $12345678ABCDEF00, %reg ) – así que si quieres saltar más de 31 bits hacia adelante / hacia atrás, sería un movimiento de la ubicación de destino en un registro, y luego llamar / saltar al registro. El uso de desplazamientos inmediatos de 32 bits (en saltos relativos y modos de direccionamiento) ahorra cuatro bytes en muchas instrucciones en el modo de 64 bits.

Las preguntas son , ¿cuál es la instrucción más larga posible en el conjunto de instrucciones x86?

Respuesta: ¡puede formar una instrucción x86 válida con un número infinito de bytes!

Así es, podría llenar una imagen ROM completa de 64K con una sola instrucción válida . Para ser más específico, no hay límite para la longitud de las instrucciones 8086. ¡Guay! Desafortunadamente, las variantes de i386 de hoy en día arrojan un error de protección general cuando se intenta decodificar instrucciones de más de 15 bytes.

Entonces, ¿cómo se ve una instrucción 8086 infinitamente larga pero válida? Un poco aburrido, en realidad. Solo se podía formar una instrucción infinitamente larga usando prefijos redundantes al frente en los códigos de operación. Los prefijos de instrucción son bytes preincorporados al comienzo de una instrucción que puede modificar el tamaño de dirección predeterminado, el tamaño de datos o los registros de segmento utilizados por una instrucción.

Por ejemplo, puede tomar las instrucciones de aspecto inocuo:

 89 E5 mov %sp,%bp 

Y conviértalo en una instrucción realmente larga:

 66 66 66 66 … 66 66 89 E5 mov %sp,%bp 

Ahora eso es solo malvado.

https://web.archive.org/web/20131109063453/https://www.onlinedisassembler.com/blog/?p=23


Otra instrucción larga sin repetir prefijos

En algunos casos, es posible codificar instrucciones válidas que excedan el límite tradicional de 15 bytes de longitud. Por ejemplo:

  ; 16-bit mode F2 F0 36 66 67 81 84 24 disp32 imm32 = xaquire lock add [ss:esp*1+disp32],imm32 F3 F0 36 66 67 81 84 24 disp32 imm32 = xrelease lock add [ss:esp*1+disp32],imm32 ; 16-bit mode 36 67 8F EA 78 12 84 24 disp32 imm32 = lwpins eax,[ss:esp*1+disp32],imm32 36 67 8F EA 78 12 8C 24 disp32 imm32 = lwpval eax,[ss:esp*1+disp32],imm32 36 67 8F EA 78 10 84 24 disp32 imm32 = bextr eax,[ss:esp*1+disp32],imm32 ; 64-bit mode 64 67 8F EA F8 12 84 18 disp32 imm32 = lwpins rax,[fs:eax+ebx+disp32],imm32 64 67 8F EA F8 12 8C 18 disp32 imm32 = lwpval rax,[fs:eax+ebx+disp32],imm32 64 67 8F EA F8 10 84 18 disp32 imm32 = bextr rax,[fs:eax+ebx+disp32],imm32 

http://www.sandpile.org/x86/opc_enc.htm

Del Manual del desarrollador de software Intel® 64 e IA-32 Architectures:

2.3.11 Longitud de instrucción AVX

La longitud máxima de una instrucción Intel 64 y IA-32 sigue siendo de 15 bytes.

Puede construir instrucciones que codificarían más de 15 bytes, pero tales instrucciones serían ilegales y probablemente no se ejecutarían.