gpt4 book ai didi

c - MIPS 嵌套函数调用

转载 作者:太空宇宙 更新时间:2023-11-04 02:28:53 25 4
gpt4 key购买 nike

我正在尝试将 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, 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 处的值。但是当 case 是 multiply 时,为什么要调用 subtract 方法呢?我有一个 if/else block ,但这部分似乎不起作用。

这是我的 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 返回后,您仍然在下一行调用subtract。您必须在调用 multiply 之后从函数 test 返回。但是,由于函数调用都是函数的最后一条指令,因此您可以使用以下快捷方式:

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

这样,您不必将 $ra 存储在堆栈中,而是可以直接使用它跳回到 testcaller jr $ra 减法乘法。这样它应该会按预期工作。

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

       jal multiply
j OUT
ELSE: jal subtract

OUT: ...

关于c - MIPS 嵌套函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46789633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com