複製鏈接
請複製以下鏈接發送給好友

ARM指令集

鎖定
ARM指令集是指計算機ARM操作指令系統。在ARM中有兩種方式可以實現程序的跳轉:一種是跳轉指令;另一種是直接向PC寄存器(R15)中寫入目標地址值。
ARM指令集可以分為跳轉指令、數據處理指令、程序狀態寄存器(PSR)處理指令、加載/存儲指令、協處理器指令和異常產生指令六大類。
中文名
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 是在一個字中清除位的一種方法,與 OR 位設置是相反的操作。操作數 2 是一個 32 位位掩碼(mask)。如果如果在掩碼中設置了某一位,則清除這一位。未設置的掩碼位指示此位保持不變。
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
(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] 
op2可以是寄存器、被移位的寄存器或立即數。一般用於設置Rn的特定幾位。 [2] 
ORR{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 OR op_2
ORR R0, R0, #3 ;  該指令設置R0的0、1位,其餘位保持不變。 [1] 
ORR R0,R0,#5 ;R0的第0位和第2位設置為1,其餘位不變 [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
例如: [2] 
RSB R0,R1,#5 ;R0=5-R1 [2] 
RSB R0,R1,R2 ;R0=R2-R1 [2] 
RSB R0,R1,R2,LSL#5 ;R0=R2左移5位-R1 [2] 
反向減法可以在有符號或無符號數上進行。
RSC : 帶借位的反向減法
(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
例如: [2] 
第一個64位操作數存放在寄存器R2,R3中; [2] 
第二個64位操作數存放在寄存器R4,R5中; [2] 
64位結果存放在R0,R1中。 [2] 
64位的減法(第一個操作數減去第二個操作數)可由以下語句實現: [2] 
SUBS R0,R2,R4; 低32位相減,S表示結果影響寄存器CPSR的值 [2] 
RSC R1,R5,R3; 高32位相減 [2] 
SBC : 帶借位的減法
(Subtraction with Carry)
SBC 做兩個操作數的減法,把結果放置到目的寄存器中。它使用進位標誌來表示借位,這樣就可以做大於 32 位的減法。SUB 和 SBC 生成進位標誌的方式不同於常規,如果需要借位則清除進位標誌。所以,指令要對進位標誌進行一個非操作 - 在指令執行期間自動的反轉此位。op2可以是寄存器、被移位的寄存器或立即數。 [2] 
SBC{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 - op_2 - !carry
例如: [2] 
第一個64位操作數存放在寄存器R2,R3中; [2] 
第二個64位操作數存放在寄存器R4,R5中; [2] 
64位結果存放在R0,R1中。 [2] 
64位的減法(第一個操作數減去第二個操作數)可由以下語句實現: [2] 
SUBS R0,R2,R4; 低32位相減,S表示結果影響條件標誌位的值 [2] 
SBC R1,R3,R5; 高32位相減 [2] 
SUB : 減法
(Subtraction)
SUB 用操作數 one 減去操作數 two,把結果放置到目的寄存器中。操作數 1 是一個寄存器,操作數 2 可以是一個寄存器,被移位的寄存器,或一個立即值
SUB{條件}{S} <dest>, <op 1>, <op 2>
dest = op_1 - op_2
例如: [2] 
SUB R0,R1,#5 ;R0=R1-5 [2] 
SUB R0,R1,R2 ;R0=R1-R2 [2] 
SUB R0,R1,R2,LSL#5 ;R0=R1-R2左移5位 [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
MOV R0, R1, LSL#2 ;將R1中的內容左移兩位後傳送到R0中。 [3] 
LSR : 邏輯右移
(Logical Shift Right)
它在概念上與左移相對。把所有位向更低有效位方向移動。如果邏輯類指令中 S 位被設置了,則把最後被移出最右端的那位放置到進位標誌中。它同於 BASIC 的 register = value>>>shift。
LSR可完成對通用寄存器中的內容進行右移的操作,按操作數所指定的數量向右移位,左端用零來填充。其中,操作數可以是通用寄存器,也可以是立即數(0~31)。 [3] 
Rx, LSR #n or
Rx, LSR Rn
操作示例: [3] 
MOV R0, R1, LSR#2 ;將R1中的內容右移兩位後傳送到R0中,左端用零來填充。 [3] 
參考資料