'mov %reg8, (%reg32)'(不是 movb)是什么意思?
What is the meaning of 'mov %reg8, (%reg32)' (not movb)?
测试平台为x86-32bit
。
我知道在 x86-32bit
上,我们有两个操作码 movsbl
和 movzbl
,它们具有以下语义:
%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位寄存器的原因:这个存放的是内存位置的地址;操作数大小没有不匹配结果(因为内存位置可以解释为任何大小)。
测试平台为x86-32bit
。
我知道在 x86-32bit
上,我们有两个操作码 movsbl
和 movzbl
,它们具有以下语义:
%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位寄存器的原因:这个存放的是内存位置的地址;操作数大小没有不匹配结果(因为内存位置可以解释为任何大小)。