我无法将包含对另一个函数的函数调用的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)作为函数的参数传递
任何投入都将受到赞赏。
谢谢!
答案 0 :(得分:2)
这个问题可能不属于这个网站,但这是我的意见。
sw $t0, 0($sp) # save register for use afterwards
您不需要保存$t0
,因为它被假定为被功能破坏。
move $a0, $a0
move $a1, $a1
这两个动作什么都不做,所以删除它们。
jal go
通话可能会破坏a2
和a3
。
add $t0, $a2, $a3 # register $t0 = k + l
在通话之前移动此声明,并将寄存器更改为$s0
并保存该寄存器,而不是保存$t0
。如果你这样做,a2
或a3
会因为你不再需要他们的价值而受到破坏并不重要。
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
。