Assembly arm 64 ret指令是否通过x0';函数的值';谁的论点?

Assembly arm 64 ret指令是否通过x0';函数的值';谁的论点?,assembly,arm,arm64,calling-convention,Assembly,Arm,Arm64,Calling Convention,我有一个关于arm 64寄存器的问题。 X0用于传递函数参数和函数返回值。而X30用于函数返回地址。 有两个代码片段: 一个是cpp: void test(void* arg) {} 另一个是汇编代码: mov x3 ,x4 ...... ret 现在我假设X30存储函数test的地址,X0存储值0xfffff 执行ret指令后,pc将取出X30的值,该值是test的地址。因此,程序将运行到函数test。 我的问题是如果arg的值将设置为0xffffff,如果不是,我如何将值从汇编代码传递

我有一个关于arm 64寄存器的问题。
X0
用于传递
函数参数
函数返回值
。而
X30
用于
函数返回地址
。 有两个代码片段:

一个是cpp:

void test(void* arg) {}
另一个是汇编代码:

mov x3 ,x4
......
ret 
现在我假设
X30
存储函数
test
的地址,
X0
存储值
0xfffff

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


谢谢大家。

ret
x0
没有任何作用
ret
正是您在AArch64中编写mov pc,x30的方式。(x30是链接寄存器,其中
bl
(分支和链接)放置一个返回地址。)

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

在标准AArch64调用约定中

  • x0
    是整数/指针参数的第一个参数传递寄存器
  • x0
    是整数/指针值的(第一个)返回值寄存器
因此,当您在非
void
函数中执行
ret
时,调用方将把
x0
中的任何内容视为返回值的一部分。(除非函数返回
float
double
,否则调用者将查看
s0
d0
,假设为硬浮点ABI。)

如果您将函数声明为按值返回一个大的struct,则调用方将向您传递一个指针作为第一个参数,将“normal”参数替换为1。然后,您需要将返回值存储到指向内存的内存中。(也可能返回您在
x0
中传递的指针,但我没有检查这是否是一个要求。)



TL:DR如果你
ret
不使用
x0
执行任何操作,你的函数将有效地返回第一个整数/指针arg。

ret
根本不使用
x0
执行任何操作
ret
正是您在AArch64中编写mov pc,x30的方式。(x30是链接寄存器,其中
bl
(分支和链接)放置一个返回地址。)

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

在标准AArch64调用约定中

  • x0
    是整数/指针参数的第一个参数传递寄存器
  • x0
    是整数/指针值的(第一个)返回值寄存器
因此,当您在非
void
函数中执行
ret
时,调用方将把
x0
中的任何内容视为返回值的一部分。(除非函数返回
float
double
,否则调用者将查看
s0
d0
,假设为硬浮点ABI。)

如果您将函数声明为按值返回一个大的struct,则调用方将向您传递一个指针作为第一个参数,将“normal”参数替换为1。然后,您需要将返回值存储到指向内存的内存中。(也可能返回您在
x0
中传递的指针,但我没有检查这是否是一个要求。)



TL:DR如果您
ret
而不使用
x0
执行任何操作,您的函数将有效地返回第一个整数/指针arg。

非常感谢您的回复,我的测试函数是一个空函数,因此如果它指示x0的值将传递给我的函数测试的参数arg,换句话说,我可以通过arg读取X0'值。@darbe:我不确定我是否理解你的要求。当我重读你的问题时,它变得更加没有意义了
ret
从函数返回,它不调用它们。因此,当
ret
void
函数末尾执行时,所有寄存器都没有任何特殊意义。函数可以在返回前修改参数传递寄存器。但是在进入函数时,第一个参数将出现在
x0
中。您好,对不起,您误解了我的问题。“ret从函数返回”我不是这个意思。我的意思是,我编写了一个C++函数空洞测试(Vult*ARG)(在MyTest.CPP中),我还编写了一个纯汇编代码(在hello。s)中。X0和X30在hello.s中被设置了一些值,例如,X30被设置为test的地址,X0被设置为0xfffff,在hello.s的末尾,有一条指令。我将这两个文件编译成一个可执行的二进制文件。当hello.s中的ret指令被执行时,程序将运行void test,我的问题是arg是否设置为x0的值,换句话说,arg等于0xfffff。非常感谢您的回答,我的测试函数是void函数,因此,如果它指示X0的值将被传递给我的函数测试的参数arg,换句话说,我可以通过arg读取X0的值。@darbe:我不确定我是否理解你的要求。当我重读你的问题时,它变得更加没有意义了
ret
从函数返回,它不调用它们。因此,当
ret
void
函数末尾执行时,所有寄存器都没有任何特殊意义。函数可以在返回前修改参数传递寄存器。但在进入函数时,第一个参数将位于
x0
.hi s中