关于SPV210链接地址与运行地址的笔记
来源:互联网 发布:json.net dynamic 编辑:程序博客网 时间:2024/06/15 08:44
理解概念:位置无关编码:可以理解为汇编编码方式与内存地址无关
位置有关编码:汇编编码方式与内存地址有关
位置无关码取值 是通过指令间相对地址取值,而有关码是通过绝对地址来寻址。在ARM中最开始的几句代码都是位置无关代码,采用BL或者B进行跳转,而有关码通过LDR PC,=Lable 进行跳转,其中Lable为链接地址。位置有关码保证链接地址与运行地址一致程序才能正常运行。
链接地址:是由程序员指定地址,在程序链接后就智定下来
运行地址:芯片厂商指定程序运行地址,出厂固定,在SPV210中,出厂运行地址在IRAM中的0XD0020010,在写代码时链接地址设为0x00,但程序依旧可以运行,是因为SPV210厂家把0XD0020010地址映射到0X00000000中,从datasheet中可以看到IRAM&IROM有两个区域,这两个其实可以理解为同一片内存单元的两个门。
adr r0 , _start ;加载运行地址到r0当中
ldr r1, _start ;加载链接地址到r1当中
在SPV210代码重定位实验当中,指定链接地址为 0xD0024000
以上两句都是伪指令,反汇编内容如下:
adr r0, _start
d0024020:e24f0028subr0, pc, #40; 0x28
最左边为链接地址,其次为机器码,反汇编代码,注释。
运行地址推断: 根据链接地址0xd0024020得出偏移量为0x20,则pc地址为0xd0020010+0x20+8(流水线) = 0xd0020038,pc--0x28 正好等于0xd0020010,也就是运行地址的起始地址。注意:8级流水线。
ldr r1, _start
d0024024: e59f1048 ldr r1, [pc, #72]; d0024074
根据偏移量,这句运行的地址为0xd0020034, 此处的pc为链接地址,也就是0xd0024024+8,则[pc,#72]中的内容为地址0xd0024024+8+72内容,及备注中的d0024074,在反汇编代码中查看0xd0020074中存放的数据正好是0xd0024000,相当于把链接地址赋值r1.
d0024074: d0024000 andle r4, r2, r0
注:当直接读取pc的值时访问的是运行时地址,而当你读取[pc]的值时访问的是链接地址。从而明白adr加载的是运行地址,而ldr加载的是链接地址。
整体过程分析;
程序在运行之前先编译链接,链接完成之后,每句程序对应一个链接地址,如同反汇编那样,而链接地址的起始地址往往是DDR的起始地址。
但是一开始程序是在SRAM中运行的,运行地址的起始位置往往是SRAM的起始位置,那么一开始运行的代码他的链接地址和运行地址不同,但是代码本身不知道这件事,程序员明白,所以这段代码只能是位置无关码,主要负责一些初始化和重定位。知道搬运完成,pc的值还是运行时地址的值,也就是说pc不等于[pc].
通过绝对跳转修改pc的值为当前链接地址的值:如果用相对跳转就是当前运行地址加上一个偏移量,此时pc运行还是运行地址,这样就无法到DDR上执行程序。执行完ldr pc,=on_sdram 后 pc=[pc].
参考:http://www.cnblogs.com/douzi2/p/4970632.html
- 关于SPV210链接地址与运行地址的笔记
- 关于u-boot的链接地址和运行地址分析
- 代码的加载地址与运行地址
- 代码的加载地址与运行地址
- 关于LPC1768的存储地址、运行地址、向量地址
- 关于6.828实验中的bootloader链接地址与加载地址的思考
- 链接地址与存储地址
- 运行地址、链接地址、加载地址、存储地址
- 重新分析: 加载地址 存储地址 链接地址 运行地址
- 关于链接地址
- 加载地址与运行地址
- 运行地址与执行地址
- 编译地址与运行地址
- 链接地址学习笔记
- 链接地址学习笔记
- 反汇编代码里的地址 链接地址 运行地址 存储地址位置无关码 位置有关码
- 《C编译原理》程序的加载地址与运行地址
- 从两句汇编认识运行时地址与链接地址
- 彻底理解JavaScript原型
- windows 多线程编程防止死锁的几点经验 (转)
- 职业规划--毕业到现在的变化回顾
- codeforces Vasya and Petya's Game(筛选法)
- VisualSVN 钩子脚本
- 关于SPV210链接地址与运行地址的笔记
- PHP如何实现字符串翻转?
- CSS3 响应式布局
- python版猜数字游戏
- C/C++中的字符串4个库函数
- android bitmap与base64字符串之间转换
- php实现中文字串截取无乱码的方法
- 53. Maximum Subarray
- 两个队列实现一个栈,并实现入栈、出栈、取栈顶等相关操作