ARM存储格式之 大端小端

发布者:EuphoricMelody最新更新时间:2016-08-13 来源: eefocus关键字:ARM  存储格式  大端小端 手机看文章 扫描二维码
随时随地手机看文章
开头讲个有关大端小端的故事:

  端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。  

 

  我们知道在内存中数据是以字节为单位进行存储的,每个地址单元对应着一个字节(byte),一个字节为8位(bite)。但是很多时候数据除了8bit额char外,还有16bit的short,32位的long型(要看具体的编译器),必然存在多字节安排的问题。不同的计算机存放多字节值的顺序不同,有些机器在起始地址存放低位字节(低位先存),即小端模式;有的机器在起始地址存放高位字节(高位先存),即大端模式。基于Intel的CPU,采用的是低位先存。而KEIL C51则为大端模式。大端小端对应着数据在存储器中的存放顺序。

  同时,在网络传输中,网络协议需要指定网络字节顺序,TCP/IP协议中使用16位整数和32位整数的高位先存模式,对应我们的大端模式。

  下面是两个具体例子:

  16bit宽的数0x1234在Little-endian模式(以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:
 

内存地址 小端模式存放内容 大端模式存放内容
0x4000 0x34 0x12
0x4001 0x12 0x34

  32bit宽的数0x12345678在Little-endian模式以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址 小端模式存放内容 大端模式存放内容
0x4000 0x78 0x12
0x4001 0x56 0x34
0x4002 0x34 0x56
0x4003 0x12 0x78

  联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。

  写程序判断处理器是Little-endian模式,还是Big-endian模式,可以通过以下程序:

  1>.通过将int强制类型转换成char单字节,通过判断起始存储位置。

1 void main(int argc, char **argv) 
2 { 
3 int i = 1; 
4 char *cp = (char *)&i; //前面是指针运算符*,前值类型转换。后面是取地址符号。 
5   if (*cp) //如果此时cp指向的内存为1的话,则为小端,否则为大端。 
6   printf("Little Endian\n"); 
7 else 
8 printf("Big Endian\n"); 

10 exit(EXIT_SUCCESS); 
11 }

注释:如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1(或者为0,也即是假)来确定是不是小端。

或者如下程序:

void main()
{
short int x;

char x0,x1;

x=0x1122;

x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元

if (0x11 == x0 && 0x22 == x1)
{
cout << "Big_endian" << endl;
}
else
{
cout << "Little_endian" << endl;
}
}

2>.利用联合体union的存放顺序是所有成员都从低地址开始存放,判断处理器模式。

bool checkCPU( )


union w 

int a; 
char b; 

} c; 
c.a = 1; 
return(c.b ==1);

}

以及如下程序:

bool isLittleEndian()
{
union _dword
{
int all;
struct _bytes
{
char byte0; 
char pad[3]; 
}bytes;
}dword;

dword.all=0x87654321;

return (0x21==dword.bytes.byte0); 
}

分析:如果你的处理器调用函数isLittleEndian返回1,那么说明你的处理器为little endian,否则为big endian.注意,如果在little endian处理器上,byte0和pad按内存从低到高的存放顺序:LOW->byte0 pad[0] pad[1] pad[2] ->HIGH;0x87654321按内存从低到高的存放顺序:  0x21  0x43   0x65   0x87, 可见byte0对应到0x21。所以通过判断dword中第一个字节dword.bytes.byte0是否与0x21相等就可以看出是否是little endian。

 

 

 PS:本文后面几个程序都是从网上摘抄过来的,对于联合体Union不是很清楚的可以参看http://blog.sina.com.cn/s/blog_3fa943920100ob37.html 我觉得这篇博文写的很详细。通过本文对大端小端模式有了一个比较深的理解吧。也希望对读者有些许帮助,谢谢!接下来我会总结下联合Union结构和Struct的区别。

关键字:ARM  存储格式  大端小端 引用地址:ARM存储格式之 大端小端

上一篇:LPC2210芯片加密的解释
下一篇:嵌入式linux-arm交叉编译工具链的构建

推荐阅读最新更新时间:2024-03-16 15:04

基于DSP/ARM的双核系统的通信接口设计
嵌入式系统的核心是嵌入式微处理器和嵌入式操作系统。早期的嵌入式系统硬件核心是各种类型的8位和16位单片机;而近年来32位处理器以其高性能、低价格,得到了广泛的应用。近年来,又出现了另一类数据密集处理型芯片DSP。DSP由于其特殊的结构、专门的硬件乘法器和特殊的指令,使其能快速地实现各种数字信号处理及满足各种高实时性要求。随着现代嵌入式系统的复杂度越来越高,操作系统已成为嵌入式系统不可缺少的部分。免费的嵌入式操作系统,如 Linux等,随着自身不断的改善,得到了飞速的发展。Linux是一个免费的、强大的、可信赖的、具有可伸缩性与扩充性的操作系统。Linux实现了许多现代化操作系统的理论,并且支持完整的硬件驱动程序、网络通信协议与多处
[单片机]
基于DSP/<font color='red'>ARM</font>的双核系统的通信接口设计
ARM Cortex-A9双核测试芯片成功流片
2012年2月27日,中国上海和英国剑桥——国际领先的IC设计公司及一站式服务供应商—灿芯半导体(上海)有限公司(以下简称“灿芯半导体”)与中芯国际集成电路制造有限公司(“中芯国际”,纽约证券交易所:SMI,香港联合交易所:0981.HK)及ARM今日联合宣布,采用中芯国际40纳米低漏电工艺的ARM® Cortex™-A9 MPCore™双核测试芯片首次成功流片。 该测试芯片基于ARM Cortex-A9双核处理器设计,采用了中芯国际的40纳米低漏电工艺。处理器使用了一个集32K I-Cache和32K D-Cache,128 TLB entries,NEON™ 技术,以及包括调试和追踪技术的CoreSight™ 设计套件。除高
[单片机]
ARM入门笔记(10)
USB 设备实验 一.背景 在ATMEL官方网站上提供了USB的应用例子(详情请参考 BasicUSB Application 说明),里面有源代码(是用IAR编译的,需要稍作修改才能用在ADS上),两个不同的USB驱动程序。两个不同的USB驱动程序,在PC机上是两个不同的应用例子。当安装完两个不同的驱动后,一个出现的是调制解调器的设备,可以用超级终端来完成USB数据的收发。另一个是USB 设备,用ATMEL提供的 BasicUSB_6124.exe 来完成USB数据的收发。我起初一直在用后面的例子来做实验,但试了很久都没有成功,后来改用前面的成功了。 二.USB驱动安装说明 当第一次与host PC机连接时,系统会弹出一个
[单片机]
ARM7 系列 LPC2103单片机简介
1简介 LPC2103是PHILIPS公司最新推出的基于ARM7TDMI-S、LQFP48封装的LPC2103,最高工作速度可达70MHz,32KB的片内FLASH程序存储器和8K的片内静态RAM。通过片内boot装载程序实现ISP/IAP编程。 LPC2103的10位A/D转换器提供8路模拟输入,低功耗实时时钟具有独立的电源和特定的32768HZ时钟输入,多达32个通用I/O口(可承受5V电压),可通过个别使能/禁止外围功能外围时钟分频来优化额外功耗。较小的封装和很低的功耗使LPC2103特别适用于访问控制和POS机等小型应用中;由于内置了宽范围的串行通信接口和8KB的片内SRAM,它也非常适合于通信网关和协议转换器。高
[单片机]
<font color='red'>ARM</font>7 系列 LPC2103单片机简介
arm-linux-gcc4.4.3编译s3c2410平台linux内核
一、首先下载linux内核: linux-2.6.14.tar.bz2 下载地址: http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2 二、解压linux-2.6.14.tar.bz2: tar -jxvf linux-2.6.14.tar.bz2 三、配置Makefile文件: 1、打开源码根目录下的Makefile文件: gedit Makefile 修改Makefile文件: ARCH ?= arm CROSS_COMPILE ?= arm-linux- 2、查看目录结构: ls -l linux-2.6.14/arch/arm/ d
[单片机]
ARM发展模式“芯”的方向
ARM开创的销售IP商业模式,其另一个更为长远的目标,可能就在于此,即建立一个统一标准的体系结构平台。 Intel采用“Intel Inside”的品牌行销策略,业已被广告业界誉为一个经典的案例,但每年数十亿美元的广告行销费用,同样让诸多效仿者大叹不如、望而却步。当然对于2003年营业额不到3亿美元的ARM来说这更不是一个明智地选择。 但ARM自2002年便开始在全球推广Connected Community公司联盟,所有的加盟公司共同致力于提供基于ARM体系结构的一整套包括从设计到生产的解决方案,涵盖半导体、操作系统、应用软件、EDA工具、开发以及PrimeXsys群体等产业链的各个领域。 ARM中国区总
[焦点新闻]
ARM---解决ads工程转到MDK(keil)可能出现的error
最近把ADS1.2工程转到MDK4.03出现一些error,罗列了可能出现的error,并给予相关的办法,让大家在以后的转换中尽快搞定 1:error : No section matches selector –no section to be FIRST/LAST. 把原来的Init 代码段名修改成RESET: ; AREA Init,CODE,READONLY AREA RESET,CODE,READONLY 2:error Undefined symbol Main (referred from 2440init.o). error: scatter-load file declares no hea
[单片机]
<font color='red'>ARM</font>---解决ads工程转到MDK(keil)可能出现的error
arm表示人工智能在推动汽车技术进步方面起到至关重要的作用
随着arm准备更新其汽车产品,EENews与arm负责汽车市场推广的副总裁Dennis Laudick进行了一次访谈。在访谈中,Laudick深入探讨了arm在汽车领域的战略重点,以及人工智能在推动汽车技术进步方面的重要作用。 Laudick首先指出,arm在汽车领域的最大推动力是围绕自动驾驶和ADAS(高级驾驶辅助系统)展开的,而人工智能是其中的关键部分。他强调,人工智能不仅令人兴奋,还有巨大的潜力拯救生命。他认为,汽车行业已经到了必须强制使用人工智能的阶段,因为它是由安全驱动的。借助人工智能,汽车行业可以将零死亡作为一个现实的目标,并且所需的计算量也是低功耗的。 Laudick还谈到了汽车技术的演变过程,从机械汽车到电
[汽车电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved