社区
驱动开发/核心开发
帖子详情
ARM 大小端问题
pyx_code
2012-06-08 05:04:03
看过有些资料说:如果实际的存储格式与芯片的存储格式不符时,只有以字为单位的数据存取才正确,否则将出现不可预期的结果,这是如何理解的?
比如:现在arm是小端格式,如int i = 0x44332211存入flash中的0地址,现在 地址0是11,地址1是22,地址2是33,地址3是44;
现重启arm并在初始化为大端格式并读取0地址的值,i = *(int *)0x0;i还会为0x44332211吗?
...全文
452
5
打赏
收藏
ARM 大小端问题
看过有些资料说:如果实际的存储格式与芯片的存储格式不符时,只有以字为单位的数据存取才正确,否则将出现不可预期的结果,这是如何理解的? 比如:现在arm是小端格式,如int i = 0x44332211存入flash中的0地址,现在 地址0是11,地址1是22,地址2是33,地址3是44; 现重启arm并在初始化为大端格式并读取0地址的值,i = *(int *)0x0;i还会为0x44332211吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bjtea
2012-06-11
打赏
举报
回复
小端存放的0x44332211,大端读出来,当然是0x11223344。
所谓,存取正确,仅仅说的是,如果你按大端把字再存回去,还会与原来的存储的一样。即再按小端读出来,还是0x44332211。反之, 如果按字节来操作,想读高半字,就会读到低半字;存储的情况也相似。
但是,如果要进行运算,小端存,大端来运算,肯定是不对的。
daviddb7
2012-06-11
打赏
举报
回复
大小端只与CPU有关。
大端写,小端读,肯定就高低字节反了啊。
即使是以字节方式读,也不一定正确,你知道哪个字节应该放在高位吗?
4个字节拼成一个int,还是会错。
aidehua1988
2012-06-10
打赏
举报
回复
跟存储器的模式有关吧?~~~~~
lr2131
2012-06-10
打赏
举报
回复
上面说的“只有以字为单位的数据存取才正确”好像不对吧,应该是以字节为单位存储数据才不会有大小端的问题吧。毕竟字节内部是没有大小端之分的。不过编译器安排字节型数据的地址可能要占用一个字的地址,那么0x11占用0x00-0x03地址,0x22占用0x04-0x07地址,0x33占用0x08-0x0b地址,0x44占用0x0c-0x0e地址。这样的话数据会有点浪费,不过如果是少量的数据可以这样试试,大量的话可能要换方法了。
如果编译器安排这些字节型数据的地址能紧凑点话,那就好办了。编译器具体是按上面哪种方式进行的,我也没注意过,或许还和编译器的设置有管。LZ可以写个小程序试试看,打印一下开辟的内存地址就差不多了。
不过大小端都是基于内存而言,从flash读出来的数据会不会和这个有关,还真没注意过,我猜的话,读出来的数据是0x11223344。LZ自己写个小程序试试,应该不难做,毕竟实际结果才有说服力。想要代码好写又容易懂的话就用共用体的方式。如果对指针熟悉的话,也可以用指针,只是麻烦些,也不容易阅读。
union{
int a;
unsigned char b[4];
}
ARM
那些你得知道的事儿-1.1.
ARM
裸机第一部分视频课程
《
ARM
裸机全集》是朱老师物联网大讲堂嵌入式物联网核心课程中推出的第一环节,正在持续录制中。本课程是全套课程的第1部
ARM
裸机全集的第一个课程,目的是讲解嵌入式和
ARM
的一些基本概念,为之后的学习扫清障碍。
ARM
中
大小端
转换和位翻转
ARM
中的
大小端
转换有指令支持,可以查看
arm
_acle.h 文件 看具体定义 REV 反转字中的字节顺序。 REV16 独立反转每个半字中的字节顺序。 REVSH 反转低半字中的字节顺序,并将符号扩展到32 位。 注意以上指令仅仅是翻转字节顺序,每一个字节的存储数据还是MSB-LSB不变; 要翻转位的顺序,需要用下面的指令: RBIT 反转32 位字中的位的顺序。 本来存储的位是 31~0 ,经过以上指令后变为 0~31,仅支持32位数据。如果仅翻转一个字节的位序,还要做一次移位.
汇编码转机器码万能转换工具(Intel 32/64、
ARM
大小端
、Thumb
大小端
、
ARM
V8
大小端
、Thumb V8
大小端
、AArch64)
汇编码转机器码万能转换工具(Intel 32/64、
ARM
大小端
、Thumb
大小端
、
ARM
V8
大小端
、Thumb V8
大小端
、AArch64) 众所周知,计算机核心处理器就是CPU是计算机的重要组成部分。所有的程序都会化为机器代码由CPU去逐个执行。而CPU架构类型众多,也导致了多种指令类别的不统一。如果有涉猎不同的CPU指令集时转换工具会是最大的
问题
。于是借助业余时间,开发了这个万能的汇编...
关于
ARM
大小端
模式和CPU有关还是编译器有关
结论,
ARM
大小端
模式和CPU有关也和编译器有关系。
ARM
默认状态配置为小端模式,编译器不指定编译模式也默认是小端模式。但有些
ARM
是可以配置为大端模式的。例如:
ARM
v7-A: In
ARM
v7-A, the mapping of instruction memory is always little-endian.
ARM
v7-R: SCTLR.IE, bit[31], that i...
c语言AMR
大小端
转换,
ARM
中
大小端
转换和按字节反转
4.3.11.REV、REV16、REVSH 和 RBIT在字或半字内反转字节或位的顺序。语法op{cond} Rd, Rn{cond} Rd, Rn其中:op为下列项之一:REV反转字中的字节顺序。REV16独立反转每个半字中的字节顺序。REVSH反转低半字中的字节顺序,并将符号扩展到32 位。RBIT反转32 位字中的位的顺序。cond是一个可选的条件代码(请参阅条件执行)。Rd是目标寄存器...
驱动开发/核心开发
21,597
社区成员
21,709
社区内容
发帖
与我相关
我的任务
驱动开发/核心开发
硬件/嵌入开发 驱动开发/核心开发
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章