三、Thumb指令_第1頁
三、Thumb指令_第2頁
三、Thumb指令_第3頁
三、Thumb指令_第4頁
三、Thumb指令_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Thumb指令,Thumb指令集可以看作是ARM指令壓縮形式的子集,它是為減小代碼量而提出的,具有16位的代碼密度。Thumb指令體系不完整,只支持通用功能。必要時仍需要使用ARM指令,如進(jìn)入異常時。,簡單的Thumb程序,;功能:使用BX指令切換處理器狀態(tài)AREAExample8,CODE,READONLYENTRYCODE32ARM_CODEADRR0,THUMB_CODE+1BXR0;跳轉(zhuǎn)并切換處理器狀態(tài)CODE16THUMB_CODEMOVR0,#10;R0=10MOVR1,#20;R1=20ADDR0,R1;R0=R0+R1B.END,在Thumb程序段之前要用CODE16聲明。,Thumb指令小節(jié)目錄,1.Thumb指令集與ARM指令集的區(qū)別2.存儲器訪問指令3.數(shù)據(jù)處理指令4.分支指令5.雜項(xiàng)指令6.偽指令,Thumb指令小節(jié)目錄,1.Thumb指令集與ARM指令集的區(qū)別2.存儲器訪問指令3.數(shù)據(jù)處理指令4.分支指令5.雜項(xiàng)指令6.偽指令,和ARM指令集相比,Thumb有許多自身的特點(diǎn):代碼尺寸更小,可以節(jié)省系統(tǒng)的存儲空間;針對的是32位的CPU,比純16位的指令集效率更高;所使用的編程模型和ARM指令集相似,只要遵循一定的調(diào)用規(guī)則,Thumb子程序和ARM子程序可以互相調(diào)用;為實(shí)現(xiàn)16位的指令長度舍棄了ARM指令集的一些特性(大多數(shù)為無條件執(zhí)行/數(shù)據(jù)處理指令的目的寄存器和其中一個源寄存器相同);,Thumb指令和ARM指令的區(qū)別在編寫Thumb指令時可以使用CODE16聲明;除跳轉(zhuǎn)指令B外,其余指令均為無條件執(zhí)行;數(shù)據(jù)處理指令:a采用2地址格式-其中一個寄存器既是源寄存器又是目的寄存器(也是大多數(shù)Thumb指令采用的);bThumb狀態(tài)下數(shù)據(jù)處理指令訪問R8-R15會受到一定限制(只有MOV、ADD和CMP可以);c使用R0-R7的數(shù)據(jù)處理指令總是更新條件標(biāo)志位,訪問R8-R15的數(shù)據(jù)處理指令不能更新條件標(biāo)志位;,d加載和存儲指令只能訪問R0-R7,且訪問普通存儲區(qū)只能使用LDMIA和STMIA,訪問堆棧區(qū)只能使用PUSH和POP(堆棧為滿遞減堆棧);eThumb指令集沒有協(xié)處理器指令、狀態(tài)寄存器訪問指令、乘加指令、64位乘法指令。f.分支指令的跳轉(zhuǎn)范圍有更多限制;,問題:1、什么時候訪問R8R15?2、什么時候影響條件碼標(biāo)志?,Thumb指令小節(jié)目錄,1.Thumb指令集與ARM指令集的區(qū)別2.存儲器訪問指令3.數(shù)據(jù)處理指令4.分支指令5.雜項(xiàng)指令6.偽指令,Thumb存儲器訪問指令,單寄存器訪問指令,Thumb存儲器訪問指令,LDR和STR加載/存儲指令根據(jù)指令的尋址方式不同,可以分為以下三類:立即數(shù)偏移尋址;寄存器偏移尋址;PC或SP相對偏移尋址;,單寄存器訪問指令立即數(shù)偏移尋址,以這種尋址方式對存儲器訪問時,存儲器的地址以一個寄存器的內(nèi)容為基址,在偏移一個立即數(shù)后指明。指令格式如下:LDRRd,Rn,#immed_54;加載內(nèi)存中的字?jǐn)?shù)據(jù)到寄存器Rd中STRRd,Rn,#immed_54;將Rd中的字?jǐn)?shù)據(jù)存儲到指定地址的內(nèi)存中LDRHRd,Rn,#immed_52;加載內(nèi)存中的半字?jǐn)?shù)據(jù)到寄存器Rd的低16位中STRHRd,Rn,#immed_52;存儲Rd中的低16位半字?jǐn)?shù)據(jù)到指定的內(nèi)存單元LDRBRd,Rn,#immed_51;加載內(nèi)存中的字節(jié)數(shù)據(jù)到寄存器Rd中STRBRd,Rn,#immed_51;存儲Rd中的低8位字節(jié)數(shù)據(jù)到指定的內(nèi)存單元其中:Rd表示加載或存儲的寄存器。必須為R0R7。Rn表示基址寄存器。必須為R0R7。immed_5N表示立即數(shù)偏移量,其取值范圍為(031)N。,單寄存器訪問指令立即數(shù)偏移指令編碼,指令執(zhí)行的條件碼:0110b:LDR/STR指令;1000b:LDRH/STRH指令;0111b:LDRB/STRB指令;,L用于區(qū)別加載(L為1)或存儲(L為0),Immed_5:5位無符號立即數(shù)偏移,Rn:基址寄存器,Rd:源或目標(biāo)寄存器,單寄存器訪問指令立即數(shù)偏移尋址,注意:進(jìn)行字?jǐn)?shù)據(jù)訪問時,必須保證傳送地址為32位對齊。進(jìn)行半字?jǐn)?shù)據(jù)訪問時,必須保證傳送地址為16位對齊。,應(yīng)用示例:LDRR0,R1,#0 x4STRR3,R4LDRHR5,R0,#0 x02STRHR1,R0,#0 x08LDRBR3,R6,#20STRBR1,R0,#31,單寄存器訪問指令寄存器偏移尋址,這種尋址方式是以一個寄存器的內(nèi)容為基址,以另一個寄存器的內(nèi)容為偏移量,兩者相加作為存儲器的地址。指令格式如下:LDRRd,Rn,Rm;加載一個字?jǐn)?shù)據(jù)STRRd,Rn,Rm;存儲一個字?jǐn)?shù)據(jù)LDRHRd,Rn,Rm;加載一個無符號半字?jǐn)?shù)據(jù)STRHRd,Rn,Rm;存儲一個無符號半字?jǐn)?shù)據(jù)LDRBRd,Rn,Rm;加載一個無符號字節(jié)數(shù)據(jù)STRBRd,Rn,Rm;存儲一個無符號字節(jié)數(shù)據(jù)LDRSHRd,Rn,Rm;加載一個有符號半字?jǐn)?shù)據(jù)LDRSBRd,Rn,Rm;存儲一個有符號半字?jǐn)?shù)據(jù)其中:Rd表示加載或存儲的寄存器。必須為R0R7。Rn表示基址寄存器。必須為R0R7。Rm表示內(nèi)含數(shù)偏移量的寄存器,必須為R0R7。,單寄存器訪問指令寄存器偏移指令編碼,指令執(zhí)行的條件碼:00b:LDR/STR指令;01b:LDRH/STRH指令;10b:LDRB/STRB指令;,L用于區(qū)別加載(L為1)或存儲(L為0),Rm:偏移量寄存器,Rn:基址寄存器,Rd:源或目標(biāo)寄存器,說明:當(dāng)opcode位為11b時,L位為0代表指令“LDRSB“,L位為1代表指令“LDRSH”,單寄存器訪問指令寄存器偏移尋址,注意:進(jìn)行字?jǐn)?shù)據(jù)訪問時,必須保證傳送地址為32位對齊。進(jìn)行半字?jǐn)?shù)據(jù)訪問時,必須保證傳送地址為16位對齊。,應(yīng)用示例:LDRR3,R1,R0STRR1,R0,R2LDRHR6,R0,R1STRHR0,R4,R5LDRBR2,R5,R1STRBR1,R3,R2LDRSHR7,R6,R3LDRSBR5,R7,R2,單寄存器訪問指令相對偏移尋址,這種尋址方式是以PC或SP寄存器的內(nèi)容為基址,以一個立即數(shù)為偏移量,兩者相加作為存儲器的地址。指令格式如下:LDRRd,PC,#immed_84LDRRd,labelLDRRd,SP,#immed_84STRRd,SP,#immed_84其中:Rd表示加載或存儲的寄存器。必須為R0R7。immed_84表示偏移量,取值范圍是(0255)4。label表示程序相對偏移表達(dá)式,Label必須在當(dāng)前指令之后的1KB范圍內(nèi)。,單寄存器訪問指令相對偏移指令編碼,L:用于區(qū)別加載(L為1)或存儲(L為0),Rd:目標(biāo)或源寄存器,immed8:偏移量,PC相對偏移LDR指令編碼,SP相對偏移LDR/STR指令編碼,單寄存器訪問指令相對偏移尋址,注意:以PC作為基地址的相對偏移尋址指令只有LDR,而沒有STR指令。,應(yīng)用示例:LDRR0,PC,#0 x08;讀取PC+0 x08地址上的字?jǐn)?shù)據(jù),;保存到R0中LDRR7,LOCALDAT;讀取LOCALDAT地址上的;字?jǐn)?shù)據(jù),保存到R7中LDRR3,SP,#1020;讀取SP+1020地址上的字?jǐn)?shù)據(jù),;保存到R3中STRR2,SP;存儲R2寄存器的數(shù)據(jù)到SP;指向的存儲單元(偏移量為0),Thumb存儲器訪問指令,PUSH和POP寄存器入棧及出棧指令實(shí)現(xiàn)低寄存器和可選的LR寄存器入棧及低寄存器和可選的PC寄存器出棧操作。堆棧地址由SP寄存器設(shè)置,堆棧是滿遞減堆棧。,寄存器入棧及出棧指令,PUSHreglist,LRPOPreglist,PC其中:reglist入棧/出棧低寄存器列表,即R0R7。LR入棧時的可選寄存器。PC出棧時的可選寄存器。,指令編碼,指令格式,L用于區(qū)別出棧(L為1)或入棧(L為0),R用于區(qū)別操作寄存器中是否有LR/PC寄存器(有則R為1,否則為0),寄存器入棧及出棧指令,PUSHreglist,LRPOPreglist,PC其中:reglist入棧/出棧低寄存器列表,即R0R7。LR入棧時的可選寄存器。PC出棧時的可選寄存器。,指令格式,應(yīng)用示例:PUSHR0-R7,LR;將低寄存器R0R7全部入棧,;LR也入棧POPR0-R7,PC;將堆棧中的數(shù)據(jù)彈出到;低寄存器R0R7及PC中,Thumb存儲器訪問指令,LDMIA和STMIA多寄存器加載/存儲指令可以實(shí)現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。LDMIA為加載多個寄存器;STMIA為存儲多個寄存器。使用它們允許一條指令傳送8個低寄存器R0R7的任何子集。,多寄存器加載/存儲指令,LDMIARn!,reglistSTMIARn!,reglist其中:Rn加載/存儲的起始地址寄存器。Rn必須為R0R7。reglist加載/存儲的寄存器列表。寄存器必須為R0R7。,指令編碼,指令格式,L用于區(qū)別加載(L為1)還是存儲(L為0),多寄存器加載/存儲指令,應(yīng)用示例:LDMIAR0!,R2-R7;加載R0指向的地址上的多字?jǐn)?shù)據(jù),;保存到R2R7中,R0的值更新。STMIAR1!,R2-R7;將R2R7的數(shù)據(jù)存儲到R1指向的;地址上,R1值更新,LDMIA/STMIA的主要用于數(shù)據(jù)復(fù)制、參數(shù)傳送等。進(jìn)行數(shù)據(jù)傳送時,每次傳送后地址加4。若Rn在寄存器列表中:對于LDMIA指令,Rn的最終值是加載的值,而不是增加后的地址;對于STMIA指令,若Rn是寄存器列表中的最低數(shù)字的寄存器,則Rn存儲的值為Rn在初值,其它情況不可預(yù)知。,Thumb指令小節(jié)目錄,1.Thumb指令集與ARM指令集的區(qū)別2.存儲器訪問指令3.數(shù)據(jù)處理指令4.分支指令5.雜項(xiàng)指令6.偽指令,Thumb數(shù)據(jù)處理指令,Thumb數(shù)據(jù)處理指令涵蓋了編譯器需要的大多數(shù)操作。大部分的Thumb數(shù)據(jù)處理指令采用2地址格式,不能在單指令中同時完成一個操作數(shù)的移位及一個ALU操作。所以數(shù)據(jù)處理操作比ARM狀態(tài)的更少,并且訪問寄存器R8R15受到限制。數(shù)據(jù)處理指令分為兩類:數(shù)據(jù)傳送指令算術(shù)邏輯運(yùn)算指令,Thumb數(shù)據(jù)處理指令數(shù)據(jù)傳送指令,MOV指令將8位立即數(shù)或寄存器傳送到目標(biāo)寄存器中。其指令格式如下:(Rd,Rm可以用R8-R15;但MOVRd,#expr時,Rd必須在R0R7之間),數(shù)據(jù)傳送指令MOV,MOVRd,#exprMOVRd,Rm其中:Rd目標(biāo)寄存器。MOVRd,#expr時,Rd必須在R0R7之間。exper8位立即數(shù),即0255。Rm源寄存器。為R0R15。,指令編碼(立即數(shù)傳送),指令編碼(寄存器傳送),數(shù)據(jù)傳送指令MOV,注意:“MOVRd,#expr”指令會更新N和Z標(biāo)志,對標(biāo)志C和V無影響。Rd必須在R0R7之間“MOVRd,Rm”指令,若Rm是高寄存器(R8R15),則標(biāo)志不受影響,若Rd或Rm都是低寄存器(R0R7),則更新標(biāo)志N和Z,且清除標(biāo)志C和V。,應(yīng)用示例:MOVR1,#0 x10;R1=0 x10MOVR0,R8;R0=R8MOVPC,LR;PC=LR,子程序返回,數(shù)據(jù)傳送指令MVN,MVNRd,Rm其中:Rd目標(biāo)寄存器。MOVRd,#expr時,Rd必須在R0R7之間。Rm源寄存器。為R0R15。,指令編碼,MVN指令將寄存器Rm按位取反后傳送到目標(biāo)寄存器Rd中。指令的執(zhí)行會更新N和Z標(biāo)志,對標(biāo)志C和V無影響。其指令格式如下:,應(yīng)用示例:MVNR1,R2;將R2取反,結(jié)果存于R1,數(shù)據(jù)傳送指令MVN,MVNRd,Rm其中:Rd目標(biāo)寄存器。MOVRd,#expr時,Rd必須在R0R7之間。Rm源寄存器。為R0R15。,MVN指令將寄存器Rm按位取反后傳送到目標(biāo)寄存器Rd中。指令的執(zhí)行會更新N和Z標(biāo)志,對標(biāo)志C和V無影響。其指令格式如下:,數(shù)據(jù)傳送指令NEG,NEGRd,Rm其中:Rd目標(biāo)寄存器,必須在R0R7之間。Rm源寄存器。為R0R15。,指令編碼,NEG指令將寄存器Rm乘以-1后傳送到目標(biāo)寄存器Rd中。指令會更新N、Z、C和V標(biāo)志。其指令格式如下:,數(shù)據(jù)傳送指令NEG,NEGRd,Rm其中:Rd目標(biāo)寄存器,必須在R0R7之間。Rm源寄存器。為R0R15。,NEG指令將寄存器Rm乘以-1后傳送到目標(biāo)寄存器Rd中。指令會更新N、Z、C和V標(biāo)志。其指令格式如下:,應(yīng)用示例:NEGR1,R0;R1=-R0,Thumb數(shù)據(jù)處理指令算術(shù)邏輯運(yùn)算指令,算術(shù)邏輯指令包括以下幾類:算術(shù)指令邏輯運(yùn)算指令移位指令比較指令,ADD指令將兩個數(shù)據(jù)相加,結(jié)果保存到Rd寄存器中。,算術(shù)運(yùn)算指令A(yù)DD,ADDRd,Rn,RmADDRd,Rn,#expr3ADDRd,#expr8其中:Rd目標(biāo)寄存器,必須在R0R7之間。Rn第1個操作數(shù)寄存器,必須在R0R7之間。Rm第2個操作數(shù)寄存器,必須在R0R7之間。exper3位立即數(shù),即07。expr88位立即數(shù),即0255。,低寄存器的ADD指令格式:,應(yīng)用示例:ADDR1,R1,R0;R1=R0+R1ADDR1,R1,#7;R1=R1+7ADDR1,#200;R1=R1+200,指令更新標(biāo)志N,Z,C,V,ADD指令將兩個數(shù)據(jù)相加,結(jié)果保存到Rd寄存器中。,算術(shù)運(yùn)算指令A(yù)DD,ADDRd,Rm其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器。Rm第2個操作數(shù)寄存器。,高或低寄存器的ADD指令格式:(Rd,Rm可以用R8-R15),應(yīng)用示例:ADDR1,R10;R1=R1+R10,指令不影響條件碼標(biāo)志,ADD指令將兩個數(shù)據(jù)相加,結(jié)果保存到Rd寄存器中。,算術(shù)運(yùn)算指令A(yù)DD,ADDSP,#expr其中:SP目標(biāo)寄存器,也是第一個操作數(shù)寄存器。expr立即數(shù),在-508+508之間的4的整數(shù)倍的數(shù)。,SP操作的ADD指令格式:,應(yīng)用示例:ADDSP,#-500;SP=SP-500,指令不影響條件碼標(biāo)志,SUB指令將兩個數(shù)據(jù)相減,結(jié)果保存到Rd寄存器中。,算術(shù)運(yùn)算指令SUB,SUBRd,Rn,RmSUBRd,Rn,#expr3SUBRd,#expr8其中:Rd目標(biāo)寄存器,必須在R0R7之間。Rn第1個操作數(shù)寄存器,必須在R0R7之間。Rm第2個操作數(shù)寄存器,必須在R0R7之間。exper3位立即數(shù),即07。expr88位立即數(shù),即0255。,低寄存器的SUB指令格式:,應(yīng)用示例:SUBR1,R1,R0;R1=R1-R0SUBR1,R1,#7;R1=R1-7SUBR1,#200;R1=R1-200,指令更新標(biāo)志N,Z,C,V,SUB指令將兩個數(shù)據(jù)相減,結(jié)果保存到Rd寄存器中。,算術(shù)運(yùn)算指令SUB,SUBSP,#expr其中:SP目標(biāo)寄存器,也是第一個操作數(shù)寄存器。expr立即數(shù),在-508+508之間的4的整數(shù)倍的數(shù)。,SP操作的SUB指令格式:,應(yīng)用示例:SUBSP,#380;SP=SP-380,指令不影響條件碼標(biāo)志,ADC指令將Rm的值相加,再加上CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd寄存器。,算術(shù)運(yùn)算指令A(yù)DC,ADCRd,Rm其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rm第2個操作數(shù)寄存器,必須在R0R7之間。,ADC指令格式:,應(yīng)用示例(64位加法):ADDR0,R2ADCR1,R3;(R1、R0)=(R1、R0)+(R3、R2),指令更新標(biāo)志N,Z,C,V,SBC指令用寄存器Rd減去Rm,再減去CPSR中的C條件標(biāo)志位的非,結(jié)果保存到Rd寄存器。,算術(shù)運(yùn)算指令SBC,SBCRd,Rm其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rm第2個操作數(shù)寄存器,必須在R0R7之間。,SBC指令格式:,應(yīng)用示例(64位減法):SUBR0,R2SBCR1,R3;(R1、R0)=(R1、R0)-(R3、R2),指令更新標(biāo)志N,Z,MUL乘法指令用寄存器Rd乘以Rm,結(jié)果保存到Rd寄存器。,算術(shù)運(yùn)算指令MUL,MULRd,Rm其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rm第2個操作數(shù)寄存器,必須在R0R7之間。,MUL指令格式:,應(yīng)用示例:MULR0,R1;R0=R0R1,指令更新標(biāo)志N,Z,AND指令將寄存器Rd的值與寄存器Rm的值按位作邏輯“與”操作,結(jié)果保存到Rd寄存器中。,邏輯運(yùn)算指令A(yù)ND,ADDRd,Rm其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rm第2個操作數(shù)寄存器,必須在R0R7之間。,AND指令格式:,應(yīng)用示例:MOVR1,#0 x0FANDR0,R1;R0=R0R0=R0|R1,置位R0低4位,指令更新標(biāo)志N,Z,EOR指令將寄存器Rd的值與寄存器Rn的值按位作邏輯“異或”操作,結(jié)果保存到Rd寄存器中。,邏輯運(yùn)算指令EOR,EORRd,Rm其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rm第2個操作數(shù)寄存器,必須在R0R7之間。,EOR指令格式:,應(yīng)用示例:MOVR1,#0 x0FEORR0,R1;R0=R0R1,取反R0低4位,指令更新標(biāo)志N,Z,BIC指令將寄存器Rd的值與寄存器Rm的值的反碼作邏輯“與”操作,結(jié)果保存到Rd寄存器中。,邏輯運(yùn)算指令BIC,BICRd,Rm其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rm第2個操作數(shù)寄存器,必須在R0R7之間。,BIC指令格式:,應(yīng)用示例:MOVR1,#0 x02BICR0,R1;清零R0的第2位,其它位不變,指令更新標(biāo)志N,Z,ASR指令將數(shù)據(jù)算術(shù)右移,將符號位拷貝到左側(cè)空出的位,移位結(jié)果保存到Rd寄存器中。,移位指令A(yù)SR,ASRRd,RsASRRd,Rm,#expr其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rs寄存器控制移位中包含移位位數(shù)的寄存器,必須在R0R7之間Rm立即數(shù)移位的源寄存器,必須在R0R7之間expr立即數(shù)移位位數(shù),值為132,ASR指令格式:,若移位位數(shù)為32,則Rd清零,最后移出的位保留在標(biāo)志C中;若移位位數(shù)大于32,則Rd和標(biāo)志C均被清零;若移位位數(shù)為0,則不影響C標(biāo)志。,指令更新標(biāo)志N,Z,C,ASR指令將數(shù)據(jù)算術(shù)右移,將符號位拷貝到左側(cè)空出的位,移位結(jié)果保存到Rd寄存器中。,移位指令A(yù)SR,ASRRd,RsASRRd,Rm,#expr其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rs寄存器控制移位中包含移位位數(shù)的寄存器,必須在R0R7之間Rm立即數(shù)移位的源寄存器,必須在R0R7之間expr立即數(shù)移位位數(shù),值為132,ASR指令格式:,應(yīng)用示例:ASRR1,R2ASRR3,R1,#2,指令更新標(biāo)志N,Z,C,LSL指令將數(shù)據(jù)邏輯左移,空位清零,移位結(jié)果保存到Rd寄存器中。,移位指令LSL,LSLRd,RsLSLRd,Rm,#expr其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rs寄存器控制移位中包含移位位數(shù)的寄存器,必須在R0R7之間Rm立即數(shù)移位的源寄存器,必須在R0R7之間expr立即數(shù)移位位數(shù),值為131,LSL指令格式:,若移位位數(shù)為32,則Rd清零,最后移出的位保留在標(biāo)志C中;若移位位數(shù)大于32,則Rd和標(biāo)志C均被清零;若移位位數(shù)為0,則不影響C標(biāo)志。,指令更新標(biāo)志N,Z,C,LSL指令將數(shù)據(jù)邏輯左移,空位清零,移位結(jié)果保存到Rd寄存器中。,移位指令LSL,LSLRd,RsLSLRd,Rm,#expr其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rs寄存器控制移位中包含移位位數(shù)的寄存器,必須在R0R7之間Rm立即數(shù)移位的源寄存器,必須在R0R7之間expr立即數(shù)移位位數(shù),值為131,LSL指令格式:,應(yīng)用示例:LSLR6,R7LSLR1,R6,#2,指令更新標(biāo)志N,Z,C,LSR指令將數(shù)據(jù)邏輯右移,空位清零,移位結(jié)果保存到Rd寄存器中。,移位指令LSR,LSRRd,RsLSRRd,Rm,#expr其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rs寄存器控制移位中包含移位位數(shù)的寄存器,必須在R0R7之間Rm立即數(shù)移位的源寄存器,必須在R0R7之間expr立即數(shù)移位位數(shù),值為132,LSR指令格式:,若移位位數(shù)為32,則Rd清零,最后移出的位保留在標(biāo)志C中;若移位位數(shù)大于32,則Rd和標(biāo)志C均被清零;若移位位數(shù)為0,則不影響C標(biāo)志。,指令更新標(biāo)志N,Z,C,LSR指令將數(shù)據(jù)邏輯右移,空位清零,移位結(jié)果保存到Rd寄存器中。,移位指令LSR,LSRRd,RsLSRRd,Rm,#expr其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rs寄存器控制移位中包含移位位數(shù)的寄存器,必須在R0R7之間Rm立即數(shù)移位的源寄存器,必須在R0R7之間expr立即數(shù)移位位數(shù),值為132,LSR指令格式:,應(yīng)用示例:LSRR3,R0LSRR5,R2,#2,指令更新標(biāo)志N,Z,C,ROR指令將數(shù)據(jù)循環(huán)右移,寄存器右側(cè)移出的位放入左側(cè)空出的位上,移位結(jié)果保存到Rd寄存器中。,移位指令ROR,RORRd,Rs其中:Rd目標(biāo)寄存器,也是第一個操作數(shù)寄存器,必須在R0R7之間。Rs寄存器控制移位中包含移位位數(shù)的寄存器,必須在R0R7之間,ROR指令格式:,應(yīng)用示例:RORR3,R0,指令更新標(biāo)志N,Z,C,CMP指令使用寄存器Rn的值減去第二個操作數(shù)的值,根據(jù)操作的結(jié)果更新CPSR中的N、Z、C和V標(biāo)志位。,比較指令CMP,CMPRn,RmCMPRn,#epr其中:Rn第一個操作數(shù)寄存器,必須在R0R7之間。Rm第二個操作數(shù)寄存器,必須在R0R7之間。expr立即數(shù),值為0255,CMP指令格式:,應(yīng)用示例:CMPR1,#10;R1與10比較,設(shè)置相關(guān)標(biāo)志位CMPR1,R2;R1與R2比較,設(shè)置相關(guān)標(biāo)志位,指令更新標(biāo)志N,Z,C,V,CMN指令使用寄存器Rn的值加上寄存器Rm的值,根據(jù)操作的結(jié)果更新CPSR中的N、Z、C和V標(biāo)志位。,比較指令CMN,CMNRn,Rm其中:Rn第一個操作數(shù)寄存器,必須在R0R7之間。Rm第二個操作數(shù)寄存器,必須在R0R7之間。,ROR指令格式:,應(yīng)用示例:CMNR0,R2;R0與-R2比較,設(shè)置相關(guān)標(biāo)志位,指令更新標(biāo)志N,Z,C,V,TST指令將寄存器Rn的值與寄存器Rm的值按位作邏輯“與”操作,根據(jù)操作的結(jié)果更新CPSR中的N、Z、C和V標(biāo)志位。,比較指令TST,TSTRn,Rm其中:Rn第一個操作數(shù)寄存器,必須在R0R7之間。Rm第二個操作數(shù)寄存器,必須在R0R7之間。,TST指令格式:,應(yīng)用示例:MOVR0,#0 x01TSTR1,R0;判斷R1的最低位是否為0,指令更新標(biāo)志N,Z,C,V,Thumb指令小節(jié)目錄,1.Thumb指令集與ARM指令集的區(qū)別2.存儲器訪問指令3.數(shù)據(jù)處理指令4.分支指令5.雜項(xiàng)指令6.偽指令,Thumb分支指令,B指令跳轉(zhuǎn)到指定的地址執(zhí)行程序,它是Thumb指令集中的唯一有條件執(zhí)行指令。如果使用了條件執(zhí)行,那么跳轉(zhuǎn)范圍在-252+256字節(jié)內(nèi)。如果沒有使用條件執(zhí)行,那么跳轉(zhuǎn)范圍在2K內(nèi)。,分支指令B,Bcondlabel其中:label表示程序標(biāo)號。,B指令格式:,應(yīng)用示例:BWAITB;WAITB標(biāo)號在當(dāng)前指令的2K范圍內(nèi)BEQLOOP1;LOOP1標(biāo)號在當(dāng)前指令的-252+256范圍內(nèi),BL指令在跳轉(zhuǎn)到指定地址執(zhí)行程序前,將下一條指令的地址拷貝到R14鏈接寄存器中。,分支指令BL,BLlabel其中:label表示程序標(biāo)號。,BL指令格式:,注意:由于BL指令通常需要大的地址范圍,很難用16位指令格式實(shí)現(xiàn),為此,Thumb采用兩條這樣的指令組合成22位半字偏移(符號擴(kuò)展為32位),使指令轉(zhuǎn)移范圍為4MB。,應(yīng)用示例:,反匯編代碼:,ADDR0,R1BLRstInit,0 x1809addr1,r1,r00 xf9dcf000blRstInit,32位長的機(jī)器碼,BX指令是帶狀態(tài)切換的分支指令,跳轉(zhuǎn)地址由Rm指定,同時根據(jù)Rm的最低位的值切換

溫馨提示

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

評論

0/150

提交評論