计算机工作流程
基础知识:
cpu包括运算器和控制器
运算器:
ACC 累加,存放操作数或者结果
MQ 乘商相关寄存器存操作数或结果
ALU 算术逻辑单元
x 通用操作数寄存器,存放操作数
控制器:
PC 程序计数器 存放下一条指令地址,有自加1
IR 指令寄存器,存放当前执行指令
CU 控制单元,分析指令给出控制信号
主存储器:
存储体
MAR address
MDR data
计算机的工作过程
int a=2,b=3,c=1,y=0;
void main(){
y=a*b+c;
}
1.首先,控制器里面PC读取下一条指令地址,从(PC)=0,指向第一条指令的存储地址,(PC)—>MAR,导致MAR=0;就是主存地址0,M(MAR)—>MDR.导致(MDR)=000001 0000000101 这是地址为0时,对应在存储体中的数据,放在MDR中所以MDR里面是000001 0000000101 。(MDR)—>IR 导致(IR)=000001 0000000101.类似把MDR里面的值赋给IR,IR是存放当前指令地址的。OP(IR)—>CU,就是把IR中的操作码000001送给CU,CU分析,知道000001是取数指令,AD(IR)—>MAR,把IR中的地址码部分送到MAR,(MAR)=0000000101=5, M(MAR)—>MDR.导致(MDR)=000000 0000000010=2,(MDR)—>ACC 把MDR的值送到ACC存放结果。(ACC)=2,然后取指操作后(就是完成(MDR)—>IR)PC程序计数器+1
2.在取指操作后(就是完成(MDR)—>IR),PC自加1,(PC)=1,指向第二条指令的存储地址,(PC)—>MAR,导致MAR=1;就是主存地址1,M(MAR)—>MDR.导致(MDR)=000010 0000000110,这是地址为1时,对应在存储体中的数据,放在MDR中所以MDR里面是000010 0000000110。(MDR)—>IR , 导致(IR)=000010 0000000110.类似把MDR里面的值赋给IR,IR是存放当前指令地址的。OP(IR)—>CU,就是把IR中的操作码000010送给CU,CU分析,知道000010是乘法指令,,AD(IR)—>MAR,把IR中的地址码部分送到MAR,(MAR)=0000000110=6, M(MAR)—>MDR.导致(MDR)=000000 0000000011=3,(这就是另外一个乘数),(MDR)—>MQ,MQ是用于乘商,(MQ)=3;然后(ACC)—>x,x是通用寄存器,(x)=2, ALU实现乘法运算,两个乘数就是x,MQ,结果放在ACC,(MQ)*(x)—>ACC (ACC)=3*2=6; (MQ的作用:当乘数过大,ACC里面放结果不够用,将结果低位放在MQ中)
3.在取指操作后(就是完成(MDR)—>IR),PC自加1,(PC程序计数器+1) (PC)=2, (PC)—>MAR, MAR=2,主存地址就是2 ,M(MAR)—>MDR.导致(MDR)=000011 0000000111,这是地址为2时,对应在存储体中的数据,放在MDR中所以MDR里面是000011 0000000111。(MDR)—>IR (IR)=000011 0000000111, OP(IR)—>CU, 000011送给CU,CU分析出,这是加法指令, AD(IR)—>MAR,把IR中的地址码部分送到MAR,(MAR)=0000000111=7, M(MAR)—>MDR, (MDR)=000000 0000000001=1 ,根据前面分析出是加法,(MDR)—>x,把一个加数放到通用寄存器x,然后ALU实现加法运算,(ACC)+(x)—>ACC,导致 (ACC)=6+1=7;
4.在取指操作后(就是完成(MDR)—>IR),PC自加1,(PC程序计数器+1) (PC)=3, (PC)—>MAR,(MAR)=3; M(MAR)—>MDR.导致(MDR)=000010 0000001000,这是地址为3时,对应在存储体中的数据,放在MDR中所以MDR里面是000010 0000001000。(MDR)->IR (IR)=000010 0000001000, OP(IR)—>CU, 000010 送给CU,CU分析出,这是存数指令,就是把ACC的值赋给IR地址码所对应的主存地址对应的指令地址。AD(IR)->MAR,(MAR)= 0000001000=8; ( M(MAR)->MDR.就是八号主存地址对应的指令地址(MDR)=000000 0000000000 这一步操作就是把(MAR)=8对应的MDR的值拿到 ),而本次CU分析出的指令是存数指令,不需要考虑该位置之前的值,所以不需要进行这步操作。直接 (ACC)->MDR,将ACC的值放到MDR中,MDR还需要把数存到存储体中实现存数。(MDR)->地址为8的存储单元,此时存储在存储体中。
5.在取指操作后(就是完成(MDR)—>IR),PC自加1,(PC程序计数器+1) (PC)=4,(PC)->MAR.(MAR)=4,M(MAR)->MDR,导致(MDR)=000110 0000000000,这是地址为4时,对应在存储体中的数据,放在MDR中所以MDR里面是000110 0000000000。MDR)->IR (IR)=000110 0000000000, OP(IR)—>CU, 000110 送给CU,CU分析出,这是停机指令 ,之后就是利用中断机制通知操作系统终止该进程。
从(PC)=0开始
(PC)->MAR.
M(MAR)->MDR
(MDR)->IR
OP(IR)->CU //取前面的操作码送到CU判断是什么指令
AD(IR)->MAR //将地址码部分给MAR
M(MAR)->MDR //地址码对应的指令地址
如果是取数
(MDR)->ACC
如果是乘法,MDR就是另外一个乘数,要放在对应乘商寄存器,而原来放在ACC的乘数要放在通用寄存器x,通过ALU实现乘法操作,结果放在ACC
(MDR)->MQ
(ACC)->x
(MQ)*(x)->ACC
如果是加法 ,MDR中就是另外一个加数,要放在通用寄存器x中
(MDR)->x
(ACC)+(x)->ACC
如果是存数
M(MAR)->MDR //地址码对应的指令地址
这一步不需要
只需要:
(ACC)->MDR
(MDR)->存储单位为(MAR)=x的存储单元,此时存储在存储体中
如果是停机指令
从(PC)=0开始
(PC)->MAR.
M(MAR)->MDR
(MDR)->IR
OP(IR)->CU //取前面的操作码送到CU判断是什么指令
分析出是停机指令,后续就不需要进行,采用中断机制通知操作系统终止该进程。