init.s文件分析

来源:互联网 发布:香港网络电视 编辑:程序博客网 时间:2024/05/16 01:55

 ASSERT  :DEF:ENDIAN_CHANGE   判断ENDIAN_CHANGE是否已定义
 [ ENDIAN_CHANGE                如果已经定义了ENDIAN_CHANGE,则判断ENDIAN_CHANGE 真值,如果为真
  [ ENTRY_BUS_WIDTH=32     
   b ChangeBigEndian     ;DCD 0xea000007           0xea000007 是 b ChangeBigEndian的机器码
  ]  

;在bigendian中,地址为A的字单元包括字节单元A,A+1,A+2,A+3,字节单元由高位到低位为A,A+1,A+2,A+3

;  地址为A的字单元包括半字单元A,A+2,半字单元由高位到低位为A,A+2

  [ ENTRY_BUS_WIDTH=16

   andeq r14,r7,r0,lsl #20   ;DCD 0x0007ea00    如果是半字对齐,则先取A+2 ea00   后A 0007
 ] 

  [ ENTRY_BUS_WIDTH=8     
   streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea          
  ]     
  |     
  b ResetHandler        //如果没有改变小端模式,则直接跳转  条件编译,所以这个是编译成第一个机器指令,占一个字 0x0--0x04
 ]  
 b HandlerUndef ;handler for Undefined mode    ox04     这些是中断入口
 b HandlerSWI ;handler for SWI interrupt     
 b HandlerPabort ;handler for PAbort      
 b HandlerDabort ;handler for DAbort      
 b .  ;reserved         
 b HandlerIRQ ;handler for IRQ interrupt     
 b HandlerFIQ ;handler for FIQ interrupt     

;@0x20
 b EnterPWDN ; Must be @0x20.      W
ChangeBigEndian
;@0x24
 [ ENTRY_BUS_WIDTH=32 c
  DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0      
  DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80;  //Big-endian      
  DCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0      
 ]  
 [ ENTRY_BUS_WIDTH=16  
  DCD 0x0f10ee11     
  DCD 0x0080e380     
  DCD 0x0f10ee01     
 ]  
 [ ENTRY_BUS_WIDTH=8  
  DCD 0x100f11ee     
  DCD 0x800080e3     
  DCD 0x100f01ee     
 ]  
 DCD 0xffffffff  ;swinv 0xffffff is similar with NOP and run well in both endian mode.
 DCD 0xffffffff  
 DCD 0xffffffff  
 DCD 0xffffffff  
 DCD 0xffffffff  
    b ResetHandler

原创粉丝点击