x86寄存器

寄存器是CPU内部用来放置数据和地址的存储单元,各种32位CPU中与微机原理有关的寄存器(编程可见)是一样的。本节仍以80486为例机来讨论,但结论可以不加修改地用于其它32位CPU。
位于CPU内部不同部件的寄存器有不同的作用,每个寄存器都有自己的功能。根据寄存器的性质,把编程可见的寄存器分成9组,并给每个编程可见的寄存器(以后简称寄存器)取一个名称
2.2.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.2.2 指令指针指示器——EIP


它是32位寄存器,低16位称为IP,用与兼容16位CPU,其内容是下一条要取入CPU的指令在内存中的偏移地址。当一个程序开始运行时,系统把EIP清零,每取入一条指令,EPI自动增加取入CPU的字节数目。所以称EIP为指令指针。


2.2.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—系统标志


2.2.4 段寄存器


段寄存器有两部分,一部分是编程可见的选择器寄存器,为6个16位寄存器,对应在另一部分有6个64位的描述符寄存器,后一部分是编程不可见的。
在实地址方式或虚拟8086方式,描述符寄存器不起作用,选择器寄存器退化成16位CPU的段寄存器功能,存放内存段的段基址——段首地址的高16位,其中CS对应于代码段、SS对应于堆栈段,DS对应于数据段,ES对应于附加数据段,在串操作时,DS和ES分别对应于源数据段和目的数据段。FS和GS没有定义。
在保护方式下,选择器寄存器的低二位是特权标志,D2位是描述符表类型标志,高13位是选择码,指出本段的段描述符在由D2位指出的描述符表中的逻辑排序。当一个段第一次被访问时,首先根据指令给出的选择器值的D2位及高13位,到内存中相应的描述符表内取出相应的描述符(64位),送入对应的描述符寄存器,再从描述符中取出段基址进行逻辑地址到线性地址的变换。以后再访问该段时,直接从描述符寄存器取用段基址及安全检查,免去从内存中选取描述符的过程,实现加速运行。


2.2.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的描述符。
段寄存器与系统地址寄存器一起为操作系统完成内存管理,多任务环境、任务保护提供硬件支持。


2.2.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公司保留。


2.2.7 测试寄存器


有5个测试寄存器,各32位,如图2.5所示,表示为TR3~TR7。其中TR3~TR5用于片内Cache测试。TR6~TR7用来控制分页部件中的转换旁视缓冲存储器TLB的工作。TR6作为测试命令寄存器,用来存放测试控制命令,TR7作为数据寄存器,用来存放转换旁视缓冲存储器测试的数据。


2.2.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中的某一存储块被刷新时,才把这一存储块写回到主存中去。


2.2.9 浮点寄存器


由于在80486微处理器内部设有浮点运算器,因此在其内部有相应的寄存器,其中包括8个80位通用数据寄存器、1个48位指令指针寄存器、1个48位数据指针寄存器、1个16位控制字寄存器、1个16位状态字寄存器和1个16位标记字寄存器。这些寄存器主要用于浮点运算,其作用将在浮点运算中介绍。


2.2.10 CPU复位后各寄存器的值


复位(包括硬复位、软复位、初上电)后CPU各寄存器的值列于表2.1中。表中BIST为复位期间80486微处理机运行内存自检功能。
复位后CR0中的PE位为0(CR0为60000000H)。所以复位后CPU处于实地址工作方式。这时CS=0F000H,EIP=0FFF0H,所以CPU访问的第一个内存单元的物理地址为0FFFFFFF0H。

表2.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 不定 不变





2.3指令流水线操作


为提高运行速度和性能指标,CPU采用流水线技术。分为地址流水线和指令流水线。地址流水线将在第五章讨论,这里讨论指令流水线。
在80486微处理器中设有8KB内部Cache存储器、32字节预取指令队列、指令译码器、控制器及控制寄存器、执行部件,这就从硬件上支持了指令流水线操作。80486使用5个步骤的流水线技术,即指令预取PF、译码D1、译码D2、执行EX和结果写回WB,

一、指令预取PF
预取指令部件一次可从内部Cache取16字节的指令代码,送预取指令队列等候执行。在16个字节中平均有5条指令,这样就满足了译码部件的需要。一般来说,预取指令部件的操作与流水线其他步骤是相互独立的。在实际使用中,32字节的队列分成大小相等均为16字节的两个队列使用。只要有一个队列为空,预取部件就从Cache中取16字节的代码填入队列,这就保证了取指令与执行指令的并行操作。
二、D1
译码操作分为D1和D2两个阶段。亦称二级译码。其中D1是第一阶段,从指令代码中分解出操作码进行译码,找出第一条微指令代码的入口地址送控制ROM。如果指令中带有操作数,同时检索出有关计算地址的代码,送分段部件。
对于多字节指令,一次最多可以处理3个字节。根据80486的体系结构,任何一条指令的长度都可以通过前3个字节(包括指令前缀)确定。在对前3个字节译码时,D1译码器将后续字节引导到D2译码器,同时预取部件启动下一条指令进行译码。
对于带前缀的指令,需要增加一个时钟周期对前缀译码,这样D1阶段占两个时钟周期,可表示为D11和D12。对于一些双字节操作码的指令,有一个字节是0FH,如同前缀一样D1也需两个时钟周期。而绝大多数指令,D1阶段只需一个时钟周期。
三、D2
D2是译码的第二阶段。在这一阶段,由微代码控制器根据D1译码结果产生执行该指令的控制信号,并进行寻址方式的计算,即计算出存储器地址。在一个时钟周期内可对1~4字节的存储器位移量字段进行译码,或者对1~4字节的立即常数地址进行译码。若一条指令中既有存储器位移量字段,又有立即常数字段,D2阶段就需两个时钟周期。在其中的第1个时钟周期内,若有位移量,则对其译码;若有基地址,则加至基地址寄存器。对于变址,则需在第2个时钟周期进行变址计算。对于绝大多数指令,D2阶段只需一个时钟周期。
四、EX
流水线的第4个步骤是执行,即包括各种算术逻辑运算,还包括对Cache的访问和对寄存器的修改等。执行过程由微代码序列控制,所需时钟数随指令的不同而异,甚至可以用几十个时钟周期执行一条复杂的宏指令,或者处理一个复杂的数据结构。
在一条指令的执行过程中,主要执行步骤由微代码ROM中的微程序控制,而其他步骤由硬件逻辑电路控制。对于寄存器操作指令,在一个EX时钟内完成,并将结果送入目的寄存器。对于那些访问存储器的指令(包括转移指令),首先访问Cache,若命中,仅需一个时钟周期;若不命中,则访问主存,并对Cache填充写入,故须增加时钟周期。
五、WB
最后一个步骤是把结果写回到目的寄存器或目的存储器单元。如果是写回目的存储器单元,首先将结果送入片内Cache,同时还要送总线接口部件的写缓冲存储器。若Cache命中,立即写入;若不能命中,则写入主存。如果总线被占用,则延时等候,直到总线可以使用时写入为止。
对于绝大多数指令,上述5个步骤各需一个时钟周期。对于少数不能在一个时钟周期完成的步骤,则增加时钟周期。
由于多条指令并行执行,所以对80486来说,一条指令的平均执行时间为17~18个时钟周期。
Pentium CPU内部设有两条流水线,即U流水线和V流水线。每个流水过程由5个步骤组成,即预取指令、指令译码、地址生成、执行和写回。这两条流水线并行独立工作,其中U流水线负责所有整数和浮点指令的执行,而V流水线负责简单整数和FXCH(寄存器内容交换)类浮点指令的执行,这样就使CPU可同时执行两条指令。在执行过程中,一面对流水线中的一条指令译码,另一面由一个能预知下一条指令走向的分支目标缓冲器检查下一条指令能否并行执行。如果可以,两条指令同时进入流水线。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值