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]
(在第二行),您可以再次更新它(在第四行)。
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]
(在第二行),您可以再次更新它(在第四行)。