如何在MIPS中为函数添加4个以上的参数?

时间:2018-04-24 22:42:04

标签: c++ assembly mips calling-convention mips32

好的,所以我要翻译这个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

但是,我完全不知道如何继续添加其他参数,我记得模糊地将其保存在堆栈中但是我不记得要执行此操作的代码。

2 个答案:

答案 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