Book : 深入分析Linux
通用寄存器(注:其中
RSP
为专用寄存器,之所以把它放在通用寄存器组中只是为了方便记忆整个模型)
- RBX( 基址) :用于保存存储单元的偏移地址,同时也能寻址存储器数据,作为偏移地址访问数据时默认使用数据段基址 DS作为段前缀。
- RCX( 计数) :可保存访问存储单元的偏移地址,或在串指令 (REP/REPE/REPNE)以及移位、循环和 LOOP/LOOPD指令中用作计数器。
- RDX( 数据) :可使用RDX/EDX/DX/DH/DL 寻址,同时作为通用寄存器也用于保存乘法形成的部分结果或者除法之前的部分被除数,也可用于寻址存储单元。
- RBP( 基指针) :可用RBP/EBP/BP 寻址,同时作为偏移地址访问存储单元时默认使用堆栈段基址 SS作为段前缀。
- RDI( 目的变址) :可用RDI/EDI/DI 寻址,常用于在串指令中寻址目的数据串。
- RSI( 源变址) :如RDI 一样,RSI 也可作为通用寄存器使用,通常为串指令寻址源数据串。
-
RSP(堆栈指针 ): RSP寻址称为堆栈的存储区,通过该指针存取堆栈数据。用作 16位寄存器时使用 SP,如果是 32位则为 ESP
段寄存器
- CS( 代码段) :代码段寄存器存放程序所使用的代码在存储器中的基地址。
- DS( 数据段) :存放数据段的基地址。
- ES( 附加段) :该段寄存器通常在串指令 (LODS/STOS/MOVS/INS/OUTS)中使用,主要用于在存储器中将数据进行成块转移。
- SS( 堆栈段) :为堆栈定义一个存储区域。主要用来存放过程调用所需参数、本地局部变量以及处理器状态等。
- FS与GS:这两个段寄存器是 386~Core2中新增的段寄存器,以允许程序访问附加的存储器段。可以将其视为 “通用的段寄存器 ”,通过将段的基地址存入这两个寄存器中可以实现自定义的寻址操作,从而增加了编程的灵活性
状态和控制寄存器是由标志寄存器(
EFLAGS
)、指令指针(
EIP
)和
4
个控制寄存器组成,
- EIP寄存器主要用于存放当前代码段即将被执行的下一条指令的偏移,但其本质上并不能直接被指令直接访问。
- EFLAGS寄存器包含一组状态标志、系统标志以及一个控制标志。 在x86处理器初始化之后,EFLAGS寄存器的状态值为0000 0002H。第1、3、5、15以及22到31位均被保留,这个寄存器中的有些标志通过使用特殊的通用指令可以直接被修改,但并没有指令能够检查或者修改整个寄存器。通过使用LAHF/SAHF/PUSHF/POPF/POPFD等指令,可以将EFLAGS寄存器的标志位成组移到程序栈或EAX寄存器,或者从这些设施中将操作后的结果保存到EFLAGS寄存器中。在EFLAGS寄存器的内容被传送到栈或是EAX寄存器后,可以通过位操作指令(BT, BTS, BTR, BTC)检查或修改这些标志位。当调用中断或异常处理程序时,处理器将在程序栈上自动保存EFLAGS的状态值。 若在中断或异常处理时发生任务切换,那么EFLAGS寄存器的状态将被保存在TSS中 【the state of the EFLAGS register is saved in the TSS for the task being suspended.】 ,注意是将要被挂起的本次任务的状态。
- CR3 页目录起始地址
系统地址寄存器
4 个专用寄存器用于引用在保护模式下所需要的表和段,它们的名称和作用如下。
- 全局描述符表寄存器GDTR(Global Descriptor Table Register ),是48 位寄存器,用来保存全局描述符表(GDT)的32 位基地址和16 位GDT 的界限。
- 中断描述符表寄存器IDTR(Interrupt Descriptor Table Register),是48 位寄存器,用来保存中断描述符表(IDT)的32 位基地址和16 位IDT 的界限。
- 局部描述符表寄存器LDTR(Global Descriptor Table Register ),是16 位寄存器,保存局部描述符表LDT 段的选择符。
- 任务状态寄存器TR(Task State Register)是16 位寄存器,用于保存任务状态段TSS 段的16 位选择符。
用以上4 个寄存器给目前正在执行的任务(或进程)定义任务环境、地址空间和中断向
量空间