某高级语言程序中的一个while语句为“while(save[i]=k) i+=1;”,若对其编译时,编译器将i和k分别分配在寄存器s3和s5中,数组save的基址存放在s6中,则生成的MIPS汇编代码如下:loop: sll t1,s3, 2 #R [ tl]←R [s3 ]<<2,即 R [t1]=i*4add t1, t1, s6 #R [ t1]←R [ t1]+R [s6] ,即 R [t1] =Address of save [i]t0, 0 (t1) #R [t0]←M [R [t1] +0], gp R[t0] =save [i]bne . t0,s5f exit #if R[t0]≠R[s5] then goto exitaddi s3, s3,1 #R [s3]←R [s3]+1,即 i=i+lj loop #goto loopexit;假设从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条指令可以看出,$t0的编号为8,从第2条指令可以看出$s6的编号为22。
【答案解析】
问答题 指令“jloop”的操作码是什么?(用二进制表示)
【正确答案】正确答案:指令“j loop”的操作码是“000010B”。
【答案解析】
问答题 标号exit的值是多少?如何根据指令计算得到?
【正确答案】正确答案:标号exit的值是80024,其含义是循环结束时,跳出循环后执行的首条指令地址。它由当前分支指令(条件转移指令)的地址80012加上4得到下条指令的地址,然后再加上相对位移量2x4得到,即80012+4+2×4=80024。
【答案解析】
问答题 标号loop的值是多少?如何根据指令计算得到?
【正确答案】正确答案:标号loop的值为80000,是循环入口处首条指令的地址,由跳转指令的32位地址80020的高4位 0000B),与指令中给出的低26位(20000)拼接成30位地址,然后再在低位添加两个0(相当于乘以4),得到:20000×4=80000。
【答案解析】