Pregunta

Cual es exactamente la instrucción

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

¿lo hace?

¿Fue útil?

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 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top