ARM微處理器的指令系統(tǒng)_第1頁(yè)
ARM微處理器的指令系統(tǒng)_第2頁(yè)
ARM微處理器的指令系統(tǒng)_第3頁(yè)
ARM微處理器的指令系統(tǒng)_第4頁(yè)
ARM微處理器的指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第3章ARM微處理器的指令系統(tǒng)本章介紹ARM指令集、Thumb指令集,以及各類指令對(duì)應(yīng)的尋址方式,通過對(duì)本章的閱讀,希望讀者能了解ARM微處理器所支持的指令集及具體的使用方法。本章的主要內(nèi)容有:ARM指令集、Thumb指令集概述。ARM指令集的分類與具體應(yīng)用。Thumb指令集簡(jiǎn)介及應(yīng)用場(chǎng)合。3.1ARM微處理器的指令集概述3.1.1ARM微處理器的指令的分類與格式ARM微處理器的指令集是加載/存儲(chǔ)型的,也即指令集僅能處理寄存器中的數(shù)據(jù),而且處理結(jié)果都要放回寄存器中,而對(duì)系統(tǒng)存儲(chǔ)器的訪問則需要通過專門的加載/存儲(chǔ)指令來完成。ARM微處理器的指令集可以分為跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器(P

2、SR)處理指令、加載/存儲(chǔ)指令、協(xié)處理器指令和異常產(chǎn)生指令六大類,具體的指令及功能如表3-1所示(表中指令為基本ARM指令,不包括派生的ARM指令)。表3-1ARM指令及功能描述助記符指令功能描述ADC帶進(jìn)位加法指令A(yù)DD加法指令A(yù)ND邏輯與指令B跳轉(zhuǎn)指令BIC位清零指令BL帶返回的跳轉(zhuǎn)指令BLX帶返回和狀態(tài)切換的跳轉(zhuǎn)指令BX帶狀態(tài)切換的跳轉(zhuǎn)指令CDP協(xié)處理器數(shù)據(jù)操作指令CMN比較反值指令CMP比較指令EOR異或指令LDC存儲(chǔ)器到協(xié)處理器的數(shù)據(jù)傳輸指令LDM加載多個(gè)寄存器指令LDR存儲(chǔ)器到寄存器的數(shù)據(jù)傳輸指令MCR從ARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳輸指令MLA乘加運(yùn)算指令MOV數(shù)據(jù)傳送指令

3、MRC從協(xié)處理器寄存器到ARM寄存器的數(shù)據(jù)傳輸指令MRS傳送CPSR或SPSR的內(nèi)容到通用寄存器指令MSR傳送通用寄存器到CPSR或SPSR的指令MUL32位乘法指令MLA32位乘加指令MVN數(shù)據(jù)取反傳送指令ORR邏輯或指令RSB逆向減法指令RSC帶借位的逆向減法指令SBC帶借位減法指令STC協(xié)處理器寄存器寫入存儲(chǔ)器指令STM批量?jī)?nèi)存字寫入指令STR寄存器到存儲(chǔ)器的數(shù)據(jù)傳輸指令SUB減法指令SWI軟件中斷指令SWP交換指令TEQ相等測(cè)試指令TST位測(cè)試指令3.1.2指令的條件域當(dāng)處理器工作在ARM狀態(tài)時(shí),幾乎所有的指令均根據(jù)CPSR中條件碼的狀態(tài)和指令的條件域有條件的執(zhí)行。當(dāng)指令的執(zhí)行條件滿足

4、時(shí),指令被執(zhí)行,否則指令被忽略。每一條ARM指令包含4位的條件碼,位于指令的最高4位31:28。條件碼共有16種,每種條件碼可用兩個(gè)字符表示,這兩個(gè)字符可以添加在指令助記符的后面和指令同時(shí)使用。例如,跳轉(zhuǎn)指令B可以加上后綴EQ變?yōu)锽EQ表示"相等則跳轉(zhuǎn)",即當(dāng)CPSR中的Z標(biāo)志置位時(shí)發(fā)生跳轉(zhuǎn)。在16種條件標(biāo)志碼中,只有15種可以使用,如表3-2所示,第16種(1111)為系統(tǒng)保留,暫時(shí)不能使用。表3-2指令的條件碼條件碼助記符后綴標(biāo)志含義0000EQZ置位相等0001NEZ清零不相等0010CSC置位無符號(hào)數(shù)大于或等于0011CCC清零無符號(hào)數(shù)小于0100MIN置位負(fù)數(shù)01

5、01PLN清零正數(shù)或零0110VSV置位溢出0111VCV清零未溢出1000HIC置位Z清零無符號(hào)數(shù)大于1001LSC清零Z置位無符號(hào)數(shù)小于或等于1010GEN等于V帶符號(hào)數(shù)大于或等于1011LTN不等于V帶符號(hào)數(shù)小于1100GTZ清零且(N等于V)帶符號(hào)數(shù)大于1101LEZ置位或(N不等于V)帶符號(hào)數(shù)小于或等于1110AL忽略無條件執(zhí)行3.2ARM指令的尋址方式所謂尋址方式就是處理器根據(jù)指令中給出的地址信息來尋找物理地址的方式。目前ARM指令系統(tǒng)支持如下幾種常見的尋址方式。3.2.1立即尋址立即尋址也叫立即數(shù)尋址,這是一種特殊的尋址方式,操作數(shù)本身就在指令中給出,只要取出指令也就取到了操作數(shù)

6、。這個(gè)操作數(shù)被稱為立即數(shù),對(duì)應(yīng)的尋址方式也就叫做立即尋址。例如以下指令:ADDR0,R0,1;R0R01ADDR0,R0,0x3f;R0R00x3f在以上兩條指令中,第二個(gè)源操作數(shù)即為立即數(shù),要求以""為前綴,對(duì)于以十六進(jìn)制表示的立即數(shù),還要求在""后加上"0x"或"&"。3.2.2寄存器尋址寄存器尋址就是利用寄存器中的數(shù)值作為操作數(shù),這種尋址方式是各類微處理器經(jīng)常采用的一種方式,也是一種執(zhí)行效率較高的尋址方式。以下指令:ADDR0,R1,R2;R0R1R2該指令的執(zhí)行效果是將寄存器R1和R2的內(nèi)容相加,其

7、結(jié)果存放在寄存器R0中。3.2.2寄存器間接尋址寄存器間接尋址就是以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲(chǔ)器中。例如以下指令:ADDR0,R1,R2;R0R1R2LDRR0,R1;R0R1STRR0,R1;R1R0在第一條指令中,以寄存器R2的值作為操作數(shù)的地址,在存儲(chǔ)器中取得一個(gè)操作數(shù)后與R1相加,結(jié)果存入寄存器R0中。第二條指令將以R1的值為地址的存儲(chǔ)器中的數(shù)據(jù)傳送到R0中。第三條指令將R0的值傳送到以R1的值為地址的存儲(chǔ)器中。3.2.3基址變址尋址基址變址尋址就是將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個(gè)操作數(shù)的有效地址。變址尋址

8、方式常用于訪問某基地址附近的地址單元。采用變址尋址方式的指令常見有以下幾種形式,如下所示:LDRR0,R1,4;R0R14LDRR0,R1,4!;R0R14、R1R14LDRR0,R1,4;R0R1、R1R14LDRR0,R1,R2;R0R1R2在第一條指令中,將寄存器R1的內(nèi)容加上4形成操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器R0中。在第二條指令中,將寄存器R1的內(nèi)容加上4形成操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器R0中,然后,R1的內(nèi)容自增4個(gè)字節(jié)。在第三條指令中,以寄存器R1的內(nèi)容作為操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器R0中,然后,R1的內(nèi)容自增4個(gè)字節(jié)。在第四條指令中,將

9、寄存器R1的內(nèi)容加上寄存器R2的內(nèi)容形成操作數(shù)的有效地址,從而取得操作數(shù)存入寄存器R0中。3.2.4多寄存器尋址采用多寄存器尋址方式,一條指令可以完成多個(gè)寄存器值的傳送。這種尋址方式可以用一條指令完成傳送最多16個(gè)通用寄存器的值。以下指令:LDMIAR0,R1,R2,R3,R4;R1R0;R2R04;R3R08;R4R012該指令的后綴IA表示在每次執(zhí)行完加載/存儲(chǔ)操作后,R0按字長(zhǎng)度增加,因此,指令可將連續(xù)存儲(chǔ)單元的值傳送到R1R4。3.2.5相對(duì)尋址與基址變址尋址方式相類似,相對(duì)尋址以程序計(jì)數(shù)器PC的當(dāng)前值為基地址,指令中的地址標(biāo)號(hào)作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。以下程序段

10、完成子程序的調(diào)用和返回,跳轉(zhuǎn)指令BL采用了相對(duì)尋址方式:BLNEXT;跳轉(zhuǎn)到子程序NEXT處執(zhí)行NEXTMOVPC,LR;從子程序返回3.2.6堆棧尋址堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進(jìn)后出(FirstInLastOut,F(xiàn)ILO)的方式工作,使用一個(gè)稱作堆棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向棧頂。當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時(shí),稱為滿堆棧(FullStack),而當(dāng)堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置時(shí),稱為空堆棧(EmptyStack)。同時(shí),根據(jù)堆棧的生成方式,又可以分為遞增堆棧(AscendingStack)和遞減堆棧(DecendingStack),當(dāng)堆棧由低地址向高

11、地址生成時(shí),稱為遞增堆棧,當(dāng)堆棧由高地址向低地址生成時(shí),稱為遞減堆棧。這樣就有四種類型的堆棧工作方式,ARM微處理器支持這四種類型的堆棧工作方式,即:滿遞增堆棧:堆棧指針指向最后壓入的數(shù)據(jù),且由低地址向高地址生成。滿遞減堆棧:堆棧指針指向最后壓入的數(shù)據(jù),且由高地址向低地址生成??者f增堆棧:堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由低地址向高地址生成??者f減堆棧:堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由高地址向低地址生成。3.3ARM指令集本節(jié)對(duì)ARM指令集的六大類指令進(jìn)行詳細(xì)的描述。3.3.1跳轉(zhuǎn)指令跳轉(zhuǎn)指令用于實(shí)現(xiàn)程序流程的跳轉(zhuǎn),在ARM程序中有兩種方法可以實(shí)現(xiàn)程序流程的跳轉(zhuǎn):-使用專

12、門的跳轉(zhuǎn)指令。-直接向程序計(jì)數(shù)器PC寫入跳轉(zhuǎn)地址值。通過向程序計(jì)數(shù)器PC寫入跳轉(zhuǎn)地址值,可以實(shí)現(xiàn)在4GB的地址空間中的任意跳轉(zhuǎn),在跳轉(zhuǎn)之前結(jié)合使用MOVLR,PC等類似指令,可以保存將來的返回地址值,從而實(shí)現(xiàn)在4GB連續(xù)的線性地址空間的子程序調(diào)用。ARM指令集中的跳轉(zhuǎn)指令可以完成從當(dāng)前指令向前或向后的32MB的地址空間的跳轉(zhuǎn),包括以下4條指令:-B跳轉(zhuǎn)指令-BL帶返回的跳轉(zhuǎn)指令-BLX帶返回和狀態(tài)切換的跳轉(zhuǎn)指令-BX帶狀態(tài)切換的跳轉(zhuǎn)指令1、B指令B指令的格式為:B條件目標(biāo)地址B指令是最簡(jiǎn)單的跳轉(zhuǎn)指令。一旦遇到一個(gè)B指令,ARM處理器將立即跳轉(zhuǎn)到給定的目標(biāo)地址,從那里繼續(xù)執(zhí)行。注意存儲(chǔ)在跳轉(zhuǎn)指令

13、中的實(shí)際值是相對(duì)當(dāng)前PC值的一個(gè)偏移量,而不是一個(gè)絕對(duì)地址,它的值由匯編器來計(jì)算(參考尋址方式中的相對(duì)尋址)。它是24位有符號(hào)數(shù),左移兩位后有符號(hào)擴(kuò)展為32位,表示的有效偏移為26位(前后32MB的地址空間)。以下指令:BLabel;程序無條件跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行CMPR1,0;當(dāng)CPSR寄存器中的Z條件碼置位時(shí),程序跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行BEQLabel2、BL指令BL指令的格式為:BL條件目標(biāo)地址BL是另一個(gè)跳轉(zhuǎn)指令,但跳轉(zhuǎn)之前,會(huì)在寄存器R14中保存PC的當(dāng)前內(nèi)容,因此,可以通過將R14的內(nèi)容重新加載到PC中,來返回到跳轉(zhuǎn)指令之后的那個(gè)指令處執(zhí)行。該指令是實(shí)現(xiàn)子程序調(diào)用的一個(gè)基

14、本但常用的手段。以下指令:BLLabel;當(dāng)程序無條件跳轉(zhuǎn)到標(biāo)號(hào)Label處執(zhí)行時(shí),同時(shí)將當(dāng)前的PC值保存到R14中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í),可以通過BLX指令實(shí)現(xiàn)子程序的調(diào)用和處理器工作狀態(tài)的切換。同時(shí),子程序的返回可以通過將寄存器R14值復(fù)制到PC中來完成。4、BX指令BX指令的格式為:BX條件目標(biāo)地址BX指令跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,目標(biāo)地址處的

15、指令既可以是ARM指令,也可以是Thumb指令。3.3.2數(shù)據(jù)處理指令數(shù)據(jù)處理指令可分為數(shù)據(jù)傳送指令、算術(shù)邏輯運(yùn)算指令和比較指令等。數(shù)據(jù)傳送指令用于在寄存器和存儲(chǔ)器之間進(jìn)行數(shù)據(jù)的雙向傳輸。算術(shù)邏輯運(yùn)算指令完成常用的算術(shù)與邏輯的運(yùn)算,該類指令不但將運(yùn)算結(jié)果保存在目的寄存器中,同時(shí)更新CPSR中的相應(yīng)條件標(biāo)志位。比較指令不保存運(yùn)算結(jié)果,只更新CPSR中相應(yīng)的條件標(biāo)志位。數(shù)據(jù)處理指令包括:-MOV數(shù)據(jù)傳送指令-MVN數(shù)據(jù)取反傳送指令-CMP比較指令-CMN反值比較指令-TST位測(cè)試指令-TEQ相等測(cè)試指令-ADD加法指令-ADC帶進(jìn)位加法指令-SUB減法指令-SBC帶借位減法指令-RSB逆向減法指令

16、-RSC帶借位的逆向減法指令-AND邏輯與指令-ORR邏輯或指令-EOR邏輯異或指令-BIC位清除指令1、MOV指令MOV指令的格式為:MOV條件S目的寄存器,源操作數(shù)MOV指令可完成從另一個(gè)寄存器、被移位的寄存器或?qū)⒁粋€(gè)立即數(shù)加載到目的寄存器。其中S選項(xiàng)決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒有S時(shí)指令不更新CPSR中條件標(biāo)志位的值。指令示例:MOVR1,R0;將寄存器R0的值傳送到寄存器R1MOVPC,R14;將寄存器R14的值傳送到PC,常用于子程序返回MOVR1,R0,LSL3;將寄存器R0的值左移3位后傳送到R12、MVN指令MVN指令的格式為:MVN條件S目的寄存器,源

17、操作數(shù)MVN指令可完成從另一個(gè)寄存器、被移位的寄存器、或?qū)⒁粋€(gè)立即數(shù)加載到目的寄存器。與MOV指令不同之處是在傳送之前按位被取反了,即把一個(gè)被取反的值傳送到目的寄存器中。其中S決定指令的操作是否影響CPSR中條件標(biāo)志位的值,當(dāng)沒有S時(shí)指令不更新CPSR中條件標(biāo)志位的值。指令示例:MVNR0,0;將立即數(shù)0取反傳送到寄存器R0中,完成后R0=-13、CMP指令CMP指令的格式為:CMP條件操作數(shù)1,操作數(shù)2CMP指令用于把一個(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

18、的關(guān)系(大、小、相等),例如,當(dāng)操作數(shù)1大于操作操作數(shù)2,則此后的有GT后綴的指令將可以執(zhí)行。指令示例:CMPR1,R0;將寄存器R1的值與寄存器R0的值相減,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位CMPR1,100;將寄存器R1的值與立即數(shù)100相減,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位4、CMN指令CMN指令的格式為:CMN條件操作數(shù)1,操作數(shù)2CMN指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)取反后進(jìn)行比較,同時(shí)更新CPSR中條件標(biāo)志位的值。該指令實(shí)際完成操作數(shù)1和操作數(shù)2相加,并根據(jù)結(jié)果更改條件標(biāo)志位。指令示例:CMNR1,R0;將寄存器R1的值與寄存器R0的值相加,并根據(jù)結(jié)果設(shè)置CPSR

19、的標(biāo)志位CMNR1,100;將寄存器R1的值與立即數(shù)100相加,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位5、TST指令TST指令的格式為:TST條件操作數(shù)1,操作數(shù)2TST指令用于把一個(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è)位掩碼,該指令一般用來檢測(cè)是否設(shè)置了特定的位。指令示例:TSTR1,1;用于測(cè)試在寄存器R1中是否設(shè)置了最低位(表示二進(jìn)制數(shù))TSTR1,0xffe;將寄存器R1的值與立即數(shù)0xffe按位與,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位6、TEQ指令TEQ指令的格式為:TEQ條件操作數(shù)1,操作數(shù)

20、2TEQ指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行按位的異或運(yùn)算,并根據(jù)運(yùn)算結(jié)果更新CPSR中條件標(biāo)志位的值。該指令通常用于比較操作數(shù)1和操作數(shù)2是否相等。指令示例:TEQR1,R2;將寄存器R1的值與寄存器R2的值按位異或,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位7、ADD指令A(yù)DD指令的格式為:ADD條件S目的寄存器,操作數(shù)1,操作數(shù)2ADD指令用于把兩個(gè)操作數(shù)相加,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。指令示例:ADDR0,R1,R2;R0=R1+R2ADDR0,R1,#256;R0=R1+256ADDR0,R2

21、,R3,LSL#1;R0=R2+(R3<<1)8、ADC指令A(yù)DC指令的格式為:ADC條件S目的寄存器,操作數(shù)1,操作數(shù)2ADC指令用于把兩個(gè)操作數(shù)相加,再加上CPSR中的C條件標(biāo)志位的值,并將結(jié)果存放到目的寄存器中。它使用一個(gè)進(jìn)位標(biāo)志位,這樣就可以做比32位大的數(shù)的加法,注意不要忘記設(shè)置S后綴來更改進(jìn)位標(biāo)志。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。以下指令序列完成兩個(gè)128位數(shù)的加法,第一個(gè)數(shù)由高到低存放在寄存器R7R4,第二個(gè)數(shù)由高到低存放在寄存器R11R8,運(yùn)算結(jié)果由高到低存放在寄存器R3R0:ADDSR0,R4,R8;加低端的字ADC

22、SR1,R5,R9;加第二個(gè)字,帶進(jìn)位ADCSR2,R6,R10;加第三個(gè)字,帶進(jìn)位ADCR3,R7,R11;加第四個(gè)字,帶進(jìn)位9、SUB指令SUB指令的格式為:SUB條件S目的寄存器,操作數(shù)1,操作數(shù)2SUB指令用于把操作數(shù)1減去操作數(shù)2,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。指令示例:SUBR0,R1,R2;R0=R1-R2SUBR0,R1,#256;R0=R1-256SUBR0,R2,R3,LSL#1;R0=R2-(R3<<1)10、SBC指令SBC指令的格式為:S

23、BC條件S目的寄存器,操作數(shù)1,操作數(shù)2SBC指令用于把操作數(shù)1減去操作數(shù)2,再減去CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令使用進(jìn)位標(biāo)志來表示借位,這樣就可以做大于32位的減法,注意不要忘記設(shè)置S后綴來更改進(jìn)位標(biāo)志。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。指令示例:SUBSR0,R1,R2;R0=R1-R2-!C,并根據(jù)結(jié)果設(shè)置CPSR的進(jìn)位標(biāo)志位11、RSB指令RSB指令的格式為:RSB條件S目的寄存器,操作數(shù)1,操作數(shù)2RSB指令稱為逆向減法指令,用于把操作數(shù)2減去操作數(shù)1,并將結(jié)果

24、存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。指令示例:RSBR0,R1,R2;R0=R2-R1RSBR0,R1,#256;R0=256-R1RSBR0,R2,R3,LSL#1;R0=(R3<<1)-R212、RSC指令RSC指令的格式為:RSC條件S目的寄存器,操作數(shù)1,操作數(shù)2RSC指令用于把操作數(shù)2減去操作數(shù)1,再減去CPSR中的C條件標(biāo)志位的反碼,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令使用進(jìn)位標(biāo)志來表示借

25、位,這樣就可以做大于32位的減法,注意不要忘記設(shè)置S后綴來更改進(jìn)位標(biāo)志。該指令可用于有符號(hào)數(shù)或無符號(hào)數(shù)的減法運(yùn)算。指令示例:RSCR0,R1,R2;R0=R2-R1-!C13、AND指令A(yù)ND指令的格式為:AND條件S目的寄存器,操作數(shù)1,操作數(shù)2AND指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯與運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于屏蔽操作數(shù)1的某些位。指令示例:ANDR0,R0,3;該指令保持R0的0、1位,其余位清零。14、ORR指令ORR指令的格式為:ORR條件S目的寄存器,操作數(shù)1,操作數(shù)2ORR指令用于在兩

26、個(gè)操作數(shù)上進(jìn)行邏輯或運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于設(shè)置操作數(shù)1的某些位。指令示例:ORRR0,R0,3;該指令設(shè)置R0的0、1位,其余位保持不變。15、EOR指令EOR指令的格式為:EOR條件S目的寄存器,操作數(shù)1,操作數(shù)2EOR指令用于在兩個(gè)操作數(shù)上進(jìn)行邏輯異或運(yùn)算,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。該指令常用于反轉(zhuǎn)操作數(shù)1的某些位。指令示例:EORR0,R0,3;該指令反轉(zhuǎn)R0的0、1位,其余位保持不變。16、BIC指令B

27、IC指令的格式為:BIC條件S目的寄存器,操作數(shù)1,操作數(shù)2BIC指令用于清除操作數(shù)1的某些位,并把結(jié)果放置到目的寄存器中。操作數(shù)1應(yīng)是一個(gè)寄存器,操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。操作數(shù)2為32位的掩碼,如果在掩碼中設(shè)置了某一位,則清除這一位。未設(shè)置的掩碼位保持不變。指令示例:BICR0,R0,1011;該指令清除R0中的位0、1、和3,其余的位保持不變。3.3.3乘法指令與乘加指令A(yù)RM微處理器支持的乘法指令與乘加指令共有6條,可分為運(yùn)算結(jié)果為32位和運(yùn)算結(jié)果為64位兩類,與前面的數(shù)據(jù)處理指令不同,指令中的所有操作數(shù)、目的寄存器必須為通用寄存器,不能對(duì)操作數(shù)使用立即數(shù)

28、或被移位的寄存器,同時(shí),目的寄存器和操作數(shù)1必須是不同的寄存器。乘法指令與乘加指令共有以下6條:-MUL32位乘法指令-MLA32位乘加指令-SMULL64位有符號(hào)數(shù)乘法指令-SMLAL64位有符號(hào)數(shù)乘加指令-UMULL64位無符號(hào)數(shù)乘法指令-UMLAL64位無符號(hào)數(shù)乘加指令1、MUL指令MUL指令的格式為:MUL條件S目的寄存器,操作數(shù)1,操作數(shù)2MUL指令完成將操作數(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ù)或無符號(hào)數(shù)。指令示例:MULR0,R1,R2;R0=R1×R2MUL

29、SR0,R1,R2;R0=R1×R2,同時(shí)設(shè)置CPSR中的相關(guān)條件標(biāo)志位2、MLA指令MLA指令的格式為:MLA條件S目的寄存器,操作數(shù)1,操作數(shù)2,操作數(shù)3MLA指令完成將操作數(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ù)或無符號(hào)數(shù)。指令示例:MLAR0,R1,R2,R3;R0=R1×R2+R3MLASR0,R1,R2,R3;R0=R1×R2+R3,同時(shí)設(shè)置CPSR中的相關(guān)條件標(biāo)志位3、SMULL指令SMULL指令的格式為:SMULL條件

30、S目的寄存器Low,目的寄存器低High,操作數(shù)1,操作數(shù)2SMULL指令完成將操作數(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ù)。指令示例:SMULLR0,R1,R2,R3;R0=(R2×R3)的低32位;R1=(R2×R3)的高32位4、SMLAL指令SMLAL指令的格式為:SMLAL條件S目的寄存器Low,目的寄存器低High,操作數(shù)1,操作數(shù)2SMLAL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)果的低3

31、2位同目的寄存器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位。指令示例:SMLALR0,R1,R2,R3;R0=(R2×R3)的低32位R0;R1=(R2×R3)的高32位R15、UMULL指令UMULL指令的格式為:UMU

32、LL條件S目的寄存器Low,目的寄存器低High,操作數(shù)1,操作數(shù)2UMULL指令完成將操作數(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ù)。指令示例:UMULLR0,R1,R2,R3;R0=(R2×R3)的低32位;R1=(R2×R3)的高32位6、UMLAL指令UMLAL指令的格式為:UMLAL條件S目的寄存器Low,目的寄存器低High,操作數(shù)1,操作數(shù)2UMLAL指令完成將操作數(shù)1與操作數(shù)2的乘法運(yùn)算,并把結(jié)

33、果的低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位。指令示例:UMLALR0,R1,R2,R3;R0=(R2×R3)的低32位R0;R1=(R2×R3)的高32位R13.3.4程序狀態(tài)寄存器訪問指令A(yù)RM微

34、處理器支持程序狀態(tài)寄存器訪問指令,用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù),程序狀態(tài)寄存器訪問指令包括以下兩條:-MRS程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送指令-MSR通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送指令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)容讀入通用寄存器,修改后再寫回程序狀態(tài)寄存器。當(dāng)在異常處理或進(jìn)程切換時(shí),需要保存程序狀態(tài)寄存器的值,可先用該指令讀出程序狀態(tài)寄存器的值,然后保存。指

35、令示例:MRSR0,CPSR;傳送CPSR的內(nèi)容到R0MRSR0,SPSR;傳送SPSR的內(nèi)容到R02、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為條件標(biāo)志位域,用f表示;位23:16為狀態(tài)位域,用s表示;位15:8為擴(kuò)展位域,用x表示;位7:0為控制位域,用c表示;該指令通常用于恢復(fù)或改變程序狀態(tài)寄存器的內(nèi)容,在使用時(shí),一般要在MS

36、R指令中指明將要操作的域。指令示例:MSRCPSR,R0;傳送R0的內(nèi)容到CPSRMSRSPSR,R0;傳送R0的內(nèi)容到SPSRMSRCPSR_c,R0;傳送R0的內(nèi)容到SPSR,但僅僅修改CPSR中的控制位域3.3.5加載/存儲(chǔ)指令A(yù)RM微處理器支持加載/存儲(chǔ)指令用于在寄存器和存儲(chǔ)器之間傳送數(shù)據(jù),加載指令用于將存儲(chǔ)器中的數(shù)據(jù)傳送到寄存器,存儲(chǔ)指令則完成相反的操作。常用的加載存儲(chǔ)指令如下:-LDR字?jǐn)?shù)據(jù)加載指令-LDRB字節(jié)數(shù)據(jù)加載指令-LDRH半字?jǐn)?shù)據(jù)加載指令-STR字?jǐn)?shù)據(jù)存儲(chǔ)指令-STRB字節(jié)數(shù)據(jù)存儲(chǔ)指令-STRH半字?jǐn)?shù)據(jù)存儲(chǔ)指令1、LDR指令LDR指令的格式為:LDR條件目的寄存器,&l

37、t;存儲(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)真掌握。指令示例:LDRR0,R1;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0。LDRR0,R1,R2;將存儲(chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器R0。LDRR0,R1,8;將存儲(chǔ)器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器R0。LDRR0,R1,R2?。粚⒋鎯?chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀

38、入寄存器R0,并將新地址R1R2寫入R1。LDRR0,R1,8!;將存儲(chǔ)器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R18寫入R1。LDRR0,R1,R2;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1R2寫入R1。LDRR0,R1,R2,LSL2?。粚⒋鎯?chǔ)器地址為R1R2×4的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1R2×4寫入R1。LDRR0,R1,R2,LSL2;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器R0,并將新地址R1R2×4寫入R1。2、LDRB指令LDRB指令的格式為:LDR條件B目的寄存器,<存儲(chǔ)器地址>LDRB指令用于從存儲(chǔ)器

39、中將一個(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)。指令示例:LDRBR0,R1;將存儲(chǔ)器地址為R1的字節(jié)數(shù)據(jù)讀入寄存器R0,并將R0的高24位清零。LDRBR0,R1,8;將存儲(chǔ)器地址為R18的字節(jié)數(shù)據(jù)讀入寄存器R0,并將R0的高24位清零。3、LDRH指令LDRH指令的格式為:LDR條件H目的寄存器,<存儲(chǔ)器地址>LDRH指令用于從存儲(chǔ)器中將一個(gè)16位的半字?jǐn)?shù)據(jù)傳送到目的寄存器中,同

40、時(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)。指令示例:LDRHR0,R1;將存儲(chǔ)器地址為R1的半字?jǐn)?shù)據(jù)讀入寄存器R0,并將R0的高16位清零。LDRHR0,R1,8;將存儲(chǔ)器地址為R18的半字?jǐn)?shù)據(jù)讀入寄存器R0,并將R0的高16位清零。LDRHR0,R1,R2;將存儲(chǔ)器地址為R1R2的半字?jǐn)?shù)據(jù)讀入寄存器R0,并將R0的高16位清零。4、STR指令STR指令的格式為:STR條件源寄存器,<存儲(chǔ)器地址>STR指令用于從源寄存

41、器中將一個(gè)32位的字?jǐn)?shù)據(jù)傳送到存儲(chǔ)器中。該指令在程序設(shè)計(jì)中比較常用,且尋址方式靈活多樣,使用方式可參考指令LDR。指令示例:STRR0,R1,8;將R0中的字?jǐn)?shù)據(jù)寫入以R1為地址的存儲(chǔ)器中,并將新地址R18寫入R1。STRR0,R1,8;將R0中的字?jǐn)?shù)據(jù)寫入以R18為地址的存儲(chǔ)器中。5、STRB指令STRB指令的格式為:STR條件B源寄存器,<存儲(chǔ)器地址>STRB指令用于從源寄存器中將一個(gè)8位的字節(jié)數(shù)據(jù)傳送到存儲(chǔ)器中。該字節(jié)數(shù)據(jù)為源寄存器中的低8位。指令示例:STRBR0,R1;將寄存器R0中的字節(jié)數(shù)據(jù)寫入以R1為地址的存儲(chǔ)器中。STRBR0,R1,8;將寄存器R0中的字節(jié)數(shù)據(jù)寫入

42、以R18為地址的存儲(chǔ)器中。6、STRH指令STRH指令的格式為:STR條件H源寄存器,<存儲(chǔ)器地址>STRH指令用于從源寄存器中將一個(gè)16位的半字?jǐn)?shù)據(jù)傳送到存儲(chǔ)器中。該半字?jǐn)?shù)據(jù)為源寄存器中的低16位。指令示例:STRHR0,R1;將寄存器R0中的半字?jǐn)?shù)據(jù)寫入以R1為地址的存儲(chǔ)器中。STRHR0,R1,8;將寄存器R0中的半字?jǐn)?shù)據(jù)寫入以R18為地址的存儲(chǔ)器中。3.3.6批量數(shù)據(jù)加載/存儲(chǔ)指令A(yù)RM微處理器所支持批量數(shù)據(jù)加載/存儲(chǔ)指令可以一次在一片連續(xù)的存儲(chǔ)器單元和多個(gè)寄存器之間傳送數(shù)據(jù),批量加載指令用于將一片連續(xù)的存儲(chǔ)器中的數(shù)據(jù)傳送到多個(gè)寄存器,批量數(shù)據(jù)存儲(chǔ)指令則完成相反的操作。常用

43、的加載存儲(chǔ)指令如下:-LDM批量數(shù)據(jù)加載指令-STM批量數(shù)據(jù)存儲(chǔ)指令LDM(或STM)指令LDM(或STM)指令的格式為:LDM(或STM)條件類型基址寄存器!,寄存器列表LDM(或STM)指令用于從由基址寄存器所指示的一片連續(xù)存儲(chǔ)器到寄存器列表所指示的多個(gè)寄存器之間傳送數(shù)據(jù),該指令的常見用途是將多個(gè)寄存器的內(nèi)容入棧或出棧。其中,類型為以下幾種情況:IA每次傳送后地址加1;IB每次傳送前地址加1;DA每次傳送后地址減1;DB每次傳送前地址減1;FD滿遞減堆棧;ED空遞減堆棧;FA滿遞增堆棧;EA空遞增堆棧;!為可選后綴,若選用該后綴,則當(dāng)數(shù)據(jù)傳送完畢之后,將最后的地址寫入基址寄存器,否則基址寄

44、存器的內(nèi)容不改變。基址寄存器不允許為R15,寄存器列表可以為R0R15的任意組合。為可選后綴,當(dāng)指令為L(zhǎng)DM且寄存器列表中包含R15,選用該后綴時(shí)表示:除了正常的數(shù)據(jù)傳送之外,還將SPSR復(fù)制到CPSR。同時(shí),該后綴還表示傳入或傳出的是用戶模式下的寄存器,而不是當(dāng)前模式下的寄存器。指令示例:STMFDR13!,R0,R4-R12,LR;將寄存器列表中的寄存器(R0,R4到R12,LR)存入堆棧。LDMFDR13!,R0,R4-R12,PC;將堆棧內(nèi)容恢復(fù)到寄存器(R0,R4到R12,LR)。3.3.7數(shù)據(jù)交換指令A(yù)RM微處理器所支持?jǐn)?shù)據(jù)交換指令能在存儲(chǔ)器和寄存器之間交換數(shù)據(jù)。數(shù)據(jù)交換指令有如下

45、兩條:-SWP字?jǐn)?shù)據(jù)交換指令-SWPB字節(jié)數(shù)據(jù)交換指令1、SWP指令SWP指令的格式為:SWP條件目的寄存器,源寄存器1,源寄存器2SWP指令用于將源寄存器2所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時(shí)將源寄存器1中的字?jǐn)?shù)據(jù)傳送到源寄存器2所指向的存儲(chǔ)器中。顯然,當(dāng)源寄存器1和目的寄存器為同一個(gè)寄存器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。指令示例:SWPR0,R1,R2;將R2所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到R0,同時(shí)將R1中的字?jǐn)?shù)據(jù)傳送到R2所指向的存儲(chǔ)單元。SWPR0,R0,R1;該指令完成將R1所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)與R0中的字?jǐn)?shù)據(jù)交換。2、SWPB指令SWPB指令的格式為:SWP條件

46、B目的寄存器,源寄存器1,源寄存器2SWPB指令用于將源寄存器2所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到目的寄存器中,目的寄存器的高24清零,同時(shí)將源寄存器1中的字節(jié)數(shù)據(jù)傳送到源寄存器2所指向的存儲(chǔ)器中。顯然,當(dāng)源寄存器1和目的寄存器為同一個(gè)寄存器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。指令示例:SWPBR0,R1,R2;將R2所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到R0,R0的高24位清零,同時(shí)將R1中的低8位數(shù)據(jù)傳送到R2所指向的存儲(chǔ)單元。SWPBR0,R0,R1;該指令完成將R1所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)與R0中的低8位數(shù)據(jù)交換。3.3.8移位指令(操作)ARM微處理器內(nèi)嵌的桶型移位器(BarrelShif

47、ter),支持?jǐn)?shù)據(jù)的各種移位操作,移位操作在ARM指令集中不作為單獨(dú)的指令使用,它只能作為指令格式中是一個(gè)字段,在匯編語(yǔ)言中表示為指令中的選項(xiàng)。例如,數(shù)據(jù)處理指令的第二個(gè)操作數(shù)為寄存器時(shí),就可以加入移位操作選項(xiàng)對(duì)它進(jìn)行各種移位操作。移位操作包括如下6種類型,ASL和LSL是等價(jià)的,可以自由互換:-LSL邏輯左移-ASL算術(shù)左移-LSR邏輯右移-ASR算術(shù)右移-ROR循環(huán)右移-RRX帶擴(kuò)展的循環(huán)右移1、LSL(或ASL)操作LSL(或ASL)操作的格式為:通用寄存器,LSL(或ASL)操作數(shù)LSL(或ASL)可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行邏輯(或算術(shù))的左移操作,按操作數(shù)所指定的數(shù)量向左移位,低

48、位用零來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。操作示例:MOVR0,R1,LSL#2;將R1中的內(nèi)容左移兩位后傳送到R0中。2、LSR操作LSR操作的格式為:通用寄存器,LSR操作數(shù)LSR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用零來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。操作示例:MOVR0,R1,LSR#2;將R1中的內(nèi)容右移兩位后傳送到R0中,左端用零來填充。3、ASR操作ASR操作的格式為:通用寄存器,ASR操作數(shù)ASR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行右移的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用第31位

49、的值來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。操作示例:MOVR0,R1,ASR#2;將R1中的內(nèi)容右移兩位后傳送到R0中,左端用第31位的值來填充。4、ROR操作ROR操作的格式為:通用寄存器,ROR操作數(shù)ROR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用右端移出的位來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。顯然,當(dāng)進(jìn)行32位的循環(huán)右移操作時(shí),通用寄存器中的值不改變。操作示例:MOVR0,R1,ROR#2;將R1中的內(nèi)容循環(huán)右移兩位后傳送到R0中。5、RRX操作RRX操作的格式為:通用寄存器,RRX操作數(shù)R

50、RX可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左端用進(jìn)位標(biāo)志位C來填充。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(031)。操作示例:MOVR0,R1,RRX#2;將R1中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移兩位后傳送到R0中。3.3.9協(xié)處理器指令A(yù)RM微處理器可支持多達(dá)16個(gè)協(xié)處理器,用于各種協(xié)處理操作,在程序執(zhí)行的過程中,每個(gè)協(xié)處理器只執(zhí)行針對(duì)自身的協(xié)處理指令,忽略ARM處理器和其他協(xié)處理器的指令。ARM的協(xié)處理器指令主要用于ARM處理器初始化ARM協(xié)處理器的數(shù)據(jù)處理操作,以及在ARM處理器的寄存器和協(xié)處理器的寄存器之間傳送數(shù)據(jù),和在ARM協(xié)處理器

51、的寄存器和存儲(chǔ)器之間傳送數(shù)據(jù)。ARM協(xié)處理器指令包括以下5條:-CDP協(xié)處理器數(shù)操作指令-LDC協(xié)處理器數(shù)據(jù)加載指令-STC協(xié)處理器數(shù)據(jù)存儲(chǔ)指令-MCRARM處理器寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令-MRC協(xié)處理器寄存器到ARM處理器寄存器的數(shù)據(jù)傳送指令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ǔ)器。指令示例:CDPP3,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ù)的傳輸。指令示例:LDCP3,C4,R0;將ARM處理器的寄存器R0所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到協(xié)處理器P3的寄存器C4中。3、STC指令STC指令的格式為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論