01什么是CPU?
CPU和计算机之间的关系相当于大脑和人类之间的关系。它是一种小型计算机芯片,通常嵌入在计算机的主板上。CPU是通过在一个计算机芯片上放置数十亿个微小的晶体管来构建的。这些晶体管使其能够执行运行存储在系统存储器中的程序所需的计算。所以,也可以说CPU决定了你电脑的计算能力。
02 CPU实际做什么?
CPU工作的核心是从程序或应用程序中获取指令并执行计算。这个过程有三个关键阶段:提取、解码和执行。CPU从系统的RAM中获取指令,然后对指令的实际内容进行解码,最后由CPU的相关部分执行指令。
03 CPU内部结构
刚才提到了很多CPU的重要性,那么CPU的内部结构是什么呢?它是由什么组成的?下图显示了一个通用程序的运行过程(以C语言为例)。一般来说,了解程序的运行过程是掌握程序运行机制的基础和前提。

通用程序操作流程
在这个过程中,CPU负责解释和运行最终转换为机器语言的内容。CPU主要由两部分组成:控制单元和算术逻辑单元(ALU)。
控制单元:从存储器中提取指令并对其进行解码以供执行;
算术逻辑单元(ALU):处理算术和逻辑运算。
CPU和存储器都是由许多晶体管组成的电子部件,可以比作计算机的心脏和大脑。它能够接收数据输入、执行指令和处理相关信息,并与向CPU发送数据和从CPU接收数据的输入/输出(I/O)设备进行通信。
从功能的角度来看,CPU的内容由四个部分组成:寄存器、控制器、算术单元和时钟,每个部分都通过通电信号连接。
接下来,让我们简单介绍一下内存。当谈到CPU时,为什么我们需要谈论内存?因为内存是与CPU通信的桥梁。计算机中的所有程序都在内存中运行。存储器通常称为主存储器,其功能是存储CPU中的操作数据以及与硬盘等外部存储设备交换的数据。
当计算机运行时,CPU会将需要计算的数据传输到主存储器中进行操作。操作完成后,CPU发送结果,主存储器的操作也决定了计算机的稳定运行。主存储器通常通过控制芯片连接到CPU,由可读写元件组成,每个字节都有一个地址号。
CPU通过地址从主存储器读取数据和指令,也可以根据地址写入数据。请注意,当计算机关闭时,内存中的指令和数据也将被清除。
04 CPU是寄存器的集合
在CPU的四种结构中,寄存器的重要性远高于其他三种,为什么我们这么说?因为程序通常将寄存器描述为对象。谈到寄存器,我们必须谈论汇编语言,谈到汇编语言,我们必须讨论高级语言,当我们谈论高级语言时,我们必须提到语言的概念。
05计算机语言
人与人之间最古老、最直接的通信媒介是语言,但要与计算机通信,必须根据计算机指令进行交换,这涉及到语言问题。最早,为了解决计算机和人类之间的通信问题,出现了汇编语言。然而,汇编语言晦涩难懂,因此有C、C++和Java等高级语言。因此,计算机语言通常分为低级语言和高级语言。用高级语言编写的程序只有在编译并转换为机器语言后才能运行,而汇编语言可以由汇编程序转换为机器语。
06汇编语言
这是用汇编语言编写程序的一部分。汇编语言使用助记符来编写程序。每个原本是电信号的机器语言指令都有相应的助记符。例如,mov和add分别是数据存储(移动)和加法的简写。
汇编语言和机器语言有一对一的对应关系,这与高级语言不同。我们通常将用汇编语言编写的程序转换为机器语言。这个过程称为组装。相反,将机器语言转换为汇编语言的过程被称为反汇编。
汇编语言可以帮助你理解计算机的功能。机器语言级别的程序是通过寄存器处理的。上面代码中的eax和ebp都是寄存器,它们是CPU内部寄存器的名称。因此,可以说CPU是一系列寄存器的集合。
通常,存储器中的存储器由地址号表示,寄存器的类型由名称区分。这些不同类型的CPU具有不同类型和数量的内部寄存器,以及存储在寄存器中的值的范围。
07程序计数器
程序计数器用于存储下一条指令所在单元的地址。当程序被执行时,PC的初始值被用作程序的第一条指令的地址。当顺序执行程序时,控制器首先根据程序计数器指示的指令地址从存储器中取出指令,然后分析并执行该指令。同时,PC的值增加1,指向要执行的下一条指令。
我们可以通过一个例子来仔细观察程序计数器的执行情况:

程序计数器执行
这是一个添加操作,程序启动,经过编译和解析后,硬盘中的程序将通过操作系统复制到内存中。
上述示例程序是执行123和456的相加操作,然后将结果输出到显示器。因为很难用机器语言描述,所以这些都是翻译后的结果。
事实上,每个指令和数据可以分布在不同的地址,但为了更好地说明,组成指令的存储器和数据被放置在一个存储器地址。
地址0100是程序运行的起始位置。Windows和其他操作系统将程序从硬盘复制到内存后,会将程序计数器设置为起始位置0100,然后执行程序。每次执行指令后,计数器的值都会增加1,或者直接指向下一条指令的地址。
然后,CPU将从存储器中读取命令,并根据程序计数器的值执行该命令。换句话说,程序计数器控制程序的流程。
08有条件的分支和循环机制
高级语言总结的条件控制流主要分为三种类型:顺序执行、条件分支和循环判断。
顺序执行是按照地址内容的顺序执行命令。
条件分支是根据条件在任意地址执行指令。
循环是指重复执行相同地址的指令。
通常,顺序执行的情况相对简单,每次执行指令时程序计数器的值为+1。条件分支和循环分支使程序计数器指向任意地址,这样程序就可以返回到前一个地址来重复相同的指令,或者跳到任何其他指令。
下面,我们以条件分支为例来说明程序的执行过程:

程序的启动过程与顺序流程相同,程序的顺序流程与启动过程相同。CPU从0100开始执行命令。它在0100和0101中依次执行。PC的值为+1的顺序。当执行0102地址的指令时,判断0106寄存器的值大于0,并跳到0104地址的指令。然后将该值输入到显示器,然后结束程序,跳过0103的指令。这与我们程序中的if()判断相同。如果不满足条件,通常会直接跳过指令。因此,PC的执行不是直接+1,而是下一条指令的地址。
09标志寄存器
条件分支和循环分支将使用跳转(跳转指令),它将根据当前指令决定是否跳转。我们在上面提到了标志寄存器。无论当前累积寄存器的运算结果是正、负还是零,标志寄存器都将被保存。当CPU执行操作时,标志寄存器的值将根据当前操作的结果自动设置,并且操作结果的正、负和零状态由标志寄存器的三位表示。
当标志寄存器的第一字节位、第二字节位和第三字节位的相应结果均为1时,它们分别表示正数、零和负数。

标志寄存器
CPU的执行机制很有趣。假设存储在累加寄存器中的XXX与存储在通用寄存器中的YYY进行比较。在比较的背后,CPU的操作机制将执行减法运算。无论减法运算的结果是正、零还是负,它都将存储在标志寄存器中。阳性结果表示XXX大于YYY,结果为零表示XXX和YYY相等,阴性结果表示XXX小于YYY。程序比较指令实际上是CPU内部的减法运算。
10功能调用机制
函数调用和条件分支,循环机制不同,简单的跳转指令无法实现函数调用。函数调用需要在函数内部进行处理后,处理流程返回到函数调用点(函数调用指令的下一个地址)。函数调用处理是通过将程序计数器的值设置为函数的存储器地址来实现的。
11通过地址和索引实现数组
接下来是基址寄存器和索引寄存器,通过它们可以划分主存储器上的特定区域,以实现类似阵列的操作。首先,计算机内存中00000000-FFFFFFFFF的地址可以用十六进制数划分。这样,对于这个范围内的任何内存地址,只要有一个32位寄存器,就可以查看所有地址。然而,如果你想划分一个特定的内存区域进行连续查看,比如数组,那么使用两个寄存器更方便,例如,我们使用两个注册表来表示内存的值。
这种表示方式与数组的结构非常相似。数组是指在存储器中连续排列相同长度的数据的数据结构。使用数组名称表示数组的所有值,并通过索引区分数组的每个数据元素,例如,a[0]-a[4],[]中的0-4是数组的下标。
12CPU指令执行过程
说了这么多,CPU是如何一个接一个地执行指令的?冯·诺依曼型计算机的几乎所有CPU都可以在五个阶段工作:指令获取、指令解码、执行指令、访问数据和写回结果。指令获取阶段是将存储器中的指令读取到CPU中的寄存器的过程,程序寄存器用于存储下一条指令的地址。
指令提取完成后,立即进入指令解码阶段。在指令解码阶段,指令编码器根据预指令格式对提取的指令进行拆分和解释,并识别和区分不同的指令类别和各种方法以获得操作数;
执行指令阶段的任务是完成指令指定的各种操作,具体实现指令的功能;
存取取阶段的任务是:根据指令地址码,获取主内存中操作数的地址,并从主内存中读取操作数进行操作;
结果回写阶段:作为最后一个阶段,执行指令阶段的运算结果数据被“回写”到某种存储形式:结果数据通常被写入CPU的内部寄存器,以便后续指令能够快速访问。