扫码阅读
手机扫码阅读
编译器如何处理函数的调用
121 2024-08-31
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
查看原文:编译器如何处理函数的调用
文章来源:
一起学嵌入式
扫码关注公众号
概要
本文系统化分析了函数调用的过程,从汇编、寄存器、堆栈、map文件和内存四个方面提供了详细分析。通过一个示例,说明了编译器在函数调用时的具体操作。
环境介绍
文章以串口输入指令的处理流程为例,详细讲解了从中断接口调用到解析命令的过程。重点分析了在调用shell_cmd_parse函数时的寄存器变化和堆栈操作。
步骤
首先,分析了在断点处寄存器的状态,指出寄存器R0-R12的值不确定,SP指向当前堆栈地址,LR保存了返回地址,PC表示当前程序执行地址。通过Diassembly窗口观察即将执行的指令,解释了寄存器之间的值传递以及PC寄存器的特殊行为。
接下来,分析了单步进入shell_cmd_parse函数后寄存器的变化。重点观察了R0、R1、LR和PC寄存器的新值,以及这些值如何对应到函数参数和返回地址。
进一步分析了在shell_cmd_parse函数中的现场保护动作,包括LR的保存和R4-R11寄存器的保护。同时,堆栈偏移量的计算和具体的堆栈数据也被仔细检查。
文章还描述了为shell_cmd_parse函数分配堆栈空间的过程,以及局部变量和堆栈的使用情况。并且,探讨了堆栈溢出的底层原理,说明了过长的指令输出导致越界访问时,堆栈中数据的变化可能会引发hard fault错误。
最后,文章鼓励读者关注“一起学嵌入式”公众号,加入技术交流群,并分享或点赞文章。
想要了解更多内容?
查看原文:编译器如何处理函数的调用
文章来源:
一起学嵌入式
扫码关注公众号
一起学嵌入式的其他文章
加入社区微信群
与行业大咖零距离交流学习
软件研发质量管理体系建设
白皮书上线