【发布时间】:2015-09-14 19:01:09
【问题描述】:
测试平台是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?还是两者都没有?
【问题讨论】:
-
两者都不是,那是一个简单的 8 位移动。它只会写入一个字节的内存。注意它不是
mem32,而是mem8(由于使用了8位寄存器而隐含)。 -
谢谢@Jester。所以你的意思是它实际上等于
movb %dl, 0x2c(%esp)? -
是的,它生成完全相同的机器代码。汇编器从使用的寄存器中推断出
b的大小。 -
@Jester,明白了,谢谢