当前位置: 首页 > news >正文

[FreeRTOS 基础知识] 栈

文章目录

    • 栈的概念
    • 使用C语言实现 栈
    • 通过代码反汇编解析 栈


栈的概念

所谓的栈就是一块空间的内存,CPU的SP寄存器指向它,它可以用于函数调用,局部变量,多任务系统里保存现场。


使用C语言实现 栈

volatile int num=0;int fun_b(volatile int a)
{a = a+2;return a;
}    int fun_c(volatile int a)
{a = a+2;return a;
}    void fun_a(volatile int a)
{num = fun_b(a);num = fun_c(num);
}int main(void)
{fun_a(99);return 0;
}

代码中函数调用关系:
main -> fun_a
fun_a -> fun_b
-> fun_c


通过代码反汇编解析 栈

编译代码时,制作反汇编步骤: 在配置中添加命令

fromelf --text  -a -c --output=xxx.dis xxx.axf

在这里插入图片描述

其中的xxx.axf文件在linker中获取

在这里插入图片描述

运行后反汇编文件在工程目录下。查看反汇编代码:
在这里插入图片描述
main函数中使用BL命令跳转到fun_a函数(pc=0x80002d0,lr=0x08000308)
在这里插入图片描述
fun_a函数中使用BL命令跳转到fun_b函数(pc=0x80002ec,lr=0x080002d8),运行完fun_b函数后,使用BL命令跳转到fun_c函数(pc=0x80002f6,lr=0x080002e2)
在这里插入图片描述
在上面的过程中发现lr的值会被覆盖,若被覆盖就会导致找不到之前函数返回的地方。因此在每个函数的第一条反汇编会把lr值保存到栈中(使用push命令),当函数结束的时候使用pop命令回到之前的位置。

整个栈过程如下图所示:
在这里插入图片描述

相关文章:

  • 【源码】多语言H5聊天室/thinkphp多国语言即时通讯/H5聊天室源码/在线聊天/全开源
  • 【vscode免密连接云服务器】
  • PHP 操作日期各种转换,常见日期转换,涉及聊天时间转换、涉及日周月年转换、涉及到图表日期转换
  • 【TB作品】MSP430F5529单片机,温控小风扇,DS18B20温度读取,PWM风扇
  • 【Git】在错误分支上开发了怎么办
  • WIFI 万[néng]钥匙 v5.0.10/v4.9.80 SVIP版!
  • 直播分享|深入解析ts-morph:通过注释生成类型文档
  • 102.网络游戏逆向分析与漏洞攻防-ui界面的设计-反隐身功能的界面设计与实现(有不使用MFC生成,自己手写代码创建复选框与事件的例子)
  • imx6ull - 制作烧录SD卡
  • 特征工程技巧—Bert
  • ResizeObserver监听画布尺寸改变动态渲染echarts
  • Lua 基础 04 模块
  • Linux 系统安全及应用
  • FFmpeg解复用器(解封装)简单测试【2】
  • 每日一练——分糖果2
  • chrome扩展demo1-小时钟
  • FastReport在线报表设计器工作原理
  • Java的Interrupt与线程中断
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Markdown 语法简单说明
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Quartz初级教程
  • Vim Clutch | 面向脚踏板编程……
  • vue自定义指令实现v-tap插件
  • Zepto.js源码学习之二
  • 回顾 Swift 多平台移植进度 #2
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端性能优化——回流与重绘
  • 前嗅ForeSpider教程:创建模板
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一道面试题引发的“血案”
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #mysql 8.0 踩坑日记
  • $(selector).each()和$.each()的区别
  • (12)目标检测_SSD基于pytorch搭建代码
  • (3)选择元素——(17)练习(Exercises)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (阿里云万网)-域名注册购买实名流程
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (七)c52学习之旅-中断
  • (四)软件性能测试
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?