http://oss.org.cn/kernel-book/ch02/2.3.1.htm
1. i386寄存器
80386作为80X86系列中的一员,必须保证向后兼容,也就是说,既要支持16位的处理器,也要支持32位的处理器。在8086中,所有的寄存器都是16位的, 下面我们来看一下80386中寄存器有何变化:
-
把16位的通用寄存器、标志寄存器以及指令指针寄存器扩充为32位的寄存器段寄存器仍然为16位
-
增加4个32位的控制寄存器
-
增加4个系统地址寄存器
-
增加8个调式寄存器
-
增加2个测试寄存器
2. 通用寄存器
8个通用寄存器是8086寄存器的超集,它们的名称和用途分别为:
-
EAX 一般用作累加器
-
EBX 一般用作基址寄存器(Base)
-
ECX 一般用来计数(Count)
-
EDX 一般用来存放数据(Data)
-
ESP 一般用作堆栈指针(Stack Pointer)
-
EBP 一般用作基址指针(Base Pointer)
-
ESI 一般用作源变址(Source Index)
-
EDI 一般用作目标变址(Destinatin Index)
8个通用寄存器中通常保存32位数据,但为了进行16位的操作并与16为机保持兼容,它们的低位部分被当成8个16位的寄存器,即AX、BX…DI。 为了支持8位的操作,还进一步把EAX、EBX、ECX、EDX这四个寄存器低位部分的16位,再分为8位一组的高位字节和低位字节两部分,作为 8个8位寄存器。这8个寄存器分别被命名为AH、BH、CH、DH和AL、BL、CL、DL。对8位或16位寄存器的操作只影响相应的寄存器。例如, 在做8位加法运算时,位7的进位并不传给目的寄存器的位9,而是把标志寄存器中的进位标志(CF)置位。因此,这8个通用寄存器既可以 支持1位、8位、16位和32位数据运算,也支持16位和32位存储器寻址。
3. 段寄存器
8086中有4个16位的段寄存器:CS、DS、SS、ES,分别用于存放可执行代码的代码段、数据段、堆栈段和其他段的基地址。在80386中, 有6个16位的段寄存器,但是,这些段寄存器中存放的不再是某个段的基地址,而是某个段的选择符(Selector)。因为16位的寄存器 无法存放32位的段基地址,段基地址只好存放在一个叫做描述符表(Descriptor)的表中。因此,在80386中,我们把段寄存器叫做选择符。 下面给出6个段寄存器的名称和用途:
-
CS 代码段寄存器
-
DS 数据段寄存器
-
SS 堆栈段寄存器
-
ES、FS及GS 附加数据段寄存器
4. 状态和控制寄存器
由标志寄存器EFLAGS、指令指针EIP和4个控制寄存器组成。指令指针寄存器EIP中存放下一条将要执行指令的偏移量(offset ),这个偏移量是相对于 目前正在运行的代码段寄存器CS而言的。 偏移量加上当前代码段的基地址,就形成了下一条指令的地址。EIP中的低16位可以分开来进行访问,给它起名叫指令指针IP寄存器,用于16位寻址。 标志寄存器EFLAGS存放有关处理器的控制标志,四个32位的控制寄存器,它们是CR0,CR1,CR2和CR3: CR0中包含了6个预定义标志,0位是保护允许位 PE(Protedted Enable),用于启动保护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。1位是监控协处理位MP(Moniter coprocessor),它与第3位一起决定:当TS=1时操作码WAIT是否产生一个“协处理器不能使用”的出错信号。第3位是任务转换位(Task Switch), 当一个任务转换完成之后,自动将它置1。随着TS=1,就不能使用协处理器。CR0的第2位是模拟协处理器位 EM (Emulate coprocessor), 如果EM=1,则不能使用协处理器,如果EM=0,则允许使用协处理器。第4位是微处理器的扩展类型位ET(Processor Extension Type), 其内保存着处理器扩展类型的信息,如果ET=0,则标识系统使用的是287协处理器,如果 ET=1,则表示系统使用的是387浮点协处理器。
- CR0的第31位是分页允许位(Paging Enable),它表示芯片上的分页部件是否允许工作
- CR2是页故障线性地址寄存器,保存最后一次出现页故障的全32位线性地址。
- CR3是页目录基址寄存器,保存页目录表的物理地址,页目录表总是放在以4K字节为单位的存储器边界上, 因此,它的地址的低12位总为0,不起作用,即使写上内容,也不会被理会。这几个寄存器是与分页机制密切相关的,因此,在进程管理及 虚拟内存管理中会涉及到这几个寄存器,读者要记住CR0、CR2及CR3这三个寄存器的内容。