计算机基础_程序是怎样跑起来的_01_CPU是什么?

CPU是什么?

0、热身问题

  1. 程序是什么?
    指示计算机每一步动作的一组指令。
  2. 程序由什么组成?
    指令和数据。
  3. 什么是机器语言?
    CPU可以直接识别并使用的语言。
  4. 正在运行的程序存储在什么位置?
    内存。
  5. 什么是内存地址?
    内存中,用来表示指令和数据存储位置的数值(类比“门牌号”)。
  6. 计算机的构成元件中,负责程序的解释和运行的是哪个?
    CPU。

之前只知道CPU是中央处理器(Central Processing Unit),相当于计算机的大脑,它的内部由数百万至数百亿个晶体管构成,但其实了解这些还是远远不够的。


1、CPU的内部结构解析

CPU的功能:解释和运行机器语言的程序内容。

CPU的组成:

  1. 寄存器:负责暂存指令、数据等处理对象;
  2. 控制器:负责把内存上的指令、数据读入寄存器,并根据指令的执行结果来控制整个计算机;
  3. 运算器:负责运算从内存读入寄存器的数据;
  4. 时钟:负责发出CPU开始计时的时钟信号。

各部分之间由电流信号相互流通。

接着简单说一下内存(后面又章节会提到)。

内存指的是计算机的主存储器(mian memory),简称主存。主存通过控制芯片等CPU相连,主要负责存储指令和数据。CPU可以通过地址编号读取主存中的指令和数据。

程序的运行机制:程序启动后,根据时钟信号,控制器会从主存中读取指令和数据到寄存器中,进而对这些指令和数据加以解释和运行,运算器对数据进行运算,控制器再根据结果来控制计算机。


2、CPU是寄存器的集合体

CPU的四个构成部分中,我认为寄存器是最重要的,因为程序是把寄存器作为对象来描述的。

不同的CPU内部的寄存器的数量、种类以及寄存器存储的数值范围都是不同的。

根据寄存器的种类,大致分为八类,如下表所示。

表1 寄存器的主要种类和功能
寄存器功能
累计寄存器(accumulator register)存储执行运算的数据和运算后的数据
标志寄存器(flag register)存储运算处理后的CPU状态
程序计数器(program register)存储下一条指令所在内存的地址
基址寄存器(base register)存储数据内存的起始地址
变址寄存器(index register)存储基址寄存器的相对地址
通用寄存器(general register)存储任意数据
指令寄存器(instruction register)存储指令
(CPU内部使用,程序员无法操作)
栈寄存器(stack register)存储栈区域的起始地址

对于程序员来说,CPU就是具有各种功能的寄存器的“集合体”。

一般而言,程序计数器、标志寄存器、累加寄存器、指令寄存器和栈寄存器只有一个。而基址寄存器、变址寄存器、通用寄存器一般不止一个。

后面会经常提及这些寄存器,所以每个寄存器的大致功能要记住,才不会看得一头雾水。


3、决定程序流程的程序计数器

以“123和456这两个数值相加,并将结果输出到显示器上”这个例子来展示程序执行的流程。

备注:一般数据和指令都是存储在多个地址上的,即一个数据或者一个指令可能会占据多个字节,但是本例为便于说明,把数据和指令分配到一个地址上。

在这里插入图片描述

地址0100是程序运行的开始位置,当操作系统把程序加载到内存后,会将程序计数器设定为“0100”。

CPU的控制器会参照程序计数器的值从内存中读取相应指令并执行,每执行完一个指令,程序计数器的值加1,即“0101”。

注:若指令占据多个内存地址时,程序计数器的值则加上加上相应的数值。


4、条件分支和循环机制

程序流程分为:

  1. 顺序执行:按照地址内容的顺序执行指令。
  2. 条件分支:根据条件执行任意地址的指令。
  3. 循环分支:重复执行同一地址的指令。

顺序执行,霉执行一个指令,程序计数器的值就加1(若指令占多个内存地址时,则加上相应的数值)。

条件分支和循环分支,机器语言的指令就可以将程序计数器的值设为任意地址。

以“输出123的绝对值到显示器”的程序为例。

在这里插入图片描述

当执行到地址为“0102”的指令时,此时累加寄存器的值大于0,则跳转执行地址为“0104”的指令,这就是条件分支。


5、函数的调用机制

函数调用机制:通过把程序计数器的值设定成函数的存储地址来实现的。

在编译高级变成语言的程序后,函数调用的处理会转换成机器语言的“call”指令,函数结束的处理会转成机器语言的“return”指令。

call指令:在程序计数器的值被设定为函数的入口地址前,call指令会把函数执行结束后要执行的指令地址存储到栈的主存内。

return指令:函数执行完毕后,通过函数出口执行return指令,把保存在栈中的指令的内存地址设定到程序计数器。

下面以“调用MyFunc函数”的C语言程序片段举例。

在这里插入图片描述


6、通过地址和索引实现数组

再次回顾一下基址寄存器和变址寄存器的功能。

基址寄存器(base register):存储数据内存的起始地址。

变址寄存器(index register) :存储基址寄存器的相对地址。

假设计算机内存上划分着“0x 0000 0000 ~ 0x FFFF FFFF”这些内存地址,我们可以使用一个32位的寄存器来查看我们需要的内存地址。

但是,假设我们要查看“0x 1000 0000 ~ 0x 1000 FFFF”的地址时,我们也可以使用两个寄存器来操作,这样就更方便。

在这里插入图片描述


7、CPU的处理其实很简单

虽然高级编程语言编写的程序看起来很复杂,但是CPU实际处理的事情很简单。CPU能执行的机器语言指令很少,只是通过不断的重复执行某个运算而已。

表2 机器语言指令的主要类型和功能
类型功能
数据传送指令寄存器和内存、内存和内存、寄存器和外围设备之间的数据读写操作
运算指令用累加寄存器执行算术运算、逻辑运算、比较运算、移位运算
跳转指令实现条件分支、循环、强制跳转等
call / return 指令函数的调用 / 返回调用前的地址

8、补充:比特和字节

8.1、比特

比特bit是二进制位(Binary digit)的简称,一个二进制包含的信息量成为一比特bit。

比特(bit)是计算机内部数据存储的最小单位。

二进制在效率和成本方面的优势为全世界所接受,现在电脑所有的信息都是二进制的,就是0和1组成的。

8.2、字节

字节Byte是计算机数据处理的最小单位。

习惯上用大写的“B”表示,每个字节有8个二进制位,其中最右边的一位为最低位,最左边的一位为最高位,每个二进制位的值不是0就是1。

一个字节由8个二进制位组成,即“1 Byte = 8 bit”,这也是计算机设计时规定的。

相关换算:
1 Byte = 8 bit
1 KB = 1024 Byte = 1024 * 1 Byte = 1024 * 8 bit = 8 Kb

注意:K是1024,即2^10,并不是1000。
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB

8.3、字

字和字节都是计算机的存储单元

字由若干个字节组成,一个字节是8个比特bit。

字的位数叫做字长,即cpu一次处理二进制代码的位数。

字长与计算架构有关,比如32位机,一个字就是32位,换算成字节就是4字节;同样的64位机,一个字就是64位,也就是8字节。字也是计算机一次处理数据的最大单位。

字 与 字节的换算:
32位计算机:1字 = 32位 = 4字节
64位计算机:1字 = 64位 = 8字节

8.4、32位机和64位机

我们的电脑是32位还是64位主要是受到电脑cpu、主板硬件决定的,32位的cpu一次处理32位数据,64位的就处理64位数据。

简单理解就是64位在性能上远远强于32位。

比如32位操作系统最大支持4G内存,如果电脑内存小于4G的话,是不能安装64位操作系统的。

那为什么是4G呢?

这个在后面讲“内存”时我们会说,现在先简单地提一下。

首先呢,4G指的是4GB。32位指的是CPU的32位地址线,可以访问2^32个不同的地址单元。一个地址单元是1Byte。

2^32 * 1 B 
= 2^2 * 2^10 * 2^10 * 2^10 B 
= 4 * 1024 * 1024 * 1024 B 
= 4 * 1024 MB 
= 4 GB

注:如有错误,敬请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值