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



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

一个是CPP:

void test(void* arg) {}

另一个是汇编代码:

mov x3 ,x4
......
ret 

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

当它执行了ret指令时,pc将取出X30的值,即test的地址。因此,程序将运行到函数test。 我的问题是arg的值是否会设置为0xffffff,如果没有,如何将值从我的汇编代码传递到 arm 64 平台中的函数test’参数arg

谢谢大家。

ret

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

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

在标准 AArch64 调用约定中

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

因此,当您retvoid函数时,调用方会将x0中的任何内容视为返回值(一部分)。 (除非你的函数返回floatdouble,否则调用者将查找s0d0,假设是硬浮点ABI。

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


TL:DR 如果你ret而不对x0做任何事情,你的函数有效地返回第一个整数/指针参数。

相关内容

  • 没有找到相关文章