MIPS保存到地址为变量的寄存器

问题描述 投票:0回答:1

所以我正在做作业,问题是要求我将指令保存到寄存器中。这就是问题。

假设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)不会工作。我只是错过了显而易见的事吗?

mips cpu-registers
1个回答
0
投票

最简单的解决方案是将地址增加4 * 4(如果Dints数组)。

这对应于这个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;
© www.soinside.com 2019 - 2024. All rights reserved.