【问题标题】:What is the meaning of 'mov %reg8, (%reg32)' (not movb)?'mov %reg8, (%reg32)'(不是 movb)是什么意思?
【发布时间】:2015-09-14 19:01:09
【问题描述】:

测试平台是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?还是两者都没有?

【问题讨论】:

  • 两者都不是,那是一个简单的 8 位移动。它只会写入一个字节的内存。注意它不是mem32,而是mem8(由于使用了8位寄存器而隐含)。
  • 谢谢@Jester。所以你的意思是它实际上等于movb %dl, 0x2c(%esp)
  • 是的,它生成完全相同的机器代码。汇编器从使用的寄存器中推断出b 的大小。
  • @Jester,明白了,谢谢

标签: assembly x86 att opcode


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 2013-07-16
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2012-08-08
    相关资源
    最近更新 更多