我有关于arm 64寄存器的问题。 X0
用于function argument passing
和function return value
。和X30
is为function return address
。有两个代码片段:
一个是cpp:
void test(void* arg) {}
另一个是汇编代码:
mov x3 ,x4
......
ret
现在我假设X30
存储函数test
的地址和X0
store值0xfffffff
当它执行了ret
指令时,pc
将取出X30
的值,这是test
的地址。所以该程序将运行test
函数。我的问题是,如果arg
的值将设置为0xffffff
,如果没有,我如何将汇编代码中的值传递给arm 64平台中的函数test’
参数arg
?
谢谢大家。
qazxsw poi根本没有对qazxsw poi做任何事情。 qazxsw poi就是你怎么用AArch64写ret
的。 (x30是链接寄存器,其中x0
(分支和链接)放置一个返回地址。)
你的问题实际上是关于调用约定。相互调用的函数必须就如何传递args以及返回返回值达成一致。
在标准的AArch64调用约定中
ret
是第一个用于整数/指针arg的arg传递寄存器。mov pc, x30
是整数/指针值的(第一个)返回值寄存器。所以当你在非bl
函数中使用x0
时,调用者会将x0
中的任何内容视为返回值的(部分)。 (除非你的函数返回ret
或void
,否则调用者会查看x0
或float
,假设有一个硬浮动ABI。)
如果你声明你的函数是按值返回一个大结构,那么调用者将把一个指针作为第一个arg传递给你,将“正常”args翻过来1.然后你需要将返回值存储到指向的那个中。记忆。 (也许还会返回你在double
中传递的指针,但我没有检查这是否是一个要求。)
TL:DR,如果你s0
没有做任何与d0
,你的函数有效地返回第一个整数/指针arg。