ARM應用系統開發詳解 --第3章 ARM微處理器的指令系統

ARM 198瀏覽
 

本章介ARM指令集、Thumb指令集,以及各指令對應址方式,通過對本章的閱讀,希望者能了解ARM理器所支持的指令集及具體的使用方法。
本章的主要內容有:
ARM指令集、Thumb指令集概述。
ARM指令集的分與具體用。
Thumb指令集介及合。
3.1 ARM理器的指令集概述
3.1.1 ARM理器的指令的分與格式
ARM理器的指令集是加/型的,即指令集理寄存器中的數據,而且果都要放回寄存器中,而器的訪問則需要通過專門的加/指令來完成。
ARM理器的指令集可以分指令、數據理指令、程序狀寄存器(PSR理指令、加/指令、協處理器指令和異常生指令六大,具體的指令及功能如表3-1所示(表中指令基本ARM指令,不包括派生的ARM指令)。
3-1 ARM指令及功能描述
助記符
指令功能描述
ADC
帶進位加法指令
ADD
加法指令
AND
邏輯與指令
B
跳轉指令
BIC
位清零指令
BL
帶返回的跳轉指令
BLX
帶返回和狀態切換的跳轉指令
BX
帶狀態切換的跳轉指令
CDP
協處理器數據操作指令
CMN
比較反值指令
CMP
比較指令
EOR
異或指令
LDC
存儲器到協處理器的數據傳輸指令
LDM
加載多個寄存器指令
LDR
存儲器到寄存器的數據傳輸指令
MCR
ARM寄存器到協處理器寄存器的數據傳輸指令
MLA
乘加運算指令
MOV
數據傳送指令
MRC
從協處理器寄存器到ARM寄存器的數據傳輸指令
MRS
傳送CPSRSPSR的內容到通用寄存器指令
MSR
傳送通用寄存器到CPSRSPSR的指令
MUL
32位乘法指令
MLA
32位乘加指令
MVN
數據取反傳送指令
ORR
邏輯或指令
RSB
逆向減法指令
RSC
帶借位的逆向減法指令
SBC
帶借位減法指令
STC
協處理器寄存器寫入存儲器指令
STM
批量內存字寫入指令
STR
寄存器到存儲器的數據傳輸指令
SUB
減法指令
SWI
軟件中斷指令
SWP
交換指令
TEQ
相等測試指令
TST
位測試指令

3.1.2指令的條件域
理器工作在ARM態時,幾乎所有的指令均根據CPSR中條件的狀和指令的條件域有條件的。當指令的行條件滿,指令被行,否指令被忽略。
一條ARM指令包含4位的條件,位于指令的最高4[31:28]。條件共有16每種條件可用兩個字符表示,兩個字符可以添加在指令助符的后面和指令同使用。示例,跳指令B可以加上后EQ變為BEQ表示相等,即當CPSR中的Z志置位時發生跳
16條件中,只有15可以使用,如表3-2所示,第161111保留,暫時不能使用。
3-2 指令的條件
條件碼
助記符后綴
0000
EQ
Z置位
相等
0001
NE
Z清零
不相等
0010
CS
C置位
無符號數大于或等于
0011
CC
C清零
無符號數小于
0100
MI
N置位
負數
0101
PL
N清零
正數或零
0110
VS
V置位
溢出
0111
VC
V清零
未溢出
1000
HI
C置位Z清零
無符號數大于
1001
LS
C清零Z置位
無符號數小于或等于
1010
GE
N等于V
帶符號數大于或等于
1011
LT
N不等于V
帶符號數小于
1100
GT
Z清零且(N等于V
帶符號數大于
1101
LE
Z置位或(N不等于V
帶符號數小于或等于
1110
AL
忽略
無條件執行

3.2 ARM指令的址方式
謂尋址方式就是理器根據指令中出的地址信息來找物理地址的方式。目前ARM指令系支持如下幾址方式。
3.2.1立即
立即址也叫立即數址,是一特殊的址方式,操作數本身就在指令中出,只要取出指令也就取到了操作數。個操作數被稱立即數,對應址方式也就叫做立即址。示例以下指令:
ADD R0R0,#1 R0←R01
ADD R0R0,#0x3f R0←R00x3f
在以上兩條指令中,第二個源操作數即立即數,要求以于以十六制表示的立即數,要求在后加上“0x”“&”
3.2.2寄存器
寄存器址就是利用寄存器中的數操作數,這種尋址方式是各理器常采用的一方式,也是一種執行效率高的址方式。以下指令:
ADD R0R1R2 R0←R1R2
指令的行效果是將寄存器R1R2的內容相加,其果存放在寄存器R0中。
3.2.2寄存器
寄存器址就是以寄存器中的操作數的地址,而操作數本身存放在存器中。示例以下指令:
ADD R0R1[R2] R0←R1[R2]
LDR R0[R1] R0←[R1]
STR R0[R1] [R1]←R0
在第一條指令中,以寄存器R2操作數的地址,在存器中取得一個操作數后與R1相加,果存入寄存器R0中。
第二條指令將以R1值為地址的存器中的數據送到R0中。
第三條指令將R0值傳送到以R1值為地址的存器中。
3.2.3基址
基址址就是將寄存器(寄存器一般稱作基址寄存器)的內容與指令中出的地址偏移量相加,從而得到一個操作數的有效地址。址方式常用于訪問某基地址附近的地址元。采用址方式的指令常有以下幾形式,如下所示:
LDR R0[R1,#4] R0←[R14]
LDR R0[R1,#4]R0←[R14]R1←R14
LDR R0[R1] ,#4 R0←[R1]R1←R14
LDR R0[R1R2] R0←[R1R2]
在第一條指令中,將寄存器R1的內容加上4形成操作數的有效地址,從而取得操作數存入寄存器R0中。
在第二條指令中,將寄存器R1的內容加上4形成操作數的有效地址,從而取得操作數存入寄存器R0中,然后,R1的內容自增4個字
在第三條指令中,以寄存器R1的內容作操作數的有效地址,從而取得操作數存入寄存器R0中,然后,R1的內容自增4個字
在第四條指令中,將寄存器R1的內容加上寄存器R2的內容形成操作數的有效地址,從而取得操作數存入寄存器R0中。
3.2.4多寄存器
采用多寄存器址方式,一條指令可以完成多個寄存器送。這種尋址方式可以用一條指令完成送最多16個通用寄存器的。以下指令:
LDMIA R0{R1R2R3R4} R1←[R0]
R2←[R04]
R3←[R08]
R4←[R012]
指令的后IA表示在行完加/操作后,R0按字度增加,因此,指令可將連續儲單元的值傳送到R1R4
3.2.5對尋
與基址址方式相似,相對尋址以程序數器PC的當前值為基地址,指令中的地址號作偏移量,將兩者相加之后得到操作數的有效地址。以下程序段完成子程序的調用和返回,跳指令BL采用了相對尋址方式:
BL NEXT ;跳到子程序NEXT處執
……
NEXT
……
MOV PCLR ;從子程序返回
3.2.6棧尋
是一數據構,按先后出(First In Last OutFILO)的方式工作,使用一個稱作堆用寄存器指示當前的操作位置,堆針總是指向棧頂
當堆指向最后入堆的數據,稱為滿Full Stack),而當堆指向下一個將要放入數據的空位置,稱空堆Empty Stack)。
,根據堆的生成方式,又可以分為遞增堆Ascending Stack)和減堆Decending Stack),當堆由低地址向高地址生成,稱為遞增堆,當堆由高地址向低地址生成,稱為遞減堆這樣就有四種類型的堆工作方式,ARM理器支持種類型的堆工作方式,即:
滿遞增堆:堆指向最后入的數據,且由低地址向高地址生成。
滿遞減堆:堆指向最后入的數據,且由高地址向低地址生成。
增堆:堆指向下一個將要放入數據的空位置,且由低地址向高地址生成。
減堆:堆指向下一個將要放入數據的空位置,且由高地址向低地址生成。
3.3 ARM指令集
節對ARM指令集的六大指令詳細的描述。
3.3.1指令
指令用于實現程序流程的跳,在ARM程序中有兩方法可以實現程序流程的跳
使用專門的跳指令。
直接向程序數器PC寫入跳地址
向程序數器PC寫入跳地址,可以實現4GB的地址空中的任意跳,在跳之前合使用
MOV LRPC
似指令,可以保存將來的返回地址,從而實現4GB連續性地址空的子程序調用。
ARM指令集中的跳指令可以完成從當前指令向前或向后的32MB的地址空的跳,包括以下4條指令:
— B 指令
— BL 返回的跳指令
— BLX 返回和狀的跳指令
— BX 的跳指令
1 B指令
B指令的格式
B{條件} 地址
B指令是最簡單的跳指令。一旦遇到一個 B 指令,ARM 理器將立即跳定的目地址,從那里繼續執行。注意存在跳指令中的實際值是相當前PC的一個偏移量,而不是一個絕對地址,它的匯編器來算(參考址方式中的對尋址)。它是 24 位有符號數,左移兩位后有符號 32 位,表示的有效偏移 26 (前后32MB的地址空)。以下指令:
B Label ;程序無條件跳Label處執
CMP R1,#0 ;當CPSR寄存器中的Z條件置位,程序跳Label處執
BEQ Label
2 BL指令
BL指令的格式
BL{條件} 地址
BL 是另一個跳指令,但跳之前,會在寄存器R14中保存PC的當前內容,因此,可以通R14 的內容重新加PC中,來返回到跳指令之后的那個指令處執行。指令是實現子程序調用的一個基本但常用的手段。以下指令:
BL Label ;當程序無條件跳Label處執,同將當前的PC保存到R14
3 BLX指令
BLX指令的格式
BLX 地址
BLX指令從ARM指令集跳到指令中所指定的目地址,并將理器的工作狀ARMThumb指令同PC的當前內容保存到寄存器R14中。因此,當子程序使用Thumb指令集,而調用者使用ARM指令集,可以通BLX指令實現子程序的調用和理器工作狀的切。同,子程序的返回可以通將寄存器R14值復制到PC中來完成。
4 BX指令
BX指令的格式
BX{條件} 地址
BX指令跳到指令中所指定的目地址,目地址的指令既可以是ARM指令,也可以是Thumb指令。

3.3.2數據理指令
數據理指令可分數據送指令、算術邏輯運算指令和比指令等。
數據送指令用于在寄存器和存器之間進行數據的雙向傳輸
術邏輯運算指令完成常用的算邏輯的運算,該類指令不但將運算果保存在目的寄存器中,同更新CPSR中的相條件志位。
指令不保存運算果,只更新CPSR中相的條件志位。
數據理指令包括:
— MOV 數據送指令
— MVN 數據取反送指令
— CMP 指令
— CMN 指令
— TST 測試指令
— TEQ 相等測試指令
— ADD 加法指令
— ADC 帶進位加法指令
— SUB 減法指令
— SBC 借位減法指令
— RSB 逆向減法指令
— RSC 借位的逆向減法指令
— AND 邏輯與指令
— ORR 邏輯或指令
— EOR 邏輯異或指令
— BIC 位清除指令
1 MOV指令
MOV指令的格式
MOV{條件}{S} 目的寄存器,源操作數
MOV指令可完成從另一個寄存器、被移位的寄存器或將一個立即數加到目的寄存器。其中S選項決定指令的操作是否影響CPSR中條件志位的,當沒有S指令不更新CPSR中條件志位的
指令示例:
MOV R1R0 ;將寄存器R0值傳送到寄存器R1
MOV PCR14 ;將寄存器R14值傳送到PC,常用于子程序返回
MOV R1R0LSL3 ;將寄存器R0左移3位后送到R1
2 MVN指令
MVN指令的格式
MVN{條件}{S} 目的寄存器,源操作數
MVN指令可完成從另一個寄存器、被移位的寄存器、或將一個立即數加到目的寄存器。與MOV指令不同之是在送之前按位被取反了,即把一個被取反的值傳送到目的寄存器中。其中S決定指令的操作是否影響CPSR中條件志位的,當沒有S指令不更新CPSR中條件志位的
指令示例:
MVN R0,#0 ;將立即數0取反送到寄存器R0中,完成后R0=-1
3 CMP指令
CMP指令的格式
CMP{條件} 操作數1,操作數2
CMP指令用于把一個寄存器的內容和另一個寄存器的內容或立即數行比,同更新CPSR中條件志位的指令行一次減法運算,但不存儲結果,只更改條件志位。志位表示的是操作數1與操作數2(大、小、相等),示例,當操作數1大于操作操作數2此后的有GT 的指令將可以行。
指令示例:
CMP R1R0 ;將寄存器R1與寄存器R0相減,并根據CPSR志位
CMP R1,#100 ;將寄存器R1與立即數100相減,并根據CPSR志位
4 CMN指令
CMN指令的格式
CMN{條件} 操作數1,操作數2
CMN指令用于把一個寄存器的內容和另一個寄存器的內容或立即數取反后行比,同更新CPSR中條件志位的指令實際完成操作數1和操作數2相加,并根據果更改條件志位。
指令示例:
CMN R1R0 ;將寄存器R1與寄存器R0相加,并根據CPSR志位
CMN R1,#100 ;將寄存器R1與立即數100相加,并根據CPSR志位
5 TST指令
TST指令的格式
TST{條件} 操作數1,操作數2
TST指令用于把一個寄存器的內容和另一個寄存器的內容或立即數行按位的與運算,并根據運算果更新CPSR中條件志位的。操作數1是要測試的數據,而操作數2是一個位掩指令一般用來檢測是否置了特定的位。
指令示例:
TST R1,#%1 ;用于測試在寄存器R1中是否置了最低位(%表示二制數)
TST R1,#0xffe ;將寄存器R1與立即數0xffe按位與,并根據CPSR志位
6 TEQ指令
TEQ指令的格式
TEQ{條件} 操作數1,操作數2
TEQ指令用于把一個寄存器的內容和另一個寄存器的內容或立即數行按位的異或運算,并根據運算果更新CPSR中條件志位的指令通常用于比操作數1和操作數2是否相等。
指令示例:
TEQ R1R2 ;將寄存器R1與寄存器R2按位異或,并根據CPSR志位
7 ADD指令
ADD指令的格式
ADD{條件}{S} 目的寄存器,操作數1,操作數2
ADD指令用于把兩個操作數相加,并將果存放到目的寄存器中。操作數1是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。
指令示例:
ADD R0R1R2 R0 = R1 + R2
ADD R0R1#256 R0 = R1 + 256
ADD R0R2R3LSL#1 R0 = R2 + (R3 << 1)
8 ADC指令
ADC指令的格式
ADC{條件}{S} 目的寄存器,操作數1,操作數2
ADC指令用于把兩個操作數相加,再加上CPSR中的C條件志位的,并將果存放到目的寄存器中。它使用一個志位,這樣就可以做比32位大的數的加法,注意不要忘記設S來更改志。操作數1是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。
以下指令序列完成兩個128位數的加法,第一個數由高到低存放在寄存器R7R4,第二個數由高到低存放在寄存器R11R8,運算果由高到低存放在寄存器R3R0
ADDS R0R4R8 加低端的字
ADCS R1R5R9 加第二個字,帶進
ADCS R2R6R10 加第三個字,帶進
ADC R3R7R11 加第四個字,帶進
9 SUB指令
SUB指令的格式
SUB{條件}{S} 目的寄存器,操作數1,操作數2
SUB指令用于把操作數1減去操作數2,并將果存放到目的寄存器中。操作數1是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。指令可用于有符號數或無符號數的減法運算。
指令示例:
SUB R0R1R2 R0 = R1 - R2
SUB R0R1#256 R0 = R1 - 256
SUB R0R2R3LSL#1 R0 = R2 - (R3 << 1)
10SBC指令
SBC指令的格式
SBC{條件}{S} 目的寄存器,操作數1,操作數2
SBC指令用于把操作數1減去操作數2,再減去CPSR中的C條件志位的反,并將果存放到目的寄存器中。操作數1是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。指令使用志來表示借位,這樣就可以做大于32位的減法,注意不要忘記設S來更改志。指令可用于有符號數或無符號數的減法運算。
指令示例:
SUBS R0R1R2 R0 = R1 - R2 - C,并根據CPSR志位
11RSB指令
RSB指令的格式
RSB{條件}{S} 目的寄存器,操作數1,操作數2
RSB指令稱逆向減法指令,用于把操作數2減去操作數1,并將果存放到目的寄存器中。操作數1是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。指令可用于有符號數或無符號數的減法運算。
指令示例:
RSB R0R1R2 R0 = R2 – R1
RSB R0R1#256 R0 = 256 – R1
RSB R0R2R3LSL#1 R0 = (R3 << 1) - R2
12RSC指令
RSC指令的格式
RSC{條件}{S} 目的寄存器,操作數1,操作數2
RSC指令用于把操作數2減去操作數1,再減去CPSR中的C條件志位的反,并將果存放到目的寄存器中。操作數1是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。指令使用志來表示借位,這樣就可以做大于32位的減法,注意不要忘記設S來更改志。指令可用于有符號數或無符號數的減法運算。
指令示例:
RSC R0R1R2 R0 = R2 – R1 - C
13AND指令
AND指令的格式
AND{條件}{S} 目的寄存器,操作數1,操作數2
AND指令用于在兩個操作數上邏輯與運算,并把果放置到目的寄存器中。操作數1是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。指令常用于屏蔽操作數1的某些位。
指令示例:
AND R0R0,#3 指令保持R001位,其余位清零。
14ORR指令
ORR指令的格式
ORR{條件}{S} 目的寄存器,操作數1,操作數2
ORR指令用于在兩個操作數上邏輯或運算,并把果放置到目的寄存器中。操作數1是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。指令常用置操作數1的某些位。
指令示例:
ORR R0R0,#3 指令R001位,其余位保持不
15EOR指令
EOR指令的格式
EOR{條件}{S} 目的寄存器,操作數1,操作數2
EOR指令用于在兩個操作數上邏輯異或運算,并把果放置到目的寄存器中。操作數1是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。指令常用于反操作數1的某些位。
指令示例:
EOR R0R0,#3 指令反R001位,其余位保持不
16BIC指令
BIC指令的格式
BIC{條件}{S} 目的寄存器,操作數1,操作數2
BIC指令用于清除操作數1的某些位,并把果放置到目的寄存器中。操作數1是一個寄存器,操作數2可以是一個寄存器,被移位的寄存器,或一個立即數。操作數232位的掩,如果在掩置了某一位,清除一位。未置的掩位保持不
指令示例:
BIC R0R0,#%1011 指令清除 R0 中的位 01、和 3,其余的位保持不

3.3.3乘法指令與乘加指令
ARM理器支持的乘法指令與乘加指令共有6條,可分運算32位和運算64位兩,與前面的數據理指令不同,指令中的所有操作數、目的寄存器必須為通用寄存器,不能操作數使用立即數或被移位的寄存器,同,目的寄存器和操作數1是不同的寄存器。
乘法指令與乘加指令共有以下6條:
— MUL 32位乘法指令
— MLA 32位乘加指令
— SMULL 64位有符號數乘法指令
— SMLAL 64位有符號數乘加指令
— UMULL 64位無符號數乘法指令
— UMLAL 64位無符號數乘加指令
1 MUL指令
MUL指令的格式
MUL{條件}{S} 目的寄存器,操作數1,操作數2
MUL指令完成將操作數1與操作數2的乘法運算,并把果放置到目的寄存器中,同可以根據運算CPSR中相的條件志位。其中,操作數1和操作數232位的有符號數或無符號數。
指令示例:
MUL R0R1R2 R0 = R1 × R2
MULS R0R1R2 R0 = R1 × R2,同時設CPSR中的相條件志位
2 MLA指令
MLA指令的格式
MLA{條件}{S} 目的寄存器,操作數1,操作數2,操作數3
MLA指令完成將操作數1與操作數2的乘法運算,再將乘加上操作數3,并把果放置到目的寄存器中,同可以根據運算CPSR中相的條件志位。其中,操作數1和操作數232位的有符號數或無符號數。
指令示例:
MLA R0R1R2R3 R0 = R1 × R2 + R3
MLAS R0R1R2R3 R0 = R1 × R2 + R3,同時設CPSR中的相條件志位
3 SMULL指令
SMULL指令的格式
SMULL{條件}{S} 目的寄存器Low,目的寄存器低High,操作數1,操作數2
SMULL指令完成將操作數1與操作數2的乘法運算,并把果的低32位放置到目的寄存器Low中,果的高32位放置到目的寄存器High中,同可以根據運算CPSR中相的條件志位。其中,操作數1和操作數232位的有符號數。
指令示例:
SMULL R0R1R2R3 R0 = R2 × R3)的低32
R1 = R2 × R3)的高32
4 SMLAL指令
SMLAL指令的格式
SMLAL{條件}{S} 目的寄存器Low,目的寄存器低High,操作數1,操作數2
SMLAL指令完成將操作數1與操作數2的乘法運算,并把果的低32位同目的寄存器Low中的相加后又放置到目的寄存器Low中,果的高32位同目的寄存器High中的相加后又放置到目的寄存器High中,同可以根據運算CPSR中相的條件志位。其中,操作數1和操作數232位的有符號數。
于目的寄存器Low,在指令行前存放64位加數的低32位,指令行后存放果的低32位。
于目的寄存器High,在指令行前存放64位加數的高32位,指令行后存放果的高32位。
指令示例:
SMLAL R0R1R2R3 R0 = R2 × R3)的低32 R0
R1 = R2 × R3)的高32 R1
5 UMULL指令
UMULL指令的格式
UMULL{條件}{S} 目的寄存器Low,目的寄存器低High,操作數1,操作數2
UMULL指令完成將操作數1與操作數2的乘法運算,并把果的低32位放置到目的寄存器Low中,果的高32位放置到目的寄存器High中,同可以根據運算CPSR中相的條件志位。其中,操作數1和操作數232位的無符號數。
指令示例:
UMULL R0R1R2R3 R0 = R2 × R3)的低32
R1 = R2 × R3)的高32
6 UMLAL指令
UMLAL指令的格式
UMLAL{條件}{S} 目的寄存器Low,目的寄存器低High,操作數1,操作數2
UMLAL指令完成將操作數1與操作數2的乘法運算,并把果的低32位同目的寄存器Low中的相加后又放置到目的寄存器Low中,果的高32位同目的寄存器High中的相加后又放置到目的寄存器High中,同可以根據運算CPSR中相的條件志位。其中,操作數1和操作數232位的無符號數。
于目的寄存器Low,在指令行前存放64位加數的低32位,指令行后存放果的低32位。
于目的寄存器High,在指令行前存放64位加數的高32位,指令行后存放果的高32位。
指令示例:
UMLAL R0R1R2R3 R0 = R2 × R3)的低32 R0
R1 = R2 × R3)的高32 R1
3.3.4
程序狀寄存器訪問指令
ARM理器支持程序狀寄存器訪問指令,用于在程序狀寄存器和通用寄存器之間傳送數據,程序狀寄存器訪問指令包括以下兩條:
— MRS 程序狀寄存器到通用寄存器的數據送指令
— MSR 通用寄存器到程序狀寄存器的數據送指令
1 MRS指令
MRS指令的格式
MRS{條件} 通用寄存器,程序狀寄存器(CPSRSPSR
MRS指令用于將程序狀寄存器的內容送到通用寄存器中。指令一般用在以下幾情況:
當需要改程序狀寄存器的內容,可用MRS將程序狀寄存器的內容入通用寄存器,修改后再寫回程序狀寄存器。
當在異常理或程切換時,需要保存程序狀寄存器的,可先用指令出程序狀寄存器的,然后保存。
指令示例:
MRS R0CPSR CPSR的內容到R0
MRS R0SPSR SPSR的內容到R0
2 MSR指令
MSR指令的格式
MSR{條件} 程序狀寄存器(CPSRSPSR_<>,操作數
MSR指令用于將操作數的內容送到程序狀寄存器的特定域中。其中,操作數可以通用寄存器或立即數。<>用于置程序狀寄存器中需要操作的位,32位的程序狀寄存器可分4個域:
[3124]條件志位域,用f表示;
[2316]位域,用s表示;
[158]為擴展位域,用x表示;
[70]控制位域,用c表示;
指令通常用于恢或改程序狀寄存器的內容,在使用,一般要在MSR指令中指明將要操作的域。
指令示例:
MSR CPSRR0 R0的內容到CPSR
MSR SPSRR0 R0的內容到SPSR
MSR CPSR_cR0 R0的內容到SPSR,但僅僅修改CPSR中的控制位域

3.3.5/指令
ARM理器支持加/指令用于在寄存器和存器之間傳送數據,加指令用于將存器中的數據送到寄存器,存指令完成相反的操作。常用的加指令如下:
— LDR 字數據加指令
— LDRB 數據加指令
— LDRH 半字數據加指令
— STR 字數據存指令
— STRB 數據存指令
— STRH 半字數據存指令
1LDR指令
LDR指令的格式
LDR{條件} 目的寄存器,<器地址>
LDR指令用于從存器中將一個32位的字數據送到目的寄存器中。指令通常用于從存器中32位的字數據到通用寄存器,然后數據理。當程序數器PC目的寄存器,指令從存器中取的字數據被當作目的地址,從而可以實現程序流程的跳指令在程序設計中比常用,且址方式靈活多請讀真掌握。
指令示例:
LDR R0[R1] ;將存器地址R1的字數據入寄存器R0
LDR R0[R1R2] ;將存器地址R1+R2的字數據入寄存器R0
LDR R0[R1,#8] ;將存器地址R1+8的字數據入寄存器R0
LDR R0[R1R2] ;將存器地址R1+R2的字數據入寄存器R0,并將新地址R1R2寫入R1
LDR R0[R1,#8] ;將存器地址R1+8的字數據入寄存器R0,并將新地址R18寫入R1
LDR R0[R1]R2 ;將存器地址R1的字數據入寄存器R0,并將新地址R1R2寫入R1
LDR R0[R1R2LSL2];將存器地址R1R2×4的字數據入寄存器R0,并將新地址R1R2×4寫入R1
LDR R0[R1]R2LSL2 ;將存器地址R1的字數據入寄存器R0,并將新地址R1R2×4寫入R1
2LDRB指令
LDRB指令的格式
LDR{條件}B 目的寄存器,<器地址>
LDRB指令用于從存器中將一個8位的字數據送到目的寄存器中,同將寄存器的高24位清零。指令通常用于從存器中8位的字數據到通用寄存器,然后數據理。當程序數器PC目的寄存器,指令從存器中取的字數據被當作目的地址,從而可以實現程序流程的跳
指令示例:
LDRB R0[R1] ;將存器地址R1的字數據入寄存器R0,并將R0的高24位清零。
LDRB R0[R1,#8] ;將存器地址R18的字數據入寄存器R0,并將R0的高24位清零。
3LDRH指令
LDRH指令的格式
LDR{條件}H 目的寄存器,<器地址>
LDRH指令用于從存器中將一個16位的半字數據送到目的寄存器中,同將寄存器的高16位清零。指令通常用于從存器中16位的半字數據到通用寄存器,然后數據理。當程序數器PC目的寄存器,指令從存器中取的字數據被當作目的地址,從而可以實現程序流程的跳
指令示例:
LDRH R0[R1] ;將存器地址R1的半字數據入寄存器R0,并將R0的高16位清零。
LDRH R0[R1,#8] ;將存器地址R18的半字數據入寄存器R0,并將R0的高16位清零。
LDRH R0[R1R2] ;將存器地址R1R2的半字數據入寄存器R0,并將R0的高16位清零。
4STR指令
STR指令的格式
STR{條件} 源寄存器,<器地址>
STR指令用于從源寄存器中將一個32位的字數據送到存器中。指令在程序設計中比常用,且址方式靈活多,使用方式可參考指令LDR
指令示例:
STR R0[R1],#8 ;將R0中的字數據寫入以R1地址的存器中,并將新地址R18寫入R1
STR R0[R1,#8] ;將R0中的字數據寫入以R18地址的存器中。
5STRB指令
STRB指令的格式
STR{條件}B 源寄存器,<器地址>
STRB指令用于從源寄存器中將一個8位的字數據送到存器中。數據源寄存器中的8位。
指令示例:
STRB R0[R1] ;將寄存器R0中的字數據寫入以R1地址的存器中。
STRB R0[R1,#8] ;將寄存器R0中的字數據寫入以R18地址的存器中。
6STRH指令
STRH指令的格式
STR{條件}H 源寄存器,<器地址>
STRH指令用于從源寄存器中將一個16位的半字數據送到存器中。半字數據源寄存器中的低16位。
指令示例:
STRH R0[R1] ;將寄存器R0中的半字數據寫入以R1地址的存器中。
STRH R0[R1,#8] ;將寄存器R0中的半字數據寫入以R18地址的存器中。
3.3.6批量數據加/指令
ARM理器所支持批量數據加/指令可以一次在一片連續的存元和多個寄存器之間傳送數據,批量加指令用于將一片連續的存器中的數據送到多個寄存器,批量數據存指令完成相反的操作。常用的加指令如下:
— LDM 批量數據加指令
— STM 批量數據存指令
LDM(或STM)指令
LDM(或STM)指令的格式
LDM(或STM{條件}{} 基址寄存器{},寄存器列表{}
LDM(或STM)指令用于從由基址寄存器所指示的一片連續器到寄存器列表所指示的多個寄存器之間傳送數據,指令的常用途是將多個寄存器的內容入或出。其中,{}以下幾情況:
IA 送后地址加1
IB 送前地址加1
DA 送后地址減1
DB 送前地址減1
FD 滿遞減堆
ED 減堆
FA 滿遞增堆
EA 增堆
{},若當數據送完之后,將最后的地址寫入基址寄存器,否基址寄存器的內容不改
基址寄存器不允許為R15,寄存器列表可以R0R15的任意合。
{},當指令LDM且寄存器列表中包含R15綴時表示:除了正常的數據送之外,SPSR制到CPSR。同綴還表示入或出的是用模式下的寄存器,而不是當前模式下的寄存器。
指令示例:
STMFD R13!{R0R4-R12LR} ;將寄存器列表中的寄存器(R0R4R12LR)存入堆
LDMFD R13!{R0R4-R12PC} ;將堆內容恢到寄存器(R0R4R12LR)。

3.3.7數據交指令
ARM理器所支持數據交指令能在存器和寄存器之數據。數據交指令有如下兩條:
— SWP 字數據交指令
— SWPB 數據交指令
1SWP指令
SWP指令的格式
SWP{條件} 目的寄存器,源寄存器1[源寄存器2]
SWP指令用于將源寄存器2所指向的存器中的字數據送到目的寄存器中,同將源寄存器1中的字數據送到源寄存器2所指向的存器中。然,當源寄存器1和目的寄存器同一個寄存器,指令交換該寄存器和存器的內容。
指令示例:
SWP R0R1[R2] ;將R2所指向的存器中的字數據送到R0,同R1中的字數據送到R2所指向的存儲單元。
SWP R0R0[R1] 指令完成將R1所指向的存器中的字數據與R0中的字數據交
2SWPB指令
SWPB指令的格式
SWP{條件}B 目的寄存器,源寄存器1[源寄存器2]
SWPB指令用于將源寄存器2所指向的存器中的字數據送到目的寄存器中,目的寄存器的高24清零,同將源寄存器1中的字數據送到源寄存器2所指向的存器中。然,當源寄存器1和目的寄存器同一個寄存器,指令交換該寄存器和存器的內容。
指令示例:
SWPB R0R1[R2] ;將R2所指向的存器中的字數據送到R0R0的高24位清零,同R1中的低8位數據送到R2所指向的存儲單元。
SWPB R0R0[R1] 指令完成將R1所指向的存器中的字數據與R0中的低8位數據交
3.3.8
移位指令(操作)
ARM理器內嵌的桶型移位器(Barrel Shifter),支持數據的各移位操作,移位操作在ARM指令集中不作為單獨的指令使用,它只能作指令格式中是一個字段,在匯編語言中表示指令中的選項。示例,數據理指令的第二個操作數寄存器,就可以加入移位操作選項對行各移位操作。移位操作包括如下6種類型,ASLLSL是等價的,可以自由互
— LSL 邏輯左移
— ASL 左移
— LSR 邏輯右移
— ASR 右移
— ROR 右移
— RRX 帶擴展的循右移
1LSL(或ASL)操作
LSL(或ASL)操作的格式
通用寄存器,LSL(或ASL操作數
LSL(或ASL)可完成通用寄存器中的內容邏輯(或算)的左移操作,按操作數所指定的數量向左移位,低位用零來填充。其中,操作數可以是通用寄存器,也可以是立即數(031)。
操作示例:
MOV R0, R1, LSL#2 ;將R1中的內容左移兩位后送到R0中。
2LSR操作
LSR操作的格式
通用寄存器,LSR 操作數
LSR可完成通用寄存器中的內容行右移的操作,按操作數所指定的數量向右移位,左端用零來填充。其中,操作數可以是通用寄存器,也可以是立即數(031)。
操作示例:
MOV R0, R1, LSR#2 ;將R1中的內容右移兩位后送到R0中,左端用零來填充。
3ASR操作
ASR操作的格式
通用寄存器,ASR 操作數
ASR可完成通用寄存器中的內容行右移的操作,按操作數所指定的數量向右移位,左端用第31位的來填充。其中,操作數可以是通用寄存器,也可以是立即數(031)。
操作示例:
MOV R0, R1, ASR#2 ;將R1中的內容右移兩位后送到R0中,左端用第31位的來填充。
4ROR操作
ROR操作的格式
通用寄存器,ROR 操作數
ROR可完成通用寄存器中的內容行循右移的操作,按操作數所指定的數量向右循移位,左端用右端移出的位來填充。其中,操作數可以是通用寄存器,也可以是立即數(031)。然,當32位的循右移操作,通用寄存器中的不改
操作示例:
MOV R0, R1, ROR#2 ;將R1中的內容循右移兩位后送到R0中。
5RRX操作
RRX操作的格式
通用寄存器,RRX 操作數
RRX可完成通用寄存器中的內容帶擴展的循右移的操作,按操作數所指定的數量向右循移位,左端用志位C來填充。其中,操作數可以是通用寄存器,也可以是立即數(031)。
操作示例:
MOV R0, R1, RRX#2 ;將R1中的內容帶擴展的循右移兩位后送到R0中。

3.3.9協處理器指令
ARM理器可支持多達16協處理器,用于各種協處理操作,在程序行的程中,協處理器只針對自身的協處理指令,忽略ARM理器和其他協處理器的指令。
ARM協處理器指令主要用于ARM理器初始化ARM協處理器的數據理操作,以及在ARM理器的寄存器和協處理器的寄存器之間傳送數據,和在ARM協處理器的寄存器和存器之間傳送數據。ARM協處理器指令包括以下5條:
— CDP 協處理器數操作指令
— LDC 協處理器數據加指令
— STC 協處理器數據存指令
— MCR ARM理器寄存器到協處理器寄存器的數據送指令
— MRC 協處理器寄存器到ARM理器寄存器的數據送指令
1CDP指令
CDP指令的格式
CDP{條件} 協處理器編碼協處理器操作1,目的寄存器,源寄存器1,源寄存器2協處理器操作2
CDP指令用于ARM理器通知ARM協處理器行特定的操作,協處理器不能成功完成特定的操作,則產生未定指令異常。其中協處理器操作1協處理器操作2為協處理器將要行的操作,目的寄存器和源寄存器均為協處理器的寄存器,指令不ARM理器的寄存器和存器。
指令示例:
CDP P32C12C10C34 指令完成協處理器P3的初始化
2LDC指令
LDC指令的格式
LDC{條件}{L} 協處理器編碼,目的寄存器,[源寄存器]
LDC指令用于將源寄存器所指向的存器中的字數據送到目的寄存器中,若協處理器不能成功完成送操作,則產生未定指令異常。其中,{L}選項表示指令為長讀取操作,如用于雙精度數據的傳輸
指令示例:
LDC P3C4[R0] ;將ARM理器的寄存器R0所指向的存器中的字數據送到協處理器P3的寄存器C4中。
3STC指令
STC指令的格式
STC{條件}{L} 協處理器編碼,源寄存器,[目的寄存器]
STC指令用于將源寄存器中的字數據送到目的寄存器所指向的存器中,若協處理器不能成功完成送操作,則產生未定指令異常。其中,{L}選項表示指令為長讀取操作,如用于雙精度數據的傳輸
指令示例:
STC P3C4[R0] ;將協處理器P3的寄存器C4中的字數據送到ARM理器的寄存器R0所指向的存器中。
4MCR指令
MCR指令的格式
MCR{條件} 協處理器編碼協處理器操作1,源寄存器,目的寄存器1,目的寄存器2協處理器操作2
MCR指令用于將ARM理器寄存器中的數據送到協處理器寄存器中,協處理器不能成功完成操作,則產生未定指令異常。其中協處理器操作1協處理器操作2為協處理器將要行的操作,源寄存器ARM理器的寄存器,目的寄存器1和目的寄存器2為協處理器的寄存器。
指令示例:
MCR P33R0C4C56 指令將ARM理器寄存器R0中的數據送到協處理器P3的寄存器C4C5中。
5MRC指令
MRC指令的格式
MRC{條件} 協處理器編碼協處理器操作1,目的寄存器,源寄存器1,源寄存器2協處理器操作2
MRC指令用于將協處理器寄存器中的數據送到ARM理器寄存器中,協處理器不能成功完成操作,則產生未定指令異常。其中協處理器操作1協處理器操作2為協處理器將要行的操作,目的寄存器ARM理器的寄存器,源寄存器1和源寄存器2為協處理器的寄存器。
指令示例:
MRC P33R0C4C56 指令將協處理器P3的寄存器中的數據送到ARM理器寄存器中。

3.3.10異常生指令
ARM理器所支持的異常指令有如下兩條:
— SWI 件中斷指令
— BKPT 斷點中斷指令
1SWI指令
SWI指令的格式
SWI{條件} 24位的立即數
SWI指令用于件中斷,以便用程序能調用操作系的系例程。操作系SWI的異常理程序中提供相的系,指令中24位的立即數指定用程序調用系例程的型,相參數通通用寄存器傳遞,當指令中24位的立即數被忽略,用程序調用系例程的型由通用寄存器R0的內容決定,同,參數通其他通用寄存器傳遞
指令示例:
SWI 0x02 指令調用操作系統編號位02的系例程。
2BKPT指令
BKPT指令的格式
BKPT 16位的立即數
BKPT指令件斷點中斷,可用于程序的調試
3.4 Thumb
指令及
兼容數據總線寬16位的用系ARM體系構除了支持行效率很高的32ARM指令集以外,同支持16位的Thumb指令集。Thumb指令集是ARM指令集的一個子集,允指令編碼為16位的度。與等價的32位代相比Thumb指令集在保留32碼優勢的同,大大的省了系的存
所有的Thumb指令都有對應ARM指令,而且Thumb程模型也對應ARM程模型,在用程序的程中,只要遵循一定調用的規則Thumb子程序和ARM子程序就可以互相調用。當理器在ARM程序段,稱ARM理器ARM工作狀,當理器在Thumb程序段,稱ARM理器Thumb工作狀
ARM指令集相比Thumb指令集中的數據理指令的操作數仍然是32位,指令地址也32位,但Thumb指令集為實現16位的指令度,舍棄了ARM指令集的一些特性,如大多數的Thumb指令是無條件行的,而幾乎所有的ARM指令都是有條件行的;大多數的Thumb數據理指令的目的寄存器與其中一個源寄存器相同。
由于Thumb指令的16位,即只用ARM指令一半的位數來實現的功能,所以,要實現特定的程序功能,所需的Thumb指令的條數ARM指令多。在一般的情況下,Thumb指令與ARM指令的時間效率和空效率
— Thumb所需的存間約為ARM60%~70
— Thumb使用的指令數比ARM30%~40
若使用32位的存器,ARMThumb40
若使用16位的存器,ThumbARM40%~50
ARM相比,使用Thumb,存器的功耗會降低30
然,ARM指令集和Thumb指令集各有其點,若的性能有高要求,使用32位的存ARM指令集,若的成本及功耗有高要求,則應使用16位的存Thumb指令集。當然,若兩者合使用,充分發揮其各自的點,會取得更好的效果。

3.5 本章小
本章系的介ARM指令集中的基本指令,以及各指令的合及方法,由基本指令可以派生出一些新的指令,但使用方法與基本指令似。與常的如X86體系構的匯編指令相比ARM指令系是從指令集本身,是從址方式上,都相對復雜一些。
Thumb指令集作ARM指令集的一個子集,其使用方法與ARM指令集似,在此未作詳細的描述,但并不意味著Thumb指令集不如ARM指令集重要,事上,他各自有其自己的
 

 

七星彩走势图2元网官网