首页 > 代码库 > 存储器格式是个大问题----ARM体系的存储系统

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

      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,如下表所示:

地址偏移大端格式小端格式
0x0012(op0)78(op3)
0x0134(op1)56(op2)
0x0256(op2)34(op1)
0x0378(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     else13         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----则是大端模式;

 

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