CPU 寄存器

  寄存器是中央处理器内的组成部分,是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。html

  寄存器是集成电路中很是重要的一种存储单元,一般由D触发器组成。在集成电路设计中,寄存器可分为电路内部使用的寄存器和充当内外部接口的寄存器这两类。内部寄存器不能被外部电路或软件访问,只是为内部电路的实现存储功能或知足电路的时序要求。而接口寄存器能够同时被内部电路和外部电路或软件访问,CPU中的寄存器就是其中一种,做为软硬件的接口,为普遍的通用编程用户所熟知。编程

  寄存器拥有很是高的读写速度,因此在寄存器之间的数据传送很是快。寄存器是内存阶层中的最顶端,也是系统得到操做资料的最快速途径。寄存器一般都是以他们能够保存的位元数量来估量,举例来讲,一个“8位元寄存器”或“32位元寄存器”。缓存

16位寄存器

以8086(16位处理器,14个寄存器)为例。按其用途可分为:数据结构

  • 通用寄存器(8个):oop

    • 数据寄存器性能

      AH&AL=AX(accumulator):累加寄存器,经常使用于运算;在乘除等指令中指定用来存放操做数,另外,全部的I/O指令都使用这一寄存器与外界设备传送数据。测试

      BH&BL=BX(base):基址寄存器,经常使用于地址索引。ui

      CH&CL=CX(count):计数寄存器,经常使用于计数,经常使用于保存计算值。如在移位指令,循环(loop)和串处理指令中用做隐含的计数器。this

      DH&DL=DX(data):数据寄存器,经常使用于数据传递。spa

      这4个16位的寄存器能够分为高8位:AH,BH,CH,DH。以及低八位:AL,BL,CL,DL。这2组8位寄存器能够分别寻址,并单独使用。

    • 指针寄存器和变址寄存器:

      SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用做SS的一个相对基址位置。SI(Source Index):源变址寄存器,可用来存放相对于DS段之源变址指针。DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。

      这4个16位寄存器只能按16位进行存取操做,主要用来造成操做数的地址,用于堆栈操做和变址运算中计算操做数的有效地址。

  • 指令指针(1个):

    指令指针IP是一个16位专用寄存器,它指向当前须要取出的指令字节,当BIU从内存中取出一个指令字节后,IP就自动加(取出该字节的长度,如:BIU从内存中取出的是1个字节,IP就会自动加1,若是BIU从内存中取出的字节数长度为3,IP就自动加3),指向下一个指令字节。注意,IP指向的是指令地址的段内地址偏移量,又称偏移地址(Offset Address)或有效地址(EA,Effective Address)。

    BIU是80x86微处理系统芯片中的两个基本功能部件之一,中文为总线接口部件(Bus Interface Unit)。BIU是和总线打交道的接口部件,它根据执行单元(Execution Unit)的请求,执行8086 CPU 对存储器或 I/O 接口的总线操做,完成数据传送,BIU由指令队列缓冲器,16位指令指针寄存器CS、DS、SS和ES,地址产生器和段寄存器,总线控制逻辑等部分构成。

  • 标志寄存器(1个):

    标志寄存器(Flags Register,FR)又称程序状态字(Program Status Word,PSW)。这是一个存放条件标志、控制标志寄存器,主要用于反映处理器的状态和运算结果的某些特征及控制指令的执行。

    在FR中有意义的有9位,其中6位是状态位,3位是控制位。

标志 描述
CF(carry flag) 进位标志,主要用来反映无符号数运算是否产生进位或借位。若是运算结果的最高位产生了一个进位或借位,那么,其值为1,不然其值为0。
PF(parity flag) 奇偶标志,用于反映运算结果中“1”的个数的奇偶性。若是“1”的个数为偶数,则PF的值为1,不然其值为0。
AF(adjust flag) 辅助进位标志,存在下列状况值被置为1,不然其值为0:在字操做时,发生低字节向高字节进位或借位时;在字节操做时,发生低4位向高4位进位或借位时。
ZF(zero flag) 零标志,用来反映运算结果是否为0。若是运算结果为0,则其值为1,不然其值为0。在判断运算结果是否为0时,可以使用此标志位。
SF(sign flag) 符号标志,用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,因此,SF也就反映运算结果的正负号。运算结果为非负数时,SF的值为0,不然其值为1。当运算结果没有产生溢出时,运算结果等于逻辑结果(即应该获得的正确的结果),此时SF表示的是逻辑结果的正负,当运算结果产生溢出时,运算结果不等于逻辑结果,此时的SF值所表示的正负状况与逻辑结果相反,即:SF=0时,逻辑结果为负,SF=1时,逻辑结果为非负。
TF(trap flag) 跟踪标志,可用于程序调试。TF标志没有专门的指令来设置或清除。若是TF=1,则CPU处于单步执行指令的工做方式,此时每执行完一条指令,就显示CPU内各个寄存器的当前值及CPU将要执行的下一条指令。若是TF=0,则处于连续工做模式。
IF(interrupt enable flag) 中断容许标志,用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但无论该标志为什么值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定以下:当IF=1时,CPU能够响应CPU外部的可屏蔽中断发出的中断请求;当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
DF(direction flag) 方向标志,用来决定在串操做指令执行时有关指针寄存器发生调整的方向。
OF(overflow flag) 溢出标志,用于反映有符号数加减运算所得结果是否溢出。若是运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,不然,OF的值被清为0。
  • 段寄存器(4个):

    • CS(Code Segment):代码段寄存器

    • DS(Data Segment):数据段寄存器 

    • SS(Stack Segment):堆栈段寄存器
    • ES(Extra Segment):附加段寄存器

当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,经过设定段寄存器CS,DS,SS来指向这些起始位置。一般是将DS固定,而根据须要修改CS。因此,程序能够在可寻 址空间小于64K的状况下被写成任意大小。因此,程序和其数据组合起来的大小,限制在DS所指的64K内,这就是COM文件不得大于64K的缘由。8086之内存做为战场,用寄存器作为军事基地,以加速工做。

备注:因为所讲的是16位cpu,IP寄存器的位数为16,即:偏移地址为16位,2的16次幂就是64K,因此16位段地址不能超过64K,超过64K会形成64K以上的地址找不到。

32位寄存器

32位CPU 寄存器及数据结构图:

  • 通用寄存器(8个):EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI

    • 尽管这8个通用寄存器大多时候是通用的,能够用做任何用途,可是在某些状况下,他们也有隐含的用法。好比ECX、ESI和EDI在串循环操做中分别用做计数器、源和目标。EBP和ESP主要用来维护栈,ESP一般指向栈的顶部,EBP指向当前栈帧的起始地址。

    • EAX, EBX, ECX, EDX均可以做为32位寄存器、16位寄存器或者8位寄存器使用。用法相似16位数据寄存器。

    • EBP和ESP是32位寄存器,也可做为16位寄存器BP, SP使用,经常使用于椎栈操做。

    • EDI和ESI经常使用于串操做,EDI用于寻址目标数据串,ESI用于寻址源数据串。

  • 标志寄存器(1个):EFLAGS

    控制任务状态和模式切换、中断处理、指令追踪和访问权限控制.寄存器中的标志位须要特权指令代码才能够修改(特权指令:运行在内核态下的代码)

    在16位标志寄存器的基础上增长了几个标志:

 

标志 描述
IOPL(I/O privilege level field) 指示当前运行任务的I/O特权级(I/O privilege level),正在运行任务的当前特权级(CPL)必须小于或等于I/O特权级才能容许访问I/O地址空间。这个域只能在CPL为0时才能经过POPF以及IRET指令修改。
NT(Nested task flag) 控制中断链和被调用任务。若当前任务与前一个执行任务相关则置1,反之则清零。
RF(Resume flag) 控制处理器对调试异常的响应。
VM(Virtual-8086 mode flag) 置1以容许虚拟8086模式,清除则返回保护模式。
AC(Alignment check flag) 该标志以及在CR0寄存器中的AM位置1时将容许内存引用的对齐检查,以上两个标志中至少有一个被清零则禁用对齐检查。
VIF(Virtual interrupt flag) 该标志是IF标志的虚拟镜像(Virtual image),与VIP标志结合起来使用。使用这个标志以及VIP标志,并设置CR4控制寄存器中的VME标志就能够容许虚拟模式扩展(virtual mode extensions)
VIP(Virtual interrupt pending flag) 该位置1以指示一个中断正在被挂起,当没有中断挂起时该位清零。(Software sets and clears this flag; the processor only reads it)与VIF标志结合使用。
ID(Identification flag) 程序可以设置或清除这个标志指示了处理器对CPUID指令的支持。

 

  • 控制寄存器(5个):CR0-CR4

控制寄存器决定处理器的操做模式和当前执行任务的一些特征。

    • CR0:控制系统的工做模式和处理器的状态;x86_32的CR0为32bit。X86_64下为64bit,其中低32bit与x86_32的CR0保持一致,高32bit没有定义,做保留使用,除了bit4其余全部位都是可读可写的。

 

标志 描述
PE(Protected-Mode Enable) PE=0,表示CPU处于实模式;PE=1表CPU处于保护模式,并使用分段机制。
MP 协处理器监视标志位
EM 该位代表是否须要仿真协处理器的功能
TS 每当任务切换时就设置该位,而且在解释协处理器指令以前测试该位
ET 扩展类型。设置有效位时,支持 ntel 387 DX 数学协处理器指令
NE 数字错误标志位(与浮点协处理器共同使用)
WP 写保护
AM 对齐功能屏蔽(与EFLAGS寄存器中 AC标志位一同使用)
NW 直写无效(直写:高速缓存中的数据始终保持与主存储器中数据匹配,也叫作通写 )
CD cache 缺失设置位
PG(Paging Enable) 控制分页机制,PG=1,启动分页机制;PG=0,不使用分页机制。
    • CR1:保留
    • CR2:存放发生页错误时的虚拟地址

 

    • CR3:用来存放最高级页目录地址(物理地址),各级页表项中存放的也是物理地址。

 

标志 描述
PWT(Page-Level Writethrough) 控制cache采起直写仍是回写的策略。当设置清空时,回写有效。当置位时,直写有效
PCD(Page-Level Cache Disable) PCD=1,表示最高目录表不可缓存,PCD=0,相反
  • Figure 3-4中,不使用PAE技术,有两层页表。最高层为页目录有1024项,占用4KB。page_directory_table base address为物理地址,指向4KB对齐的页目录地址。
  • Figure 3-5中,使用PAE技术,三层页表寻址。最高层为页目录指针,4项,占用32B空间。因此  page_directory_table base address为27位,指向32B对齐的页目录指针表。
    • CR4:一些结构的扩展。代表对于特定的处理器和操做系统执行支持。

 

标志 描述
VME(virtual 8086 mode extension) 虚拟8086模式扩展位。VME=1,容许虚拟8086扩展,即容许8086模式和虚拟8086中断。VME=0,禁止虚拟8086模式扩展。
PVI(protected mode virtual interrupts) 保护模式虚拟中断位。PVI=1,容许保护模式虚拟中断。PVI=0,禁止保护模式虚拟中断。
TSD(time stamp disable) 禁止RDTSC指令位。TSD=0,则容许RDTSC(读时间标志计算器)指令在任何特权级上执行。TSD=1,仅容许RDTSC指令在0级特权级上执行,不然将发生通常保护模式异常。
DE(debugging extensions) 调试扩展位。DE=1,容许输入/输出断点。DE=0,不支持输入/输出断点。
PSE(page size extensions) 容许页容量大小扩展位。PSE=1,容许每页容量为4MB。PSE=0,只容许每页容量为4KB。
PAE(physical address extension) 容许物理地址扩展位。PAE=1,容许采用32位以上的物理地址(包括32位和64位地址)。PAE=0,只容许采用32位物理地址。
MCE(machine check exception) 容许机器检查异常位。MCE=1,容许机器检查异常。MCE=0,不容许机器检查异常。
PGE(Page-Global Enable) 将PGE设置为1可启用全局页面机制。将该位清除为0将禁用该机制。当启用PGE时,系统软件能够将页面转换层级的最低级别的全局页面(G)位设置为1,表示页面翻译是全局的。当页面翻译表基地址(CR3)更新时,标记为全局的页面翻译在TLB中不会失效。
PCE(Performance-Monitoring Counter Enable) 将PCE设置为1容许在任何权限级别运行的软件使用RDPMC指令。软件使用RDPMC指令读取性能监视MSRs PerfCtrn。 将PCE清除为0仅容许最特权的软件(CPL = 0)使用RDPMC指令。
OSFXSR(FXSAVE/FXRSTOR Support) 设置为1,以使能256位和128位媒体指令。当该位设置为1时,它还指示系统软件使用FXSAVE和FXRSTOR指令来保存和恢复x87,64位介质和128位介质指令的处理器状态。
OSXMMEXCPT(Unmasked Exception Support) 当系统软件支持SIMD浮点异常(#XF)来处理未屏蔽的256位和128位媒体浮点错误时,系统软件必须将OSXMMEXCPT位设置为1。将OSXMMEXCPT位清除为0表示不支持#XF处理程序。 当OSXMMEXCPT = 0时,未屏蔽的128位媒体浮点异常会致使无效操做码异常
OSXSAVE(XSAVE and Extended States) 设置为1,则操做系统支持XGETBV,XSETBV,XSAVE和XRSTOR指令。处理器也将可以执行XGETBV和XSETBV指令,以读写XCR0。
  • 调试寄存器(8个):DR0-DR7

 

调试寄存器主要做用是调试应用代码、系统代码、开发多任务操做系统.来监视代码的运行和处理器的性能。

DR0-DR3:保留32位断点的线性地址。

DR4-DR5:保留。

DR6:

标志 描述
B0-B3 断点状态的监测
BD 调试寄存器访问监测。置位,代表在指令流中,下一条指令将访问其中的一个调试寄存器
BS 单步执行标志位
BT 任务转换标志位

DR7:

标志 描述
L0-L3 局部断点使能标志位
G0-G3 全局断点使能标志位
LE GE 置位,代表处理器能够监测致使数据断点的指令。推荐置位为1
GD 通用监测使能标志位。代表是否开启调试寄存器保护
LEN0 - LEN3 用来代表相应断点地址寄存器内存位置的大小
R/W0 - R/W3 相应断点的状态
  • 系统地址寄存器(4个):GDTR、IDTR、LDTR和TR

    GDTR:全局描述符表寄存器,是一个48位寄存器,用来存放全局描述符表GDT的32位线性基地址和16位的界限值。在全局描述符表中不只包括有操做系统使用的描述符,并且还有全部任务使用的公用描述符。

    IDTR:中断描述符表寄存器,是一个48位寄存器,用来存放中断描述符表IDT的32位线性基地址和16位的界限值。

    LDTR:局部描述符表寄存器,是一个16位寄存器,用来存放局部描述符表LDT的16位选择符。另外还有一个隐含的描述符高速缓冲寄存器,用来存放LDT表描述符。

    TR:任务状态寄存器,是一个16位寄存器,用来存听任务状态段TSS的16位选择符。与之相应,也有一个隐含的描述符高速缓冲寄存器,用来存听任务状态段TSS的描述符。

  • 16位段寄存器(6个):CS、DS、ES、FS、GS、SS

    段寄存器有两部分,一部分是编程可见的选择器寄存器,为6个16位寄存器,对应在另外一部分有6个64位的描述符寄存器,后一部分是编程不可见的。

    在实地址方式或虚拟8086方式,描述符寄存器不起做用,选择器寄存器退化成16位CPU的段寄存器功能,存放内存段的段基址——段首地址的高16位,其中CS对应于代码段、SS对应于堆栈段,DS对应于数据段,ES对应于附加数据段,在串操做时,DS和ES分别对应于源数据段和目的数据段。FS和GS没有定义。

  • 其余寄存器:EIP、TSC等

    • 指令指针指示器--EIP

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

    • 时间戳寄存器--TSC

      每一个时钟周期时其值加1,重启时清零。经过RDTSC指令读取TSC寄存器,只有当CR4寄存器的TSD位为0时,才能够在任何优先级下执行该指令,不然只能在特权级下执行该指令。

    • 浮点寄存器

      因为在80486微处理器内部设有浮点运算器,所以在其内部有相应的寄存器,其中包括8个80位通用数据寄存器、1个48位指令指针寄存器、1个48位数据指针寄存器、1个16位控制字寄存器、1个16位状态字寄存器和1个16位标记字寄存器。

主要技术

重命名技术:寄存器重命名,是CPU在解码过程当中对寄存器进行重命名,解码器把“其它”的寄存器名字变为“通用”的寄存器名字,本质上是经过一个表格把x86寄存器从新映射到其它寄存器,这样可让实际使用到的寄存器远大于8个。这样作的好处除了便于前面指令发生意外或分支预测出错时取消外,还避免了因为两条指令写同一个寄存器时的等待。

乱序执行技术:采用乱序执行技术使CPU内部电路满负荷运转并相应提升了CPU运行程序的速度。相似多个CPU同步执行。

特色

寄存器又分为内部寄存器与外部寄存器,所谓内部寄存器,其实也是一些小的存储单元,也能存储数据。但同存储器相比,寄存器又有本身独有的特色:

  1. 寄存器位于CPU内部,数量不多,仅十四个

  2. 寄存器所能存储的数据位数根据处理器类型不一样而不一样(8bit、16bit及32bit)

  3. 每一个内部寄存器都有一个名字,而没有相似存储器的地址编号

参考资料

80X86寄存器详解

寄存器(百度百科)

Intel X86 CPU系列的寄存器

CR0-4寄存器介绍