强制gcc传递堆栈上的参数

时间:2011-01-09 16:33:27

标签: c gcc stack parameter-passing calling-convention

有没有办法强制gcc传递堆栈中函数的参数?

我不想将寄存器用于参数传递。

更新:我正在使用CodeSourcery

中的arm-gcc

3 个答案:

答案 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上,没有其他调用约定,但我知道默认值。这就是为什么:

  1. 你为什么要这样?您的函数不会被其他函数以编译形式调用,从而造成兼容性混乱。
  2. 除非编译器能够区分调用约定,否则您对符合ABI的系统函数的调用将不起作用。现在,我知道过去x86-32有不同的调用约定,但请注意x64如何更简单(AMD64与微软所做的相比)。为什么在设计ARM calling convention时,您会允许这么多不同的调用约定?它会造成兼容性混乱。

答案 2 :(得分:0)

存储局部变量的位置取决于您将如何使用它。如果需要获取局部变量的地址,则局部变量只能存储在堆栈中。因此,当您向子例程传递指针时,此参数将通过堆栈传递。