ARM指令集

原文:http://www.eefocus.com/article/08-08/49787s.html

ARM指令集
6種類型(53種主要助記符) :
數據處理指令(22種主要助記符)
跳轉指令(4種主要助記符)
Load/Store指令(16種主要助記符)
程序狀態寄存器指令(2種主要助記符)
協處理器指令(5種主要助記符)
軟件中斷指令 (2種主要助記符)

數據處理指令
數據處理指令大致可分爲3類:
數據傳送指令;
算術邏輯運算指令;
乘法指令
比較指令。
數據處理指令只能對寄存器的內容進行操作,而不能對內存中的數據進行操作。所有ARM數據處理指令均可選擇使用S後綴,並影響狀態標誌。

數據處理指令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
2.MVN 數據取反傳送指令
格式:MVN{<cond>}{S} <Rd>,<op1>;
功能:將op1表示的值傳送到目的寄存器Rd中,但該值在傳送前被按位取反,即Rd=!op1;
op1可以是寄存器、被移位的寄存器或立即數。
例如:
MVN R0,#0 ;R0=-1

數據處理指令3
3.ADD 加法指令
格式: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
4.ADC 帶進位加法指令
格式: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
5.SUB 減法指令
格式: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
6.RSB 反向減法指令
格式: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
7.SBC 帶借位減法指令
格式: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
8.RSC 帶借位的反向減法指令
格式: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位相減

數據處理指令——乘法指令
ARM7TDMI具有三種乘法指令,分別爲:
32×32位乘法指令;
32× 32位乘加指令;
32× 32位結果爲64位的乘/乘加指令。

數據處理指令9
9.MUL 32位乘法指令
格式:MUL{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn×op2
該指令根據S標誌,決定操作是否影響CPSR的值;其中op2必須爲寄存器。Rn和op2的值爲32位的有符號數或無符號數。
例如:
MULS R0,R1,R2 ;R0=R1×R2,結果影響寄存器CPSR的值

數據處理指令10
10.MLA 32位乘加指令
格式: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
11.SMULL 64位有符號數乘法指令
格式:
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
12.SMLAL 64位有符號數乘加指令
格式:
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
13.UMULL 64位無符號數乘法指令
格式:
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
14.UMLAL 64位無符號數乘加指令
格式:
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
15.AND 邏輯與指令
格式:AND{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn AND op2
op2可以是寄存器,被移位的寄存器或立即數。一般用於清除Rn的特定幾位。
例如:
AND R0,R0,#5
;保持R0的第0位和第2位,其餘位清0

數據處理指令16
16.ORR 邏輯或指令
格式:ORR{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn OR op2
op2可以是寄存器、被移位的寄存器或立即數。一般用於設置Rn的特定幾位。
例如:
ORR R0,R0,#5
;R0的第0位和第2位設置爲1,其餘位不變

數據處理指令17
17.EOR 邏輯異或指令
格式:EOR{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn EOR op2
op2可以是寄存器、被移位的寄存器或立即數。一般用於將Rn的特定幾位取反。
例如:
EOR R0,R0,#5
;R0的第0位和第2位取反,其餘位不變

數據處理指令18
18.BIC 位清除指令
格式: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
19.CMP 比較指令
格式:CMP{<cond>} <Rn>,<op1>;
功能:Rn-op1
該指令進行一次減法運算,但不存儲結果,根據結果更新CPSR中條件標誌位的值。
該指令不需要顯式地指定S後綴來更改狀態標誌。其中,操作數op1爲寄存器或立即數。
例如:
CMP R0,#5
;計算R0-5,根據結果設置條件標誌位
ADDGT R0,R0,#5
;如果R0>5,則執行ADDGT指令

數據處理指令20
20.CMN 反值比較指令
格式:CMN{<cond>} <Rn>,<op1>;
功能:同CMP指令,但寄存器Rn的值是和op1取負的值進行比較。
例如:
CMN R0,#5 ;把R0與-5進行比較

數據處理指令21
21.TST 位測試指令
格式:TST{<cond>} <Rn>,<op1>;
功能: Rn AND op1
根據結果更新CPSR中條件標誌位的值,但不存儲結果。
用於檢查寄存器Rn是否設置了op1中相應的位。
例如:
TST R0,#5
;測試R0中第0位和第2位是否爲1

數據處理指令22
22.TEQ 相等測試指令
格式:TEQ{<cond>} <Rn>,<op1>;
功能: Rn EOR op1
將寄存器Rn的值和操作數op1所表示的值按位作邏輯異或操作,根據結果更新CPSR中條件標誌位的值,但不存儲結果。
用於檢查寄存器Rn的值是否和op1所表示的值相等。
例如:
TEQ R0,#5 ;判斷R0的值是否和5相等

跳轉指令
跳轉指令用於實現程序的跳轉和程序狀態的切換。
ARM程序設計中,實現程序跳轉有兩種方式:
(1)跳轉指令,
(2)直接向程序寄存器PC(R15)中寫入目標地址值。
通過向程序計數器PC寫入跳轉地址值,可以實現在4GB的地址空間中的任意跳轉。
使用跳轉指令,其跳轉空間受到限制。

跳轉指令1
1.B 跳轉指令
格式:B{<cond>} <addr>;
功能: PC= PC+ addr左移兩位
addr的值是相對當前PC(即寄存器R15)的值的一個偏移量,而不是一個絕對地址,它是24位有符號數。實際地址的值由彙編器來計算.
addr的值有符號擴展爲32位後,左移兩位,然後與PC值相加,即得到跳轉的目的地址。
跳轉的範圍爲-32MB~+32MB。
例如:
B exit; 程序跳轉到標號exit處
…exit…

跳轉指令2
2.BL 帶返回的跳轉指令
格式:BL{<cond>} <addr>;
功能:同B指令,但BL指令執行跳轉操作的同時,還將PC(寄存器R15)的值保存到LR寄存器(寄存器R14)中。
該指令用於實現子程序調用,程序的返回可通過把LR寄存器的值複製到PC寄存器中來實現。
例如:
BL func; 調用子程序func

func

MOV R15,R14; 子程序返回

跳轉指令2
由於返回地址保存在寄存器裏,在保存R14之前不應再調用下一級的嵌套子程序;否則,新的返回地址將覆蓋原來的返回地址,就無法返回到原來的調用位置。這時一般是把R14壓入存儲器中的堆棧。由於子程序經常還需要一些工作寄存器,所以可使用多寄存器存儲指令同時把這些寄存器中原有的數據一起存儲。
例如:
BL SUB1

SUB1 STMFD R13!,{R0-R2,R14};保存工作和鏈接寄存器
BL SUB2
…SUB2…
對於不調用其他子程序的子程序(葉子程序),不需要保存R14,因爲它不會被覆蓋。

跳轉指令3
3.BLX 帶返回和狀態切換的跳轉指令
格式:BLX <addr>;或BLX <Rn>;
功能:處理器跳轉到目標地址處,並將PC(寄存器R15)的值保存到LR寄存器(R14)中。
若爲第二種格式,寄存器Rn的值是轉移目標,Rn的第0位拷貝到CPSR中的T位(決定是繼續執行還是切換到Thumb指令),[31:0]位移入PC;
如果Rn[0]是1,則處理器切換執行Thumb指令,並在Rn中的地址開始執行,但是需將最低爲清零;如果Rn[0]是0,則處理器繼續執行ARM指令,並在Rn中的地址處開始執行,但需將Rn[1]清零。
該指令用於子程序調用和程序狀態的切換。
例如:
BLX T16; 跳轉到標號T16處執行,T16後面的指令爲Thumb指令

CODE16
T16 後面指令爲Thumb指令


跳轉指令4
4.BX 帶狀態切換的跳轉指令
格式:BX <Rn>;
功能:處理器跳轉到目標地址處,從那裏繼續執行;
目標地址爲寄存器Rn的值和0xFFFFFFFE作與操作的結果。
目標地址處的指令可以是ARM指令,也可以是Thumb 指令。
例如:
ADR R0,exit ;標號exit處的地址裝入R0中
BX R0 ;跳轉到exit處

Load/Store指令
Load/Store指令用於寄存器和內存間數據的傳送。
Load用於把內存中的數據裝載到寄存器中。
Store用於把寄存器中的數據存入內存。
該集合的指令使用頻繁,在指令集中最爲重要,因爲其他指令只能操作寄存器,當數據存放在內存中時,必須先把數據從內存裝載到寄存器,執行完後再把寄存器中的數據存儲到內存中。
Load/Store指令分爲3類:
(1)單一數據傳送指令(LDR和STR等)
(2)多數據傳送指令(LDM和STM)
(3)數據交換指令(SWP和SWPB)

條件執行的舉例
將流程圖對應GCD算法轉換成
1) 普通匯編代碼
2)ARM 彙編代碼.
只使用 CMP, B 及 SUB指令

條件執行的舉例
普通匯編代碼
gcd cmp r0, r1 ;reached the end?
beq stop
blt less ;if r0 > r1
sub r0, r0, r1 ;subtract r1 from r0
bal gcd
less sub r1, r1, r0 ;subtract r0 from r1
bal gcd
stop
ARM 代碼
gcd cmp r0, r1 ;if r0 > r1
subgt r0, r0, r1 ;subtract r1 from r0
sublt r1, r1, r0 ;else subtract r0 from r1
bne gcd ;

Load/Store指令1-1
1.LDR 字數據加載指令
格式:LDR{<cond>} <Rd>,<addr>;
功能:把addr所表示的內存地址中的字數據裝載到目標寄存器Rd中,同時還可以把合成的有效地址寫回到基址寄存器。
地址addr可以是一個簡單的值、一個偏移量,或者是一個被移位的偏移量。
尋址方式:
Rn:基址寄存器。
Rm:變址寄存器。
Index:偏移量,12位的無符號數。
LDR Rd,[Rn]
;把內存中地址爲Rn的字數據裝入寄存器Rd中
LDR Rd,[Rn,Rm]
;將內存中地址爲Rn+Rm的字數據裝入寄存器Rd中

Load/Store指令1-2
LDR Rd,[Rn,#index]
;將內存中地址爲Rn+index的字數據裝入Rd中
LDR Rd,[Rn,Rm,LSL#5]
;將內存中地址爲Rn+Rm×32的字數據裝入Rd
LDR Rd,[Rn,Rm] !
;將內存中地址爲Rn+Rm的字數據裝入Rd,並將新地址Rn+Rm寫入Rn
LDR Rd,[Rn,#index] !
;將內存中地址爲Rn+index的字數據裝入Rd,並將新地址Rn+index寫入Rn
LDR Rd,[Rn,Rm,LSL#5]!
;將內存中地址爲Rn+Rm×32的字數據裝入Rd,並將新地址Rn+Rm×32寫入Rn

Load/Store指令1-3
LDR Rd,[Rn],Rm
;將內存中地址爲Rn的字數據裝入寄存器Rd,並將新地址Rn+Rm寫入Rn
LDR Rd,[Rn],#index
;將內存中地址爲Rn的字數據裝入寄存器Rd,並將新地址Rn+index寫入Rn
LDR Rd,[Rn],Rm,LSL#5
;將內存中地址爲Rn的字數據裝入寄存器Rd,並將新地址Rn+Rm×32寫入Rn
例如:
LDR R0,[R1,R2,LSL#5]!
; 將內存中地址爲R1+R2×32的字數據裝入寄存器R0,並將新地址R1+R2×32寫入R1

Load/Store指令2
LDRB 字節數據加載指令
格式:LDR{<cond>}B <Rd>,<addr>;
功能:同LDR指令,但該指令只是從內存讀取一個8位的字節數據而不是一個32位的字數據,並將Rd的高24位清0。
例如:
LDRB R0,[R1]
;將內存中起始地址爲R1的一個字節數據裝入R0中

Load/Store指令3
3.LDRBT 用戶模式的字節數據加載指令
格式:LDR{<cond>}BT <Rd>,<addr>;
功能:同LDRB指令,但無論處理器處於何種模式,都將該指令當作一般用戶模式下的內存操作。

Load/Store指令4
4.LDRH 半字數據加載指令
格式:LDR{<cond>}H <Rd>,<addr>;
功能:同LDR指令,但該指令只是從內存讀取一個16位的半字數據而不是一個32位的字數據,並將Rd的高16位清0。
例如:
LDRH R0,[R1]
;將內存中起始地址爲R1的一個半字數據裝入R0中

Load/Store指令5
5.LDRSB 有符號的字節數據加載指令
格式:LDR{<cond>}SB <Rd>,<addr>;
功能:同LDRB指令,但該指令將寄存器Rd的高24位設置成所裝載的字節數據符號位的值。
例如:
LDRSB R0,[R1]
;將內存中起始地址爲R1的一個字節數據裝入R0中,R0的高24位設置成該字節數據的符號位

Load/Store指令6
6.LDRSH 有符號的半字數據加載指令
格式:LDR{<cond>}SH <Rd>,<addr>;
功能:同LDRH指令,但該指令將寄存器Rd的高16位設置成所裝載的半字數據符號位的值。
例如:
LDRSH R0,[R1]
;將內存中起始地址爲R1的一個16位半字數據裝入R0中,R0的高16位設置成該半字數據的符號位

Load/Store指令7
7.LDRT 用戶模式的字數據加載指令
格式:LDR{<cond>}T <Rd>,<addr>;
功能:同LDR指令,但無論處理器處於何種模式,都將該指令當作一般用戶模式下的內存操作。
addr所表示的有效地址必須是字對齊的,否則從內存中讀出的數值需進行循環右移操作。

Load/Store指令8
8.STR 字數據存儲指令
格式:STR{<cond>} <Rd>,<addr>;
功能:把寄存器Rd中的字數據(32位)保存到addr所表示的內存地址中,同時還可以把合成的有效地址寫回到基址寄存器。
地址addr可以是一個簡單的值、一個偏移量,或者是一個被移位的偏移量。
尋址方式同LDR指令。
例如:
STR R0,[R1,#5]!
;把R0中的字數據保存到以R1+5爲地址的內存中,然後R1=R1+5

STR指令應用舉例

 STR指令應用舉例


Load/Store指令9
9.STRB 字節數據存儲指令
格式:STR{<cond>}B <Rd>,<addr>;
功能:把寄存器Rd中的低8位字節數據保存到addr所表示的內存地址中。
其他用法同STR指令。
例如:
STRB R0,[R1]
;將寄存器R0中的低8位數據存入R1表示的內存地址中

Load/Store指令10
10.STRBT 用戶模式的字節數據存儲指令
格式:STR{<cond>}BT <Rd>,<addr>;
功能:同STRB指令,但無論處理器處於何種模式,該指令都將被當作一般用戶模式下的內存操作。

Load/Store指令11
11.STRH 半字數據存儲指令
格式:STR{<cond>}H <Rd>,<addr>;
功能:把寄存器Rd中的低16位半字數據保存到addr所表示的內存地址中,而且addr所表示的地址必須是半字對齊的。
其他用法同STR指令。
例如:
STRH R0,[R1]
;將寄存器R0中的低16位數據存入R1表示的內存地址中

存儲格式對於加載/存儲指令的影響

Load/Store指令12
12.STRT 用戶模式的字數據存儲指令
格式:STR{<cond>}T <Rd>,<addr>;
功能:同STR指令,但無論處理器處於何種模式,該指令都將被當作一般用戶模式下的內存操作。

Load/Store指令13-1
13.LDM 批量數據加載指令
格式:
LDM{<cond>}{<type>} <Rn>{!},<regs>{^};
功能:從一片連續的內存單元讀取數據到各個寄存器中,內存單元的起始地址爲基址寄存器Rn的值,各個寄存器由寄存器列表regs表示。
該指令一般用於多個寄存器數據的出棧。
type字段種類:
IA:每次傳送後地址加1。
IB:每次傳送前地址加1。
DA:每次傳送後地址減1。
DB:每次傳送前地址減1。
FD:滿遞減堆棧。
ED:空遞減堆棧。
FA:滿遞增堆棧。
EA:空遞增堆棧。
注意:有一個約定,編號低的寄存器在存儲數據或者加載數據時對應於存儲器的低地址。

Load/Store指令13-2
例如 LDMIA/IB/DA/DB R13!,{R0-R1,R3};
各指令執行完後,結果如圖所示。

Load/Store指令13-4
FD、ED、FA和EA指定是滿棧還是空棧,是升序棧還是降序棧,用於堆棧尋址。
一個滿棧的棧指針指向上次寫的最後一個數據單元.
空棧的棧指針指向第一個空閒單元。
一個降序棧是在內存中反向增長而升序棧在內存中正向增長。

Load/Store指令13-5
格式:
LDM{<cond>}{<type>} <Rn>{!},<regs>{^};
{!}:若選用了此後綴,則當指令執行完畢後,將最後的地址寫入基址寄存器。
{^}:當regs中不包含PC時,該後綴用於指示指令所用的寄存器爲用戶模式下的寄存器,否則指示指令執行時,將寄存器SPSR的值複製到CPSR中。

Load/Store指令14-1
14.STM 批量數據存儲指令
格式:STM{<cond>}{<type>} <Rn>{!},<regs>{^};
功能:將各個寄存器的值存入一片連續的內存單元中,內存單元的起始地址爲基址寄存器Rn的值,各個寄存器由寄存器列表regs表示。
該指令一般用於多個寄存器數據的入棧。
{^}:指示指令所用的寄存器爲用戶模式下的寄存器。
其他參數用法同LDM指令。
例如:
STMEA R13!,{R0-R12,PC}
;將寄存器R0~R12以及程序計數器PC的值保存到R13指示的堆棧中

Load/Store指令14-2
舉例:其中R1爲指令執行前的基址寄存器,R1’則爲指令執行後的基址寄存器

Load/Store指令14-3
堆棧操作和數據塊傳送指令類似,也有4種模式,它們之間的關係如下表所示:

 Load/Store指令15
15.SWP 字數據交換指令
格式:SWP{<cond>} <Rd>,<op1>,[<op2>];
功能: Rd=[op2],[op2]=op1
從op2所表示的內存裝載一個字並把這個字放置到目的寄存器Rd中,然後把寄存器op1的內容存儲到同一內存地址中。
op1,op2均爲寄存器。
例如:
SWP R0,R1,[R2]
;將R2所表示的內存單元中的字數據裝載到R0,然後將R1中的字數據保存到R2所表示的內存單元中

Load/Store指令16
16.SWPB 字節數據交換指令
格式:SWP{<cond>}B <Rd>,<op1>,[<op2>];
功能:從op2所表示的內存裝載一個字節並把這個字節放置到目的寄存器Rd的低8位中,Rd的高24位設置爲0;然後將寄存器op1的低8位數據存儲到同一內存地址中。
例如:
SWPB R0,R1,[R2]
;將R2所表示的內存單元中的一個字節數據裝載到R0的低8位,然後將R1中的低8位字節數據保存到R2所表示的內存單元中

程序狀態寄存器指令
用於狀態寄存器和通用寄存器間傳送數據。
總共有兩條指令:MRS和MSR。
兩者結合可用來修改程序狀態寄存器的值。

程序狀態寄存器指令1
1.MRS 程序狀態寄存器到通用寄存器的數據傳送指令
格式:MRS{<cond>} <Rd>,CPSR/SPSR;
功能:用於將程序狀態寄存器的內容傳送到目標寄存器Rd中。
當進入中斷服務程序或進程切換時,該指令可用來保存當前狀態寄存器的值。
例如:
MRS R0,CPSR
;狀態寄存器CPSR的值存入寄存器R0中

程序狀態寄存器指令2
2.MSR 通用寄存器到程序狀態寄存器的數據傳送指令
格式:MSR{<cond>} CPSR/SPSR_<field>,<op1>;
功能:用於將寄存器Rd的值傳送到程序狀態寄存器中。
當退出中斷服務程序或進程切換時,該指令可用來恢復狀態寄存器的值。
操作數op1可以是通用寄存器或立即數。
<field>:用來設置狀態寄存器中需要操作的位。
32位的狀態寄存器可以分爲4個域:
位[31:24]爲條件標誌位域,用f表示。
位[23:16]爲狀態位域,用s表示。
位[15:8]爲擴展位域,用x表示。
位[7:0]爲控制位域,用c表示。
例如:MSR CPSR_f,R0
;用R0的值修改CPSR的條件標誌域
MSR CPSR_fsxc,#5; CPSR的值修改爲5

協處理器指令
ARM處理器最多可支持16個協處理器,用於輔助ARM完成各種協處理操作。
在程序執行過程中,各協處理器只執行自身的協處理指令,而忽略屬於ARM處理器和其他協處理器的指令。
ARM協處理器指令可分爲3類:
(1)ARM處理器用於初始化協處理器的數據操作指令(CDP)。
(2)協處理器寄存器和內存單元之間的數據傳送指令(LDC,STC)。
(3)ARM處理器寄存器和協處理器寄存器之間的數據傳送指令(MCR,MRC)。

CDP協處理器操作指令
格式:CDP{<cond>}<p>,<opcode1>,<CRd>,<CRm>,<CRn>,<opcode2>;
功能:用於傳遞指令給協處理器p,要求其在寄存器CRn和CRm上,進行操作opcode1,並把結果存放到CRd中,可以使用opcode2提供與操作有關的補充信息。
指令中的所有寄存器均爲協處理器的寄存器,操作由協處理器完成。
指令中:
P爲協處理器編號;
CRd爲目的寄存器的協處理器寄存器;
CRm和CRn爲存放操作數的協處理器寄存器;
Opcode1和opcode2爲協處理器即將執行的操作。
例如:CDP p5,5,c0,c1,c2,9;
該指令用於通知協處理器p5,在c1和c2上執行操作5和9,並將結果存放到c0中。

LDC協處理器數據讀取指令
格式:LDC {<cond>}{L}<p>,<CRd>,<addr>;
功能:將addr表示的內存地址中的連續數據傳送到目的寄存器CRd中。
L表示指令爲長讀取操作,比如用於雙精度數據的傳輸;
目的寄存器CRd爲協處理器的寄存器;
addr的尋址方式同LDR指令,其寄存器爲ARM處理器的寄存器。
例如:
LDC p5,c1,[R1+5]:該指令用於將R1+5所對應的存儲單元中的數據,傳送到協處理器p5的寄存器c1中。

STC協處理器數據存儲指令
格式:STC{<cond>}{L}<p>,<CRd>,<addr>;
功能:將寄存器CRd的值傳送到addr表示的內存地址中。指令中各參數用法同LDC。
例如:STC p5,c1,[R1+5];
該指令用於將協處理器p5中寄存器c1的數據傳送到R1+5所對應的存儲單元中。

MCR ARM寄存器到協處理器寄存器的數據傳送指令
格式:MCR{<cond>}<p>,<op1>,<Rd>,<CRn>,<CRm>{,op2};
功能:將ARM處理器的寄存器Rd中的數據傳送到協處理器p的寄存器CRn,CRm中;op1,op2爲協處理器將要執行的操作。
例如:MCR p5,5,R1,C1,C2,9;該指令將R1中的數據傳送到協處理器p5的寄存器C1,C2中,協處理器執行操作5和9。

MRC 協處理器寄存器到ARM寄存器的數據傳送指令
格式:MRC {<cond>}<p>,<op1>,<Rd>,<CRn>,<CRm>{,op2};
功能:將協處理器p的寄存器CRn,CRm的數據傳送到ARM處理器的寄存器Rd中;op1,op2爲協處理器將要執行的操作。
例如:MRC p5,5,R1,C1,C2,9;該指令將寄存器C1,C2中的數據傳送到R1中,協處理器p5協處理器執行操作5和9。

異常中斷指令1
1.SWI 軟件中斷指令
格式:SWI {<cond>} 24位的立即數;
功能:用於產生軟件中斷,以使用戶程序調用操作系統的系統例程。
指令中24位的立即數指定用戶程序調用系統例程的類型,其參數通過通用寄存器傳遞。
當24位的立即數被忽略時,系統例程類型由寄存器R0指定,其參數通過其他通用寄存器傳遞。
例如:
SWI 0X05; 調用編號爲05的系統例程。

異常中斷指令3
2.BKPT 斷點中斷指令
格式:BKPT 16位的立即數;
功能:用於產生軟件斷點中斷,以便軟件調試時使用。16位的立即數用於保存軟件調試中額外的斷點信息。
指令操作的僞代碼:
if (not overdiden by debug hardware) then
R14_abt = adderss of BKPT instruction + 4
SPSR_abt = CPSR
CPSR[4:0] = 0b10111 /* 中止模式 */
CPSR[5] = 0 /* 使程序處於 ARM 狀態, T Bit = 0*/
/* CPSR[6] is unchanged, fiq不變*/
CPSR[7] = 1 /* 禁止正常中斷,I Bit = 1, 禁止irq */
if high vectors configured then
PC = 0xFFFF000C
else
PC = 0x0000000C



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章