繁体   English   中英

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

[英]How do I add more than 4 arguments to a function in MIPS?

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

但是,我对如何继续添加其他参数完全不知所措,我记得含糊地将其保存在堆栈中,但是我不记得要这样做的代码。

祝您好运, Raymond Chen最近(至少对于新台币)一直在博客中撰写有关此主题的文章。

在某些MIPS调用约定中,至少在Linux和NT中,即使函数接受少于4个寄存器args,它们也始终在堆栈上获得16个字节的“本地空间”。 在堆栈上,第5个及以后的整数arg高于该整数。

其他参数在堆栈上传递:

$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

重要:

允许具有至少一个参数的AC / C ++函数覆盖$sp+0处的内存。 具有至少两个参数的AC / 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM