ARM彙編之棧

2021-09-10 02:44:10 字數 1769 閱讀 6402

建立程序的時候,會分配記憶體作為棧。

實際棧指令(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程式...