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.