【发布时间】:2013-10-19 15:20:07
【问题描述】:
为什么 NASM 在两个寄存器之间组装 MOV 指令时使用 0x89 操作码 (137)?
这是一个使用 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
【问题讨论】:
-
为什么不呢? 8B 也好不到哪里去。
-
0x89有什么问题吗? -
0x89是mov r/m32,r32。mov ebp, esp适合这种格式,那为什么 NASM 会使用其他一些操作码?
标签: assembly x86 nasm instructions