【问题标题】:How Are Registers X/Y/ZMM16-31 Encoded?寄存器 X/Y/ZMM16-31 是如何编码的?
【发布时间】:2023-03-09 10:25:01
【问题描述】:

据我了解,由于 AVX,通过 3 字节 VEX 或 EVEX 前缀,您可以在 64 位模式下对多达 32 个 XMM/YMM/ZMM 寄存器进行编码,但是当通过英特尔手册查看它时告诉你这是可能的,我找不到它解释实际发生方式的部分。我只能看到一个扩展字段,即 REX 反转字段,但除了 EVEX 前缀中用于编码掩码寄存器的特殊位置之外,没有其他任何内容。

您将需要 2 位来对这么多寄存器进行编码。您是否必须以某种方式在 VEX/EVEX 前缀内组合 2 个倒置的 REX 字段,或者这个过程是如何工作的?

【问题讨论】:

  • xmm16..31(以及它们的 ymm/zmm 等效项)是 AVX-512 的新功能,只能通过 EVEX 前缀访问,它有 2 个额外位要添加到 ModRM 和一个 5 位额外字段.
  • @PeterCordes 你指的是这个吗?:EVEX.RXBNext-8 register specifier modifierP[7 : 5]Combine with ModR/M.reg, ModR/M.rm (base, index/vidx).

标签: assembly x86-64 disassembly machine-code avx512


【解决方案1】:

xmm16..31(及其 ymm/zmm 等效项)是 AVX-512 的新功能,只能通过 EVEX 前缀访问,其中有 2 个额外的位要添加到每个 ModRM 字段,以及多 5 位作为第三个操作数的额外字段。

REX + legacy-SSE,以及用于 AVX1/2 编码的 VEX,只能访问 xmm/ymm0..15。

Wikipedia's EVEX article 有一个很好的表格,它显示了位的来源,我抄录了一些:

Addr mode Bit 4 Bit 3 Bits [2:0] Register type
REG EVEX.R' EVEX.R ModRM.reg General Purpose, Vector
RM EVEX.X EVEX.B ModRM.r/m GPR, Vector
NDS/NDD EVEX.V' EVEX.v3 EVEX.v2v1v0 Vector
Base 0 EVEX.B SIB.base (or modrm) GPR
Index 0 EVEX.X SIB.index GPR

如果 R/M 操作数是向量寄存器而不是内存寻址模式,则它同时使用 X(索引)和 B(基)位作为额外的寄存器编号位。因为这意味着没有 SIB.index 字段也可能需要扩展才能选择 r8..r15。


在 REX 和 VEX 前缀中,当源操作数不是具有索引寻址模式的内存时,X 位未使用。 (https://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix,但请注意该页面前面的寄存器编号表中显示 X.RegX is just a placeholder for R or B, not REX.X;该页面上的选择令人困惑)。

另请参阅x86 BSWAP instruction REX doesn't follow Intel specs?,了解使用 REX 前缀中的额外寄存器号位的另一个图表。

【讨论】:

  • 谢谢,伙计。我现在明白了,扩展使用哪些字段取决于使用的指令
  • @CarolVictor 另请参阅euroassembler.eu/easource/ii.htm#IiAssembleAVX 的表格以了解基址和索引寄存器的五位如何在前缀 + ModR/M + SIB 之间稀疏。
猜你喜欢
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 2021-03-25
  • 2014-11-21
相关资源
最近更新 更多