int a = 2, b = 3, c = 1, y = 0;
void main() {
y = a * b + c;
}
这个是以上C代码的的指令集
主存和外存的基础结构
第一步
初:(PC) = 0,指向第一条指令的存储地址
#1:(PC) → MAR,导致(MAR) = 0
#2:根据MAR找出存储体中对应的指令
#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
#7:M(MAR) → MDR,导致(MDR) = 0000000000000010 = 2
#9:(MDR) → ACC,导致(ACC) = 0000000000000010
取指令 (#1 ~ #4)
分析指令(#5)
执行取数指令(#6 ~ #9)
## 第二步
上条指令取指后自动 +1,(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)= 0000000000000011 = 3
#9:(MDR) → MQ,导致(MQ)= 0000000000000011 = 3
#10:(ACC) → X,导致(X)= 2
#11:(MQ)*(X) → ACC,由ALU实现乘法运算,导致(ACC)= 6,如果乘积太大,则需要MQ辅助存储
取指令(#1~#4)
分析指令(#5)
执行乘法指令(#6~#11)
第三步
上一条指令取指后(PC)= 2,执行后,(ACC)= 6
#1:(PC) → MAR。导致(MAR) = 2
#3:M(MAR) → MDR,导致MDR) = 000011 0000000111
#4:(MDR) → IR,导致(IR) = 000011 0000000111
#5:OP(IR) → CU,指令的操作码送到CU,CU分析后得知,这是“加法”指令
#6:Ad(IR) → MAR,指令的地址码送到MAR,导致(MAR) = 7
#8:M(MAR) → MDR,导致(MDR) = 0000000000000001 = 1
#9:(MDR) → X,导致(X) = 0000000000000001 = 1
#10:(ACC) + (X) → ACC,导致(ACC) = 7,由ALU实现加法运算
上条指令取指后(PC) = 3,执行后,(ACC) = 7,
#1:(PC) → MAR,导致(MAR) = 3
#3:M(MAR) → MDR,导致(MDR) = 000010 0000001000
#4:(MDR) → IR,导致(IR) = 000010 0000001000
#5:OP(IR) → CU,指令的送到CU,CU分析后得知,这是“存数”指令
#6:Ad(IR) → MAR,指令的地址码送到MAR,导致(MAR) = 8
#7:(ACC) → MDR,导致(MDR) = 7
#9:(MDR) → 地址为8的存储单元,导致y = 7
上条指令取指后(PC) = 4
#1:(PC) → MAR,导致(MAR) = 3
#3:M(MAR) → MDR,导致(MDR) = 000110 0000000000
#4:(MDR) → IR,导致(IR) = 000110 0000000000
#5:OP(IR) → CU,指令的操作码送到CU,CU分析后得知,这是“停机”指令
而后利用中断机制终止该进程