ARM處理器的指令集能夠分爲跳轉指令、數據處理指令、程序狀態寄存器(PSR)處理指令、加載/存儲指令、協處理器指令和異常產生指令6大指令測試
1、跳轉指令編碼
跳轉指令用於實現程序流程的跳轉spa
跳轉指令分類操作系統
Ⅰ.使用專門的跳轉指令設計
分支指令 B3d
帶連接的分支指令: BL調試
帶狀態切換的分支指令 BXblog
Ⅱ. 程序計數器PC控制進程
直接向程序計數器PC寫入跳轉地址值,經過向程序計數器PC寫入跳轉地址值
get
能夠實如今4GB的地址空間中的任意跳轉,在跳轉以前結合使用MOV LR,PC等相似指令
能夠保存未來的返回地址值,從而實如今4GB連續的線性地址空間的子程序調用。
ARM指令集中的跳轉指令能夠完成從當前指令向前或向後的32MB的地址空間的跳轉,包括如下4條指令:
一、B指令
B指令的格式爲:
B{條件} 目標地址
二、BL指令
BL指令的格式爲:
BL{條件} 目標地址
BL是另外一個跳轉指令,但跳轉以前,會在寄存器R14中保存PC的當前內容,
所以,能夠經過將R14的內容從新加載到PC中,來返回到跳轉指令以後的那個 指令處執行。
該指令是實現子程序調用的一個基本但經常使用的手段
三、BLX指令
BLX指令的格式爲:
BLX 目標地址
BLX指令從ARM指令集跳轉到指令中所指定的目標地址,並將處理器的工做狀態有ARM狀態切換到Thumb狀態,
該指令同時將PC的當前內容保存到寄存器R14中。所以,當子程序使用Thumb指令集,而調用者使用ARM指令集時,
能夠經過BLX指令實現子程序的調用和處理器工做狀態的切換。同時,子程序的返回能夠經過將寄存器R14值複製到PC中來完成
四、BX指令
BX指令的格式爲:
BX{條件} 目標地址
BX指令跳轉到指令中所指定的目標地址,目標地址處的指令既能夠是ARM指令,也能夠是Thumb指令。
2、數據處理指令
分類:
數據傳送指令
數據傳送指令用於在寄存器和存儲器之間進行數據的雙向傳輸
算術邏輯運算指令
算術邏輯運算指令完成經常使用的算術與邏輯的運算,該類指令影響CPSR中的相應條件標誌位;
比較指令
比較指令不保存運算結果,只更新CPSR中相應的條件標誌位
數據處理指令共如下16條:
一、MOV指令(傳送)
MOV指令的格式爲:
MOV{條件}{S} 目的寄存器,源操做數
MOV指令可完成從另外一個寄存器、被移位的寄存器或將一個當即數加載到目的寄存器。
其中S選項決定指令的操做是否影響CPSR中條件標誌位的值,當沒有S 時指令不更新CPSR中條件標誌位的值
指令示例:
二、MVN指令(求反)
MVN指令的格式爲:
MVN{條件}{S} 目的寄存器,源操做數
MVN指令可完成從另外一個寄存器、被移位的寄存器、或將一個當即數在傳送以前按位被取反加載到目的寄存器。
其中S決定指令的操做是否影響CPSR中條件標誌位的值,當沒有S時指令不更新CPSR中條件標誌位的值。
指令示例:
三、CMP指令(比較)
CMP指令的格式爲:
CMP{條件} 操做數1,操做數2
CMP指令用於把一個寄存器的內容和另外一個寄存器的內容或當即數進行比較,同時更新CPSR中條件標誌位的值。
該指令進行一次減法運算,但不存儲結果,只更改條件標誌位。 標誌位表示的是操做數1與操做數2的關係(大、小、相等),
例如,當操做數1大於操做操做數2,則此後的有GT後綴的指令將能夠執行
指令示例:
四、CMN指令(負數比較)
CMN指令的格式爲:
CMN{條件} 操做數1,操做數2
CMN指令用於把一個寄存器的內容和另外一個寄存器的內容或當即數取反後進行比較,
同時更新CPSR中條件標誌位的值。該指令實際完成操做數1和操做數2相加,並根據結果更改條件標誌位
指令示例:
五、TST指令(測試)
TST指令的格式爲:
TST{條件} 操做數1,操做數2
TST指令用於把一個寄存器的內容和另外一個寄存器的內容或當即數進行按位的與運算
並根據運算結果更新CPSR中條件標誌位的值。操做數1是要測試的數據,而操做數2是一個位掩碼,該指令通常用來檢測是否設置了特定的位。
指令示例:
六、TEQ指令(測試相等)
TEQ指令的格式爲:
TEQ{條件} 操做數1,操做數2
TEQ指令用於把一個寄存器的內容和另外一個寄存器的內容或當即數進行按位的異或運算
並根據運算結果更新CPSR中條件標誌位的值。該指令一般用於比較操做數1和操做數2是否相等
指令示例:
七、ADD指令(相加)
ADD指令的格式爲:
ADD{條件}{S} 目的寄存器,操做數1,操做數2
ADD指令用於把兩個操做數相加,並將結果存放到目的寄存器中操做數1應是一個寄存器,
操做數2能夠是一個寄存器,被移位的寄存器,或一個當即數
指令示例:
八、ADC指令(帶進位相加)
ADC指令的格式爲:
ADC{條件}{S} 目的寄存器,操做數1,操做數2
ADC指令用於把兩個操做數相加,再加上CPSR中的C條件標誌位的值,並將結果存放到目的寄存器中。
它使用一個進位標誌位,這樣就能夠作比32位大的數的加法,注意不要忘記設置S後綴來更改進位標誌。
操做數1應是一個寄存器,操做數2能夠是一個寄存器,被移位的寄存器,或一個當即數。
如下指令序列完成兩個128位數的加法,第一個數由高到低存放在寄存器R7~R4,
第二個數由高到低存放在寄存器R11~R8,運算結果由高到低存放在寄存器R3~R0:
九、SUB指令(相減)
SUB指令的格式爲:
SUB{條件}{S} 目的寄存器,操做數1,操做數2
SUB指令用於把操做數1減去操做數2,並將結果存放到目的寄存器中。
操做數1應是一個寄存器,操做數2能夠是一個寄存器,被移位的寄存器,
或一個當即 數。該指令可用於有符號數或無符號數的減法運算
指令示例:
十、SBC指令
SBC指令的格式爲:
SBC{條件}{S} 目的寄存器,操做數1,操做數2
SBC指令用於把操做數1減去操做數2,再減去CPSR中的C條件標誌位的反碼,並將結果存放到目的寄存器中。
操做數1應是一個寄存器,操做數2能夠 是一個寄存器,被移位的寄存器,或一個當即數。
該指令使用進位標誌來表示借位,這樣就能夠作大於32位的減法,
注意不要忘記設置S後綴來更改進位標誌。該指令可用於有符號數或無符號數的減法運算。
指令示例:
十一、RSB指令
RSB指令的格式爲:
RSB{條件}{S} 目的寄存器,操做數1,操做數2
RSB指令稱爲逆向減法指令,用於把操做數2減去操做數1,並將結果存放到目的寄存器中。
操做數1應是一個寄存器,操做數2能夠是一個寄存器,被移位的寄存器,
或一個當即數。該指令可用於有符號數或無符號數的減法運算。
指令示例:
十二、RSC指令(反向帶進位減)
RSC指令的格式爲:
RSC{條件}{S} 目的寄存器,操做數1,操做數2
RSC指令用於把 操做數2減去操做數1,再減去CPSR中的C條件標誌位的反碼,並將結果存放到目的寄存器中。
操做數1應是一個寄存器,操做數2能夠是一個寄存器,被移位的寄存器,或一個當即數。
該指令使用進位標誌來表示借位,這樣就能夠作大於32位的減法,注意不要忘記設置S後綴來更改進位標誌。
該指令可用於有符號數或 無符號數的減法運算
指令示例:
1三、AND指令(邏輯位 與)
AND指令的格式爲:
AND{條件}{S} 目的寄存器,操做數1,操做數2
AND指令用於在兩個操做數上進行邏輯與運算,並把結果放置到目的寄存器中。
操做數1應是一個寄存器,操做數2能夠是一個寄存器,被移位的寄存器,
或一個當即數。該指令經常使用於屏蔽操做數1的某些位。
指令示例:
1四、ORR指令(邏輯位 或)
ORR指令的格式爲:
ORR{條件}{S} 目的寄存器,操做數1,操做數2
ORR指令用於在兩個操做數上進行邏輯或運算,並把結果放置到目的寄存器中。
操做數1應是一個寄存器,操做數2能夠是一個寄存器,被移位的寄存器,
或一個當即數。該指令經常使用於設置操做數1的某些位
指令示例:
1五、EOR指令(邏輯位異或)
EOR指令的格式爲:
EOR{條件}{S} 目的寄存器,操做數1,操做數2
EOR指令用於在兩個操做數上進行邏輯異或運算,並把結果放置到目的寄存器中。
操做數1應是一個寄存器,操做數2能夠是一個寄存器,被移位的寄存器,或一個當即數。該指令經常使用於反轉操做數1的某些位
指令示例:
EOR R0,R0,#3 ;該指令反轉R0的0、1位,其他位保持不變
1六、BIC指令(位清零)
BIC指令的格式爲:
BIC{條件}{S} 目的寄存器,操做數1,操做數2
BIC指令用於清除操做數1的某些位,並把結果放置到目的寄存器中。
操做數1應是一個寄存器,操做數2能夠是一個寄存器,被移位的寄存器,或一個當即數。
操做數2爲32位的掩碼,若是在掩碼中設置了某一位,則清除這一位。未設置的掩碼位保持不變
指令示例:
3、乘法指令與乘加指令
ARM 微處理器支持的乘法指令與乘加指令共有6條,可分爲運算結果爲32位和運算結果爲64位兩類,
與前面的數據處理指令不一樣,指令中的全部操做數、目的寄存器 必須爲通用寄存器,不能對操做數使用當即數或被移位的寄存器,
同時,目的寄存器和操做數1必須是不一樣的寄存器。
乘法指令與乘加指令共有如下6條:
一、MUL指令(相乘)
MUL指令的格式爲:
MUL{條件}{S} 目的寄存器,操做數1,操做數2
MUL指令完成將操做數1與操做數2的乘法運算,並把結果放置到目的寄存器中,
同時能夠根據運算結果設置CPSR中相應的條件標誌位。其中,操做數1和操 做數2均爲32位的有符號數或無符號數。
指令示例:
二、MLA指令(帶累加的相乘)
MLA指令的格式爲:
MLA{條件}{S} 目的寄存器,操做數1,操做數2,操做數3
MLA指令完成將操做數1與操做數2的乘法運算,再將乘積加上操做數3,並把結果放置到目的寄存器中,
同時能夠根據運算結果設置CPSR中相應的條件標誌位。其中,操做數1和操做數2均爲32位的有符號數或無符號數
指令示例:
三、SMULL指令
SMULL指令的格式爲:
SMULL{條件}{S} 目的寄存器Low,目的寄存器High,操做數1,操做數2
SMULL指令完成將操做數1與操做數2的乘法運算,並把結果的低32位放置到目的寄存器Low中,
結果的高32位放置到目的寄存器High中,同時能夠 根據運算結果設置CPSR中相應的條件標誌位。
其中,操做數1和操做數2均爲32位的有符號數
指令示例:
四、SMLAL指令
SMLAL指令的格式爲:
SMLAL{條件}{S} 目的寄存器Low,目的寄存器High,操做數1,操做數2
SMLAL指令完成將操做數1與操做數2的乘法運算,並把結果的低32位同目的寄存器Low中的值相加後又放置到目的寄存器Low中
結果的高32位同目的寄存器High中的值相加後又放置到目的寄存器High中,同時能夠根據運算結果設置CPSR中相應的條件標誌位。
其中,操做數1和操做數2均爲32位的有符號數。
對於目的寄存器Low,在指令執行前存放64位加數的低32位,指令執行後存放結果的低32位;
對於目的寄存器High,在指令執行前存放64位加數的高32位,指令執行後存放結果的高32位。
指令示例:
五、UMULL指令
UMULL指令的格式爲:
UMULL{條件}{S} 目的寄存器Low,目的寄存器High,操做數1,操做數2
UMULL指令完成將操做數1與操做數2的乘法運算,並把結果的低32位放置到目的寄存器Low中,
結果的高32位放置到目的寄存器High中,同時能夠 根據運算結果設置CPSR中相應的條件標誌位。
其中,操做數1和操做數2均爲32位的無符號數
指令示例:
六、UMLAL指令
UMLAL指令的格式爲:
UMLAL{條件}{S} 目的寄存器Low,目的寄存器High,操做數1,操做數2
UMLAL指令完成將操做數1與操做數2的乘法運算,並把結果的低32位同目的寄存器Low中的值相加後又放置到目的寄存器Low中,
結果的高32位同目的寄存器High中的值相加後又放置到目的寄存器High中,
同時能夠根據運算結果設置CPSR中相應的條件標誌位。其中,操做數1和操做數2均爲32位的無符號數。
對於目的寄存器Low,在指令執行前存放64位加數的低32位,指令執行後存放結果的低32位;
對於目的寄存器High,在指令執行前存放64位加數的高32位,指令執行後存放結果的高32位。
指令示例:
4、程序狀態寄存器訪問指令
一、MRS指令
MRS指令的格式爲:
MRS{條件} 通用寄存器 程序狀態寄存器(CPSR或SPSR)
MRS指令用於將程序狀態寄存器的內容傳送到通用寄存器中。該指令通常用在如下兩種狀況:
Ⅰ.當須要改變程序狀態寄存器的內容時,可用MRS將程序狀態寄存器的內容讀入通用寄存器,修改後再寫回程序狀態寄存器。
Ⅱ.當在異常處理或進程切換時,須要保存程序狀態寄存器的值,可先用該指令讀出程序狀態寄存器的值,而後保存
指令示例:
二、MSR指令
MSR指令的格式爲:
MSR{條件} 程序狀態寄存器(CPSR或SPSR)_<域>,操做數
MSR指令用於將操做數的內容傳送到程序狀態寄存器的特定域中。其中,操做數能夠爲通用寄存器或當即數。
<域>用於設置程序狀態寄存器中須要操做的位,32位的程序狀態寄存器可分爲4個域:
位[31:24]爲條件位域,用f表示;
位[23:16]爲狀態位域,用s表示;
位[15:8] 爲擴展位域,用x表示;
位[7:0] 爲控制位域,用c表示;
該指令一般用於恢復或改變程序狀態寄存器的內容,在使用時,通常要在MSR指令中指明將要操做的域。
指令示例:
5、加載/存儲指令
ARM微處理器支持加載/存儲指令用於在寄存器和存儲器之間傳送數據,
加載指令用於將存儲器中的數據傳送到寄存器,存儲 指令則完成相反的操做。經常使用的加載存儲指令以下:
一、LDR指令
LDR指令的格式爲:
LDR{條件} 目的寄存器,<存儲器地址>
LDR指令用於從存儲器中將一個32位的字數據傳送到目的寄存器中。該指令一般用於從存儲器中讀取32位的字數據到通用寄存器
而後對數據進行處理。當程序計數器PC做爲 目的寄存器時,指令從存儲器中讀取的字數據被看成目的地址,
從而能夠實現程序流程的跳轉。該指令在程序設計 中比較經常使用,且尋址方式靈活多樣,請讀者認真掌握。
指令示例:
二、LDRB指令
LDRB指令的格式爲:
LDR{條件}B 目的寄存器,<存儲器地址>
LDRB指令用於從存儲器中將一個8位的字節數據傳送到目的寄存器中,同時將寄存器的高24位清零。
該指令一般用於從存儲器中讀取8位的字節數據到通用寄存器,而後對數據進行處理。當程序計數器PC做爲目的寄存器時,
指令從存儲器中讀取的字數據被看成目的地址,從而能夠實現程序流程的跳轉
指令示例:
三、LDRH指令
LDRH指令的格式爲:
LDR{條件}H 目的寄存器,<存儲器地址>
LDRH指令用於從存儲器中將一個16位的半字數據傳送到目的寄存器中,同時將寄存器的高16位清零。
該指令一般用於從存儲器中讀取16位的半字數據到通用寄存器,而後對數據進行處理。
當程序計數器PC做爲目的寄存器時,指令從存儲器中讀取的字數據被看成目的地址,從而能夠實現程序流程的跳轉。
指令示例:
四、STR指令
STR指令的格式爲:
STR{條件} 源寄存器,<存儲器地址>
STR指令用於從源寄存器中將一個32位的字數據傳送到存儲器中。 該指令在程序設計中比較經常使用,
且尋址方式靈活多樣,使用方式可參考指令LDR。
指令示例:
五、STRB指令
STRB指令的格式爲:
STR{條件}B 源寄存器,<存儲器地址>
STRB指令用於從源寄存器中將一個8位的字節數據傳送到存儲器中。該字節數據爲源寄存器中的低8位
指令示例:
六、STRH指令
STRH指令的格式爲:
STR{條件}H 源寄存器,<存儲器地址>
STRH指令用於從源寄存器中將一個16位的半字數據傳送到存儲器中。該半字數據爲源寄存器中的低16位。
指令示例:
6、批量數據加載/存儲指令
ARM微處理器所支持批量數據加載/存儲指令能夠一次在一片連續的存儲器單元和多個寄存器之間傳送數據
批量加載指令用於將一片連續的存儲器中的數據傳送到多個寄存器,批量數據存儲指令則完成相反的操做。
經常使用的加載存儲指令以下:
LDM(或STM)指令
LDM(或STM){條件}{類型} 基址寄存器{!},寄存器列表{∧}
LDM(或STM)指令用於從由基址寄存器所指示的一片連續存儲器到寄存器列表所指示的多個寄存器之間傳送數據,
該指令的常見用途是將多個寄存器的內容入棧或出棧。
其中,{類型}爲 如下幾種狀況:
IA 每次傳送後地址加1;
IB 每次傳送前地址加1;
DA 每次傳送後地址減1;
DB 每次傳送前地址減1;
FD 滿遞減堆棧;
ED 空遞減堆棧;
FA 滿遞增堆棧;
EA 空遞增堆棧;
{!}爲可選後綴,若選用該後綴,則當數據 傳送完畢以後,將最後的地址寫入基址寄存器,
不然基址寄存器的內容不改變。基址寄存器不容許爲R15,寄存器列表能夠爲R0~R15的任意組合。
{∧}爲可選後綴,當指令爲LDM且寄存器列表中包含R15,選用該後綴時表示:除了正常的數據傳送以外,
還將SPSR複製到CPSR。同時,該後綴還表 示傳入或傳出的是用戶模式下的寄存器,而不是當前模式下的寄存器。
指令示例:
7、數據交換指令
一、SWP指令
SWP指令的格式爲:
SWP{條件} 目的寄存器,源寄存器1,[源寄存器2]
SWP指令用於將源寄存器2所指向的存儲器中的字數據傳送到目的寄存器中,同時將源寄存器1中的字數據傳送到源寄存器2所指向的存儲器中。
顯然,當源寄存 器1和目的寄存器爲同一個寄存器時,指令交換該寄存器和存儲器的內容
指令示例:
二、SWPB指令
SWPB指令的格式爲:
SWP{條件}B 目的寄存器,源寄存器1,[源寄存器2]
SWPB指令用於將源寄存器2所指向的存儲器中的字節數據傳送到目的寄存器中,目的寄存器的高24清零,
同時將源寄存 器1中的字節數據傳送到源寄存器2所指向的存儲器中。顯然,當源寄存器1和目的寄存器爲同一個寄存器時,
指令交換該寄存器和存儲器的內容。
指令示例:
8、移位指令
一、LSL(或ASL)
LSL(或ASL)的格式爲:
通用寄存器,LSL(或ASL) 操做數
LSL(或ASL)可完成對通用寄存器中的內容進行邏輯(或算術)的左移操做,按操做數所指定的數量向左移位,低位用零來填充。
其中,操做數能夠是通用寄存器,也能夠是當即數(0~31)
操做示例:
二、LSR
LSR的格式爲:
通用寄存器,LSR 操做數
LSR可完成對通用寄存器中的內容進行右移的操做,按操做數所指定的數量向右移位,左端用零來填充。
其中,操做數能夠 是通用寄存器,也能夠是當即數(0~31)
操做示例:
三、ASR
ASR的格式爲:
通用寄存器,ASR 操做數
ASR可完成對通用寄存器中的內容進行右移的操做,按操做數所指定的數量向右移位,左端用第31位的值來填充。
其中,操做數能夠是通用寄存器,也能夠是立 即數(0~31)。
操做示例:
四、ROR
ROR的格式爲:
通用寄存器,ROR 操做數
ROR可完成對通用寄存器中的內容進行循環右移的操做,按操做數所指定的數量向右循環移位,左端用右端移出的位來填充。
其中,操做數能夠是通用寄存器,也能夠是當即數(0~31)。顯然,當進行32位的循環右移操做時,通用寄存器中的值不改變。
操做示例:
五、RRX
RRX的格式爲:
通用寄存器,RRX 操做數
RRX可完成對通用寄存器中的內容進行帶擴展的循環右移的操做,按操做數所指定的數量向右循環移位,左端用進位標誌位C來填充。
其中,操做數能夠是通用寄 存器,也能夠是當即數(0~31)。
操做示例:
9、協處理器指令
一、CDP指令
CDP指令的格式爲:
CDP{條件} 協處理器編碼,協處理器操做碼1,目的寄存器,源寄存器1,源寄存器2,協處理器操做碼2。
CDP指令用於ARM處理器通知ARM協處理器執行特定的操做,若協處理器不能成功完成特定的操做,
則產生未定義指令異常。其中協處理器操做碼1和協處理 器操做碼2爲協處理器將要執行的操做,
目的寄存器和源寄存器均爲協處理器的寄存器,指令不涉及ARM處理器的寄存器和存儲器。
指令示例:
二、LDC指令
LDC指令的格式爲:
LDC{條件}{L} 協處理器編碼,目的寄存器,[源寄存器]
LDC指令用於將源寄存器所指向的存儲器中的字數據傳送到目的寄存器中,若協處理器不能成功完成傳送操做,
則產生未定義指令異常。其中,{L}選項表示指 令爲長讀取操做,如用於雙精度數據的傳輸
指令示例:
三、STC指令
STC指令的格式爲:
STC{條件}{L} 協處理器編碼,源寄存器,[目的寄存器]
STC指令用於將源寄存器中的字數據傳送到目的寄存器所指向的存儲器中,若協處理器不能成功完成傳送操做,則產生未定義指令異常。
其中,{L}選項表示指 令爲長讀取操做,如用於雙精度數據的傳輸
指令示例:
四、MCR指令
MCR指令的格式爲:
MCR{條件} 協處理器編碼,協處理器操做碼1,源寄存器,目的寄存器1,目的寄存器2,協處理器操做碼2。
MCR指令用於將ARM處理器寄存器中的數據傳送到協處理器寄存器中,若協處理器不能成功完成操做,
則產生未定義指令異常。其中協處理器操做碼1和協處理 器操做碼2爲協處理器將要執行的操做,
源寄存器爲ARM處理器的寄存器,目的寄存器1和目的寄存器2均爲協處理器的寄 存器。
指令示例:
五、MRC指令
MRC指令的格式爲:
MRC{條件} 協處理器編碼,協處理器操做碼1,目的寄存器,源寄存器1,源寄存器2,協處理器操做碼2
MRC指令用於將協處理器寄存器中的數據傳送到ARM處理器寄存器中,若協處理器不能成功完成操做,
則產生未定義指令異常。其中協處理器操做碼1和協處理 器操做碼2爲協處理器將要執行的操做,
目的寄存器爲ARM處理器的寄存器,源寄存器1和源寄存器2均爲協處理器的寄存器。
指令示例:
10、異常產生指令
一、SWI指令
SWI指令的格式爲:
SWI{條件} 24位的當即數
SWI指令用於產生軟件中斷,以便用戶程序能調用操做系統的系統例程。操做系統在SWI的異常處理程序中提供相應的系統服務,
指令中24位的當即數指定用 戶程序調用系統例程的類型,相關參數經過通用寄存器傳遞,當指令中24位的當即數被忽略時,
用戶程序調用系統例程的類型由通用寄存器R0的內容決定,同 時,參數經過其餘通用寄存器傳遞
指令示例:
二、BKPT指令
BKPT指令的格式爲:
BKPT 16位的當即數
BKPT指令產生軟件斷點中斷,可用於程序的調試