X86 寄存器
寄存器是CPU内部用来放置数据和地址的存储单元,各种32位CPU中与微机原理有关的寄存器(编程可见)是一样的。本节仍以80486为例机来讨论,但结论可以不加修改地用于其它32位CPU。
位于CPU内部不同部件的寄存器有不同的作用,每个寄存器都有自己的功能。根据寄存器的性质,把编程可见的寄存器分成9组,并给每个编程可见的寄存器(以后简称寄存器)取一个名称
1 通用寄存器
通用寄存器中,32位寄存器EAX,EBX,ECX,EDX,EBP,ESP,ESI和EDI,它们既可保存逻辑和算术运算中的操作数,也可保存地址运算中的操作数(ESP寄存器不能用作基址寄存器)。这些寄存器的名称源于8086处理机的通用寄存器AX,BX,CX,DX,BP,SP,SI和DI。所以,这些通用寄存器的低16位可按原来的名字访问。16位寄存器AX,BX,CX,DX的每个字节均另有一个名字。字节寄存器命名为AH,BH,CH及DH(高字节)和AL,BL,CL和DL(低字节)。
16位寄存器与8位寄存器分别用于实现对16位CPU与8位CPU的兼容
2 指令指针指示器——EIP
它是32位寄存器,低16位称为IP,用与兼容16位CPU,其内容是下一条要取入CPU的指令在内存中的偏移地址。当一个程序开始运行时,系统把EIP清零,每取入一条指令,EPI自动增加取入CPU的字节数目。所以称EIP为指令指针。
3 标志寄存器——EFLAGS
32位寄存器,低16位称为FLAGS,与16位CPU的标志寄存器同名、同作用。
可分为3类:状态标志、控制标志和系统标志。简述如下:
AF——辅助进位标志。若该位置位时,表示最低有效的4位向高位产生了进位或借位,则该标志位主要用于BCD算术运算。
CF——进位标志。当该位置位,表示8位或16位或32位数的算术操作产生了进位或借位。进行多字节数的加、减时要使用该标志。循环移位指令也影响进位标志。
PF——奇偶标志。主要用于数据通讯应用程序中,当该位置位时,表示结果数据位中有偶数个1,可以检查数据传送中是否出现错误。
SF——符号标志。该位置位时表示结果的最高位(符号位)为1。对于带符号数,该位为1表示负数,该位为0表示正数。
ZF——零标志。当该位置位时,表示操作的结果为0。
DF——方向标志。用于控制数据串操作指令中的地址变化方向。DF为0时,SI/DI或ESI/EDI为自动增量,地址从低向高变化,DF为1,SI/DI或ESI/EDI为自动减量,地址从高向低变化。
IF——中断允许标志。该位置1时允许响应外部可屏蔽中断(INTR),该位复位时禁止响应外部可屏蔽中断。IF不影响非屏蔽外部中断(NMI)或内部产生的中断。
OF——溢出标志。若该位置位表示此次运算发生了溢出,即作为带符号数运算,其结果值超出目的单位所能表示的数值范围。这时目的单位的内容对带符号数没有意义。
TF——陷阱标志。当该位置位时,把处理器置成供调试的单步方式。在这种方式中,每条指令执行后CPU自动产生一个内部中断,使调试者可以观察程序中该条指令执行的情况。
NT——嵌套任务标志。用来表示当前的任务是否嵌套在另一任务内,当该位置1时,表示当前的任务有一个有效的链连接到前一个任务(被嵌套),如果执行IRET指令,则转换到前一个任务。
IOPL——输入/输出特权级标志,用于定义允许执行输入/输出指令的I/O特权级的数值。
RF——恢复标志。它是与调试寄存器的断点一起使用的标志,当该位置1时,即使遇到断点或调试故障,也不产生异常中断1。在成功地执行每条指令时,RF将自动复位。
VM——虚拟8086方式标志。当该位置位时,CPU工作在虚拟8086模式(简称为拟86模式),在这种模式下运行8086的程序就好象是在8086CPU上运行一样。
AC——对准检查标志。这是80486新定义的标志位。该位置位时,如果进行未对准的地址访问,则产生异常中断17。所谓未对准的地址访问,是指访问字数据时为奇地址,访问双字数据时不是4的倍数地址,访问8字节数据时,不是8的倍数的地址。对准检查在特权级为0,1,2时无效,只有在特权级3时有效。
s—状态标志;c—控制标志;x—系统标志
4 段寄存器
段寄存器有两部分,一部分是编程可见的选择器寄存器,为6个16位寄存器,对应在另一部分有6个64位的描述符寄存器,后一部分是编程不可见的。
在实地址方式或虚拟8086方式,描述符寄存器不起作用,选择器寄存器退化成16位CPU的段寄存器功能,存放内存段的段基址——段首地址的高16位,其中CS对应于代码段、SS对应于堆栈段,DS对应于数据段,ES对应于附加数据段,在串操作时,DS和ES分别对应于源数据段和目的数据段。FS和GS没有定义。
在保护方式下,选择器寄存器的低二位是特权标志,D2位是描述符表类型标志,高13位是选择码,指出本段的段描述符在由D2位指出的描述符表中的逻辑排序。当一个段第一次被访问时,首先根据指令给出的选择器值的D2位及高13位,到内存中相应的描述符表内取出相应的描述符(64位),送入对应的描述符寄存器,再从描述符中取出段基址进行逻辑地址到线性地址的变换。以后再访问该段时,直接从描述符寄存器取用段基址及安全检查,免去从内存中选取描述符的过程,实现加速运行。
5 系统地址寄存器
在80486微处理器中设置有4个系统地址寄存器,用来在保护方式下管理4个系统表。由于只能在保护方式下使用,因此又称为保护方式寄存器。
(1) 全局描述符表寄存器GDTR,是一个48位寄存器,用来存放全局描述符表GDT的32位线性基地址和16位的界限值。在全局描述符表中不仅包括有操作系统使用的描述符,而且还有所有任务使用的公用描述符。
(2) 中断描述符表寄存器IDTR,是一个48位寄存器,用来存放中断描述符表IDT的32位线性基地址和16位的界限值。
(3) 局部描述符表寄存器LDTR,是一个16位寄存器,用来存放局部描述符表LDT的16位选择符。另外还有一个隐含的描述符高速缓冲寄存器,用来存放LDT表描述符。
(4) 任务状态寄存器TR,是一个16位寄存器,用来存放任务状态段TSS的16位选择符。与之相应,也有一个隐含的描述符高速缓冲寄存器,用来存放任务状态段TSS的描述符。
段寄存器与系统地址寄存器一起为操作系统完成内存管理,多任务环境、任务保护提供硬件支持。
6 调试寄存器
有8个,各32位,如图2.5所示,表示为DR0~DR7。其中DR0~DR3用作线性断点地址寄存器,可保存4个断点地址。DR6用作断点状态寄存器,用来设置若干个状态标志。其中低4位分别表示4个断点处的调试状态。若进入调试状态,由硬件置1;退出调试状态时应由软件清0。另外还有3位,即BT,BS和BD,其中BT是与任务状态段中调试自陷位T相关的状态标志位,BS是与状态标志寄存器中的自陷标志TF相关的状态标志位,BD是当内部电路仿真使用的下一条指令将对8个调试寄存器中的任一个读/写时置1。DR7是断点控制寄存器,用来设置控制标志,控制断点的设置、设置条件、断点地址的有效范围以及是否进入异常中断等。DR4~DR5为Intel公司保留。
7 测试寄存器
有5个测试寄存器,各32位,如图2.5所示,表示为TR3~TR7。其中TR3~TR5用于片内Cache测试。TR6~TR7用来控制分页部件中的转换旁视缓冲存储器TLB的工作。TR6作为测试命令寄存器,用来存放测试控制命令,TR7作为数据寄存器,用来存放转换旁视缓冲存储器测试的数据。
8 控制寄存器
共有4个,各32位,用来存放全局性与任务无关的机器状态,
1) CR0用来存放系统控制标志或表示处理器的状态,共定义了11位,使用如下:
PE——保护方式允许位。置1,进入 保护方式;清0,进入实地址方式。
MP——监控协处理器位。置1,表示有协处理器。若在80486系统中运行80286或80386程序,该位置1;若运行80486程序,该位清0。
EM——模拟协处理器位。在运行80286或80386程序时,该位置1,若执行数值指令就会产生协处理器不能使用的异常中断;在80486SX系统中该位必须置1。
TS——任务切换位。每次任务转换,该位置1。在解释浮点算术运算指令时,对该位进行测试。清除任务切换标志指令CLTS可将该位清0。
ET——处理器扩展类型标志。该位置1,表示配置80387;否则表示未配置。
NE——数值异常事故位,用来控制浮点运算中未被屏蔽的异常故障。该位置1,允许报告浮点数值错;该位清0,且输入有效,则不予以报告。当NE清0,且输入无效时,数值错将会使处理器停止运行,并等待一次中断。
WP——写保护位,用来净化80486的页写保护机构,即保护用户级的那些页。该位置1,禁止管理级的写操作写入用户级的页上;该位清0,管理级可向用户级的页进行写入。
AM——对准屏蔽位,与状态标志AC配合使用,控制对数据的对准校验。该位置1,且AC也置1时,对用户级(CPL=3)访问的存储器单元进行对准校验,即边界检查,否则不校验。
NW——不透明写位,也称为不是写贯穿,用来控制Cache操作。该位清0,所有命中Cache的写操作将按写贯穿方式写入Cache,同时写入主存;该位置1(且CD=1)只写入Cache存储器,而不写入主存。
CD——允许Cache位,用来控制是否使用片内Cache。该位清0,允许使用内部Cache,这时若不命中,可对片内Cache存储器填充写入;该位置1,又不命中Cache时不能对Cache填充写入。若访问Cache命中,则Cache正常运行。若要彻底禁Cache,可用专门的指令INVD或WBINVD对片内Cache刷新。所谓刷新,是使片内Cache中的所有数据无效(即清0)。
PG——允许分页位。该位置1,使分页部件有效;该位清0,禁止分页部件工作。
(2) CR1未用。
(3) CR2为页故障线性地址寄存器,用来保存最后出现页故障的32位线性地址。只有当CR\-0中的PG位为1时,CR2才有意义。
(4) CR3为页目录基址寄存器,其中高20位存放页目录表的物理基地址。在低12位中有2位作为标志位,其余10位未用。 标志位作用如下:
PCD——禁止页高速缓冲位,该位置1,不对页进行高速缓冲操作。在不分页情况下的总线周期,该信号由PCD引脚输出,控制外部二级Cache的高速缓冲操作。
PWT——写贯穿位。在80486内部Cache中使用的是“写贯穿”方式,而外部二级Cache有的使用“写贯穿”方式,有的既可使用“写贯穿”方式又可使用“写回”方式。PWT=1,使片外二级Cache采用“写贯穿”方式,否则采用“写回”方式。
所谓“写贯穿”是向Cache写入数据的同时,也写入到主存中。“写回”是只有当Cache中的某一存储块被刷新时,才把这一存储块写回到主存中去。
9 浮点寄存器
由于在80486微处理器内部设有浮点运算器,因此在其内部有相应的寄存器,其中包括8个80位通用数据寄存器、1个48位指令指针寄存器、1个48位数据指针寄存器、1个16位控制字寄存器、1个16位状态字寄存器和1个16位标记字寄存器。这些寄存器主要用于浮点运算,其作用将在浮点运算中介绍。
10 CPU复位后各寄存器的值
复位(包括硬复位、软复位、初上电)后CPU各寄存器的值列于表2.1中。表中BIST为复位期间80486微处理机运行内存自检功能。
复位后CR0中的PE位为0(CR0为60000000H)。所以复位后CPU处于实地址工作方式。这时CS=0F000H,EIP=0FFF0H,所以CPU访问的第一个内存单元的物理地址为0FFFFFFF0H。
表1 复位后各寄存器的值 寄存器 初始值(BIST) 初始值(NO BIST)
EAX 0(通过) 不定
ECX 不定 不定
EDX 0400+版本ID 0400+版本ID
EBX 不定 不定
ESP 不定 不定
EBP 不定 不定
ESI 不定 不定
EDI 不定 不定
EFLAGS 0000002H 0000002H
EIP 0FFF0H 0FFF0H
ES 0000H 0000H
CS F000H F000H
SS 0000H 0000H
DS 0000H 0000H
续表 寄存器 初始值(BIST) 初始值(NO BIST)
FS 000H 000H
GS 000H 000H
IDTR 基值=0,界限=3FFH 基值=0,界限=3FFH
CR0 60000000H 60000000H
DR7 00000000H 00000000H
CW 037FH 不变
SW 0000H 不变
TW FFFFH 不变
FIP 00000000H 不变
FEA 00000000H 不变
FCS 0000H 不变
FDS 0000H 不变
FOP 000H 不变
FSTACK 不定 不变