x86_64 - 操作码映射。可能的错误?

x86_64 - opcode map. Possible mistake?

我正在为 x86_64、vol2,B.2.1

部分处理英特尔操作码图

我对 pop 指令有疑问。

POP – Pop a Value from the Stack

wordregister
0101 0101 : 0100 000B : 1000 1111 : 11 000 reg16

qwordregister
0100 W00BS : 1000 1111 : 11 000 reg64

wordregister (alternate encoding)
0101 0101 : 0100 000B : 0101 1 reg16

qwordregister (alternate encoding)
0100 W00B : 0101 1 reg64

memory64
0100 W0XBS : 1000 1111 : mod 000 r/m

memory16
0101 0101 : 0100 00XB 1000 1111 : mod 000 r/m

显然与 wordregisters 一起使用的前缀 0101 0101 在这里真的很烦我,因为我找不到它的任何用处。

即使将命令提交给 objcopy 或其他反汇编程序,我也从未看到它出现。

0:  66 59                   pop    cx
2:  59                      pop    rcx

不过 1000 1111 : 11 000 reg160100 000B : 0101 1 reg16 部分我能理解。

那么,那 0x55 呢?

如果您将 CPU 设置为 x86_64,则 disassembler 会为您提供

55    push rbp

在这个 reference 中点击 55 也指向 push

pop 指令的第 3 位(第 4)到 1push0, 比如 0x55.

文档中肯定有错误,因为 CPU 指令编码逻辑和网络上可用的其他元素清楚地表明 0x55 是推送操作。