第3章 ARM9指令集和匯編(初稿)_第1頁
第3章 ARM9指令集和匯編(初稿)_第2頁
第3章 ARM9指令集和匯編(初稿)_第3頁
第3章 ARM9指令集和匯編(初稿)_第4頁
第3章 ARM9指令集和匯編(初稿)_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第3章ARM9指令集和匯編提綱1、ARM指令集概述2、ARM指令的尋址方式3、ARM指令簡介4、Thumb指令簡介1、ARM指令集概述RISC簡介ARM狀態(tài)和Thumb狀態(tài)ARM9指令類型和指令的條件域RISC簡介RISC是計(jì)算機(jī)中央處理器的一種設(shè)計(jì)模式全稱ReducedInstructionSetComputer,中文稱為精簡指令集計(jì)算機(jī)RISC選取使用最為頻繁的簡單指令及部分復(fù)雜指令,而且指令等長,通常指令為16位或32位ARM狀態(tài)和Thumb狀態(tài)(1)從v4版本開始,ARM引入了Thumb指令集Thumb指令為16位,能完成的功能是32位ARM指令的子集ARM處理器支持兩種運(yùn)行狀態(tài)ARM狀態(tài)Thumb狀態(tài)ARM指令必須在ARM狀態(tài)下執(zhí)行Thumb指令也必須處于Thumb狀態(tài)下執(zhí)行必須使用ARM指令的情況ARM處理器啟動的第一句指令必須是ARM指令訪問程序狀態(tài)寄存器CPSR或協(xié)處理器時(shí)必須是ARM指令A(yù)RM在處理異常中斷時(shí)會自動切換到ARM狀態(tài),執(zhí)行中斷處理程序入口處的程序。返回時(shí),會再次自動切換到ARM狀態(tài)ARM指令A(yù)RM狀態(tài)和Thumb狀態(tài)(2)v4版本中的函數(shù)調(diào)用,如果不需要進(jìn)行狀態(tài)切換,只需要用到BL指令就可以實(shí)現(xiàn)了如果需要進(jìn)行狀態(tài)切換,情況較復(fù)雜,如圖3-1所示ARM狀態(tài)和Thumb狀態(tài)(3)ARM狀態(tài)和Thumb狀態(tài)(4)不同狀態(tài)間的函數(shù)調(diào)用ARMv5版本后,引入了一條新的指令BLX,結(jié)合了BL和BX指令各自的功能特點(diǎn),使得上圖的所示過程通過一條指令就能實(shí)現(xiàn)ARM狀態(tài)和Thumb狀態(tài)(5)ARM9指令類型和指令的條件域(1)ARM指令集屬于加載/存儲型指令指令的操作數(shù)都儲存在寄存器中,處理結(jié)果直接放回到目的寄存器中ARM9指令集可以分為6類跳轉(zhuǎn)指令數(shù)據(jù)處理指令存儲器訪問指令協(xié)處理器指令雜項(xiàng)指令飽和算術(shù)指令跳轉(zhuǎn)指令A(yù)RM9指令類型和指令的條件域(2)數(shù)據(jù)處理指令

ARM9指令類型和指令的條件域(3)存儲器訪問指令A(yù)RM9指令類型和指令的條件域(4)協(xié)處理器指令A(yù)RM9指令類型和指令的條件域(5)雜項(xiàng)指令A(yù)RM9指令類型和指令的條件域(6)飽和算術(shù)指令A(yù)RM9指令類型和指令的條件域(7)ARM指令一般由操作碼、目的寄存器、操作數(shù)幾部分組成,并可以配合條件碼,S后綴等可選項(xiàng)目,以完成更復(fù)雜操作,它的格式一般為:指令中<>內(nèi)的項(xiàng)目是必需的,比如opcode,Rd,Rn等,{}內(nèi)的項(xiàng)目是可選的ARM9指令類型和指令的條件域(8)<opcode>{<cond>}{S}<Rd>,<Rn>{,<shift_op2>}opcode操作碼,即指令助記符,如BL,ADDcond條件碼,描述指令執(zhí)行的條件,在下文會有詳細(xì)介紹S可選后綴,若在指令后加上“S”,在指令完畢后會自動更新CPSR中條件碼標(biāo)志位的值RdARM指令中的目標(biāo)操作數(shù)總是一個寄存器,通常用Rd表示Rn存放第1操作數(shù)的寄存器opcode2第2操作數(shù),它的使用非常靈活,不僅可以是寄存器,還能使用立即數(shù),而且能夠使用經(jīng)過位移運(yùn)算的寄存器和立即數(shù),這在下文也會介紹。ARM9指令類型和指令的條件域(9)表3-1ARM指令格式ARM指令集幾乎每條指令(除了某些v5T指令)都可以是條件執(zhí)行的。指令的最高4位[31:28]稱為條件碼:ARM9指令類型和指令的條件域AMR指令條件碼助記符描述CPSR條件碼標(biāo)志位的值0000EQ相等,運(yùn)行結(jié)果為0Z置位0001NE不相等,運(yùn)行結(jié)果不為0Z清零0010CS/HS無符號數(shù)大于等于C置位0011CC/LO無符號數(shù)小于C清零0100MI負(fù)數(shù)N置位0101PL非負(fù)數(shù)N清零0110VS上溢出V置位0111VC沒有上溢出V清零1000HI無符號數(shù)大于C置位且Z清零1001LS無符號數(shù)小于等于C清零且Z置位1010GE帶符號數(shù)大于等于N=V1011LT帶符號數(shù)小于N!=V1100GT帶符號數(shù)大于Z清零且N=V1101LE帶符號數(shù)小于等于Z置位且N!=V1110AL無條件執(zhí)行

1111系統(tǒng)保留

<shift_op2>形式非常靈活,共有11種形式:ARM9指令類型和指令的條件域語法含義#<immediate>立即數(shù)尋址<Rm>寄存器尋址<Rm>,LSL#<shift_imm>立即數(shù)邏輯左移<Rm>,LSL<Rs>寄存器邏輯左移<Rm>,LSR#<shift_imm>立即數(shù)邏輯右移<Rm>,LSR<Rs>寄存器邏輯右移<Rm>,ASR#<shift_imm>立即數(shù)算術(shù)右移<Rm>,ASR<Rs>寄存器算術(shù)右移<Rm>,ROR#<shift_imm>立即數(shù)循環(huán)右移<Rm>,ROR<Rs>寄存器循環(huán)右移<Rm>,RRX寄存器擴(kuò)展循環(huán)右移ARM指令集有5種形式的位移操作LSL邏輯左移LSR邏輯右移ASR算術(shù)右移

ROR循環(huán)右移RRX帶擴(kuò)展的循環(huán)右移ARM9指令類型和指令的條件域邏輯左移(LogicalShiftLeft):操作時(shí)在移位操作時(shí),用0補(bǔ)足低位;而邏輯右移(LogicalShiftRight)移動的方向相反,并用0補(bǔ)足高位。算術(shù)右移(ArithmeticShiftRight):在移位操作時(shí),根據(jù)符號位來補(bǔ)足高位,若原數(shù)符號位是1,即當(dāng)原數(shù)為負(fù)數(shù)時(shí),移位空出的高位都用1補(bǔ)足,反之則用0補(bǔ)足。循環(huán)右移(ROtateRight):可以將數(shù)字看做首位相接的“環(huán)形”,當(dāng)最低位被移出后,它會繞到數(shù)組的最高位去,繼續(xù)參與移位操作。帶擴(kuò)展的循環(huán)右移(RotateRightonebitwitheXtended):較前面的幾種移位方法復(fù)雜一些,它需要用到CPSR中的C位。當(dāng)最低位被向右移出后,最高位有C位的值補(bǔ)足,然后被移出的最低位被放到C位中。ARM9指令類型和指令的條件域立即數(shù)#<immediate>并不是任意數(shù)都是合法的,在立即數(shù)尋址中,分配給立即數(shù)的空間是12位,8位用于保存一個常數(shù),4位用于保存循環(huán)右移基數(shù),而循環(huán)右移每次需要移動偶數(shù)位,即右移的位數(shù)是基數(shù)*2。假設(shè)常數(shù)為A,循環(huán)右移位數(shù)為N,則最后得到的立即數(shù)=A循環(huán)右移(N*2位)。0x3FC立即數(shù)合法,A=0b11111111,N=0d150x1FE不合法ARM9指令類型和指令的條件域3.2ARM指令的尋址方式立即尋址寄存器尋址寄存器偏移尋址寄存器間接尋址基址變址尋址多寄存器尋址堆棧尋址相對尋址立即尋址立即尋址也可被稱為立即數(shù)尋址,讀取指令后可以立即得到操作數(shù),而不需要去物理內(nèi)存得到相應(yīng)內(nèi)容。這個給出的操作數(shù)叫立即數(shù),它一般以“#”為前綴,“#0x”、“#0d”,“#0b”開頭的計(jì)數(shù)用來表示十六進(jìn)制,十進(jìn)制和二進(jìn)制。ARM指令的尋址方式ADDR1,R1,#0x1;R1<-R1+1寄存器尋址寄存器尋址也是一種不需要訪問存儲器內(nèi)容的尋址方式,指令中直接指明操作數(shù)所在的寄存器,執(zhí)行時(shí)處理器直接訪問寄存器獲取操作數(shù)ARM指令的尋址方式ADDR1,R1,R2;R1<-R1+R2MOVR1,R0;R1<-R0寄存器偏移尋址寄存器偏移尋址是ARM指令特有的一種尋址方式,第2操作數(shù)可以在與第1操作數(shù)結(jié)合之前,進(jìn)行各種形式的移位操作ARM指令的尋址方式ADDR1,R1,R2,ROR#0x2;R2循環(huán)右移兩位后與R1相加,結(jié)果放入R1MOVR1,R0,LSLR2;R0邏輯左移R2位后放入R1中寄存器間接尋址寄存器間接尋址的指令中雖然也是指定寄存器,但并不是直接拿寄存器中的值來進(jìn)行運(yùn)算操作,此時(shí)寄存器中儲存的是地址,處理器需要根據(jù)這個地址從存儲器中獲取操作數(shù)。所以寄存器間接尋址是需要進(jìn)行存儲器訪問的,所以執(zhí)行效率比寄存器尋址要慢。ARM指令的尋址方式STRR1,[R2];將R1的值存入以R2內(nèi)容為地址的存儲器中SWPR1,R1,[R2];交換以R2為地址的存儲器內(nèi)容和R1內(nèi)容基址變址尋址基址變址尋址與寄存器間接尋址相似,但此時(shí)從寄存器取出的內(nèi)容需要加上指令所給定的偏移量,這樣才構(gòu)成操作數(shù)的有效地址。變址尋址方式通常用于訪問基地址附近的地址單元,常用于查表,數(shù)組操作,功能部件寄存器訪問等ARM指令的尋址方式opRd,[Rn,R1]opRd,[Rn,FlexOffset]opRd,[Rn,FlexOffset]!opRd,[Rn],FlexOffset多寄存器尋址多寄存器尋址方式可以在同一條指令中完成多個寄存器數(shù)據(jù)的傳送,最多可以傳送16個通用寄存器ARM指令的尋址方式LDMIAR0,{R1,R2,R3,R4,R5};R1<-R0,R2<-R0+4,…,R5<-R0+16STMIAR0,{R2-R5,R7};R0<-R2,R0+4<-R3,…,R0+12<-R5,R0+16<-R7堆棧尋址堆棧是一個后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),堆棧尋址方式會有一個指針,始終指向存儲單元的棧頂,這個指針需要用一個專門的寄存器來存放,這個寄存器一般是R13。ARM指令的尋址方式有四種棧堆形式:堆棧指針總是指向最后壓入堆棧的數(shù)據(jù),稱為滿堆棧(FullStack)堆棧指針指向下一個空位置時(shí),稱為空堆棧(EmptyStack)從低地址向高地址生長的堆棧叫遞增堆棧(AscendingStack)從高地址向低地址生長的堆棧叫遞減堆棧(DescendingStack)ARM指令的尋址方式ARM指令的尋址方式STMFDSP!,{R1-R7,LR};將R1-R7,LR存放到堆棧中,這條指令一般用來保護(hù)現(xiàn)場ARM指令的尋址方式相對尋址相對尋址可以看作是寄存器變址尋址方式的一個特例,因?yàn)榇藭r(shí)包含基地址的寄存器特指程序計(jì)數(shù)器PC,通過PC值與指令中的偏移量結(jié)合,生成有效的操作數(shù)地址。一般這種尋址方式用于指令跳轉(zhuǎn)BLLabel;轉(zhuǎn)跳到Label標(biāo)簽處…….Label:……

跳轉(zhuǎn)指令A(yù)RM轉(zhuǎn)跳指令主要用于:向后跳轉(zhuǎn)實(shí)現(xiàn)循環(huán);通過條件判斷實(shí)現(xiàn)現(xiàn)在跳轉(zhuǎn);子程序調(diào)用;切換處理器工作狀態(tài)。ARM實(shí)現(xiàn)程序跳轉(zhuǎn)有兩種方法將當(dāng)前的程序寄存器PC值改寫為跳轉(zhuǎn)的目的地址,此時(shí)可以實(shí)現(xiàn)4G地址范圍內(nèi)的長跳轉(zhuǎn)。使用專門的跳轉(zhuǎn)指令實(shí)現(xiàn),包括B、BL、BX和BLX指令等MOVPC,#immediate;PC<-immediateLDRPC,[PC,#offset];PC<-[PC+offset]跳轉(zhuǎn)指令B{cond},Label通用數(shù)據(jù)處理指令A(yù)RM的通用數(shù)據(jù)處理指令大致可以分為4類數(shù)據(jù)傳送指令算術(shù)邏輯運(yùn)算指令比較指令前導(dǎo)零計(jì)數(shù)指令數(shù)據(jù)傳送指令MOV(MOVE)和MVN(MOVENOT)格式為MOV指令將Operand2的值復(fù)制到Rd寄存器中,而MVN指令會先將Operand2按位取反后再復(fù)制到Rd寄存器中。舉例通用數(shù)據(jù)處理指令MOV{cond}{S}Rd,Operand2MVN{cond}{S}Rd,Operand2MOVSR0,R0,ASRR2MVNNER1#0x22算術(shù)邏輯運(yùn)算指令A(yù)DD和ADC,SUB和SBC,RSB和RSC這三組指令分別是加法指令,減法指令,逆向減法指令及其各自的帶進(jìn)位操作指令格式為舉例通用數(shù)據(jù)處理指令op{cond}{S}Rd,Rn,Operand2ADDSR6,R0,R3ADCSR7,R1,R4ADCR8,R2,R5算術(shù)邏輯運(yùn)算指令A(yù)ND,ORR,EOR,BIC這四條指令分別是邏輯與指令,邏輯或指令,邏輯異或指令和位清除指令格式為舉例通用數(shù)據(jù)處理指令op{cond}{S}Rd,Rn,Operand2EORR0,R1,#0xFF00ORRR1,R2,R4,LSR#2BICNESR5,R6,R1,RRX比較指令TST和TEQ位測試指令和相等測試指令格式為舉例通用數(shù)據(jù)處理指令TST{cond}Rn,Operand2TEQ{cond}Rn,Operand2TSTR1,#0x0FTEQNER9,#0x4000比較指令CMP和CMN比較指令和反值比較指令格式為舉例通用數(shù)據(jù)處理指令CMP{cond}Rn,Operand2CMN{cond}Rn,Operand2CMPLTR4,R2CMNR13,R5,LSL#4前導(dǎo)零計(jì)數(shù)指令CLZ前導(dǎo)零計(jì)數(shù)指令,它是從v5版本開始引入的格式為該指令從Rm寄存器值的高位開始計(jì)數(shù)(32位的數(shù)據(jù)即從[31]開始),直到遇到第一個非零位為止,統(tǒng)計(jì)總共前導(dǎo)零的個數(shù),并將統(tǒng)計(jì)值存入Rd中。3.3.2通用數(shù)據(jù)處理指令CLZ{cond}Rd,Rm乘法指令MUL和MLAMUL和MLA指令是32的乘法指令和乘加指令格式為舉例MUL{cond}{S}Rd,Rm,RsMLA{cond}{S}Rd,Rm,Rs,RnMULLTR7,R7,R8MLAR3,R2,R4,R6UMULL,UMLAL,SMULL和SMLAL上述指令的U表示無符號,S表示帶符號,L表示結(jié)果為長整型。所以上述指令分別叫做無符號長整型乘法指令,無符號長整型乘加指令,帶符號長整型乘法指令和帶符號長整型乘加指令格式為舉例乘法指令Op{cond}{S}RdLo,RdHi,Rm,RsUMULLSR1,R2,R3,R4UMLALNER1,R2,R3,R1SMULLR5,R4,R3,R2SMULLLESR5,R3,R2,R1SMULxy和SMLAxySMULxy指令和SMLAxy指令是16位的帶符號乘法指令格式為舉例乘法指令SMUL<x><y>{cond}Rd,Rm,RsSMLA<x><y>{cond}Rd,Rm,Rs,RnSMULTTR1,R2,R3SMLABTEQR2,R3,R4,R4SMULWy和SMLAWy分別是32*16位的帶符號乘法指令和乘加指令格式為舉例乘法指令SMULW<y>{cond}Rd,Rm,RsSMLAW<y>{cond}Rd,Rm,Rs,RnSMULWTVSR1,R2,R1SMLAWTR2,R2,R4,R4Load/Store內(nèi)存訪問指令LDR和STRLDR和STR指令是單一數(shù)據(jù)加載和存儲指令,LDR指令從內(nèi)存讀取數(shù)據(jù)裝入寄存器中,STR指令將寄存器中的數(shù)據(jù)存入內(nèi)存。格式為舉例op{cond}{B}{T}Rd,[Rn]op{cond}{B}Rd,[Rn,FlexOffset]{!}op{cond}{B}Rd,labelop{cond}{B}{T}Rd,[Rn],FlexOffsetLDRR0,[R1]STRTR2,[R0,R3,LSL#0x2]!LDRBR4,[R8],#0x4LDM和STM批量加載指令LDM將一片連續(xù)內(nèi)存單元的數(shù)據(jù)加載到一組通用寄存器中,而批量存儲指令STM將一組通用寄存器中的值存儲到一片連續(xù)內(nèi)存單元之中格式為舉例Load/Store內(nèi)存訪問指令op{cond}modeRn{!},reglist{^}LDMFAR5,{R1,R3,R5,R7}STMFDR13!,{R0-R4,LR};將R0-R4及LR壓入棧堆LDMFDR13!,{R0-R4,PC};恢復(fù)R0-R4及PC,一般用于程序返回SWP(Swap)交換指令SWP用于寄存器和存儲器之間內(nèi)容的交換,它將指定內(nèi)存單元的數(shù)據(jù)存入目標(biāo)寄存器,然后將源寄存器的內(nèi)容儲存到該內(nèi)存單元中格式為舉例Load/Store內(nèi)存訪問指令SWP{cond}{B}Rd,Rm,[Rn]SWPBR2,R3,[R4];SWPR1,R1,[R5];將R1與R5指定的內(nèi)存進(jìn)行內(nèi)容交換PLD預(yù)讀取PLD指令是ARMv5E版本引入的,它指示存儲器系統(tǒng)在接下去的幾條指令中很可能會有Load指令,存儲系統(tǒng)以此做好相應(yīng)的準(zhǔn)備,從而加速內(nèi)存訪問過程格式為舉例Load/Store內(nèi)存訪問指令PLD[Rn{,FlexOffset}]PLD[R2,#Label*5];Label*5在匯編時(shí)計(jì)算,范圍應(yīng)該在-4095到+4095PLD[R3,R2,LSR#0x2]ARM協(xié)處理器指令CDP和CDP2CDP是協(xié)處理器數(shù)據(jù)處理指令(CoprocessorDataoPeration),用來執(zhí)行特定的數(shù)據(jù)操作;CDP2是從ARMv5版本引進(jìn)的格式為舉例CDP{cond}coproc,opcode1,CRd,CRn,CRm{,opcode2}CDP2coproc,opcode1,CRd,CRn,CRm{,opcode2}CDPP3,2,C12,C10,C3,4;完成協(xié)處理器P3的初始化CDP2P6,1,C3,C4,C5LDC和LDC2,STC和STC2LDC指令將存儲器內(nèi)容復(fù)制到協(xié)處理器寄存器中,而STC指令則是將協(xié)處理器寄存器數(shù)據(jù)拷貝到存儲器中。格式為舉例ARM協(xié)處理器指令op{cond}{L}coproc,CRd,[Rn]op{cond}{L}coproc,CRd,[Rn,#{-}offset]{!}op{cond}{L}coproc,CRd,[Rn],#{-}offsetLDCP5,C2,[R4,#0x8]!STCP6,C2,[R3],#-0x7MCR,MCR2和MCRRMCR指令將ARM寄存器中的數(shù)據(jù)傳輸?shù)絽f(xié)處理器寄存器中。MCR指令將ARM寄存器中的數(shù)據(jù)傳輸?shù)絽f(xié)處理器寄存器中格式為

舉例ARM協(xié)處理器指令MCR{cond}coproc,opcode1,Rd,CRn,CRm{,opcode2}MCR2coproc,opcode1,Rd,CRn,CRm{,opcode2}MCRR{cond}coproc,opcode1,Rd,Rn,CRmMCRP7,3,R1,C3,C2,1;將ARM寄存器R1的數(shù)據(jù)存入?yún)f(xié)處理器P7的寄存器C2,C3中MRC,MRC2和MRRCMRC指令的數(shù)據(jù)傳輸方向與MCR指令相反,它將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM處理器寄存器中。MRC2指令是從ARMv5版本引入的,而MRRC指令從ARMv5E版本引入格式為舉例ARM協(xié)處理器指令MRC{cond}coproc,opcode1,Rd,CRn,CRm{,opcode2}MRC2coproc,opcode1,Rd,CRn,CRm{,opcode2}MRRC{cond}coproc,opcode1,Rd,Rn,CRmMRCP4,3,R1,C5,C6,1;將協(xié)處理器P4的寄存器數(shù)據(jù)傳送到ARM處理器寄存器中雜項(xiàng)指令SWI軟件中斷指令SWI用來實(shí)現(xiàn)在用戶模式下的程序調(diào)用管理模式下的代碼,這條指令造成處理器模式的切換,CPSR會被存入管理模式下的SPSR,隨后指令會跳轉(zhuǎn)到中斷向量。格式為舉例SWI{cond}immed_24SWI0x22222MRS和MSR狀態(tài)寄存器讀取指令MRS(MovetoARMRegisterfromStatusregister)和寫狀態(tài)寄存器指令MSR(MovetoaStatusregisterfromARMRegister),用于在程序狀態(tài)寄存器和ARM通用寄存器之間傳輸數(shù)據(jù)格式為舉例雜項(xiàng)指令MRS{cond}Rd,psrMSR{cond}<psr>_<field>,#immed_8rMSR{cond}<psr>_<field>,RmMSRR5,SPSRMSRCPSR_f,R7;更新狀態(tài)寄存器的標(biāo)志位BKPTARMv5版本引入的斷點(diǎn)指令,使用斷點(diǎn)指令使ARM處理器進(jìn)入Debug模式格式為舉例雜項(xiàng)指令BKPTimmed_16BKPT0xFF32BKPT640飽和算術(shù)指令QADD,QSUB,QDADD和QDSUB飽和算術(shù)指令(saturatingarithmeticinstructions)在發(fā)生溢出時(shí),Q位會被置位,若結(jié)果小于–231,返回的結(jié)果為–231,若結(jié)果大于231-1,則返回的結(jié)果為231-1。因此如果在計(jì)算結(jié)束后目標(biāo)寄存器保存了飽和數(shù)(–231或231-1)且Q置位,則說明程序發(fā)生了溢出。格式為舉例op{cond}Rd,Rm,RnQADDR3,R3,R2QDSUBR4,R3,R8ARM偽指令A(yù)DR小范圍的地址讀取偽指令,主要用來讀取基于PC相對偏移的地址或基于寄存器相對偏移的地址。格式為舉例ADR{cond}register,exprSUBR2,PC,0xC;相對PC偏移12個字節(jié)ADRL中等范圍地址取指偽指令,它的取值范圍比ADR要大,通常會用兩條指令來替代格式為舉例ARM偽指令A(yù)DR{cond}Lregister,exprstartMOVR4,#0x22ADRR2,start+60000LDR這里講的是LDR偽指令,不是內(nèi)存訪問指令LDR。LDR偽指令是大范圍地址讀取偽指令,用于加載32位的立即數(shù)或是一個地址值格式為舉例ARM偽指令LDR{cond}register,=[expr|label-expr]LDRR1,=0xFF0LDRR2,=0xFFFLDRR3,=place4、Thumb指令簡介Thumb指令將32位ARM指令的一個子集進(jìn)行編碼,成為一個16位的指令集。相對于ARM指令集,Thumb指令擁有更高的代碼密度,這對于嵌入式設(shè)備來說至關(guān)重要。Thumb指令繼承了ARM指令許多特點(diǎn),它也是采用Load/Store結(jié)構(gòu),有數(shù)據(jù)處理、數(shù)據(jù)傳送機(jī)流控制指令等。除了B指令外,Thumb指令都是無條件執(zhí)行的,許多Thumb指令數(shù)據(jù)處理指令都是采用2地址格式,即目的寄存器和源寄存器相同,而大多數(shù)ARM數(shù)據(jù)處理指令采用3地址格式BB指令是Thumb指令中唯一可以條件執(zhí)行的指令。格式為舉例Thumb跳轉(zhuǎn)指令B{cond}labelBEQlabelBloopBL帶鏈接的長跳轉(zhuǎn)格式為舉例Thumb跳轉(zhuǎn)指令BLlabelBLsection1BXBX指令在跳轉(zhuǎn)的同時(shí),會選擇性的切換指令集格式舉例Thumb跳轉(zhuǎn)指令BXRmBXR3BLXBLX是帶鏈接的跳轉(zhuǎn),并選擇性的切換指令集。指令格式如下:格式舉例Thumb跳轉(zhuǎn)指令BLXRmBLXlabelBLXR4BLXarmsubThumb通用數(shù)據(jù)處理指令A(yù)ND,ORR,EOR和BIC這四條指令是按位邏輯運(yùn)算指令,分別是按位與,按位或,按位異或和按位清零操作格式舉例opRd,RmORRR2,R3Thumb通用數(shù)據(jù)處理指令A(yù)SR,LSL,LSR和ROR這四條指令是移位指令,分這四條指令是按位邏輯運(yùn)算指令,分別是按位與,按位或,按位異或和按位清零操作格式舉例opRd,RsopRd,Rm,#exprASRR3,R5LSRR0,R3,#5LSLR1,R4,#0CMP和CMN比較指令和反值比較指令格式舉例Thumb通用數(shù)據(jù)處理指令CMPRn,#exprCMPRn,RmCMNRn,RmCMPR7,#255CMPR7,R12CMNR2,R3MOV,MVN和NEG格式:舉例Thumb通用數(shù)據(jù)處理指令MOVRd,#exprMOVRd,RmMVNRd,RmNEGRd,RmMOVR3,#0MOVR0,R12;此時(shí)不更新標(biāo)志位MVNR7,R1NEGR3,R3TST位測試指令格式舉例Thumb通用數(shù)據(jù)處理指令TSTRn,RmTSTR3,R4Thumb算術(shù)指令低寄存器

的ADD和SUB低寄存器是指指令中使用的寄存器范圍是R0-R7格式舉例opRd,Rn,RmopRd,Rn,#expr3opRd,#expr8ADDR2,R3,R4SUBR1,R2,#33ADDR5,#244高寄存器或低寄存器的ADD格式舉例Thumb算術(shù)指令opRd,RmADDR11,R3ADDR2,R3;此時(shí)和ADDR2,R2,R3等價(jià)ADDR3,R12sp的ADD和SUB這兩條指令將堆棧指針sp作為操作數(shù),用來增加或減少sp格式舉例Thumb算術(shù)指令A(yù)DDsp,#exprSUBsp,#exprADDsp#256SUBsp#vc+8Thumb算術(shù)指令pc或sp相關(guān)的ADD這條指令將sp或pc的值加上或減去一個常量,并將結(jié)果存入低寄存器中格式舉例ADDRd,Rp,#ex

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論