int a = 2,b = 3,c = 1,y = 0;
void main(){
y = a * b + c;
}
以该运算为例:
编译装入内存:
内部指令运行:
步骤如下:
初:(PC)=0,指向第一条指令的存储地址
#1:(PC)——》MAR,导致(MAR)= 0
#3:M(MAR)——》MDR,导致(MDR)=000001 0000000101
#4:(MDR)——》IR,导致(IR)= 000001 0000000101
#5:OP(IR)——》CU,指令的操作码送到CU,CU分析后得知,只是“取数”指令
#6:AD(IR)——》MAR,指令的地址码送到MAR,导致(MAR)=5
#8:M(MAR)——》MDR,导致(MDR)=0000000000000010=2
#9:(MDR)——》ACC,导致(ACC)=0000000000000010=2
取指令(#1~#4) 分析指令(#5) 执行取数指令(#6~#9)
上一条指令取指后PC自动加一,(PC)=1;执行后,(ACC)= 2
#1:(PC)——》MAR,导致(MAR)=1
#3: M(MAR)——》MDR,导致(MDR)=000100 0000000110
#4:(MDR)——》IR,导致(IR)=000100 0000000110
#5:OP(IR)——》CU,指令的操作码送到CU,CU分析后得知,这是“乘法”指令
#6:Ad(IR)——》MAR,指令的地址码送到MAR,导致(MAR)=6
#8:M(MAR)——》MDR,导致(MDR)=000100 0000000110=3
#9:(MDR)——》MQ,导致(MQ)=000100 0000000110=3
#10:(ACC)——》X,导致(X)=2
#11:(MQ)*(X)——》ACC,由ALU实现乘法运算,导致(ACC)=6,如果乘积太大,如果乘积太大,则需要MQ辅助存储。
上一条指令取指后PC自动加一,(PC)=2;.........................省略!
总结:
取指令:PC——》MAR——》M——》MDR——》IR
分析指令:OP(IR)——》CU
执行指令:Ad(IR)——》MAR——》M——》MDR——》ACC