可变参数在 mips 中工作

发布于 2024-10-20 15:24:57 字数 241 浏览 8 评论 0原文

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

我发现 stdarg.h api 只搜索堆栈中的参数, 如果编译器只将前几个参数推入 GPR,为什么 stdarg.h 可以工作? 我是否错过了有关 ABI 的某些内容?

According to mips abi, caller put the first few arguments in GPRs for performance, and don't push these arguments into stack frame.
but when i use varargs api(stdarg.h) to define a function with variable argument list, such as void func(int type, ...);, the api works.

I find out stdarg.h apis only search the arguments in stack,
If the compiler only push the first few argument into GPRs, why does stdarg.h work?
did i miss something about the ABIs?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

断舍离 2024-10-27 15:24:57

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

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

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

对应于参数到堆栈的过程。

Conventions for variadic functions are described in the MIPS ELF ABI, page 3-46. Basically, when the called function is variadic (its declared argument list ends with a '...'), then the compiler adds some code which writes the first arguments (passed in registers) into the stack. The stack frame always includes some space for the first four arguments (precisely, for the four words which are passed in registers $4 to $7). Thus, the caller needs not be aware of whether the function was variadic or not (except possibly for floating point arguments; and, anyway, it is best if both caller and callee see and use the same prototype).

If you compile a C variadic function and look at the produced assembly, you will see, near the beginning of the functions, lines like:

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

which correspond to that argument-to-stack process.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文