MOVZBL指令在IA-32 AT& T语法中做了什么?

时间:2012-02-16 19:38:55

标签: assembly x86 intel att

指令究竟是什么

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

确实

2 个答案:

答案 0 :(得分:35)

AT& T语法将movzx Intel instruction mnemonic拆分为不同的助记符,用于不同的源大小(movzbmovzw)。在英特尔语法中,它是:

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

即。从内存加载一个字节,在eax + ecx + 1和零扩展到完整寄存器。

BTW,大多数GNU工具现在都有一个开关或配置选项来选择英特尔语法。 (例如objdump -Mintelgcc -S -masm=intel,尽管后者会影响编译inline-asm时使用的语法。如果你不做AT& T组装生活,我肯定会建议调查一下。有关更多文档和指南,另请参阅代码Wiki。

答案 1 :(得分:18)

最小例子

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 upstream with assertions

助记符是:

  • MOV
  • 零延伸
  • 字节(8位)
  • 到Long(32位)

还有其他尺寸的版本:

  • movzbw:字节(8位)到Word(16位)
  • movzwl:Word(16位)到Long(32位)

与大多数GAS指令一样,您可以在处理寄存器时省略最后一个大小字符:

movzb %bl, %eax

但我无法理解为什么我们不能省略前一封信,例如以下失败:

movz %bl, %eax

为什么不将它们作为mov和Intel语法的寄存器从操作数的大小中推断出来?

如果您使用错误大小的寄存器,则无法编译,例如:

movzb %ax, %eax