6

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

我不想使用寄存器进行参数传递。

更新:我正在使用来自CodeSourcery的 arm-gcc

4

3 回答 3

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;
}
于 2011-01-09T18:02:22.773 回答
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 调用约定时,会允许这么多不同的调用约定?它会造成兼容性混乱。
于 2011-01-09T17:46:37.603 回答
0

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

于 2012-03-25T07:59:53.623 回答