历史上的今天
返回首页

历史上的今天

今天是:2025年02月13日(星期四)

正在发生

2019年02月13日 | ARM 如何实现绝对地址的跳转

2019-02-13 来源:eefocus

基于 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对应位置


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标号的内存中,从而达到实现绝对地址跳转的目的。


+++++++++++link2.s+++++++++


.text


.global _start


_start:         b   step1


step1:          ldr pc,=step2


 


step2:          ldr pc,step3


step3:          .long   hander


hander:         b step4


step4:          b step4


 

+++++++++++Makefile++++++++++++++



link2:  link2.s


arm-linux-gcc -c -o link2.o link2.s


arm-linux-ld -Ttext 0x00000000 link2.o -o link2_elf_0x00000000


arm-linux-ld -Ttext 0x30000000 link2.o -o link2_elf_0x30000000


arm-linux-objdump -D link2_elf_0x00000000 > link2_0x00000000_dis


arm-linux-objdump -D link2_elf_0x30000000 > link2_0x30000000_dis


clean :


rm -f  *.o


  

link2_elf_0x30000000:    file format elf32-littlearm


Disassembly of section .text:


30000000


30000000:  eaffffff      b       30000004


30000004


30000004:  e59ff00c   ldr     pc, [pc, #12]; 30000018


30000008


30000008:  e51ff004   ldr     pc, [pc, #-4]         ; 3000000c


3000000c


3000000c:  30000010 .word         0x30000010


30000010


30000010:  eaffffff      b       30000014


30000014


30000014:  eafffffe     b       30000014


30000018:  30000008 .word         0x30000008


 

link2_elf_0x00000000:    file format elf32-littlearm


Disassembly of section .text:


00000000


   0:          eaffffff      b       4


00000004


   4:          e59ff00c   ldr     pc, [pc, #12]        ; 18


00000008


   8:          e51ff004   ldr     pc, [pc, #-4]         ; c


0000000c


   c: 00000010 .word         0x00000010


00000010


  10:          eaffffff      b       14


00000014


  14:          eafffffe     b       14


  18:          00000008 .word         0x00000008


推荐阅读

史海拾趣

问答坊 | AI 解惑

手动型和全自动型烧录器

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 烧录一般是指使用刻录机把数据刻录(也称烧录)到刻录盘。现在有CD、DVD两种刻录盘,后者容量要比前者大的多,烧录就象COPY一样。把你电脑里的东西COPY在别的文件载体上,就象1.4寸的磁盘就可 ...…

查看全部问答>

Array And Phased Array Antenna Basics

书本效果很不错~ 希望大家喜欢~ Array and Phased Array Antenna Basics by Hubregt J. VisserArray and Phased Array Antenna Basics introduces the principles of array and phased array antennas. Packed with first-handpractical exper ...…

查看全部问答>

怎么判断WindowsMobile集成了红外模块,红外设备怎么开关?

没有找到API来判断设备是否支持红外。 在一篇文章中提到:红外通信中,一般而言红外并没有开启、关闭之类的状态。 难道红外设备就不能开关了? 但在一些WM手机的“通信管理”中,是可以打开关闭红外的,求解。…

查看全部问答>

不一样的51教程之四 基本IO操作和 定时器/计数器

            前面的 之三 写得很辛苦。我当时说,这一篇对于你直接点亮LED就有直接帮助,当时我以为我说完 数据传送类 指令的时候,大家就明白了,不好意思,我再一次食言了。          &n ...…

查看全部问答>

为什么我用EEPROM是用int声明变量,但是只有255个啊

为什么我用EEPROM是用int声明变量,但是只有255个啊…

查看全部问答>

寄存器二级锁存能正确锁存吗

always@(posedge clk or negedge rst_n) begin     .........     areg1…

查看全部问答>

全江苏A题没有队入围复测

本帖最后由 paulhyde 于 2014-9-15 03:04 编辑 全国的同学都来南邮,我们南京那么多学校做A题,江苏那么多同学做A题,现在都不能再去南邮了。 只拿了省一,但是没有进入复测,是不是没有机会全国二等奖了呢?    …

查看全部问答>

【TIDesigns】推荐5款工业应用参考设计

用于可编程逻辑控制器 (PLC) 的 16 位模拟输出模块参考设计描述   此参考设计提供适用于可编程逻辑控制器 (PLC) 的完整的 4 通道、16 位模拟输出模块设计。此设计经过全面测试,符合适用于工业自动化系统的 IEC61000-4 EMC 和浪涌要求。 ...…

查看全部问答>

【转】运放学习中的常见疑问

本帖最后由 dontium 于 2015-1-23 11:31 编辑 1、运放输出端加一小电阻的作用? 答:运放输出短路的保护方法很简单,只要用一个小电阻R串接于运放的输出端,如图所示,就能防止输出短路失效。如果这个电阻接到反馈环路内,如图中虚线所示,除输出 ...…

查看全部问答>

《TM4C123微处理器原理与实践》 第二章TM4C123微处理器简介

TM4C123是TI公司基于Cortex-M4F内核的32位处理器; 2.1TM4C123微处理器的特点 基于Cortex-M4F内核,具有高效的信号处理及浮点运算功能,同时集成了高级运动控制PWM(Pulse Width Modulation脉冲宽度调制)和QEI(Quadrature Encoder Interface正 ...…

查看全部问答>