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

时间:2019-02-21 14:58:51

标签: assembly arm arm64 calling-convention

我对ARM 64寄存器有疑问。   X0用于function argument passingfunction return valueX30代表function return address。   有两个代码片段:

一个是cpp:

void test(void* arg) {}

,另一个是汇编代码:

mov x3 ,x4
......
ret 

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

执行了ret指令后,pc将取出X30的值,它是test的地址。因此,程序将运行到函数test中。 我的问题是,是否将arg的值设置为0xffffff,否则,如何将汇编代码中的值传递给函数中的函数test’自变量arg arm 64平台?

谢谢。

1 个答案:

答案 0 :(得分:1)

retx0完全不执行任何操作。 ret就是您在AArch64中编写mov pc, x30的方式。 (x30是链接寄存器,其中bl(分支和链接)放置一个返回地址。)

您的问题实际上是关于调用约定的。相互调用的函数必须就如何传递args和返回返回值达成共识。

在标准AArch64调用约定中

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

因此,当您在非ret函数中void时,调用者会将x0中的所有内容都视为返回值的一部分。 (除非您的函数返回floatdouble,否则调用者将在s0d0中进行查找,并假设ABI处于浮动状态。)

如果您声明函数按值返回大型结构,则调用方将向您传递一个指针作为第一个arg,将“正常” args超出1。然后,您需要将返回值存储到该值中指向内存。 (也许还返回您在x0中传递的指针,但我没有检查这是否是必需条件。)


TL:DR,如果您ret没有对x0做任何事情,则您的函数将有效地返回第一个整数/指针arg。