跳轉指令用於實現程式流程的跳轉,在 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 隱式 那麼顯示宣告的建構函式和隱式宣告的有什...