建立程序的時候,會分配記憶體作為棧。
實際棧指令(push,pop
)是其他指令的別名,實際指令是str、ldr或者其延伸指令
。例s***b sp,
==push
棧實現的幾種情況
堆疊型別
store
load
完全下降(高位址在上,低位址在下)
stmfd(s***b)
ldmfd(ldm)
完全公升序(高位址在下,低位址在上)
stmfa (stmib)
ldmfa (ldmda)
空公升序(高位址在下,低位址在上)
stmea (stm)
ldmea (ldmdb)
空降序(高位址在上,低位址在下)
stmed (s***a)
ldmed (ldmib)
總結:
完全f
:入棧的時候:sp先減4,然後在寫資料
。出棧的時候:先寫資料再執行sp+4
空e
:入棧的時候:先寫資料,然後再sp減4
。出棧的時候:先執行sp+4再寫資料
返回位址lr
:當前函式執行完,跳轉的下一條指令,通常是call當前函式所在位址的下一條位址。例如,下面的**中:當執行進son_add
函式中時,返回位址就是int c=10;
這條指令的位址,確保執行完son_add
函式後,返回到父函式father
中繼續執行流程,呼叫後面的**。也就是數返回位址保證的是每乙個函式塊間的指令流程
pc
:程式計數器,通常指向下一條指令的位址。例如:當前程式執行到了int a=8;
,當處理器編譯這條指令的時候,pc所儲存的值,就是int b = 9;
這條指令的記憶體位址,也就是pc暫存器保證的是每一條指令間的指令流程
棧幀(r11)
:函式呼叫的時候,會在棧中進行,每乙個函式執行過程就是乙個棧幀
int son_add(int a, int b)
int father()
棧幀結構
:下面這個圖可以適用於上面**中的fahter
函式,如果是son_add
的棧幀,只需要減少一步:返回位址的入棧操作
,為什麼會少這一步呢?首先需要知道:lr只表示當前函式的返回位址,如果當前函式有子函式,進入子函式lr就需要儲存子函式的返回位址,但是父函式的返回位址就會被覆蓋,所以需要先存起來,等子函式執行完成返回到父函式執行流程中,重新將返回位址存入lr中即可。因為上面的子函式內部不需要呼叫函式,所以不存在覆蓋情況,就只用lr即可。
/* 恢復幀指標,並將返回位址放入pc中,實現直接跳轉到返回位址處。在此步驟中,棧幀會被銷毀 */
ARM彙編程式設計基礎之四 ARM彙編偽操作
掌握了基本的arm彙編指令後,要寫出簡單的arm匯程式設計序,還必須要掌握基本的arm彙編偽操作 directive 現在我們來看乙個簡單的匯程式設計序,該程式呼叫子程式完成了加法操作。1 檔名 test.s 2 功能 實現兩個暫存器相加 3 area example,code,readonly 宣...
ARM彙編程式設計基礎之四 ARM彙編偽操作
掌握了基本的arm彙編指令後,要寫出簡單的arm匯程式設計序,還必須要掌握基本的arm彙編偽操作 directive 現在我們來看乙個簡單的匯程式設計序,該程式呼叫子程式完成了加法操作。1 檔名 test.s 2 功能 實現兩個暫存器相加 3 area example,code,readonly 宣...
ARM彙編之定址方式
arm指令集之定址方式 一 arm7指令集 arm7處理器有兩個指令集 32位的arm指令集,16位的thumb指令集。1 arm指令集 效率高,密度高 2 thumb指令集 具有較高的 密度。注 1.所有的arm指令集都是有條件執行的,而thumb指令集僅有一條指令具備條件執行功能。2.arm程式...