理解函数调用栈

本文详细解析了Objective-C中函数调用栈的工作原理,包括fp、sp、lr寄存器的作用,以及bl、stp、ldp等汇编指令在调用过程中的应用。通过具体的调用流程示例,阐述了函数调用时栈空间的分配、局部变量的入栈及栈平衡的过程,最后探讨了栈溢出的概念。
摘要由CSDN通过智能技术生成

链接: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();
}

对函数调用栈的认识

  1. 函数调用过程中,局部变量,lr(x30)函数返回值,fp(x29)寄存器不断的进栈出栈的过程.
  2. 函数的调用栈是从高地址往低地址分配的,是一块连续的内存.
  3. 函数的调用栈是高度平衡的

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

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值