int a=2,b=3,c=1,y=0;
void main()
{
y=a*b+c;
}
接下来看一下计算机内部是怎么执行这个程序的吧!
首先,先了解一下计算机硬件的组成:
1、主存储器:
- 存储体:存储计算机的数据,包含很多存储单元,数据在存储体中按地址存储
- MAR【Memory Address Register(存储地址寄存器)】:将要读取或者写入数据的地址放到这里
- MDR【Memory Data Register(存储数据寄存器)】:将读取或者写入的数据放到这里
2、运算器:
- ACC:累加器,用于存放操作数或运算结果
- MQ:乘商寄存器,在乘除运算时,用于存放操作数或运算结果
- X:通用的操作数寄存器,用于存放操作数
- ALU:算术逻辑单元,通过内部复杂的电路实现算术运算、逻辑运算
3、控制器:
- CU:控制单元,分析指令,并控制其他硬件的操作
- IR:指令寄存器,存放当前执行的指令
- PC:程序计数器,有自动加1的功能
接下来,程序开始运行啦
第一步是实现了“取a”的操作,具体来看:
- PC指向0地址位,从而MAR=0
- MAR=0, 从而读取0地址下存储的数据到MDR
- MDR取出的数据转存到控制器里面的IR
- IR的操作码即前6位送给控制器的CU,CU分析得知这是一个取数的指令
- IR将地址码即后10位送给存储器的MAR
- MAR根据地址码找到地址5,将这个地址下的数据即2取出放到MDR中
- MDR将数据再放到运算器的ACC中,从而ACC=2
第二步实现了“乘以b”的操作,具体来看:
- PC自动加1,PC=1,从而MAR=1
- MAR=1,从而取出地址1的数据放到MDR中
- MDR将数据给控制器的IR
- IR的操作码即前6位送给控制器的CU,CU分析得知这是一个“乘法”的指令
- IR将地址码即后10位送给存储器的MAR
- MAR根据地址码找到地址6,将这个地址下的数据即3取出放到MDR中
- 因为3是乘数,所以MDR将其放到控制器下的MQ中
- ACC将里面的数即被乘数放到X中
- MQ*X计算的结果放到ACC中,从而ACC=6,这里如果乘积太大的话,则需要MQ辅助存储
第三步实现了“加上c”的操作,具体来看:
1.PC自动加1,PC=2,从而MAR=2
2. MAR=2,从而取出地址2的数据放到MDR中
3. MDR将数据给控制器的IR
4. IR的操作码即前6位送给控制器的CU,CU分析得知这是一个“加法”的指令
5. IR将地址码即后10位送给存储器的MAR
6. MAR根据地址码找到地址7,将这个地址下的数据即1取出放到MDR中
7. 因为1是加数,所以MDR将其放到控制器下的X中
8. ACC+X->ACC=7,由ALU实现加法运算
第四步实现了“存数”的操作,具体来看:
1.PC自动加1,PC=3,从而MAR=3
2. MAR=3,从而取出地址3的数据放到MDR中
3. MDR将数据给控制器的IR
4. IR的操作码即前6位送给控制器的CU,CU分析得知这是一个“存数”的指令
5. IR将地址码即后10位送给存储器的MAR
6. MAR根据地址码找到地址8
7. ACC将其寄存的数转到MDR,从而MDR=7
8. MDR将数据写到地址8对应的存储单元,导致y=7
第五步实现了“停机”的操作,具体来看:
1.PC自动加1,PC=4,从而MAR=4
2. MAR=4,从而取出地址4的数据放到MDR中
3. MDR将数据给控制器的IR
4. IR的操作码即前6位送给控制器的CU,CU分析得知这是一个“停机”的指令
5. 利用中断机制通知操作系统终止该进程
总结
冯 诺依曼计算机的特点:
1、计算机由五大部件组成
2、指令和数据以同等地位存于存储器,可按地址寻访(指令:取数,存数,加法,乘法,停机等;数据:操作数的值以及计算结果的初始值)
3、指令由操作码和地址码组成
4、指令和数据用二进制表示
5、以运算器为中心(现在一般以存储器为中心)