IA-32寄存器(通用寄存器、EFLAGS寄存器、指令指针寄存器、段寄存器)

本文详细介绍了IA-32架构中的核心寄存器,包括8个32位通用寄存器(GPR)、32位EFLAGS标志寄存器、32位指令指针寄存器(EIP)以及6个16位段寄存器。通用寄存器用于各种计算任务,EFLAGS寄存器存储运算状态,EIP寄存器指示下一条执行指令的位置,而段寄存器则在保护模式下用于指定逻辑地址的段选择器。通过对这些寄存器的理解,可以更好地掌握IA-32体系结构的工作原理。
摘要由CSDN通过智能技术生成

通用寄存器(General Purpose Registers,32位,8个)
段寄存器(Segment Registers,16位,6个)
程序状态与控制寄存器(Program Status and Control Register,32位,1个)
指令指针寄存器(Instruction Pointer,32位,1个)

一、通用寄存器(GPR)

IA-32体系结构拥有8个32位通用寄存器(General Purpose Register, GPR),其名称与基本功能如下表所示。
在这里插入图片描述
在这8个通用寄存器中,一些通用寄存器可进一步切分为16位或8位寄存器,以保证向后兼容性,具体如下图所示。

例如,寄存器AX引用寄存器EAX的低位字,而AH和AL标识符则分别引用寄存器AX的高字节和低字节。

对于栈指针寄存器和变址寄存器,也可使用对应的16位版本(BP、SP、SI、 DI)来引用32位寄存器的低16位。

通用寄存器切分及命名示意图【注:高(H: High)、低(L: Low)】:
在这里插入图片描述

二、EFLAGS寄存器(标志寄存器)

EFLAGS: Flag Register,标志寄存器

IA-32中标志寄存器的名称为EFLAGS,其大小为4个字节(32位),由原来的16位FLAGS寄存器扩展而来。
EFLAGS寄存器的每位都有意义,每位的值或为1或为0,代表On/Off或True/False。
其中有些位由系统直接设定,有些位则根据程序命令的执行结果设置。

32位的EFLAGS寄存器用于存储算数操作符状态或其他执行状态。该寄存器中的各个位表示不同的标识,包括一组状态标识、一个控制标识和一组系统标识。EFLAGS寄存器中的标识主要用于实现条件分支。
其中,与程序调试相关的状态标识包括:零标识(ZF),溢出标识(OF),进位标识(CF)和符号标识(SF)。各标识的具体含义如下:

(1)零标识(ZF)。若算数或逻辑运算结果为0,则ZF值为1,否则ZF值为0。

(2)溢出标识(OF)。有符号整数溢出时,OF置为1;最高有效位(MSB)改变时,OF置为1。

(3)进位标识(CF)。无符号整数溢出时,CF置为1。

(4)符号标识(SF)。等于运算结果的最高位(即有符号整数的符号位);0表示正数, 1表示负数。

(5)方向标识(DF)。另一个需要注意的标识是控制标识(DF),该标识位为方向标识,用于控制串处理指令处理信息的方向。当DF为1时,每次操作后使变址寄存器ESI和EDI减小,这样就使串处理从高地址向低地址方向处理;当DF为0时,处理方向相反。DF标识由STD指令置位,由CLD指令清除。

(6)陷阱标识(TF)和中断允许标识(IF)。它们是与中断和异常相关的标识位。如果TF标识位置为1,CPU将在执行完每条指令后产生单步中断,调试器使用该特性在调试程序时进行单步执行,该标识位还可用于检查调试器是否正常运行如果IF位置位,则CPU在收到中断请求后,应该对中断请求进行响应处理。

EFLAGS寄存器中的标识位及其功能:
在这里插入图片描述
-r用这个指令,得到的信息右下角: NV UP EI PL NZ NA PO NC
这些符号代表的就是标志寄存器里常用标志位的值。

这个是符号值对应表:

溢出标志OF(Over flow flag) 		OV(1) NV(0)
方向标志DF(Direction flag) 		DN(1) UP(0)
中断标志IF(Interrupt flag) 		EI(1) DI(0)
符号标志SF(Sign flag) 			NG(1) PL(0)
零标志ZF(Zero flag) 			ZR(1) NZ(0)
辅助标志AF(Auxiliary carry flag) AC(1) NA(0)
奇偶标志PF(Parity flag) 		    PE(1) PO(0)
进位标志CF(Carry flag) 			CY(1) NC(0)

EFLAGS寄存器(标志寄存器)的OD演示

三、指令指针寄存器(EIP)

32位指令指针寄存器(EIP)存放指令指针,即当前代码段中将被执行的下一条指令的线性地址偏移。

程序运行时,CPU根据CS段寄存器和EIP寄存器中的地址偏移读取下一条指令,将指令传送到指令缓冲区,并将EIP寄存器的值自增,增大的大小即被读取指令的字节数。

EIP寄存器的值一般不能直接修改,EIP寄存器的更改有两种途径:一是通过特殊的跳转和调用/返回指令JMP、Jcc、CALL、RET等;二是通过中断或异常进行修改。

四、段寄存器(Segment Register)

在IA-32体系结构中,存在6个16位的段寄存器: CS、SS、DS、ES、FS和GS。分别用于存储保护模式下逻辑地址中的段选择器。

(1)代码段寄存器(CS,Code Segment):存放应用程序代码所在的段的段描述符索引(该段描述符中包含代码段的线性基址)。易知,CPU在获取将要执行的下一条指令时,使用CS寄存器找到代码段的线性基址,再与EIP中的线性地址偏移量相加,从而得到下一条指令的线性地址。

(2)栈段寄存器(SS,Stack Segment):存放栈段的段描述符索引(该段描述符中包含栈段的线性基址)。

(3)数据段寄存器(DS(Data Segment)、ES、FS、 GS):存放数据段的段描述符索引(这些描述符中均包含数据段的线性基址)。其中,DS数据段含有程序使用的大部分数据,ES、FS和GS分别对应IA-32中引入的附加数据段。ES数据段可以为某些串指令存放目的数据,FS数据段寄存器可用于计算结构化异常处理(Structured Exception Handler, SEH)、线程环境块(Thread Environment Block, TEB)、进程环境块(Process Environment Block, PEB)等地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通信与商务

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值