加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

ARM 如何达成绝对地址的跳转

发布时间:2021-11-23 15:11:38 所属栏目:教程 来源:互联网
导读:基于 b跳转指令,ldr伪指令,ldr加载指令分析 有以下场景需用到 1.实现从Stepingstone中执行部分指令后,需跳转到SDRAM中执行,前提是必须先将NAND FLASH中代码copy到SDRAM,然后才能跳转到SDRAM去执行。跳转到SDRAM 需使用LDR伪指令LDR PC,=SDRAM 来实现 分
 基于 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  

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读