计算机组成与设计(二)——算术逻辑运
算术运算
计算机结构的简化模型(模型机)
演示实例一
以add $8,$9,$10(格式被Latex强行改变,不知道怎么办555。。。)演示加法运算
1、首先取指令,即得到得到指令的编码
- 查指令编码表知opcode = 0,function = 0x20,shamt = 0(非移位指令)
- opcode = 0说明这是一个R型指令(其实,所有的R型指令opcode都为0,所有opcode=0的指令也都是R型指令),根据指令操作数得到:rd = 8(目的寄存器),rs = 9(第一个源寄存器),rt=10(第二个源寄存器)
2、进行运算
CPU通过取指,就会把这条指令从内存中取出,并放入IR寄存器中,也就是指令编码的寄存器。指令译码将指令指定的寄存器(9号和10号)通过内部总线传到ALU,控制电路还会将ALU的输出通过总线传送到8号寄存器的输入。
像这样两个源寄存器、一个目的寄存器的指令编码称为R型指令,还有:
add rd,rs,rt //产生溢出时,会向控制器报告异常,由控制器进行相关联的处理
addu rd,rs,rt //发生溢出时不会报告异常
sub rd,rs,rt
subu rd,rs,rt
演示实例二
这里的源操作数都是寄存器,若有一个源操作数是立即数的话,就需要采用另一种指令——I型指令。
以add $$21,$22,-50为例
1、首先取指令,即得到得到指令的编码
- 查指令编码表得到opcode = 8
- 分析指令得到rs = 22(源寄存器编号),rt = 21(目的寄存器编号),immediate = -50(立即数)
2、执行过程如图,与上面的类似
这样的I型指令还有
addi rt,rs,imm #R[rt] = R[rs] + SignExtImm(符号扩展)
addiu rt,rs,imm #R[rt] = R[rs] + SignExtImm(符号扩展)
逻辑运算指令
R型
and rd,rs,rt #R[rd] = R[rs] & R[st]
or rd,rs,rt #R[rd] = R[rs] | R[rt]
nor rd,rs,rt #R[rd] = ~(R[rs] | R[rd])
I型
andi rt,rs,imm #R[rt] = R[rs] & ZeroExtImm(0扩展)
ori rt,rs,imm #R[rt] = R[rs] | ZeroExtImm(0扩展)
注意:在算术运算中,立即数都是采用符号扩展,而在逻辑运算中,立即数采用0扩展,这也很容易理解,因为算术运算要保证数值的正确性,如符号扩展不会改变数值大小。
个性签名:时间会解决一切