ARM 如何实现绝对地址的跳转
2012-06-09 18:33
309 查看
基于 b跳转指令,ldr伪指令,ldr加载指令分析
有以下场景需用到
1.实现从Stepingstone中执行部分指令后,需跳转到SDRAM中执行,前提是必须先将NAND FLASH中代码copy到SDRAM,然后才能跳转到SDRAM去执行。跳转到SDRAM 需使用LDR伪指令LDR PC,=SDRAM 来实现
分析:
b指令是相对跳转指令,可以看到起反汇编代码是完全一样的,它依赖于当前PC寄存器的值,不管此代码链接地址如何,b指令都可以跳转到正确位置,这类指令称为位置无关指令
ldr pc,=labr 伪指令,从反汇编代码可以看出,是从内存的某个位置读出数据,并赋给pc寄存器,其中存放的值依赖于链接脚本文件的链接地址。是绝对跳转指令。
2.在SDRAM中实现中断的调试,必须将中断向量也在0x00000000位置放置,让其跳转到SDRAM对应位置
使用ldr加载指令(not ldr伪指令)实现绝对地址跳转
hander标号依赖于链接脚本地址的设定,将hander地址放在标号为step3标号的内存中,从而达到实现绝对地址跳转的目的。
和此内容相关的例子,可参考此代码(直接copy此代码到MDK工程,生成bin文件,运行在mini2440板子上):
http://my.csdn.net/wfq0624/code/detail/7750
有以下场景需用到
1.实现从Stepingstone中执行部分指令后,需跳转到SDRAM中执行,前提是必须先将NAND FLASH中代码copy到SDRAM,然后才能跳转到SDRAM去执行。跳转到SDRAM 需使用LDR伪指令LDR PC,=SDRAM 来实现
分析:
b指令是相对跳转指令,可以看到起反汇编代码是完全一样的,它依赖于当前PC寄存器的值,不管此代码链接地址如何,b指令都可以跳转到正确位置,这类指令称为位置无关指令
ldr pc,=labr 伪指令,从反汇编代码可以看出,是从内存的某个位置读出数据,并赋给pc寄存器,其中存放的值依赖于链接脚本文件的链接地址。是绝对跳转指令。
2.在SDRAM中实现中断的调试,必须将中断向量也在0x00000000位置放置,让其跳转到SDRAM对应位置
Vectors ldr PC, Reset_Addr ;@0x00复位 ldr PC, Undef_Addr ;@ 0x04: 未定义指令中止模式的向量地址 ldr PC, SWI_Addr ;@ 0x08: 管理模式的向量地址,通过SWI指令进入此模式 ldr PC, PAbt_Addr ;@ 0x0c: 指令预取终止导致的异常的向量地址 ldr PC, DAbt_Addr ;@ 0x10: 数据访问终止导致的异常的向量地址 nop ;@ 0x14: 保留 ldr PC, IRQ_Addr ;@ 0x18: 中断模式的向量地址 ldr PC, FIQ_Addr ;@ 0x1c: 快中断模式的向量地址 Reset_Addr DCD Reset_Handler Undef_Addr DCD Undef_Handler SWI_Addr DCD SWI_Handler PAbt_Addr DCD PAbt_Handler DAbt_Addr DCD DAbt_Handler nop IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler Reset_Handler <…对应指令代码 …> Undef_Handler b Undef_Handler ;未用到,可以用此指令保留 SWI_Handler b SWI_Handler ;未用到,可以用此指令保留 PAbt_Handler b PAbt_Handler ;未用到,可以用此指令保留 DAbt_Handler b DAbt_Handler ;未用到,可以用此指令保留 FIQ_Handler b FIQ_Handler ;未用到,可以用此指令保留 IRQ_Handler sub lr, lr, #4 ;@ 计算返回地址 stmdb sp!, { r0-r12,lr } ;@ 保存使用到的寄存器 ;@ 注意,此时的sp是中断模式的sp ;@ 初始值是上面设置的3072 ldr lr , =int_return ldr pc, =EINT_Handle ;@ 调用中断服务函数,在interrupt.c中 int_return ;因为ldr跳转不能够把下一条指令的地址保存到lr,所以需要在跳转之前字写指令保存起来, ldmia sp!, { r0-r12,pc }^ ;@ 中断返回, ^表示将spsr的值复制到cpsr END
使用ldr加载指令(not ldr伪指令)实现绝对地址跳转
hander标号依赖于链接脚本地址的设定,将hander地址放在标号为step3标号的内存中,从而达到实现绝对地址跳转的目的。
|
|
|
|
http://my.csdn.net/wfq0624/code/detail/7750
相关文章推荐
- pc实现跳转。函数指针与绝对地址的跳转
- 想让程序跳转到绝对地址0x100000处执行,该如何做?
- C语言实现程序跳转到绝对地址0x100000处执行
- <详解>C语言实现程序跳转到绝对地址0x100000处执行
- C语言实现程序跳转到绝对地址0x100000处执行
- STM8 FOR IAR 中实现绝对地址跳转
- <详解>C语言实现程序跳转到绝对地址0x100000处执行
- C语言实现程序跳转到绝对地址0x100000处执行
- 如何批量替换相对地址为绝对地址(利用bat批处理实现)
- arm926t 异常向量的映射,(如何从0地址到0x20000000地址)
- easyUI分页中,如何实现页面跳转,再返回时,仍然到跳转前页数。(含页面显示条数)
- JFig中如何使用绝对地址定义xml文件
- Keil中如何实现ARM与C51的兼容
- 如何通过HTML标记或JS代码实现跳转返回页面顶部
- UIWindow不使用代理如何实现根控制器的跳转(页面跳转的实现)
- Aspose Cells 控件如何实现数据过滤(附代码和下载地址)
- 如何实现在一个界面上点击不同的位置,会有跳转到不同的Activity上(假设背景是一个图片)
- Beyond Compare表格数据如何实现行的跳转
- ajax如何实现页面局部跳转与结果返回