ARM指令集
ARM指令的基本格式
ARM指令的基本格式爲:
<Opcode> {<Cond>} {S} <Rd> , <Rn> { , <Opcode2> }
其中,< >內的項是必需的,{ }內的項是可選的。
(1)Opcode項
Opcode是指令助記符,即操作碼,說明指令需要執行的操作,在指令中是必需的。
(2)Cond項(command)
Cond項表明了指令的執行的條件,每一條ARM指令都可以在規定的條件下執行,每條ARM指令包含4位的條件碼,位於指令的最高4位[31:28]。條件碼共有16種,每種條件碼用2個字符表示,這兩個字符可以添加至指令助記符的後面,與指令同時使用。當指令的執行條件滿足時,指令才被執行,否則指令被忽略。如果在指令後不寫條件碼,則使用默認條件AL(無條件執行)。
指令的條件碼
條 件 碼 |
助記符後綴 |
標 志 |
含 義 |
0000 |
EQ |
Z置位 |
相等equal |
0001 |
NE |
Z清零 |
不相等not equal |
0010 |
CS |
C置位 |
無符號數大於或等於Carry Set |
0011 |
CC |
C清零 |
無符號數小於 |
0100 |
MI |
N置位 |
負數minus |
0101 |
PL |
N清零 |
正數或零plus |
0110 |
VS |
V置位 |
溢出 |
0111 |
VC |
V清零 |
沒有溢出 |
1000 |
HI |
C置位Z清零 |
無符號數大於high |
1001 |
LS |
Z置位C清零 |
無符號數小於或等於less |
1010 |
GE |
N等於V |
帶符號數大於或等於 |
1011 |
LT |
N不等於V |
帶符號數小於least |
1100 |
GT |
Z清零且(N等於V) |
帶符號數大於great |
1101 |
LE |
Z清零或(N不等於V) |
帶符號數小於或等於 |
1110 |
AL |
忽略 |
無條件執行all |
1111 |
|
|
|
條件碼應用舉例:
例:比較兩個值大小,並進行相應加1處理,C語言代碼爲:
if ( a > b ) a++;
else b++;
對應的ARM指令如下(其中R0中保存a 的值,R1中保存b的值):
CMP R0, R1 ; R0與R1比較,做R0-R1的操作
ADDHI R0, R0, #1 ;若R0 > R1, 則R0 = R0 + 1
ADDLS R1, R1, #1 ; 若R0 <= R1, 則R1 = R1 + 1
CMP比較指令,用於把一個寄存器的內容和另一個寄存器的內容或一個立即數進行比較,同時更新CPSR中條件標誌位的值。指令將第一操作數減去第二操作數,但不存儲結果,只更改條件標誌位。
CMP R1, R0 ;做R1-R0的操作。
CMP R1,#10 ;做R1-10的操作。
(3) S項(sign)
S項是條件碼設置項,它決定本次指令執行的結果是否影響至CPSR寄存器的相應狀態位的值。該項是可選的,使用時影響CPSR,否則不影響CPSR。
(4)Rd項(destination)
Rd是指令中的目標寄存器,它是必需的。根據指令的不同,有些指令中要求Rd必須有R0~R7之間,有些要求Rd必須在R0~R14之間,有些則沒有特殊要求。
(5)Rn項
Rn是第一個操作數的寄存器,和Rd一樣,不同的指令對其的使用有不同的要求。
(6)Opcode2項
Opcode2項是第二個操作數,在ARM指令中,該操作數有三種形式:立即數形式、寄存器Rm形式和寄存器加移位形式(Rm, shift)。
例如:
SUB R3, R1, #10
SUB R3, R1, R2
SUB R3, R1, R2, LSL #2
SUB R3, R1, R2, LSL R0
ARM指令詳解
ARM指令集可分爲以下6類:
l 跳轉指令
l 數據處理指令
l 程序狀態寄存器(PSR)處理指令
l 加載/存儲指令
l 協處理器指令
l 異常產生指令
ARM指令及功能描述
助 記 符 |
指令功能描述 |
ADC |
帶進位加法指令 |
ADD |
加法指令 |
AND |
邏輯與指令 |
B |
跳轉指令 |
BIC |
位清零指令 |
BKPT |
軟件斷點 |
BL |
帶返回的跳轉指令 |
BLX |
帶返回和狀態切換的跳轉指令 |
BX |
帶狀態切換的跳轉指令 |
CDP |
協處理器數據操作指令 |
CMN |
取反比較指令 |
CMP |
比較指令 |
EOR |
邏輯異或指令 |
LDC |
存儲器到協處理器的數據傳輸指令 |
LDM |
加載多個寄存器的指令 |
LDR |
存儲器到寄存器的數據傳輸指令 |
MCR |
從ARM寄存器到協處理器寄存器的數據傳輸指令 |
MLA |
乘加運算指令 |
MOV |
數據傳輸指令 |
MRC |
從協處理器寄存器到ARM寄存器的數據傳輸指令 |
MRS |
傳送CPSR或SPSR的值到通用寄存器的指令 |
MSR |
傳送通用寄存器的值到CPSR或SPSR的指令 |
MUL |
32位乘法指令 |
MVN |
數據取反傳送指令 |
ORR |
邏輯或指令 |
RSB |
反向減法指令 |
RSC |
帶借位的反向減法指令 |
SBC |
帶借位的減法指令 |
STC |
協處理器寄存器寫入存儲器指令 |
STM |
存儲多個寄存器的值到存儲器指令 |
STR |
存儲寄存器的值到存儲器的指令 |
SUB |
減法指令 |
SWI |
軟件中斷指令 |
SWP |
寄存器與存儲器 或 寄存器與寄存器之間的數據交換指令 |
TEQ |
相等測試指令 |
TST |
位測試指令 |
1. 跳轉指令
用於實現程序流程的跳轉,在ARM程序中有兩種方法可以實現程序流程的跳轉:一是使用專門的跳轉指令,二是直接向程序計數器PC寫入跳轉地址值。第二種方法可以實現在4GB的地址空間中的任意跳轉,在跳轉之前結合使用“MOV LR , PC”等類似指令,可以保存將來的返回地址值,從而實現在4GB連續的線性地址空間的子程序調用。
1)ARM指令集中的跳轉指令可以實現從當前指令向前或向後的32MB的地址空間的跳轉。
l B指令
格式:
B{條件} 目標地址
注意,存儲在跳轉指令中的實際值是相對當前PC值的一個偏移量,而不是一個絕對地址,它的值由彙編器來計算(相對尋址)。這個偏移量是一個24位的有符號數,左移兩位後表示的有效偏移爲26位(前後32MB的地址空間)。{}表示可以省略。
如:B Label 程序無條件跳轉到標號Label處執行。
CMP R1,#0
BEQ Label
當CPSR寄存器中的Z條件碼置位時,程序跳轉到Label處執行。
當前PC:是指跳轉指令本身的起始地址。
l BL指令
格式:
BL{條件} 目標地址
這條指令在跳轉之前,會在寄存器R14中保存當前的下一條指令的地址,因此,可以通過將R14重新加載到PC中,來返回到跳轉指令之後的那條指令處執行。該指令是實現子程序調用的一種常用手段。
l BX 指令
格式:
BX {條件} 目標地址
BX指令中所指定的目標地址,只能使用寄存器的尋址方式,即跳轉的目標地址應先保存在一個寄存器中。指令在實現跳轉的同時,完成處理器的工作狀態的切換(ARM狀態與Thumb狀態間的切換)。
BX指令中,用寄存器的最低位來指示切換到哪一個工作狀態。如寄存器最低位爲1,則把目標地址處的代碼解釋爲Thumb代碼,進入Thumb工作狀態,並自動將CPSR中的控制位T置1。若寄存器最低位爲0,則把目標地址處的代碼解釋爲ARM代碼,進入ARM工作狀態,並自動將CPSR中的控制位T置0。
…
ADRL R0, ThumbFun + 1 ;生成分支地址並置最低位爲 1
BX R0 ;跳轉到R0所指定的地址,並切換處理器到Thumb工作狀態
…
ThumbFun
… ;Thumb彙編指令
…
| BLX指令
以上兩條指令的綜合。
2. 數據處理指令
數據處理指令可分數據傳送指令、算術邏輯運算指令和比較指令等。數據傳送指令用於在寄存器和存儲器之間進行數據的雙向的傳輸。所有ARM數據處理指令均可選擇使用S後綴,以影響狀態標誌CPSR。比較指令(CMP、CMN、TST、TEQ)不保存運算結果,這些指令也不使用S後綴,但會直接影響CPSR中的相應的狀態標誌位。
(1)數據傳送指令MOV 和MVN
格式:
MOV {條件} {S} 目的寄存器, 源操作數
MOV指令可以完成從另一個寄存器、被移位的寄存器、或將一個立即數加載到目的寄存器。與MVN指令不同的是在傳送之前,將被傳送的對象先按位取反,再傳送到目的寄存器。
例:MVN R1 , #0XFF ;R1 ← 0X FFFF FF00
MVN R1 , R2
MOV PC,R14;將寄存器R14的值傳送給PC,用於子程序返回。
(2) 數據比較指令CMP , CMN , TST , TEQ
例:
CMP R1, R2 ; 做R1 – R2 的操作,結果不保存,但影響標誌位。
CMP R1 , #10 ;做R1 - 10的操作,結果不保存,但影響標誌位。
CMN 指令用於把一個寄存器的內容和另一個寄存器的內容或立即數取反後進行比較操作,根據運算結果影響CPSR中的標誌位。該指令實際完成操作數1和操作數2相加,並根據結果更改條件標誌位。
TST位測試指令,用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的與運算,並根據運算結果更新CPSR中條件標誌位的值。操作數1是要測試的數,而操作數2 是一個位掩碼,該指令一般用來檢測是否設置了特定的位。
TST {條件} 操作數1, 操作數2
例:TST R0, #0X0000 0040 ; 指令用來測試R0的位3是否爲1。
TST指令通常和EQ、NE條件碼配合使用,當所有測試位爲0時,EQ有效,而只要有一個測試位不爲0,則NE有效。
TEQ相等測試指令,用於把一個寄存器的內容和另一個寄存器的內容或立即數進行按位的異或運算,並根據運算結果更新CPSR中的條件標誌位。指令用於比較兩個操作數是否相等。如果相等,則 Z = 1,否則Z = 0。指令通常和EQ、NE條件碼配合使用
例:TEQ R1, R2
TST R1,#%1;測試R1中是否設置了最低位(%表示二進制數)
(3)邏輯運算類指令:AND、ORR、EOR、BIC
格式:邏輯類指令 {條件} {S} 目的寄存器,操作數1, 操作數2
S選項,說明運算結果影響CPSR的條件標誌位,沒有S選項,則不影響CPSR的條件標誌位。
操作數1應該是一個寄存器,操作數2可以是一個寄存器、被移位的寄存器或一個立即數。
AND指令常用於將操作數1的某個位置0;ORR指令常用於將操作數1的某個位置1;EOR(異或)指令常用於將操作數1的某個位取反。與0相異或,保持不變,與1相異或,則取反。BIC指令用於清除操作數1的某些位,並把結果放置到目的寄存器中,如果在掩碼中設置了某一位,則清除這一位。未設置的掩碼位保持不變。
例:BIC R1, R1, #0X0F ;將R1的低四位清零,其他位不變。
(4)算術運算類指令:ADD、ADC、SUB、SBC、RSB、RSC
格式:算術運算類指令 {條件} {S} 目的寄存器,操作數1,操作數2
目的寄存器,操作數1和操作數2使用的寄存器必須在R0~R7之間。
操作數1應該是一個寄存器,操作數2可以是一個寄存器、被移位的寄存器或一個立即數。
例:ADDS R1, R1,#10 ;結果影響標誌位
ADD R1, R1, R2 ;結果不影響標誌位
ADD R3, R1, R2, LSL #2 ; R3 = R1 + ( R2 << 2 )
ADD指令完成的功能是將操作數1加上操作數2,結果送到目的寄存器。
ADC指令完成的功能是將操作數1加上操作數2,再加上標誌位C的值,結果送到目的寄存器。
SUB指令完成的功能是將操作數1減去操作數2,結果送到目的寄存器。
SBC指令完成的功能是將操作數1減去操作數2,再減去標誌位C的取反值,結果送到目的寄存器。
RSB逆向減法指令完成的功能是將操作數2減去操作數1,結果送到目的寄存器。
RSC帶借位的逆向減法指令完成的功能是將操作數2減去操作數1,再減去標誌位C的取反值,結果送到目的寄存器。
例:
SUB R0, R1, #256 ;R0 = R1 - 256 , 結果不影響標誌位
SUBS R0, R2,R3,LSL #1 ;R0 = R2 - ( R3 <<1 ),結果影響標誌位
SUB SP , #380 ;SP = SP - 380
SBC R0, R1, R2 ;R0 = R1 - R2 - !C
RSC R0, R1, R2 ;R0 = R2 - R1 - !C
(5)乘法指令與乘加指令
ARM微處理器支持的乘法指令與乘加指令共有6條,可分爲運算結果爲32位和結果爲64位兩類,與前面的數據處理指令不同,指令中的所有操作數、目的寄存器必須爲通用寄存器,不能對操作數使用立即數或被移位的寄存器,同時,目的寄存器和操作數1必須是不同的寄存器。
l MUL指令
格式:
MUL {條件} {S} 目的寄存器,操作數1, 操作數2
功能:
目的寄存器 = 操作數1 × 操作數2,同時可以根據運算結果設置CPSR中相應的條件標誌位N和Z。操作數1和操作數2均爲32位的有符號數或無符號數。
l MLA指令
格式:
MLA {條件} {S} 目的寄存器,操作數1, 操作數2, 操作數3
功能:
目的寄存器 = 操作數1 × 操作數2 + 操作數3,同時可以根據運算結果設置CPSR中相應的條件標誌位N和Z。操作數1和操作數2均爲32位的有符號數或無符號數。
l SMULL指令(S:Signed, 有符號)
格式:
SMULL {條件} {S} 目的寄存器Low,目的寄存器High,操作數1, 操作數2
功能:
目的寄存器Low = (操作數1 × 操作數2 )的低32位,
目的寄存器High = (操作數1 × 操作數2 )的高32位,同時可以根據運算結果設置CPSR中相應的條件標誌位。操作數1和操作數2均爲32位的有符號數。
例:
SMULL R0, R1, R2, R3
;R0 = (R2 ×R3)的低32位, R1 = (R2 ×R3)的高32位。
l SMLAL指令(S:Signed, 有符號)
格式:
SMLAL {條件} {S} 目的寄存器Low,目的寄存器High,操作數1, 操作數2
功能:
目的寄存器Low = (操作數1 × 操作數2 )的低32位 + 目的寄存器Low,
目的寄存器High = (操作數1 × 操作數2 )的高32位 + 目的寄存器High,同時可以根據運算結果設置CPSR中相應的條件標誌位。操作數1和操作數2均爲32位的有符號數。
例:
SMLAL R0, R1, R2, R3
;R0 = (R2 ×R3)的低32位 + R0,
;R1 = (R2 ×R3)的高32位 + R1。
l UMULL指令(U:UnSigned, 無符號)
格式:
UMULL {條件} {S} 目的寄存器Low,目的寄存器High,操作數1, 操作數2
功能:
目的寄存器Low = (操作數1 × 操作數2 )的低32位,
目的寄存器High = (操作數1 × 操作數2 )的高32位,同時可以根據運算結果設置CPSR中相應的條件標誌位。操作數1和操作數2均爲32位的無符號數。
例:
UMULL R0, R1, R2, R3
;R0 = (R2 ×R3)的低32位, R1 = (R2 ×R3)的高32位。
l UMLAL指令(U:UnSigned, 無符號)
格式:
UMLAL {條件} {S} 目的寄存器Low,目的寄存器High,操作數1, 操作數2
功能:
目的寄存器Low = (操作數1 × 操作數2 )的低32位 + 目的寄存器Low,
目的寄存器High = (操作數1 × 操作數2 )的高32位 + 目的寄存器High,同時可以根據運算結果設置CPSR中相應的條件標誌位。操作數1和操作數2均爲32位的無符號數。
例:
UMLAL R0, R1, R2, R3
;R0 = (R2 ×R3)的低32位 + R0,
;R1 = (R2 ×R3)的高32位 + R1。
3. 程序狀態寄存器訪問指令
功能:用於在程序狀態寄存器和通用寄存器之間傳送數據。
l MRS指令
格式:
MRS {條件} 通用寄存器, 程序狀態寄存器(CPSR、SPSR)
功能:
將狀態寄存器的內容傳送到通用寄存器。
使用環境:
(1)當需要改變程序狀態寄存器的內容時,可用MRS將狀態寄存器的內容讀入到通用寄存器,修改後再寫回到程序狀態寄存器。
(2)當在異常處理或進程切換時,需要保存程序狀態寄存器的值,可先用該指令讀出程序狀態寄存器的值,然後保存。
l MSR指令
格式:
MSR {條件} 程序狀態寄存器(CPSR、SPSR)_<域>,操作數
功能:
將操作數的內容傳送到程序狀態寄存器的特定域中。其中,操作數可以爲通用寄存器或立即數。<域>用於設置程序狀態寄存器中需要操作的位,32位的程序狀態寄存器分爲4個域:
F域:位31~位24爲條件標誌位域;
S域:位23~位16爲狀態位域;
X域:位15~位8爲擴展位域;
C域:位7~位0爲控制位域;
使用環境:
(1)當需要改變程序狀態寄存器的內容時,可用MRS將狀態寄存器的內容讀入到通用寄存器,修改後再寫回到程序狀態寄存器。
(2)當在異常處理或進程切換時,需要保存程序狀態寄存器的值,可先用該指令讀出程序狀態寄存器的值,然後保存。
例:
MSR CPSR , R0 ;CPSR←R0
MSR SPSR_c , R0 ;傳送R0到SPSR,但僅修改SPSR中的控制位域
MSR CPSR_c , #0XD3 ; CPSR[7..0] = 0XD3 , 即切換到管理模式
MSR CPSR_cxsf , R3 ; CPSR ← R3
注意:只有在特權模式下,才能修改狀態寄存器。
程序中不能通過MSR指令直接修改CPSR中的T控制位來實現ARM/Thumb狀態的切換,必須使用BX指令來完成處理器狀態的切換。
MRS與MSR配合使用,可以實現CPSR或SPSR寄存器的讀/修改/寫操作,進行處理器模式 切換,進行允許/禁止IRQ/FIQ中斷等的設置。
例:使能IRQ中斷
MRS R0 , CPSR
BIC R0 , R0 , #0X80
MSR CPSR_c , R0
MOV PC , LR
例:禁止IRQ中斷
MRS R0 , CPSR
ORR R0 , R0 , #0X80
MSR CPSR_c , R0
MOV PC , LR
4. 存儲器加載/存儲指令
功能:用於在寄存器和存儲器之間傳送數據,加載指令用於將存儲器中的數據傳送到寄存器,存儲指令則將寄存器中的數據傳送到存儲器。
存儲器加載/存儲指令分爲單個存儲器加載/存儲指令和多個存儲器加載/存儲指令。
(1)單個存儲器加載/存儲指令
LDR字數據加載指令;
LDRH(Half)半字數據加載指令;
LDRB字節數據加載指令;
STR字數據存儲指令;
STRH半字數據存儲指令;
STRB字節數據存儲指令。
l 加載指令
格式:
加載指令 {條件} 目的寄存器, <存儲器地址>
例:
LDR R0 , [R1] ;將地址爲R1的字數據讀入R0。
LDR R0 , [R1,R2] ;將地址爲R1+R2的字數據讀入R0。
LDR R0 , [R1, #4] ;將地址爲R1+4的字數據讀入R0。
LDR R0 , [R1, R2]! ;將地址爲R1+R2的字數據讀入R0,並將新地址R1+R2寫入R1。
LDR R0 , [R1, R2, LSL #2 ] !
;將地址爲R1 + R2 × 4的字數據讀入R0,並將新地址R1 + R2 × 4寫入R1。
LDRH指令用於從存儲器中將一個16位的半字數據傳送到目的寄存器中,同時將寄存器的高16位清零。
LDRH R0 , [R1] ;將地址爲R1的半字數據讀入R0,並將R0的高16位清零。
LDRB指令用於從存儲器中將一個8位的字節數據傳送到目的寄存器中,同時將寄存器的高24位清零。
LDRB R0 , [R1] ;將地址爲R1的字節數據讀入R0,並將R0的高24位清零。
注意:當是字操作時,操作數的地址必須是字對齊的,如果是半字操作,操作數的地址必須是半字對齊。否則,讀出的數據是無效,隨機的。
例:
LDR R0 , [R1 , # 2 ]
LDRH R0 , [R1 , # 1 ]
l 存儲指令
格式:
存儲指令 {條件} 源寄存器, <存儲器地址>
例:
STR R0 , [R1] , #8
;將R0中的字數據寫入以R1爲地址的存儲器中,並將新地址R1+8寫入R1。
STR R0 , [R1 , #8] ;將R0中的字數據寫入以R1+8爲地址的存儲器中。
STRH指令用於從源寄存器中將一個16位的半字數據傳送到存儲器中。該半字數據爲源寄存器中的低16位。
STRH R0 , [R1, #8] ;將寄存器R0中的低16位寫入以R1 + 8爲地址的存儲器中。
STRB指令用於從源寄存器中將一個8位的字節數據傳送到存儲器中。該字節數據爲源寄存器中的低8位。
注意:當是字操作時,操作的地址必須是字對齊的,如果是半字操作,操作的地址必須是半字對齊。否則,讀出的數據是無效,隨機的。
(2)批量數據加載/存儲指令
功能:可以一次在一片連續的存儲器單元和多個寄存器之間傳送數據,批量加載指令用於將一片連續的存儲器中的數據傳送到多個寄存器,批量數據存儲指令完成相反的操作。
LDM(或STM)指令(Load Data To Multiple Register)
格式:
LDM(或STM) {條件} {類型} 基址寄存器{!} ,寄存器列表{^}
{類型}爲以下幾種情況:
類 型 |
含 義 |
IA |
每次操作後,地址加4 |
IB |
每次操作前,地址加4 |
DA |
每次操作後,地址減4 |
DB |
每次操作前,地址減4 |
FD |
滿遞減堆棧 |
ED |
空遞減堆棧 |
FA |
滿遞增堆棧 |
EA |
空遞增堆棧 |
{!}爲可選後綴,若選用,則當數據傳送完畢之後,將最後的地址寫入基址寄存器,否則基址寄存器的內容不改變。
基址寄存器不允許爲R15,寄存器列表可以爲R0 ~ R15的任意組合。
{^}爲可選後綴,當指令爲LDM且寄存器列表中包含有R15,選用該後綴表示:除了正常的數據傳送之外,還將SPSR複製到CPSR。同時,該後綴還表示傳入或付傳出的是用戶模式下的寄存器,而不是當前模式下的寄存器。
例:
STMFD SP!, {R0 - R7 , LR} ;現場保存,將R0 - R7 , LR入棧,滿遞減堆棧。
LDMFD SP!, {R0 - R7 , PC}^ ;恢復現場,異常處理返回,滿遞減堆棧
在進行數據複製時,先設置好源數據指針,然後使用塊拷貝尋址指令進行讀取和存儲。而在堆棧操作中,則要先設置堆棧指針SP,然後使用堆棧尋址指令實現堆棧操作。
5. 數據交換指令
功能:支持在存儲器和寄存器之間交換數據。
SWP ( Swap ) 字數據交換指令;
SWPB 字節數據交換指令。
格式:
交換指令 {條件} 目的寄存器, 源寄存器1, [源寄存器2]
例:
SWP R0, R1, [R2] ;將R2所指的存儲器中的字數據傳送到R0,同時將R1中的字數據傳送到R2所指的存儲器單元。
顯然,當源寄存器1與目的寄存器是同一個寄存器時,就完成了寄存器與存儲器間的交換操作。
SWPB指令用於將源寄存器2所指向的存儲器中的字節數據到目的寄存器中,目的寄存器的高24位清零,同時將源寄存器1中的低8位數據(低位字節)傳送到源寄存器2所指向的存儲器中。
6. 異常產生指令
異常指令有兩條:SWI軟件中斷指令和BKPT斷點中斷指令。
l SWI中斷指令
格式:
SWI {條件} 24位的立即數
功能:
產生軟件中斷,方便用戶程序調用操作系統的系統例程。
操作:
切換運行模式到管理模式,設置PC來執行在地址0X08處的下一條指令,設置相應的R13_svc和R14_svc。該指令的操作與執行BL 0X08這條指令的效果是相同的。不同的地方在於,SWI還帶有指明系統例程的類型的“24位的立即數”。在具體應用中,爲便於記憶,可以使用字符串代替“24位的立即數”,例如:SWI “OS_Write0”和 SWI 0X02是一樣的。當指令中24位的立即數被忽略時,系統例程的類型由通用寄存器R0的內容決定。傳送給系統例程的參數通過通用寄存器來傳遞。
l BKPT指令
格式:
BKPT 16位的立即數
功能:
用於產生軟件斷點中斷,執行時中斷正常指令,進入相應的調試子程序。
7. 協處理器指令
ARM處理器可支持多達16個協處理器,每個協處理器只執行鍼對其自身的協處理指令。ARM的協處理器指令主要用於ARM處理器初始化、協處理器的數據處理操作、在ARM處理器與協處理器的寄存器之間傳送數據、在協處理器和存儲器之間傳送數據。ARM協處理器指令有以下5條:
l CDP協處理器數據操作指令;
l LDC協處理器數據加載指令;
l STC協處理器數據存儲指令;
l MCR ARM處理器寄存器到協處理器寄存器的數據傳送指令;
l MRC 協處理器寄存器到ARM處理器寄存器的數據傳送指令。
(1)CDP指令
格式:
CDP {條件}協處理器編碼,協處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協處理器操作碼2
功能:用於ARM處理器通知協處理器執行特定的操作,若協處理器不能執行指定的操作,則產生未定義指令異常。
注意:指令中涉及到的寄存器都是協處理器的寄存器,不涉及ARM處理器的寄存器和存儲器。操作碼1、操作碼2是協處理器要執行的操作。
例: CDP p5 , 1 , c3 , c4 , c5 , 2
;指示協處理器P5,執行操作1,可選操作爲2;C3, C4, C5是相應的協處理器寄存器。
(2) LDC指令
格式:
LDC {條件}{L}協處理器編碼,目的寄存器,[源寄存器]
功能:
用於將源寄存器所指向的存儲器中的字數據傳送到目的寄存器中。若協處理器不能成功執行,則產生未定義指令異常。選項{L}表示指令爲長讀取操作,可用於雙精度數據的傳輸。
注意:指令中涉及到的源寄存器是ARM處理器的寄存器。
例:LDC P3, C4, [R2, #4]
(3) STC指令
格式:
STC {條件}{L}協處理器編碼,源寄存器,[目的寄存器]
功能:
用於將源寄存器中的字數據傳送到目的寄存器所指向的存儲器中。若協處理器不能成功執行,則產生未定義指令異常。選項{L}表示指令爲長讀取操作,可用於雙精度數據的傳輸。
注意:指令中涉及到的目的寄存器是ARM處理器的寄存器。
例:STC P3, C4, [R0]
;將協處理器P3的寄存器C4中的數據傳送到ARM處理器的寄存器R0所指向的存儲器.
(4) MCR指令
格式:
MCR {條件}協處理器編碼,協處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協處理器操作碼2
功能:
MCR指令用於將ARM處理器寄存器中的數據傳送到協處理器的寄存器中。若協處理器不能完成這個操作,將引發未定義指令異常。源寄存器爲ARM處理器的寄存器。
(5) MRC指令
格式:
MRC {條件}協處理器編碼,協處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協處理器操作碼2
功能:
MRC指令用於將協處理器寄存器中的數送到ARM處理器的寄存器中。若協處理器不能完成這個操作,將引發未定義指令異常。源寄存器爲ARM處理器的寄存器。
例:MRC P3 , 3 , R0 , C4 , C5 , 6
;將協處理器P3的寄存器C4與C5中的數據傳送到ARM的寄存器中,並執行編號爲3和6的操作。
Thumb指令集合
Thumb指令集是ARM指令集的一個子集,允許指令編碼爲16位的長度,Thumb指令集在保留32位代碼優勢的同時,大大節省了系統的存儲空間。
當處理器在執行ARM程序段時,稱ARM處理器處於ARM工作狀態,當處理器在執行Thumb程序段時,稱ARM處理器處於Thumb工作狀態。
在編寫Thumb指令時,先要用僞指令CODE16聲明以下爲Thumb指令代碼,在ARM指令代碼中可以使用BX指令跳轉到Thumb指令代碼片。同樣編寫ARM代碼時,則使用僞指令CODE32進行聲明,在Thumb指令代碼中使用BX指令可以跳轉到ARM指令代碼處。
大多數Thumb指令是無條件執行的,而幾乎所有的ARM指令都是有條件執行的。由於Thumb數據處理指令中的目的寄存器與其中的一個源寄存器相同,Thumb指令在指令編碼時由三個操作數改爲兩個操作數。
通常實現同樣的程序功能時,所需的Thumb指令的條數比ARM指令多。但使用Thumb指令集合的代碼有以下特點:
l 比ARM代碼更節略存儲空間。
l 使用的指令條數比ARM代碼多。
l 若使用32位的存儲器,ARM代碼比Thumb代碼快約40%。
l 若使用16位的存儲器,Thumb代碼比ARM代碼快約40%~50%。
l 與ARM代碼相比較,使用Thumb代碼,存儲器的功耗會降低約30%。
轉自:http://www.cnblogs.com/laojie4321/archive/2012/04/05/2433034.html