好吧,所以我要翻译这段C++代码
funcArr2(12,a2,a3,a4,used1,used2,&used4 3,&used4 4);
到目前为止,我已经把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
然而,对于如何继续添加其他参数,我完全不知所措,我隐约记得必须将其保存在堆栈中,但我不记得要这样做的代码。
发布于 2018-04-25 05:14:14
幸运的是,陈雷蒙德最近一直在写这方面的博客(至少对NT来说是这样),并详细介绍了这个主题。
在一些MIPS调用约定中,至少Linux和NT,函数总是在堆栈上获得16字节的“归属空间”,即使它们接受少于4个寄存器args。在堆栈上,第五个或更高的整数arg高于该整数。
发布于 2018-04-25 05:54:25
其他参数在堆栈上传递:
$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
https://stackoverflow.com/questions/50011688
复制相似问题