1

我是 ARMv5 汇编编码的新手。

假设我希望使用 CALL_VM_FUNCTION 从我的汇编代码中调用一个 C 函数。我的 C 函数使用三个参数。在调用 C 函数之前,我将参数保存在哪些寄存器中?为此是否有特定的约定?

除此之外,我想确保在 C 函数调用完成之前和之后,寄存器保留这些值。push 和 pop 指令会完全解决这个问题吗?

例如:

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}

提前致谢!:-)

4

1 回答 1

1

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

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

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

于 2012-07-05T11:15:07.650 回答