我有一个关于ARM64寄存器的问题。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
,如果不是,我如何将汇编代码中的值传递给ARM64平台中的函数test’
参数arg
?
谢谢大家。
发布于 2019-02-22 04:30:56
ret
根本不会对 mov pc, x30
做任何事情。mov pc, x30
只是您在中编写AArch64的方式。(x30是链接寄存器,其中bl
(分支和链接)放置返回地址。)
你的问题实际上是关于调用约定的,相互调用的函数必须在如何传递参数和返回返回值方面达成一致。
在标准的AArch64调用约定中
x0
是整数/指针的第一个参数传递寄存器。args.x0
是整数/指针值的(第一个)返回值寄存器。因此,当您输入一个非void
函数时,调用者会将x0
中的任何内容视为返回值(的一部分)。(除非您的函数返回float
或double
,否则调用者将在s0
或d0
中查找,假设是硬浮点型ABI。)
如果你声明你的函数通过值返回一个大的结构体,调用者会传递一个指针给你作为第一个参数,将“普通”参数增加1,然后你需要将返回值存储到指向的内存中。(也许还会返回在x0
中传递给您的指针,但我没有检查这是否是必需的。)
如果你不对x0
做任何事情就执行ret
,你的函数实际上会返回第一个整数/指针arg。
https://stackoverflow.com/questions/54810032
复制相似问题