从这里开始就是真正的代码入口了!
ENTRY ;程序的入口点,(调试用)
;ENTRY只是定义一个普通的入口点,且在程序中可以多处定义,如果要使用它作为整
个映像文件的唯一入口点,还需要设置链接器中的相关选项。
EXPORT __ENTRY ;导出符号_ENTRY
__ENTRY
ResetEntry ;复位后的入口
;ASSERT 是断言伪指令,语法是:ASSERT +逻辑表达式
;DEF是逻辑伪操作符,格式为::DEF:label,作用是判断label是否定义过
;下面的四句指令能且只能执行一句,并且前三句若执行跳转后处理程序的最后一句也是b ResetHandler
;" [ " 相当于 if ," | "相当于else ," ] " 相当于endif
ASSERT :DEF:ENDIAN_CHANGE ;判断ENDIAN_CHANGE 是否已定义
[ ENDIAN_CHANGE ;如果已经定义了ENDIAN_CHANGE,则判断,here is FALSE
ASSERT :DEF:ENTRY_BUS_WIDTH ;判断ENTRY_BUS_WIDTH 是否已定义
[ ENTRY_BUS_WIDTH=32 ;如果已经定义了ENTRY_BUS_WIDTH,则判断是不是为32
b ChangeBigEndian ;DCD 0xea000007
]
[ ENTRY_BUS_WIDTH=16
andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00
]
[ ENTRY_BUS_WIDTH=8
streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea
]
|
b ResetHandler ;复位异常,开发板上电或复位时进入0x00
]
分析上面一段:大端模式下,地址为A 的字单元包括字节单元A,A+1,A+2,A+3,字节单元由高位到低位为A,A+1,A+2,A+3 ;地址为A 的字单元包括半字单元A,A+2,半字单元由高位到低位为A,A+2
所以在这块字节单元A:ea,字节单元A+1:00,字节单元A+2:00,字节单元A+3:07。 b ChangeBigEndian 这条指令对应的是大端模式,相应的机器码为:0xea000007 ,低地址对应高字节,andeq r14,r7,r0,lsl #20 这条指令也是大端模式下,16位的半字重新放置机器码,由于总线不一样,取机器码的顺序不一样(具体我也不清楚,源代码上面 The code byte order should be changed as the memory bus width.)先取低位后取高位,低位为A+2字节单元里的值,高位为A字节单元里的值,即为0x0007ea00。
streq r0,[r0,-r10,ror #1]这条指令同样,8位的字节,先低后高,0x070000ea
不好意思,上面讲得这段我还没太弄懂具体怎么回事......以后更新理解.....