打印

arm 大小端问题

[复制链接]
3486|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来访问,效果是一样的

使用特权

评论回复
5
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

粉丝