首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MIPS中向函数添加4个以上的参数?

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

Stack Overflow用户
提问于 2018-04-24 22:42:04
回答 2查看 1.8K关注 0票数 0

好吧,所以我要翻译这段C++代码

funcArr2(12,a2,a3,a4,used1,used2,&used4 3,&used4 4);

到目前为止,我已经把a1-a4翻译成

代码语言:javascript
运行
复制
        li $a0, 12
        addi $a1, $sp, 280
        addi $a2, $sp, 328
        addi $a3, $sp, 376
        **missing code for arguments 5-8**
        jal funcArr2

然而,对于如何继续添加其他参数,我完全不知所措,我隐约记得必须将其保存在堆栈中,但我不记得要这样做的代码。

EN

回答 2

Stack Overflow用户

发布于 2018-04-25 05:14:14

幸运的是,陈雷蒙德最近一直在写这方面的博客(至少对NT来说是这样),并详细介绍了这个主题。

在一些MIPS调用约定中,至少Linux和NT,函数总是在堆栈上获得16字节的“归属空间”,即使它们接受少于4个寄存器args。在堆栈上,第五个或更高的整数arg高于该整数。

票数 2
EN

Stack Overflow用户

发布于 2018-04-25 05:54:25

其他参数在堆栈上传递:

$sp+16的内存包含第5个参数,$sp+20的内存包含第6个参数,等等。

示例:

代码语言:javascript
运行
复制
; 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上的内存,等等。

因此,如果您“简单地”使用两个参数调用函数,方法如下:

代码语言:javascript
运行
复制
li $a0, 12
li $a1, 34
jal someFunction

..。可能是该函数将覆盖堆栈位置$sp+0.$sp+7

因此,即使调用只有两个参数的函数,也必须确保这些堆栈位置可能被覆盖:

代码语言:javascript
运行
复制
addiu $sp, $sp, -8
...
li $a0, 12
li $a1, 34
jal someFunction
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50011688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档