和筆記內容(26)

2021-10-09 05:33:59 字數 1788 閱讀 6534

跳轉指令用於實現程式流程的跳轉,在 arm 程式中有兩種方法可以實現程式流程的跳**

(1) 使用專門的跳轉指令。

(2) 直接向程式計數器 pc 寫入跳轉位址值。

通過向程式計數器 pc 寫入跳轉位址值,可以實現在 4gb 的位址空間中的任意跳轉,在跳轉之前結合使用

mov lr , pc

專門的跳轉指令

b、bl、bx、blx 和 bxj:

跳轉、帶鏈結跳轉(帶返回的跳轉)、跳轉並切換指令集、帶鏈結跳轉並切換指令集(帶返回的跳轉並切換指令集)、跳轉並轉換到 jazelle 狀態。

1、 b 指令

b 指令的格式為:

b 目標位址

b 指令是最簡單的跳轉指令。一旦遇到乙個 b 指令,arm 處理器將立即跳轉到給定的目標位址,從那裡繼

續執行。注意儲存在跳轉指令中的實際值是相對當前pc 值的乙個偏移量,而不是乙個絕對位址,它的值由彙編器來計算(參考定址方式中的相對定址)。它是 24 位有符號數,左移兩位後有符號擴充套件為 32 位,表示的有效偏移為 26 位(前後32mb 的位址空間)。以下指令:

b label ;程式無條件跳轉到標號 label 處執行

cmp r1 ,# 0 ;當 cpsr 暫存器中的 z 條件碼置位時,程式跳轉到標號 label 處執行

beq label

2、 bl 指令

bl 指令的格式為:

bl 目標位址

bl label ;當程式無條件跳轉到標號 label 處執行時,同時將當前的 pc 值儲存到 r14 中

3、 blx 指令

blx 指令的格式為:

blx 目標位址

blx 指令從arm 指令集跳轉到指令中所指定的目標位址,並將處理器的工作狀態有arm 狀態切換到thumb 狀態,該指令同時將pc 的當前內容儲存到暫存器r14 中。因此,當子程式使用thumb 指令集,而呼叫者使用arm 指令集時,可以通過blx 指令實現子程式的呼叫和處理器工作狀態的切換。

同時,子程式的返回可以通過將暫存器r14 值複製到pc 中來完成。

4、 bx 指令

bx 指令的格式為:

bx 目標位址

bx 指令跳轉到指令中所指定的目標位址,目標位址處的指令既可以是arm 指令,也可以是thumb指令。

總結語法

op1 label

op2 rm

其中:op1

是下列項之一:

b跳轉。

bl帶鏈結跳轉

blx帶鏈結跳轉並切換指令集。

op2是下列項之一:

bx跳轉並切換指令集。

blx帶鏈結跳轉並切換指令集。

bxj跳轉並轉換為 jazelle 執行。

cond

是乙個可選的條件**。 cond 不能用於此指令的所有形式。

.w是乙個可選的指令寬度說明符,用於強制要求在 thumb-2 中使用 32 位 b 指令。

label

是乙個程式相對的表示式。

rm是乙個暫存器,包含要跳轉到的目標位址。

操作bx 和 blx 指令可將處理器的狀態從 arm 更改為 thumb,或從 thumb 更改為 arm。

blx label 無論何種情況,始終會更改處理器的狀態。

bx rm 和 blx rm 可從 rm 的位 [0] 推算出目標狀態:

如果 rm 的位 [0] 為 0,則處理器的狀態會更改為(或保持在)arm 狀態

如果 rm 的位 [0] 為 1,則處理器的狀態會更改為(或保持在)thumb 狀態。

bxj 指令會將處理器的狀態更改為 jazelle

原文:

和筆記內容(1)

如果你想在當前目錄下 查詢 hello,world 字串,可以這樣 grep rn hello,world r 是遞迴查詢 n 是顯示行號 r 查詢所有檔案包含子目錄 i 忽略大小寫 下面是一些有意思的命令列引數 grep i pattern files 不區分大小寫地搜尋。預設情況區分大小寫,gr...

和筆記內容(13)

wallets.emplace name,std move wallet emplace construct and insert element auto wallet std make unique d smart pointer,建立病返回unique ptr至soft wallet的物件,這...

和筆記內容(14)

c explicit關鍵字詳解 首先,c 中的explicit關鍵字只能用於修飾只有乙個引數的類建構函式,它的作用是表明該建構函式是顯示的,而非隱式的,跟它相對應的另乙個關鍵字是implicit,意思是隱藏的,類建構函式預設情況下即宣告為implicit 隱式 那麼顯示宣告的建構函式和隱式宣告的有什...