a+1:F=A+1; b+1:F=B+1 a-1:F=A-1; b-1:F=B-1
其中A和B是ALU的输入,F是ALU的输出。假定JSR(转子 IR指令)指令占两个字,第一个字是操作码,第二个字给出
MDR子程序的起始地址,返回地址保存在主存的栈中,用SP(栈 指示器)指向栈顶,按字编址,每次从主存读取一个字。请 MAR写出读取并执行JSR指令所要求的控制信号序列(提示:当前
PC指令地址在PC中)。
SP参考答案:
假定采用同步方式(若为异步,则只需在read和Write后加一个等待信Y号WMFC)
AB分三个阶段:
ALU1. 取指令操作码:PCout, MOVb, MARin F Read, b+1, PCin
图30 MDRout, MOVb, IRin 2. 取子程序首址:PCout, MOVb, MARin Read, b+1, Yin (返回地址在Y中) MDRout, MOVb,PCin(子程序首址在PC中) 3. 保存返址至栈:SPout, MOVb, MARin Yout, MOVb, MDRin
Write, SPout, b-1, SPin
(注:若按最长的存储访问时间作为CPU时钟周期,则上述每个阶段都需三个时钟周期) 能否用更少的时钟周期完成上述功能?不能!以下是另一种方式) 1. 取指令操作码:PCout, MOVb, MARin Read, b+1, Yin MDRout, MOVb, IRin 2. 取子程序首址:Yout, MOVb, MARin Read, a+1, Yin (用b+1也行) MDRout, MOVb, PCin 3. 保存返址至栈:SPout, MOVb, MARin Yout, MOVb, MDRin
Write, SPout, b-1, Spin
5. 假定某计算机字长16位,CPU内部结构如书中图6.9所示,CPU和存储器之间采用同步方式通信,按字编址。采用定长指令字格式,指令由两个字组成,第一个字指明操作码和寻址方式,第二个字包含立即数Imm16。若一次存储访问所花时间为2个CPU时钟周期,每次存储访问存取一个字,取指令阶段第二次访存将Imm16取到MDR中,请写出下列指令在指令执行阶段的控制信号序列,并说明需要几个时钟周期。
(1)将立即数Imm16加到寄存器R1中,此时,Imm16为立即操作数。
即:R[R1]←R[R1]+ Imm16
(2)将地址为Imm16的存储单元的内容加到寄存器R1中,此时,Imm16为直接地址。
即:R[R1]←R[R1]+ M[Imm16]
(3)将存储单元Imm16的内容作为地址所指的存储单元的内容加到寄存器R1中。此时,Imm16为间接
地址。即:R[R1]←R[R1]+ M[M[Imm16]] 参考答案:
(1) MDRout, Yin
R1out, add, Zin Zout, R1in
需3个时钟周期 (2) MDRout, MARin
Read1,(R1out, Yin也可以放在该控制信号所在的时钟周期中) Read2, R1out, Yin MDRout, add, Zin Zout, R1in
需5个时钟周期
(3) MDRout, MARin
Read1 Read2
MDRout, MARin
Read1,(R1out, Yin) Read2, R1out, Yin MDRout, add, Zin Zout, R1in
需8个时钟周期
6. 假定图6.24单周期数据通路对应的控制逻辑发生错误,使得在任何情况下控制信号RegWr、RegDst、Branch、MemWr、ExtOp、R-type总是为0,则哪些指令不能正确执行?为什么?
参考答案: RegWr 总是0 则所有需写结果到寄存器的指令(如:R-Type指令、load指令等)都不能正确执行,因为寄存器不发生写操作 则所有R-Type指令都不能正确执行,因为目的寄存器指定错误 总是1 不需写结果到寄存器的指令可能会出错(如store,分支,转移指令等) 所有非R-Type指令都不能正确执行 RegDst Branch MemWr ExtOp Branch指令可能出错,因为永远不会发生转移 非Branch指令都出错,因为下条指令的地址计算错误 Store指令不能正确执行,因为存储器不能写入所需数据 非Store指令都会出错,因为存储器内会写入错误数据 需要符号扩展的指令(如Beq、lw/sw,addiu等)必须0扩展的指令会出错(比如ori) 发生错误
7. 假定图6.24单周期数据通路对应的控制逻辑发生错误,使得在任何情况下控制信号RegWr、RegDst、Branch、MemWr、ExtOp、R-type总是为1,则哪些指令不能正确执行?为什么? 参考答案:见第6题的表格.
8. 在MIPS指令集中需要增加一条swap指令,可以使用软件方式用若干条已有指令来实现伪指令,也可以通过改动硬件来实现。
(1)写出用伪指令方式实现“swap $rs, $rt”时的指令序列 (2)假定用硬件实现时会使一条指令的执行时间增加10%,则swap指令在程序中占多大的比例才值得用硬件方式来实现? 参考答案:
(1) swap指令可用以下三条指令实现。
xor $rs, $rs, $rt xor $rt, $rs, $rt xor $rs, $rs, $rt
(若使用额外寄存器$rtemp,则$rtemp内容会被破坏,所以伪指令一般不能用额外寄存器)
add $rtemp, $rs, $zero add $rs, $rt, $zero add $rt, $rtemp, $zero
(若使用加减法,,可能溢出。如使用无符号数加减法addu,subu也可以)
add $rs, $rs, $rt sub $rt, $rs, $rt add $rs, $rs, $rt
(2)假定该指令占x%,其他指令占(1-x)%
则用硬件实现该指令时, 程序执行时间为原来的1.1*(x+1-x) =1.1 倍 用软件实现该指令时,程序执行时间为原来的3x+1-x =(2x+1)倍 当1.1 < 2x+1 时,硬件实现才有意义 由此可知,x > 5%