x86 OpCode 指令解码

2024-02-11

我一直在研究 x86 架构的软件开发人员手册,试图提高我的逆向工程技能。我知道该架构很复杂并且向后兼容前几代。随着新一代的出现,一些旧的文档部分被遗漏了。但令人不安的解释和误解之一是与此类似的说明:

80 /2 ib

因此,基于以下的说明80操作码后跟一个 MOD/RM/REG 字节。 忽略旧内容的副作用之一是,我对不同版本的 MOD/RM/REG 字节一无所知。但我一直认为它们是有区别的,因为架构根源是 8/16 位。值得庆幸的是,我在最初介绍该架构时偶然发现了 MOD/RM/REG 字节的剖析。

因此,上面提供的指令后跟正斜杠数字表示八进制值将包含在 MOD/RM/REG 字节的 RM 偏移内,其值为2.

我的实际问题如下:

MOD/RM/REG 字节中的 MOD 偏移量是否接受当前条件下的所有寻址模式,或者是否有任何强加的限制? 另一件事有人知道为什么用 a 指定数字吗?/2?这是否可以作为假设在老一代 ISA 中使用较低值并因此保留以实现向后兼容性的理由。


Instruction Prefix                0 or 1 Byte
Address-Size Prefix               0 or 1 Byte
Operand-Size Prefix               0 or 1 Byte
Segment Prefix                    0 or 1 Byte
Opcode                            1 or 2 Byte
Mod R/M                           0 or 1 Byte
SIB, Scale Index Base (386+)      0 or 1 Byte
Displacement                      0, 1, 2 or 4 Byte (4 only 386+)
Immediate                         0, 1, 2 or 4 Byte (4 only 386+)

Format of Postbyte(Mod R/M byte from Intel-manual)
--------------------------------------------------
MM RRR MMM

MM  - Memory addressing mode
RRR - Register operand address
MMM - Memory operand address

RRR Register Names
Filds  8bit  16bit  32bit
000    AL     AX     EAX
001    CL     CX     ECX
010    DL     DX     EDX
011    Bl     BX     EBX
100    AH     SP     ESP
101    CH     BP     EBP
110    DH     SI     ESI
111    BH     DI     EDI

---

16bit memory (No 32 bit memory address prefix)
MMM   Default MM Field
Field Sreg     00        01          10             11=MMM is reg
000   DS       [BX+SI]   [BX+SI+o8]  [BX+SI+o16]
001   DS       [BX+DI]   [BX+DI+o8]  [BX+DI+o16]
010   SS       [BP+SI]   [BP+SI+o8]  [BP+SI+o16]
011   SS       [BP+DI]   [BP+DI+o8]  [BP+DI+o16]
100   DS       [SI]      [SI+o8]     [SI+o16]
101   DS       [DI]      [DI+o8]     [SI+o16]
110   SS       [o16]     [BP+o8]     [BP+o16]
111   DS       [BX]      [BX+o8]     [BX+o16]
Note: MMM=110,MM=0 Default Sreg is DS !!!!

32bit memory (Has 67h 32 bit memory address prefix)
MMM   Default MM Field
Field Sreg     00        01          10             11=MMM is reg
000   DS       [EAX]     [EAX+o8]    [EAX+o32]
001   DS       [ECX]     [ECX+o8]    [ECX+o32]
010   DS       [EDX]     [EDX+o8]    [EDX+o32]
011   DS       [EBX]     [EBX+o8]    [EBX+o32]
100   SIB      [SIB]     [SIB+o8]    [SIB+o32]
101   SS       [o32]     [EBP+o8]    [EBP+o32]
110   DS       [ESI]     [ESI+o8]    [ESI+o32]
111   DS       [EDI]     [EDI+o8]    [EDI+o32]
Note: MMM=110,MM=0 Default Sreg is DS !!!!

---

SIB is (Scale/Base/Index)
SS BBB III
Note: SIB address calculated as:
<sib address>=<Base>+<Index>*(2^(Scale))

Fild   Default Base
BBB    Sreg    Register   Note
000    DS      EAX
001    DS      ECX
010    DS      EDX
011    DS      EBX
100    SS      ESP
101    DS      o32        if MM=00 (Postbyte)
SS      EBP        if MM<>00 (Postbyte)
110    SS      ESI
111    DS      EDI

Fild  Index
III   register   Note
000   EAX
001   ECX
010   EDX
011   EBX
100              never Index SS can be 00
101   EBP
110   ESI
111   EDI

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

x86 OpCode 指令解码 的相关文章

随机推荐

  • 用于构建成就系统的 Ruby/Rails 现代化工具

    我有兴趣为我的 Ruby on Rails 应用程序构建一个强大的成就系统 成就可以通过多种方式实现 通常 我们会有一些可能发生在多个模型上的标准 一些是必需的 一些是触发成就的可选 混合和匹配 我想说这类似于此处或 Foursquare
  • WPF-Prism CanExecute 方法未被调用

    我正在编写一个简单的登录用户控件 其中包含两个文本框 用户名和密码 和一个登录按钮 我希望仅在填写用户名和密码字段时启用登录按钮 我正在使用 Prism 和 MVVM LoginViewModel 包含一个名为 LoginCommand 的
  • 如何替换 Postgres 中的表?

    基本上我想这样做 begin lock table a alter table a rename to b alter table a1 rename to a drop table b commit 即获得控制权并替换我的旧桌子 而没有人
  • java.lang.ArrayIndexOutOfBoundsException : 0 是什么意思

    我的编译器一直指向这一行 arr i new specialDelivery name name2 weight special 和这个 arr i new specialDelivery name name2 weight special
  • Qt5参考文档:qch文件

    我想在 QtAssistant 中查看 Qt 参考文档 但是 Qt5 的安装没有附带 Qt 库的 qch 文档文件 我试图在http qt project org http qt project org但到处都找不到它们 如何获取 Qt5
  • 如何禁用 reCAPTCHA Flask App Builder

    我是 Flask 应用程序构建器的新手 正在尝试设置用户注册 但出于我的目的 我不需要 reCAPTCHA 有没有办法在配置文件中禁用 reCaptcha 我的配置文件如下所示 Uncomment to setup Public role
  • 在调用中使用查询参数时缓存记录? Ember-数据

    我有这条路线检索 2 个模型 App PanelRoute Ember Route extend model function var topologymin this store find topologymin var metricma
  • 自定义字体 Xcode 4.3

    我正在尝试使用这个字体 http www dafont com chalkboard font在我的项目中 但它不起作用 我在项目中添加了 ttf 文件 并将其名称添加到 MyApp Info plist 的键下 应用程序提供的字体 然后我
  • 匿名函数的上下文是什么?

    我有这样的代码 function demo this val 5 function this val 7 现在 当我在 Firefox 或 Chrome 控制台中执行此代码时 它会出现语法错误 我不明白为什么这是一个错误 因为我读过 jav
  • 为什么状态对组件可见?

    据我了解 vuex 的重点是通过仅通过突变 操作 获取器将其暴露给组件来保证状态的一致性 但是 组件可以直接操作 store state 而不使用突变 操作 可能会导致状态不一致 为什么vuex状态直接暴露出来 使用突变 动作 吸气剂等是建
  • 在页面刷新/导航时保留 Twitter Bootstrap 折叠状态

    我正在使用 Bootstrap 折叠 插件为一长串链接制作一个手风琴 Accordion body 标签包含 collapse 因此页面加载时所有组都会折叠 当您打开一个组并单击链接时 它会将您带到一个新页面以查看一些详细信息 然后单击后退
  • Matplotlib 中的日期和时间间隔绘图

    pyplotplot date函数期望以某种线条样式绘制日期和值对 是否有推荐的方法根据日期 时间值绘制多个值或间隔数据 要绘制间隔数据 您可以使用由错误栏 功能及用途axis xaxis date 使 matplotlib 格式化轴 例如
  • Hadoop Namenode 元数据 - fsimage 和编辑日志

    据我所知 出于性能原因 fsimage 在启动时加载到内存中 并且任何进一步的事务都会添加到编辑日志中 而不是添加到 fsimage 中 当namenode重新启动时 内存中的fsimage会被刷新 为了提高效率 辅助名称节点定期执行检查点
  • ckeditor 未加载通过 ajax 调用生成的元素?

    我正在使用自定义表单并通过 ajax 调用生成表单元素 但 textarea 未使用 ckeditor 加载 这是我的代码 阿贾克斯代码 jQuery ajax type POST url reg arz ajax2 php data bo
  • 如果创建了大写字母,则 TextInput 值上的 toLowerCase 会创建重复文本

    这是一个有趣的 我创建了一个 TextInput 它接受一个值 然后将其小写 将其添加到状态 并将其设置为默认值 在我的 Android 物理设备上 如果您强制使用大写字母 自动大写设置为无 然后快速点击其他字母 它将复制并添加额外的文本
  • graphviz 中的自循环边缘太短且难看

    我用graphviz画了一张图 请参见FSM https i stack imgur com bsVUW png 我认为它很丑 因为自环边缘太短 边缘的属性 minlen 对我不起作用 我尝试了节点的几个端口 但除了我当前的实现之外 一切都
  • PLY - 返回多个令牌

    AFAIK 词法 Python 源代码的技术是 当当前行的缩进级别小于前一行的缩进级别时 产生 DEDENT 如果要关闭多个 INDENT 则生成多个 DEDENT 当到达输入末尾时 如果存在未闭合的 INDENT 则生成 DEDENT 现
  • 带有 codeigniter 的活动菜单选项卡

    Codeigniter中可以使用什么方法来实现活动菜单选项卡 例如我有一个用户菜单Profile Friends Messages Logout 当我在配置文件控制器中时 URL 是domain com profile some funct
  • JSF 的采用和普及

    只是一个一般性问题 欢迎讨论 到目前为止 我非常喜欢 JSF 我对它还很陌生 但我更喜欢它而不是 Struts 从专业人士的角度来看 您认为 JSF 的未来光明吗 作为一个年轻的程序员 值得投资学习 JSF 2 0 而不是 Struts 或
  • x86 OpCode 指令解码

    我一直在研究 x86 架构的软件开发人员手册 试图提高我的逆向工程技能 我知道该架构很复杂并且向后兼容前几代 随着新一代的出现 一些旧的文档部分被遗漏了 但令人不安的解释和误解之一是与此类似的说明 80 2 ib 因此 基于以下的说明80操