IA-32寄存器

什么是寄存器

  • 寄存器是CPU内部用来存放数据的一些小型存储区域,与RAM不同,寄存器集成在CPU内部,拥有非常高的读写速度。

基本程序运行寄存器

通用寄存器

  1. 就是一种通用型寄存器,用于传送和暂存数据,也可以参与算术逻辑运算,并保存运算结果,I-32中每个通用寄存器的大小都是32位,即4个字节,主要用来保存常量与地址,由特定汇编指令来操作特定寄存器。
  2. 为了实现对低16位的兼容,个寄存器又可以分为高、低几个独立的寄存器,以EAX为例讲解:
  • EAX:(0~31)32位。
  • AX: (0~15)EAX的低16位。
  • AH:(8~15)AX的高16位。
  • AL:(0~7)AX的低16位。
  1. 各寄存器的名称如下:
  • EAX:累加器。
  • EBX:基址寄存器。
  • ECX:计数器。
  • EDX:数据寄存器。
  • 以上4个寄存器主要用于算数运算(ADD、SUB、XOR、OR等)指令中,常常用来保存常量与变量的值。
  • ECX与EAX也可以用于特殊用途,循环命令(LOOP)中,ECX用来循环技术,每执行一次循环,ECX都会减1。EAX一般用在函数返回值中,所有Win32 API函数都会先把函数返回值保存到EAX再返回。
  1. 通用寄存器中其他几个寄存器名称如下:
  • EBP:拓展基址指针寄存器。
  • ESI:源变址寄存器。
  • EDI:目的变址寄存器。
  • ESP:栈指针寄存器。
  • ESP指示栈区域的栈顶地址,某些指令(PUSH、POP、CALL、RET)可以直接用来操作ESP。
  • EBP表示栈区域的基地址,函数被调用时保存ESP的值,函数返回时再把值返回ESP,保证栈不会崩溃,ESI和EDI与特定指令一起使用,主要用于内存复制。

段寄存器

  1. IA-32的保护模式中,段是一种内存保护技术,它把内存划分成多个区段,并为每个区段赋予起始地址、范围、访问权限等,以保护内存。
  2. 段寄存器总共由6个寄存器组成,分别为CS、SS、DS、ES、FS、GS,每个寄存器的大小为16为,即2个字节,另外,每个段寄存器指向的段描述符与虚拟内存结合,形成一个线性地址,借助分页技术,线性地址最终被转换为实际的物理地址。
  3. 段寄存器的名称如下:
  • CS:代码段寄存器。
  • SS:栈段寄存器。
  • DS:数据段寄存器。
  • ES:附加(数据)段寄存器。
  • FS:数据段寄存器。
  • GS:数据段寄存器。
  1. CS寄存器用于存放应用程序代码所在段的段基址,SS寄存器用于存放栈段的段基址,DS急促请你用于存放数据段的段基址。ES、FS、GS寄存器用来存放程序使用的附加数据段的段基址。
  2. 程序调试中会将从用到FS寄存器,它用于计算SEH(结构化异常处理机制)、TEB(线程环境块)、PEB(进程环境块)等地址。

程序状态与控制寄存器

  1. IA-32中标志寄存器的名称为EFLAGS,其大小为4字节(32位),由原来的16位FLAGS寄存器拓展而来的。
  2. EFLAGS寄存器的每位都有意义,每位的值或位1或为0,代表On/Off或True/False,其中有些位由系统直接设定,有些位则根据程序命令的执行结果设置。
    IA-32寄存器
  3. 初期只需要转我3个与程序调试相关的标志,分别:
  • ZF(Zero Flag,零标志):运算结果为0,则其值为1.
  • OF(Overflow Flag,溢出标志):判断结果是否溢出,有符号运算,溢出为1.
  • CF(CarryFlag,进位标志):高位进位-借位,其值为1,无符号运算。

指令指针寄存器

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