答案 0 :(得分:2)
您可以尝试将参数包装在结构中;例如,如果您的函数是int calc_my_sum(int x, int y) {return x+y;}
,您可以按如下方式更改它(丑陋):
struct my_x_y {
int x, y;
my_x_y(): x(0), y(0) {} // a non-trivial constructor to make the type non-POD
};
int calc_my_sum(my_x_y x_and_y) {
// passing non-POD object by value forces to use the stack
return x_and_y.x + x_and_y.y;
}
或者,您可以添加4个虚拟参数来使用寄存器,因此其他参数将使用堆栈:
struct force_stack_usage {
int dummy0, dummy1, dummy2, dummy3;
}
int calc_my_sum(force_stack_usage, int x, int y) {
return x + y;
}
答案 1 :(得分:0)
根据:http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf
前四个寄存器r0-r3(a1-a4) 用于将参数值传递给 一个子程序并返回一个结果 函数的值。他们也可能 用于保存中间值 在例行公事中(但一般来说, 只在子程序调用之间。)
在ARM上,没有其他调用约定,但我知道默认值。这就是为什么:
答案 2 :(得分:0)
存储局部变量的位置取决于您将如何使用它。如果需要获取局部变量的地址,则局部变量只能存储在堆栈中。因此,当您向子例程传递指针时,此参数将通过堆栈传递。