43、(13分) 计算机M,字长32位,按字节编址,采用32位定长指令字。add、slli、lw三条指令的机器码、功能说明如下:
第一条是add指令R[rd]<-R[rs1]+R[rs2]
第二条是slli指令,R[rd]<-R[rs1]<<shemt
第三条是lw指令,R[rd]<-M[R[rs1]+imm]
imm是补码,shamt表示移位位数,输入端A的数据来自寄存器rs1,输入端B的数据来自rs2。电路图如下:
(1)M最多有几个寄存器,为什么shemt占5位。
(2)add指令,ALUBsrc为?若rs1为8765 4321H,rs2为9876 5432H,则add执行后,F,OF,CF为多少?若add处理的是无符号数,则应该根据哪个标志位判断溢出?
(3)执行slli时,控制信号Ext可以是0也可以是1,为什么?
(4)执行lw指令时,Ext,ALUctr 为多少?
(5)若指令的机器码是A040 A103H,则一定是lw指令,为什么?若执行该指令时,R[01H]=FFFF A2D0H,则读取数据的存储地址是多少?
【答案】
答:
(1)因为寄存器的位数是5位,所以25= 32,所以最多有32个寄存器。
因为计算机M的机器字长是32位,因此slli指令处理的操作数位数是32位,而32位操作数最多只需左移31位即可。若左移32位,会导致32bit操作数的所有有效信息位丢失。因此,shemt表示左移位数,5bit可表示范围是0~31,可以满足需求。
(2)由图可知,add指令,ALUBrc=0;
由题可知, add指令R[rd]<-R[rs1]+R[rs2]
故F=8765 4321H +9876 5432H =1FDB 9753H;
add执行后OF=1,CF=1;
因为add处理的是无符号数,故根据CF标志位判断溢出。
(3)slli指令的高12位(即IR[31:20])的最高位为0,因此无论进行零扩展还是符号扩展,都是在高位补0,效果等价,因此Ext 可以是0也可以是1。
(4)执行lw指令时,因为偏移量是补码,故Ext做的是符号扩展,故Ext=1;
因为做的是加法计算得到一个有效地址,故ALUctr=000。
(5)因为机器码A040A103H=101000000100 00001 010 00010 0000011B, 14~12位=010, 6~0位=0000011。
指令的高12位=A04H,经过符号扩展后,得到32位机器码=FFFF FA04H,读取数据的存储地址 = FFFF A2D0H + FFFF FA04H = FFFF 9CD4H。