gpt4 book ai didi

assembly - 英特尔在哪里记录了 ModR/M 字节中扩展寄存器 (R8-R15) 的编码?

转载 作者:行者123 更新时间:2023-12-04 14:05:01 25 4
gpt4 key购买 nike

我使用最新的官方“Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D and 4”作为引用来理解 x86-64 ISA 的机器级编码。

第 2 卷第 2.1.3 节中提供的 ModR/M 和 SIB 字节的文档给出了引用 8 位、16 位和 32 位寄存器的确切编码(表 2-1、2- 2 和 2-3)

但是,我找不到类似的表来指定 REX 前缀中的 REX.X、REX.B、REX.R 字节如何与 ModR/M 结合以指定扩展寄存器。我专门为每个扩展寄存器寻找显式二进制编码。据我所知,手册中 REX 前缀的文档仅指定使用 REX 中的相应位将 reg、r/m 字段在 MSB 中扩展 1 位,但实际上并未给出显式映射位组合。

英特尔文档是否在 SDM 的任何地方明确说明了这些映射?或者只是假设 R8-R15 将遵循明显/自然的映射策略,REX.B/X/R 设置为 1,R8 编码为 000,R9 编码为 001 ... R15 编码为 111?

最佳答案

是的,正如您发现的那样,它遵循简单的二进制编号,使用 REX 位作为前导位,ModRM 位作为低 3 位来对寄存器编号进行编码。 8 = 二进制 1000,因此这是 R8 的编码。

https://wiki.osdev.org/X86-64_Instruction_Encoding#Encoding解释得很好,https://wiki.osdev.org/X86-64_Instruction_Encoding#Registers甚至还有一张 table 。


我在 Intel 的 vol.2 PDF 中搜索了 r14(它对任何东西都不是“特殊”的,并且可能只会出现在表格中)。第 2 卷中一些表格,但没有一个用于简单 ModRM 本身。 (合并后的 PDF 太大而无法使用)。

第 2 卷确实清楚地描述了 REX 字段如何与 ModRM 字段结合以生成 4 位寄存器数字。 (例如,图 2-4 显示了 REX.B 和 ModRM.rm 的串联,以及 REX.R 和 ModRM.r 的串联)。我没有检查第 1 卷 - 如果可以在那里找到关于寄存器 名称(由汇编程序使用)匹配二进制寄存器编号的一些声明,我不会感到惊讶。名称仅对汇编程序有意义,在机器代码中没有意义,这在第 2 卷中有明确记录。


但是,第 2 卷中的信息:

它确实有 表 3-1。与+rb、+rw、+rd、+ro(续)相关的寄存器代码(续) 对于没有 ModRM 的指令,其中操作码字节的低 3 位是寄存器编号的低 3 位。 (就像 push/pop r64 的短编码)。

Reg REX.B Reg field
R13B Yes 5
R14B Yes 6

以此类推,每个寄存器都有行,还有 3 组列用于 R14W、R14D、R14 的字、双字和四字大小。因此,如果您对二进制数映射到寄存器名称这一事实存有疑问,该表将一目了然。 (如果认为寄存器编号在这里与其他情况下的工作方式不同,那就太疯狂了。)

还有一个字节操作码的操作码映射,其中 push rSI/r14 共享一个条目 (0x58),与 xchg-with-(e)ax 相同,mov-immediate 到 byte- reg、pop、mov-immediate 到 word/dword/qword-reg 和 2 字节操作码映射中的 bswap。同样,如果这些寄存器编号的工作方式与其他地方的寄存器编号不同,那就太疯狂了。

有一个完整的表格表2-8。 VEX.vvvv 注册名称映射,与 xmm/ymm0..15 和 RAX/EAX .. R15/R15D。 (VEX.vvvv 可以为 BMI 指令编码整数寄存器,如 andn ,是的,它们仅记录为双字或四字,不能用 66 前缀覆盖字操作数大小。)

表 2-13。 SIB 字节的 32 位 VSIB 寻址形式也是相关的,显示像 ESI/R14D 这样的列。 (在 64 位模式下,您通常不会将 67 地址大小前缀与 vpgatherdd 或其他任何内容一起使用,但您可以。没有单独的 64 位地址大小表。 ) 该表没有明确提及如何 VEX.B 为给定的位 2:0 值在两个寄存器之间进行选择,但从其他情况来看应该很明显。

关于assembly - 英特尔在哪里记录了 ModR/M 字节中扩展寄存器 (R8-R15) 的编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68853305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com