Arm64下怎么从栈帧中读取方法参数
时间: 2024-03-20 09:41:49 浏览: 24
在 Arm64 下,从栈帧中读取方法参数的方式与其他架构类似,需要根据方法定义的参数个数和类型来确定每个参数在栈中的位置。
在 Arm64 中,前6个参数会依次存储在 x0~x5 寄存器中,如果参数个数超过6个,则额外的参数会存储在方法栈帧中,在栈帧中,参数的存储顺序与参数声明的顺序相同,从右往左依次存储。
以一个简单的 Objective-C 方法为例:
```
- (void)printName:(NSString *)name age:(int)age;
```
在 Arm64 机器上,该方法的前两个参数 name 和 age 将分别保存在 x0 和 x1 寄存器中,如果 name 是一个对象,则 x0 中存储的是指向该对象的指针。如果方法有更多的参数,则需要从栈帧中读取,例如:
```
- (void)printName:(NSString *)name age:(int)age address:(NSString *)address;
```
在这个例子中,前两个参数 name 和 age 仍然保存在 x0 和 x1 寄存器中,而第三个参数 address 会保存在栈帧中,相对于 FP(Frame Pointer) 的偏移量为 16 字节,也就是说,address 的值可以通过 FP+16 获取。
需要注意的是,由于 Arm64 采用的是 64 位寄存器,因此指针类型的参数需要使用正确的寄存器或栈地址来传递和读取,否则会导致程序崩溃或出现其他异常情况。
相关问题
Arm64下怎么从栈帧中读取上一层方法参数
在 Arm64 下,可以通过在当前方法栈帧中查找 FP(Frame Pointer) 来获取上一层方法的栈帧,然后根据上一层方法的参数类型和个数,从栈帧中读取参数值。
在 Arm64 中,上一层方法的栈帧位于当前方法栈帧的 FP 的指向位置,也就是说,通过 FP 可以访问上一层方法的栈帧。具体来说,上一层方法的前6个参数会分别保存在 x0~x5 寄存器中,如果参数个数超过6个,则额外的参数会存储在栈帧中,相对于上一层方法栈帧的 FP 的偏移量依次为 16、24、32 等。
以一个简单的 Objective-C 方法调用为例:
```
- (void)printInfo {
NSString *name = @"Tom";
int age = 18;
[self printName:name age:age];
}
```
在这个例子中,当前方法 `printInfo` 调用了另一个方法 `printName:age:`,因此可以通过 FP 获取上一层方法 `printName:age:` 的栈帧,然后从栈帧中读取参数值。假设 `printName:age:` 方法的定义如下:
```
- (void)printName:(NSString *)name age:(int)age {
NSLog(@"name: %@, age: %d", name, age);
}
```
在 Arm64 下,`printName:age:` 方法的前两个参数 name 和 age 分别会保存在 x0 和 x1 寄存器中,因此可以通过当前方法的 FP+16 和 FP+24 分别获取上一层方法的 name 和 age 参数的值,具体代码如下:
```
- (void)printInfo {
NSString *name = @"Tom";
int age = 18;
[self printName:name age:age];
// 获取上一层方法的参数值
NSString *prevName = *((NSString **)(__builtin_frame_address(1) + 16));
int prevAge = *((int *)(__builtin_frame_address(1) + 24));
NSLog(@"prev name: %@, prev age: %d", prevName, prevAge);
}
```
需要注意的是,从上一层方法的栈帧中读取参数时,需要使用正确的指针类型和偏移量,否则会导致程序崩溃或出现其他异常情况。
Arm64架构下的Objective-C 方法栈帧详解
Arm64架构下的Objective-C方法栈帧可以分为以下几个部分:
1. 返回地址:指向方法调用后将要返回的地址。
2. FP(Frame Pointer):指向当前方法的栈帧底部,也就是上一个方法栈帧的SP(Stack Pointer)。
3. LR(Link Register):保存下一个方法的返回地址,也就是方法调用之前LR的值。
4. 参数:按顺序从右到左依次存储方法参数。
5. 局部变量:从FP开始向下分配的一段空间,用于存储方法内部的局部变量。
6. 内存对齐填充:为了保证栈帧的对齐,可能会在局部变量后面添加一些无用的内存对齐填充。
其中,返回地址、FP和LR都是固定的,参数和局部变量的大小和数量则根据方法的定义而定。在方法调用结束后,栈帧会被弹出,恢复上一个方法的栈帧,继续执行。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.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)