【裸机开发】使用汇编清除 .bss 段

news2024/11/27 12:49:19

目录

1、为什么要清除 .bss 段

2、使用汇编清除 .bss 段


1、为什么要清除 .bss 段

.bss 段保存的是 未被初始化 或者 初始化为0 的全局/静态变量。在编译器看来,这些东西是多余的,实际并不会给他们分配空间。因此,编译生成目标文件的时候,这些东西并不会被加载到目标文件中。目的是降低目标文件所占空间大小。

万一我们用到了这些未被初始化的全局变量(如自增),因为没有被初始化,可能会引发一些问题。这里清除 .bss 段其实就是在给 .bss 段中的变量清零,相当于给那些没有被初始化的变量赋予初值。

存储器会记下 bss 段的起始位置 __bss_start 和结束位置 __bss_end,以便于清零,等到运行程序的时候,bss 段会被加载到内存。

2、使用汇编清除 .bss 段

记录 bss 段的起始/结束位置

裸机开发时,我们可以在 lds 链接脚本中记录bss 段的起始位置和结束位置,以便于在 C 文件或者汇编文件中使用。下面的解析参考:lds 链接脚本的基本语法

SECTIONS
{
    . = 0x87800000;
    .text :
    {
        obj/start.o
        *(.text)
    }
    .rodata ALIGN(4) : { *(.rodata) }
    .data ALIGN(4) : { *(.data) }
    . = ALIGN(4);          /* 地址四字节对齐 */
    __bss_start = . ;      /* 记录 .bss 段的起始位置 */
    .bss ALIGN(4) : { *(.bss) *(COMMON) }
    __bss_end = . ;        /* 记录 .bss 段的结束位置 */
}

使用汇编对 bss 段清零

.global _start
 
_start: 
    /* 
        其他操作 
    */

    ldr r0, =__bss_start       @ 将lds脚本文件中的 __bss_start 加载到寄存器 r0
    ldr r1, =__bss_end         @ 将lds脚本文件中的 __bss_end 加载到寄存器 r0
    mov r2, #0                 @ r2 = 0(因为下面使用 stmia 不支持立即数操作)

bss_loop:
    stmia, r0!, {r2}            @ 将r2寄存器的值写入到r0指向的地址,同时r0自增4字节
    cmp r0, r1                  @ 判断是否到达 bss 段的末尾
    bne bss_loop                @ 如果不等于,继续初始化

    /* 其他操作 */

寄存器指令参考:

ldr赋值操作 

stm 读写内存 

cmp 条件执行 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

38.SpringCloud—注册中心(eureka/nacos)、负载均衡Ribbon

目录 一、SpringCloud。 (1)认识微服务。 (1.1)单体架构与分布式架构(微服务)。 (1.2)微服务技术对比。 (1.3)SpringCloud。 (2&#xff09…

linux创建静态库

创建一个目录,比如今天是6月13号,就mkdir 0613(创建目录0613),然后cd 0613(进入0613目录) 1.创建C语言库函数文件myheight.c vi myhight.c 2.创建C语言函数文件myweight.c vi myweight.c 3.创建C语言函数文件age.c vi myage.c 4…

代码审计-Java项目JDBCMybatisHibernate注入预编译写法

文章目录 Javaweb-数据库操作-模式&写法&预编译等环境搭建JDBC 注入分析关于预编译 Mybatis 注入分析Hibernate 注入分析总结: Javaweb-代码审计SQL注入-INXEDU在线网校 Javaweb-数据库操作-模式&写法&预编译等 环境搭建 VulDemo审计源码百度云 在…

深入理解深度学习——Transformer:解码器(Decoder)部分

分类目录:《深入理解深度学习》总目录 相关文章: 注意力机制(Attention Mechanism):基础知识 注意力机制(Attention Mechanism):注意力汇聚与Nadaraya-Watson核回归 注意力机制&…

微信小程序分享到微信,公众号h5分享到微信,微信小程序跳转h5页面

一:微信小程序分享到微信 1:需求 分享微信小程序中某个详情页,可以分享到群,个人,朋友圈,好友点击分享页,能跳转到对应详情页阅读。 2:分析问题 如何实现分享?分享时如…

Nvidia 3060显卡 CUDA环境搭建(Ubuntu22.04+Nvidia 510+Cuda11.6+cudnn8.8)

写在前面 工作中遇到,简单整理理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大…

【踩坑记录】STC8H8K64U硬件PWM使用小结

快速导航 写在前面库配置时钟配置GPIO配置定时器配置串口配置硬件PWM特殊功能同步功能 总结 写在前面 不出意外这是我第一次也是最后一次使用STC的芯片,写这篇博的目的纯粹记录下前段时间调试的痛苦经历,所有目前打算选或是已经开始调试这款芯片的朋友&…

Ubuntu16.04部署BEVformer 实时记录

一 配置依赖 a. Create a conda virtual environment and activate it. conda create -n open-mmlab python3.8 -y conda activate open-mmlabb. Install PyTorch and torchvision following the official instructions. pip install torch1.9.1cu111 torchvision0.10.1cu11…

【Linux】面试重点:死锁和生产消费模型原理

面试要点来了~ 文章目录 前言一、死锁的一系列问题二、生产者消费者模型原理总结 前言 上一篇的互斥量原理中我们讲解了锁的原理,我们知道每次线程申请锁的时候一旦申请成功这个线程自己就把锁带在自己身上了,这就保证了锁的原子性(因为只有…

备忘录模式(二十二)

相信自己,请一定要相信自己 上一章简单介绍了中介者模式(二十一), 如果没有看过, 请观看上一章 一. 备忘录模式 引用 菜鸟教程里面备忘录模式介绍: https://www.runoob.com/design-pattern/memento-pattern.html 备忘录模式(Memento Pattern&#xff…

基于Java单位人事管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

大面积无线WIFI覆盖 H3C WX3010E(AC+PoE三层交换机)+ H3C WA2620E、WA4320无线AP +华为USG6310S防火墙

一、适用场景: 1、跨复杂区域覆盖WIFI。支持多房间、多栋、多层复式楼、别墅、自建房的无线WIFI覆盖。 2、强大的漫游功能。楼上楼下移动使用WIFI时,需要支持WIFI的信号漫游,更换地理位置不掉线、不中断。 3、用户量或网络流量的负载均衡功…

IMX6ULL的官方SDK和官方BSP下载

买了块IMX6ULL的开发板,但是不想直接用开发板跟的程序,还有比如后面移植uboot和kernel的时候也想基于IMX6ULL官方的uboot和kernel做移植工作,所以自己先找一下怎么在官网下载这些东西。 1 官方SDK下载 百度搜索NXP官网,进去之后…

HotSpot虚拟机参数配置及优化

目录 一、JVM配置参数 二、GC回收日志分析 三、虚拟机性能监控和故障处理工具 1.命令工具 1):基础工具 2):性能监控和故障处理 2.可视化工具 四、JVM常出现问题 五、参考资料 一、JVM配置参数 HotSpot直到JDK9才提供统一的日志处理框架&#xff…

【k8s系列】使用MicroK8s 5分钟搭建k8s集群含踩坑经验

文章目录 MicrosK8s介绍版本选择准备三台虚拟机搭建MicroK8s环境安装Microk8s把当前用户加入Admin Group访问K8s启动和停止MicroK8s服务 搭建MicroK8s集群把Worker节点分别加入到MicroK8s集群在Master节点检查节点运行情况在Master节点打开存储插件在Master节点打开DNS插件查看…

低转速压榨,充分保留营养,用蓝宝原汁机每天轻享新鲜果汁

现在大家都特别重视健康,像是蔬菜、水果都是每天必需的,而且为了充分获取营养,很多人都会使用破壁机之类的工具,我觉得原汁机效果更好一些,它能够用慢速研磨技术来提取果汁,使用时不需要加水,能…

el-date-picker 结合dayjs 快速实现周选择、月选择,并设置控件的显示格式

目录 情况需求思路:使用el-date-picker 配置type属性,结合dayjsdayjs的安装以及常用api实现效果图 实现代码其他配置设置周选择控件显示一行为星期一 至 星期日 情况需求 在传递查询条件时,要求时间参数需要为 一周 或 一个月 思路&#xf…

系统移植 编译uboot和linux源码及驱动配置

写在前面:若是有些命令执行失败,前面添加sudo后再执行 目录 写在前面:若是有些命令执行失败,前面添加sudo后再执行 uboot源码获取和编译: Linux源码获取和编译 关于驱动配置 uboot源码获取和编译: 获…

驾驶安全、便捷,尽在车载Notification开发的掌握

Notification 概述 通知(Notification)是移动应用中常用的一种交互方式,用于向用户展示重要的信息、提醒事件或提供即时反馈等。通知可以以弹出窗口、图标或声音等形式呈现给用户。 以下是关于通知的一些基本概念和要点: 通知栏…

React基础教程(三):JSX语法

React基础教程(三):JSX语法 1、JSX简介 全称:JavaScript XMLreact定义的一种类似于XML的JS扩展语法:JSXML本质是React.createElement(component, props, ...children)方法的语法糖作用:用来简化创建虚拟DOM(注意&…