mini2440启动代码分析之第四篇(入口程序分析)
来源:互联网 发布:淘宝卖的300狗狗可信吗 编辑:程序博客网 时间:2024/06/05 13:35
从这里开始就是真正的代码入口了!
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
不好意思,上面讲得这段我还没太弄懂具体怎么回事......以后更新理解.....
- mini2440启动代码分析之第四篇(入口程序分析)
- mini2440启动代码分析之第四篇(入口程序分析)
- mini2440启动代码分析之第九篇
- mini2440启动代码分析之第十篇
- mini2440启动代码分析之第三篇(IMPORT)
- mini2440启动代码分析之第三篇(IMPORT)
- mini2440启动代码分析
- mini2440启动代码分析之第十一篇(完结)
- mini2440启动代码分析之第二篇(着重理解$HandlerLabel HANDLER $HandleLabel宏)
- mini2440启动代码分析之第五篇(中断向量表)
- mini2440启动代码分析之第六篇(DCD与二次查表判中断类型)
- mini2440启动代码分析之第八篇(清空SDRAM)
- mini2440启动代码分析之第二篇(着重理解$HandlerLabel HANDLER $HandleLabel宏)
- mini2440启动代码分析之第五篇(中断向量表)
- mini2440启动代码分析之第七篇(ResetHandler和存储控制寄存器初始化)
- mini2440启动代码分析之第一篇(注意名字,不是bootloader)
- ARM学习笔记012之mini2440上电的启动和初始化程序分析(即Bootloader分析)
- Mini2440 SDcard启动分析
- OpenCV 视频监控(Video Surveilance)的架构
- mini2440启动代码分析之第三篇(IMPORT)
- OpenCV 视频监控(Video Surveilance)的算法体系
- git pull简介
- QT QNetworkAccessManager demo
- mini2440启动代码分析之第四篇(入口程序分析)
- android shell 命令积累
- IOS APP发布的几个要点
- mini2440启动代码分析之第五篇(中断向量表)
- Linux基本命令使用
- Git fetch和git pull的区别
- Block Track 调试过程
- git revert和git reset的区别
- mini2440启动代码分析之第六篇(DCD与二次查表判中断类型)