B、BL、BX、BLX 和 BXJ
跳轉、帶鏈接跳轉、跳轉并切換指令集、帶鏈接跳轉并切換指令集、跳轉并轉換到 Jazelle 狀態。
語法
op1{cond}{.W} label
op2{cond} Rm
其中:
op1
是下列項之一:
B
跳轉。
BL
帶鏈接跳轉
BLX
帶鏈接跳轉并切換指令集。
op2
是下列項之一:
BX
跳轉并切換指令集。
BLX
帶鏈接跳轉并切換指令集。
BXJ
跳轉并轉換為 Jazelle 執行。
cond
是一個可選的條件代碼。 cond 不能用于此指令的所有形式。
.W
是一個可選的指令寬度說明符,用于強制要求在 Thumb-2 中使用 32 位 B 指令。
label
是一個程序相對的表達式。
Rm
是一個寄存器,包含要跳轉到的目標地址。
操作
所有這些指令均會引發跳轉,或跳轉到 label,或跳轉到包含在 Rm 中的地址處。 此外:
BL 和 BLX 指令可將下一個指令的地址復制到 lr(r14,鏈接寄存器)中。
BX 和 BLX 指令可將處理器的狀態從 ARM 更改為 Thumb,或從 Thumb 更改為 ARM。
BLX label 無論何種情況,始終會更改處理器的狀態。
BX Rm 和 BLX Rm 可從 Rm 的位 [0] 推算出目標狀態:
如果 Rm 的位 [0] 為 0,則處理器的狀態會更改為(或保持在)ARM 狀態
如果 Rm 的位 [0] 為 1,則處理器的狀態會更改為(或保持在)Thumb 狀態。
BXJ 指令會將處理器的狀態更改為 Jazelle。
指令可用性和跳轉范圍
下表給出了可在 ARM 和 Thumb 狀態下使用的指令。 此表中未列出的指令不可在這兩種狀態下使用。 括號中的注釋給出了第一個可在其中使用指令的體系結構版本。
Table 4.7. 跳轉指令的可用性和范圍
| |
| | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | |
| | |
| | | | | | |
| | | |
| | |
| | | | | | |
| | | | | | |
| | | |
| | |
| | | |
| | |
| | | |
| | |
[1使用 .W 可指示匯編器使用此 32 位指令。 [2這是一個指令對。
|
擴展跳轉范圍
機器級指令 B 和 BL 對當前指令有地址范圍限制。 但是,即使label 超出范圍,仍可以使用這些指令。通常您并不知道鏈接器會將 label 放在何處。必要時鏈接器會添加代碼,以允許進行更長的跳轉。 所添加的代碼稱為中間代碼。
Thumb-2 中的 B
您可以使用 .W 寬度說明符強制 B 在 Thumb-2 代碼中生成 32 位指令。
B.W 始終生成 32 位指令,即使使用 16 位指令就可訪問目標也如此。
對于向前引用,不帶 .W 的 B 始終在 Thumb 代碼中生成 16 位指令,即使這會導致無法訪問可以使用 32 位 Thumb 指令訪問的目標。
Thumb-2EE 中的 BX、BLX 和 BXJ
這些指令可在 Thumb-2EE 代碼中用作跳轉,但不能用于更改狀態。 不能在 Thumb-2EE 中使用這些指令的 op{cond} label 格式。在該寄存器格式中,Rm 的位 [0] 必須是 1,執行以 ThumbEE 狀態在目標地址繼續進行。
條件標記
這些指令不更改標記。
體系結構
有關這些指令在每種體系結構中的可用性的詳細信息。
示例
B loopA
BLE ng+8
BL subC
BLLT rtX
BEQ {pc}+4 ; #0x8004
ARM/thumb之間 函數調用:
在同一狀態時直接:BL function即可
返回也直接用MOV PC,LR
不在同一狀態要注意以下幾點:
1. 要用BX,而不用BL
2. BX之前要保存好LR
3. 要用BX LR來返回
;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
;這一段是為了統一處理器工作狀態和軟件編譯方式(16位編譯環境使用tasm.exe編譯)
;arm有兩種工作狀態:
;(1)32位,該狀態執行字對準的arm指令;
;(2)16位,該狀態執行半字對準的Thumb指令
;不同的工作狀態,編譯器編譯方式也不同
GBLL THUMBCODE
[ {CONFIG} = 16 ;if config
THUMBCODE SETL {TRUE}
CODE32 ;轉入32位編譯模式
| ;else
THUMBCODE SETL {FALSE} ;設置為FALSE
MACRO
MOV_PC_LR
[ THUMBCODE
bx lr
|
mov pc,lr
MEND
MACRO
MOVEQ_PC_LR
[ THUMBCODE
bxeq lr
|
moveq pc,lr
MEND
GBLA 指令聲明一個全局算術變量,并將其值初始化為 0。
GBLL 指令聲明一個全局邏輯變量,并將其值初始化為 {FALSE}。
GBLS 指令聲明一個全局字符串變量,并將其值初始化為空字符串 ""。
語法
<</span>gblx> variable
其中:
是 GBLA、GBLL 或 GBLS。
variable
是變量的名稱。variable 在一個源文件內的符號中必須是唯一的。
SETA 指令用于設置局部或全局算術變量的值。
SETL 指令用于設置局部或全局邏輯變量的值。
SETS 指令用于設置局部或全局字符串變量的值。
語法
variable <</span>setx> expr
其中:
是 SETA、SETL 或 SETS。
variable
是由 GBLA、GBLL、GBLS、LCLA、LCLL 或 LCLS 指令聲明的變量的名稱。
expr
是一個表達式,可以為以下幾種類型:
對于 SETA,其值是數值型
對于 SETL,其值是邏輯型
對于 SETS,其值是字符串。