CPU核心寄存器
微处理器的全部核心寄存器(Core Register)在不同的微处理器上会有些差异,不同的微处理器其寄存器个数也不一样;寄存器功能或名称也不尽相同。仅以当今主流的两大微处理器核心架构X86和ARM来论,通常微处理器的核心寄存器必有PC指针和堆栈寄存器;而状态寄存器和通用数据寄存器则不尽相同,各有不同的名称不同的功能不同的意义;此外ARM有链接寄存器,X86有段寄存器和变址寄存器等;有的微处理器可能还有某些其他专用功能的寄存器;所有寄存器的具体细节会在该微处理器的数据手册中详细说明。下文只笼统的介绍最核心寄存器比如PC指针和堆栈寄存器等。
PC指针(全称:Program Counter,不是personal computer的缩写。Program Counter也常被翻译为“程序计数器”或“编程累加器”,也可称为指令寄存器。)是放指令所在内存地址数据的寄存器。这里稍微解释下指针的概念就是:有个能存地址值的存储空间,而微处理器能自动利用该存储空间取到其中地址值,并按该地址值取到数据,该存储空间就是指针。
PC指针会把取到的指令喂给译码器,所以PC指针的位宽一般和译码器的位宽相等。而依照特定微处理器的细节而不同,PC指针可能是保存着正在被执行的指令,也可能是下一个甚至下下一个要执行指令的地址,通常这与微处理器的流水线概念有关。
重要的是,PC指针不仅能给译码器传入所指向的指令,还能在指令执行完之后自动递加所存的地址值,这样就能自动执行下一条指令从而按地址顺序一条条自动执行各个地址上的指令。
这个指令寄存器不自动递加地址的例外情况可以有许多种,目前常见的有4种:
一是执行了一个跳转到另一地址的指令;
二是被指令直接改写了PC指针的值;
三是微处理器响应异常(这里异常的概念可以是中断,或是执行了未定义指令,或者是数据超范围之类的逻辑错误),PC指针又自动跳转到某指定的地址上;
四是微处理器电流或电压异常(这里异常的概念是没有规律或逻辑,纯属胡乱的错误)导致PC指针出错(这种出错一般也叫跑飞,是非常严重的问题,绝对禁止出现)。
需要注意的是:PC指针自动递加的概念是,假如PC是32位的,那么指令所占的地址是4字节,那么PC指针里的值每次递加4字节,假如PC是16位的,指令所占的地址是2字节,那么PC指针里的值每次递加2字节,以此类推,PC指针里的值每次递加的值是按指令所占地址长度为准。
如果该PC指针存了一个非法地址,或者合法地址中的指令不能被译码器识别,都会引起微处理器进入异常状态。这类问题必须要能查出原因并解决,所以可解问题的手段通常是异常发生后,微处理器一般能自动备份异常发生前一刻的关键寄存器到备份空间比如备份寄存器或堆栈(有些书称之为现场保留),并且自动有相应的一些处理器状态及寄存器的改变,然后将PC指针的地址自动(这里的自动指的是不需要执行程序或者说是指令)切到指定的地址。而