arm 64 ret指令是否将x0'值传递给函数的参数?

问题描述 投票:0回答:1

我有关于arm 64寄存器的问题。 X0用于function argument passingfunction return value。和X30is为function return address。有两个代码片段:

一个是cpp:

void test(void* arg) {}

另一个是汇编代码:

mov x3 ,x4
......
ret 

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

当它执行了ret指令时,pc将取出X30的值,这是test的地址。所以该程序将运行test函数。我的问题是,如果arg的值将设置为0xffffff,如果没有,我如何将汇编代码中的值传递给arm 64平台中的函数test’参数arg

谢谢大家。

assembly arm arm64 calling-convention
1个回答
1
投票

qazxsw poi根本没有对qazxsw poi做任何事情。 qazxsw poi就是你怎么用AArch64写ret的。 (x30是链接寄存器,其中x0(分支和链接)放置一个返回地址。)

你的问题实际上是关于调用约定。相互调用的函数必须就如何传递args以及返回返回值达成一致。

在标准的AArch64调用约定中

  • ret是第一个用于整数/指针arg的arg传递寄存器。
  • mov pc, x30是整数/指针值的(第一个)返回值寄存器。

所以当你在非bl函数中使用x0时,调用者会将x0中的任何内容视为返回值的(部分)。 (除非你的函数返回retvoid,否则调用者会查看x0float,假设有一个硬浮动ABI。)

如果你声明你的函数是按值返回一个大结构,那么调用者将把一个指针作为第一个arg传递给你,将“正常”args翻过来1.然后你需要将返回值存储到指向的那个中。记忆。 (也许还会返回你在double中传递的指针,但我没有检查这是否是一个要求。)


TL:DR,如果你s0没有做任何与d0,你的函数有效地返回第一个整数/指针arg。

© www.soinside.com 2019 - 2024. All rights reserved.