链接:https://juejin.cn/post/6917823435905662983
本文使用的代码如下
void func3(int a, int b){
int c = a + b;
printf("--%d---", c);
}
void func2(){
int a = 1;
int b = 2;
func3(a, b);
int c = b * 2;
printf("---%d----",c);
}
void func1(){
func2();
}
对函数调用栈的认识
- 函数调用过程中,局部变量,lr(x30)函数返回值,fp(x29)寄存器不断的进栈出栈的过程.
- 函数的调用栈是从高地址往低地址分配的,是一块连续的内存.
- 函数的调用栈是高度平衡的
arm汇编的基础知识(64位系统)
1. fp(x29)寄存器
指向当前的函数调用栈的栈底(高地址)
2. sp寄存器
指向当前函数调用栈的栈顶(低地址)
3. lr(x30)寄存器
存储函数返回之后下一条指令的地址。
4. bl指令
函数调用指令
5. stp指令
将寄存器的值存储到内存
6. ldp指令
将内存的值存储到寄存器
7.sub指令
做减法
8.add指令
做加法
这里有一个iOS交流圈:891 488 181 不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!
其它(重要)
函数a调用b,b调用c,那么b函数调用的时候,lr里面会存储a里面调用b的下一条指令地址;然后b调用c,此时lr里面又会存b调用c的下一条指令地址。此时的lr被修改了,在b执行完成之后回不到正确的地址.所以在进入函数b调用后的最开始,要将lr寄存器的值存储在内存.同理调用c的时候lr也会存储在内存,防止在后续的调用过程修改了lr的值。在b执行完返回的之前,要从内存取出下一条指令的地址存储在lr寄存器.
例如我在func2里面调用func3,func3执行完成之后,要返回到func2继续执行.在调用f