'mov %reg8, (%reg32)'(不是 movb)是什么意思?

What is the meaning of 'mov %reg8, (%reg32)' (not movb)?

测试平台为x86-32bit

我知道在 x86-32bit 上,我们有两个操作码 movsblmovzbl,它们具有以下语义:

%eax = 0x12345678
%edx = 0xAAAABBBB
MOVB %dh, %al         %eax = 0x123456BB
MOVSBL %dh, %eax      %eax = 0xFFFFFFBB
MOVZBL %dh, %eax      %eax = 0x000000BB

以上例子来自here.

然后我对以下指令的语义有点困惑:

mov %dl, 0x2c(%esp)

上面的mov具体是什么意思,等于movsbl吗?或等于 movzbl?或者两者都不是?

如果没有明确提供操作数大小,大多数汇编程序将根据操作数大小计算操作类型。因此,在这种情况下,mov %dl, 0x2c(%esp)相当于movb %dl, 0x2c(%esp),一个简单的1字节移动,从一字节寄存器中推导出b后缀,dl.

32位寄存器的原因:这个存放的是内存位置的地址;操作数大小没有不匹配结果(因为内存位置可以解释为任何大小)。