ARMv5程序集中的PUSH / POP

时间:2012-07-05 10:38:12

标签: c assembly arm push calling-convention

我是ARMv5汇编代码的新手。

假设我希望使用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 个答案:

答案 0 :(得分:1)

如果您有数据需要保留在任何call-clobbered寄存器中,则必须在进行呼叫之前保存它们(例如使用push)。这与论证传递无关;这只是为了避免被调用者破坏自己的数据。特别是,除非您的函数永远不会返回,否则您必须始终保存lr

至于如何传递参数,不是将a1-a4推入堆栈。前4个整数/指针参数直接进入a1-a4 寄存器。之后,他们进入筹码。对于浮点和聚合类型,事情变得复杂一些,所以你最好阅读ABI:

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