intel手册中的x86_64 Opcode编码格式

Posted

技术标签:

【中文标题】intel手册中的x86_64 Opcode编码格式【英文标题】:x86_64 Opcode encoding formats in the intel manual 【发布时间】:2019-08-10 08:17:28 【问题描述】:

Intel x86_64 reference manual? 中列出的“Op/En”格式是什么? 例如,在Add opcode 中,我可以猜测“I” = 立即数,但是否有完整的列表?

【问题讨论】:

是的,我想在你所说的第 2 卷手册的介绍部分。 @PeterCordes 如果您在谈论第 2.1 节,我只看到对整个指令如何编码的参考,而不是我在帖子中显示的列的含义。 【参考方案1】:

Intel's vol.2 manual 的介绍部分解释了如何阅读每个条目:

第 3.1.1.4 节指令汇总表中的操作数编码列

“操作数编码”列在中简写为 Op/En 指令摘要表标题。指令操作数编码 使用每个汇编指令语法提供信息 交叉引用操作数编码中的行条目的字母 指令汇总表之后的定义表。 ...

注意事项

指令的 Op/En 列中的字母仅适用于编码定义表 紧跟在指令汇总表之后。

...

所以它们只是每条指令附带的表格的键。不,英特尔似乎没有记录它们代表什么,但这很简单。

(相关:How to determine if ModR/M is needed through Opcodes?)


是的,I 代表立即。

对于 r/mreg 字段,使用 ModRM 字节编码的显式操作数是 MR

V 是由 VEX.vvvv 或 EVEX 编码的字段,为此类指令提供第三个操作数,用于非破坏性操作,或用于 FMA 等三操作数指令。

vpblendvb xmm1, xmm2, xmm3/m128, xmm4 使用立即字节对第 4 个操作数进行编码,并在 Op/En 列中使用 RVMR。另请参阅What kind of address instruction does the x86 cpu have? - 我认为这可能是唯一具有 4 个单独显式编码操作数的 x86 指令,在 AVX512 的 3 + 掩码寄存器之外。

vextractf128 and the AVX512 versions of it 将AD 用于表的行,因为唯一的区别特征是缩放短位移和掩码的“元组类型”。如果他们使用 MRI / MRI2 / MRI4 / etc,那就太奇怪了。


(rep) movs 使用 ZO :所有操作数都是隐式的(DF、RSI、RDI 以及它们指向的内存),所以这可能代表零操作数。 (至少不需要编码)。

cdq 使用相同的 ZO 所以是的,它可能是“零(显式)操作数”

x86 只有几种方法可以指定显式操作数。

【讨论】:

@Mdren:也许您正在查看旧的 PDF 副本,或者英特尔手册的旧 html 摘录。还是您的意思是 AMD 的手册?当前的英特尔 PDF(通常记录现代 x86,包括 x86-64 长模式)software.intel.com/sites/default/files/managed/a4/60/… 和从中提取的 HTML(就像我链接的那些)都说ZO。除非他们在我没看过的其他指令中使用NP?但无论如何,我认为它代表无参数。

以上是关于intel手册中的x86_64 Opcode编码格式的主要内容,如果未能解决你的问题,请参考以下文章

x86-64 GAS Intel 语法中的 RIP 相对变量引用(如“[RIP + _a]”)如何工作?

Intel x86_64 Architecture Background 1

Intel x86_64 Architecture Background 2

X86和X86_64和X64有什么区别?

X86 X64 X86_64 AMD64 区别

各版本的区别及含义(i386 x86_64 ppc )