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

