这个MIPS汇编代码是否正确转换为C代码?

时间:2014-08-11 00:53:13

标签: c mips

我无法将包含对另一个函数的函数调用的C代码转换为MIPS。

以下是信息:

go 的函数声明是 int now(int i,j)。功能现在的C代码是:

int now(int i, int j, int k, int l){
    return go( go(i, j), k+l);
}

到目前为止,这是我的MIPS代码:

now:
    addi      $sp,   $sp,      -8       # adjust the stack to store 2 items
    sw        $ra,   4($sp)             # save return address of func(i, j)
    sw        $t0,   0($sp)             # save register for use afterwards
    move      $a0,   $a0
    move      $a1,   $a1
    jal       go
    add       $t0,   $a2,      $a3      # register $t0 = k + l
    move      $a1,   $t0
    jal       go
    lw        $t0,   0($sp)
    lw        $ra,   4($sp)
    addi      $sp,   $sp,      8
    jr        $ra

我遇到麻烦 go(i,j)作为函数的参数传递

任何投入都将受到赞赏。

谢谢!

1 个答案:

答案 0 :(得分:2)

这个问题可能不属于这个网站,但这是我的意见。

    sw        $t0,   0($sp)             # save register for use afterwards

您不需要保存$t0,因为它被假定为被功能破坏。

    move      $a0,   $a0
    move      $a1,   $a1

这两个动作什么都不做,所以删除它们。

    jal       go

通话可能会破坏a2a3

    add       $t0,   $a2,      $a3      # register $t0 = k + l

在通话之前移动此声明,并将寄存器更改为$s0并保存该寄存器,而不是保存$t0。如果你这样做,a2a3会因为你不再需要他们的价值而受到破坏并不重要。

    move      $a1,   $t0
    jal       go

您没有提供任何内容作为通话中的第一个参数。将上一个来电的返回值从$v0移至$a0。如上所述,使用$a1中存储的值加载$s0

    lw        $t0,   0($sp)
    lw        $ra,   4($sp)
    addi      $sp,   $sp,      4
    jr        $ra

您保存了2个寄存器,总共8个字节,但您只需将{4}添加到$sp