我需要翻译一段C代码
int main(){
int a, b, result;
if(a == b)
result = a*b;
else
result = assess(a, b);
return result;
}
int assess(int a, int b){
if(b<a)
return upgrade(a, b);
else
return demote(a, b);
}
int upgrade(int a, int b)
{return 4*(a+b);}
int demote(int a, int b)
{return 4*(b-a);}
a和b将针对a = 8 b = 8 a = 3 b = 5 a = 5 b = 3进行测试这是我尝试过的
.text
main:
add $s0,$s0,5
add $s1,$s1,3
add $s3,$s3,0
beq $s0,$s1,Resultmul
bne $s0,$s1,assess
li $v0, 10
syscall
assess:
addi $sp,$sp,-8
sw $s3,0($sp)
sw $ra,4($sp)
jal upgrade
lw $ra,4($sp)
add $sp,$sp,4
jr $ra
Resultmul :
mul $s3,$s1,$s0
li $v0, 10
syscall
upgrade:
add $s3,$s0,$s1
mul $s3,$s3,4
jr $ra
demote:
sub $v0,$s1,$s0
mul $v0,$v0,4
jr $ra
但是在评估程序中它陷入了jr $ ra的问题,有人可以解决这个问题,这会很棒。
您正在分支到assess
,而不是像通过jal
进行调用一样。因此,在输入$ra
时assess
中没有适当的值,以便在完成后返回main
时使用。
您(几乎)正确地保存了$ra
并在以后进行恢复,但是它最初并没有什么价值,因此保存和还原(将需要使用)仍然无济于事。
您应该在压入时从堆栈中弹出尽可能多的字节,即压入8,但仅弹出4。
尽管您确实保存了$s3
,但您也没有恢复它。
您可能将$ra
视为传递给函数的参数,并在函数输入时和函数执行期间检查其值,以查看哪里变得不正确。传递给被调用方的值应该是调用方中返回点的地址-代码地址。