找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

211

积分

0

好友

23

主题
发表于 前天 03:30 | 查看: 5| 回复: 0

x86指令体系包含种类繁多、数量庞大的指令类型。本文将系统介绍x86指令的分类体系,并深入分析其中最具代表性的核心指令。

Screen Shot 2018-06-02 at 18.51.17

典型的指令系统主要包含以下几类指令:运算类指令,如加减乘除等算术运算,以及与或非等逻辑运算;传送类指令,实现数据在存储器、通用寄存器和I/O接口之间的传输。

Screen Shot 2018-06-02 at 18.51.26

掌握任何指令时,首要关注的是其改变的系统状态。例如加法指令可能改变通用寄存器内容、标志位状态、存储器单元或外设端口内容,甚至指令指针等。学习新指令时,必须明确其具体影响范围及对后续指令的潜在影响。

Screen Shot 2018-06-02 at 18.51.36

x86指令数量庞大,本文将在每个类别中选取代表性指令进行说明。大多数指令同时适用于保护模式和实模式,仅在涉及复杂分段机制时为简化说明采用实模式示例,其核心原理具有通用性。

Screen Shot 2018-06-02 at 18.51.45

传送类指令详解

Screen Shot 2018-06-02 at 18.51.56

MOV指令作为最具代表性的传送指令,其作用是将源操作数传输到目的操作数。通过不同MOV指令示例,可以同时理解操作数的多种寻址方式。

Screen Shot 2018-06-02 at 18.52.05

  • 立即数传输:MOV EBX, 40,源操作数直接编码在指令中
  • 寄存器间传输:MOV AL, BL,源操作数为寄存器内容
  • 存储器到寄存器:MOV ECX, [1000],源操作数来自存储器地址
  • 寄存器到存储器:MOV [DI], AX,目标地址通过寄存器间接指定
  • 立即数到存储器:MOV [1000], 50,目标地址通过计算得出

x86体系结构中,寻址方式极为复杂。虽然助记符均为MOV,但实际对应不同类型的机器指令编码。

Screen Shot 2018-06-02 at 18.52.24

MOV指令的编码形式多样,指令长度从3到6字节不等。CPU通过分析指令第一个字节的特定比特位即可识别指令类型和长度,从而准确定位下一条指令。

Screen Shot 2018-06-02 at 18.52.32

MOV AX, 10EE为例,选择立即数到寄存器的编码格式,前四位固定,第五位w标识数据传输宽度(1表示字传输),最后三个比特指定寄存器编号(000对应AX寄存器)。

栈操作指令

Screen Shot 2018-06-02 at 18.52.42

PUSH和POP指令构成栈操作的核心指令集。

Screen Shot 2018-06-02 at 18.52.51

堆栈是存储器中的特定区域,由SS寄存器指定起始地址,SP寄存器指向当前访问单元。执行PUSH AX(AX=1234H)和PUSH BX(BX=5678H)后,数据依次存入内存,SP寄存器自动调整。

SP寄存器变化特点:

  1. 从高地址向低地址变化(向下生长)
  2. 变化过程由硬件自动完成,无需指令显式指定

执行POP CX时,SP向高地址增长2字节,栈顶数据5678H传输到CX寄存器,完成弹栈操作。

栈结构遵循后进先出原则,类似叠放衣物的箱子。这种结构在函数调用中广泛应用,高级语言编译为机器码时,通过PUSH指令压入参数,函数执行时从栈中取出所需参数。

算术运算指令

Screen Shot 2018-06-02 at 18.53.20

Screen Shot 2018-06-02 at 18.53.29

Screen Shot 2018-06-02 at 18.53.39

算术运算指令涵盖加减乘除基本运算,以及符号扩展和十进制调整等高级功能。

Screen Shot 2018-06-02 at 18.53.48

加法指令支持立即数、寄存器和内存操作数。ADC指令实现带进位加法,除操作数相加外还包含CF标志位参与运算。INC指令实现加1操作,当操作数为寄存器时指令长度仅1字节,是x86体系中最短的指令。

Screen Shot 2018-06-02 at 18.53.57

减法指令与加法指令结构类似,包括普通减法、带借位减法(SBB)和减1指令(DEC)。比较指令(CMP)执行减法运算但不保存结果,仅更新标志寄存器,常与条件转移指令配合使用。

逻辑运算与移位指令

Screen Shot 2018-06-02 at 18.54.15

Screen Shot 2018-06-02 at 18.54.24

这类指令专门处理二进制位操作。

Screen Shot 2018-06-02 at 18.54.34

NOT指令实现单操作数按位取反,如执行NOT AL将AL中每位取反。AND指令对两个操作数按位进行与操作,结果存入目的操作数。

Screen Shot 2018-06-02 at 18.54.41

左移指令(SHL)将操作数左移指定位数,移出位存入CF,右侧补零。二进制数左移1位等效乘以2,左移n位等效乘以2^n。在早期处理器中,移位指令相比乘法指令具有显著性能优势,虽然现代处理器差距已缩小,但移位操作仍是优化性能的重要手段。

右移分为逻辑右移(SHR)和算术右移(SAR)。逻辑右移左侧补零,算术右移用原最高位填充,适用于有符号数除法运算。

转移指令深度分析

Screen Shot 2018-06-02 at 18.54.58

Screen Shot 2018-06-02 at 18.55.06

转移指令改变指令执行顺序,分为条件转移和无条件转移,按目标地址提供方式分为直接转移和间接转移。

Screen Shot 2018-06-02 at 18.55.14

无条件直接转移包含三种编码格式:

  • 短转移:1字节操作码+1字节位移量
  • 近转移:1字节操作码+2字节位移量(实模式下±32KB范围)
  • 远转移:直接提供完整目标地址

Screen Shot 2018-06-02 at 18.55.32

远转移实现段间跳转,如JMP FAR PTR PROG2。执行时CPU将目标地址分别加载到CS和IP寄存器,实现代码段切换。

Screen Shot 2018-06-02 at 18.55.40

间接转移的目标地址存储在寄存器(如JMP AX)或存储器中,通过间接寻址获取下一条指令地址。

Screen Shot 2018-06-02 at 18.55.57

条件转移指令根据状态标志位决定跳转行为,通常跟随影响标志位的算术逻辑运算指令。8086中所有条件转移均为短转移,386开始支持32位位移量。

处理器控制指令

Screen Shot 2018-06-02 at 18.56.48

处理器控制指令用于管理CPU功能和标志位操作。CLC指令清除进位标志CF,NOP指令不执行任何操作但保持机器状态不变,在代码对齐和时序调整中具有特殊用途。

您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-1 14:12 , Processed in 0.102054 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表