壓棧 出棧 跳轉指令 LR PC

2021-10-05 10:16:35 字數 1555 閱讀 7077

一、壓棧和出棧

通常會在 a 函式中呼叫 b 函式,當 b 函式執行完以後再回到 a 函式繼續執行。因此必須在跳到 b 函式之前將當預處理器狀態儲存起來(儲存 r0~r15 暫存器值),當 b 函式執行完成以後再用前面儲存的暫存器值恢復 r0~r15 即可。

// 將通用暫存器 r4、lr 入棧

pop

// 先入後出,將棧中的資料彈出到通用暫存器 r4 及 pc 中

對於不同處理器來說,棧的增長方式有向上增長和向下增長,我們這裡重點關注向下增長的堆疊方式:

二、跳轉指令

三、連線暫存器 lr(r14)

連線暫存器 lr 常用於函式呼叫和產生中斷時,它們的區別是:

1、函式呼叫

mov pc, lr      // 此時 lr 中儲存的值是 pc-4,暫存器 lr 中的值賦值給 pc,實現跳轉
2、中斷

(1)中斷發生時,將 lr 入棧,lr 儲存的是 pc 的值,即 pc = 當前執行指令 + 8

(2)在中斷返回前 ,對 lr 進行處理,pc = lr-4,即 pc 指向之前被清空的已解碼但沒被執行的指令的位址

(3)然後清空流水線,返回中斷發生處開始向下接著執行。

(4)重新對丟棄的前一次已解碼指令取指並解碼執行。

push 

// 在 irq 中斷入口將 lr 暫存器壓棧

pop

// 中斷返回前,出棧

subs pc, lr, #4

// 將上面壓棧的 lr-4 暫存器資料出棧給 pc 暫存器,因為是 3 級流水線

四、程式計數器 pc(r15)

pc = 當前執行指令位址 + 8,中斷發生時儲存在 lr 中的是 pc 值,即 pc 指向正在取指的位址。

為什麼 pc = 當前執行指令+8 ?

【答】:第一條指令取指完成後,pc 就指向了第二條指令,此時 pc=pc+4;當第一條指令執行時,此時 pc =pc+8,每次該指令執行時,其實這時的 pc 值是 pc= pc+8。

五、程式狀態暫存器 cpsr

cpsr:包含了條件標誌位、中斷使能位、當預處理器模式標誌等一些狀態位以及一些控制位。

spsr:cpsr 的備份,因此 spsr 和 cpsr 的暫存器結構相同。

cpsr 常用於切換處理器模式,cpsr 暫存器的 bit[4:0] 位是處理器模式控制位:

python列表模擬棧 壓棧,出棧,查詢

root kl bin python3 author kl 列表模擬棧 壓棧,出棧,查詢 flist 定義棧 defpush it 定義壓棧 data input 資料 strip 提示使用者輸入資料,strip去掉兩邊空格 if data 判斷使用者輸入資料是否為空 else print 輸入內容...

鏈棧的壓棧和出棧「程式設計開發」

include using namespace std typedef float datatype struct node 節點型別定義 class linkstack 棧結構定義 建構函式,初始化乙個空鏈棧 linkstack 析構函式,釋放鏈棧中各結點的儲存空間 void push datat...

python完成棧的基本操作,壓棧,出棧 計算棧長

在python中不存在指標,所有需要進行鏈棧的操作時,自己初始化乙個棧的結點類,其中定義棧每乙個結點的屬性,乙個next,乙個資料 後邊的佇列和二叉樹的完成使用同樣的原理,自己定義每乙個資料結構的結點屬性值 順序棧的操作 棧的基本操作 class stacklist object def init ...