Chinaunix首页 | 论坛 | 博客
  • 博客访问: 395663
  • 博文数量: 68
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 491
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-19 20:11
文章分类

全部博文(68)

文章存档

2015年(13)

2014年(30)

2013年(25)

我的朋友

分类: 嵌入式

2015-04-30 14:22:19

从这里开始就是真正的代码入口了!

接上篇代码:
AREA  Init,CODE,READONLY      ;声明一个名为Init的代码段,只读

           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

 

不好意思,上面讲得这段我还没太弄懂具体怎么回事......以后更新理解.....

 

阅读(1234) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~