我正在编写一个 x86-64 汇编程序。我正在查看 Intel x86 手册第 2 卷,试图了解如何从程序集中生成正确的指令。我主要了解它的工作原理,但一直在组装和拆卸说明以检查我是否正确。
在 ADD 参考表(第 2A 卷,第 3.31 节)中:
opcode | Instruction
04 ib | ADD AL, imm8
05 iw | ADD AX, imm16
05 id | ADD EAX, imm32
REX.W + 05 id | ADD RAX, imm32
集合:
;add.s
add al, 1
add ax, 1
add eax, 1
add rax, 1
拆卸:
.text:
0: 04 01 add al, 1
2: 66 83 c0 01 add ax, 1
6: 83 c0 01 add eax, 1
9: 48 83 c0 01 add rax, 1
所以第一个是正确的,就像手册说的那样,但是汇编器使用像 REX 前缀这样的 ADD 参考表更下方的指令,为什么使用那些而不是我之前列出的那些?
现在是第二个ADD ax, 1
;搜索后我发现这66
是操作数大小覆盖前缀,但它没有在 ADD 参考表中列出,所以我什么时候选择添加这个前缀我似乎找不到太多关于它的信息或英特尔中的其他旧前缀手动的?
我尝试按照手册中的说明反汇编 05 01,但它没有将其识别为操作码,只是数字。英特尔手册是一个很好的资源,我认为它只是缺少一些额外的解释和结构,但我仍在试图围绕 ModRM 的东西。