代码之家  ›  专栏  ›  技术社区  ›  Rodrigo Camargos

不带后缀的汇编mov指令

  •  0
  • Rodrigo Camargos  · 技术社区  · 7 年前

    我有下面的mov指令(没有后缀)从一个反汇编器。

    mov %dx,(%eax)
    

    指令后缀是什么?首先我认为目标寄存器决定后缀,但是根据我正在读的书,我猜它是由“最小”寄存器决定的。所以在这种情况下

    movw %dx, (%eax)
    

    因为%dx(16位字寄存器)是最小的。 我的推理正确吗(有时CSAPP的书有点混乱,没有解释清楚细节)。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Peter Cordes    7 年前

    movw .

    mov

    你需要一个明确的后缀 mov $123, (%eax)


    你说的“最小”完全是假的。 movl %eax, (%bx) 是 movl 因为寄存器操作数是32位的,而4字节的目标是通过16位寻址模式选择的。

    寻址模式中的寄存器对操作数大小没有影响。地址大小和操作数大小是独立的,可以重写其中一个,但不能重写另一个(这就是为什么操作数大小有单独的机器代码前缀字节( 0x66 0x67 ).

    推荐文章