¿Qué hace la instrucción MOVZBL en IA-32 AT & T syntax?


¿Qué es exactamente la instrucción

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

¿Lo hace?

2 answers

La sintaxis de AT & T divide movzx Intel instruction mnemonic en diferentes mnemotécnicas 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 cero-extender al registro completo.

POR cierto, la mayoría de las herramientas GNU ahora tienen un switch o una opción de configuración para preferir la sintaxis Intel. (Como objdump -Mintel o gcc -S -masm=intel, aunque esto último afecta la sintaxis utilizada al compilar inline-asm). Sin duda recomendaría que lo investigara, si no haces el montaje de AT&T para vivir. Vea también el wiki de etiquetas x86 para más documentos y guías.

 30
Author: Igor Skochinsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-23 03:10:52

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

La mnemotécnica es:

  • MOV
  • Cero extender
  • Byte (8-bit)
  • a Largo (32 bits)

También Hay versiones para otros tamaños:

  • movzbw: Byte (8-bit) a Word (16-bit)
  • movzwl: Word (16-bit) a Long (32-bit)

Como la mayoría de las instrucciones de 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 antes de la última letra, por ejemplo, el siguiente falla:

movz %bl, %eax

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

Y si usa registros de tamaño incorrecto, no puede compilar, por ejemplo:

movzb %ax, %eax

Intel ejecutable ejemplo con aserciones en GitHub.

 15
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-22 09:43:40