嵌入式函数调用入栈与出栈

2023-05-16

简单的例程,几个函数调用,来查看寄存器状态,主要是学习一下cortem-M核中LR寄存器的理解:
在这里插入图片描述
例程源码:

static uint32_t count_test = 0;

static void fun3()
{
	count_test++;
	
}

static void fun2()
{
	count_test++;
	fun3();
    count_test++;
}

static void fun1()
{
	count_test++;
	fun2();
	count_test++;
}

int main(void)
{
    fun1();

    return 0;
}

通过单步调试来查看各个寄存器状态:

step1

进入调试界面
在这里插入图片描述

  1. c源代码
  2. 对应的汇编代码
  3. 对应的当前寄存器

step2

记录当前进入main函数所要做的动作和记录的状态
1、因main()函数中还有子函数,所以需将r4,lr寄存器压入栈中,对应的汇编:

0x0800017A B510      PUSH     {r4,lr}

2、记住当前main函数中return 0处的代码地址:0x08000180
在这里插入图片描述
在进入fun1()函数后,会将返回地址的指针加1保存到LR寄存器中,即0x08000181,请记住这个值。

step3

进入fun1()
在这里插入图片描述
1、查看当前LR寄存器为0x08000181,与上述分析一致;
2、进入当前fun1()函数中后,因为有子函数要执行,所以依然将r4,lr寄存器压入栈中
3、记录代码中counnt_test++代码对应的地址:0x0800172,那么进入到fun2()函数之后的LR值应为:0x0800173
在这里插入图片描述

step4

进入fun2()
在这里插入图片描述
分析同上,

step5

进入与退出fun3()
在这里插入图片描述
1、因fun3()函数中,没有子函数,r4,lr寄存器没有再进行入栈操作,执行结束之后直接返回,根据LR寄存器保存的返回地址:
在这里插入图片描述

step6

退出到fun2()并准备进入fun3()
在这里插入图片描述
1、退出到fun2()时,因当前LR寄存器保存的还是进入fun3()时的值,现在要从退出到fun2()到退出到fun1(),那么对应的LR肯定就不对了,需进行出栈操作,如上图的汇编,将r4,pc出栈操作(pc就是lr,直接将lr的值赋给pc并执行),栈中存放的就是退出到fun1()地址处的值:

0x08000162 BD10      POP      {r4,pc}

step7

退出到fun1()并准备进入main()
在这里插入图片描述
道理同上。

step8

最终进入main()函数。
在这里插入图片描述

所以要记住的是:
1、每次调用子函数,都会将返回的地址加1保存到LR寄存器中;
2、如当前函数中还有子函数,则在进入子函数前需先压栈r4,lr,进行保护现场操作;
3、而从函数中退出时,如果当前函数中有子函数,有过入栈操作,则在退出此函数时需进行出栈操作,根据出栈中保存的lr寄存器来返回需要退出的函数位置处。

  本文只是做了简单的记录,方便日后查看,后续再学习一下cortex-M核的几种工作模式及权限。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式函数调用入栈与出栈 的相关文章

随机推荐

  • Linux安装 metashape

    1 下载软件 3D三维建模软件 Agisoft Metashape Pro 2 安装 span class token comment 进入root模式 xff0c 如果之前没有设置过密码 span span class token fun
  • Information Collection

    港澳新地区 香港理工大学 杨波 助理教授 vLAR实验室 欧洲 ETH Z rich Marc Pollefeys Computer Vision and Geometry Group TU Delft 3D geoinformation
  • 804半导体物理 中科院半导体所考研经验

    本人2021考研 xff0c 半导体研究所 xff0c 物理电子学 xff0c 数一英语一 xff0c 专业课804半导体 自己之前在备考的时候就感觉专业课的资料和备考经验比较少 xff0c 现在就写一些自己总结的经验 xff0c 放一些资
  • 一些cmake error fixed

    建完虚拟环境后 运行 pip install 出现报错 xff0c 显示svox2安装出错 xff0c 然后开始进入到svox2中进行手动编译和安装 1 cmake svox2 csrc pybind11找不到 conda span cla
  • metashape-pro python scripts render specified viewpoint

    官方python脚本使用文档 主函数 xff1a render 61 chunk model renderImage 1 实现特定视角的渲染需要通过脚本方式进行 xff0c 原本的metashape pro中是没有这个功能的 首先在meta
  • 【mega-nerf】调包失败&pip install失败解决方案

    Problem 1 调包失败 在这样的层级架构里调包 xff0c 输出无法找到 mega nerf 直接用 sys path append 没有作用 span class token comment import sys span span
  • 使用 rust 开发 stm32:前言

    更多分享内容可访问我的个人博客 https www niuiic top 本系列教程全部置于stm32专栏 本文为使用 rust 开发 stm32 系列教程前言 Why Rust Rust 特性就不用多介绍了 xff0c 有个编译器管着有时
  • docker与virtualbox切换使用

    管理员模式打开cmd 查看hyper v状态 xff1a bcdedit span class token operator span findstr hyperv 若状态显示 hypervisorlaunchtype Auto 则当前可支
  • 内存管理学习

    简单的内存分配算法学习 系统中一块剩余不用的大块连续内存 当需要分配内存块时 xff0c 将从这个大的内存块上分割出相匹配的内存块 xff0c 每个内存块都包含一个管理用的数据头 xff0c 通过这个头把使用块与空闲块用双向链表的方式链接起
  • 模拟I2C

    I2C具体内容参考资料 https blog csdn net sternlycore article details 85600668 https blog csdn net qq 43460068 article details 122
  • 巴特沃斯滤波器使用-butter

    matlab的函数butter 低通滤波使用方法 span class token punctuation span B A span class token punctuation span span class token operat
  • 单片机中uid的使用方法

    uid xff1a unique ID 每个单片机芯片出厂后唯一的ID xff0c 不会重复 uid有很多用途 xff0c 我们可以用来作为mac地址 xff0c 可以用来记录唯一的日志 xff0c 也可以用来防止固件被拷贝使用 本文所描述
  • c/c++单个文件或函数优化级别设置

    span class token macro property span class token directive hash span span class token directive keyword pragma span span
  • 用 Python 将 matplotlib 图表集成到 PDF 中

    介绍 PDF 格式是与平台无关 xff0c 它独立于底层操作系统和渲染引擎 事实上 xff0c PDF 是基于一种脚本语言 PostScript xff0c 它是第一个独立于设备的页面描述语言 在本指南中 xff0c 我们将使用 borb
  • ucos iii 任务栈使用率统计方法

    第一步 使能任务统计功能 修改文件 os cfg h中的 OS CFG STAT TASK STK CHK EN宏 span class token comment TASK MANAGEMENT span span class token
  • qt 中文显示乱码

    qt更改lineEdit 按钮等字体时 xff0c 使用中文时有时会显示乱码 xff0c 则使用以下进行转换即可 xff1a span class token function QStringLiteral span span class
  • QT添加repository

    资源网站 xff0c 添加临时repository即可 https span class token operator span span class token comment mirrors tuna tsinghua edu cn q
  • ssh免密登录

    windows 个人账户下ssh的公钥内容需要保存至远程服务器 xff0c 一般是C Users xxx ssh id rsa pub 远程服务器个人账户下 ssh目录创建文件authorized keys xff08 如果没有的话需创建
  • vscode+jlink+GDBServer在线调试

    GDB GDBServer JLink之间的关系 借用网上一张图 xff0c 原文参考 https blog csdn net qq 40833810 article details 106713462 我们在进行GDB调试时 xff0c
  • 嵌入式函数调用入栈与出栈

    简单的例程 xff0c 几个函数调用 xff0c 来查看寄存器状态 xff0c 主要是学习一下cortem M核中LR寄存器的理解 xff1a 例程源码 xff1a span class token keyword static span