跳轉指令用于實(shí)現程序流程的跳轉,在 ARM 程序中有兩種方法可以實(shí)現程序流程的跳轉:
(1) 使用專(zhuān)門(mén)的跳轉指令。
(2) 直接向程序計數器 PC 寫(xiě)入跳轉地址值。
通過(guò)向程序計數器 PC 寫(xiě)入跳轉地址值,可以實(shí)現在 4GB 的地址空間中的任意跳轉,在跳轉之前結合使用
MOV LR , PC
等類(lèi)似指令,可以保存將來(lái)的返回地址值,從而實(shí)現在 4GB 連續的線(xiàn)性地址空間的子程序調用。
===============================================
ARM 指令集中的跳轉指令可以完成從當前指令向前或向后的 32MB 的地址空間的跳轉,包括以下 4 條指令:
(1) B 跳轉指令
(2) BL 帶返回的跳轉指令
(3) BLX 帶返回和狀態(tài)切換的跳轉指令
(4) BX 帶狀態(tài)切換的跳轉指令
1、 B 指令
B 指令的格式為:
B{條件} 目標地址
B 指令是最簡(jiǎn)單的跳轉指令。一旦遇到一個(gè) B 指令,ARM 處理器將立即跳轉到給定的目標地址,從那里繼
續執行。注意存儲在跳轉指令中的實(shí)際值是相對當前PC 值的一個(gè)偏移量,而不是一個(gè)絕對地址,它的值由匯編器來(lái)計算(參考尋址方式中的相對尋址)。它是 24 位有符號數,左移兩位后有符號擴展為 32 位,表示的有效偏移為 26 位(前后32MB 的地址空間)。以下指令:
B Label ;程序無(wú)條件跳轉到標號 Label 處執行
CMP R1 ,# 0 ;當 CPSR 寄存器中的 Z 條件碼置位時(shí),程序跳轉到標號 Label 處執行
BEQ Label
2、 BL 指令
BL 指令的格式為:
BL{條件} 目標地址
BL 是另一個(gè)跳轉指令,但跳轉之前,會(huì )在寄存器R14 中保存PC 的當前內容,因此,可以通過(guò)將R14 的內容重新加載到PC 中,來(lái)返回到跳轉指令之后的那個(gè)指令處執行。該指令是實(shí)現子程序調用的一個(gè)基本但常用的手段。以下指令:
BL Label ;當程序無(wú)條件跳轉到標號 Label 處執行時(shí),同時(shí)將當前的 PC 值保存到 R14 中
3、 BLX 指令
BLX 指令的格式為:
BLX 目標地址
BLX 指令從ARM 指令集跳轉到指令中所指定的目標地址,并將處理器的工作狀態(tài)有ARM 狀態(tài)切換到Thumb 狀態(tài),該指令同時(shí)將PC 的當前內容保存到寄存器R14 中。因此,當子程序使用Thumb 指令集,而調用者使用ARM 指令集時(shí),可以通過(guò)BLX 指令實(shí)現子程序的調用和處理器工作狀態(tài)的切換。
同時(shí),子程序的返回可以通過(guò)將寄存器R14 值復制到PC 中來(lái)完成。
4、 BX 指令
BX 指令的格式為:
BX{條件} 目標地址
BX 指令跳轉到指令中所指定的目標地址,目標地址處的指令既可以是ARM 指令,也可以是Thumb指令。
聯(lián)系客服