varargs在mips工作

时间:2011-03-08 16:00:53

标签: mips abi

根据mips abi的说法,调用者将前几个参数放在GPR中以提高性能,并且不要将这些参数推入堆栈帧。 但是当我使用varargs api(stdarg.h)定义一个带有变量参数列表的函数时,例如void func(int type,...);, api可以工作。

我发现stdarg.h apis只搜索堆栈中的参数, 如果编译器只将前几个参数推送到GPR中,为什么stdarg.h有效? 我是否想念ABI?

1 个答案:

答案 0 :(得分:2)

MIPS ELF ABI,第3-46页介绍了可变函数的约定。基本上,当被调用函数是可变参数(其声明的参数列表以'...'结尾)时,编译器会添加一些代码,这些代码将第一个参数(在寄存器中传递)写入堆栈。堆栈帧总是包含前四个参数的一些空间(正好,对于在寄存器$4中传递给$7的四个字。因此,调用者不需要知道函数是否是可变参数(除了可能的浮点参数;并且,无论如何,最好是调用者和被调用者都看到并使用相同的原型)。

如果编译C变量函数并查看生成的程序集,您将在函数开头附近看到如下行:

sw      $5,52($sp)
sw      $6,56($sp)
sw      $7,60($sp)

对应于该参数堆栈过程。