arm 大小端问题

[复制链接]
4293|4
 楼主| guwengchuixue 发表于 2012-6-8 17:05 | 显示全部楼层 |阅读模式
看过有些资料说:如果实际的存储格式与芯片的存储格式不符时,只有以字为单位的数据存取才正确,否则将出现不可预期的结果,这是如何理解的?
比如:现在arm是小端格式,如int i  = 0x44332211存入flash中的0地址,现在 地址0是11,地址1是22,地址2是33,地址3是44;

现重启arm并在初始化为大端格式并读取0地址的值,i = *(int *)0x0;i还会为0x44332211吗?
sixgett 发表于 2012-6-8 17:43 | 显示全部楼层
我也不是很懂,不过我理解是,所谓存储器中的大端格式存储数据,你将数据以小段格式存进去,读出来不变,而两种格式都是针对写进去而言的,没有说读出来不一样,我觉得读出来也是一样的,还是0x44332211,读出来再存进去就不一样了。
tiger84 发表于 2012-6-9 10:29 | 显示全部楼层
ARM基本上是数据支持大小端,指令只支持小端
JC.Wang 发表于 2012-6-9 13:56 | 显示全部楼层
开了大端之后, i=0x11223344了,不信你打印出来试试 ,用指针和用DWORD来访问,效果是一样的
 楼主| guwengchuixue 发表于 2012-6-9 14:53 | 显示全部楼层
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         也就是         b        ChangeBigEndian
            ]

            [ ENTRY_BUS_WIDTH=8
                streq        r0,[r0,-r10,ror #1] ;DCD 0x070000ea         也就是         b        ChangeBigEndian
            ]
        |
            b        ResetHandler
    ]
这段代码是如何理解的?
ARM复位后默认是小端格式,如果ENDIAN_CHANGE被定义是不是说明在编译的时候要使用大端方式编译代码。之后生成的bin文件是以大端还是小端的方式编程到flash,才使得执行上面一段代码不会错误呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

53

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部