原文链接:https://blog.csdn.net/Andyzzhz/article/details/40405451
CPU:大小端模式的区别:
大端模式(Big-endian),是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
小端模式(Little-endian),是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
内存地址高地的理解:
我们对内存表的高位和低位的理解,就可以想做这里就是一张白纸. 我们把每个空格都当作一个位置,从0~1000开始计数,写在最前的就是低位,
比如说写四个数,从0~3 . GAME数据的低位~高位就是从G到M.
寄存器高位低位的理解:
之后呢,我们从内存表中区数据,放入寄存器中,我们可以把寄存器比做一个水桶,我们放入数据的时候肯定是把"水"先倒到水筒的底部.
如我们从内存中区GAME放入到水桶中的话 水桶中存放的数据就成了EMAG 也就是 45 4D 41 47 (注意每个字节是两个16进制的字符)
而水桶的高位和地位呢,想必大家会很明白,水桶的最上方就是高位,水桶底就是低位,所以EMAG 数据的高低位就是 E~G(E为最高位 G为最低位)
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。
我们常用的X86结构是小端模 式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式
举例:
假设有一块内存,物理地址从1000-2000,现在要存一个数据1234H.(字型数据,占16位,两个字节,两个储存单元)
内存的储存单元是字节,一个字节最大存10进制数255,16进制数FF.
在这里,低地址单元(1000)存入34,高地址单元(1001)存12.读取的时候就从高地址到低地址读取:1234H.
如果还要存12H(byte字节数据)那么就是,1002里面放入12h
此时内存排列是34 12 12.
如果还要存一个数据12345678h(dword数据32位)
那么就是 78 56 34 12.
总的内存排列就是 34 12 12 78 56 34 12.(每个字节作为一个储存单元)
可以用下面的程序测试:
int checkSystem( )
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return (c.ch ==1);
}
如果当前系统为大端模式这个函数返回 0;如果为小端模式,函数返回 1