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

2023-12-14

我用的是官方最新的“英特尔® 64 和 IA-32 架构软件开发人员手册合并卷:1、2A、2B、2C、2D、3A、3B、3C、3D 和 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甚至还有一张桌子。


我搜索了英特尔的第 2 卷 PDFr14(这对于任何事情来说都不是“特殊”的,并且可能只会出现在表格中)。那里are第 2 卷中的一些表,但不是简单 ModRM 本身的表。 (合并后的 PDF 太大,无法使用)。

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


然而,信息is第2卷中有:

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

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

依此类推,每个寄存器都有行,还有 R14W、R14D、R14 的字、双字和 qword 大小的 3 组列。因此,如果您对二进制数映射到寄存器名称的事实有疑问,该表会清楚地说明这一点。 (如果假设寄存器编号在这里与其他上下文中的工作方式不同,那就太疯狂了。)

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

有一整桌表 2-8。 VEX.vvvv 注册名称映射,带有 xmm/ymm0..15 和 RAX/EAX .. R15/R15D。 (VEX.vvvv 可以为 BMI 指令编码整数寄存器,例如andn,是的,它们仅针对 dword 或 qword 进行记录,不能使用 a 覆盖字操作数大小66字首。)

表 2-13。 SIB 字节的 32 位 VSIB 寻址形式也是相关的,显示 ESI/R14D 等列。 (在 64 位模式下,您通常不会使用 67 地址大小的前缀vpgatherdd或其他什么,但你可以。 64 位地址大小没有单独的表。)该表没有明确提及howVEX.B 在两个寄存器之间选择给定的位 2:0 值,但这显然应该来自其他情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Intel 在哪里记录了 ModR/M 字节中扩展寄存器 (R8-R15) 的编码? 的相关文章

随机推荐

  • C# 为所有可选参数提供值

    我正在读一本 C 书籍 正在阅读命名参数和可选参数一章 我读过一个项目符号 上面写着 如果存在多个可选参数并且指定了一个值 一 所有前面的可选参数也必须提供值 您能给我一个例子吗 因为我无法从代码中重现上述语句 以此方法签名为例 publi
  • 从使用 JWS 下载的 jar 文件中提取一些内容

    我试图从使用 java webstart 下载的 jar 文件中提取一些文件 下面的代码用于定位 jar 并启动文件系统 1 final ProtectionDomain domain this getClass getProtection
  • 如何在 UIView 中加载 xib 文件

    我一直在到处寻找 但到目前为止没有任何对我有用的东西 基本上我想要一个名为 rootView xib 的 xib 文件 在其中我想要一个 UIView 让我们称之为 containerView 它只占据屏幕的一半 所以会有常规视图和新视图
  • iframe 和父站点之间如何通信?

    iframe 中的网站不在同一个域中 但两者都是我的 我想在iframe和父站点 是否可以 对于不同的域 无法直接调用方法或访问 iframe 的内容文档 你必须使用跨文档消息传递 父级 gt iframe 例如在顶部窗口中 myIfram
  • Laravel 集团按月记录和总价

    您好 我正在尝试按月份对记录进行分组并对订单中的价格进行求和 我尝试过这样的事情 order Order select DB raw sum price as sums gt groupBy function date return Car
  • 带有 Tomcat 9 的 jakarta.servlet - 未找到问题 [重复]

    这个问题在这里已经有答案了 我有一个使用 eclipse 和 tomcat 9 服务器运行的应用程序 当我运行应用程序时 它会在浏览器中打开 index html 页面 但在索引页面内调用的 API 会出现 404 状态错误 我尝试了各种
  • 通过鼠标点击删除节点,networkX,python 2.7

    我用Python 2 7用networkX编写了一个程序 它绘制了一棵带有黑白节点的树 这是一个最小的例子 import networkx as nx import matplotlib pyplot as plt import numpy
  • 如何立即调用 C++ lambda?

    我继承的类的构造函数需要传入一个重要的对象 与此类似 MyFoo MyFoo SomeBase complexstuff return The complexstuff没有什么关系MyFoo 所以我不想将其传递进去 而不是编写某种返回的一次
  • 更改 HTML 文本框:覆盖而不是插入为用户类型

    我正在开发一项允许编辑文本的服务 为了在此过程中帮助用户 我想允许用户将文本字段设置为覆盖模式 就像在 Word 等中一样 如何将 HTML 文本框的行为更改为覆盖而不是插入文本当用户输入时 例如 如果文本框包含以下文本 This is a
  • 有什么方法可以根据类模板类型初始化此变量吗?

    我有课stats带有模板 这样就可以灵活使用 不过 我对模板很陌生 我认为它们的重点是使其在用户周围灵活 所以我觉得我做错了什么 因为我撞到了一堵小墙 include
  • SQL,关于连接的问题

    我在 sql 2012 中有两个表 名称和产品 其结构 name id int increment name1 nvarchar 50 prod id int increment products nvarchar 50 id name i
  • 如何在 Indy 10 中启用完美前向保密?

    我在 Delphi 2010 中使用 OpenSSL 1 0 2o 和 Indy 10 6 2 这是我到目前为止所做的 procedure TServerForm FormCreate Sender TObject var LEcdh PE
  • 对 WCF 行为扩展进行单元测试

    这真让我抓狂 我有一个扩展 如果出现错误 我们可以用它来更改请求的内容响应 基本上 如果一切正常 它会正常序列化为 JSON 但如果我们收到未处理的异常 我们会根据不同的对象进行序列化 我们需要围绕此进行单元测试 但我不知道如何编写它们 验
  • UITableView 自定义单元格图像在滚动后消失。

    我正在创建我的开放网格视图 我创建了一个自定义单元格 如下所示 我像这样处理填充它 UITableViewCell tableView UITableView tableView cellForRowAtIndexPath NSIndexP
  • android LoginButton.setFragment 中的 facebook 登录

    我的 LogginButton 有问题 LoginButton authButton LoginButton v findViewById R id authButton authButton setFragment this 我使用的片段
  • 从 $request_body 记录 POST 数据

    我的配置设置可以处理一堆 GET 请求 这些请求呈现的像素可以很好地处理分析和解析查询字符串以进行日志记录 使用额外的第三方数据流 我需要处理对给定 URL 的 POST 请求 该 URL 在其请求正文中具有预期可记录格式的 JSON 我不
  • 如何在 JavaScript 中从多维数组中删除空数组?

    我在从 Google Sheets 中的搜索应用程序的多维数组中删除空数组 对象时遇到问题 我在用getLastRow所以我以为我会避免这个问题 但不幸的是事实并非如此 我的数组如下所示 1 39080000912E11 RSSMA0040
  • 通过 std::bind 传递右值

    我想传递一个右值std bind到 C 0x 中采用右值引用的函数 我不知道该怎么做 例如 include
  • Java、传值、引用变量

    我在理解以下示例中 Java 的 按值传递 操作时遇到问题 public class Numbers static int s ccc 7 static int t ccc 7 public static void calculate in
  • Intel 在哪里记录了 ModR/M 字节中扩展寄存器 (R8-R15) 的编码?

    我用的是官方最新的 英特尔 64 和 IA 32 架构软件开发人员手册合并卷 1 2A 2B 2C 2D 3A 3B 3C 3D 和 4 作为了解x86 64 ISA的机器级编码的参考 第 2 卷第 2 1 3 节中提供的 ModR M 和