Cortex-M3 动态加载一(地址无关代码实现)
这篇文章是自己疑惑究竟地址无关性是如何实现,然后查看汇编和CPU指令手册,最后分析解除自己疑惑的,高手不要鄙视,哈哈。
编译C代码时候需要制定--acps/ropi选项,如下例子:
void SystemInit(void)
{
}
void fun_for_sub(void)
{
int j;
for(j=;j >=; j--)
;
}
int main(void)
{
fun_for_sub();
while();
}
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段生成的汇编代码如下:
** Section #1 '.text' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR]
Size : 14 bytes (alignment 2)
Address: 0x00000000 $t
.text
SystemInit
0x00000000: 4770 pG BX lr
fun_for_sub
0x00000002: 4770 pG BX lr
main
0x00000004: b500 .. PUSH {lr}
0x00000006: f7fffffe .... BL fun_for_sub ; 0x2 Section #
0x0000000a: 205a Z MOVS r0,#0x5a
0x0000000c: bd00 .. POP {pc}
汇编指令
查看关键的一句调用函数fun_for_sub的汇编代码:
0x00000006: f7fffffe .... BL fun_for_sub ; 0x2 Section #
查找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 1
1 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 1
1 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相关的跳转指令。《程序员的自我修养—链接、装载和库》讲得很好。
Cortex-M3 动态加载一(地址无关代码实现)的更多相关文章
- 动态加载js、css 代码
一.原生js: /** * 加载js和css文件 * @param jsonData.path 前缀路径 * @param jsonData.url 需要加载的js路径或css路径 * @param ...
- Android动态加载框架汇总
几种动态加载的比较 1.Tinker 用途:热修复 GitHub地址:https://github.com/Tencent/tinker/ 使用:http://www.jianshu.com/p/f6 ...
- 关于实现Extjs动态加载类的方式实现
Extjs4以前的版本没有动态加载类的方式,这样开发程序的时候加载很多的js会导致加载变慢,由于本人一直使用extjs3的版本进行开发,于是简单实现了一个动态加载类的管理器,使用方式与extjs4的方 ...
- java动态加载配置文件(申明:来源于网络)
java动态加载配置文件 地址:http://blog.csdn.net/longvs/article/details/9361449
- [Android]动态加载/热部署框架汇总
1.DroidPlugin 用途:动态加载 使用案例:360手机助手 GitHub地址:https://github.com/Qihoo360/DroidPlugin ppt介绍:https://gi ...
- flash的动态加载技术
这里所说的动态加载技术, 主要是指代码模块(可以是swc也可以是swf)的动态加载.即主swf在运行的时候, 可以根据需要动态加载所需的代码模块. 为了讨论方便, 下面所说的代码模块都用swc表示,用 ...
- ios ableviewcell的动态加载数据,模仿喜马拉雅动态数据加载
iphone(UITableViewCell)动态加载图片http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Intr ...
- Delphi静态加载DLL和动态加载DLL示例
下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL. 直接上代码. 1.静态加载示例 unit Unit1; interface uses W ...
- vue路由动态加载
注意:是动态加载不是动态路由 解决的问题: 动态配置菜单栏的路由参数--实现菜单级的权限控制 问题成因: 在vue实例化的时候vuex.vue-router 就需要加载完毕,无法使用异步的方式从服务器 ...
- JavaScript动态加载js文件
/********************************************************************* * JavaScript动态加载js文件 * 说明: * ...
随机推荐
- iOS 9适配技巧(更新版)
转自: http://www.cocoachina.com/ios/20150929/13598.html 中文快速导航: 1.iOS9网络适配_ATS:改用更安全的HTTPS(见Demo1) i ...
- 【转载】Java线程面试题 Top 50
Java线程面试题 Top 50 2014/08/21 | 分类: 基础技术 | 4 条评论 | 标签: 多线程, 面试题 分享到:140 本文由 ImportNew - 李 广 翻译自 javare ...
- update语句的执行步骤及commit语句的执行顺序
update语句的执行步骤和其他DML语句的执行步骤是一样的包含insert .delete语句等,执行步骤如下: 一.如果数据和回滚数据不在数据库高速缓存区中,则oracle服务器进程将把他们从数据 ...
- php or || 和 and &&
追溯代码时遇到这个坑,一直是略有懵懂,那就填了这个坑. 1 if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = BASEPATH.' ...
- PHP获取毫秒时间戳
我们知道,PHP中time()函数获取的时间戳,其单位是秒. 但是,前端JS获取的时间戳,单位是毫秒. 那么,在实际应用中,如何将JS和PHP的时间戳统一,即如何使用PHP获取毫秒时间戳呢,请看下例: ...
- cocos2d-x box2d使用调试绘图
cocos2d-x box2d使用调试绘图 复制TestCpp的GLES-Render.h和GLES-Render.cpp过来. 添加一个成员变量: GLESDebugDraw *m_debugDra ...
- C语言中内存分配 (转)
在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...
- C++STL_max
template<class T> T max(T a,T b) { return a>b?a:b; }
- sqlserver 编辑、修改字段说明(备注) sp_addextendedproperty
语法 sp_addextendedproperty [ @name = ] { 'property_name' } [ , [ @value = ] { 'value' } [ , [ @leve ...
- use magento default datepicker plugin in your project
<action method="addItem"><type>js_css</type><name>calendar/calenda ...