![](/img/trans.png)
[英]How can I use a comparison function with more than 2 arguments with a c++ priority queue?
[英]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.