分析微控制器堆疊,分享個人理解

2021-10-03 07:46:01 字數 1994 閱讀 7413

看關於微控制器方面的書籍的時候,總是能看到別人說的一些堆疊啊什麼的操作,之前看到這個術語就直接跳過,沒想到去**微控制器內部的原理。但是最近課程學習微機原理這門課,需要我們寫匯程式設計序,彙編裡面經常遇到堆疊這個東西,所以就找了個時間把堆疊給徹底的搞一下。

如果了解一點彙編程式設計話,就可以知道,堆疊是記憶體中一段連續的儲存區域,用來儲存一些臨時資料。通常用來儲存call指令呼叫子程式時的返回位址,ret指令從堆疊中獲取返回位址。中斷指令int呼叫中斷程式時,將標誌暫存器值、**段暫存器cs值、指令指標暫存器ip值儲存在堆疊中。

堆疊也可以用來儲存其他資料。

堆疊操作由push,pop兩條指令來完成;

堆疊操作的運算元均為子型別(兩個位元組)進行操作。

程式記憶體可以分為幾個區,棧區(stack),堆區(heap),全域性區(static),文字常亮區,程式**區。

程式編譯之後,全域性變數,靜態變數已經分配好記憶體空間,在函式執行時,程式需要為區域性變數分配棧空間,當中斷來時,也需要將函式指標入棧,保護現場,以便於中斷處理完之後再回到之前執行的函式。

棧是從高到低分配,堆是從低到高分配。

我們一般說的堆疊指的棧。堆疊又分硬堆疊和軟堆疊,硬堆疊即sp,從片內ram的頂部向下生長。軟堆疊在硬堆疊跟全域性變數區之間的空間,c51函式呼叫通過r0-r7和棧來實現。

為什麼微控制器啟動時,不需要用bootloader將**從rom搬移到ram,而arm則需要。這裡我們可以先看看微控制器程式執行的過程,微控制器執行分三個步驟,取執行—分析指令----執行指令。取指令的任務是:根據pc的值從程式儲存器讀出指令,送到指令暫存器。然後分析執行執行。這樣微控制器就從內部程式儲存器去**指令,從ram訪問相關資料。要知道ram取數的速度是遠高於rom的,但是微控制器因為本身執行頻率不高,所以從rom取指令慢並不影響。而arm不同,cpu執行的頻率高,遠大於從rom讀寫的速度,所以一般有作業系統,都需要將**部分拷貝到ram中再執行。

再來看乙個網上很流行的經典例子:

main.cpp

int a = 0; 全域性初始化區

char *p1; 全域性未初始化區

main()

int b; 棧

char s = 「abc」; 棧

char *p2; 棧

char *p3 = 「123456」; 123456/0在常量區,p3在棧上。

static int c =0; 全域性(靜態)初始化區

p1 = (char *)malloc(10); 堆

p2 = (char *)malloc(20); 堆

不知道你是否有點明白了,堆和棧的第乙個區別就是申請方式不同:棧(英文名稱是stack)是系統自動分配空間的,例如我們定義乙個 char a;系統會自動在棧上為其開闢空間。而堆(英文名稱是heap)則是程式設計師根據需要自己申請的空間,例如malloc(10);開闢十個位元組的空間。由於棧上的空間是自動分配自動**的,所以棧上的資料的生存週期只是在函式的執行過程中,執行後就釋放掉,不可以再訪問。而堆上的資料只要程式設計師不釋放空間,就一直可以訪問到,不過缺點是一旦忘記釋放會造成記憶體洩露。

使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

總結:其實堆疊就是微控制器中的一些儲存單元,這些儲存單元被指定儲存一些特殊資訊,比如位址(保護斷點)和資料(保護現場)。

2、這些儲存單元的位址被記在了乙個叫做堆疊指標(sp)的地方。

好了,以上就是這些。

概念這麼多,我該如何學

如何做好精準職業規劃

釋放潛能:學習效率提公升、程式設計能力提公升

從微控制器到嵌入式linux我們需要做什麼

提公升c程式設計能力

(stm32 usart串列埠應用)

基於stm32講解串列埠操作

(stm32直流電機驅動)

微控制器位址空間,堆疊理解

data 可定址片內ram 0x00 0x7f bdata 可位定址片內ram idata 可定址片內ram,允許訪問全部內部ram 0x00 0xff padata 分頁定址訪問片外ram xdata 可定址片外ram 0x0000 0xffff code 程式儲存區微控制器儲存器分rom跟ram...

51微控制器 堆疊

堆疊的作用是用在呼叫子程式或中斷程式時保護現場,因為51微控制器的暫存器是十分有限的,而相對來說普通資料儲存器更充足,通過入棧將暫存器中的內容臨時儲存到堆疊中 普通資料儲存器 這是乙個用時間換取空間的程式設計方式。51微控制器的堆疊是向上生長的,就是堆疊不為空時,棧底位址小於棧頂位址,當將資料入棧時...

51微控制器中的堆疊

在51微控制器中,堆疊 push 分為入棧和出棧 pop 遵循 先進後出,後進先出 的原則。堆疊可以看似乙個臨時儲存資料的暫存器。特點是儲存的資料不變,一般用來儲存中斷開始位址,和使用者所需要自己設定的資料。在使用時要現在片內ram中初始化,即給sp 堆疊指標乙個空間位址 然後按照先進後出恩,後進先...