如何在MIPS中传递10个参数?

时间:2019-03-27 16:29:53

标签: assembly parameter-passing mips procedure subroutine

point_info =''.join(point_info)

我参加了这个程序from here

假设我想添加10个值。

由于只有八个 $ s 寄存器,如何传递10个参数?

1 个答案:

答案 0 :(得分:1)

首先,您问题中的代码正在将args传递到堆栈上,而不遵循通常的C调用约定,并且未触及任何$s寄存器,所以我不明白为什么您认为这很重要。在被调用方内部使用args的方式显然受到计算机中可用寄存器数量的限制,但这与传递它们的方式是分开的。


常规MIPS调用约定在$a0..$a3 中传递args。 a代表论点。 $s寄存器是调用保留的,通常不用于arg传递。

MIPS上的标准C调用约定(如在所有常规ISA上一样)在堆栈中传递不适合寄存器的arg的args。(要么是因为它是一个很大的值结构,要么是因为已经有4个寄存器参数。)

https://godbolt.org/上为MIPS GCC查看C编译器输出,以了解传递或接收10个arg的函数,以查看在哪里寻找它们。 (也许将每个arg存储到volatile int sink中,这样您就可以进行优化编译,并且仍然可以看到它在做什么。)


很显然,如果您要在asm中给发信人和被叫人写信,您可以编排您想要的任何自定义呼叫约定。如果我想传递四个以上的寄存器参数,我认为自然的选择可能是在填充$t0..$t9之后使用$v0..$v1和/或$a0..$a3

但是可以肯定的是,如果我想传递一些只读的args来保证调用者不会感到烦恼,那么$s寄存器将适合那些。我不知道任何具有任何调用保留的arg-passing寄存器的ISA的C调用约定,但这在asm中是很有意义的。

那时候,您仅将其与一个调用者一起使用,但可能在同一功能的多个调用站点中使用它,并且可能根据对该调用者方便的方式选择寄存器。因此,这几乎不是一个独立的功能。但这很好。