IA-32寄存器(通用寄存器、EFLAGS寄存器、指令指针寄存器、段寄存器)
通用寄存器(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)
三、指令指针寄存器(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)等地址。