C 嵌套函数调用
我正在尝试将C代码转换为MIPS代码C 嵌套函数调用,c,assembly,mips,mips32,nested-function,C,Assembly,Mips,Mips32,Nested Function,我正在尝试将C代码转换为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,
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
问题是,在您从乘法返回后,您仍然在下一行调用减法。调用multiply后,必须从函数测试返回。 但是,由于函数调用都是函数的最后一条指令,因此可以使用以下快捷方式:
test:
slt $s1,$a1,$a0
bne $s1, 1, ELSE
j multiply
ELSE: j subtract
这样,您不必在堆栈中存储$ra,但可以直接使用它跳回减法和乘法的jr$ra
中的test调用方。这样,它应该按预期工作
或者,从乘法返回后跳过jal subtract
:
jal multiply
j OUT
ELSE: jal subtract
OUT: ...
谢谢你的快速回复,但我必须使用堆栈,因为这是我的作业:)@mekafe好的,然后使用另一种方法,要点是:从乘法返回后不要跳转到减法。这不是嵌套函数。这将是
int foo(){int nested(){return 1;}blah blah foo();blah foo();}
,其中nested()
可以访问foo
中的局部变量。GCC支持以下内容:。您所做的只是从一个函数调用函数。这很正常。不进行任何调用的函数称为叶函数(它们是调用树的叶)。所以你真的在问如何在MIPS中编写非叶函数。