2011-01-09 38 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

存儲本地變量的位置取決於您將如何使用它。如果您需要獲取本地變量的地址,則局部變量只能存儲在堆棧中。所以當你傳遞你的子程序一個指針時,這個參數將通過堆棧傳遞。