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

3 minutos de lectura

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

Supongo que algo así como un salto a la dirección podría ocupar hasta 9 bytes: FF 00 00 00 00 11 12 3F 1F pero no sé si esa es la cantidad máxima de bytes que puede usar una instrucción x64

  • La instrucción más larga posible en x86 es de 15 bytes

    – Error interno de servidor 500

    5 de febrero de 2013 a las 0:50

  • Tenga en cuenta que, si bien es posible construir una sola instrucción que debe tener más de 15 bytes (mediante el uso de un montón de prefijos), la interfaz del decodificador de instrucciones x86 se atragantará. 15 bytes es un límite estricto.

    usuario149341

    5 de febrero de 2013 a las 0:57

  • @duskwuff: el manual de Intel dice “Hasta cuatro prefijos de 1 byte cada uno”. Entonces, según la especificación, supongo que el decodificador debería rechazar instrucciones con más de cuatro prefijos, incluso si la instrucción tiene menos de 15 bytes en total. Aunque no lo probé.

    – Yakov Galka

    4 de junio de 2018 a las 3:01

  • También hay formas de mov que pueden tomar una dirección completa de 64 bits, los que toman moffs‘s como operando. Pero solo pueden moverse hacia/desde el acumulador, por lo que la longitud útil máxima para ellos sigue siendo de solo 11 bytes (8 para la dirección, 1 para el código de operación, 1 para un tamaño de operando de 64 o 16 bits y 1 para un tamaño de operando). anulación del segmento fs o gs).

    – ughoavgfhw

    5 de febrero de 2013 a las 2:04

  • Justo como un aparte Computer Architecture A Quantitative Approach ha dicho 17 y ahora en la sexta edición dice 18 bytes (p. 14). Intel dice 15 y yo me quedo con 15.

    – Olsonista

    7 de abril de 2018 a las 5:10

  • @Olsonist: es posible inventar casos en los que una instrucción sin prefijos redundantes o inaplicables podría requerir más de 15 bytes para codificar. Tales instrucciones no son codificables y fallan (probado en Skylake, Linux entrega SIGSEGV no SIGILL); tendrás que encontrar otra forma de resolver tu problema, por ejemplo lea una dirección o mov un inmediato en un registro primero. No es fácil llegar a casos reales plausibles, por ejemplo fs xacquire lock add qword [r8d + edx + 1234], 0x1234 sería de 16 bytes si fuera válido. (NASM y YASM desafortunadamente lo ensamblan sin previo aviso).

    – Peter Cordes

    24 de marzo de 2020 a las 6:50

  • El conjunto de instrucciones no impuso ningún límite en la longitud de las instrucciones. El límite lo define el decodificador de instrucciones.

    – phuclv

    8 de junio de 2015 a las 4:57

  • El ISA para 386 y posteriores impone un límite de 15 bytes. 286 impuso un límite de 10 bytes. La longitud insn “infinita” solo funciona en 8086, no en x86 (o x86-64), ni siquiera en una CPU x86 moderna en modo real. La segunda mitad de su respuesta debe decir “de lo contrario, válido”. Omitiste la parte inferior de esa nota al pie, que dice Depende del usuario evitar estos casos (y la excepción #GP resultante).

    – Peter Cordes

    24 de agosto de 2016 a las 1:40


  • @LưuVĩnhPhúc: con qué ensamblador ensamblaslwpins rax,[fs:eax+ebx+disp32],imm32? gnu como no reconoce esto.

    – usuario2284570

    27/10/2016 a las 15:26


  • @LưuVĩnhPhúc Escogiste un ejemplo particularmente malo como lwpins Nunca lo convirtió en silicona. Sin embargo, no conozco ninguna otra instrucción demasiado larga; VEX mitigó este problema bastante bien.

    – fuz

    14 de septiembre de 2017 a las 9:49

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad