gpt4 book ai didi

c - 这个从 C 代码转换而来的 MIPS 汇编代码是否正确?

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:48 25 4
gpt4 key购买 nike

我在将包含对另一个函数的函数调用的 C 代码转换为 MIPS 时遇到问题。

这是信息:

go 的函数声明是int now(int i, j)now 函数的 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) 作为函数 go 的参数传递时遇到了问题

如有任何意见,我们将不胜感激。

谢谢!

最佳答案

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

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

您不需要保存 $t0,因为它被假设为被函数破坏了。

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

这两个 Action 没有任何作用,所以删除它们。

    jal       go

调用可能会破坏 a2a3

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

在调用之前移动此语句并将寄存器更改为 $s0 并保存该寄存器而不是保存 $t0。如果您这样做,a2a3 是否被破坏并不重要,因为您不再需要它们的值。

    move      $a1,   $t0
jal go

您没有提供任何内容作为调用中的第一个参数。将上一个调用的返回值从 $v0 移动到 $a0。按照上面的建议,使用存储在 $s0 中的值加载 $a1

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

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

关于c - 这个从 C 代码转换而来的 MIPS 汇编代码是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25234477/

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