X86指令基本格式

news2024/11/24 20:26:28

X86指令基本格式

  • 1 什么是机器码
  • 2 X86指令基本格式
  • 3 指令前缀
    • 3.1 第一组:封锁和重复执行前缀
    • 3.2 第二组:段前缀
    • 3.3 第三组:修改操作数默认长度
    • 3.4 第四组:修改默认地址长度
  • 4 操作码
  • 5 ModR/M与SIB
    • 5.1 ModR/M字节
    • 5.2 SIB字节
  • 6 地址位移
  • 7 立即数

本文属于《 X86指令基础系列教程》之一,欢迎查看其它文章。

1 什么是机器码

机器码是CPU可以识别,并执行的二进制数据。
通常使用高级语言,如C/C++编写的代码,经过编译之后,生成的可执行文件中,就包含了机器码,可以被CPU执行。
如果你熟悉X86机器码,具体的定义,那么你可以在文件中,徒手直接编写机器码,这样也可以被CPU执行,只不过难度很大,没有我们使用高级语言编写,然后编译为机器码,来的简单。

机器码,是我们通俗的叫法。在X86架构下,机器码就是指一条一条的X86指令,这些指令的集合,就叫做X86指令集

2 X86指令基本格式

所有的X86架构指令编码,都是基于一个基本指令格式来构成的。
基本指令,由以下组成:

  • Instruction Prefixes(指令前缀),可选,最多四个前缀,每个前缀1字节。
  • Opcode(操作码),必须,1或2字节。
  • ModR/M与SIB(地址形式说明符),可选,由ModR/M字节和SIB(Scale-Index-Base)字节组成。Mod R/M 字段指定寻址模式和操作数,符号 “R/M” (register/memory) 代表的是寄存器和模式。伸缩索引字节(scale index byte, SIB)用于计算数组索引偏移量。
  • Displacement(地址位移),可选,地址位移为1、2、4字节或无。地址位移字段保存了操作数的偏移量,在 “基址-偏移量” 或 “基址-变址-偏移量” 寻址模式中,该字段还可以与 “基址或变址寄存器” 相加。
  • Immediate(立即数),可选,立即数为1、2、4字节或无。立即数字段保存了常量操作数。
    在这里插入图片描述

3 指令前缀

X86指令集中的指令前缀(Instruction Prefix)是一种特殊的标记,用于指示紧随其后的指令应该如何被解释。指令前缀并不会改变指令的本质,但可能会改变指令的操作。
指令前缀分为四组:封锁和重复执行前缀、段前缀、修改操作数默认长度、修改默认地址长度,每组都有一组允许的前缀代码。
对于每条指令,可以从每一组中使用一个前缀,并以任意顺序放置。冗余前缀(来自一组的多个前缀)的影响是未定义的,并且可能因处理器而异。

3.1 第一组:封锁和重复执行前缀

  • F0H: LOCK前缀,封锁总线。在有数的指令(如ADD,ADC)前方时,使指令变为原子操作,并与被修饰的指令一起提供内存屏障效果。
  • F2H:REPNE/REPNZ前缀(只位于字符串指令前)。
  • F3H:REP前缀(只位于字符串指令前)。
  • F3H:REPE/REPZ前缀(与REP前缀同码)。

3.2 第二组:段前缀

在32位汇编中,有8个段寄存器:ES、CS、SS、DS、FS、GS、LDTR、TR(顺序固定),不再用段寄存器寻址而只做权限控制。前缀和寄存器对应如下:

  • 2EH:CS段覆盖前缀
  • 36H:SS段覆盖前缀
  • 3EH:DS段覆盖前缀
  • 26H:ES段覆盖前缀
  • 64H:FS段覆盖前缀
  • 65H:GS段覆盖前缀

使用前缀修饰后,指令(opcode)的默认段寄存器会被修改,如默认的MOV操作从DS段拿数据,加上36前缀后会基于SS段地址取数据。

3.3 第三组:修改操作数默认长度

66H,用来“反转”默认的16位或32位操作数宽度。例如,当默认的操作数宽度是32位时,可以用这个前缀选择16位宽度的操作数,或者反之。如下指令码和汇编对照:

50:  PUSH EAX
6650: PUSH AX

当一个66前缀出现在指令的开始处时,它告诉CPU,接下来的指令应该被视为一个16位指令,而不是32位指令。

3.4 第四组:修改默认地址长度

67H,用来“反转”默认的16位或32位地址宽度。例如,当默认的地址宽度是32位时,可以用这个前缀选择16位宽度的地址,或者反之。如下指令码和汇编对照:

8801:   MOV DS:[ECX],AL
678801: MOV DS:[BX+DI], AL

67H前缀是X86指令集中的一个指令前缀,用于改变指令的地址空间。
当67H前缀出现在一个指令前面时,它会告诉CPU,该指令的操作数应该被视为在16位地址空间中,而不是32位地址空间中。这个前缀通常用于在32位和16位模式之间切换。

4 操作码

Opcode主操作码为1或2字节。此外在ModR/M字节中,还有额外的3位操作码字段,可以在主操作码中定义较小的编码字段。这些字段定义了操作的方向、位移的大小、寄存器编码、条件码或符号扩展。操作码中字段的编码根据操作的类别而变化。
如果主操作码是0x0f开头则需要取第二字节,如果主操作码开头是0x0f38,0x0f3a开头则再取第三字节。

5 ModR/M与SIB

在这里插入图片描述

5.1 ModR/M字节

大多数引用内存中操作数的指令,在主操作码后面都有一个寻址形式说明符字节(称为ModR/M字节)。ModR/M字节包含三个信息字段:

  • Mod字段与R/M字段组合形成32个可能的值:8个寄存器和24种寻址模式。
  • Reg/Opcode字段指定一个寄存器号或三个以上的操作码信息。Reg/Opcode字段的目的在主操作码中指定。
  • R/M字段可以指定一个寄存器作为操作数,或者可以与Mod字段组合以编码寻址模式。

5.2 SIB字节

ModR/M字节的某些编码需要第二个寻址字节,即SIB字节,以完全指定寻址形式。32位寻址的base-plus-index(基本加索引)和scale-plus-index(缩放加索引)形式需要SIB字节。SIB字节包括以下字段:

  • Scale字段指定比例因子。
  • Index字段指定index register的寄存器号。
  • Base字段指定base register的寄存器号。

6 地址位移

一些寻址形式包括紧跟在ModR/M或SIB字节之后的位移。如果需要一个位移,它可以是1、2或4字节。如果指令指定了一个直接操作数,则该操作数总是跟随任何位移字节。直接操作数可以是1、2或4字节。

7 立即数

在X86指令集中,立即数(Immediate)是指直接在指令中给出的常数或者立即值。这些值直接嵌入到指令中,不需要从内存中读取,也不需要计算。
例如,以下是一条ADD指令,它将寄存器A中的值与立即数5相加:

ADD A, 5

在这个例子中,5就是立即数。这条指令将寄存器A中的值与5相加,并将结果存回寄存器A。立即数在指令编码中直接给出,不需要在执行时从内存中读取。
立即数可以用在各种需要固定数值的指令中,例如算术运算、逻辑运算、位移等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1071310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uCharts常用图表组件demo

带渐变阴影的曲线图 <view class"charts-box"><qiun-data-charts type"area" :opts"opts" :chartData"chartData" :ontouch"true":background"rgba(256,256,256,0)" /> </view>data(){return{…

嵌入式学习(1)HAL库

文章目录 1.HAL库文件介绍2.HAL库编程目录结构3.使用cubemx生成HAL库编程目录结构 1.HAL库文件介绍 2.HAL库编程目录结构 3.使用cubemx生成HAL库编程目录结构

【JavaEE重点知识归纳】第7节:类和对象

目录 一&#xff1a;了解面向对象 1.什么是面向对象 2.面向对象和面向过程区分 二&#xff1a;类定义和使用 1.什么是类 2.练习&#xff1a;定义一个学生类 三&#xff1a;类的实例化 1.什么是实例化 2.类和对象的说明 四&#xff1a;认识this 1.为什么要有this引用…

rails 常量自动加载和重新加载机制

在Rails中&#xff0c;有一个称为"常量自动加载和重新加载机制"的功能&#xff0c;它使得在开发和生产环境中能够自动加载和重新加载类和模块。这个机制允许您不必手动管理类的加载&#xff0c;使得开发更加方便。 快乐学习&#xff1a; 自动加载、重新加载 自动加…

Yii2全拦截路由catchAll的使用

定义&#xff1a;catchAll 路由&#xff08;全拦截路由&#xff09; 应用场景&#xff1a;网站维护的时候需要向用户抛出一个维护的页面&#xff0c;方便提醒用户 使用方法&#xff1a; 1、在应用配置中设置 yii\web\Application::catchAll 属性 2、新增对应的控制器方法 3、…

【Putty】win10 / win 11:SSH 远程连接工具 Putty 下载、安装

目录 一、Jmerter 连接 SSH 隧道的 mysql&#xff08;不可行&#xff09; 二、Putty 介绍 三、Putty 的下载 四、Putty 无需安装直接使用 五、Putty 使用 &#xff08;1&#xff09;我需要连接 ssh 隧道的 MySQL 参数如下 &#xff08;2&#xff09;Putty 使用教程 一、…

MA-SAM:模态不可知的三维医学图像分割SAM自适应

论文&#xff1a;MA-SAM: Modality-agnostic SAM Adaptation for 3D Medical Image Segmentation | Papers With Code 代码&#xff1a;GitHub - cchen-cc/MA-SAM: PyTorch implementation for MA-SAM 机构&#xff1a;a)高级医疗计算和分析中心&#xff0c;麻省总医院和哈佛…

华为云开源低代码引擎 TinyEngine 正式发布

随着企业对于低代码开发平台的需求日益增长,急需一个通用的解决方案来满足各种低代码平台的开发需求。正是在这种情况下,低代码引擎应运而生。它是一种通用的开发框架,通过对低代码平台系统常用的功能进行解构,将其划分为多个功能模块,并为每个模块定义了相应的协议和开发…

Go 语言中 panic 和 recover 搭配使用

本次主要聊聊 Go 语言中关于 panic 和 recover 搭配使用 &#xff0c;以及 panic 的基本原理 最近工作中审查代码的时候发现一段代码&#xff0c;类似于如下这样&#xff0c;将 recover 放到一个子协程里面&#xff0c;期望去捕获主协程的程序异常 看到此处&#xff0c;是否会…

传输层TCP协议

前言 传输层的历史渊源可以追溯到计算机网络的早期阶段。在20世纪60年代和70年代&#xff0c;计算机网络主要是由一些简单的点对点连接组成的。这些连接通常使用专用的硬件和协议&#xff0c;例如串行线路和电话线路。在这种情况下&#xff0c;传输层的功能是由这些协议本身来提…

【SpringCloud】认识微服务

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 认识微服务 一、 服务架构演变1.1 单体架构…

Qt之进程通信-QProcess(含源码+注释)

文章目录 一、QProcess进程通信示例二、QProcess通信个人理解三、源码MainWindowProcessSenderMainWindowProcessSender.hMainWindowProcessSender.cppMainWindowProcessSender.ui MainWindowProcessRecvMainWindowProcessRecv.hMainWindowProcessRecv.cppMainWindowProcessRec…

【算法——双指针】LeetCode 18 四数之和

题目描述&#xff1a; 解题思路&#xff1a;双指针 四数之和与前面三数之和思路一样&#xff0c;排序后&#xff0c;枚举 nums[a]作为第一个数&#xff0c;枚举 nums[b]作为第二个数&#xff0c;那么问题变成找到另外两个数&#xff0c;使得这四个数的和等于 target&#xff0c…

吃鸡玩家必备神器!一站式提升战斗力、分享干货!

大家好&#xff0c;我是吃鸡玩家。在这个视频中&#xff0c;我要分享一个让你瞬间提高战斗力的神器&#xff0c;同时让你享受到顶级游戏作战干货的盛宴&#xff01;让我们一起来了解吧&#xff01; 首先&#xff0c;我们推荐绝地求生作图工具。通过这款工具&#xff0c;你可以轻…

用这些IDEA插件,让你早下班两小时

GenerateAllSetter:一键调用一个对象的所有setter方法 RestfulTool:自动显示所有URL接口&#xff0c;快速检索接口 SequenceDiagram:以图形界面形式显示方法调用链&#xff0c;方便阅读源码、梳理代码 CamelCase:变量下划线转驼峰命名 Rainbow Brackets:帮助程序员识别代码中括…

十五、异常(5)

本章概要 异常限制构造器 异常限制 当覆盖方法的时候&#xff0c;只能抛出在基类方法的异常说明里列出的那些异常。这个限制很有用&#xff0c;因为这意味着与基类一起工作的代码&#xff0c;也能和导出类一起正常工作&#xff08;这是面向对象的基本概念&#xff09;&#…

基于SSM的校园资讯推荐系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

关联规则挖掘:Apriori算法的深度探讨

目录 一、简介什么是关联规则挖掘&#xff1f;什么是频繁项集&#xff1f;什么是支持度与置信度&#xff1f;Apriori算法的重要性应用场景 二、理论基础项和项集支持度&#xff08;Support&#xff09;置信度&#xff08;Confidence&#xff09;提升度&#xff08;Lift&#xf…

SSM - Springboot - MyBatis-Plus 全栈体系(十八)

第四章 SpringMVC SpringMVC 实战&#xff1a;构建高效表述层框架 一、SpringMVC 简介和体验 1. 介绍 Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从一开始就包含在 Spring Framework 中。正式名称“Spring Web MVC”来自其源模块的名称&#xff08…

OCR让点读笔如虎添翼

点读笔是一种智能学习工具&#xff0c;它可以通过识别文字来提供相应的语音或图像反馈。在实现文字识别功能时&#xff0c;点读笔通常会借助OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术。下面将详细介绍点读笔如何利用OCR技术实现文…