指令究竟是什么
movzbl 0x01(%eax,%ecx),%eax
确实
答案 0 :(得分:35)
AT& T语法将movzx
Intel instruction mnemonic拆分为不同的助记符,用于不同的源大小(movzb
与movzw
)。在英特尔语法中,它是:
movzx eax, byte ptr [eax+ecx+1]
即。从内存加载一个字节,在eax + ecx + 1和零扩展到完整寄存器。
BTW,大多数GNU工具现在都有一个开关或配置选项来选择英特尔语法。 (例如objdump -Mintel
或gcc -S -masm=intel
,尽管后者会影响编译inline-asm时使用的语法。如果你不做AT& T组装生活,我肯定会建议调查一下。有关更多文档和指南,另请参阅x86代码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
助记符是:
还有其他尺寸的版本:
movzbw
:字节(8位)到Word(16位)movzwl
:Word(16位)到Long(32位)与大多数GAS指令一样,您可以在处理寄存器时省略最后一个大小字符:
movzb %bl, %eax
但我无法理解为什么我们不能省略前一封信,例如以下失败:
movz %bl, %eax
为什么不将它们作为mov
和Intel语法的寄存器从操作数的大小中推断出来?
如果您使用错误大小的寄存器,则无法编译,例如:
movzb %ax, %eax