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);
当我这样做时,我陷入了如何在不使用返回地址 $ra 或 $sp 的情况下递归调用该函数的问题,因为代码实际上并没有返回任何东西。
这是我到目前为止的工作:
#s1= Myarray[0]
addi $s0, $0, 2 #$s0=n=2
addi $t0, $s1,0
addi $t1,$0,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,$0,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]
(在第二行),您可以再次更新它(在第四行)线)。
关于C 到 MIPS 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28680966/