程序是如何被 CPU 执行的
我们在进行嵌入式软件开发的时候,常用的一种语言是 C 语言,C 语言又被称之为高级语言,我们编写的高级语言在真正的进入到 CPU 进行执行之前,还有很多个步骤需要完成,比较粗略的划分是需要经过:编译 -> 链接 -> 生成可执行文件三大步骤,比较细致地划分就是下图所示的过程:
上图所示的 OP 代表的就是指令要执行的操作,从图中也可以看到逻辑运算单元的操作数是来自寄存器组,当然对于逻辑运算单元的操作数也不总是来自寄存器组,只有在进行简单的运算的时候,才会从寄存器组里取得操作数进行运算,运算之后,那就要有结果,所以逻辑运算单元会输出两个数据,一个是运算之后的结果,一个是标志位,这里的标志位代表的是两个操作数运算之后的运算结果是否得0,是否进位,是否是负数,是否溢出这几种标志。
另一方面,寄存器组除了给逻辑运算单元提供操作数之外,同时还充当存储运算结果的功能,示意图如下:
从上述图片可以看到逻辑运算单元的操作数一个是来自数据存储器,一个是来自寄存器组。在往数据存储器里取操作数的时候,需要注意的是,数据存储器并不是 CPU 的部分,那么访问存储器的速度相比于访问寄存器的速度是要慢许多的。
在阐述寄存器组的时候,我们说到寄存器组可以提供操作数,同时也能够存储逻辑运算单元的运算结果,那对于数据存储器来说,也是一样的,它也能够存储逻辑运算单元的运算结果。示意图如下:
从图中可以看到指令是从指令存储器中取得的,同时,我们思考程序要能够正确的运行,那么就需要使得指令有序的得到运行,而不是胡乱地送到指令寄存器中,那么 CPU 又怎么保证指令能够有序的得到运行呢,这里就需要使用到 CPU 的 PC 指针寄存器,PC 指针寄存器的功能是存放下一条待执行指令的地址,当地址被取出之后,PC 指针寄存器将更新,指向下一条即将执行的指令,因此 PC 指针寄存器的存在也就保证了指令的有序执行。
总结
上述我们把 CPU 工作涉及的部件单独拆开进行了阐述,现在我们将其整合,所以 CPU 的工作流程是根据 PC 指针寄存器存储的下一条即将执行的指令的地址,使得指令存储器中的指令能够有序的进入指令寄存器,然后,控制单元从指令寄存器中取得相应的指令,并对其进行指令解析,判断当前指令要执行的操作,以及根据指令解析的内容控制逻辑运算单元操作数的来源和逻辑运算单元运算结果的存储位置,从而完成指令要求 CPU 执行的运算。