C转MIPS的麻烦

标签 c assembly mips

所以我已经为此工作了几天,我已经设法完成了所有的工作,除了一部分让我受不了。

int mystery(int a0)
{
    if (a0 == 0)
    {
        return 0;
    }
    else
    {
        return mystery(a0 - 1) + a0;
    }
}

我有这个递归函数和一些 MIPS 代码。 C 代码有效,但我的 MIPS 代码中某处存在问题,导致除了输入 2 之外无法正确输出。

.text

main:

li $a0, 2
jal mystery
move $a0, $v0
jal putDec
li $a0, '\n'
li $v0, 11
syscall

li $a0, 3
jal mystery
move $a0, $v0
jal putDec
li $a0, '\n'
li $v0, 11
syscall

li  $v0, 10     
syscall

putDec: 
    li $v0, 1
    syscall 
    jr  $ra     

mystery: 
 bne $0, $a0, recur 
 li $v0, 0      
 jr $ra             

  recur: 
sub $sp, $sp, 8     
sw $ra, 4($sp)  
sub $a0, $a0, 1
jal mystery         
sw $v0, 0($sp)  
jal mystery         
lw $t0, 0($sp)  
addu $v0, $v0, $t0  
addu $v0, $v0, 1    
add $a0, $a0, 1     
lw $ra, 4($sp)  
add $sp, $sp, 8     
jr $ra      

直到标签“神秘”为止的一切都很好,它只是作为一种形式实际放入参数并在之后打印。我遇到的问题是获取大于 3 的值以打印出正确的数字。如果有人能看到我在哪里犯了错误,我们将不胜感激。谢谢

最佳答案

尝试退后一步,比较 C 代码和汇编代码的结构,不要太担心细节。

在 C 代码中,有一个条件,导致基本情况(只返回一个值)或递归情况。递归情况执行减法、对 mystery 的递归调用和加法。

现在看看汇编版本:这也有一个条件导致基本情况或递归情况。但是看看递归案例的结构:那里有 两个mystery 的递归调用!这是一个强烈的暗示,它不太可能做同样的事情......

关于C转MIPS的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9864219/

相关文章:

assembly - 将二进制转换为十进制并在汇编中显示

在 C 程序中创建数据危险

assembly - 在 MIPS 中编写带有全局变量的函数?

assembly - MIPS 汇编中的 .word 指令

c - MPI 快速排序程序

C -> sizeof 字符串始终为 8

c - 如何分割一个字符?

c - 从 c 调用的汇编函数被忽略

assembly - MIPS:将两个 32 位数字相乘,得到 64 位数字

c++ - 为什么 NULL 指针在 C 和 C++ 中的定义不同?