简要写一份代码
#include <stdio.h>
int main() {
int n = 2 * 2;
printf("%d\n", n);
return 0;
}
我们在此只讨论第四行的运算,IO操作printf在此暂时不做介绍(前面博客已有,关于调用操作系统内核操作的)
在计算机进行运算的时候,其内部大约有三部分在活动:控制器,运算器和存储体。
其中运算器和控制器统称为中央处理器(CPU),输入设备和输出设备统称为IO设备。
运算器:用于实现算术运算(如:加减乘除)、逻辑运算(如:(与或非)
- ACC(accumulator):累加器,用于存放操作数或运算结果
- MQ(multiple-quotient register):乘商寄存器,在乘、除运算时,用存放操作数或运算结果
- X:通用的操作数寄存器,用于存放操作数
- ALU(arithmetic and logic unit):算术逻辑单元,通过内部复杂的电路实现算数运算、逻辑运算
控制器的基本组成:
- CU:控制单元,分析指令,给出控制信号
- IR:指令寄存器,存放当前执行的指令
- PC:程序计数器,存放下一条指令地址,有自动加1功能
存储体:MAR(memory address register)和MDR(memory data register)
- MAR:一般是随机访问存储器(RAM),存放地址,一般代表寻址范围
- MDR:存放数据,其位数也叫做存储字长
- 本文说的存储体一般是内存
执行步骤
- 首先令(PC)=0,指向第一条指令的存储地址
- (PC)->MAR,导致(MAR)=0
- M(MAR)->MDR,导致(MDR)=000001(操作码) 0000000101(地址码)
- (MDR)->IR,导致(IR)=000001 0000000101
- OP(IR)->CU,指令的操作码送到CU,CU分析后得知,这是“取数”指令
- Ad(IR)->MAR,指令的地址码送到MAR,导致(MAR)=5
- (MAR)->(MDR),(MDR)=2
- (MDR)->(ACC),(ACC)=2
搞清楚怎么回事了嘛?我来说一说
PC是程序计数器,当地址总线送入地址的时候,就会到地址存储器(MAR)去寻找该寻找的地址,存储体内部会根据地址去数据存储器(MDR)去寻找相对应的指令(二进制数据,由操作码和地址码组成),然后MDR把指令传给指令寄存器(IR),指令寄存器会把该指令送给CU进行分析指令(谁是操作码,谁是地址码),分析完成之后,得知该指令的操作码和地址码含义,以该题为例,为取数指令,因此此时会把该地址码送给MAR,导致MAR=5,MAR又会去MDR里面寻找,得到答案是2,最后MDR会把数据传送给ACC放着。(取指令,分析指令,指向取数指令)
Are you dong?确实,第一次有点模糊,再来看下一个步骤。
这个步骤我就直接按照前面的步骤来了。
- 上一条指令取值后PC自动加1,(PC)=1,执行后,(ACC)=2
- PC把该地址传给MAR,即MAR=2
- MAR去MDR里面寻找对应的数据,即MDR=000100(操作码) 0000000110(地址码)
- MDR把该指令丢给IR,则IR=000100 000000110
- IR把该指令给CU进行分析,得知这个操作码是“乘法”指令
- IR根据地址码去MAR中寻找,则MAR=6
- MAR去MDR中寻找数据,则MDR=3
- 因为这是乘法运算,因此得先把被乘数放在MQ中即MQ=3
- 而乘数我们一般放在通用寄存器中,即X=2
- 用ALU算术逻辑单元实现乘法运算,导致最后的值为6,ALU最后把运算结果传给ACC,即ACC=6(如果乘积太大,则需要MQ辅助)
即可。
博主寄语:有些东西,现在的你,看不懂,做不到,但并不意味着你永远看不懂,做不到。对于弱者,他是不可逾越的鸿沟;对于强者,他是勇往无前的动力。险境过后,一马平川,不要留遗憾,不要放弃自己。