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做“與”操作的結果,目標地址處的指令類型由 暫存器決定。