第4章 IA-32寄存器基本讲解

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,进位标志).
EFLAGS寄存器

  • 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寄存器的值会自动增加,增加的大小即是读取指令的字节大小.