我对ARMv5汇编代码还不熟悉。
假设我希望使用call_VM_函数从程序集代码中调用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}
提前谢谢!:-)
最佳答案
如果您有数据需要保存在任何一个被调用破坏的寄存器中,则必须在进行调用之前保存它们(例如使用push
)。这与参数传递无关;这只是为了避免自己的数据被调用方破坏。特别是,除非函数永远不会返回,否则必须始终保存lr
。
至于如何传递参数,不是把a1-a4推到堆栈上。前4个整数/指针参数直接进入a1-a4寄存器。在那之后,他们就开始了。对于浮点类型和聚合类型,事情会变得更复杂一些,所以最好阅读ABI:
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf
关于c - ARMv5汇编中的PUSH/POP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11342612/