2012-02-16 12 views

Respuesta

24

AT & sintaxis T divide la movzx Intel instruction mnemonic en diferentes mnemotécnicos para diferentes tamaños de fuente (movzb vs. movzw). En la sintaxis Intel, es:

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

es decir, cargar un byte de la memoria en eax + ecx + 1 y cero extenderse a 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 esto último afecta la sintaxis utilizada al compilar inline-asm). Sin duda, recomendaría examinarlo, si no lo hace AT & T montaje para la vida. Consulte también la wiki de etiquetas para obtener más documentos y guías.

+0

Absolutamente correcto. –

+0

Entendido: esto cargará el byte de la dirección '% eax +% ecx + 1' y lo ampliará a largo con un cero a la izquierda. ¡Muchas gracias! –

13

Ejemplo:

mov $0x, %eax 
mov $1, %bl 
movzbl %bl, %eax 
# %eax == 0000 0001 

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

El mnemónico es:

  • MOV
  • Zero extienden
  • byte (8 bits)
  • a Long (32-bit)

También existen versiones para otros tamaños:

  • movzbw: byte (8 bits) de la palabra (16 bits)
  • movzwl: palabra (16 bits) de largo (32 bits)

Como la mayoría de las instrucciones GAS, se 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 el penúltimo Lett er, p. la siguiente falla:

movz %bl, %eax 

¿Por qué no se deduce a partir del tamaño de los operandos cuando son registros como para mov y la sintaxis de Intel?

Y si utiliza registros del tamaño incorrecto, falla al compilar ej .:

movzb %ax, %eax 

Ejecutable Intel example with assertions on GitHub.

+0

@downvoters por favor explique :-) –

+0

Si [mira los códigos de operación] (http://www.felixcloutier.com/x86/MOVZX.html), el "tamaño de operando" controla el tamaño del destino pero hay diferentes códigos de operación para diferentes tamaños de fuente. Por lo tanto, tiene sentido que el gas trate 'movzb' como una instrucción separada de' movzw'. (Para la extensión de la señal, AMD incluso agregó una nueva mnemónica de sintaxis Intel para 'movsxd r64, r/m32' en lugar de sobrecargar a' movsx'. IDK por qué). –

Cuestiones relacionadas