-
ARM指令集
鎖定
- 中文名
- ARM指令集
- ADC
- 帶進位的32位數加法
- ADD
- 32位數相加
- AND
- 32位數的邏輯與
ARM指令集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位 |
ARM指令集分類詳解
ARM指令集算術和邏輯指令
ADC(Addition with Carry) : 帶進位的加法。
定義:ADC是將把兩個操作數加起來,並把結果放置到目的寄存器中。它使用一個進位標誌位,這樣就 可以做比 32 位大的加法。
代碼:ADC{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 + op_2 + carry
實例:
下列例子將加兩個 128 位的數。
128 位結果: 寄存器 0、1、2、和 3
第一個 128 位數: 寄存器 4、5、6、和 7
第二個 128 位數: 寄存器 8、9、10、和 11。
ADDS R0, R4, R8 ; 加低端的字
ADCS R1, R5, R9 ; 加下一個字,帶進位
ADCS R2, R6, R10 ; 加第三個字,帶進位
ADCS R3, R7, R11 ; 加高端的字,帶進位
注意: 如果如果要做這樣的加法,不要忘記設置 S 後綴來更改進位標誌。
ADD(Addition) : 加法。
定義:ADD 是將把兩個操作數加起來,把結果放置到目的寄存器中。
操作數1:是一個寄存器。
操作數2:可以是一個寄存器,被移位的寄存器,或一個立即值。
代碼:ADD{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 + op_2
實例:
ADD R0, R1, R2 ; R0 = R1 + R2
ADD R0, R1, #256 ; R0 = R1 + 256
ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 <<1)
注意:加法可以在有符號和無符號數上進行。
AND (logical AND): 邏輯與。
定義:AND 將在兩個操作數上進行邏輯與,把結果放置到目的寄存器中;對屏蔽你要在上面工作的位很 有用。
操作數1:是一個寄存器。
操作數2:可以是一個寄存器,被移位的寄存器,或一個立即值。
代碼:AND{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 AND op_2
實例:AND R0, R0, #3 ; R0 = 保持 R0 的位 0 和 1,丟棄其餘的位。
真值表(二者都是 1 則結果為 1)
op_1 | op_2 | 結果 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
BIC(Bit Clear) : 位清除。
BIC{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 AND (!op_2)
BIC R0, R0, #%1011 ; 清除 R0 中的位 0、1、和 3。保持其餘的不變
BIC 真值表 :
Op_1 | Op_2 | 結果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 1 |
1 | 1 | 0 |
譯註:邏輯表達式為 Op_1 AND NOT Op_2
EOR : 邏輯異或
(logical Exclusive OR)
EOR 將在兩個操作數上進行邏輯異或,把結果放置到目的寄存器中;對反轉特定的位有用。操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值
EOR{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 EOR op_2
EOR R0, R0, #3 ; 反轉 R0 中的位 0 和 1
EOR 真值表(二者不同則結果為 1):
Op_1 | Op_2 | 結果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
MOV : 傳送
(Move)
MOV 從另一個寄存器、被移位的寄存器、或一個立即值裝載一個值到目的寄存器。你可以指定相同的寄存器來實現 NOP 指令的效果,你還可以專門移位一個寄存器
MOV{條件}{S} <dest>, <op 1>
dest = op_1
MOV R0, R0 ; R0 = R0... NOP 指令
MOV R0, R0, LSL#3 ; R0 = R0 * 8
如果 R15 是目的寄存器,將修改程序計數器或標誌。這用於返回到調用代碼,方法是把連接寄存器的內容傳送到 R15:
MOV PC, R14 ; 退出到調用者
MOVS PC, R14 ; 退出到調用者並恢復標誌位
(不遵從 32-bit 體系)
MVN : 傳送取反的值
(MoveNegative)
MVN 從另一個寄存器、被移位的寄存器、或一個立即值裝載一個值到目的寄存器。不同之處是在傳送之前位被反轉了,所以把一個被取反的值傳送到一個寄存器中。這是邏輯非操作而不是算術操作,這個取反的值加 1 才是它的取負的值
MVN{條件}{S} <dest>, <op 1>
dest = !op_1
MVN R0, #4 ; R0 = -5
MVN R0, #0 ; R0 = -1
ORR : 邏輯或
(logical OR)
ORR指令用於在兩個操作數上進行邏輯或運算,並把結果放置到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。該指令常用於設置操作數1的某些位。
[1]
ORR{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 OR op_2
OR 真值表(二者中存在 1 則結果為 1):
Op_1 | Op_2 | 結果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
RSB : 反向減法
(Reverse Subtraction)
RSB 用操作數 two 減去操作數 one,把結果放置到目的寄存器中。操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值
RSB{條件}{S} <dest>, <op 1>, <op 2>
dest = op_2 - op_1
RSB R0, R1, R2 ; R0 = R2 - R1
RSB R0, R1, #256 ; R0 = 256 - R1
RSB R0, R2, R3,LSL#1 ; R0 = (R3<<1) - R2
RSB R0,R1,R2,LSL#5 ;R0=R2左移5位-R1
[2]
反向減法可以在有符號或無符號數上進行。
(Reverse Subtraction with Carry)
RSC指令用於把操作數2減去操作數1,再減去CPSR中的C條件標誌位的反碼,並將結果存放到目的寄存器中。操作數1應是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。該指令使用進位標誌來表示借位,這樣就可以做大於32位的減法,注意不要忘記設置S後綴來更改進位標誌。該指令可用於有符號數或無符號數的減法運算。
[1]
RSC{條件}{S} <dest>, <op 1>, <op 2>
dest = op_2 - op_1 - !carry
SBC : 帶借位的減法
(Subtraction with Carry)
SBC 做兩個操作數的減法,把結果放置到目的寄存器中。它使用進位標誌來表示借位,這樣就可以做大於 32 位的減法。SUB 和 SBC 生成進位標誌的方式不同於常規,如果需要借位則清除進位標誌。所以,指令要對進位標誌進行一個非操作 - 在指令執行期間自動的反轉此位。op2可以是寄存器、被移位的寄存器或立即數。
[2]
SBC{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 - op_2 - !carry
SUB : 減法
(Subtraction)
SUB 用操作數 one 減去操作數 two,把結果放置到目的寄存器中。操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值
SUB{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 - op_2
SUB R0, R1, R2 ; R0 = R1 - R2
SUB R0, R1, #256 ; R0 = R1 - 256
SUB R0, R2, R3,LSL#1 ; R0 = R2 - (R3<<1)
減法可以在有符號和無符號數上進行。
ARM指令集移位指令
ARM 處理器組建了可以與數據處理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel shifter)。你還可以使用桶式移位器影響在 LDR/STR 操作中的變址值。
譯註:移位操作在 ARM 指令集中不作為單獨的指令使用,它是指令格式中是一個字段,在彙編語言中表示為指令中的選項。如果數據處理指令的第二個操作數或者單一數據傳送指令中的變址是寄存器,則可以對它進行各種移位操作。如果數據處理指令的第二個操作數是立即值,在指令中用 8 位立即值和 4 位循環移位來表示它,所以對大於 255 的立即值,彙編器嘗試通過在指令中設置循環移位數量來表示它,如果不能表示則生成一個錯誤。在邏輯類指令中,邏輯運算指令由指令中 S 位的設置或清除來確定是否影響進位標誌,而比較指令的 S 位總是設置的。在單一數據傳送指令中指定移位的數量只能用立即值而不能用寄存器。
下面是給不同的移位類型的六個助記符:
LSL 邏輯左移
ASL 算術左移
LSR 邏輯右移
ROR 循環右移
RRX 帶擴展的循環右移
ASL 和 LSL 是等同的,可以自由互換。
你可以用一個立即值(從 0 到 31)指定移位數量,或用包含在 0 和 31 之間的一個值的寄存器指定移位數量。
LSL/ASL : 邏輯或算術左移
(Logical or Arithmetic Shift Left)
接受 Rx 的內容並按用‘n’或在寄存器 Rn 中指定的數量向高有效位方向移位。最低有效位用零來填充。除了概念上的第 33 位(就是被移出的最小的那位)之外丟棄移出最左端的高位,如果邏輯類指令中 S 位被設置了,則此位將成為從桶式移位器退出時進位標誌的值。
LSL(或ASL)可完成對通用寄存器中的內容進行邏輯(或算術)的左移操作,按操作數所指定的數量向左移位,低位用零來填充。其中,操作數可以是通用寄存器,也可以是立即數(0~31)。
[3]
Rx, LSL #n or
Rx, ASL #n or
Rx, LSL Rn or
Rx, ASL Rn
考慮下列:
MOV R1, #12
MOV R0, R1, LSL#2
在退出時,R0 是 48。 這些指令形成的總和是 R0 = #12, LSL#2 等同於 BASIC 的 R0 = 12<<2
LSR : 邏輯右移
(Logical Shift Right)
它在概念上與左移相對。把所有位向更低有效位方向移動。如果邏輯類指令中 S 位被設置了,則把最後被移出最右端的那位放置到進位標誌中。它同於 BASIC 的 register = value>>>shift。
Rx, LSR #n or
Rx, LSR Rn
- 參考資料
-
- 1. ARM彙編指令集詳解 .百度文庫.2018-6-27[引用日期2019-12-28]
- 2. ARM指令集 .學步園[引用日期2019-12-28]
- 3. ARM彙編指令集之——移位指令 .奇手.2018-12-28[引用日期2019-12-28]