|
ARM處理器的指令集可以分為跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器(PSR)處理指令、加載/存儲(chǔ)指令、協(xié)處理器指令和異常產(chǎn)生指令6大指令。
一、跳轉(zhuǎn)指令
跳轉(zhuǎn)指令用于實(shí)現(xiàn)程序流程的跳轉(zhuǎn),在ARM程序中有以下兩種方法可以實(shí)現(xiàn)程序流程的跳轉(zhuǎn)。
Ⅰ.使用專(zhuān)門(mén)的跳轉(zhuǎn)指令;
Ⅱ.直接向程序計(jì)數(shù)器PC寫(xiě)入跳轉(zhuǎn)地址值,通過(guò)向程序計(jì)數(shù)器PC寫(xiě)入跳轉(zhuǎn)地址值,可以實(shí)現(xiàn)在4GB的地址空間中的任意跳轉(zhuǎn),在跳轉(zhuǎn)之前結(jié)合使用MOV LR,PC等類(lèi)似指令,可以保存將來(lái)的返回地址值,從而實(shí)現(xiàn)在4GB連續(xù)的線(xiàn)性地址空間的子程序調(diào)用。
ARM指令集中的跳轉(zhuǎn)指令可以完成從當(dāng)前指令向前或向后的32MB的地址空間的跳轉(zhuǎn),包括以下4條指令:
1、B指令
B指令的格式為:
B{條件} 目標(biāo)地址
B指令是最簡(jiǎn)單的跳轉(zhuǎn)指令。一旦遇到一個(gè)B指令,ARM處理器將立即跳轉(zhuǎn)到給定的目標(biāo)地址,從那里繼續(xù)執(zhí)行。注意存儲(chǔ)在跳轉(zhuǎn)指令中的實(shí)際值是相對(duì)當(dāng)前PC 值的一個(gè)偏移量,而不是一個(gè)絕對(duì)地址,它的值由匯編器來(lái)計(jì)算(參考尋址方式中的相對(duì)尋址)。它是24位有符號(hào)數(shù),左移兩位后有符號(hào)擴(kuò)展為32 位,表示的有效偏移為26 位(前后32MB的地址空間)。以下指令:
B Label ;程序無(wú)條件跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行
CMP R1,#0 ;當(dāng)CPSR寄存器中的Z條件碼置位時(shí),程序跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行
BEQ Label
2、BL指令
BL指令的格式為:
BL{條件} 目標(biāo)地址
BL是另一個(gè)跳轉(zhuǎn)指令,但跳轉(zhuǎn)之前,會(huì)在寄存器R14中保存PC的當(dāng)前內(nèi)容,因此,可以通過(guò)將R14的內(nèi)容重新加載到PC中,來(lái)返回到跳轉(zhuǎn)指令之后的那個(gè) 指令處執(zhí)行。該指令是實(shí)現(xiàn)子程序調(diào)用的一個(gè)基本但常用的手段。
以 下指令:
BL Label ;當(dāng)程序無(wú)條件跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行時(shí),同時(shí)將當(dāng)前的 PC值保存到
;R14(LR)中
3、BLX指令
BLX指令的格式為:
BLX 目標(biāo)地址
BLX指令從ARM指令集跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,并將處理器的工作狀態(tài)有ARM狀態(tài)切換到Thumb狀態(tài),該指令同時(shí)將PC的當(dāng)前內(nèi)容保存到寄存 器R14中。因此,當(dāng)子程序使用Thumb指令集,而調(diào)用者使用ARM指令集時(shí),可以通過(guò)BLX指令實(shí)現(xiàn)子程序的調(diào)用和處理器工作狀態(tài)的切換。同時(shí),子程 序的返回可以通過(guò)將寄存器R14值復(fù)制到PC中來(lái)完成。
4、BX指令
BX指令的格式為:
BX{條件} 目標(biāo)地址
BX指令跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,目標(biāo)地址處的指令既可以是ARM指令,也可以是Thumb指令。
二、數(shù)據(jù)處理指令
數(shù)據(jù)處理指令可分為數(shù)據(jù)傳送指令、算術(shù)邏輯運(yùn)算指令 和比較指令等。
數(shù)據(jù)傳送指令用于在寄存器和存儲(chǔ)器之間進(jìn)行數(shù)據(jù)的雙向傳輸;
算術(shù)邏輯運(yùn)算指令完成常用的算術(shù)與邏輯的運(yùn)算,該類(lèi)指令不但將運(yùn)算結(jié)果保存在目的寄存器中,同時(shí)更新CPSR中的相應(yīng)條件標(biāo)志位;
比較指令不保存運(yùn)算結(jié)果,只更新CPSR中相應(yīng)的條件標(biāo)志位。
數(shù)據(jù)處理指令共以下16條。
1、MOV指令(傳送)
MOV指令的格式為:
MOV{條件}{S} 目的寄存器,源操作數(shù)
MOV指令可完成從另一個(gè)寄存器、被移位的寄存器或?qū)⒁粋(gè)立即數(shù)加載到目的寄存器。其中S選項(xiàng)決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒(méi)有S 時(shí)指令不更新CPSR中條件標(biāo)志位的值。
指令示例:
MOV R1,R0 ;將寄存器R0的值傳送到寄存器R1
MOV PC,R14 ;將寄存器R14的值傳送到 PC,常用于子程序返回
MOV R1,R0,LSL#3 ;將寄存器R0的值左移3位后傳送到R1
2、MVN指令(求反)
MVN指令的格式為:
MVN{條件}{S} 目的寄存器,源操作數(shù)
MVN指令可完成從另一個(gè)寄存器、被移位的寄存器、或?qū)⒁粋(gè)立即數(shù)加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個(gè)被取反的值傳送到目的寄存器中。其中S決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒(méi)有S時(shí)指令不更新CPSR中條件標(biāo)志位的值。
指令示例:
MVN R0,#0 ;將 立即數(shù)0取反傳送到寄存器R0中,完成后R0=-1
3、CMP指令(比較)
CMP指令的格式為:
CMP{條件} 操作數(shù)1,操作數(shù)2
CMP指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行比較,同時(shí)更新CPSR中條件標(biāo)志位的值。該指令進(jìn)行一次減法運(yùn)算,但不存儲(chǔ)結(jié)果,只 更改條件標(biāo)志位。 標(biāo)志位表示的是操作數(shù)1與操作數(shù)2的關(guān)系(大、小、相等),例如,當(dāng)操作數(shù)1大于操作操作數(shù)2,則此后的有GT后綴的指令將可以執(zhí)行。
指令示例:
CMP R1,R0 ;將寄存器R1的值與寄存器R0的值相減,并根據(jù) 結(jié)果設(shè)置CPSR的標(biāo)
;志位
CMP R1,#100 ;將寄存器R1的值與立即數(shù)100相減,并根 據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位
4、CMN指令(負(fù)數(shù)比較)
CMN指令的格式為:
CMN{條件} 操作數(shù)1,操作數(shù)2
CMN指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)取反后進(jìn)行比較,同時(shí)更新CPSR中條件標(biāo)志位的值。該指令實(shí)際完成操作數(shù)1和操作數(shù)2相 加,并根據(jù)結(jié)果更改條件標(biāo)志位。
指令示例:
CMN R1,R0 ;將寄存器R1的值與寄存器R0的值相加,并根據(jù) 結(jié)果設(shè)置CPSR
;的標(biāo)志位
CMN R1,#100 ;將寄存器R1的值與立即數(shù)100相加,并根據(jù) 結(jié)果設(shè)置CPSR的標(biāo)志位
5、TST指令(測(cè)試)
TST指令的格式為:
TST{條件} 操作數(shù)1,操作數(shù)2
TST指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行按位的與運(yùn)算,并根據(jù)運(yùn)算結(jié)果更新CPSR中條件標(biāo)志位的值。操作數(shù)1是要測(cè)試的數(shù) 據(jù),而操作數(shù)2是一個(gè)位掩碼,該指令一般用來(lái)檢測(cè)是否設(shè)置了特定的位。
指令示例:
TST R1,#%1 ;用于測(cè)試在寄存器R1中是否設(shè)置了最低位(%表 示二進(jìn)制數(shù))
TST R1,#0xffe ;將寄存器R1的值與立即數(shù)0xffe按位與,并根據(jù) 結(jié)果設(shè)置CPSR
;的標(biāo)志位
6、TEQ指令(測(cè)試相等)
TEQ指令的格式為:
TEQ{條件} 操作數(shù)1,操作數(shù)2
TEQ指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行按位的異或運(yùn)算,并根據(jù)運(yùn)算結(jié)果更新CPSR中條件標(biāo)志位的值。該指令通常用于比較操作數(shù)1和操作數(shù)2是否相等。
指令示例:
TEQ R1,R2 ;將寄存器R1的值與寄存器R2的值按位異或,并根據(jù)結(jié)果 設(shè)置CPSR
;的標(biāo)志位
7、ADD指令(相加)
ADD指令的格式為:
ADD{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
ADD指令用于把兩個(gè)操作數(shù)相加,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。
指令示例:
ADD R0,R1,R2 ; R0 = R1 + R2
ADD R0,R1,#256 ; R0 = R1 + 256
ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1)
8、ADC指令(帶進(jìn)位相加)
ADC指令的格式為:
ADC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
ADC指令用于把兩個(gè)操作數(shù)相加,再加上CPSR中的C條件標(biāo)志位的值,并將結(jié)果存放到目的寄存器中。它使用一個(gè)進(jìn)位標(biāo)志位,這樣就可以做比32位大的數(shù) 的加法,注意不要忘記設(shè)置S后綴來(lái)更改進(jìn)位標(biāo)志。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一 個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。
以下指令序列完成兩個(gè)128位數(shù)的加法,第一個(gè)數(shù)由高到低存放在寄存器R7~R4,第二個(gè)數(shù)由高到低存放在寄存器R11~R8,運(yùn)算結(jié)果由高到低存放在寄 存器R3~R0:
ADDS R0,R4,R8 ; 加低端的字
ADCS R1,R5,R9 ; 加第二個(gè)字,帶進(jìn)位
ADCS R2,R6,R10 ; 加第三個(gè)字,帶進(jìn)位
ADC R3,R7,R11 ; 加第四個(gè)字,帶進(jìn)位
9、SUB指令(相減)
SUB指令的格式為:
SUB{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
SUB指令用于把操作數(shù)1減去操作數(shù)2,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即 數(shù)。該指令可用于有符號(hào)數(shù)或無(wú)符號(hào)數(shù)的減法運(yùn)算。
指令示例:
SUB R0,R1,R2 ; R0 = R1 - R2
SUB R0,R1,#256 ; R0 = R1 - 256
SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 << 1)
10、~~~~C指令
~~~~C指令的格式為:
~~~~C{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
~~~~C指令用于把操作數(shù)1減去操作數(shù)2,再減去CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以 是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令使用進(jìn)位標(biāo)志來(lái)表示借位,這樣就可以做大于32位的減法,注意不要忘記設(shè)置S后綴來(lái)更改進(jìn)位標(biāo)志。該指令可用于有符號(hào)數(shù)或無(wú)符號(hào)數(shù)的減法運(yùn)算。
指令示例:
SUBS R0,R1,R2 ;R0 = R1 - R2 - !C,并根據(jù)結(jié)果設(shè)置CPSR的進(jìn)位標(biāo)志位
11、R~~~~指令
R~~~~指令的格式為:
R~~~~{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
R~~~~指令稱(chēng)為逆向減法指令,用于把操作數(shù)2減去操作數(shù)1,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位 的寄存器,或一個(gè)立即數(shù)。該指令可用于有符號(hào)數(shù)或無(wú)符號(hào)數(shù)的減法運(yùn)算。
指令示例:
R~~~~ R0,R1,R2 ; R0 = R2 – R1
R~~~~ R0,R1,#256 ; R0 = 256 – R1
R~~~~ R0,R2,R3,LSL#1 ; R0 = (R3 << 1) - R2
12、RSC指令(反向帶進(jìn)位減)
RSC指令的格式為:
RSC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
RSC指令用于把 操作數(shù)2減去操作數(shù)1,再減去CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位 的寄存器,或一個(gè)立即數(shù)。該指令使用進(jìn)位標(biāo)志來(lái)表示借位,這樣就可以做大于32位的減法,注意不要忘記設(shè)置S后綴來(lái)更改進(jìn)位標(biāo)志。該指令可用于有符號(hào)數(shù)或 無(wú)符號(hào)數(shù)的減法運(yùn)算。
指令示例:
RSC R0,R1,R2 ;R0 = R2 – R1 - !C
13、AND指令(邏輯位 與)
AND指令的格式為:
AND{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
AND指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯與運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于屏蔽操作數(shù)1的某些位。
指令示例:
AND R0,R0,#3 ;該指令保持R0的0、1位,其余位清零。
14、ORR指令(邏輯位 或)
ORR指令的格式為:
ORR{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
ORR指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯或運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于設(shè)置操作數(shù)1的某些位。
指令示例:
ORR R0,R0,#3 ;該指令設(shè)置R0的0、1位,其余位保持不變。
15、EOR指令(邏輯位 異或)
EOR指令的格式為:
EOR{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
EOR指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯異或運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于反轉(zhuǎn)操作數(shù)1的某些位。
指令示例:
EOR R0,R0,#3 ;該指令反轉(zhuǎn)R0的0、1位,其余位保持不變。
16、BIC指令(位清零)
BIC指令的格式為:
BIC{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
BIC指令用于清除操作數(shù)1的某些位,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。操作數(shù)2為32位的掩碼,如果在掩碼中設(shè)置了某一位,則清除這一位。未設(shè)置的掩碼位保持不 變。
指令示例:
BIC R0,R0,#%1011 ;該指令清除R0中的位 0、1、和 3,其余的位保持不變。
三、乘法指令與乘加指令
ARM 微處理器支持的乘法指令與乘加指令共有6條,可分為運(yùn)算結(jié)果為32位和運(yùn)算結(jié)果為64位兩類(lèi),與前面的數(shù)據(jù)處理指令不同,指令中的所有操作數(shù)、目的寄存器 必須為通用寄存器,不能對(duì)操作數(shù)使用立即數(shù)或被移位的寄存器,同時(shí),目的寄存器和操作數(shù)1必須是不同的寄存器。
乘法指令與乘加指令共有以下6條:
1、MUL指令(相乘)
MUL指令的格式為:
MUL{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2
MUL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果放置到目的寄存器中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操 作數(shù)2均為32位的有符號(hào)數(shù)或無(wú)符號(hào)數(shù)。
指令示例:
MUL R0,R1,R2 ;R0 = R1 × R2
MULS R0,R1,R2 ;R0 = R1 × R2,同時(shí)設(shè)置CPSR中的相關(guān)條件標(biāo)志位
2、MLA指令(帶累加的相乘)
MLA指令的格式為:
MLA{條件}{S} 目的寄存器,操作數(shù)1,操作數(shù)2,操作數(shù)3
MLA指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,再將乘積加上操作數(shù)3,并把結(jié)果放置到目的寄存器中,同時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志 位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號(hào)數(shù)或無(wú)符號(hào)數(shù)。
指令示例:
MLA R0,R1,R2,R3 ;R0 = R1 × R2 + R3
MLAS R0,R1,R2,R3 ;R0 = R1 × R2 + R3,同時(shí)設(shè)置CPSR中的相關(guān)條件標(biāo)志位
3、SMULL指令
SMULL指令的格式為:
SMULL{條件}{S} 目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2
SMULL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High中,同時(shí)可以 根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號(hào)數(shù)。
指令示例:
SMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位
;R1 = (R2 × R3)的高32位
4、SMLAL指令
SMLAL指令的格式為:
SMLAL{條件}{S} 目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2
SMLAL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的 低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結(jié)果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同 時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的有符號(hào)數(shù)。
對(duì)于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位;對(duì)于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32位,指令執(zhí)行后存放結(jié)果的高32位。
指令示例:
SMLAL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 + R0
;R1 = (R2 × R3)的高32位 + R1
5、UMULL指令
UMULL指令的格式為:
UMULL{條件}{S} 目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2
UMULL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低32位放置到目的寄存器Low中,結(jié)果的高32位放置到目的寄存器High中,同時(shí)可以 根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的無(wú)符號(hào)數(shù)。
指令示例:
UMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位
;R1 = (R2 × R3)的高32位
6、UMLAL指令
UMLAL指令的格式為:
UMLAL{條件}{S} 目的寄存器Low,目的寄存器High,操作數(shù)1,操作數(shù)2
UMLAL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的 低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,結(jié)果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High 中,同 時(shí)可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR中相應(yīng)的條件標(biāo)志位。其中,操作數(shù)1和操作數(shù)2均為32位的無(wú)符號(hào)數(shù)。
對(duì)于目的寄存器Low,在指令執(zhí)行前存放64位加數(shù)的低32位,指令執(zhí)行后存放結(jié)果的低32位;對(duì)于目的寄存器High,在指令執(zhí)行前存放64位加數(shù)的高32位,指令執(zhí)行后存放結(jié)果的高32位。
指令示例:
UMLAL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 + R0
;R1 = (R2 × R3)的高32位 + R1
四、程序狀態(tài)寄存器訪(fǎng)問(wèn)指令
1、MRS指令
MRS指令的格式為:
MRS{條件} 通用寄存器 程序狀態(tài)寄存器(CPSR或SPSR)
MRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。該指令一般用在以下兩種情況:
Ⅰ.當(dāng)需要改變程序狀態(tài)寄存器的內(nèi)容時(shí),可用MRS將程序狀態(tài)寄存器的內(nèi)容讀入通用寄存器,修改后再寫(xiě)回程序狀態(tài)寄存器。
Ⅱ.當(dāng)在異常處理或進(jìn)程切換時(shí),需要保存程序狀態(tài)寄存器的值,可先用該指令讀出程序狀態(tài)寄存器的值,然后保存。
指令示例:
MRS R0,CPSR ;傳送CPSR的內(nèi)容到R0
MRS R0,SPSR ;傳送 SPSR的內(nèi)容到R0
2、MSR指令
MSR指令的格式為:
MSR{條件} 程序狀態(tài)寄存器(CPSR或SPSR)_<域>,操作數(shù)
MSR指令用于將操作數(shù)的內(nèi)容傳送到程序狀態(tài)寄存器的特定域中。其中,操作數(shù)可以為通用寄存器或立即數(shù)。<域>用于設(shè)置程序狀態(tài)寄存器中需要 操作的位,32位的程序狀態(tài)寄存器可分為4個(gè)域:
位[31:24]為條件位域,用f表示;
位[23:16]為狀態(tài)位域,用s表示;
位[15:8] 為擴(kuò)展位域,用x表示;
位[7:0] 為控制位域,用c表示;
該指令通常用于恢復(fù)或改變程序狀態(tài)寄存器的內(nèi)容,在使用時(shí),一般要在MSR指令中指明將要操作的域。
指令示例:
MSR CPSR,R0 ;傳送R0的內(nèi)容到CPSR
MSR SPSR,R0 ;傳送R0的內(nèi)容到SPSR
MSR CPSR_c,R0 ;傳送R0的內(nèi)容到SPSR,但僅僅修改CPSR中的控制位域
五、加載/存儲(chǔ)指令。ARM微處理器支持加載/存儲(chǔ)指令用于在寄存器和存儲(chǔ)器之間傳送數(shù)據(jù),加載指令用于將存儲(chǔ)器中的數(shù)據(jù)傳送到寄存器,存儲(chǔ) 指令則完成相反的操作。常用的加載存儲(chǔ)指令如下:
1、LDR指令
LDR指令的格式為:
LDR{條件} 目的寄存器,<存儲(chǔ)器地址>
LDR指令用于從存儲(chǔ)器中將一個(gè)32位的字?jǐn)?shù)據(jù)傳送到目的寄存器中。該指令通常用于從存儲(chǔ)器中讀取32位的字?jǐn)?shù)據(jù)到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。當(dāng)程序計(jì)數(shù)器PC作為 目的寄存器時(shí),指令從存儲(chǔ)器中讀取的字?jǐn)?shù)據(jù)被當(dāng)作目的地址,從而可以實(shí)現(xiàn)程序流程的跳轉(zhuǎn)。該指令在程序設(shè)計(jì) 中比較常用,且尋址方式靈活多樣,請(qǐng)讀者認(rèn)真掌握。
指令示例:
LDR R0,[R1] ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0。
LDR R0,[R1,R2] ;將存儲(chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器R0。
LDR R0,[R1,#8] ;將存儲(chǔ)器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器R0。
LDR R0,[R1,R2] ! ;將存儲(chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地 址
;R1+R2寫(xiě)入R1。
LDR R0,[R1,#8] ! ;將存儲(chǔ)器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址 R1
;+8寫(xiě)入R1。
LDR R0,[R1],R2 ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址 R1+
;R2寫(xiě)入R1。
LDR R0,[R1,R2,LSL#2]! ;將存儲(chǔ)器地址為R1+R2×4的字?jǐn)?shù)據(jù)讀入寄存器R0,并
;將新地址R1+R2×4寫(xiě)入R1。
LDR R0,[R1],R2,LSL#2 ;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入 寄存器R0,并將新地
;址R1+R2×4寫(xiě)入R1。
2、LDRB指令
LDRB指令的格式為:
LDR{條件}B 目的寄存器,<存儲(chǔ)器地址>
LDRB指令用于從存儲(chǔ)器中將一個(gè)8位的字節(jié)數(shù)據(jù)傳送到目的寄存器中,同時(shí)將寄存器的高24位清零。 該指令通常用于從存儲(chǔ)器中讀取8位的字節(jié)數(shù)據(jù)到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。當(dāng)程序計(jì)數(shù)器PC作為目的寄存器時(shí),指令從存儲(chǔ)器中讀取的字?jǐn)?shù)據(jù)被當(dāng)作目 的地址,從而可以實(shí)現(xiàn)程序流程的跳轉(zhuǎn)。
指令示例:
LDRB R0,[R1] ;將存儲(chǔ)器地址為R1的字節(jié)數(shù)據(jù)讀入寄存器 R0,并將R0的高24
;位清零。
LDRB R0,[R1,#8] ;將存儲(chǔ)器地址為R1+8的字節(jié)數(shù)據(jù)讀入寄存器R0,并將 R0的
;高24位清零。
3、LDRH指令
LDRH指令的格式為:
LDR{條件}H 目的寄存器,<存儲(chǔ)器地址>
LDRH指令用于從存儲(chǔ)器中將一個(gè)16位的半字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時(shí)將寄存器的高16位清零。 該指令通常用于從存儲(chǔ)器中讀取16位的半字?jǐn)?shù)據(jù)到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。當(dāng)程序計(jì)數(shù)器PC作為目的寄存器時(shí),指令從存儲(chǔ)器中讀取的字?jǐn)?shù)據(jù)被當(dāng)作 目的地址,從而可以實(shí)現(xiàn)程序流程的跳轉(zhuǎn)。
指令示例:
LDRH R0,[R1] ;將存儲(chǔ)器地址為R1的半字?jǐn)?shù)據(jù)讀入寄存器 R0,并將R0的高
;16位清零。
LDRH R0,[R1,#8] ;將存儲(chǔ)器地址為R1+8的半字?jǐn)?shù)據(jù)讀入寄存器R0,并將R0 的
;高16位清零。
LDRH R0,[R1,R2] ;將存儲(chǔ)器地址為R1+R2的半字?jǐn)?shù)據(jù)讀入寄存器R0,并將 R0的
;高16位清零。
4、STR指令
STR指令的格式為:
STR{條件} 源寄存器,<存儲(chǔ)器地址>
STR指令用于從源寄存器中將一個(gè)32位的字?jǐn)?shù)據(jù)傳送到存儲(chǔ)器中。 該指令在程序設(shè)計(jì)中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR。
指令示例:
STR R0,[R1],#8 ;將R0中的字?jǐn)?shù)據(jù)寫(xiě)入以R1為地址的存儲(chǔ)器中,并 將新地址
;R1+8寫(xiě)入R1。
STR R0,[R1,#8] ;將R0中的字?jǐn)?shù)據(jù)寫(xiě)入以R1+8為地址的存儲(chǔ)器中。
5、STRB指令
STRB指令的格式為:
STR{條件}B 源寄存器,<存儲(chǔ)器地址>
STRB指令用于從源寄存器中將一個(gè)8位的字節(jié)數(shù)據(jù)傳送到存儲(chǔ)器中。該字節(jié)數(shù)據(jù)為源寄存器中的低8位。
指令示例:
STRB R0,[R1] ;將寄存器R0中的字節(jié)數(shù)據(jù)寫(xiě)入以R1為地 址的存儲(chǔ)器中。
STRB R0,[R1,#8] ;將寄存器R0中的字節(jié)數(shù)據(jù)寫(xiě)入以R1+8為地址的存 儲(chǔ)器中。
6、STRH指令
STRH指令的格式為:
STR{條件}H 源寄存器,<存儲(chǔ)器地址>
STRH指令用于從源寄存器中將一個(gè)16位的半字?jǐn)?shù)據(jù)傳送到存儲(chǔ)器中。該半字?jǐn)?shù)據(jù)為源寄存器中的低16位。
指令示例:
STRH R0,[R1] ;將寄存器R0中的半字?jǐn)?shù)據(jù)寫(xiě)入以R1為地址的 存儲(chǔ)器中。
STRH R0,[R1,#8] ;將寄存器R0中的半字?jǐn)?shù)據(jù)寫(xiě)入以R1+8 為地址的存儲(chǔ)器中。
六、批量數(shù)據(jù)加載/存儲(chǔ)指令。ARM微處理器所支持批量數(shù)據(jù)加載/存儲(chǔ)指令可以一次在一片連續(xù)的存儲(chǔ)器單元和多個(gè)寄存器之間傳送數(shù)據(jù),批量加載指令 用于將一片連續(xù)的存儲(chǔ)器中的數(shù)據(jù)傳送到多個(gè)寄存器,批量數(shù)據(jù)存儲(chǔ)指令則完成相反的操作。常用的加載存儲(chǔ)指令如下:LDM(或STM)指令
LDM(或STM)指令的格式為:
LDM(或STM){條件}{類(lèi)型} 基址寄存器{!},寄存器列表{∧}
LDM(或STM)指令用于從由基址寄存器所指示的一片連續(xù)存儲(chǔ)器到寄存器列表所指示的多個(gè)寄存器之間傳送數(shù)據(jù),該指令的常見(jiàn)用途是將多個(gè)寄存器的內(nèi)容入;虺鰲!F渲,{類(lèi)型}為 以下幾種情況:
IA 每次傳送后地址加1;
IB 每次傳送前地址加1;
DA 每次傳送后地址減1;
DB 每次傳送前地址減1;
FD 滿(mǎn)遞減堆棧;
ED 空遞減堆棧;
FA 滿(mǎn)遞增堆棧;
EA 空遞增堆棧;
{!}為可選后綴,若選用該后綴,則當(dāng)數(shù)據(jù) 傳送完畢之后,將最后的地址寫(xiě)入基址寄存器,否則基址寄存器的內(nèi)容不改變。
基址寄存器不允許為R15,寄存器列表可以為R0~R15的任意組合。
{∧}為可選后綴,當(dāng)指令為L(zhǎng)DM且寄存器列表中包含R15,選用該后綴時(shí)表示:除了正常的數(shù)據(jù)傳送之外,還將SPSR復(fù)制到CPSR。同時(shí),該后綴還表 示傳入或傳出的是用戶(hù)模式下的寄存器,而不是當(dāng)前模式下的寄存器。
指令示例:
STMFD R13!,{R0,R4-R12,LR} ;將寄存器列表中的寄存器(R0,R4到R12,LR)存入堆棧。
LDMFD R13!, {R0,R4-R12,PC} ;將堆棧內(nèi)容恢復(fù)到寄存器(R0,R4到R12,LR)。
七、數(shù)據(jù)交換指令
1、SWP指令
SWP指令的格式為:
SWP{條件} 目的寄存器,源寄存器1,[源寄存器2]
SWP指令用于將源寄存器2所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時(shí)將源寄存器1中的字?jǐn)?shù)據(jù)傳送到源寄存器2所指向的存儲(chǔ)器中。顯然,當(dāng)源寄存器1和目的寄存器為同一個(gè)寄存器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。
指令示例:
SWP R0,R1,[R2] ;將R2所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到R0,同時(shí)將R1 中的字?jǐn)?shù)據(jù)傳送到R2所指向的存儲(chǔ)單元。
SWP R0,R0,[R1] ;該指令完成將R1所指向的存儲(chǔ)器中的字?jǐn)?shù) 據(jù)與R0中的數(shù)據(jù)交換。
2、SWPB指令
SWPB指令的格式為:
SWP{條件}B 目的寄存器,源寄存器1,[源寄存器2]
SWPB指令用于將源寄存器2所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到目的寄存器中,目的寄存器的高24清零,同時(shí)將源寄存 器1中的字節(jié)數(shù)據(jù)傳送到源寄存器2所指向的存儲(chǔ)器中。顯然,當(dāng)源寄存器1和目的寄存器為同一個(gè)寄存器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。
指令示例:
SWPB R0,R1,[R2] ;將R2所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到 R0,R0的高24位清零,同時(shí)將R1中的低8位數(shù)據(jù)傳送到R2所指向的存儲(chǔ)單元。
SWPB R0,R0,[R1] ;該指令完成將R1所指向的存儲(chǔ)器中的 字節(jié)數(shù)據(jù)與R0中的低8位數(shù)據(jù)交換。
八、移位指令
1、LSL(或ASL)
LSL(或ASL)的格式為:
通用寄存器,LSL(或ASL) 操作數(shù)
LSL(或ASL)可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行邏輯(或算術(shù))的左移操作,按操作數(shù)所指定的數(shù)量向左移位,低位用零來(lái)填充。 其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(0~31)。
操作示例
MOV R0, R1, LSL #2 ;將R1中的內(nèi)容左移兩位后傳送到R0 中。
2、LSR
LSR的格式為:
通用寄存器,LSR 操作數(shù)
LSR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用零來(lái)填充。其中,操作數(shù)可以 是通用寄存器,也可以是立即數(shù)(0~31)。
操作示例:
MOV R0, R1, LSR #2 ;將R1中的內(nèi)容右移兩位后傳送到R0 中,左端用零來(lái)填充。
3、ASR
ASR的格式為:
通用寄存器,ASR 操作數(shù)
ASR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用第31位的值來(lái)填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(0~31)。
操作示例:
MOV R0, R1, ASR #2 ;將R1中的內(nèi)容右移兩位后傳送到R0 中,左端用第31位的值來(lái)填充。
4、ROR
ROR的格式為:
通用寄存器,ROR 操作數(shù)
ROR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用右端移出的位來(lái)填充。其中,操作數(shù)可以是通用寄存器,也 可以是立即數(shù)(0~31)。顯然,當(dāng)進(jìn)行32位的循環(huán)右移操作時(shí),通用寄存器中的值不改變。
操作示例:
MOV R0, R1, ROR #2 ;將R1中的內(nèi)容循環(huán)右移兩位后傳送到R0 中。
5、RRX
RRX的格式為:
通用寄存器,RRX 操作數(shù)
RRX可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用進(jìn)位標(biāo)志位C來(lái)填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(0~31)。
操作示例:
MOV R0, R1, RRX #2 ;將R1中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移兩位 后傳送到R0中。
九、協(xié)處理器指令
1、CDP指令
CDP指令的格式為:
CDP{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2。
CDP指令用于ARM處理器通知ARM協(xié)處理器執(zhí)行特定的操作,若協(xié)處理器不能成功完成特定的操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理 器操作碼2為協(xié)處理器將要執(zhí)行的操作,目的寄存器和源寄存器均為協(xié)處理器的寄存器,指令不涉及ARM處理器的寄存器和存儲(chǔ)器。
指令示例:
CDP P3,2,C12,C10,C3,4 ;該指令完成協(xié)處理器P3的初始化
2、LDC指令
LDC指令的格式為:
LDC{條件}{L} 協(xié)處理器編碼,目的寄存器,[源寄存器]
LDC指令用于將源寄存器所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。其中,{L}選項(xiàng)表示指令為長(zhǎng)讀取操作,如用于雙精度數(shù)據(jù)的傳輸。
指令示例:
LDC P3,C4,[R0] ;將ARM處理器的寄存器R0所指向的存儲(chǔ)器中的字?jǐn)?shù) 據(jù)傳送到協(xié)處理器P3的寄存器C4中。
3、STC指令
STC指令的格式為:
STC{條件}{L} 協(xié)處理器編碼,源寄存器,[目的寄存器]
STC指令用于將源寄存器中的字?jǐn)?shù)據(jù)傳送到目的寄存器所指向的存儲(chǔ)器中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。其中,{L}選項(xiàng)表示指令為長(zhǎng)讀取操作,如用于雙精度數(shù)據(jù)的傳輸。
指令示例:
STC P3,C4,[R0] ;將協(xié)處理器P3的寄存器C4中的字?jǐn)?shù)據(jù)傳送到ARM處理 器的寄存器R0所指向的存儲(chǔ)器中。
4、MCR指令
MCR指令的格式為:
MCR{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協(xié)處理器操作碼2。
MCR指令用于將ARM處理器寄存器中的數(shù)據(jù)傳送到協(xié)處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理 器操作碼2為協(xié)處理器將要執(zhí)行的操作,源寄存器為ARM處理器的寄存器,目的寄存器1和目的寄存器2均為協(xié)處理器的寄 存器。
指令示例:
MCR P3,3,R0,C4,C5,6 ;將ARM處理器寄存器R0中的數(shù)據(jù)傳送到協(xié)處 理器P3的寄存器C4和C5中。
5、MRC指令
MRC指令的格式為:
MRC{條件} 協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2。
MRC指令用于將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理 器操作碼2為協(xié)處理器將要執(zhí)行的操作,目的寄存器為ARM處理器的寄存器,源寄存器1和源寄存器2均為協(xié)處理器的寄存器。
指令示例:
MRC P3,3,R0,C4,C5,6 ;該指令將協(xié)處理器P3的寄存器中的數(shù)據(jù)傳送到 ARM處理器寄存器中。
十、異常產(chǎn)生指令
1、SWI指令
SWI指令的格式為:
SWI{條件} 24位的立即數(shù)
SWI指令用于產(chǎn)生軟件中斷,以便用戶(hù)程序能調(diào)用操作系統(tǒng)的系統(tǒng)例程。操作系統(tǒng)在SWI的異常處理程序中提供相應(yīng)的系統(tǒng)服務(wù),指令中24位的立即數(shù)指定用 戶(hù)程序調(diào)用系統(tǒng)例程的類(lèi)型,相關(guān)參數(shù)通過(guò)通用寄存器傳遞,當(dāng)指令中24位的立即數(shù)被忽略時(shí),用戶(hù)程序調(diào)用系統(tǒng)例程的類(lèi)型由通用寄存器R0的內(nèi)容決定,同時(shí),參數(shù)通過(guò)其他通用寄存器傳遞。
指令示例:
SWI 0x02 ;該指令調(diào)用操作系統(tǒng)編號(hào)位02的系統(tǒng)例程。
2、BKPT指令
BKPT指令的格式為:
BKPT 16位的立即數(shù)
BKPT指令產(chǎn)生軟件斷點(diǎn)中斷,可用于程序的調(diào)試。
ARM匯編偽指令
在ARM匯編語(yǔ)言程序里,有一些特殊指令助記符,這些助記符與指令系統(tǒng)的助記符不同,沒(méi)有相對(duì)應(yīng)的操作碼,通常稱(chēng)這些特殊指令助記符為偽指令,他們所完成 的操作稱(chēng)為偽操作。偽指令在源程序中的作用是為完成匯編程序作各種準(zhǔn)備工作的,這些偽指令僅在匯編過(guò)程中起作用,一旦匯編結(jié)束,偽指令的使命就完成。
在ARM 的匯編程序中,有如下幾種偽指令:符號(hào)定義偽指令、數(shù)據(jù)定義偽指令、匯編控制偽指令、宏指令以及其他偽指令。
一、符號(hào)定義(Symbol Definition)偽指令
符號(hào)定義偽指令用于定義ARM 匯編程序中的變量、對(duì)變量賦值以及定義寄存器的別名等操作。
常見(jiàn)的符號(hào)定義偽指令有如下幾種:
— 用于定義全局變量的GBLA 、GBLL 和GBLS 。
— 用于定義局部變量的LCLA 、LCLL 和LCLS 。
— 用于對(duì)變量賦值的SETA 、SETL 、SETS 。
— 為通用寄存器列表定義名稱(chēng)的RLIST 。
1、GBLA、GBLL 和GBLS
語(yǔ)法格式:
GBLA (GBLL 或GBLS )全局變量名
GBLA 、GBLL 和GBLS 偽指令用于定義一個(gè)ARM 程序中的全局變量,并將其初始化。其中:
GBLA 偽指令用于定義一個(gè)全局的數(shù)字變量,并初始化為0 ;
GBLL 偽指令用于定義一個(gè)全局的邏輯變量,并初始化為F(假);
GBLS 偽指令用于定義一個(gè)全局的字符串變量,并初始化為空;
由于以上三條偽指令用于定義全局變量,因此在整個(gè)程序范圍內(nèi)變量名必須唯一。
使用示例:
GBLA Test1 ; 定義一個(gè)全局的數(shù)字變量,變量名為 Test1。
Test1 SETA 0xaa ; 將該變量賦值為0xaa。
GBLL Test2 ; 定義一個(gè)全局的邏輯變量,變量名為 Test2。
Test2 SETL {TRUE} ;將該變量賦值為真。
GBLS Test3 ; 定義一個(gè)全局的字符串變量,變量名為 Test3。
Test3 SETS “Testing” ;將該變量賦值為"Testing”。
2、LCLA、LCLL 和LCLS
語(yǔ)法格式:
LCLA (LCLL 或 LCLS )局部變量名
LCLA 、LCLL 和LCLS 偽指令用于定義一個(gè)ARM 程序中的局部變量,并將其初始化。其中:
LCLA偽指令用于定義一個(gè)局部的數(shù)字變量,并初始化為0 ;
LCLL偽指令用于定義一個(gè)局部的邏輯變量,并初始化為F(假);
LCLS偽指令用于定義一個(gè)局部的字符串變量,并初始化為空;
以上三條偽指令用于聲明局部變量,在其作用范圍內(nèi)變量名必須唯一。
使用示例:
LCLA Test4 ; 聲明一個(gè)局部的數(shù)字變 量,變量名為T(mén)est4。
Test3 SETA 0xaa ; 將該變量賦值為0xaa。
LCLL Test5 ; 聲明一個(gè)局部的邏輯變 量,變量名為T(mén)est5。
Test4 SETL {TRUE} ;將該變量賦值為真。
LCLS Test6 ; 定義一個(gè)局部的字 符串變量,變量名為T(mén)est6。
Test6 SETS “Testing” ;將該變量賦值為 "Testing”。
3、SETA、SETL 和SETS
語(yǔ)法格式:
變量名 SETA (SETL 或 SETS )表達(dá)式
偽指令 SETA 、SETL 、SETS 用于給一個(gè)已經(jīng)定義的全局變量或局部變量賦值。
SETA偽指令用于給一個(gè)數(shù)學(xué)變量賦值;
SETL偽指令用于給一個(gè)邏輯變量賦值;
SETS偽指令用于給一個(gè)字符串變量賦值;
其中,變量名為已經(jīng)定義過(guò)的全局變量或局部變量,表達(dá)式為將要賦給變量的值。
使用示例:
LCLA Test3 ; 聲明一個(gè)局部的數(shù)字變量,變量名為 Test3。
Test3 SETA 0xaa ; 將該變量賦值為0xaa。
LCLL Test4 ; 聲明一個(gè)局部的邏輯變量,變量名為 Test4。
Test4 SETL {TRUE} ;將該變量賦值為真。
4 、RLIST
語(yǔ)法格式:
名稱(chēng) RLIST { 寄存器列表 }
RLIST偽指令可用于對(duì)一個(gè)通用寄存器列表定義名稱(chēng),使用該偽指令定義的名稱(chēng)可在ARM 指令 LDM/STM中使用。在LDM/STM指令中,列表中的寄存器訪(fǎng)問(wèn)次序?yàn)楦鶕?jù)寄存器的編號(hào)由低到高,而與列表中的寄存器排列次序無(wú)關(guān)。
使用示例:
RegList RLIST {R0-R5 ,R8 ,R10} ;將寄存器列表名稱(chēng)定義為 RegList ,可在ARM指令LDM/STM中通過(guò)該名稱(chēng)訪(fǎng)問(wèn)寄存器列表。
二、數(shù)據(jù)定義(Data Definition)偽指令
數(shù)據(jù)定義偽指令一般用于為特定的數(shù)據(jù)分配存儲(chǔ)單元,同時(shí)可完成已分配存儲(chǔ)單元的初始化。
常見(jiàn)的數(shù)據(jù)定義偽指令有如下幾種:
— DCB 用于分配一片連續(xù)的字節(jié)存儲(chǔ)單元并用指定的數(shù)據(jù)初始化。
— DCW(DCWU)用于分配一片連續(xù)的半字存儲(chǔ)單元并用指定的數(shù)據(jù)初始化。
— DCD (DCDU)用于分配一片連續(xù)的字存儲(chǔ)單元并用指定的數(shù)據(jù)初始化。
— DCFD(DCFDU)用于為雙精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用指定的數(shù)據(jù)初始化。
— DCFS(DCFSU)用于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用指定的數(shù)據(jù)初始化。
— DCQ(DCQU)用于分配一片以8字節(jié)為單位的連續(xù)的存儲(chǔ)單元并用指定的數(shù)據(jù)初始化。
— SPACE 用于分配一片連續(xù)的存儲(chǔ)單元。
— MAP 用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址。
— FIELD 用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域。
1、DCB
語(yǔ)法格式:
標(biāo)號(hào) DCB 表達(dá)式
DCB偽指令用于分配一片連續(xù)的字節(jié)存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化。其中,表達(dá)式可以為0~255的數(shù)字或字符串。DCB 也可用“=”代替。
使用示例:
Str DCB “This is a test” ;分配一片連續(xù)的字節(jié)存儲(chǔ)單元并初始化。
2、DCW(或DCWU)
語(yǔ)法格式:
標(biāo)號(hào) DCW (或DCWU) 表達(dá)式
DCW(或DCWU)偽指令用于分配一片連續(xù)的半字存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化。
其中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)字表達(dá)式。
用DCW分配的字存儲(chǔ)單元是半字對(duì)齊的,而用DCWU分配的字存儲(chǔ)單元并不嚴(yán)格半字對(duì)齊。
使用示例:
DataTest DCW 1 ,2 ,3 ;分配一片連續(xù)的半字存儲(chǔ)單元并初始化。
3、DCD(或DCDU)
語(yǔ)法格式:
標(biāo)號(hào) DCD(或DCDU) 表達(dá)式
DCD(或DCDU)偽指令用于分配一片連續(xù)的字存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化。其中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)字表達(dá)式。DCD也可用"&” 代替。
用DCD分配的字存儲(chǔ)單元是字對(duì)齊的,而用DCDU分配的字存儲(chǔ)單元并不嚴(yán)格字對(duì)齊。
使用示例:
DataTest DCD 4 ,5 ,6 ;分配一片連續(xù)的字存儲(chǔ)單元并初始化。
4、DCFD(或DCFDU)
語(yǔ)法格式:
標(biāo)號(hào) DCFD(或DCFDU) 表達(dá)式
DCFD(或DCFDU)偽指令用于為雙精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化。每個(gè)雙精度的浮點(diǎn)數(shù)占據(jù)兩個(gè)字單元。用DCFD分配的字存儲(chǔ)單元是字對(duì)齊的,而用DCFDU分配的字存儲(chǔ)單元并不嚴(yán)格字對(duì)齊。
使用示例: FDataTest DCFD 2E115 ,-5E7 ;分配一片連續(xù)的字存儲(chǔ)單元并初始化 為指定的雙精度數(shù)。
5、DCFS(或DCFSU)
語(yǔ)法格式:
標(biāo)號(hào) DCFS(或DCFSU) 表達(dá)式
DCFS(或DCFSU)偽指令用于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化。每個(gè)單精度的浮點(diǎn)數(shù)占據(jù)一個(gè)字單元。用DCFS分配的字存儲(chǔ)單元是字對(duì)齊的,而用DCFSU分配的字存儲(chǔ)單元并不嚴(yán)格字對(duì)齊。
使用示例:
FDataTest DCFS 2E5 ,-5E -7 ;分配一片連續(xù)的字存儲(chǔ)單元并初始化為 指定的單精度數(shù)。
6、DCQ(或DCQU)
語(yǔ)法格式:
標(biāo)號(hào) DCQ(或DCQU) 表達(dá)式
DCQ(或DCQU)偽指令用于分配一片以8個(gè)字節(jié)(雙字)為單位的連續(xù)存儲(chǔ)區(qū)域并用偽指令中指定的表達(dá)式 初始化。 用DCQ分配的存儲(chǔ)單元是字對(duì)齊的,而用DCQU 分配的存儲(chǔ)單元并不嚴(yán)格字對(duì)齊。
使用示例:
DataTest DCQ 100 ;分配一片連續(xù)的存儲(chǔ)單元并初始化為指定的值。
7、SPACE
語(yǔ)法格式:
標(biāo)號(hào) SPACE 表達(dá)式
SPACE偽指令用于分配一片連續(xù)的存儲(chǔ)區(qū)域并初始化為0 。其中,表達(dá)式為要分配的字節(jié)數(shù)。
SPACE也可用“ % ”代替。
使用示例:
DataSpace SPACE 100 ;分配連續(xù)100字節(jié)的存儲(chǔ)單元并初始化為0 。
8、MAP
語(yǔ)法格式:
MAP 表達(dá)式 { ,基址寄存器 }
MAP偽指令用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址。MAP也可用“^” 代替。
表達(dá)式可以為程序中的標(biāo)號(hào)或數(shù)學(xué)表達(dá)式,基址寄存器為可選項(xiàng),當(dāng)基址寄存器選項(xiàng)不存在時(shí),表達(dá)式的值即為內(nèi)存表的首地址,當(dāng)該選項(xiàng)存在時(shí),內(nèi)存表的首地址 為表達(dá)式的值與基址寄存器的和。
MAP偽指令通常與FIELD偽指令配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。
使用示例:
MAP 0x100 ,R0 ;定義結(jié)構(gòu)化內(nèi)存表首地址的值為0x100+R0 。
9、FILED
語(yǔ)法格式:
標(biāo)號(hào) FIELD 表達(dá)式
FIELD偽指令用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。FILED 也可用“#” 代替。
表達(dá)式的值為當(dāng)前數(shù)據(jù)域在內(nèi)存表中所占的字節(jié)數(shù)。
FIELD偽指令常與MAP偽指令配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。MAP偽指令定義內(nèi)存表的首地址,F(xiàn)IELD偽指令定義內(nèi)存表中的各個(gè)數(shù)據(jù)域,并可以為 每個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)號(hào)供其他的指令引用。
注意MAP和FIELD偽指令僅用于定義數(shù)據(jù)結(jié)構(gòu),并不實(shí)際分配存儲(chǔ)單元。
使用示例:
MAP 0x100 ; 定義結(jié)構(gòu)化內(nèi)存表首地址的值為0x100。
A FIELD 16 ; 定義A的長(zhǎng)度為16字節(jié),位置為0x100。
B FIELD 32 ; 定義B的長(zhǎng)度為32字節(jié),位置為0x110。
S FIELD 256 ;定義S的長(zhǎng)度為256字節(jié),位置為0x130。
三、匯編控制(Assembly Control)偽指令
匯編控制偽指令用于控制匯編程序的執(zhí)行流程,常用的匯編控制偽指令包括以下幾條:
— IF 、ELSE 、ENDIF
— WHILE 、WEND
— MACRO 、MEND
— MEXIT
1、IF、ELSE、ENDIF
語(yǔ)法格式:
IF 邏輯表達(dá)式
指令序列 1
ELSE
指令序列 2
ENDIF
IF 、ELSE 、ENDIF偽指令能根據(jù)條件的成立與否決定是否執(zhí)行某個(gè)指令序列。當(dāng)IF后面的邏輯表達(dá)式為真,則執(zhí)行指令序列1 ,否則執(zhí)行指令序列2 。其中,ELSE及指令序列2可以沒(méi)有,此時(shí),當(dāng)IF后面的邏輯表達(dá)式為真,則執(zhí)行指令序列1 ,否則繼續(xù)執(zhí)行后面的指令。
IF 、ELSE 、ENDIF偽指令可以嵌套使用。
使用示例:
GBLL Test ;聲明一個(gè)全局的邏輯變量,變量名為T(mén)est
IF Test = TRUE
指令序列 1
ELSE
指令序列 2
ENDIF
2、WHILE、WEND
語(yǔ)法格式:
WHILE 邏輯表達(dá)式
指令序列
WEND
WHILE 、WEND偽指令能根據(jù)條件的成立與否決定是否循環(huán)執(zhí)行某個(gè)指令序列。當(dāng)WHILE后面的邏輯表達(dá)式為真,則執(zhí)行指令序列,該指令序列執(zhí)行完畢后,再判斷 邏輯表達(dá)式的值,若為真則繼續(xù)執(zhí)行,一直到邏輯表達(dá)式的值為假。
WHILE 、WEND偽指令可以嵌套使用。
使用示例:
GBLA Counter ; 聲明一個(gè)全局的數(shù)學(xué)變量,變量名為Counter
Counter SETA 3 ;由變量Counter 控制循環(huán)次數(shù)
……
WHILE Counter < 10
指令序列
WEND
3、MACRO、MEND
語(yǔ)法格式:
$ 標(biāo)號(hào) 宏名 $ 參數(shù) 1 ,$ 參數(shù) 2 ,……
指令序列
MEND
MACRO 、MEND偽指令可以將一段代碼定義為一個(gè)整體,稱(chēng)為宏指令,然后就可以在程序中通過(guò)宏指令多次調(diào)用該段代碼。其中,$標(biāo)號(hào)在宏指令被展開(kāi)時(shí),標(biāo)號(hào)會(huì)被替 換為用戶(hù)定義的符號(hào),宏指令可以使用一個(gè)或多個(gè)參數(shù),當(dāng)宏指令被展開(kāi)時(shí),這些參數(shù)被相應(yīng)的值替換。
宏指令的使用方式和功能與子程序有些相似,子程序可以提供模塊化的程序設(shè)計(jì)、節(jié)省存儲(chǔ)空間并提高運(yùn)行速度。但在使用子程序結(jié)構(gòu)時(shí)需要保護(hù)現(xiàn)場(chǎng),從而增加了 系統(tǒng)的開(kāi)銷(xiāo),因此,在代碼較短且需要傳遞的參數(shù)較多時(shí),可以使用宏指令代替子程序。
包含在MACRO和MEND之間的指令序列稱(chēng)為宏定義體,在宏定義體的第一行應(yīng)聲明宏的原型(包含宏名、所需的參數(shù)),然后就可以在匯編程序中通過(guò)宏名來(lái)調(diào)用該指令序列。在源程序被編譯時(shí),匯編器將宏調(diào)用展開(kāi),用宏定義中的指令序列代替程序中的宏調(diào)用,并將實(shí)際參數(shù)的值傳遞給宏定義中的形式參數(shù)。
MACRO、MEND偽指令可以嵌套使用。
4、MEXIT
語(yǔ)法格式:
MEXIT
MEXIT用于從宏定義中跳轉(zhuǎn)出去。
四、其他常用的偽指令
還有一些其他的偽指令,在匯編程序中經(jīng)常會(huì)被使用,包括以下幾條:
— AREA
— ALIGN
— CODE16 、CODE32
— ENTRY
— END
— EQU
— EXPORT(或GLOBAL )
— IMPORT
— EXTERN
— GET(或INCLUDE )
— INCBIN
— RN
— ROUT
1、AREA
語(yǔ)法格式:
AREA 段名 屬性1 ,屬性2 ,……
AREA偽指令用于定義一個(gè)代碼段或數(shù)據(jù)段。其中,段名若以數(shù)字開(kāi)頭,則該段名需用“|”括起來(lái),如:|1_test| 。
屬性字段表示該代碼段(或數(shù)據(jù)段)的相關(guān)屬性,多個(gè)屬性用逗號(hào)分隔。常用的屬性如下:
— CODE 屬性:用于定義代碼段,默認(rèn)為READONLY 。
— DATA 屬性:用于定義數(shù)據(jù)段,默認(rèn)為READWRITE 。
— READONLY 屬性:指定本段為只讀,代碼段默認(rèn)為READONLY 。
— READWRITE 屬性:指定本段為可讀可寫(xiě),數(shù)據(jù)段的默認(rèn)屬性為READWRITE 。
— ALIGN 屬性:使用方式為ALIGN表達(dá)式。在默認(rèn)時(shí),ELF(可執(zhí)行連接文件)的代碼段和數(shù)據(jù)段是按字對(duì)齊的,表達(dá)式的取值范圍為0~31,相應(yīng)的對(duì)齊方式為2 表達(dá)式次方。
— COMMON 屬性:該屬性定義一個(gè)通用的段,不包含任何的用戶(hù)代碼和數(shù)據(jù)。各源文件中同名的COMMON段共享同一段存儲(chǔ)單元。
一個(gè)匯編語(yǔ)言程序至少要包含一個(gè)段,當(dāng)程序太長(zhǎng)時(shí),也可以將程序分為多個(gè)代碼段和數(shù)據(jù)段。
使用示例:
AREA Init ,CODE ,READONLY ; 該偽指令定義了一個(gè)代碼段,段 名為Init ,屬性為只讀。
2、ALIGN
語(yǔ)法格式:
ALIGN { 表達(dá)式 { ,偏移量 }}
ALIGN偽指令可通過(guò)添加填充字節(jié)的方式,使當(dāng)前位置滿(mǎn)足一定的對(duì)齊方式。其中,表達(dá)式的值用于指定對(duì)齊方式,可能的取值為2的冪,如1 、2 、4 、8、16 等。若未指定表達(dá)式,則將當(dāng)前位置對(duì)齊到下一個(gè)字的位置。偏移量也為一個(gè)數(shù)字表達(dá)式,若使用該字段,則當(dāng)前位置的對(duì)齊方式為:2的表達(dá)式次冪+偏移 量。
使用示例:
AREA Init ,CODE ,READONLY ,ALIEN=3 ;指定后面的指令為8 字節(jié)對(duì)齊。
指令序列
END
3、CODE16、CODE32
語(yǔ)法格式:
CODE16(或CODE32)
CODE16偽指令通知編譯器,其后的指令序列為16位的Thumb指令。
CODE32偽指令通知編譯器,其后的指令序列為32位的ARM指令。
若在匯編源程序中同時(shí)包含ARM指令和Thumb指令時(shí),可用CODE16偽指令通知編譯器其后的指令序列為16位的Thumb指令,CODE32偽指令 通知編譯器其后的指令序列為32位的ARM指令。因此,在使用ARM指令和Thumb指令混合編程的代碼里,可用這兩條偽指令進(jìn)行切換,但注意他們只通知 編譯器其后指令的類(lèi)型,并不能對(duì)處理器進(jìn)行狀態(tài)的切換。
使用示例:
AREA Init ,CODE ,READONLY ……
CODE32 ; 通知編譯器其后的指令為32位的 ARM指令
LDR R0 ,=NEXT+1 ;將跳轉(zhuǎn)地址放入寄存器R0
BX R0 ; 程序跳轉(zhuǎn)到新的位置執(zhí)行, 并將處理器切換到Thumb工作狀態(tài)
……
CODE16 ; 通知編譯器其后的指令為16位的 Thumb指令
NEXT LDR R3,=0x3FF
……
END ;
4、ENTRY
語(yǔ)法格式:
ENTRY
ENTRY偽指令用于指定匯編程序的入口點(diǎn)。在一個(gè)完整的匯編程序中至少要有一個(gè)ENTRY(也可以有多個(gè),當(dāng)有多個(gè)ENTRY時(shí),程序的真正入口點(diǎn)由鏈 接器指定),但在一個(gè)源文件里最多只能有一個(gè)ENTRY(可以沒(méi)有)。
使用示例:
AREA Init ,CODE ,READONLY
ENTRY ; 指定應(yīng)用程序的入口點(diǎn)
……
5、END
語(yǔ)法格式:
END
END偽指令用于通知編譯器已經(jīng)到了源程序的結(jié)尾。
使用示例:
AREA Init ,CODE ,READONLY
……
END ;指定應(yīng)用程序的結(jié)尾
6、EQU
語(yǔ)法格式:
名稱(chēng) EQU 表達(dá)式 { ,類(lèi)型 }
EQU偽指令用于為程序中的常量、標(biāo)號(hào)等定義一個(gè)等效的字符名稱(chēng),類(lèi)似于C語(yǔ)言中的#define 。其中EQU可用“*”代替。名稱(chēng)為EQU偽指令定義的字符名稱(chēng),當(dāng)表達(dá)式為32位的常量時(shí),可以指定 表達(dá)式的數(shù)據(jù)類(lèi)型,可以有以下三種類(lèi)型:
CODE16 、CODE32 和DATA
使用示例:
Test EQU 50 ; 定義標(biāo)號(hào)Test 的值為50。
Addr EQU 0x55 ,CODE32 ; 定義Addr的值為0x55 ,且該處為32位的ARM指令。
7、EXPORT(或GLOBAL)
語(yǔ)法格式:
EXPORT 標(biāo)號(hào) {[WEAK]}
EXPORT偽指令用于在程序中聲明一個(gè)全局的標(biāo)號(hào),該標(biāo)號(hào)可在其他的文件中引用。EXPORT 可用GLOBAL代替。標(biāo)號(hào)在程序中區(qū)分大小寫(xiě),[WEAK] 選項(xiàng)聲明其他的同名標(biāo)號(hào)優(yōu)先于該標(biāo)號(hào)被引用。
使用示例:
AREA Init ,CODE ,READONLY
EXPORT Stest ;聲明一個(gè)可全局引用的標(biāo)號(hào)Stest
END
8、IMPORT
語(yǔ)法格式:
IMPORT 標(biāo)號(hào) {[WEAK]}
IMPORT偽指令用于通知編譯器要使用的標(biāo)號(hào)在其他的源文件中定義,但要在當(dāng)前源文件中引用,而且無(wú)論當(dāng)前源文件是否引用該標(biāo)號(hào),該標(biāo)號(hào)均會(huì)被加入到當(dāng)前源文件的符號(hào)表中。標(biāo) 號(hào)在程序中區(qū)分大小寫(xiě),[WEAK] 選項(xiàng)表示當(dāng)所有的源文件都沒(méi)有定義這樣一個(gè)標(biāo)號(hào)時(shí),編譯器也不給出錯(cuò)誤信息,在多數(shù)情況下將該標(biāo)號(hào)置為0 ,若該標(biāo)號(hào)為B或BL指令引用,則將B或BL指令置為NOP操作。
使用示例:
AREA Init ,CODE ,READONLY
IMPORT Main ;通知編譯器當(dāng)前文件要引用標(biāo)號(hào)Main,但Main在其他源文件中定 義。
END
9、EXTERN
語(yǔ)法格式:
EXTERN 標(biāo)號(hào) {[WEAK]}
EXTERN偽指令用于通知編譯器要使用的標(biāo)號(hào)在其他的源文件中定義,但要在當(dāng)前源文件中引用,如果當(dāng)前源文件實(shí)際并未引用該標(biāo)號(hào),該 標(biāo)號(hào)就不會(huì)被加入到當(dāng)前源文件的符號(hào)表中。標(biāo)號(hào)在程序中區(qū)分大小寫(xiě), [WEAK] 選項(xiàng)表示當(dāng)所有的源文件都沒(méi)有定義這樣一個(gè)標(biāo)號(hào)時(shí),編譯器也不給出錯(cuò)誤信息,在多數(shù)情況下將該標(biāo)號(hào)置為0 ,若該標(biāo)號(hào)為B或BL指令引用,則將B或BL指令置為NOP操作。
使用示例:
AREA Init ,CODE ,READONLY
EXTERN Main ;通知編譯器當(dāng)前文件要引用標(biāo)號(hào)Main,但Main在其他源文件中定 義。
END
10、GET(或INCLUDE)
語(yǔ)法格式:
GET 文件名
GET偽指令用于將一個(gè)源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置進(jìn)行匯編處理。可 以使用INCLUDE代替GET。
匯編程序中常用的方法是在某源文件中定義一些宏指令,用EQU定義常量的符號(hào)名稱(chēng),用MAP和FIELD定義結(jié)構(gòu)化的數(shù)據(jù)類(lèi)型,然后用GET偽指令將這個(gè) 源文件包含到其他的源文件中。使用方法與C 語(yǔ)言中的"include” 相似。
GET偽指令只能用于包含源文件,包含目標(biāo)文件需要使用INCBIN偽指令
使用示例:
AREA Init ,CODE ,READONLY
GET a1.s ; 通知編譯器當(dāng)前源文件包含源文件a1.s
GET C:\a2.s ; 通知編譯器當(dāng)前源文件包含源文件C:\a2.s
END
11、INCBIN
語(yǔ)法格式:
INCBIN 文件名
INCBIN偽指令用于將一個(gè)目標(biāo)文件或數(shù)據(jù)文件包含到當(dāng)前的源文件中,被包含的文件不作任何變動(dòng)的存放在當(dāng)前文件中,編譯器從其后開(kāi)始繼續(xù)處理。
使用示例:
AREA Init ,CODE ,READONLY
INCBIN a1.dat ; 通知編譯器當(dāng)前源文件包含文件a1.dat
INCBIN C:\a2.txt ;通知編譯器當(dāng)前源文件包含文件C:\a2.txt
END
12、RN
語(yǔ)法格式:
名稱(chēng) RN 表達(dá)式
RN偽指令用于給一個(gè)寄存器定義一個(gè)別名。采用這種方式可以方便程序員記憶該寄存器的功能。其中,名稱(chēng)為給寄存器定義的別名,表達(dá)式為寄存器的編碼。
使用示例:
Temp RN R0 ;將R0定義一個(gè)別名Temp
13、ROUT
語(yǔ)法格式:
{名稱(chēng)} ROUT
ROUT偽指令用于給一個(gè)局部變量定義作用范圍。在程序中未使用該偽指令時(shí),局部 變量的作用范圍為所在的AREA,而使用ROUT后,局部變量的作為范圍為當(dāng)前ROUT和下一個(gè)ROUT之間。
3. BNE 與 BEQ
TST R0, #0X8
BNE SuspendUp ;BNE指令是“不相等(或不為0)跳轉(zhuǎn)指令”:
LDR R1,#0x00000000
先進(jìn)行and運(yùn)算,如果R0的第四位不為1,則結(jié)果為零,則設(shè)置zero=1(繼續(xù)下面的LDR指令);
否則,如果R0的第四位為1,zero=0(跳到SuspendUp處執(zhí)行)。
tst 和bne連用: 先是用tst進(jìn)行位與運(yùn)算,然后將位與的結(jié)果與0比較,如果不為0,則跳到bne緊跟著的標(biāo)記(如bne sleep,則跳到sleep處)。
tst 和beq連用: 先是用tst進(jìn)行位與運(yùn)算,然后將位與的結(jié)果與0比較,如果為0,則跳到beq緊跟著的標(biāo)記(如bne AAAA,則跳到AAAA處)。
|
|