某高级语言程序中的一个while语句为“while(save[i]==k)i+=1;”,若对其编译时,编译器将i和k分别分配在寄存器s3和s5中,数组saVe的基址存放在s6中,则生成的MIPS汇编代码如下:loop: s11 t1,s3,2 #R[t1]←R[s3]<<2,即R[t1]=i*4 add t1,t1,s6 #R[t1]←R[t1]+R[S6],即R[t1]=Address of save[i] 1w t0,0(t1) #R[t0]←M[R[t1]+0],即R[t0]=save[i] bne t0,S5,exit #if R[t0]≠R[s5] then goto exit addi s3,s3,1 #R[s3]←R[s3]+1,即i=i+1 j loop #goto loop exit: 假设从loop处开始的指令序列存放在内存80000处,则上述循环对应的MIPS机器码如图5-1所示。
问答题 MIPS的编址单位是多少?数组save每个元素占几个字节?
【正确答案】正确答案:MIPS的编址单位是字节。从图5-1可看出,每条指令32位,占4个地址,所以一个地址中有8位,因为每次循环取数组元素时,其下标地址都要乘以4,所以save数组的每个元素占4个字节。
【答案解析】
问答题 为什么指令“sll t1,s3,2”能实现4*i的功能?
【正确答案】正确答案:因为这是左移指令,左移2位,相当于乘以2 2 =4;
【答案解析】
问答题 t0和s6的编号各为多少?
【正确答案】正确答案:从图5-1中第3和第4条指令可以看出,St0的编号为8,从第2条指令可以看出$s6的编号为22。
【答案解析】
问答题 指令“j loop”的操作码是什么?(用二进制表示)
【正确答案】正确答案:指令“j loop”的操作码是“000010B”。
【答案解析】
问答题 标号exit的值是多少?如何根据指令计算得到?
【正确答案】正确答案:标号exit的值是80024,其含义是循环结束时,跳出循环后执行的首条指令地址。它由当前分支指令(条件转移指令)的地址80012加上4得到下条指令的地址,然后再加上相对位移量2×4得到,即80012+4+2×4=80024。
【答案解析】
问答题 标号loop的值是多少?如何根据指令计算得到?
【正确答案】正确答案:标号loop的值为80000,是循环入口处首条指令的地址,由跳转指令的32位地址80020的高4位(0000B),与指令中给出的低26位(20000)拼接成30位地址,然后再在低位添加两个0(相当于乘以4),得到:20000×4=80000。
【答案解析】