主题 : 启动代码 2440init.s 有些东西看不明白. 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 4843
精华: 0
发帖: 102
金钱: 810 两
威望: 554 点
综合积分: 204 分
注册时间: 2009-03-31
最后登录: 2012-11-14
楼主  发表于: 2009-05-12 16:43

 启动代码 2440init.s 有些东西看不明白.

AREA    Init,CODE,READONLY

    ENTRY

    ;1)The code, which converts to Big-endian, should be in little endian code.
    ;2)The following little endian code will be compiled in Big-Endian mode.
    ;  The code byte order should be changed as the memory bus width.
    ;3)The pseudo instruction,DCD can't be used here because the linker generates error.
    ASSERT    :DEF:ENDIAN_CHANGE
    [ ENDIAN_CHANGE
        ASSERT  :DEF:ENTRY_BUS_WIDTH
        [ 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
    ]
////////////////////////////////////////////////////////
问题:
1、DEF在这里是一个类似于ENDIAN_CHANGE的变量吗?有什么作用?
2、这里所有的代码都应该以小端格式编译吧?
3、这段代码的目的应该是:当外接端口固定为大端格式时,通过修改寄存器动态地改变到小端格式吧?
   如果是这样,当ENTRY_BUS_WIDTH=32,“b ChangeBigEndian”仍然是以小端格式编译吗?
   是不是因为大小端格式不影响指令(当总线宽度为32bits),只影响数据处理(包括取指时序)?

感觉表达得不是很清楚,请见谅!