【重铸基础】CPU取译码执行

1,401 阅读3分钟

往期文章

寻找IOS相册中相似图片
NSNotification与类对象,实例对象
iCloud-Documents存储
CocoaPods私有源搭建
Swarm区块链分布式存储使用
MacOS流编辑器sed
IOS使用Flutter模块

开始

我们通过一个简单的CPU的架构图,来简单了解下CPU取译码执行过程。

image.png 现在我们来简单介绍下图片中的各种名词

名称用途
A B C D E F代表6个通用寄存器,用于需要暂存数据
ALU算术逻辑单元是专门执行算术和逻辑运算的地方
PC程序计数器用于存放下一条指令的地方
MAR地址寄存器
BR全称buffer register 缓冲寄存器
IR存放CPU指令集的地方
Decoder译码器
CU控制单元,CPU执行指令的地方

获取一条指令

汇编语言简介

大多数情况下我们的用C++或者java或者其他高级语言生成的代码首先被编译成汇编语言。汇编语言可以生成CPU对应的指令集,而指令集是由一堆二进制代码组成的机器语言,能够直接被CPU识别和执行。

简单的指令介绍
0000 代表 加载(LOAD)
0001 代表 存储(STORE)

image.png

使用汇编语言生成一条CPU指令

下面来看一条汇编代码

INC A

这条汇编代码的意思是让寄存器A自增一次。

这条汇编代码会生成一条CPU指令,其二进制形式如下

00111100

通常为了方便我们记忆我会使用其16进制形式

3C

CPU选中指令的内存地址

我们将3C这条让寄存器A自增的指令,放在内存中其地址为AE00,如下图所示

image.png

接来下CPU将这条指令的地址AE00从内存加载到PC程序计数器中,这里我们假设寄存器其A中已经有一个数据了00000000,为了方便记忆我们还是使用其十六进制形式00H

CPU.gif

程序计数器在获取到3C指令之后,将这条指令放入MAR(Memory address register) 地址寄存器中,然后PC程序计数器+1,这样程序计数器PC 就可以加载下一个内存地址(这样就可以取下一个指令或者操作)

CPU1.gif

在地址寄存器中的AE00地址,通过地址总线,来到内存中选中当前CPU操作的地址AE00

取地址中的指令

在选中操作地址之后,控制单元发送读取内存地址数据操作。然后被选中的地址AE00,将自身保存的数据通过数据总线传递到CPU中的BR缓冲寄存器中。然后从BR缓冲寄存器中拷贝到IR 指令寄存器中。然后IR指令寄存器将指令3C 放入decoder解码器中。待解码器解码完成以后。解码后的指令进入控制单元CU,执行流程如下

CPU3.gif

执行指令

当INC A指令(3C)进入CU控制单元之后,CU控制单元执行指令,将A通用寄存器中暂存的数据00H,放入ALU算术与逻辑单元之中,在ALU中完成自增。

CPU4.gif

以上就是一次完整的取译码过程。

结语

做图有点粗糙,请各位多多包涵,以上文章有什么错误之处,可以在下面评论,我会及时改正