当前位置: 首页 > news >正文

硬编码(Reg/Opcode 和 SIB)

变长指令Reg/Opcode


在这里插入图片描述

我们知道,3-5的这一段,描述的是通用寄存器Reg的信息,那当描述的不是Reg时,我们该如何查表

0x80
0x81
0x82
0x83

看下这三个指令对应的Tabel A-2这表主表内容

在这里插入图片描述

注:凡是看到有Grp的,均参写 Table A-6

在这里插入图片描述
表注释补充:
在这里插入图片描述

上标符号及其含义

符号含义
1AModR/M 字节的第 5、4、3 位用作操作码扩展(参考附录 A.4:“单字节和双字节操作码的扩展”)。
1B当需要故意生成无效操作码异常(#UD)时,使用 0F0B(UD2 指令)、0FB9H(UD1 指令)或 0FFFH(UD0 指令)操作码。
1C某些指令共享相同的双字节操作码。如果指令存在变体,或操作码对应不同指令,则通过 ModR/M 字节区分。具体解码值参见表 A-6。
i64该指令在 64 位模式下无效或不可编码。单字节 40-4F(INC/DEC)在 64 位模式下会被解释为 REX 前缀(需改用 FE/FF 组 4 和 5 编码 INC/DEC)。
o64该指令仅在 64 位模式下可用。
d64在 64 位模式下,指令默认使用 64 位操作数大小且无法编码 32 位操作数大小。
f64在 64 位模式下,操作数大小强制为 64 位(操作数大小前缀对此指令无效)。
v仅存在 VEX 编码形式(无传统 SSE 形式)。对于整数通用寄存器指令,表示必须使用 VEX 前缀。
v1仅存在 VEX128 和 SSE 形式(无 VEX256),且无法从数据大小推断时使用。

举例说明:

80 65 08 FF

  1. 第一个字节为80,查Table A-2表,得到对应结构:Eb,Ib
  2. 第二个字节为ModR/M字段,所以拆分65:01(Mod) 100(Reg/Opcode) 101(R/M)
  3. 先看01(Mod),再看101(R/M)对应的是[RBP] + disp8
  4. 再看1A的解释:ModR/M 字节的第 5、4、3 位用作操作码(Opcode)扩展(参考附录 A.4:“单字节和双字节操作码的扩展”)
  5. 看TableA-6这张表:看Group这一列,后面跟的什么就看什么,比如我们后面跟着的是1,就确定了我们所在的行
  6. 看我们Reg/Opcode的值为:100,对应100的位置为AND
  7. 最终我们的指令就是:AND [RBP+disp8],Ib
  8. 我们已经分析过80 65的指令了,但是disp8偏移量和Ib立即数是多少呢,所以80 65 后面还要跟两个字节,用来表示偏移和立即数

在这里插入图片描述

最终结果:

在这里插入图片描述


定长指令SIB

在这里插入图片描述

SIB是由谁来决定的?

SIB是由ModR/M来决定的,同时ModR/M如果确定了,那么同时Displacement和Immediate也确定了

SIB结构

在这里插入图片描述

指令示例:

88 84 48

  1. 通过查表,得知88的指令格式为 MOV Eb,Gb
  2. 那么第二个值84就为ModR/M,拆分:10(Mod) 000(reg/Opcode) 011(R/M)
  3. 查Tabel 2-2表,先看Mod部分为:10,R/M为:[--][--] + disp32 ,这种奇怪的格式
  4. 如果查到为[–][–]这种格式的描述时,就说明,以当前查询方式无法获取到指令格式,还需要额外的一个字节(SIB)来进行查询
  5. 我们接着拆分48为:01 (Scale)001(Index)000(Base)
  6. 查Table 2-3 表
  7. 先看Base(000)为RAX
  8. 再看Scale(01)对应的在哪一组
  9. 最后看Index(001)为:[RCX*2]
  10. 最终我们的指令为:MOV BYTE PTR DS:[RAX + RCX * 2 + disp32],AL

在这里插入图片描述

相关文章:

  • moduo之线程Thread
  • 为什么会出现 make 工程管理器?它到底能做什么?
  • [Linux_core] “虚拟文件” | procfs | devfs | 上下文
  • 前端大文件分片上传+后端(node)接收分片并合并
  • Android 网络请求的选择逻辑(Connectivity Modules)
  • 深入解析 MySQL 并发控制:读写锁、锁粒度与高级优化
  • 数据库(考前两天版本)
  • 李沐动手深度学习(pycharm中运行笔记)——11.模型选择+过拟合欠拟合
  • SQL关键字三分钟入门:UNION 与 UNION ALL —— 数据合并全攻略
  • RKNN开发环境搭建3-RKNN Model Zoo 板载部署以Whisper为例
  • pyqt 简单条码系统
  • OpenStack入门
  • 搭建简易采购系统:从需求分析到供应商数据库设计
  • 【第二章:机器学习与神经网络概述】01.聚类算法理论与实践-(2)层次聚类算法(Hierarchical Clustering)
  • 【对比】DeepAR 和 N-Beats
  • 【unitrix】 3.0 基本结构体(types.rs)
  • python 解码 jwt
  • javaweb -Ajax
  • LVS—DR模式
  • 最新FVCOM 潮流、波浪、泥沙、水质、温盐、染色剂、粒子示踪、嵌套、背景流、自动化全流程
  • 织梦网站地图怎么做/拉新十大推广app平台
  • app制作平台靠谱吗/关键词排名优化方法
  • 教修图的网站/百度关键词模拟点击软件
  • 上海市建设网站/百度引流推广怎么收费
  • 南京做网站外包/百度推广关键词
  • 市场宣传推广方案/重庆做seo外包的