所以我正在做作业,一个问题是要我将指令保存到寄存器中。这就是问题。
假设a,b,i和j的值分别在寄存器$ s0,$ s1,$ t0和$ t1中。另外,假定寄存器$ s2保留数组D的基地址。
for(i=0; i<a; i++)
for(j=0; j<b; j++)
D[4*j] = i + j;
必须用MIPS编写,我几乎有90%的问题将i + j的结果保存为D [4 * j]。这是我在嵌套循环内的代码。
add $t2, $t0, $t1 # add i to j and store to temp
sll $t3, $t1, 4 # offset of j*4
add $t3, $s2, $t3 #add offset with base of D
通常,其他问题给了我地址的值,例如B [8],所以我只使用常数32。但是使用变量保存时,我不确定如何执行此操作,因为它需要一个不变。
我几乎可以肯定sw $t2, 0($t3)($s2)
不起作用。我只是想念明显的东西吗?
答案 0 :(得分:0)
最简单的解决方案是将您的地址增加4 * 4(如果D
是int
的数组)。
这对应于此C代码:
for(int i=0; i<a; i++)
for(int j=0, int *pd=&D[0]; j<b; j++,pd+=4)
*pd=i+j;
根据您的假设可以实现mips
假设a,b,i和j的值分别在寄存器$ s0,$ s1,$ t0和$ t1中。另外,假定寄存器$ s2保留数组D的基地址。
add $t0,$r0,$r0 #j=0
loopi:
addi $t1,$r0,$r0 #j=0
mov $t3,$s2 #$t3=@D
loopj:
add $t2, $t0, $t1#add i to j and store to temp
sw $t2, 0($t3) #store result in *t3
addi $t3, 16 #t3+=4
addi $t1, 1 #j++
blt $t1,$s1,loopj#j<b?
addi $t0,1 #i++
blt $t0,$s0,loopi#i<a?
顺便说一句,j
循环会为连续的D
覆盖先前的ì
值,并且只有最后一个值会保留在D
中。也许您的代码是错误的。或者可以将其替换为
for(int j=0; j<b; j++)
D[4*j]=a-1+j;