我有一个关于 arm 64 寄存器的问题。X0
是为function argument passing
和function 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
是整数/指针值的(第一个)返回值寄存器。
因此,当您ret
非void
函数时,调用方会将x0
中的任何内容视为返回值(一部分)。 (除非你的函数返回float
或double
,否则调用者将查找s0
或d0
,假设是硬浮点ABI。
如果你将你的函数声明为按值返回一个大结构,调用者会向你传递一个指针作为第一个参数,将"正常"参数比 1 增加。 然后,您需要将返回值存储到该指向的内存中。 (也许还会返回您在x0
中传递的指针,但我没有检查这是否是必需的。
TL:DR 如果你ret
而不对x0
做任何事情,你的函数有效地返回第一个整数/指针参数。