为什么NA​​SM使用0x89上时,它组装寄存器之间的MOV指令?(Why does nasm us

2019-09-29 14:41发布

为什么NA​​SM使用0x89上的操作码(137),当它装配在两个寄存器之间MOV指令?

下面是使用NASM组装的代码的示例:

55      push ebp
89E5    mov ebp, esp
83EC04  sub esp, byte +0x4
31C0    xor eax, eax
C9      leave
C3      ret

我想是这样的:

55      push ebp
8BEC    mov ebp, esp
83EC04  sub esp, byte +0x4
33C0    xor eax, eax
C9      leave
C3      ret

我想0x8B的原因是:如果你查看MOV指令的二进制表示,它看起来像这样在NASM:

Opcode   Mod Reg R/M
10001001 11  100 101 (89 E5)

在这个混乱的部分是REG操作数是第二个。

NASM的语法是这样的: 0x89 11 source_reg destination_reg
MOV指令是mov destination_reg, source_reg

Answer 1:

这两个操作码是相同的。 这是86的冗余。 汇编程序可以选择为所欲为

x86架构的一个典型的指令有两个操作码 。 第一他们的具有寄存器作为第一操作数和寄存器或作为第二个存储器位置(这是缩写"reg, reg/mem32"在操作码引用或"Gv, Ev"在操作码表)。 第二操作码的操作数是相反的(也就是简称"reg/mem32, reg""Ev, Gv" )。 这是有道理的:处理器必须知道,如果将其复制到内存中,或从记忆。 但是,当两个操作数是寄存器,编码变得多余:

                  ; mod reg r/m
03C3 add eax, ebx ;  11 000 011
01D8 add eax, ebx ;  11 011 000

还有比这样只是REG / REG风格等等。 看到这里

不同汇编器发射不同的操作码,所以这种技术可以被用于识别汇编

有些汇编器允许您选择的编码。 例如,如果你贴上GAS可以发射其他编码.s到端

10 de   adcb   %bl,%dh
12 f3   adcb.s %bl,%dh

什么是x86指令的“.S”后缀?



文章来源: Why does nasm use 0x89 when it assembles a MOV instruction between registers?
标签: assembly nasm