x86_64 - 操作码映射。可能的错误?
Posted
技术标签:
【中文标题】x86_64 - 操作码映射。可能的错误?【英文标题】:x86_64 - opcode map. Possible mistake? 【发布时间】:2015-12-17 12:00:47 【问题描述】:我正在研究 x86_64 的英特尔操作码映射,vol2,B.2.1 节
我对@987654321@ 指令有疑问。
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 reg16
和0100 000B : 0101 1 reg16
部分。
那么,0x55
呢?
【问题讨论】:
【参考方案1】:如果你将 CPU 设置为 x86_64,disassembler 会给你
55 push rbp
点击这个reference中的55
也指向push
。
pop
指令的位 3 (4th) 到 1
,push
位于 0
,如 0x55。
文档中肯定有错误,因为网络上可用的 CPU 指令编码逻辑和其他元素清楚地将 0x55 显示为推送操作。
【讨论】:
所以你同意这是文档中的错误? 是的,好像是这样。由于机器代码甚至指令的可读性低,汇编语言文档可能是最容易出错的文档(例如,与 C 不同,但据说它接近系统/机器/汇编)。然而,二进制级别的一些逻辑有助于捕捉此类错误(如本例中的第 3 位)。 当然。该文档中还有很多其他错误。我想我会向英特尔报告。以上是关于x86_64 - 操作码映射。可能的错误?的主要内容,如果未能解决你的问题,请参考以下文章
axc关于duplicate symbols for architecture x86_64错误的第三种可能及其解决办法
iOS之duplicate symbols for architecture x86_64错误
iOS开发之duplicate symbols for architecture x86_64错误