首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ARM64 ret指令是否将x0的值传递给函数的参数?

ARM64 ret指令是否将x0的值传递给函数的参数?
EN

Stack Overflow用户
提问于 2019-02-21 22:58:51
回答 1查看 3.7K关注 0票数 0

我有一个关于ARM64寄存器的问题。X0适用于function argument passingfunction return value。而X30是为function return address编写的。有两个代码片段:

一种是cpp:

代码语言:javascript
复制
void test(void* arg) {}

另一个是汇编代码:

代码语言:javascript
复制
mov x3 ,x4
......
ret 

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

执行完ret指令后,pc将取出X30的值,即test的地址。因此程序将运行到函数test中。我的问题是,如果arg的值将被设置为0xffffff,如果不是,我如何将汇编代码中的值传递给ARM64平台中的函数test’参数arg

谢谢大家。

EN

回答 1

Stack Overflow用户

发布于 2019-02-22 04:30:56

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

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

在标准的AArch64调用约定中

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

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

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

如果你不对x0做任何事情就执行ret,你的函数实际上会返回第一个整数/指针arg。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54810032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档