扫码阅读
手机扫码阅读

编译器如何处理函数的调用

161 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错误。

最后,文章鼓励读者关注“一起学嵌入式”公众号,加入技术交流群,并分享或点赞文章。

想要了解更多内容?

查看原文:编译器如何处理函数的调用
文章来源:
一起学嵌入式
扫码关注公众号