各个部件
- 运算器
用于实现算术运算(加减乘除)、逻辑运算(与或非) - 控制器
用于控制程序执行的顺序 - 存储器
用于存放数据
CPU = 运算器 + 控制器
主机 = CPU + 存储器(内存)
外设 = 输入设备 + 输出设备 + 辅助存储器(磁盘)
运算器
- ACC
- MQ
- X
- ALU
它们之间的关系以及运算器的逻辑图如图1所示。
控制器
- IR(Instruction Register):指令寄存器,作用是解析指令。
- PC(Program Counter):程序计数器,作用是记录每条指令的地址,自增。
- CU(Control Unit):控制单元,作用是执行指令。
主存储器(内存)
- MAR(Memory Address Register):内存地址寄存器,保存数据被传输到的位置的地址或者数据来源位置的地址。
- MDR(Memory Data Register):内存数据寄存器,保存要被写入地址单元或者从地址单元读出的数据。
高级语言到汇编语言
以一个具体的例子进行分析
// 省略头文件
int a=2,b=3,c=1,y=0;
void main()
{
y=a*b+c;
}
发送给CPU的机器指令如图2所示。
图2给出了高级语言转换之后的汇编语言,最左边一栏是地址,中间是指令(16位),最后一栏是注释(方便解释使用,实际汇编语言中没有)。这里也可以看到指令的操作和数据是存放在一起的,0-4地址存储的是指令,5-8地址存储的是数据。
图3给出了所有的过程。
图中绿色的序号对应下面步骤的序号。
- 初始时,(PC)=0,程序计数器指向地址0,指向第一条指令的存储地址
- #1:(PC)–>MAR,导致(MAR)=0
- #2 #3:M(MAR)–>MDR,MAR去存储体中寻找地址为0的指令,并将指令的内容写入MDR中,导致(MDRR=000001 000000101
- #4 (MDR)–>IR,MDR将数据通过数据总线传输给IR,导致(IR)=000001 000000101
- #5 IR分析指令,发现指令的操作码OP(IR)=000001,并传输给CU,即OP(IR)–>CU,CU分析后得知"000001"是取数指令。
- #6 AD(IR)–>MAR,指令寄存器告诉MAR需要取出"000000101"地址的值,导致(MAR)=000000101
- #7#8 MAR去存储体中寻找,并将结果写入到MDR中,导致(MDR)=0000000000000010=2
- #9 (MDR)—>ACC,MDR将数据通过数据总线传输到ACC,导致ACC=2
以上步骤中,取指令(#1~#4),分析指令(#5),执行取数指令(#6~#9)