Cortex-M3 动态加载一(地址无关代码实现)

这篇文章是自己疑惑究竟地址无关性是如何实现,然后查看汇编和CPU指令手册,最后分析解除自己疑惑的,高手不要鄙视,哈哈。

编译C代码时候需要制定--acps/ropi选项,如下例子:

 1 void SystemInit(void)
 2 {
 3 }
 4 void fun_for_sub(void)
 5 {
 6     int j;
 7     for(j=65535;j >=0; j--)
 8       ;
 9 }
10 int main(void)
11 {
12          fun_for_sub();
13          while(1);
14 }
C-example

 

编译:

armcc  -c --cpu Cortex-M3 -O0 --apcs=interwork --apcs /ropi/rwpi -o main.o main.c

 

使用fromelf查看汇编代码

fromelf.exe -s -c main.o

 

text段生成的汇编代码如下:

 1 ** Section #1 '.text' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR]
 2     Size   : 14 bytes (alignment 2)
 3     Address: 0x00000000
 4 
 5     $t
 6     .text
 7     SystemInit
 8         0x00000000:    4770        pG      BX       lr
 9     fun_for_sub
10         0x00000002:    4770        pG      BX       lr
11     main
12         0x00000004:    b500        ..      PUSH     {lr}
13         0x00000006:    f7fffffe       ....    BL       fun_for_sub ; 0x2 Section #1
14         0x0000000a:    205a        Z       MOVS     r0,#0x5a
15         0x0000000c:    bd00        ..      POP      {pc}
汇编指令

 

查看关键的一句调用函数fun_for_sub的汇编代码:

0x00000006:    f7fffffe       ....    BL       fun_for_sub ; 0x2 Section #1

 

查找arm的官方DDI0403D_arm_architecture_v7m_reference_manual_errata_markup_1_0.pdf关于BL指令的解释如下:

Branch with Link (immediate) calls a subroutine at a PC-relative address.

得知BL是一条PC相关的指令。

具体看BL指令的构成:

 

 

根据我们产生的指令f7fffffe,

对应如下:

f7ff  :  15  14  13  12  11  10  9  8  7  6  5  4  3  2  11   1   1   1   0   1  1  1  1  1  1  1  1  1  1
fffe  :  15  14  13  12  11  10  9  8  7  6  5  4  3  2  11   1   1   1   1   1  1  1  1  1  1  1  1  1  0

 

符号位S=1,J1=1,J2=1,imm10 = 11 1111 1111,imm11 = 111 1111 1110

 

所以I1 = !(J1~S) = 1,  I2 = !(J2~S) = 1,

imm32 = SignExtend(S:I1:I2:imm10:imm11:’0’,32) = SignExtend(1:1:1:11 1111 1111:111 1111 1110:’0’,32) = 1111 1111 1111 1111 1111 1111 1111 1100 = 0xfffffffc。

0xfffffffc是-4的补码,另外当前PC是0x00000006,

再根据上面的Operation最后一步BranchWritePC( PC + imm32)

最终跳转到0x6 + (-4) = 0x2的地址出,即函数fun_for_sub的地址,因此实现根据当前PC实现了地址无关性的代码。

在X86平台下面也是差不多的原理,使用的也是基于PC相关的跳转指令。《程序员的自我修养—链接、装载和库》讲得很好。

转载于:https://www.cnblogs.com/ppym/p/3655425.html

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

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

相关文章

C#使用Log4Net记录日志【转】

第一步:下载Log4Net 下载地址:http://logging.apache.org/log4net/download_log4net.cgi 把下载的 log4net-1.2.11-bin-newkey解压后,如下图所示: 双击bin文件夹 双击net文件夹,选择针对.NET FramerWork的不同版本 找…

Map实现之HashMap(结构及原理)(转)

java.util包中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。List 适用于按数值索引访问元素的情形。 Map 则提供…

mysql对表中添加属性_菜鸟笔记—数据分析师MySQL篇(一)

简单说一下我写这份学习笔记的原因,由于工作的原因,想换一份工作,对于毕业已经快6年了,再次重新学习就需要付出很大的勇气和努力,如果态度还不能及时调整,最近找工作遇到的窘境就不言而喻了。去年底报了一个…

matlab打开笔记本摄像头_如何解决笔记本电脑摄像头异常问题

如果您遇到笔记本电脑相机异常问题(无法侦测视讯装置、视讯无画面、视讯画面异常、视讯画面颠倒等等),请参考以下疑难解答方式依序尝试。提供应用程序权限 / 检查防病毒软件/ 更新Windows Update / 更新相机驱动程序/透过系统还原点还原系统/ 系统还原1. 提供应用程…

边框颜色为 tintColor 的 UIButton

创建一个 UIButton 的子类,重写其方法: - (void)drawRect:(CGRect)rect {[[self layer] setCornerRadius:CORNER_RADIUS];[[self layer] setMasksToBounds:YES]; [[self layer] setBorderWidth:1];[[self layer] setBorderColor:self.tintColor.CGColo…

netty SimpleChannelInboundHandler类继承使用

2019独角兽企业重金招聘Python工程师标准>>> 继承一个SimpleChannelInboundHandler来实现我们的Client,我们需要重写其中的三个方法: package NettyDemo.echo.handler;import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; …

高中关于人工智能方面的课题_如何看待计算机专业开始设置人工智能课程

首先,当前计算机专业当中设置与人工智能相关的课程是一个必然的趋势,随着人工智能技术开始逐渐实现落地应用,未来计算机相关专业的课程当中,人工智能课程的比重也会逐渐提升,而且一定要重视这些课程,这对于…

Linux命令-目录处理命令:mkdir

mkdir /tmp/beijing mkdir -p /tmp/shijiazhuang/yuhuaqu 一条命令可以同时创建父目录和子目录 mkdir /tmp/beijing/chaoyangqu /tmp/beijing/dongchengqu /tmp/beijing/tongzhouqu 同时创建多个目录

tableau 倒序都倒了_Tableau优秀作品拆解复刻01-是时候终结瘘管病了

写在最前面:这个复刻系列是学习tableau官网库中的优秀作品。学习他们亮眼图表的制作细节,仪表板的排版,颜色的搭配以及交互。tableau库的链接:优秀作品都在这里展示。库​public.tableau.com1 整体布局 颜色: 采用橙色…

目前最细致清晰的NSDictionary以及NSMutableDictionary用法总结(转)

做过Java语言 或者 C语言 开发的朋友应该很清楚 关键字map 吧,它可以将数据以键值对儿的形式储存起来,取值的时候通过KEY就可以直接拿到对应的值,非常方便。在Objective-C语言中 词典对象就是做这个事情的,不过在同一个词典对象中…

android string数组转json_移动端开发基础【20】pages.json的配置项pages

uni-app项目是通过pages节点配置应用由哪些页面组成,pages节点接收一个数组,数组每个项都是一个对象,其属性值如下:(1) 属性:path类型:String描述:配置页面路径(2) 属性:style类型&a…

Ubuntu Server 分区案例

为什么80%的码农都做不了架构师?>>> 只有一台服务器,配置硬盘1TB,内存4GB,既要做开发服务器,又要做Web服务器和数据库服务器,分区如下: 挂载点大小分区格式 /boot512MBext4/20GBext…

360网络修复工具_为什么大家都在骂360,但是360依旧是很强?

相信很多小伙伴也多多少少的听说过就是不要随便装360,因为装上360会如何如何。这些人往往说起来也是很有道理,我在以前上学的时候也是这么觉得,但是后来工作之后发现并不是这样。360先说一下360安全卫士的功能,有系统优化、垃圾清…

Java运行时内存

对于java程序员来说,并不必显示地对内存进行管理,一切都交给java虚拟机去做吧,而且,你也不一定做得比java虚拟机来得专业。好像所有内存管理都交给虚拟机去做就万事大吉了,但是,事实有时并非如此&#xff0…

中班机器人上课视频_家委会:出班费买智能扫地机器人,不用家长搞卫生了,莫名其妙...

【01】原来大家上学,几乎是很随意的样子,有人至没上过幼儿园,有的上过半年,然后就直接升小学。可即使是升小学了,家长也不会管,全凭自己了。可如今随着社会的发展,父母们都非常重视孩子们的学习…

Powerful Sleep(神奇的睡眠-睡眠生物钟的秘密:如何睡得更少却睡得更好)阅读笔记...

睡眠机制 我们活着的时候,大脑会产生脑电波。脑电图仪器通过贴在人头上的一些电极读出脑电波的活动,然后把活动用图表显示出来。 睡眠过程可以分为5个过程,划分依据与大脑发出的脑电波类型。 当人清醒时,大脑发出β脑电波&#xf…

ue4集合类型_UE4粒子系统渲染管线概述

本文基于UE4版本4.25.3,对Cascade粒子系统的移动端渲染管线进行简单的概括和描述。Game Thread部分粒子系统Actor被Spawn(或所在的Level被加载)的时候,UParticleSystemComponent注册和初始化,并通过CreateSceneProxy函…

2、Sprite,SpriteBatch,Texture,TextureRegion的初步认识

昨天搭建了环境,今天就初步接触这个4个控件(Sprite,SpriteBatch,Texture,TextureRegion) 1、SpriteBatch 这个吗,我没有看api文档,偶是直接看土豆的博客学习的,我看了代码…

莒南机器人_莒南42项重点建设项目公布!一定有你关注的

10日,县发改局公布莒南县2020年重点建设项目表!涉及工业、服务业、基础设施、现代农业等行业,共42项。详↓工业1、山东钢铁集团永锋临港有限公司临港先进优特钢产业基地一期项目投资方:山东钢铁集团永锋临港有限公司建设地点&…

配置Mysql实现主从复制与读写分离

环境说明 主从复制使用mysql自带的master与slave机制;读写分离使用mysql-proxy实现! 有服务器三台:s1,s2,s3。 s1为web服务器,装有httpd,php,mysql,mysql-proxy。 s2为主数据库服务器&#xff0…