03.IA-32寄存器

1. 什么是CPU寄存器

寄存器(Register)是CPU内部用来存放数据的一些小型存储区域,它与我们常说的RAM(RandomAccessMemory,随机存储器、内存)略有不同。CPU访问(Access)RAM中的数据时要经过较长的物理路径,所以花费的时间要长一些;而寄存器集成在CPU内部,拥有非常高的读写速度。

2. IA-32寄存器

IA-32是英特尔推出的32位元架构,属于复杂的指令集架构,它提供了非常丰富的功能,且支持多种寄存器。

通用寄存器(General PurposeRegisters,32位,8个)
段寄存器(Segment Registers,16位,6个)
程序状态与控制寄存器(ProgramStatus and Control Registers,32位,1个)
指令指针寄存器(InstructionPointer,32位,1个)

2.1. 通用寄存器

Pasted image 20250311164546

为了实现对低16位的兼容,各寄存器又可以分为高(H:High)低(L:Low)
几个独立寄存器。下面以EAX为例讲解。
EAX:(0~31)32位
AX:(0~15)EAX的低16位
AH:(8~15)AX的高8位
AL:(0~7)AX的低8位
若想全部使用4个字节(32位),则使用EAX;若只想使用2个字节(16位),只
要使用EAX的低16位部分AX就可以了。
AX又分为高8位的AH与低8位的AL两个独立寄存器。借助这种方式,可以根据不同情况把一个32位的寄存器分别用作8位、16位、32位寄存器。后面的程序调试中,我们分析汇编代码就能很容易地理解它们。

EAX:(针对操作数和结果数据的)累加器
EBX:(DS段中的数据指针)基址寄存器
ECX:(字符串和循环操作的)计数器
EDX:(IO指针)数据寄存器
EBP:(SS段中栈内数据指针)扩展基址指针寄存器
ESI:(字符串操作源指针)源变址寄存器
EDI:(字符串操作目标指针)目的变址寄存器
ESP:(SS段中栈指针)栈指针寄存器
此外:EAX一般用在函数返回值中。所有的win32API 函数都会先把返回值保存到EAX再返回

2.2. 段寄存器

IA-32的保护模式中,段是一种内存保护技术,它把内存划分为多个区段,并为每个区段赋、范围、访问权限等,以保护内存。
此外,它还同分页技术(Paging)一起用于将虚拟内存变更为实际物理内存。段内存记录在SDT(SegmentDescriptorTable,段描述符表)中,而段寄存器就持有这些SDT的索引(index)。

CS:Code Segment,代码段寄存器
SS:Stack Segment,栈段寄存器
DS:Data Segment,数据段寄存器
ES:Extra(Data)Segment,附加(数据)段寄存器
FS:DataSegment,数据段寄存器
GS:DataSegment,数据段寄存器

2.3. 程序状态与控制寄存器

EFLAGS:FlagRegister,标志寄存器
大小为4字节(32位)由原来的16位FLAGS寄存器拓展而来
学习代码逆向分析技术的初级阶段,只要掌握3个与程序调试相关的标志即可,
分别为ZF(ZeroFlag,零标志)OF(OverflowFlag,溢出标志)CF(CarryFlag,进位标志)

2.4. 指令指针寄存器

●EIP:InstructionPointer,指令指针寄存器
指令指针寄存器保存着CPU要执行的指令地址,其大小为32位(4个字节),由原16位IP寄存器扩展而来。程序运行时,CPU会读取EIP中一条指令的地址,传送指令到指令缓冲区后,EIP寄存器的值自动增加,增加的大小即是读取指令的字节大小。
这样,CPU每次执行完一条指令,就会通过EIP寄存器读取并执行下一条指令。
与通用寄存器不同,我们不能直接修改EIP的值,只能通过其他指令间接修改,这些特定指令包括JMP、Jcc、CALL、RET。此外,我们还可以通过中断或异常来修改EIP的值。