【高斯摩分享】 CPU指令的执行过程
上图中虚线左边部分是中央处理器 CPU 的框图,其中运算器是执行数据运算的部件,
基本电路就是我们第2篇晶体管原理中介绍的加法器。
它有两组输入,一组(8位)是累加器的内容,另一组是数据总线上的内容,它的输出又送至内部数据总线上。
(1)程序计数器 PC(16 位):PC是一个自动加1计数器,它提供要执行指令的地址、它的内容也可以通过内部数据总线得到修改。
学过Java的应该都知道JVM模型里有一个程序计数器,就是这个东西,它是JVM里唯一一个不会出现OOM的,
如果不记得了,改天出一篇,再讲一下烂大街的JVM模型。
(2)地址寄存器 AR(16位):AR的输入可以是程序计数器的内容,也可以是内部数据总线的内容。
它的输出送到CPU外边,作为存储器或输入输出接口的某地址值。
(3)数据缓冲器 DR(8位):DR起CPU内外数据传送缓冲的作用,
注意这个不是我们常说的CPU缓存(L1/L2/L3缓存),关于这块的区别,我放到本文最后讲。
(4)指令寄存译码器:其基本电路是译码器。它的输人是内部总线上的内容(一般在取指周期得到的指令代码)
和外部时钟脉冲清零信号等,
输出则是各种分时的“0”、“1”电平和脉冲。它根据输入指令代码的不同,发出一系列相应的“0”、
“1”电平和脉冲,控制各部分协调工作,完成该指令的执行任务。
上图中虚线右边部分是一个存储器。存储器芯片的基本电路是存储体和译码器。
在大规模集成电路的存储芯片中,存储体的数量是惊人的。
现在常用的只读存储器(ROM)或随机存储器(RAM)都是每片数千个存储单元(8 位),甚至更多。
另外,对某一单元的读写,只要地址线给出该单元地址
控制线给出读写信号,即可由存储器内部译码器电路找到该单元,并且写人或读出该单元中的内容。
我们假设上图中的存储器已经同 CPU 接好了数据总线、地址总线、
控制总线,并且已经通过输入输出设备在地址从0000H(图中左边部分)
开始的单元里装好了一些指令代码:74 09 04 00。这些代码代表了某种命令,学习过汇编语言的会明白,
这里就不过多介绍了,为了说明,暂由我们给出:
① 74 09 把09这个数送到累加器中;
② 04 把累加器中内容加1,送回累加器中,就是我们程序中的自增操作i++;
③ 00 等待,空操作;
现在我们来看看机器指令详细的执行经过。开机时,我们先通过
CPU 外部清零线使程序计数器 PC变成 0000H,然后CPU在外部时钟脉冲作用下自动进入执行过程。
执行过程实际上就是CPU取指(取出存储器中事先存好的指令)阶段和分析执行指令阶段这两个阶段的循环过程。
如上图,当CPU运行时,首先是进入取指阶段,其顺序是:
①程序计数器的内容(这时是 0000H)送到地址寄存器。
②程序计数器的内容自动加 1(变为 0001I)。
③地址寄存器中内容(0000H)通过 CPU 外部地址总线送到存储器,经存储器中地址译码器,使地址为 0000H的单元被选中。
④CPU 控制总线中读控制线等有效(产生一个低电平)。
⑤存储器中被选中单元内容(此时应为 74)送到数据总线上。
⑥通过数据总线送该内容到数据缓冲器。
⑦该内容送到内部数据入线。因为是取指阶段,所以一定是送到指令寄存译码器至此,取指阶段完成,进入执行阶段。
CPU进人执行阶段后,由于进人指令寄存译码器中的内容是 74H(指令代码),
机器就会知道该指令是要将一个数送到累加器A中,而该数是在此指令代码的下一个存储单元,
所以执行该指令还必须把数(09H)从存储器中取到 CPU,即还要到存储器中取第二个数字(或称字节),
其过程与取指阶段①~⑦步类同,只是第①步中 PC 已为 0001H,
从而第⑤步取出的数是 09H,而且第⑦步因为指令是要求把取得的数送到累加器A,
所以取出的内容由内部数据总线进人累加器A,而不是进入指令寄存译码器。
至此一条指令执行完毕,CPU 中PC=0002H(PC 在 CPU 每次向存储器取指或取数时都自动加 1),机器又进入了取指阶段。
取第二条指令的取指阶段过程与取第一条指令的取指阶段过程完全相同,
第⑦步一定把从存储器取来的内容送到指令寄存译码器,只是此时的指令代码是 04H。
经指令分析知道,这是一个单字节指令,它要求把A的内容加1以后,结果取代原来A 中的内容。
所以,当机器进入执行阶段时,控制器(即指令寄存译码器)发出各种内部控制信号。执行过程是:
①把累加器内容送入运算器
②加1以后送到内部数据总线。
③内部数据总线上的数又送回累加器 A。
这样第二条指令又执行完毕,CPU 中 PC=0003H,机器又进入了第三条指令的取指阶段。
按①~⑦取指过程从存储器中取得 00H,送到控制器。经分析译码,知道该代码是让 CPU 空操作。
至此,程序取指执行完毕。累加器A 中数为0AH(09H+01H=0AH)。从上面介绍可以看出,
机器执行程序时其过程如同交通管理,有各种通道、门岗。人们要传送一个数,对一个数进
行运算,要让机器执行某一单元的指令代码,要机器暂停工作,都必须制定好各种指令的次序,
然后机器在一定节拍中发出种种信号(如同交通路中的红绿灯),有条不紊地进行控制执行。
看到这里,就恭喜你走完流程了,可能都已经忘了,文中还有一个钩子函数:数据缓冲器与CPU缓存的区别。
数据缓冲器(DR/MDR) ≠ CPU缓存,它们是不同层级的存储组件,主要区别如下:
1. 数据缓冲器(DR/MDR)
定位:属于CPU内部的寄存器级存储(直接集成在CPU核心中) 功能:临时存放CPU与内存之间传输的单次读写数据(例如从内存读取的1字节指令,或要写入内存的1字节结果), 解决CPU高速运算与内存低速访问之间的速度差异(类似“临时中转站”) 特点: 容量极小:通常是8位/16位宽度(取决于CPU架构) 极快访问速度:延迟几乎可以忽略(与CPU时钟同步) 物理位置:直接位于CPU核心与内存总线之间
2. CPU缓存(L1/L2/L3 Cache)
定位:属于CPU与内存之间的高速缓冲存储器层级 功能: 缓存高频使用的数据和指令块(例如循环代码段、频繁访问的变量) 减少CPU直接访问内存的次数(内存访问速度比缓存慢数十倍) 特点: L1 Cache直接集成在CPU核心内 L3 Cache可能被多个CPU核心共享 容量较大:L1 Cache约几十KB,L3 Cache可达几十MB 分层结构:通常分L1(最快)、L2、L3(最慢但最大)三级 物理位置:
3. 关键区别总结
4. 实际数据流动示例
假设CPU要执行一条读取内存的指令:
地址阶段:CPU将目标地址放入地址寄存器(AR/MAR)→ 发送到内存总线 数据传输: 内存返回数据 → 先进入数据缓冲器(DR/MDR) 如果数据高频使用 → 后续可能被缓存(L1 Cache)保留副本 CPU处理: 数据从DR/MDR → 进入CPU内部寄存器(如AX/BX) 若下次需要相同数据 → 优先从L1 Cache读取(不再访问内存)