一个操作码字节如何根据“寄存器/操作码”字段解码为不同的指令?那是什么? [复制]

2023-12-20

如何确定字节数组将转换成机器代码?

我知道如果我在开头看到 0f 它是一个 2 字节指令,但我看到其他前缀,并且在 x64 调试器中的一些反汇编中我看到奇怪的交互,例如 48 83 C4 38 并且我可以在操作码参考中看到 48 表示操作数是64字节。

But 83说它可以是 7 个不同的指令,具体取决于一个名为“寄存器/操作码字段”的字段..什么?

有人可以解释一下处理器如何使用这些字节来确定背后的逻辑:

  1. 运行了什么指令
  2. 指令使用哪些寄存器和/或地址(如果有)

0x48是一个 REX 前缀,W 字段设置为 1,表示 64-bit操作数大小。 (不是 64 字节)。

许多用于立即版本指令的操作码,包括83,使用3位/rModR/M 字节中的字段作为 3 个额外的操作码位。英特尔的第 2 卷手册对此进行了记录,我认为附录中的操作码表也包含了它。

这就是为什么大多数原始 8086 立即指令,例如and r/m, imm仍然只允许 2 个操作数,与shrd eax, edx, 4 or imul edx, [rdi], 12345其中两个 ModRM 字段都用于对操作数以及操作码隐含的立​​即操作数进行编码。 SHRD/SHLD 并添加了 386 和 imul-immediate新增186个 https://ulukai.org/ecm/insref.htm#insIMUL。复制与与 (and eax, edx, 0xf) 不可编码,但至少 x86 可以使用 LEA 进行复制和添加/子操作。


每条指令都有自己的文档,例如add(第 2 卷手册的 html 摘录) https://www.felixcloutier.com/x86/add,显示编码如
REX.W + 83 /0 ib for ADD r/m64, imm8,这就是你所拥有的。

来自 wiki.osdev.org 的 ModRM 位字段图 https://wiki.osdev.org/X86-64_Instruction_Encoding#ModR.2FM_and_SIB_bytes

  7                           0
+---+---+---+---+---+---+---+---+
|  mod  |    reg    |     rm    |
+---+---+---+---+---+---+---+---+

0xc4 = 0b11000100,因此 reg 字段 = 0。因此我们的操作码是83 /0,采用英特尔的表示法。

其余的 ModRM 字段是:

  • mode = 0b11,因此 rm 字段编码寄存器操作数,而不是寻址模式的基址寄存器。
  • rm = 0b100。寄存器 #4 = SPL/SP/ESP/RSP。 (在本例中为 RSP,因为它是 64 位操作数大小)。请参阅英特尔手册,或https://wiki.osdev.org/X86-64_Instruction_Encoding#Registers https://wiki.osdev.org/X86-64_Instruction_Encoding#Registers对于桌子。

所以指令是add rsp, 0x38

ndisasm -b64 agrees:

$ cat > foo.asm
db 0x48, 0x83, 0xC4, 0x38
$ nasm foo.asm     # create a flat binary with those bytes, not an object file
$ ndisasm -b64 foo
00000000  4883C438          add rsp,byte +0x38
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个操作码字节如何根据“寄存器/操作码”字段解码为不同的指令?那是什么? [复制] 的相关文章

随机推荐

  • NSMutableArray 和 NSPredicate 过滤

    我正在尝试使用对象中的两个实体来过滤我的数组 就像我有一个 Person 对象 其中有姓名 地 址 号码 电子邮件等 我正在尝试仅使用名称和号码来过滤我的对象数组列表 如何使用 NSPredicate 来实现这一点 创建谓词 以下假设您的P
  • 具有不同子项的 Sql XML 路径

    我已经完成了很多 XML PATH 语句 但这个语句我却忽略了 或者对于多个不同的子项来说甚至可能是不可能的 最终结果应该是这样的
  • 为所有架构编译 PJSIP 2.5 库

    要为 iPhone 设备编译 PJSIP 库 我使用此代码 make distclean make clean ARCH arch arm64 configure iphone enable opus codec make dep make
  • Tomcat 7 GZIP 压缩不起作用

    我在 tomcat 的 conf server xml 文件中添加了以下行以启用 gzip 压缩 但它不起作用 页面仍未压缩
  • 如何从文本中删除变音符号?

    我正在制作一个瑞典语网站 瑞典语字母是 和 我需要使用户输入的字符串成为 PHP 的 url 安全 基本上 需要将所有字符转换为下划线 除了这些 A Z a z 1 9 所有瑞典语都应该像这样转换 到 a 到 a 到 o 只需删除上面的点
  • 为什么 HSV 到 RGB 算法会这样工作?

    我读过维基百科的文章从 HSV 转换为 RGB http en wikipedia org wiki HSL and HSV From HSV 但我不明白 为什么每个案例选项都是这样的 如果顺序很重要 为什么它们是这样排序的 维基百科概述了
  • Symfony 在模板中包含静态 html

    我刚刚开始学习如何使用 Symfony 我相信它很简单 但我在模板引擎方面遇到了一些问题 我想在 Symfony 中的一个树枝模板中包含一个静态 HTML 片段 2 5 6 现在我在资源目录中创建了一个静态子文件夹 这可能会改变 但它肯定不
  • 雪花在程序编译期间删除反斜杠?

    由于某种原因 Snowflake 正在从我的正则表达式函数中删除反斜杠 但仅当我在创建 Javascript 过程时将该函数放在 之间时才删除 对于上下文 这里是我的正则表达式函数 CREATE OR REPLACE FUNCTION RE
  • Crud Webapp Google Apps 脚本

    是否可以使用 Google Apps 脚本创建 Crud Webapp 我需要创建一个能够更新 Google 电子表格并获取值的网络表 是的 它是可能的 您可以使用谷歌应用程序脚本插入 更新行 删除和检索行 试试这个链接https gith
  • 为什么 Boost 库在线程屏障的实现中使用 m_ Generation 变量?

    boost 库 C 11 标准之前 提供了对线程的支持 作为其支持的一部分 它还提供了 barrier 的实现 这是一个允许同步的简单类 引用提升网站 http www boost org doc libs 1 56 0 doc html
  • 如何使此 jQuery 代码与 GridView 控件一起使用

    edit 什么不起作用 我有两列 批准全部 拒绝全部 我如何限制用户只允许每一列中的一个复选框 如果您不使用 gridview 下面的代码可以工作 我在这里问了这个问题 只允许选中一个 批准 拒绝 复选框 https stackoverfl
  • QtConcurrent 的 Scala 类似物

    Scala 或 Java 的 QtConcurrent 的类似物是什么 即MapReduce 并行map 和foldl 的简化实现 谢谢 您可以使用 Scala 并行集合 它们目前是 Scala nightly 版本的一部分 并将在 Sca
  • 使用D2009和D2010的新功能在Delphi中创建单例

    我正在寻找在 Delphi 中创建一个单例 我在使用旧版本的 Delphi 之前已经完成了此操作 并最终使用全局变量 在实现部分 并使用初始化和终结来处理实例 此外 无法阻止用户创建实例 因为您无法隐藏标准构造函数 我想知道是否有任何新功能
  • 为什么 AVG 行长度是预期的 4 倍?

    我有这张表 CREATE TABLE tree paths child id int 10 unsigned NOT NULL parent id int 10 unsigned NOT NULL sponsor upline tinyin
  • 如何在序言中的谓词中传递列表

    我想将一个段落作为列表存储在变量中 然后调用该列表来计算特定单词在该段落中出现的次数 但是 当我这样做时 L hello hello hello counthowmany 0 counthowmany X X Q N counthowman
  • Flutter Web:文件选择器抛出“无效参数(路径):不得为空”错误

    目标 使用文件资源管理器选择文件并上传到 Firebase 存储 包 file picker 2 1 4 问题 引发错误 无效参数 路径 不得为空 文件资源管理器打开正常 我可以选择一个文件 但是 选择文件后没有任何反应 下面是我迄今为止尝
  • 使用 UrlFetch 时无法处理 DeadlineExceededError

    我有这个基本实用程序类并行获取 可能 缩短的 URL 并返回具有最终 URL 的字典 它使用在此描述的 wait any 功能博客文章 http neopythonic blogspot com 2011 01 asynchronous r
  • Eclipse 无法在 Windows 7 上连接 Oracle 10g XE

    Eclipse 无法连接到 oracle 10g 它给出如下错误 Could not connect to New Oracle Error creating SQL Model Connection connection to New O
  • 在 emacs 中从驼峰命名法转换为 _

    emacs 是否有一个函数可以将驼峰式单词转换为下划线 就像是 longVariableName M x to underscore long variable name 使用 MELPA 上提供的 string inflection 包
  • 一个操作码字节如何根据“寄存器/操作码”字段解码为不同的指令?那是什么? [复制]

    这个问题在这里已经有答案了 如何确定字节数组将转换成机器代码 我知道如果我在开头看到 0f 它是一个 2 字节指令 但我看到其他前缀 并且在 x64 调试器中的一些反汇编中我看到奇怪的交互 例如 48 83 C4 38 并且我可以在操作码参