Arm64函数调用时会把参数保存在寄存器中吗
时间: 2024-04-04 07:34:01 浏览: 24
是的,Arm64函数调用时会把参数保存在寄存器中。具体来说,前6个参数会分别保存在寄存器x0~x5中,如果参数数量超过6个,则会把额外的参数保存在栈中。如果函数返回值为整型或指针类型,则会把返回值保存在寄存器x0中,如果返回值为浮点型,则会把返回值保存在寄存器v0中。
需要注意的是,函数调用前,调用方需要按照函数的参数顺序将参数值依次保存在对应的寄存器中或栈中。如果有参数需要通过指针传递,则需要将指针地址保存在寄存器中或栈中,然后将指针地址作为参数传递给函数。在函数内部,根据参数的类型和数量,可以通过寄存器或栈中的地址来获取参数值。
相关问题
Arm64架构在函数调用时,会不会把上一个函数的参数存储在栈帧中
在 ARM64 架构下,函数参数通常是通过通用寄存器(General Purpose Registers)来传递的,而不是通过栈。ARM64 有 31 个通用寄存器,其中 x0 到 x7 用于传递函数参数。如果函数的参数超过了 8 个,多余的参数则需要通过栈来传递。
在函数调用时,调用者会先将函数参数存储在通用寄存器中,然后将返回地址和栈帧指针先入栈,最后跳转到被调用函数的入口地址。在被调用函数内部,被调用函数会从寄存器中读取参数值,并执行相应的操作。
因此,在 ARM64 架构下,上一个函数的参数通常不会存储在栈帧中,而是存储在通用寄存器中。栈帧中存储的是上一个函数的栈帧指针、返回地址和局部变量等信息。
需要注意的是,如果函数参数超过了 8 个,多余的参数则需要通过栈来传递。在这种情况下,被调用函数会从栈中读取参数值,并执行相应的操作。同时,如果函数调用时使用了不同的 ABI(Application Binary Interface),则可能会影响函数参数的传递方式和存储位置。
Objective-C方法 调用函数时,自己寄存器中的参数怎么存储
在 Objective-C 中,方法调用的实现是通过消息传递机制完成的。当一个方法被调用时,编译器会将方法的参数按照一定的顺序存储到寄存器和栈中,以便在方法内部使用。
具体来说,Objective-C 中方法调用的参数传递顺序是:
1. 前 8 个参数(如果有的话)按照从左至右的顺序依次存储到寄存器 `x0` ~ `x7` 中;
2. 如果参数个数超过 8 个,则从第 9 个参数开始,剩余的参数会按照从左至右的顺序依次存储到栈中;
3. 如果有返回值,则返回值存储在 `x0` 寄存器中。
需要注意的是,在 ARM64 架构下,由于寄存器数量比较有限,如果方法参数过多,可能会导致部分参数无法存储到寄存器中,而需要全部存储到栈中。另外,由于寄存器和栈的存储顺序不同,因此在方法内部访问参数时需要根据参数的位置来确定其存储位置。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)