http://www.cnblogs.com/Quincy/archive/2012/03/27/2418835.html
我們都知道X86系統進程中堆棧都向下增長的,那為什么是向下增長呢?
“這個問題與虛擬地址空間的分配規則有關,每一個可執行C程序,從低地址到高地址依次是:text,data,bss,堆,棧,環境參數變量;其中堆和棧之間有很大的地址空間空閑着,在需要分配空間的時候,堆向上漲,棧往下漲。”
這樣設計可以使得堆和棧能夠充分利用空閑的地址空間。如果棧向上漲的話,我們就必須得指定棧和堆的一個嚴格分界線,但這個分界線怎么確定呢?平均分?但是有的程序使用的堆空間比較多,而有的程序使用的棧空間比較多。所以就可能出現這種情況:一個程序因為棧溢出而崩潰的時候,其實它還有大量閑置的堆空間呢,但是我們卻無法使用這些閑置的堆空間。所以呢,最好的辦法就是讓堆和棧一個向上漲,一個向下漲,這樣它們就可以最大程度地共用這塊剩余的地址空間,達到利用率的最大化!!
呵呵,其實當你明白這個原理的時候,你也會不由地驚嘆當時設計計算機的那些科學家驚人的聰明和智慧!!

http://www.cnblogs.com/encode/p/3343499.html
51的棧是向高地址增長,INTEL的8031、8032、8048、8051系列使用向高地址增長的堆棧;但同樣是INTEL,在x86系列中全部使用向低地址增長的堆棧。其他公司的CPU中除ARM的結構提供向高地址增長的堆棧選項外,多數都是使用向低地址增長的堆棧。
在沒有MMU的時代,為了最大的利用內存空間,堆和棧被設計為從兩端相向生長。那么哪一個向上,哪一個向下呢?
  人們對數據訪問是習慣於向上的,比如你在堆中new一個數組,是習慣於把低元素放到低地址,把高位放到高地址,所以堆向上生長比較符合習慣。而棧則對方向不敏感,一般對棧的操作只有PUSH和pop,無所謂向上向下,所以就把堆放在了低端,把棧放在了高端。MMU出來后就無所謂了,只不過也沒必要改了
