嵌入式学习笔记(18)代码重定位实战 下篇

news2024/12/23 22:09:29

adr和ldr伪指令的区别

ldr和adr都是伪指令,区别是ldr是长加载、adr是短加载。

adr指令加载的是运行时地址;ldr指令加载的是链接地址。

(通过反汇编文件可以深入分析adr和ldr的区别)

重定位(代码拷贝)

重定位就是汇编代码中的copy_loop函数,代码的作用是使用循环结构来逐句复制代码到链接地址。

复制的源地址是iSRAM的0xd0020010,目标地址是iSRAM的0xd0024000,复制长度是bss_start减去_start。

复制的长度就是真个重定位需要重定位的长度,也就是整个程序代码段+数据段的长度。

bss段(0初始化的全局变量)不需要重定位。

清bss段

清除bss段是为了满足C语言运行时要求(C语言要求显示初始化为0的全局变量或者未显示初始化的全局变量值为0,实际上C语言编译器就是通过清bss段来实现C语言的这个特性的)。一般情况下我们的程序是不需要清bss段的(C语言编译器会自动帮程序添加一段头程序,这段程序会在main函数之前运行,负责清除bss)。但是在代码重定位了之后,因为编译器帮我们附加的代码只是帮我们清除了运行时地址那一份代码中的bss,而未清除重定位地址处开头的那一份代码中的bss,所以重定位之后需要自己去清除bss。

长跳转

清理完bss段后重定位就结束了,当前的情况就是:

(1)当前运行地址还是0xd0020010开头的(重定位之前的)那一份代码中运行着

(2)此时iRAM中已经有了2份代码,1份在0xd0020010开头,另一份在0xd0024000开头的位置。

然后就要长跳转了。

//重定位

// adr指令用于加载_start当前运行地址

adr r0, _start   // adr加载时就叫短加载

// ldr指令用于加载_start的链接地址:0xd0024000

ldr r1, =_start  // ldr加载时如果目标寄存器是pc就叫长跳转,如果目标寄存器是r1等就叫长加载

// bss段的起始地址

ldr r2, =bss_start // 就是我们重定位代码的结束地址,重定位只需重定位代码段和数据段即可

cmp r0, r1 // 比较_start的运行时地址和链接地址是否相等

beq clean_bss // 如果相等说明不需要重定位,所以跳过copy_loop,直接到clean_bss

// 如果不相等说明需要重定位,那么直接执行下面的copy_loop进行重定位

// 重定位完成后继续执行clean_bss。



// 用汇编来实现的一个while循环

copy_loop:

ldr r3, [r0], #4        // 源

str r3, [r1], #4         // 目的   这两句代码就完成了4个字节内容的拷贝

cmp r1, r2 // r1和r2都是用ldr加载的,都是链接地址,所以r1不断+4总能等于r2

bne copy_loop



// 清bss段,其实就是在链接地址处把bss段全部清零

clean_bss:

ldr r0, =bss_start

ldr r1, =bss_end

cmp r0, r1 // 如果r0等于r1,说明bss段为空,直接下去

beq run_on_dram // 清除bss完之后的地址

mov r2, #0

clear_loop:

str r2, [r0], #4 // 先将r2中的值放入r0所指向的内存地址(r0中的值作为内存地址),

cmp r0, r1 // 然后r0 = r0 + 4

bne clear_loop



run_on_dram:

// 长跳转到led_blink开始第二阶段

ldr pc, =led_blink // ldr指令实现长跳转



// 从这里之后就可以开始调用C程序了

//bl led_blink // bl指令实现短跳转



// 汇编最后的这个死循环不能丢

b .

 嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击这里扫码进群领资料,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!

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

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

相关文章

行业Demo分享|「园区智慧安防可视化系统」实现园区安防全面保障

在当今社会,园区安全问题备受关注。**为了解决园区的安全隐患并提升安全管理水平,园区智慧安防可视化系统应运而生。**这一系统利用先进的技术手段,将智能监控与安全管理完美地融合在一起,并通过可视化的方式,为园区提…

无swing,高级javaSE毕业之贪吃蛇游戏(含模块构建,多线程监听服务)

JavaSE,无框架实现贪吃蛇 文章目录 JavaSE,无框架实现贪吃蛇1.整体思考2.可能的难点思考2.1 如何表示游戏界面2.2 如何渲染游戏界面2.3 如何让游戏动起来2.4 蛇如何移动 3.流程图制作4.模块划分5.模块完善5.0常量优化5.1监听键盘服务i.输入存储ii.键盘监…

win10 sourcetree打开一闪就退出

参考文档: 解决方案参考文档一: Solved: cant install Sourcetree on Windows 10Solved: when I double-click the installation file or run as administrator,I can see a splash screen and disappear in 10 seconds,then I open thehttps://community.atlassian.com/t5…

GoFrame框架

GoFrame框架 GoFrame简介第一个GoFrame应用使用GoFrame实现一个完整的用户案例GoFrame对象管理GoFrame配置管理-配置对象GoFrame配置管理-文件配置GoFrame日志组件GoFrame错误处理GoFrame数据校验GoFrame Web服务简介GoFrame Web服务-路由规则GoFrame Web服务-路由注册GoFrame…

长胜证券:A股三大指数缩量探底券商股逆势拉升

周四,A股全天低开低走,三大指数均跌超1%,创业板指领跌。截至收盘,上证综指报收3122.35点,跌落1.13%;深证成指报收10321.44点,跌落1.84%;创业板指报收2056.98点,跌落2.11%…

索尼 toio ™应用创意开发征文|一个理想的绘画小助手

引言 toio™机器人是索尼推出的一款创意玩具,它的小巧和可编程性使其成为一个理想的绘画助手。通过编程控制机器人的运动和绘画工具,我们可以为小朋友提供一个有趣的绘画体验。 创意描述 我们可以通过JavaScript编程来控制toio™机器人的运动和绘画工具…

自己设计CPU学习之路——基于Xilinx FPGA应用开发

1. 一个32组位宽为32的寄存器堆 框图 代码 regfile.h ifndef __FEGFILE_HEADER__define __REGFILE_HEADER__define HIGH 1b1define LOW 1b0define ENABLE_ 1b0define DISABLE_ 1b1define DATA_W 32define DataBus 31:0define DATA_D 32de…

谷歌SEO手工外链工具好用吗?

答案是:不建议使用工具做谷歌外链,会被判断为作弊惩罚。 在当今的SEO环境中,外链仍然是一个核心组件,影响着网站的权威性和在搜索引擎结果页面(SERP)上的排名。 但是,随着时间的推移&#xff…

可视化大屏UI模板,随需切换,一秒生效

善用模板能够最大化地提高效率,美化可视化大屏,同时也能腾出更多时间去做深度数据分析挖掘。奥威BI可视化大屏支持UI模板随需切换,一秒生效。用户可以根据自己的喜好和需求,选择不同的UI模板,快速改变可视化大屏的外观…

密钥协商的几种方式和过程

密钥协商是在通信双方之间建立共享密钥的过程,以确保在通信过程中的数据安全性和机密性。下面将介绍几种常见的密钥协商方式和过程。 对称密钥协商 对称密钥协商是最简单和常见的密钥协商方式。在对称密钥协商中,通信双方通过一个安全的信道交换密钥。这…

如何将DHTMLX Suite集成到Scheduler Lightbox中?让项目管理更可控!

在构建JavaScript调度器时,通常需要为最终用户提供一个他们喜欢的方式来计划事件,这是Web开发人员喜欢认可DHTMLX Scheduler的重要原因,它在这方面提供了完全的操作自由,它带有lightbox弹出窗口,允许通过各种控件动态更…

Qt/C++音视频开发51-推流到各种流媒体服务程序

一、前言 最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等,其中经过大量的对比测试,个人比较建议使用mediamtx和ZLMediaKit,因为这两者支持的格式众多,不…

[Machine Learning][Day1]监督学习和无监督学习

目录 监督学习(Supervised Learning) 应用1:数据回归拟合 应用2:分类 无监督学习(Unsupervised Learning) 监督学习和无监督学习的区别 练习: 监督学习(Supervised Learning) 通过正确的输入和输出来进行学习的一种模型。输入x和正确的输…

你好,我是百川大模型|国内可开源免费商用Baichuan2揭秘

“ 百川智能发布了新一代语言模型Baichuan2。相比之前的第一代,新版本在各个学科领域的表现都有很大提升,特别是在数学、科学、安全方面的能力得到明显增强。Baichuan2以开源方式对外发布,为大模型领域提供了新的选择和可能。” 01 — 昨天下…

短信过滤 APP 开发

本文字数:7033字 预计阅读时间:42分钟 一直想开发一个自己的短信过滤 APP,但是一直没有具体实施,现在终于静下心来,边开发边记录下整体的开发过程。 01 垃圾短信样本 遇到的第一个问题是,既然要过滤垃圾短信…

JAR will be empty - no content was marked for inclusion!

现象 在对自建pom依赖组件打包时&#xff0c;出现JAR will be empty - no content was marked for inclusion!错误。 方案 在pom中怎么加packaging标签内容为pom&#xff0c;标识只打包pom文件 <?xml version"1.0" encoding"UTF-8"?> ...<grou…

MyBatis的逆向工程

文章目录 前言MyBatis的逆向工程创建逆向工程的步骤添加依赖和插件创建MyBatis的核心配置文件创建逆向工程的配置文件执行MBG插件的generate目标 QBC查询增改 总结 前言 MyBatis的逆向工程 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表…

《计算机网络安全》DNS与它的具体作用解析

初步了解DNS 个人介绍DNS定义DNS作用DNS的生活加速作用科普 个人介绍 &#x1f338;一名大四备考考研学子&#xff0c;喜欢前端&#xff0c;还有Android和JAVA开发 &#x1f332;爱看书和打游戏还有唱歌 &#x1f352;热爱编程和读古今中外名著 &#x1f33a;座右铭&#xff1…

JMeter 4.0 如何获取cookie

文章目录 前言JMeter 4.0 如何获取cookie1. 修改jmeter.properties 文件2. 添加HTTP Cookie 管理器3. 获取cookie信息 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天…

TikTok运营做不起来?IP如何选择?

作为跨境电商新蓝海&#xff0c;TikTok不断的加快自己推进电商业务的步伐&#xff0c;也吸引了越来越多的跨境商家入驻。但是很多人信心满满注册入驻后&#xff0c;却遇到了0播放&#xff0c;流量少&#xff0c;转化低的问题&#xff0c;Tiktok运营不起来&#xff0c;那你要注意…