回答
據:http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf
第一四個寄存器R0-R3(A1〜A4) 用於傳遞參數值寫入 一個子程序並返回一個函數的結果 值。它們也可以用 來保存程序中的中間值 (但是,通常僅在子程序調用之間的 )。
在ARM上,沒有其他調用約定,但默認情況下,我知道。這是爲什麼:
- 你爲什麼要?你的函數不能以其他函數的編譯形式調用,從而產生兼容性混亂。
- 對符合ABI的系統函數的調用不起作用,除非編譯器能夠區分調用約定。現在,我知道在過去有x86-32有不同的調用約定,但注意x64是如何更簡單的(AMD64與微軟做的任何)。爲什麼在設計ARM calling convention時,你會允許這麼多不同的調用約定?它創建了兼容性混亂。
是的你是對的。這很奇怪,尤其是因爲你提到的原因。這個想法是,定義的函數是線程的主體 - 在自定義環境(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
您可以嘗試在結構中包裝參數;另外
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;
}
存儲本地變量的位置取決於您將如何使用它。如果您需要獲取本地變量的地址,則局部變量只能存儲在堆棧中。所以當你傳遞你的子程序一個指針時,這個參數將通過堆棧傳遞。
- 1. 在堆棧上傳遞參數
- 2. 在NASM堆棧上傳遞參數的問題
- 3. 在堆上傳遞數組並在堆棧上運行
- 4. 參數在變量參數函數中如何傳遞到堆棧上?
- 5. 將函數的參數傳遞給堆棧還是寄存器?
- 6. 數組的使用堆棧(參數傳遞/返回)
- 7. GCC堆棧優化
- 8. c/C++通過參考堆棧幀佈局的指針/參數傳遞參數
- 9. x86程序集:通過堆棧將參數傳遞給函數
- 10. python - 通過堆棧裝飾器傳遞函數參數
- 11. 不能在passport.js傳遞的參數 - MEAN堆棧
- 12. 將參數通過堆棧傳遞給MASM中的過程
- 13. 繞過核心數據堆棧傳遞
- 14. 通過堆棧傳遞數據
- 15. 堆棧上的遞歸函數
- 16. 在Windows上增加堆棧大小(GCC)
- 17. 在gcc中傳遞參數的問題
- 18. MEAN堆棧傳遞參數在路由器內
- 19. 爲什麼在IA32堆棧過程中向後傳遞參數?
- 20. 參考 - 參數 - 堆棧或堆
- 21. 將庫參數傳遞給gcc
- 22. 參數在Visual Studio和GCC中傳遞
- 23. 函數修改堆棧時如何將堆棧傳遞給函數?
- 24. 如何獲取傳遞給棧上函數的參數的值?
- 25. C++(GCC):未定義的引用`堆棧<int> ::堆棧(INT)」
- 26. 強制評估作爲參數傳遞給函數的對象
- 27. 類型雙引號(GCC) - 在堆棧上增加一個指針參數
- 28. 堆棧溢出(參數:0x00000001,0x00442FF8)
- 29. 將堆棧傳遞給方法
- 30. 如何傳遞堆棧ghci RTS選項?
爲什麼在寄存器中傳遞參數是一件壞事? – 2011-01-09 16:38:34
這不是一件壞事。我只是希望以這種方式傳遞參數,因爲//仿真//線程創建(和堆棧分配)例程。 – cojocar 2011-01-09 16:45:09
什麼架構/ ABI? – ephemient 2011-01-09 17:11:44