MIPS嵌套函数调用

问题描述:

我试图将C代码转换为MIPS代码。MIPS嵌套函数调用

int main() { 
    int a; 
    int b; 
    int result = 0; 
    if (a != b) 
    result = test(a, b); 
    else 
    result = a + b; 
    return result; 
} 
int test(int a, int b) { 
    if (a > b) 
    return multiply(a, b) 
    else 
    return subtract(a, b) 
} 
int multiply(int a, int b) { 
    return a * b; 
} 
int subtract(int a, int b) { 
    return a - b; 
} 

此代码包含测试函数内部的嵌套函数调用。 我已经把测试函数的返回地址放入堆栈,并试图将相减或相乘的值返回给main。

但在我的情况下,我的代码执行减法和乘法函数。 我试图把我的结果给s0。运行s0后总是显示减值。如果我把乘法结果放到s1,s1显示真值。

我认为减法函数覆盖s0的值。但是,当案件繁多时,为什么减法被调用?我有一个if/else块,但这部分似乎不起作用。

这是我的MIPS代码,我做错了什么?

.data 
    numberA: .word 4 
    numberB: .word 2 
.text 
.globl main 

    main: 
    addi $s0, $0, 0 # result = 0 
    lw $a0, numberA 
    lw $a1, numberB 

    bne $a0, $a1, L1 
    add $s0, $a0, $a1 
L1: jal test 

    add $s0, $v0, $0 

    li $v0,10 
    syscall 


test: 
     addi $sp, $sp, -4 
     sw $ra, 0($sp) 

     slt $s1,$a1,$a0 
     bne $s1, 1, ELSE 
     jal multiply 
ELSE: jal subtract 

lw $ra, 0($sp) 

addi $sp, $sp, 8 

jr $ra 


subtract: 
    sub $s0, $a0, $a1 
    jr $ra 


multiply: 
    mult $a0, $a1 
    mflo $s0 
    jr $ra 
+0

这不是一个嵌套函数。这将是'int foo(){int nested(){return 1;}等等等等等等。 blah foo(); },其中'nested()'可以访问'foo'中的局部变量。 GCC支持: https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html。你在做什么只是从一个函数进行函数调用。这很正常。不进行任何调用的函数称为叶函数(它们是调用树的叶)。所以你真的在问如何在MIPS中编写非叶函数。 –

的问题是,当您从回,你仍然电话下一行。在调用乘以后,您必须从功能测试返回。 然而,由于函数调用你的函数双方的最后一条指令,你可以使用下面的快捷键:

test: 
     slt $s1,$a1,$a0 
     bne $s1, 1, ELSE 
     j multiply 
ELSE: j subtract 

这样,您就不必存储$ RA中的筹码,但你可以直接用它jr $ra的减跳回到呼叫者测试的。这样它应该按预期工作。

或者,跳过jal subtract从乘法返回后:

 jal multiply 
     j OUT 
ELSE: jal subtract 

OUT: ... 
+0

感谢您的快速回复,但我必须使用堆栈,因为这是我的作业:) – mekafe

+1

@mekafe好的,然后使用替代方法,重点是:不要从乘法返回后跳到减法 – Ctx