2011-01-09 39 views
5

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

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

更新:使用臂-GCC我'从CodeSourcery

+3

为什么在寄存器中传递参数是一件坏事? – 2011-01-09 16:38:34

+0

这不是一件坏事。我只是希望以这种方式传递参数,因为//仿真//线程创建(和堆栈分配)例程。 – cojocar 2011-01-09 16:45:09

+0

什么架构/ ABI? – ephemient 2011-01-09 17:11:44

回答

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时,你会允许这么多不同的调用约定?它创建了兼容性混乱。
+1

是的你是对的。这很奇怪,尤其是因为你提到的原因。这个想法是,定义的函数是线程的主体 - 在自定义环境(OS)中。自定义操作系统会推动堆栈中线程的参数。为了尊重ABI,有两种解决方法:将参数放入r0或声明* thread_func(uint32_t r0,uint32_t r1,uint32_t r2,uint32_t r3,void * param)*。谢谢! – cojocar 2011-01-09 18:03:03

1

您可以尝试在结构中包装参数;另外

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个空参数使用了寄存器,因此其他参数将使用堆栈:例如,如果你的函数是int calc_my_sum(int x, int y) {return x+y;}您可以按如下改变它(丑陋的)

struct force_stack_usage { 
    int dummy0, dummy1, dummy2, dummy3; 
} 

int calc_my_sum(force_stack_usage, int x, int y) { 
    return x + y; 
} 
0

存储本地变量的位置取决于您将如何使用它。如果您需要获取本地变量的地址,则局部变量只能存储在堆栈中。所以当你传递你的子程序一个指针时,这个参数将通过堆栈传递。