ARM指令集--相关指令的功能
文章目錄
- ARM指令集的分類
- 數據處理指令(22種)
- 1. **MOV數據傳送指令**
- 2. **數據取反傳送指令 (Move Negative)**
- 3. **ADD 加法指令(Addition)**
- 4. **ADC 帶進位加法指令(Addition with Carry)**
- 5. **SUB 減法指令(Subtraction)**
- 6. **RSB 減法指令(Reverse Subtraction)**
- 7. **SBC 帶借位減法指令(Subtraction with Carry)**
- 8. **RSC 帶借位的反向減法指令(Reverse Subtraction with Carry)**
- 9. **MUL 32位乘法指令(Multiplication)**
- 10. **MLA 32位乘加指令(Multiplication with Accumulate)**
- 11. **SMULL 64位有符號數乘法指令(Signed Multiply Long)**
- 12. **SMLAL 64位有符號數乘加指令(Signed Multiply-accumulate Long)**
- 13. **UMULL 64位無符號數乘法指令(Unsigned Multiply Long)**
- 14. **UMLAL 64位無符號數乘加指令(Unsigned Multiply-accumulate Long)**
- 15. **AND 邏輯與指令(Logical AND)**
- 16. **ORR 邏輯或指令(Logical OR)**
- 17. **EOR 邏輯異或指令(Logical Exclusive OR)**
- 18. **BIC 位清除指令(Bit Clear)**
- 19. **CMP 比較指令(Compare)**
- 20. **CMN 反值比較指令(Compare Negative)**
- 21. **TST 位測試指令(Test bits)**
- 22. **TEQ 相等測試指令(Test Equivalence)**
- 跳轉指令(4種)
- 1. **B 跳轉指令(Branch)**
- 2. **BL 帶返回的跳轉指令(Branch with Link)**
- 3. **BLX 帶返回和狀態切換的跳轉指令(Branch,Link and Exchange)**
- 4. **BX 帶狀態切換的跳轉指令(Branch and Exchange)**
ARM指令集的分類
ARM指令集共有6種類型(53種主要助記符):
數據處理指令(22種主要助記符)
跳轉指令(4種主要助記符)
Load/Store指令(16種主要助記符)
程序狀態寄存器指令(2種主要助記符)
協處理器指令(5種主要助記符)
軟件中斷指令 (2種主要助記符)
數據處理指令(22種)
1. MOV數據傳送指令
格式:MOV{<cond>}{S} <Rd>,<op1>;
功能:Rd=op1
op1可以是寄存器、被移位的寄存器或立即數。
例如:
MOV R0,#5 ;R0=5
MOV R0,R1 ;R0=R1
MOV R0,R1,LSL#5 ;R0=R1左移5位
2. 數據取反傳送指令 (Move Negative)
格式:MVN{<cond>}{S} <Rd>,<op1>;
功能:將op1表示的值傳送到目的寄存器Rd中,但該值在傳送前被按位取反,這是邏輯非操作而不是算術操作,這個取反的值加1才是其取負的值,即Rd=!op1;
op1可以是寄存器、被移位的寄存器或立即數。
例如:
MVN R0,#0 ;R0=-1
3. ADD 加法指令(Addition)
格式:ADD{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn+op2
op2可以是寄存器,被移位的寄存器或立即數。加法可以在有符號和無符號數上進行。
例如:
ADD R0,R1,#5 ;R0=R1+5
ADD R0,R1,R2 ;R0=R1+R2
ADD R0,R1,R2,LSL#5 ;R0=R1+R2左移5位
4. ADC 帶進位加法指令(Addition with Carry)
格式:ADC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn+op2+carry
op2可以是寄存器、被移位的寄存器或立即數;carry為進位標志值。該指令用于實現超過32位的數的加法。
例如:
第一個64位操作數存放在寄存器R2,R3中;
第二個64位操作數存放在寄存器R4,R5中;
64位結果存放在R0,R1中。
64位的加法可由以下語句實現:
ADDS R0,R2,R4 ;低32位相加,S表示結果影響條件標志位的值
ADC R1,R3,R5 ;高32位相加
5. SUB 減法指令(Subtraction)
格式:SUB{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn-op2
op2可以是寄存器、被移位的寄存器或立即數。
例如:
SUB R0,R1,#5 ;R0=R1-5
SUB R0,R1,R2 ;R0=R1-R2
SUB R0,R1,R2,LSL#5 ;R0=R1-R2左移5位
6. RSB 減法指令(Reverse Subtraction)
格式:RSB{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:同SUB指令,但倒換了兩操作數的前后位置,即Rd=op2-Rn。
例如:
RSB R0,R1,#5 ;R0=5-R1
RSB R0,R1,R2 ;R0=R2-R1
RSB R0,R1,R2,LSL#5 ;R0=R2左移5位-R1
7. SBC 帶借位減法指令(Subtraction with Carry)
格式:SBC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn-op2-!carry
op2可以是寄存器、被移位的寄存器或立即數。
SUB和SBC生成進位標志的方式不同于常規,如果需要借位則清除進位標志,所以指令要對進位標志進行一個非操作。
例如:
第一個64位操作數存放在寄存器R2,R3中;
第二個64位操作數存放在寄存器R4,R5中;
64位結果存放在R0,R1中。
64位的減法(第一個操作數減去第二個操作數)可由以下語句實現:
SUBS R0,R2,R4; 低32位相減,S表示結果影響條件標志位的值
SBC R1,R3,R5; 高32位相減
8. RSC 帶借位的反向減法指令(Reverse Subtraction with Carry)
格式:RSC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:同SBC指令,但倒換了兩操作數的前后位置,即Rd=op2-Rn-!carry。
例如:
前提條件與SBC例子相同,操作數1-操作數2的實現語句需改為:
SUBS R0,R2,R4; 低32位相減,S表示結果影響寄存器CPSR的值
RSC R1,R5,R3; 高32位相減
9. MUL 32位乘法指令(Multiplication)
格式:MUL{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn×op2
該指令根據S標志,決定操作是否影響CPSR的值;其中op2必須為寄存器。Rn和op2的值為32位的有符號數或無符號數。
例如:
MULS R0,R1,R2 ;R0=R1×R2,結果影響寄存器CPSR的值
10. MLA 32位乘加指令(Multiplication with Accumulate)
格式:MLA{<cond>}{S} <Rd>,<Rn>,<op2><op3>;
功能:Rd=Rn×op2+op3
op2和op3必須為寄存器。Rn、op2和op3的值為32位的有符號數或無符號數。
例如:
MLA R0,R1,R2,R3 ;R0=R1×R2+R3
11. SMULL 64位有符號數乘法指令(Signed Multiply Long)
格式:
SMULL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:Rdh Rdl=Rn×op2
Rdh、Rdl和op2均為寄存器。Rn和op2的值為32位的有符號數。
例如:
SMULL R0,R1,R2,R3
;R0=R2×R3的低32位
;R1=R2×R3的高32位
12. SMLAL 64位有符號數乘加指令(Signed Multiply-accumulate Long)
格式:
SMLAL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:Rdh Rdl=Rn×op2+Rdh Rdl
Rdh、Rdl和op2均為寄存器。Rn和op2的值為32位的有符號數,Rdh Rdl的值為64位的加數。
例如:
SMLAL R0,R1,R2,R3
;R0=R2×R3的低32位+R0
;R1=R2×R3的高32位+R1
13. UMULL 64位無符號數乘法指令(Unsigned Multiply Long)
格式:
UMULL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:同SMULL指令,但指令中Rn和op2的值為32位的無符號數。
例如:
UMULL R0,R1,R2,R3
;R0=R2×R3的低32位
;R1=R2×R3的高32位
其中R2,R3的值為無符號數
14. UMLAL 64位無符號數乘加指令(Unsigned Multiply-accumulate Long)
格式:
UMLAL {<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:同SMLAL指令,但指令中Rn,op2的值為32位的無符號數,Rdh Rdl的值為64位無符號數。
例如:
UMLAL R0,R1,R2,R3
;R0=R2×R3的低32位+R0
;R1=R2×R3的高32位+R1
其中R2,R3的值為32位無符號數
R1,R0的值為64位無符號數
15. AND 邏輯與指令(Logical AND)
格式:AND{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn AND op2
op2可以是寄存器,被移位的寄存器或立即數。一般用于清除Rn的特定幾位。
例如:
AND R0,R0,#5
;保持R0的第0位和第2位,其余位清0
16. ORR 邏輯或指令(Logical OR)
格式:ORR{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn OR op2
op2可以是寄存器、被移位的寄存器或立即數。一般用于設置Rn的特定幾位。
例如:
ORR R0,R0,#5
;R0的第0位和第2位設置為1,其余位不變
17. EOR 邏輯異或指令(Logical Exclusive OR)
格式:EOR{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn EOR op2
op2可以是寄存器、被移位的寄存器或立即數。一般用于將Rn的特定幾位取反。
例如:
EOR R0,R0,#5
;R0的第0位和第2位取反,其余位不變
18. BIC 位清除指令(Bit Clear)
格式:BIC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn AND (!op2)
用于清除寄存器Rn中的某些位,并把結果存放到目的寄存器Rd中.
操作數op2是一個32位掩碼(mask),如果在掩碼中設置了某一位,則清除Rn中的這一位;未設置的掩碼位指示Rn中此位保持不變。其中,op2可以是寄存器、被移位的寄存器或立即數。
例如:
BIC R0,R0,#5
;R0中第0位和第2位清0,其余位不變
19. CMP 比較指令(Compare)
格式:CMP{<cond>} <Rn>,<op1>;
功能:Rn-op1
該指令進行一次減法運算,但不存儲結果,根據結果更新CPSR中條件標志位的值。
該指令不需要顯式地指定S后綴來更改狀態標志。其中,操作數op1為寄存器或立即數。
例如:
CMP R0,#5
;計算R0-5,根據結果設置條件標志位
ADDGT R0,R0,#5
;如果R0>5,則執行ADDGT指令
20. CMN 反值比較指令(Compare Negative)
格式:CMN{<cond>} <Rn>,<op1>;
功能:同CMP指令,但寄存器Rn的值是和op1取負的值進行比較。
例如:
CMN R0,#5 ;把R0與-5進行比較
21. TST 位測試指令(Test bits)
格式:TST{<cond>} <Rn>,<op1>;
功能: Rn AND op1
根據結果更新CPSR中條件標志位的值,但不存儲結果。
用于檢查寄存器Rn是否設置了op1中相應的位。
例如:
TST R0,#5
;測試R0中第0位和第2位是否為1,如果不為1,則與的結果為0,設置CPSR的z位為1,繼續下一條指令的執行。
22. TEQ 相等測試指令(Test Equivalence)
格式:TEQ{<cond>} <Rn>,<op1>;
功能: Rn EOR op1
將寄存器Rn的值和操作數op1所表示的值按位作邏輯異或操作,根據結果更新CPSR中條件標志位的值,但不存儲結果。
用于檢查寄存器Rn的值是否和op1所表示的值相等。
例如:
TEQ R0,#5 ;判斷R0的值是否和5相等
跳轉指令(4種)
1. B 跳轉指令(Branch)
格式:B{<cond>} <addr>;
功能: PC= PC+ addr左移兩位
addr的值是相對當前PC(即寄存器R15)的值的一個偏移量,而不是一個絕對地址,它是24位有符號數。實際地址的值由匯編器來計算.
addr的值有符號擴展為32位后,左移兩位,然后與PC值相加,即得到跳轉的目的地址。
跳轉的范圍為-32MB~+32MB。
例如:
B exit; 程序跳轉到標號exit處
…
exit…
2. BL 帶返回的跳轉指令(Branch with Link)
格式:BL{<cond>} <addr>;
功能:同B指令,但BL指令執行跳轉操作的同時,還將PC(寄存器R15)的值保存到LR寄存器(寄存器R14)中。
該指令用于實現子程序調用,程序的返回可通過把LR寄存器的值復制到PC寄存器中來實現。
例如:
BL func; 調用子程序func
…
func
…
MOV R15,R14; 子程序返回
3. BLX 帶返回和狀態切換的跳轉指令(Branch,Link and Exchange)
格式:BLX <addr>;或BLX <Rn>;
功能:處理器跳轉到目標地址處,并將PC(寄存器R15)的值保存到LR寄存器(R14)中。
如果目標地址處為Thumb指令,則程序狀態從ARM狀態切換為Thumb狀態。
該指令用于子程序調用和程序狀態的切換。
例如:
BLX T16; 跳轉到標號T16處執行,T16后面的指令為Thumb指令
…
CODE16
T16 后面指令為Thumb指令
…
4. BX 帶狀態切換的跳轉指令(Branch and Exchange)
格式: BX{<cond>} <Rn>
功能:處理器跳轉到目標地址處,從那里繼續執行;<cond>為指令執行的條件碼。當<cond>忽略時指令為無條件執行。
<Rm>該寄存器中為跳轉的目標地址。當寄存器的bit[0]為0時,目標地址處的指令為ARM指令;
當寄存器的bit[0]為1時,目標地址處的指令為Thumb指令。
例如:
ADR R0,exit ;標號exit處的地址裝入R0中
BX R0 ;跳轉到exit處
總結
以上是生活随笔為你收集整理的ARM指令集--相关指令的功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CPU怎么认识代码的?
- 下一篇: CPU加了缓存后,有人急了~