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

Posted

技术标签:

【中文标题】x86_64 - 操作码映射。可能的错误?【英文标题】:x86_64 - opcode map. Possible mistake? 【发布时间】:2015-12-17 12:00:47 【问题描述】:

我正在研究 x86_64 的英特尔操作码映射,vol2,B.2.1 节

我对@9​​87654321@ 指令有疑问。

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

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

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

0:  66 59                   pop    cx
2:  59                      pop    rcx

我可以理解1000 1111 : 11 000 reg160100 000B : 0101 1 reg16 部分。

那么,0x55 呢?

【问题讨论】:

【参考方案1】:

如果你将 CPU 设置为 x86_64,disassembler 会给你

55    push rbp

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

pop 指令的位 3 (4th) 到 1push 位于 0,如 0x55。

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

【讨论】:

所以你同意这是文档中的错误? 是的,好像是这样。由于机器代码甚至指令的可读性低,汇编语言文档可能是最容易出错的文档(例如,与 C 不同,但据说它接近系统/机器/汇编)。然而,二进制级别的一些逻辑有助于捕捉此类错误(如本例中的第 3 位)。 当然。该文档中还有很多其他错误。我想我会向英特尔报告。

以上是关于x86_64 - 操作码映射。可能的错误?的主要内容,如果未能解决你的问题,请参考以下文章

axc关于duplicate symbols for architecture x86_64错误的第三种可能及其解决办法

C++ 错误:架构 x86_64 的未定义符号

iOS之duplicate symbols for architecture x86_64错误

iOS开发之duplicate symbols for architecture x86_64错误

iOS开发报duplicate symbols for architecture x86_64错误的问题

目标x86_64的NDK构建导致错误