打印

对ARM启动代码不解

[复制链接]
1775|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
John_light|  楼主 | 2008-6-19 16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下代码片断摘自IAR EWARM中某项目的cstartup.s79文件:
;********************************************************************************************************
;                                            ARM EXCEPTION VECTORS
;********************************************************************************************************

    MODULE    ?RESET
    COMMON    INTVEC:CODE:NOROOT(2)
    PUBLIC  __program_start
    EXTERN  ?cstartup

    IMPORT  OS_CPU_ARM_ExceptUndefInstrHndlr
    IMPORT  OS_CPU_ARM_ExceptSwiHndlr
    IMPORT  OS_CPU_ARM_ExceptPrefetchAbortHndlr
    IMPORT  OS_CPU_ARM_ExceptDataAbortHndlr
    IMPORT  OS_CPU_ARM_ExceptIrqHndlr
    IMPORT  OS_CPU_ARM_ExceptFiqHndlr

    CODE32

    ORG     0x00
__program_start:
    LDR        PC, [PC,#24]    ; Absolute jump can reach 4 GByte
    ORG     0x04
    LDR     PC, [PC,#24]    ; Branch to undef_handler
    ORG     0x08
    LDR     PC, [PC,#24]    ; Branch to swi_handler
    ORG     0x0C
    LDR     PC, [PC,#24]    ; Branch to prefetch_handler
    ORG     0x10
    LDR     PC, [PC,#24]    ; Branch to data_handler
    ORG     0x18
    LDR        PC, [PC,#24]    ; Branch to irq_handler
    ORG     0x1C
    LDR        PC, [PC,#24]    ; Branch to fiq_handler


    ORG     0x20
    DC32    ?cstartup
    ORG     0x24
    DC32    OS_CPU_ARM_ExceptUndefInstrHndlr
    ORG     0x28
    DC32    OS_CPU_ARM_ExceptSwiHndlr
    ORG     0x2C
    DC32    OS_CPU_ARM_ExceptPrefetchAbortHndlr
    ORG     0x30
    DC32    OS_CPU_ARM_ExceptDataAbortHndlr
    ORG     0x38
    DC32    OS_CPU_ARM_ExceptIrqHndlr
    ORG     0x3C
    DC32    OS_CPU_ARM_ExceptFiqHndlr

    ENDMOD

指令“LDR        PC, [PC,#24]”中的常数24是如何计算得来?

相关帖子

沙发
John_light|  楼主 | 2008-6-19 17:38 | 只看该作者

晕倒了一阵,苏醒过来了

既然要在ARM的地盘混饭吃,就要时刻保持ARM核的思维,简单得让人脸红……

例:
    ORG     0x00
    LDR        PC, [PC,#24]    ; Absolute jump can reach 4 GByte
该指令的PC值为0x08,[PC,#24]是[0x08 + 24] = [0x20]。结果把0x20地址处的数据(?cstartup地址)送到PC中,也就跳转到?cstartup。

使用特权

评论回复
板凳
John_light|  楼主 | 2008-6-20 11:34 | 只看该作者

何来万能一说?

Keil有AT

// Starupt Code must be linked first at Address at which it expects to run.

$IF (EXTERNAL_MODE)
        CODE_BASE       EQU     0x80000000
$ELSE
        CODE_BASE       EQU     0x00000000
$ENDIF

AREA   STARTUPCODE, CODE, AT CODE_BASE   // READONLY, ALIGN=4
       PUBLIC  __startup

       EXTERN  CODE32 (?C?INIT)

__startup       PROC    CODE32

// Pre-defined interrupt handlers that may be directly 
// overwritten by C interrupt functions
EXTERN CODE32 (Undef_Handler?A)
EXTERN CODE32 (SWI_Handler?A)
EXTERN CODE32 (PAbt_Handler?A)
EXTERN CODE32 (DAbt_Handler?A)
EXTERN CODE32 (IRQ_Handler?A)
EXTERN CODE32 (FIQ_Handler?A)

// Exception Vectors
// Mapped to Address 0.
// Absolute addressing mode must be used.

使用特权

评论回复
地板
John_light|  楼主 | 2008-6-20 15:03 | 只看该作者

能不能跑要看编程的人

为了让ARM上电能够执行有效代码,往往在0地址处是Flash。
如果将代码从Flash复制到RAM再执行,而这些代码是包含绝对地址的,那么该芯片应该支持地址重映射(remap),能够把RAM地址映射到0。
相对地址就无所谓。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

1094

帖子

2

粉丝