代码改变世界

存储器格式是个大问题----ARM体系的存储系统

2014-09-27 15:01  牧羽  阅读(1649)  评论(0编辑  收藏  举报

      ARM处理器采用冯诺依曼结构,即指令和数据共用一条32位的数据总线,只有装载、保存和交换指令可以访问存储器中的数据。

   ARM处理器将存储器看作是一个从0开始的线性连续递增的字节集合。eg. 字节0-3保存第一个存储的字,字节4-7保存第二个存储的字,依次类推。

   地址空间:ARM结构使用232个8位字节地址空间,字节地址的排列从0~232-1.

   存储器格式:

   1)小端格式存储系统:记忆口诀 “小对小,高高低低”

   在小端格式存储系统中,一个字当中最低地址的字节被看作是最低位字节,最高地址的字节被看作是最高位字节。因此在存储系统中字节0连接到数据线7~0.

       2)大端格式存储系统:记忆口诀  “大对小,高低高低”,该格式符合人类的正常思维。

    在大端格式中,ARM处理器将最高位的字节保存在最低地址,最低位字节保存在最高地址上。此在存储系统中字节0连接到数据线31~24.

举例说明:

如果将一个32位的整数0x12345678存放到一个整形变量(int 型)中,其中OP0表示一个32位数据的最高字节MSB,OP3表示一个32位数据的最低字节LSB,如下表所示:

地址偏移 大端格式 小端格式
0x00 12(op0) 78(op3)
0x01 34(op1) 56(op2)
0x02 56(op2) 34(op1)
0x03 78(op3) 12(op0)

 如何编程测试自己所使用系统的存储格式?

1.采用指针的方法:代码如下

 1 #incldue <stdio.h>
 2 
 3 int main (void)
 4 {
 5     int i = 1;
 6     char *ptr = (char *)&i;
 7    
 8     if (1 == *ptr)
 9    {
10         printf("This system is little-endian\n");
11    }
12     else
13         printf("This system is big-endian\n");
14 
15     return 0;   
16 }

2.采用共用体的方法:代码如下

 1 int checksystem (void)
 2 {
 3     union check
 4     {
 5          int i;
 6          char   ch;
 7     }c;
 8    
 9     c.i = 1;
10     
11     return (c.ch == 1);
12 }

如果返回1----则是小端模式;如果返回0----则是大端模式;