栈和堆的生长方向

FROM:http://blog.sina.com.cn/s/blog_6622340201011d81.html

 

51的栈是向高地址增长,INTEL8031803280488051系列使用向高地址增长的堆栈;但同样是INTEL,在x86系列中全部使用向低地址增长的堆栈。其他公司的CPU中除ARM的结构提供(事实上,stm32 lpc的 都是小端)向高地址增长的堆栈选项外,多数都是使用向低地址增长的堆栈。

 

在没有MMU的时代,为了最大的利用内存空间,堆和栈被设计为从两端相向生长。那么哪一个向上,哪一个向下呢?
  人们对数据访问是习惯于向上的,比如你在堆中new一个数组,是习惯于把低元素放到低地址,把高位放到高地址,所以堆向上生长比较符合习惯。而栈则对方向不敏感,一般对栈的操作只有PUSH和pop,无所谓向上向下,所以就把堆放在了低端,把栈放在了高端。MMU出来后就无所谓了,只不过也没必要改了。
  51这种单片机,没有堆,只有栈,所以把栈设计成向上,有利于扩展,比如52在127后面加个128个字节,程序就不必修改可以直接移植,如果是向下的话要利用这多出来的128字节就要修改程序,改变堆栈指针了。

 

如果将一个32位的整数0x12345678 存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。为简单起见,本文使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。  

 

地址偏移        大端模式       小端模式 
0x00           12(OP0)      78(OP3) 
0x01           34(OP1)      56(OP2) 
0x02           56(OP2)      34(OP1) 
0x03           78(OP3)      12(OP0)

 

1 下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:
2 
3 short int x;
4 char x0,x1;
5 x=0x1122;
6 x0=((char*)&x)[0]; //低地址单元
7 x1=((char*)&x)[1]; //高地址单元
8 //若x0=0x11,则是大端; 若x0=0x22,则是小端......
9 //上面的程序还可以看出,数据寻址时,用的是低位字节的地址

 

 

PS:数据间的地址高低看cpu的体系,一般是固定的。数据内的地址高低看cpu的大小端模式,有时可以改的。

posted on 2013-09-04 17:01  イケメンおっさん_汪汪  阅读(264)  评论(0编辑  收藏  举报

导航