关于ARM的大小端问题我本来早就想着说一说来着,结果前段时间一直在写DIY调试器的那点事就一直拖到现在,心想如果再不写出来2.5把我熏忘了就不好办了,哈哈。大小端这个概念对于我们这些搞嵌入式的人来说应该不陌生,只不过我们平时很多情况下不用考虑它罢了,可能也因此造成一些已经跨入嵌入式行业好多年的人只知道个概念却不知道其具体的含义。下面我们就细说说,当作普及知识了,呵呵: 在计算机系统中,我们是一般是以字节为单位存储数据的,每个地址单元都对应着一个字节,一个字节为8bit。在C语言中,可能会有各个类型的变量,8位、16位、32位或者64位,那么对这些变量的存储则必然存在着一个多字节安排的问题,由此就导致了大端存储模式和小端存储模式。通常我们对大端和小端的定义为: (1)大端,Big-Endian,即高位字节排放在内存的低地址端,低位字节排放在内存的高地址端; (2)小端,Little-Endian,即低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 上面说的是概念,如果对应到实际CPU上来说,我们常用的X86架构是小端模式(Intel靠它统治了PC行业,心里响起那熟悉的旋律,灯。。。等灯等灯,哈哈),KEIL C51、PowerPC等则为大端模式(也是Intel最开始开发出来的架构,后来卖给各个半导体厂商了,要不说Intel真是NB),而我们现在常用的ARM处理器则既可以工作在大端模式下也可以工作在小端模式下,默认是工作在小端模式下的,那么我们怎么选择呢,这里我就以IAR环境下为例简单说说更改ARM大小端存储模式的方法:
|