mips - 可变参数在 mips 中工作

标签 mips variadic-functions abi

根据 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/

相关文章:

c++ - 在共享库的公共(public)接口(interface)中隐藏 boost::serialisation

assembly - MIPS中基于指针的阵列访问

c - 使用三元运算符将 C 语言转换为 MIPS

arrays - MIPS 钻石分选

c++ - 是否有使用带有引用参数的可变参数的陷阱

linux - 汇编 - 将参数传递给函数调用

c++ - MIPS 模拟器 --- 将指令读入内存 (C++)

Swift - 有没有办法检查是否未使用可变参数?

c - 可变记录器调度程序

swift - 分发用 Swift 编写的通用框架