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 "); 11 } 12 else 13 printf("This system is big-endian "); 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----则是大端模式;