书籍 + 笔记 补充的形式完成计网的学习,不做无用功

计算机系统概述

计算机的工作过程

名词解释

运算器:

  • ACC:==累加器==,存放操作数或运算结果
  • MQ:==乘商寄存器==,在乘除运算时,用于存放操作数和运算结果
  • X:统一的==操作数寄存器==,用于存放操作数
  • ALU:==算数逻辑单元==,实现算术运算和逻辑运算

控制器:

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

主存:

  • 存储体:存放指令和数据
  • MAR:==地址寄存器==,存放访存地址
  • MDR:==数据寄存器==,暂存要从存储器中读或写的信息

指令执行过程

(寄存器) 指该寄存器里边的内容,M指主存储器,M(MAR)指主存储器中MAR对应的地址所指明的数据,→MDR指存入MDR

1
2
3
4
int a = 2, b = 3, c = 1, y = 0;
void main() {
y = a * b + c;
}

第一条指令(取数):

取指令(#1~#4):

  • 指令和变量的数据存放在存储体中

  • 程序运行之前,PC指向0号位置(第一条指令的存储地址)

  • 接下来,我们应当把该位置存放的指令取出来并执行

    • PC存放的内容需要通过==地址总线==把它传送到MAR中 → MAR中的值变为0(即控制器向主存指明了接下来要访问的是0号地址所对应的数据,#1)
    • 控制器通过==控制总线==告诉主存储器:这次进行的是读操作
    • 主存储器根据MAR记录的地址,去存储体里找出0号地址对应的二进制数据,把它们放入MDR(现在MDR里存放的就是我们想要读取的第一条指令,#3)
  • MDR中的指令通过==数据总线==放入IR(#4)

  • PC的值自动加1

分析指令(#5):

  • 指令的操作码传送至CU,CU分析后得知这是一条“取数”的指令(#5)

执行取数指令(#6~#9):

  • 把地址码所指明的内存单元中的数据取出,放入ACC
    • 把地址码放入主存的MAR中 → MAR = 5(#6)
    • 主存储器根据这个地址去存储体中找出数据,放入MDR中(#8)
    • 在CU指挥下,MDR中的数据被传到ACC(#9)

第二条指令(相乘):

取指令(#1~#4)步骤相同

分析指令(#5):

  • 指令的操作码传送至CU,CU分析后得知这是一条“乘法”的指令(#5)

执行乘法指令(#6~#11):

  • 取出b的步骤相同,但不同的是,b会从MDR传到MQ中(#9)
  • 把a的值先放到X中(cpu执行乘法操作时,会先把被乘数放到X中,把乘数放到MQ中,#10)
  • CU通过控制线告诉ALU,让它进行乘法运算
  • ALU进行相乘操作,把结果放到ACC中(#11),如果数很大导致ACC存不下,就需要MQ的辅助存储:MQ存放乘法运算结果的低位

第三条指令(相加):

取指令(#1~#4)步骤相同

分析指令(#5):“加法”指令

  • 取出c的步骤相同,但不同的是,c会从MDR传到X中(cpu执行加法操作时,ACC里先存入被加数,X中存放加数,#9)
  • CU通过控制线告诉ALU,让它进行加法运算
  • ALU执行相加操作,把结果再次存入ACC中

第四条指令(存数):

取指令(#1~#4)步骤相同

分析指令(#5):“存数”指令

  • 将指令的地址码送到MAR,指明这次存入哪一个存储单元
  • 把ACC中结果通过==数据总线==传入MDR中,此时MDR中保存了a*b+c的值,并且MAR指明了该值要存到地址为8的地方
  • CU通过==控制总线==告诉主存储器:这次进行存数操作
  • 主存储器根据MAR指明的地址,把MDR中的数据放到相应位置当中(8号存储单元的值变为2*3+1 = 7)

第五条指令(停机):前边类似,最后执行操作系统相关的指令,停机