大小端模式,内存地址高低位,寄存器高低位

Posted jasmine_qy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大小端模式,内存地址高低位,寄存器高低位相关的知识,希望对你有一定的参考价值。

原文链接: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

以上是关于大小端模式,内存地址高低位,寄存器高低位的主要内容,如果未能解决你的问题,请参考以下文章

C语言怎么简单测试为大小端模式

iOS 关于大小端以及一些数据补位

小端大端

小端大端

为啥会有大小端模式之分呢?

大端模式和小端模式的理解