我对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
,否则,如何将汇编代码中的值传递给函数中的函数test’
自变量arg
arm 64平台?
谢谢。
答案 0 :(得分:1)
ret
对x0
完全不执行任何操作。 ret
就是您在AArch64中编写mov pc, x30
的方式。 (x30是链接寄存器,其中bl
(分支和链接)放置一个返回地址。)
您的问题实际上是关于调用约定的。相互调用的函数必须就如何传递args和返回返回值达成共识。
在标准AArch64调用约定中
x0
是用于整数/指针args的第一个arg传递寄存器。x0
是整数/指针值的(第一个)返回值寄存器。因此,当您在非ret
函数中void
时,调用者会将x0
中的所有内容都视为返回值的一部分。 (除非您的函数返回float
或double
,否则调用者将在s0
或d0
中进行查找,并假设ABI处于浮动状态。)
如果您声明函数按值返回大型结构,则调用方将向您传递一个指针作为第一个arg,将“正常” args超出1。然后,您需要将返回值存储到该值中指向内存。 (也许还返回您在x0
中传递的指针,但我没有检查这是否是必需条件。)
TL:DR,如果您ret
没有对x0
做任何事情,则您的函数将有效地返回第一个整数/指针arg。