2012-07-05 60 views
1

我是ARMv5彙編代碼的新手。ARMv5彙編中的PUSH/POP

假設我想使用CALL_VM_FUNCTION從我的彙編代碼中調用C函數。我的C函數使用三個參數。在調用C函數之前,哪些寄存器可以保存參數?這是否有特定的慣例?

除此之外,我想確保在C函數調用完成之前和之後寄存器保留這些值。推送和流行指令是否完全處理這個問題?

如:

PUSH {a1-a4} /*values held in registers a1-a4 are saved*/  
/*instruction to pass arguments in the registers for C function call*/  
CALL_VM_FUNCTION(C-function) 
POP {a1-a4} 

提前感謝! :-)

+1

哪個操作系統,哪個版本? C調用約定在不同的軟件平臺上有所不同... – reuben 2012-07-05 10:43:22

回答

1

如果您需要將數據保存在任何呼叫限制的寄存器中,您必須在撥打電話前保存它們(例如使用push)。這與論證傳遞無關;這只是爲了避免讓被調用者破壞自己的數據。特別是,除非您的函數永不返回,否則必須始終保存lr

至於如何傳遞參數,它不是通過將a1-a4推入堆棧。前4個整數/指針參數直接進入a1-a4 寄存器。之後,他們繼續前進。事情變得浮點和聚合類型比較複雜一點,所以你最好讀ABI:

http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf

+0

感謝您的建議。 – 2012-07-06 09:15:46