varargs在mips中工作

varargs在mips中工作,mips,abi,Mips,Abi,根据mips abi,调用者将前几个参数放在GPRs中以提高性能,不要将这些参数放入堆栈帧中。 但是,当我使用varargs api(stdarg.h)来定义具有变量参数列表的函数时,例如void func(int type,…);,api可以正常工作 我发现stdarg.h API只搜索堆栈中的参数, 如果编译器只将前几个参数推入GPRs,为什么stdarg.h可以工作? 我是否遗漏了ABI的一些内容?可变函数的约定在第3-46页的中进行了描述。基本上,当被调用函数是可变的(其声明的参数列表以

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

我发现stdarg.h API只搜索堆栈中的参数, 如果编译器只将前几个参数推入GPRs,为什么stdarg.h可以工作?
我是否遗漏了ABI的一些内容?

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

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

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

这与堆栈进程的参数相对应。

11.2.6,,对此有一些说法,请进一步讨论:)目前,我正在阅读一些关于MIPS ABIs和ELF格式的资料,它们填补了指令和C语言之间的空白,也填补了编译过程之间的空白。:)