arm 64 ret 指令是否将 x0' 值传递给函数的参数?

dar*_*rbe 1 assembly arm calling-convention arm64

我有一个关于 ARM 64 寄存器的问题。\n X0代表function argument passingfunction return value。是X30. function return address\n 有两个代码片段:

\n\n

一个是cpp:

\n\n
void test(void* arg) {}\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一个是汇编代码:

\n\n
mov x3 ,x4\n......\nret \n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我假设X30存储函数的地址test 并存X0储值0xfffffff

\n\n

当执行完ret指令后,pc会取出 的值,X30即 的地址test。所以程序将运行到函数test。 \n我的问题是 的值是否arg将被设置为0xffffff,如果不是,我如何将值从我的汇编代码传递到arm 64平台中的函数test\xe2\x80\x99参数?arg

\n\n

谢谢大家。

\n

Pet*_*des 8

ret根本不做任何事情x0ret这就是你mov pc, x30在 AArch64 中的编写方式。(x30 是链接寄存器,其中bl(分支和链接)放置返回地址。)

你的问题实际上是关于调用约定的。 相互调用的函数必须就如何传递参数和返回返回值达成一致。

在标准 AArch64 调用约定中

  • x0是整数/指针参数的第一个参数传递寄存器。
  • x0是整数/指针值的(第一个)返回值寄存器。

因此,当您ret使用非void函数时,调用者会将其中的任何内容x0视为返回值(的一部分)。(除非您的函数返回floator double,否则调用者将查找s0or d0,假设硬浮点 ABI。)

如果您将函数声明为按值返回大型结构,则调用者将向您传递一个指针作为第一个参数,将“正常”参数增加 1。然后,您需要将返回值存储到指向的值中记忆。(也许还返回您传入的指针x0,但我没有检查这是否是必需的。)


TL:DR 如果您ret没有对 执行任何操作x0,您的函数将有效返回第一个整数/指针参数。