0
点赞
收藏
分享

微信扫一扫

一份代码在计算机的简要运行过程


简要写一份代码

#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):算术逻辑单元,通过内部复杂的电路实现算数运算、逻辑运算

一份代码在计算机的简要运行过程_操作数_02

控制器的基本组成:

  • CU:控制单元,分析指令,给出控制信号
  • IR:指令寄存器,存放当前执行的指令
  • PC:程序计数器,存放下一条指令地址,有自动加1功能

存储体:MAR(memory address register)和MDR(memory data register)

  • MAR:一般是随机访问存储器(RAM),存放地址,一般代表寻址范围
  • MDR:存放数据,其位数也叫做存储字长
  • 本文说的存储体一般是内存

一份代码在计算机的简要运行过程_操作数_03

执行步骤

  • 首先令(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辅助)

即可。

博主寄语:有些东西,现在的你,看不懂,做不到,但并不意味着你永远看不懂,做不到。对于弱者,他是不可逾越的鸿沟;对于强者,他是勇往无前的动力。险境过后,一马平川,不要留遗憾,不要放弃自己。


举报

相关推荐

0 条评论