Intel处理器基本寄存器
基本程序执行寄存器
IA-32架构提供16个基本程序执行寄存器,用于一般系统和应用程序编程:
这些寄存器可分为如下四类:
- 通用寄存器:IA-32架构包含8个通用寄存器,用于算术运算和数据的传送;
- 段寄存器:IA-32架构包含6个段寄存器。实地址模式下,段寄存器用于存放段的基地址;保护模式下,段寄存器用于段描述表的索引指针(段选择子);
- 指令指针寄存器:EIP寄存器用于存放下一条要执行的指令的地址;
- 程序状态和控制寄存器:EFLAGS寄存器用于指示当前正执行程序的状态,并允许应用程序对处理器进行有限的控制。
通用寄存器
通用寄存器主要存储指令运算过程中的各类数据,包括:
- 用于逻辑和算术运算的操作数;
- 用于地址计算的操作数;
- 内存指针。
IA-32架构下共包含了8个通用寄存器,依次命名为EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。尽管这些寄存器都可用于通用数据的存储,但是部分寄存器仍有约定速成的特殊用法:
- ESP:存储堆栈指针,作为一般规则,不应将其用于其它目的;
- EBP:在函数调用过程中,用作帧指针寄存器。
64位模式下的通用寄存器
64位模式下将32位架构使用通用寄存器全部扩展到了64位,同时增加了额外的8个通用寄存器,所有通用寄存器在64位模式下的命名依次为RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP以及R8-R15。
段寄存器
IA-32架构支持的段寄存器包括CS、SS、DS、ES、FS、GS。段寄存器用于存放16位长度的段选择子,以确定特定的段在内存中的地址。典型的段包括代码段、数据段和堆栈段,分别使用不同的段寄存器:
- 代码段:CS寄存器用于存放代码段的段选择子,处理器在运行时,会使用由CS寄存器中的段选择子和EIP寄存器的内容组成的逻辑地址来确定下一条执行指令的内存地址。
需要注意的是,应用程序不允许显式地加载CS寄存器,只能通过特定的指令或内部处理器操作隐式加载,如过程调用、任务切换或中断处理。
- 堆栈段:SS寄存器用于存放堆栈段的段选择子,与ESP寄存器配合确定当前执行过程、任务或者处理程序的堆栈地址。Intel体系下,所有堆栈操作都适用SS寄存器查找堆栈。
- 数据段:DS、ES、FS以及GS寄存器分别指向4个数据段。
指令指针寄存器
指令指针(EIP)寄存器包含下一条要执行的指令的32位偏移,会根据处理器指令的执行动态变化。EIP寄存器不能由软件直接访问;它由控制传输指令(例如JMP,Jcc,CALL和RET),中断和异常隐式控制。读取EIP寄存器的唯一方法是执行CALL指令,然后从过程堆栈中读取返回指令指针的值。可以通过修改过程堆栈上的返回指令指针的值并执行返回指令(RET或IRET)来间接修改EIP寄存器。
64位模式下的指令指针寄存器
在64位模式下,RIP寄存器成为指令指针寄存器,用于保存下一条要执行的指令的64位偏移量。此外,64位模式下,支持RIP相对寻址,即通过向RIP寄存器存储的指令偏移添加偏移来进行寻址操作。
标志寄存器
标志寄存器EFLAGS(64位系统下则为RFLAGS寄存器)中的系统标志和IOPL字段用于控制I/O访问、可屏蔽硬件中断、调试、任务切换以及虚拟-8086模式,只有特权级代码才能被允许去修改这些标志。
系统寄存器
Intel处理器提供了若干个系统寄存器,并仅允许运行于最高特权级的程序访问,按照功能可分为内存管理寄存器、系控控制寄存器以及调试寄存器等。
内存管理寄存器
Intel处理器提供了4个内存管理寄存器,用于指定控制分段内存管理的数据结构的位置。
- 全局描述符表寄存器(GDTR):GDTR寄存器用于保存全局描述符表的线性基地址以及表长度。
- 局部描述符表寄存器(LDTR):LDTR寄存器用于保存局部描述符表的线性基地址、表长度以及描述符属性。
- 中断描述符表寄存器(IDTR):IDTR寄存器用于保存中断描述符表的线性基地址以及表长度。
- 任务寄存器(TR):TR寄存器保存当前执行任务的任务状态段(TSS)的线性基地址、表限长和描述符属性。
系统控制寄存器
控制寄存器用于控制和确定处理器的操作模式和当前执行任务的特性。在所有32位操作模式和Compatibilty模式下,这些寄存器均为32位。在64位模式下,控制寄存器则被扩展至64位。
- CR0:CR0寄存器包含控制处理器的操作模式和状态的系统控制标志。
- CR1:CR1寄存器保留未用。
- CR2:CR2寄存器用于保存导致页面错误的线性地址。在上报Page Fault异常时,处理器会把引起异常的线性地址存放在CR2中,操作系统异常处理程序可通过获取CR2寄存器的内容确认引起异常的内存页面。
- CR3:CR3寄存器存放页目录表的物理地址。
相关参考
- 《Intel处理器手册》
- 《Intel汇编语言程序设计》
- 《x86_64体系探索及编程》
- 《Linux内核完全注释》