[51微控制器] 一個故事看懂微控制器中的堆疊
阿新 • • 發佈:2019-02-12
下面,就要開始說明堆疊這個概念了,思來想去,還是覺得如果直接把“堆疊”這個詞用到文中來,實在不符合本文的風格,考慮到其實“堆疊”也是存貯區(這一點你要記住,堆疊並不是一個像專用暫存器那樣專門的一個區域,它是由你在通用RAM區指定的。),按照本文的說法也就是一些盒子,所以,現在我們把“堆疊”改名“記憶盒子”,你可以感覺到,“堆疊”的作用和記憶有極大的關係,不過你也不用在這裡糾結這個名字的由來,下面我會說的。現在,請注意,我要開始解釋“記憶盒子”了,也就是“堆疊”。大致上說,“記憶盒子”的作用是當C哥執行某任務到一半的時候突然有了更緊急的是事情要執行的時候用來儲存當前任務的(包括盒子的編號和盒子裡面的東西)。這麼說你肯定暈了,其實,通俗一點,就是當C哥洗襪子洗到一半的時候突然接到你的命令要去開啟另一個盒子(那個盒子裡的紙條上可能寫著“給我換尿布”)並執行裡面的命令,因為C哥記憶力很差,以至於他做完那件緊急的事情後記不起要回到哪個盒子來繼續執行“洗襪子”這個命令,這時候,他要把現在手頭的東西儲存到“記憶盒子”裡,要儲存的東西有:1、放著紙條和襪子的盒子的編號(注意這裡其實是兩項內容);2、那雙襪子。這樣,當他執行完緊急任務後會去記憶盒子裡,從裡面找到兩張紙條,和一雙襪子(這個時候C哥還是沒有想起來他要洗襪子,他必須要到那張寫著洗襪子命令的紙條),他按照兩張紙條的資訊知道自己要去哪個盒子去洗襪子,並在那裡繼續完成洗襪子的任務。你可能會發現,在這一段的解釋裡面有一個重要的漏洞,那就是在C哥執行完緊急任務後他是如何知道儲存著原來的任務資訊的盒子的編號是儲存在哪個“記憶盒子”裡呢?彆著急,下面我會解釋的。從本質來說,“記憶盒子”與普通的盒子是沒有區別的,他們都是微控制器裡面的儲存單元,證明這一點的最好證據就是堆疊是需要你來指定的,也就是說,你要預先把一些盒子指定為“記憶盒子”。下面,說明一下是如何指定“記憶盒子”的。其實這個過程很簡單,在微控制器的專用暫存器裡面有一個SP指標(81H),這個指標裡面記錄著堆疊的開始處的地址。用符合本文的話來解釋就是,C哥的衣服上有一個口袋(也就是SP指標),這個口袋裡面的“神奇紙條”上記錄著第一個“記憶盒子”的編號,而指定“記憶盒子”的過程就是你在這張“神奇紙條”上寫上一個盒子的編號(作為第一個“記憶盒子”的編號),這個紙條會自動地將紙條上的編號加1或者減1,所以,某個目前並不確定的區域內盒子具備了成為“記憶盒子”的可能,注意,堆疊的大小是不能規定的,這就是為什麼用“生長”這個詞來形容堆疊。現在,關於堆疊的概念基本上都介紹完了,但是,我知道,你可能還是很暈,甚至比看之前還暈,那是因為剛才敘述的這個過程是分開的,而且邏輯上並不是順序的,下面,順序的說一下,相信你馬上就明白了。主角仍然是傻傻笨笨但任勞任怨的C哥,他一個一個的開啟盒子按照裡面的紙條上的說明執行你規定的任務。而你,為了防止他在執行復雜任務時犯傻,把一個盒子指定為“記憶盒子”,並把這個“記憶盒子”的位置寫在了一張“神奇紙條”上放在了