[C到MIPS嵌套过程的代码转换问题

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

我需要翻译一段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的问题,有人可以解决这个问题,这会很棒。

c mips code-translation
1个回答
0
投票

您正在分支到assess,而不是像通过jal进行调用一样。因此,在输入$raassess中没有适当的值,以便在完成后返回main时使用。

您(几乎)正确地保存了$ra并在以后进行恢复,但是它最初并没有什么价值,因此保存和还原(将需要使用)仍然无济于事。

您应该在压入时从堆栈中弹出尽可能多的字节,即压入8,但仅弹出4。

尽管您确实保存了$s3,但您也没有恢复它。

您可能将$ra视为传递给函数的参数,并在函数输入时和函数执行期间检查其值,以查看哪里变得不正确。传递给被调用方的值应该是调用方中返回点的地址-代码地址。

© www.soinside.com 2019 - 2024. All rights reserved.