根据 mips abi,调用者将前几个参数放入 GPR 中以提高性能,并且不要将这些参数推送到堆栈帧中。 但是当我使用 varargs api(stdarg.h) 定义带有可变参数列表的函数时,例如 void func(int type, ...); ,该 api 可以工作。
我发现stdarg.h api只搜索堆栈中的参数, 如果编译器只将前几个参数插入 GPR,为什么 stdarg.h 可以工作? 我是否错过了有关 ABI 的某些内容?
最佳答案
可变参数函数的约定在MIPS ELF ABI中描述。 ,第 3-46 页。基本上,当被调用的函数是可变参数时(其声明的参数列表以“...
”结尾),编译器会添加一些代码,将第一个参数(在寄存器中传递)写入堆栈。堆栈帧始终为前四个参数(准确地说,是在寄存器 $4
到 $7
中传递的四个字)包含一些空间。因此,调用者不需要知道函数是否是可变参数(浮点参数可能除外;而且,无论如何,最好调用者和被调用者都看到并使用相同的原型(prototype))。
如果您编译 C 可变参数函数并查看生成的程序集,您将在函数开头附近看到如下行:
sw $5,52($sp)
sw $6,56($sp)
sw $7,60($sp)
对应于参数到堆栈的过程。
关于mips - 可变参数在 mips 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5234959/