dar*_*rbe 1 assembly arm calling-convention arm64
我有一个关于 ARM 64 寄存器的问题。\n X0代表function argument passing和function return value。是X30. function return address\n 有两个代码片段:
一个是cpp:
\n\nvoid test(void* arg) {}\nRun Code Online (Sandbox Code Playgroud)\n\n另一个是汇编代码:
\n\nmov x3 ,x4\n......\nret \nRun Code Online (Sandbox Code Playgroud)\n\n现在我假设X30存储函数的地址test 并存X0储值0xfffffff
当执行完ret指令后,pc会取出 的值,X30即 的地址test。所以程序将运行到函数test。 \n我的问题是 的值是否arg将被设置为0xffffff,如果不是,我如何将值从我的汇编代码传递到arm 64平台中的函数test\xe2\x80\x99参数?arg
谢谢大家。
\nret根本不做任何事情x0。 ret这就是你mov pc, x30在 AArch64 中的编写方式。(x30 是链接寄存器,其中bl(分支和链接)放置返回地址。)
你的问题实际上是关于调用约定的。 相互调用的函数必须就如何传递参数和返回返回值达成一致。
在标准 AArch64 调用约定中
x0是整数/指针参数的第一个参数传递寄存器。x0是整数/指针值的(第一个)返回值寄存器。因此,当您ret使用非void函数时,调用者会将其中的任何内容x0视为返回值(的一部分)。(除非您的函数返回floator double,否则调用者将查找s0or d0,假设硬浮点 ABI。)
如果您将函数声明为按值返回大型结构,则调用者将向您传递一个指针作为第一个参数,将“正常”参数增加 1。然后,您需要将返回值存储到指向的值中记忆。(也许还返回您传入的指针x0,但我没有检查这是否是必需的。)
TL:DR 如果您ret没有对 执行任何操作x0,您的函数将有效返回第一个整数/指针参数。
| 归档时间: |
|
| 查看次数: |
9276 次 |
| 最近记录: |