搬运啊搬运

RO Base设置为0xc000000 RW Base设置为0xc5f0000,可是BIOS不是要放0X0000000的吗

注意:如果是用44B0,那么44B0上电复位后PC的值是0,
    AREA    Init,CODE,READONLY

    ENTRY
ResetEntry
    b ResetHandler                ;for debug
    b HandlerUndef                ;handlerUndef
    b HandlerSWI                ;SWI interrupt handler
    b HandlerPabort                ;handlerPAbort
    b HandlerDabort                ;handlerDAbort
    b .                            ;handlerReserved
    b HandlerIRQ
    b HandlerFIQ

系统上电后第一条指令执行的是b ResetHandler    (在0地址处)这是一条相对跳转指令,也就是说,这条指令和RO的设置无关
跳转到ResetHandler处,进行一些初始化动作后,就要进行代码拷贝,就是把FLASH里的代码拷贝到RO指定的地址处,代码拷贝是这样实现的:


    ;****************************************************
    ;拷贝并粘贴 RW data/zero initialized data            *
    ;****************************************************
    adr    r0, ResetEntry        
    ldr    r1,BaseOfROM        
    cmp    r0,r1                
                                
    ldreq    r0, TopOfROM        
    beq    InitRamData            
    
    ;****************************************************
    ;计算拷贝程序在FLASH中的实际位置                       *
    ;****************************************************
    ldr    r2,=CopyProcBeg    
    sub    r1, r2, r1;r2-r1->r1
    add    r0, r0, r1    
    ldr    r3,=CopyProcEnd
    
    ;****************************************************
    ;将拷贝程序复制到ram中                                *
    ;****************************************************
0    
    ldmia    r0!, {r4-r7}        
    stmia    r2!, {r4-r7}        
    cmp    r2, r3
    bcc    %B0    
    
    ;********************************************************
    ;开始用ram中的拷贝程序复本将所有剩下的代码复制到ram中    *
    ;********************************************************
    ldr    r3, TopOfROM        
    ;ldr    pc, =CopyProcBeg    ;装入绝对地址(指到RAM中去的)
    b    CopyProcBeg
    ;********************************************************
    ;本段将代码由实际烧入的地址拷贝到ro-base所指定的位置    *
    ;只拷贝CopyProcEnd以后的代码                ;********************************************************
CopyProcBeg    
0    
    ldmia    r0!, {r4-r11}
    stmia    r2!, {r4-r11}
    cmp    r2, r3
    bcc    %B0    
CopyProcEnd
    
    sub    r1, r2, r3
    sub    r0, r0, r1        
    
InitRamData    
    ldr    r2, BaseOfBSS
    ldr    r3, BaseOfZero    
0
    cmp    r2, r3
    ldrcc    r1, [r0], #4
    strcc    r1, [r2], #4
    bcc    %B0    

    mov    r0,    #0
    ldr    r3,    EndOfBSS
1    
    cmp    r2,    r3
    strcc    r0, [r2], #4
    bcc    %B1            
;===================================================================
    adr    r0, ResetEntry        
    ldr    r1,BaseOfROM        
    cmp    r0,r1    
请注意这几条语句,尤其是adr    r0, ResetEntry,这条语句当你反汇编后发现是一条这样的指令
;[0xe24f0f5d]   sub      r0,pc,#0x174   ; #0xc008000
     也是一条与位置无关的指令,ResetEntry的值同PC的值相关联,
当然,PC一上电的值为0,所以这里ResetEntry的值也为0,所以
    ldr    r1,BaseOfROM        
    cmp    r0,r1
比较的结果就是R0 != R1于是进行代码拷贝,将复制程序拷贝完后,就可以跳转到RAM中去,执

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值