好的,所以我要翻译这个C ++代码
funcArr2(12,a2,a3,a4,used1,used2,& used3,& used4);
我到目前为止已经能够用
翻译a1-a4了 li $a0, 12
addi $a1, $sp, 280
addi $a2, $sp, 328
addi $a3, $sp, 376
**missing code for arguments 5-8**
jal funcArr2
但是,我完全不知道如何继续添加其他参数,我记得模糊地将其保存在堆栈中但是我不记得要执行此操作的代码。
答案 0 :(得分:2)
你很幸运,Raymond Chen最近一直在写博客(至少是NT),并详细介绍了这个主题。
在一些MIPS调用约定中,至少Linux和NT函数总是在堆栈上获得16个字节的“home space”,即使它们接受少于4个寄存器args。第5个及以后的整数arg高于堆栈上的那个。
答案 1 :(得分:0)
其他参数在堆栈上传递:
$sp+16
处的内存包含第5个参数,$sp+20
处的内存包含第6个参数,依此类推......
示例:强>
; myFunction(1,2,3,4,5,6,7)
addiu $sp, $sp, -28
...
li $a0, 5
sw $a0, 16($sp)
li $a0, 6
sw $a0, 20($sp)
li $a0, 7
sw $a0, 24($sp)
li $a0, 1
li $a1, 2
li $a2, 3
li $a3, 4
jal myFunction
重要:强>
允许具有至少一个参数的C / C ++函数覆盖$sp+0
处的内存。允许具有至少两个参数的C / C ++函数覆盖$sp+4
处的内存,依此类推......
因此,如果您“简单地”通过以下方式使用两个参数调用函数:
li $a0, 12
li $a1, 34
jal someFunction
...可能该函数将覆盖堆栈位置$sp+0
... $sp+7
。
因此,即使调用只有两个参数的函数,也必须确保可以覆盖这些堆栈位置:
addiu $sp, $sp, -8
...
li $a0, 12
li $a1, 34
jal someFunction