C语言调用子函数时入/出栈(保护/恢复现场)全过程分析:以Cortex-M3为例
C语言调用子函数时入/出栈保护/恢复现场全过程分析以Cortex-M3为例0 参考资料工具Cortex M3权威指南(中文).pdf keil5用于仿真查看寄存器、栈变化复制1 C语言调用子函数时出入/出栈保护/恢复现场全过程分析使用C语言调用子函数是如何保护/恢复现场的呢本文以Cortex-M3为例逐行汇编代码分析C语言调用子函数时入/出栈保护/恢复现场全过程。准备工作1使用keil5新建一个基于stm32f103的工程2将栈底值设置为0x20000400Cortex-M3栈从上往下生长也就是将栈大小设置为0x400在分析之前我们需要对寄存器的功能有所了解ATPCS即ARM-THUMB procedure call standardARM-Thumb过程调用标准的简称。ATPCS规定了应用程序的函数可以如何分开地写分开地编译最后将它们连接在一起所以它实际上定义了一套有关过程函数调用者与被调用者之间的协议。规则如下1子程序通过寄存器R0~R3来传递参数.2在子程序中,使用R4~R11来保存局部变量3寄存器R12用作子程序间scratch寄存器,记作ip4寄存器R13用作数据栈指针,记做SP5寄存器R14用作连接寄存器,记作lr ; 它用于保存子程序的返回地址6寄存器R15是程序计数器,记作PC1.1 C代码本文用来调试分析的C代码如下typedef unsigned int u32; u32 fun2(u32 p1, u32 p2, u32 p3, u32 p4) { return p1 p2 p3 p4; } /** * 主函数 */ int main(void) { u32 x; fun2(1, 2, 3, 4); x 0x778899AA; } void SystemInit(void) { }复制说明使用主函数调用fun2子函数查看Cortex-M3的保护、恢复现场过程。1.2 C代码编译生成的汇编指令以上C代码使用0级优化不优化生成的汇编指令如下我们重点关注执行fun2函数前后的操作。1执行fun2函数前传递变量执行fun2函数前首先将第4、3、2、1个参数依次传递给r3、r2、r1、r0寄存器。2跳转到fun2函数参数传递完之后跳转到fun2函数。之所以不先保护现场而是先跳转到fun2函数是因为使用BL指令会自动将跳转指令的下一条指令地址保存到LR。BL function1 ;使用“分支并连接”指令呼叫 function1 ; PC function1并且 LRmain的下一条指令地址也就是说在跳转到子函数前LR寄存器会被设置为子函数下一条指令地址这里保存到LR的并非是0x0800021A也就是fun2函数的下一条指令反而保存的是0x0800021B。这样操作的原因可以参考Cortex M3权威指南(中文).pdf也就是说每次使用跳转指令跳转到子函数时LR保存的实际上是子函数下一条指令地址1 避免产生fault 异常。地址1的值写入PCPC会自动将最低位设置为0。3执行fun2函数前保护现场在执行fun2函数前CPU会执行一条入栈指令PUSH至少会将lr寄存器程序链接寄存器保存了子函数返回地址入栈。使用keil的单步仿真功能我们观察执行这条指令前后栈的变化3.1执行到fun2函数保护现场前栈内从顶到底依次保存了局部变量x此时还未赋值栈内值为0x08000234、mian函数返回地址0x080001D9。此时栈指针值为0x200003F8。3.2PUSH指令依次将lr、r4的值压入栈内。也就是依次向栈顶写入值0x0800021B、0x08000234。此时栈指针值为0x200003F0。此时寄存器组内容如下4执行完fun2函数后恢复现场执行POP指令出栈从栈顶开始依次将栈值写入r4、PC。执行完该语句后栈的内容如下可以看到出入栈的部分已经被绿色标记出来至此就算完成了C语言调用子函数保护/恢复现场操作。此时寄存器组内容如下2 总结本例C语言在调用函数时保护/恢复现场操作如下1保护现场1.1传递函数参数1.2使用BL指令跳转到子函数自动将子函数下一条指令地址保存到LR1.3保护现场至少要将LR程序链接寄存器保存有子函数返回地址入栈2恢复现场至少要将LR程序链接寄存器保存有子函数返回地址出栈将LR的值写入到PC跳转到子函数下一条指令位置继续执行https://download.csdn.net/blog/column/12617739/141761244

相关新闻

F5G第五代固定网络

F5G第五代固定网络

以光为基础,通过光纤和光技术提供超带宽,低延时,高可靠的网络连接能力F5GPONWIFI6OTNPON光纤到户,大带宽长距离高传输,无源分光,部署成本低wifi6高速率,高并发,低时延,覆…

2026/6/27 6:09:36阅读更多 →
【踩坑记录】Docker Desktop 启动卡死修复  本地 MySQL/Redis 极速迁移 Docker 实战

【踩坑记录】Docker Desktop 启动卡死修复 本地 MySQL/Redis 极速迁移 Docker 实战

前言最近在开发一个前后端分离项目(前端 Vue 3,后端 .NET 10 ABP 9)。目前刚做完用户登录和前后端联调。为了让本地开发环境更加整洁,我决定将本地原本运行的 MySQL 和 Redis 迁移到 Docker 容器中运行。在配置和安装过程中&…

2026/6/27 6:09:36阅读更多 →
Java计算机毕设之基于 SpringBoot 的企业人力资源信息管理系统的设计与实现 基于 SpringBoot 的人事档案数字化管理系统(完整前后端代码+说明文档+LW,调试定制等)

Java计算机毕设之基于 SpringBoot 的企业人力资源信息管理系统的设计与实现 基于 SpringBoot 的人事档案数字化管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/27 6:09:36阅读更多 →
智能合约安全审计

智能合约安全审计

智能合约安全审计:守护区块链世界的基石 随着区块链技术的快速发展,智能合约已成为去中心化应用(DApp)的核心组件。由于代码一旦部署便难以修改,任何漏洞都可能引发巨额资金损失。智能合约安全审计因此成为保障项目安…

2026/6/27 7:39:40阅读更多 →
英雄联盟回放管理神器:ROFLPlayer让你的比赛复盘更简单

英雄联盟回放管理神器:ROFLPlayer让你的比赛复盘更简单

英雄联盟回放管理神器:ROFLPlayer让你的比赛复盘更简单 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为英雄联盟回放文…

2026/6/27 7:39:40阅读更多 →
Redis 不只是缓存:数据结构与应用场景

Redis 不只是缓存:数据结构与应用场景

Redis 不只是缓存:数据结构与应用场景 提到Redis,许多人首先想到的是高性能缓存系统。Redis的真正魅力远不止于此。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,使其在分布式锁、消息队列、实时排行榜等场景中大放…

2026/6/27 7:39:40阅读更多 →
人力资源分析:员工流失预测与绩效评估模型

人力资源分析:员工流失预测与绩效评估模型

人力资源分析:员工流失预测与绩效评估模型 在竞争激烈的商业环境中,企业如何留住核心人才并提升员工绩效成为管理者的重要课题。人力资源分析通过数据驱动的方法,为企业提供科学的决策支持。员工流失预测与绩效评估模型结合机器学习与统计学…

2026/6/27 7:39:40阅读更多 →
5分钟掌握HS2-HF_Patch:Honey Select 2终极汉化去码补丁完整指南

5分钟掌握HS2-HF_Patch:Honey Select 2终极汉化去码补丁完整指南

5分钟掌握HS2-HF_Patch:Honey Select 2终极汉化去码补丁完整指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF_Patch是专为《Honey Select…

2026/6/27 7:39:40阅读更多 →
在线编程学习资源推荐(免费+付费)

在线编程学习资源推荐(免费+付费)

在数字化时代,编程已成为一项必备技能,无论是职业发展还是个人兴趣,学习编程都能带来巨大价值。面对海量的在线学习资源,如何选择适合自己的平台成为许多初学者的难题。本文将推荐一些优质的免费和付费在线编程学习资源&#xff0…

2026/6/27 7:34:40阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/27 5:46:02阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →