往期文章
寻找IOS相册中相似图片
NSNotification与类对象,实例对象
iCloud-Documents存储
CocoaPods私有源搭建
Swarm区块链分布式存储使用
MacOS流编辑器sed
IOS使用Flutter模块
开始
我们通过一个简单的CPU的架构图,来简单了解下CPU取译码执行过程。
现在我们来简单介绍下图片中的各种名词
名称 | 用途 |
---|---|
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)
使用汇编语言生成一条CPU指令
下面来看一条汇编代码
INC A
这条汇编代码的意思是让寄存器A自增一次。
这条汇编代码会生成一条CPU指令,其二进制形式如下
00111100
通常为了方便我们记忆我会使用其16进制形式
3C
CPU选中指令的内存地址
我们将3C这条让寄存器A自增的指令,放在内存中其地址为AE00,如下图所示
接来下CPU将这条指令的地址AE00从内存加载到PC程序计数器中,这里我们假设寄存器其A中已经有一个数据了00000000,为了方便记忆我们还是使用其十六进制形式00H
程序计数器在获取到3C指令之后,将这条指令放入MAR(Memory address register) 地址寄存器中,然后PC程序计数器+1,这样程序计数器PC 就可以加载下一个内存地址(这样就可以取下一个指令或者操作)
在地址寄存器中的AE00地址,通过地址总线,来到内存中选中当前CPU操作的地址AE00
取地址中的指令
在选中操作地址之后,控制单元发送读取内存地址数据操作。然后被选中的地址AE00,将自身保存的数据通过数据总线传递到CPU中的BR缓冲寄存器中。然后从BR缓冲寄存器中拷贝到IR 指令寄存器中。然后IR指令寄存器将指令3C 放入decoder解码器中。待解码器解码完成以后。解码后的指令进入控制单元CU,执行流程如下
执行指令
当INC A指令(3C)进入CU控制单元之后,CU控制单元执行指令,将A通用寄存器中暂存的数据00H,放入ALU算术与逻辑单元之中,在ALU中完成自增。
以上就是一次完整的取译码过程。
结语
做图有点粗糙,请各位多多包涵,以上文章有什么错误之处,可以在下面评论,我会及时改正