C 到 MIPS 的转换

C to MIPS conversions

int MyArray[30]; 
int n = 2;
MyArray[0] = 1;
MyArray[1] = 1;
do{
MyArray[n] = MyArray[n-1] + MyArray[n-2];
n++;
}
while(n < 30);

当我这样做时,我陷入了如何在不使用 return 地址 $ra 或 $sp 的情况下递归调用该函数的问题,因为代码实际上并没有 return 任何东西。

这是我目前的工作:

    #s1= Myarray[0]
    addi $s0, [=11=], 2  #$s0=n=2
    addi $t0, $s1,0 
    addi $t1,[=11=],1 
    sw $t1, 0 ($t0) #Myarray[0]=1
    addi $t0,$t0,4
    sw $t1, 0 ($t0) #Myarray[1]=1
    add $t0,$s0,$s1 #MyArray[n]= Myarray[0] +n
    Loop:
    addi $t2,$t0,-4
    addi $t3,$t0,-8
    lw $t4,0 ($t2)
    lw $t5,0  ($t3)
    add $t5,$t4,$t5
    sw $t5, 0 ($t0)
    addi $t0, $t0 ,4
    addi $s0,s0,4
    slti $s6,$s0,30
    beq #s6,[=11=],Exit
    j loop 
   Exit

这个代码

sw $t1, 0 ($t0) #Myarray[0]=1
addi $t0,$t0,4
sw $t1, 0 ($t0) #Myarray[1]=1
add $t0,$s0,$s1 #MyArray[n]= Myarray[0] +n

应该是

sw $t1, 0 ($t0) #Myarray[0]=1
addi $t0,$t0,4  #update 't0' to point to Myarray[1]
sw $t1, 0 ($t0) #Myarray[1]=1
addi $t0,$t0,4  #update 't0' to point to Myarray[2]

错误在最后一行。注意$s1指向数组,而$s0的值为2,所以t0=s1+s0指向t0错误的地址。你真的想要 t0=s1+(s0*4) 因为每个 int 是四个字节。

但是,由于您已经将 t0 更新为指向 Myarray[1](在第二行),您可以再次更新它(在第四行)。