1. 什么是CPU寄存器
寄存器(Register)是CPU内部用来存放数据的一些小型存储区域,因为其集成在CPU内部,拥有非常高的读写速度.
2. IA-32 寄存器
IA-32 是英特尔推出的32位元架构,属于复制的指令集构架.
2.1 基本程序运行寄存器
基本程序运行寄存器的组织结构,它由4类寄存器组成.
- 通用寄存器 ( General Purpose Resgisters, 32位,8个 )
- 段寄存器 ( Segment Registers, 16位,6个 )
- 程序状态与控制寄存器 ( Program Status and Control Registers , 32位, 1个 )
- 指令指针寄存器 ( Instruction Pointer , 32位, 1个 )
2.1.1 通用寄存器
通用寄存器是一种通用型的寄存器,用于传送和暂存数据,也可以参与算术逻辑运算,并保持运算结果.IA-32中每个通用寄存器大小都是32位(4个字节),主要用来保存常量与地址等.
各寄存器的名称如下:
- EAX : ( 针对操作数和结构数据的 ) 累加器
- EBX : ( DS段中的数据指针 ) 基址寄存器
- ECX : ( 字符串和循环操作的 ) 计算器
- EDX : ( I/O指针 ) 数据寄存器
以上4个寄存器主要用在算术运算( ADD,SUB,XOR,OR)等,常常用来保存变量与变量的值.某些汇编 指令( MUL,DIV,LODS等) 直接用来操作特定寄存器,执行这些命令后,仅改变特定寄存器中的值.
此外,ECX和EAX也可用特殊用途,循环命令( LOOP )中,ECX用来循环计数 ( loop count ),每执行一次循环,ECX都会减1.EAX一般用在函数返回值中,所有Win 32 API函数都会先把返回值保存在EAX再返回.
- EBP : ( SS段中栈内数据指针 )扩展基址指针寄存器
- ESI : (字符串操作源指针) 源变址寄存器
- EDI : (字符串操作目标指针) 目的变址寄存器
- ESP : (SS段中栈指针) 栈指针寄存器
以上4个寄存器主要用来作保存内存地址的指针.
ESP指示栈区域的栈顶地址,某些指令(PUSH,POP,CALL,RET)可以直接用来操作ESP.
EBP表示栈区域的基地址,函数被调用时保存ESP的值,函数返回时再把值返回ESP,保证栈不会崩溃.ESI和EDI与特定指令(LODS,STOS,REP,MOVS等)一起使用,主要用来内存复制.
2.1.2 段寄存器
段(Segment),IA-32的保护模式中,段是一种内存保护技术,它把内存划分为多个区段,并为每个区段赋予起始地址,范围,访问权限等,以保护内存.此外,它还同分页技术(Paging)一起用于将虚拟内存变更为实际物理内存.段内存记录在SDT(Segment Descriptor Table,段描述符表)中,而段寄存器就持有这些SDT的索引(index).
它描述了保护模式下的内存分段模型.段寄存器总共由6中寄存器组成,分别为CS,SS,DS,ES,FS,GS,每个寄存器的大小为16位,即2个字节.另外,每个段寄存器指向的段描述符(Segment Descriptor)与虚拟内存结合,形成一个线性地址(Linear Address),借助分页技术,线性地址最终被转换为实际的物理地址(Physical Address).
各段寄存器的名称如下:
- CS : Code Segment, 代码段寄存器
- SS : Stack Segment, 栈段寄存器
- DS : Data Segment, 数据段寄存器
- ES : Extra ( Data ) Segment,附加(数据)段寄存器
- FS : Data Segment, 数据段寄存器
- GS : Data Segment, 数据段寄存器
CS寄存器用于存放应用程序代码所在段的段基址, SS寄存器用于存放栈段的段基址,DS寄存器用于存放数据段的段基址.ES,FS,GS寄存器用来存放程序使用的附加数据段的段基址.
2.1.3 EFLAGS:Flag Register,标志寄存器
3个与程序调试相关的标志,分别为ZF (Zero Flag,零标志),OF(Overflow Flag,溢出标志),CF(Carry Flag,进位标志).
- ZF
若运算结果为0,则其值为1(true),否则其值为0(False). - OF
有符号整数(signed integer)溢出时,OF值被置为1.此外,MSB( Most Sginificant Bit,最高有效位)改变时,其值也被设为1. - CF
无符号整数(unsigned integer )溢出时,其值也被置为1.
2.1.4 指令指针寄存器
- EIP : Instruction Pointer,指令指针寄存器
指令指针寄存器保存着CPU要执行的指令地址,其大小为32位(4个字节).当程序运行时,CPU会读取EIP中的一条指令的地址,传送指令到指令缓冲区,EIP寄存器的值会自动增加,增加的大小即是读取指令的字节大小.