ARM指令集

ARM指令集

在ARM中有兩種方式可以實現程式的跳轉:一種是跳轉指令;另一種是直接向PC暫存器(R15)中寫入目標地址值。在ARM版本5以前的體系中,傳送到PC 暫存器中的目標地址值的低兩位bits[1∶0]被忽略,跳轉指令只能在ARM指令集中執行,即程式不能從ARM狀態切換到Thumb狀態。就在分支之前,在 暫存器R14中裝載上R15的內容,因此可以重新裝載R14到R15中來返回到這個分支之後的那個指令處執行,它是 子例程的一個基本但強力的實現。BX指令跳轉到指令中指定的目標地址,目標地址處的指令可以是ARM指令,也可以是Thumb指令。

ARM指令列表

ADC 帶進位的32位數加法
ADD 32位數相加
AND 32位數的邏輯與
B 在32M空間內的相對跳轉指令
BEQ 相等則跳轉(Branch if EQual)
BNE 不相等則跳轉(Branch if Not Equal)
BGE 大於或等於跳轉(Branch if Greater than or Equa)
BGT 大於跳轉(Branch if Greater Than)
BIC 32位數的邏輯位清零
BKPT 斷點指令
BL 帶連結的相對跳轉指令
BLE 小於或等於跳轉(Branch if Less than or Equal)
BLEQ 帶連結等於跳轉(Branch with Link if EQual)
BLLT 帶連結小於跳轉(Branch with Link if Less Than)
BLT 小於跳轉(Branch if Less Than)
BLX 帶連結的切換跳轉
BX 切換跳轉
CDP CDP2 協處理器數據處理操作
CLZ 零計數
CMN 比較兩個數的相反數
CMP 32位數比較
EOR 32位邏輯異或
LDC LDC2 從協處理器取一個或多個32位值
LDM 從記憶體送多個32位字到ARM暫存器
LDR 從虛擬地址取一個單個的32位值
MCR MCR2 MCRR 從暫存器送數據到協處理器
MLA 32位乘累加
MOV 傳送一個32位數到暫存器
MRC MRC2 MRRC 從協處理器傳送數據到暫存器
MRS 把狀態暫存器的值送到通用暫存器
MSR 把通用暫存器的值傳送到狀態暫存器
MUL 32位乘
MVN 把一個32位數的邏輯“非”送到暫存器
ORR 32位邏輯或
PLD 預裝載提示指令
QADD 有符號32位飽和加
QDADD 有符號雙32位飽和加
QSUB 有符號32位飽和減
QDSUB 有符號雙32位飽和減
RSB 逆向32位減法
RSC 帶進位的逆向32法減法
SBC 帶進位的32位減法
SMLAxy 有符號乘累加(16位*16位)+32位=32位
SMLAL 64位有符號乘累加((32位*32位)+64位=64位)
SMALxy 64位有符號乘累加((32位*32位)+64位=64位)
SMLAWy 號乘累加((32位*16位)>>16位)+32位=32位
SMULL 64位有符號乘累加(32位*32位)=64位
SMULxy 有符號乘(16位*16位=32位)
SMULWy 有符號乘(32位*16位>>16位=32位)
STC STC2 從協處理器中把一個或多個32位值存到記憶體
STM 把多個32位的暫存器值存放到記憶體
STR 把暫存器的值存到一個記憶體的虛地址內間
SUB 32位減法
SWI 軟中斷
SWP 把一個字或者一個位元組和一個暫存器值交換
TEQ 等值測試
TST 位測試
UMLAL 64位無符號乘累加((32位*32位)+64位=64位)
UMULL 64位無符號乘累加(32位*32位)=64位

詳解

1.跳轉指令

通過直接向PC 暫存器中寫入目標地址值可以實現在4GB 地址空間中任意跳轉,這種跳轉指令又稱為長跳轉。如果在長跳轉指令之前使用MOV LR,PC等指令,則可以保存將來返回的地址值,這樣就實現了在4GB 地址空間中的 子程式調用。

在ARM版本5及以上的體系中,實現了ARM指令集和Thumb指令集的混合使用。指令使用目標地址值的bit來確定目標程式的類型。bit的值為1時,目標程式為Thumb指令;bit值為0時,目標程式為ARM指令。

在ARM版本5以前的體系中,傳送到PC 暫存器中的目標地址值的低兩位bits[1∶0]被忽略,跳轉指令只能在ARM指令集中執行,即程式不能從ARM狀態切換到Thumb狀態。非T系列ARM版本5體系不含Thumb指令,當程式試圖切換到Thumb狀態時,將產生未定義指令異常中斷。

ARM跳轉指令可以從當前指令向前或向後的32MB 地址空間跳轉。這類跳轉指令有以下4種。

(1)B 跳轉指令

B〔條件) (地址)

B指令屬於ARM指令集,是最簡單的分支指令。一旦遇到一個B指令,ARM處理器將立即跳轉到給定的地址,從那裡繼續執行。注意:存儲在分支指令中的實際值是相對當前R15的值的一個 偏移量,而不是一個 絕對地址。它的值由 彙編器來計算,是24位 有符號數,左移兩位後有符號擴展為32位,表示的有效偏移位為26位(+/- 32 MB)。

(2)BL 帶返回的跳轉指令

BI,〔條件) (地址)

BL指令也屬於ARM指令集,是另一個分支指令。就在分支之前,在 暫存器R14中裝載上R15的內容,因此可以重新裝載R14到R15中來返回到這個分支之後的那個指令處執行,它是 子例程的一個基本但強力的實現。

(3)BLX 帶返回和狀態切換的跳轉指令

BLX <地址>

BLX指令有兩種格式,第1種格式的BLX指令記作BLX(1)。BLX(1)從ARM指令集跳轉到指令中指定的目標地址,並將程式狀態切換到Thumb狀態,該指令同時將PC 暫存器的內容複製到LR暫存器中。

BLX(1)指令屬於無條件執行的指令。

第2種格式的BLX指令記作BLX(2)。BLX(2)指令從ARM指令集跳轉到指令中指定的目標地址,目標地址的指令可以是ARM指令,也可以是Thumb指令。目標地址放在指令中的暫存器中,該地址的bit值為0,目標地址處的指令類型由CPSR中的T位決定。該指令同時將PC 暫存器的內容複製到LR暫存器中。

(4)BX 帶狀態切換的跳轉指令

BX(條件) (dest)

BX指令跳轉到指令中指定的目標地址,目標地址處的指令可以是ARM指令,也可以是Thumb指令。目標地址值為指令的值和0xFl·FFFFFF做“與”操作的結果,目標地址處的指令類型由 暫存器決定。

相關詞條

相關搜尋

熱門詞條

聯絡我們