¿Qué hace la instrucción MOVZBL en la sintaxis IA-32 AT&T?
Pregunta
Cual es exactamente la instrucción
movzbl 0x01(%eax,%ecx),%eax
¿lo hace?
Solución
La sintaxis de AT&T divide la movzx
Intel Instrucción Mnemonic en diferentes mnemotecnia para diferentes tamaños de fuente (movzb
vs. movzw
). En la sintaxis Intel, es:
movzx eax, byte ptr [eax+ecx+1]
es decir, cargue un byte de la memoria en EAX+ECX+1 y cero-Extend al registro completo.
Por cierto, la mayoría de las herramientas GNU ahora tienen un conmutador o una opción de configuración para preferir la sintaxis Intel. (Como objdump -Mintel
o gcc -S -masm=intel
, aunque esta última afecta la sintaxis utilizada al compilar en línea-Tasm). Ciertamente recomendaría investigarlo, si no realiza una asamblea de AT&T para vivir. Ver también el x86 Etiqueta wiki para más documentos y guías.
Otros consejos
Ejemplo mínimo
mov $0x01234567, %eax
mov $1, %bl
movzbl %bl, %eax
/* %eax == 0000 0001 */
mov $0x01234567, %eax
mov $-1, %bl
movzbl %bl, %eax
/* %eax == 0000 00FF */
Runanble Github aguas arriba con afirmaciones.
El mnemónico es:
- Mudanza
- Cero extender
- Byte (8 bits)
- a largo (32 bits)
También hay versiones para otros tamaños:
movzbw
: Byte (8 bits) a palabra (16 bits)movzwl
: Palabra (16 bits) a largo (32 bits)
Como la mayoría de las instrucciones de gas, puede omitir el personaje de último tamaño cuando se trata de registros:
movzb %bl, %eax
Pero no puedo entender por qué no podemos omitir la última carta, por ejemplo, lo siguiente falla:
movz %bl, %eax
¿Por qué no simplemente deducirlo del tamaño de los operandos cuando son registrados en cuanto a mov
¿Y la sintaxis Intel?
Y si usa registros del tamaño incorrecto, no puede compilar, por ejemplo:
movzb %ax, %eax