instruction and assembly x86 intel att

instruction - and assembly x86



¿Qué hace la instrucción MOVZBL en la sintaxis IA-32 de AT & T? (2)

¿Qué exactamente la instrucción

movzbl 0x01(%eax,%ecx),%eax

¿hace?


Ejemplo:

mov $0x01234567, %eax mov $1, %bl movzbl %bl, %eax # %eax == 0000 0001 mov $0x01234567, %eax mov $-1, %bl movzbl %bl, %eax # %eax == 0000 00FF

El mnemónico es:

  • MOV
  • Zero extender
  • Byte (8 bits)
  • a largo (32 bits)

También hay versiones para otros tamaños:

  • movzbw : Byte (8 bits) a Word (16 bits)
  • movzwl : Palabra (16 bits) a Largo (32 bits)

Como la mayoría de las instrucciones GAS, puede omitir el último carácter de tamaño cuando se trata de registros:

movzb %bl, %eax

pero no puedo entender por qué no podemos omitir la última letra, por ejemplo, la siguiente falla:

movz %bl, %eax

¿Por qué no solo deducirlo del tamaño de los operandos cuando son registros en cuanto a la sintaxis mov y Intel?

Y si usa registros del tamaño incorrecto, no compila, por ejemplo:

movzb %ax, %eax

Ejemplo de Runnable Intel con aserciones en GitHub .


La sintaxis de AT & T divide la mnemónica de instrucciones movzx Intel en diferentes mnemónicos para diferentes tamaños de fuente ( movzb vs. movzw ). En la sintaxis de Intel, es:

movzx eax, byte ptr [eax+ecx+1]

es decir, cargar un byte de la memoria en eax + ecx + 1 y extender cero al registro completo.

Por cierto, la mayoría de las herramientas de GNU ahora tienen un interruptor o una opción de configuración para preferir la sintaxis de Intel. (Como objdump -Mintel o gcc -S -masm=intel , aunque este último afecta la sintaxis utilizada al compilar inline-asm). Sin duda, recomendaría estudiarlo, si no lo hace ensamblar AT & T para vivir. Consulte también la wiki de la etiqueta x86 para obtener más documentos y guías.