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

下載本文檔

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

文檔簡(jiǎn)介

第3章ARM9指令集和匯編第3章ARM9指令集和匯編提綱1、ARM指令集概述2、ARM指令的尋址方式3、ARM指令簡(jiǎn)介4、Thumb指令簡(jiǎn)介第3章ARM9指令集和匯編1、ARM指令集概述RISC簡(jiǎn)介ARM狀態(tài)和Thumb狀態(tài)ARM9指令類(lèi)型和指令的條件域第3章ARM9指令集和匯編RISC簡(jiǎn)介RISC是計(jì)算機(jī)中央處理器的一種設(shè)計(jì)模式全稱ReducedInstructionSetComputer,中文稱為精簡(jiǎn)指令集計(jì)算機(jī)RISC選取使用最為頻繁的簡(jiǎn)單指令及部分復(fù)雜指令,而且指令等長(zhǎng),通常指令為16位或32位第3章ARM9指令集和匯編ARM狀態(tài)和Thumb狀態(tài)(1)從v4版本開(kāi)始,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í)行第3章ARM9指令集和匯編必須使用ARM指令的情況ARM處理器啟動(dòng)的第一句指令必須是ARM指令訪問(wèn)程序狀態(tài)寄存器CPSR或協(xié)處理器時(shí)必須是ARM指令A(yù)RM在處理異常中斷時(shí)會(huì)自動(dòng)切換到ARM狀態(tài),執(zhí)行中斷處理程序入口處的程序。返回時(shí),會(huì)再次自動(dòng)切換到ARM狀態(tài)ARM指令A(yù)RM狀態(tài)和Thumb狀態(tài)(2)第3章ARM9指令集和匯編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)第3章ARM9指令集和匯編ARM狀態(tài)和Thumb狀態(tài)(4)不同狀態(tài)間的函數(shù)調(diào)用第3章ARM9指令集和匯編ARMv5版本后,引入了一條新的指令BLX,結(jié)合了BL和BX指令各自的功能特點(diǎn),使得上圖的所示過(guò)程通過(guò)一條指令就能實(shí)現(xiàn)ARM狀態(tài)和Thumb狀態(tài)(5)第3章ARM9指令集和匯編ARM9指令類(lèi)型和指令的條件域(1)ARM指令集屬于加載/存儲(chǔ)型指令指令的操作數(shù)都儲(chǔ)存在寄存器中,處理結(jié)果直接放回到目的寄存器中ARM9指令集可以分為6類(lèi)跳轉(zhuǎn)指令數(shù)據(jù)處理指令存儲(chǔ)器訪問(wèn)指令協(xié)處理器指令雜項(xiàng)指令飽和算術(shù)指令第3章ARM9指令集和匯編跳轉(zhuǎn)指令A(yù)RM9指令類(lèi)型和指令的條件域(2)第3章ARM9指令集和匯編數(shù)據(jù)處理指令A(yù)RM9指令類(lèi)型和指令的條件域(3)第3章ARM9指令集和匯編存儲(chǔ)器訪問(wèn)指令A(yù)RM9指令類(lèi)型和指令的條件域(4)第3章ARM9指令集和匯編協(xié)處理器指令A(yù)RM9指令類(lèi)型和指令的條件域(5)第3章ARM9指令集和匯編雜項(xiàng)指令A(yù)RM9指令類(lèi)型和指令的條件域(6)第3章ARM9指令集和匯編飽和算術(shù)指令A(yù)RM9指令類(lèi)型和指令的條件域(7)第3章ARM9指令集和匯編ARM指令一般由操作碼、目的寄存器、操作數(shù)幾部分組成,并可以配合條件碼,S后綴等可選項(xiàng)目,以完成更復(fù)雜操作,它的格式一般為:指令中<>內(nèi)的項(xiàng)目是必需的,比如opcode,Rd,Rn等,{}內(nèi)的項(xiàng)目是可選的ARM9指令類(lèi)型和指令的條件域(8)<opcode>{<cond>}{S}<Rd>,<Rn>{,<shift_op2>}第3章ARM9指令集和匯編opcode操作碼,即指令助記符,如BL,ADDcond條件碼,描述指令執(zhí)行的條件,在下文會(huì)有詳細(xì)介紹S可選后綴,若在指令后加上“S”,在指令完畢后會(huì)自動(dòng)更新CPSR中條件碼標(biāo)志位的值RdARM指令中的目標(biāo)操作數(shù)總是一個(gè)寄存器,通常用Rd表示Rn存放第1操作數(shù)的寄存器opcode2第2操作數(shù),它的使用非常靈活,不僅可以是寄存器,還能使用立即數(shù),而且能夠使用經(jīng)過(guò)位移運(yùn)算的寄存器和立即數(shù),這在下文也會(huì)介紹。ARM9指令類(lèi)型和指令的條件域(9)表3-1ARM指令格式第3章ARM9指令集和匯編ARM指令集幾乎每條指令(除了某些v5T指令)都可以是條件執(zhí)行的。指令的最高4位[31:28]稱為條件碼:ARM9指令類(lèi)型和指令的條件域AMR指令條件碼助記符描述CPSR條件碼標(biāo)志位的值0000EQ相等,運(yùn)行結(jié)果為0Z置位0001NE不相等,運(yùn)行結(jié)果不為0Z清零0010CS/HS無(wú)符號(hào)數(shù)大于等于C置位0011CC/LO無(wú)符號(hào)數(shù)小于C清零0100MI負(fù)數(shù)N置位0101PL非負(fù)數(shù)N清零0110VS上溢出V置位0111VC沒(méi)有上溢出V清零1000HI無(wú)符號(hào)數(shù)大于C置位且Z清零1001LS無(wú)符號(hào)數(shù)小于等于C清零且Z置位1010GE帶符號(hào)數(shù)大于等于N=V1011LT帶符號(hào)數(shù)小于N!=V1100GT帶符號(hào)數(shù)大于Z清零且N=V1101LE帶符號(hào)數(shù)小于等于Z置位且N!=V1110AL無(wú)條件執(zhí)行

1111系統(tǒng)保留

第3章ARM9指令集和匯編<shift_op2>形式非常靈活,共有11種形式:ARM9指令類(lèi)型和指令的條件域語(yǔ)法含義#<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)右移第3章ARM9指令集和匯編ARM指令集有5種形式的位移操作LSL邏輯左移LSR邏輯右移ASR算術(shù)右移

ROR循環(huán)右移RRX帶擴(kuò)展的循環(huán)右移ARM9指令類(lèi)型和指令的條件域第3章ARM9指令集和匯編邏輯左移(LogicalShiftLeft):操作時(shí)在移位操作時(shí),用0補(bǔ)足低位;而邏輯右移(LogicalShiftRight)移動(dòng)的方向相反,并用0補(bǔ)足高位。算術(shù)右移(ArithmeticShiftRight):在移位操作時(shí),根據(jù)符號(hào)位來(lái)補(bǔ)足高位,若原數(shù)符號(hào)位是1,即當(dāng)原數(shù)為負(fù)數(shù)時(shí),移位空出的高位都用1補(bǔ)足,反之則用0補(bǔ)足。循環(huán)右移(ROtateRight):可以將數(shù)字看做首位相接的“環(huán)形”,當(dāng)最低位被移出后,它會(huì)繞到數(shù)組的最高位去,繼續(xù)參與移位操作。帶擴(kuò)展的循環(huán)右移(RotateRightonebitwitheXtended):較前面的幾種移位方法復(fù)雜一些,它需要用到CPSR中的C位。當(dāng)最低位被向右移出后,最高位有C位的值補(bǔ)足,然后被移出的最低位被放到C位中。ARM9指令類(lèi)型和指令的條件域第3章ARM9指令集和匯編立即數(shù)#<immediate>并不是任意數(shù)都是合法的,在立即數(shù)尋址中,分配給立即數(shù)的空間是12位,8位用于保存一個(gè)常數(shù),4位用于保存循環(huán)右移基數(shù),而循環(huán)右移每次需要移動(dòng)偶數(shù)位,即右移的位數(shù)是基數(shù)*2。假設(shè)常數(shù)為A,循環(huán)右移位數(shù)為N,則最后得到的立即數(shù)=A循環(huán)右移(N*2位)。0x3FC立即數(shù)合法,A=0b11111111,N=0d150x1FE不合法ARM9指令類(lèi)型和指令的條件域第3章ARM9指令集和匯編3.2ARM指令的尋址方式立即尋址寄存器尋址寄存器偏移尋址寄存器間接尋址基址變址尋址多寄存器尋址堆棧尋址相對(duì)尋址第3章ARM9指令集和匯編立即尋址立即尋址也可被稱為立即數(shù)尋址,讀取指令后可以立即得到操作數(shù),而不需要去物理內(nèi)存得到相應(yīng)內(nèi)容。這個(gè)給出的操作數(shù)叫立即數(shù),它一般以“#”為前綴,“#0x”、“#0d”,“#0b”開(kāi)頭的計(jì)數(shù)用來(lái)表示十六進(jìn)制,十進(jìn)制和二進(jìn)制。ARM指令的尋址方式ADDR1,R1,#0x1;R1<-R1+1第3章ARM9指令集和匯編寄存器尋址寄存器尋址也是一種不需要訪問(wèn)存儲(chǔ)器內(nèi)容的尋址方式,指令中直接指明操作數(shù)所在的寄存器,執(zhí)行時(shí)處理器直接訪問(wèn)寄存器獲取操作數(shù)ARM指令的尋址方式ADDR1,R1,R2;R1<-R1+R2MOVR1,R0;R1<-R0第3章ARM9指令集和匯編寄存器偏移尋址寄存器偏移尋址是ARM指令特有的一種尋址方式,第2操作數(shù)可以在與第1操作數(shù)結(jié)合之前,進(jìn)行各種形式的移位操作ARM指令的尋址方式ADDR1,R1,R2,ROR#0x2;R2循環(huán)右移兩位后與R1相加,結(jié)果放入R1

MOVR1,R0,LSLR2;R0邏輯左移R2位后放入R1中第3章ARM9指令集和匯編寄存器間接尋址寄存器間接尋址的指令中雖然也是指定寄存器,但并不是直接拿寄存器中的值來(lái)進(jìn)行運(yùn)算操作,此時(shí)寄存器中儲(chǔ)存的是地址,處理器需要根據(jù)這個(gè)地址從存儲(chǔ)器中獲取操作數(shù)。所以寄存器間接尋址是需要進(jìn)行存儲(chǔ)器訪問(wèn)的,所以執(zhí)行效率比寄存器尋址要慢。ARM指令的尋址方式STRR1,[R2];將R1的值存入以R2內(nèi)容為地址的存儲(chǔ)器中SWPR1,R1,[R2];交換以R2為地址的存儲(chǔ)器內(nèi)容和R1內(nèi)容第3章ARM9指令集和匯編基址變址尋址基址變址尋址與寄存器間接尋址相似,但此時(shí)從寄存器取出的內(nèi)容需要加上指令所給定的偏移量,這樣才構(gòu)成操作數(shù)的有效地址。變址尋址方式通常用于訪問(wèn)基地址附近的地址單元,常用于查表,數(shù)組操作,功能部件寄存器訪問(wèn)等ARM指令的尋址方式opRd,[Rn,R1]opRd,[Rn,FlexOffset]opRd,[Rn,FlexOffset]!opRd,[Rn],FlexOffset第3章ARM9指令集和匯編多寄存器尋址多寄存器尋址方式可以在同一條指令中完成多個(gè)寄存器數(shù)據(jù)的傳送,最多可以傳送16個(gè)通用寄存器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第3章ARM9指令集和匯編堆棧尋址堆棧是一個(gè)后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),堆棧尋址方式會(huì)有一個(gè)指針,始終指向存儲(chǔ)單元的棧頂,這個(gè)指針需要用一個(gè)專門(mén)的寄存器來(lái)存放,這個(gè)寄存器一般是R13。ARM指令的尋址方式第3章ARM9指令集和匯編有四種棧堆形式:堆棧指針總是指向最后壓入堆棧的數(shù)據(jù),稱為滿堆棧(FullStack)堆棧指針指向下一個(gè)空位置時(shí),稱為空堆棧(EmptyStack)從低地址向高地址生長(zhǎng)的堆棧叫遞增堆棧(AscendingStack)從高地址向低地址生長(zhǎng)的堆棧叫遞減堆棧(DescendingStack)ARM指令的尋址方式第3章ARM9指令集和匯編ARM指令的尋址方式STMFDSP!,{R1-R7,LR};將R1-R7,LR存放到堆棧中,這條指令一般用來(lái)保護(hù)現(xiàn)場(chǎng)第3章ARM9指令集和匯編ARM指令的尋址方式相對(duì)尋址相對(duì)尋址可以看作是寄存器變址尋址方式的一個(gè)特例,因?yàn)榇藭r(shí)包含基地址的寄存器特指程序計(jì)數(shù)器PC,通過(guò)PC值與指令中的偏移量結(jié)合,生成有效的操作數(shù)地址。一般這種尋址方式用于指令跳轉(zhuǎn)BLLabel;轉(zhuǎn)跳到Label標(biāo)簽處…….Label:……

第3章ARM9指令集和匯編跳轉(zhuǎn)指令A(yù)RM轉(zhuǎn)跳指令主要用于:向后跳轉(zhuǎn)實(shí)現(xiàn)循環(huán);通過(guò)條件判斷實(shí)現(xiàn)現(xiàn)在跳轉(zhuǎn);子程序調(diào)用;切換處理器工作狀態(tài)。第3章ARM9指令集和匯編ARM實(shí)現(xiàn)程序跳轉(zhuǎn)有兩種方法將當(dāng)前的程序寄存器PC值改寫(xiě)為跳轉(zhuǎn)的目的地址,此時(shí)可以實(shí)現(xiàn)4G地址范圍內(nèi)的長(zhǎng)跳轉(zhuǎn)。使用專門(mén)的跳轉(zhuǎn)指令實(shí)現(xiàn),包括B、BL、BX和BLX指令等MOVPC,#immediate;PC<-immediateLDRPC,[PC,#offset];PC<-[PC+offset]跳轉(zhuǎn)指令B{cond},Label第3章ARM9指令集和匯編通用數(shù)據(jù)處理指令A(yù)RM的通用數(shù)據(jù)處理指令大致可以分為4類(lèi)數(shù)據(jù)傳送指令算術(shù)邏輯運(yùn)算指令比較指令前導(dǎo)零計(jì)數(shù)指令第3章ARM9指令集和匯編數(shù)據(jù)傳送指令MOV(MOVE)和MVN(MOVENOT)格式為MOV指令將Operand2的值復(fù)制到Rd寄存器中,而MVN指令會(huì)先將Operand2按位取反后再?gòu)?fù)制到Rd寄存器中。舉例通用數(shù)據(jù)處理指令MOV{cond}{S}Rd,Operand2MVN{cond}{S}Rd,Operand2MOVSR0,R0,ASRR2MVNNER1#0x22第3章ARM9指令集和匯編算術(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第3章ARM9指令集和匯編算術(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第3章ARM9指令集和匯編比較指令TST和TEQ位測(cè)試指令和相等測(cè)試指令格式為舉例通用數(shù)據(jù)處理指令TST{cond}Rn,Operand2TEQ{cond}Rn,Operand2TSTR1,#0x0FTEQNER9,#0x4000第3章ARM9指令集和匯編比較指令CMP和CMN比較指令和反值比較指令格式為舉例通用數(shù)據(jù)處理指令CMP{cond}Rn,Operand2CMN{cond}Rn,Operand2CMPLTR4,R2CMNR13,R5,LSL#4第3章ARM9指令集和匯編前導(dǎo)零計(jì)數(shù)指令CLZ前導(dǎo)零計(jì)數(shù)指令,它是從v5版本開(kāi)始引入的格式為該指令從Rm寄存器值的高位開(kāi)始計(jì)數(shù)(32位的數(shù)據(jù)即從[31]開(kāi)始),直到遇到第一個(gè)非零位為止,統(tǒng)計(jì)總共前導(dǎo)零的個(gè)數(shù),并將統(tǒng)計(jì)值存入Rd中。3.3.2通用數(shù)據(jù)處理指令CLZ{cond}Rd,Rm第3章ARM9指令集和匯編乘法指令MUL和MLAMUL和MLA指令是32的乘法指令和乘加指令格式為舉例MUL{cond}{S}Rd,Rm,RsMLA{cond}{S}Rd,Rm,Rs,RnMULLTR7,R7,R8MLAR3,R2,R4,R6第3章ARM9指令集和匯編UMULL,UMLAL,SMULL和SMLAL上述指令的U表示無(wú)符號(hào),S表示帶符號(hào),L表示結(jié)果為長(zhǎng)整型。所以上述指令分別叫做無(wú)符號(hào)長(zhǎng)整型乘法指令,無(wú)符號(hào)長(zhǎng)整型乘加指令,帶符號(hào)長(zhǎng)整型乘法指令和帶符號(hào)長(zhǎng)整型乘加指令格式為舉例乘法指令Op{cond}{S}RdLo,RdHi,Rm,RsUMULLSR1,R2,R3,R4UMLALNER1,R2,R3,R1SMULLR5,R4,R3,R2SMULLLESR5,R3,R2,R1第3章ARM9指令集和匯編SMULxy和SMLAxySMULxy指令和SMLAxy指令是16位的帶符號(hào)乘法指令格式為舉例乘法指令SMUL<x><y>{cond}Rd,Rm,RsSMLA<x><y>{cond}Rd,Rm,Rs,RnSMULTTR1,R2,R3SMLABTEQR2,R3,R4,R4第3章ARM9指令集和匯編SMULWy和SMLAWy分別是32*16位的帶符號(hào)乘法指令和乘加指令格式為舉例乘法指令SMULW<y>{cond}Rd,Rm,RsSMLAW<y>{cond}Rd,Rm,Rs,RnSMULWTVSR1,R2,R1SMLAWTR2,R2,R4,R4第3章ARM9指令集和匯編Load/Store內(nèi)存訪問(wèn)指令LDR和STRLDR和STR指令是單一數(shù)據(jù)加載和存儲(chǔ)指令,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],#0x4第3章ARM9指令集和匯編LDM和STM批量加載指令LDM將一片連續(xù)內(nèi)存單元的數(shù)據(jù)加載到一組通用寄存器中,而批量存儲(chǔ)指令STM將一組通用寄存器中的值存儲(chǔ)到一片連續(xù)內(nèi)存單元之中格式為舉例Load/Store內(nèi)存訪問(wèn)指令op{cond}modeRn{!},reglist{^}LDMFAR5,{R1,R3,R5,R7}STMFDR13!,{R0-R4,LR};將R0-R4及LR壓入棧堆LDMFDR13!,{R0-R4,PC};恢復(fù)R0-R4及PC,一般用于程序返回第3章ARM9指令集和匯編SWP(Swap)交換指令SWP用于寄存器和存儲(chǔ)器之間內(nèi)容的交換,它將指定內(nèi)存單元的數(shù)據(jù)存入目標(biāo)寄存器,然后將源寄存器的內(nèi)容儲(chǔ)存到該內(nèi)存單元中格式為舉例Load/Store內(nèi)存訪問(wèn)指令SWP{cond}{B}Rd,Rm,[Rn]SWPBR2,R3,[R4];SWPR1,R1,[R5];將R1與R5指定的內(nèi)存進(jìn)行內(nèi)容交換第3章ARM9指令集和匯編PLD預(yù)讀取PLD指令是ARMv5E版本引入的,它指示存儲(chǔ)器系統(tǒng)在接下去的幾條指令中很可能會(huì)有Load指令,存儲(chǔ)系統(tǒng)以此做好相應(yīng)的準(zhǔn)備,從而加速內(nèi)存訪問(wèn)過(guò)程格式為舉例Load/Store內(nèi)存訪問(wèn)指令PLD[Rn{,FlexOffset}]PLD[R2,#Label*5];Label*5在匯編時(shí)計(jì)算,范圍應(yīng)該在-4095到+4095PLD[R3,R2,LSR#0x2]第3章ARM9指令集和匯編ARM協(xié)處理器指令CDP和CDP2CDP是協(xié)處理器數(shù)據(jù)處理指令(CoprocessorDataoPeration),用來(lái)執(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,C5第3章ARM9指令集和匯編LDC和LDC2,STC和STC2LDC指令將存儲(chǔ)器內(nèi)容復(fù)制到協(xié)處理器寄存器中,而STC指令則是將協(xié)處理器寄存器數(shù)據(jù)拷貝到存儲(chǔ)器中。格式為舉例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],#-0x7第3章ARM9指令集和匯編MCR,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中第3章ARM9指令集和匯編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處理器寄存器中第3章ARM9指令集和匯編雜項(xiàng)指令SWI軟件中斷指令SWI用來(lái)實(shí)現(xiàn)在用戶模式下的程序調(diào)用管理模式下的代碼,這條指令造成處理器模式的切換,CPSR會(huì)被存入管理模式下的SPSR,隨后指令會(huì)跳轉(zhuǎn)到中斷向量。格式為舉例SWI{cond}immed_24SWI0x22222第3章ARM9指令集和匯編MRS和MSR狀態(tài)寄存器讀取指令MRS(MovetoARMRegisterfromStatusregister)和寫(xiě)狀態(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īng)顟B(tài)寄存器的標(biāo)志位第3章ARM9指令集和匯編BKPTARMv5版本引入的斷點(diǎn)指令,使用斷點(diǎn)指令使ARM處理器進(jìn)入Debug模式格式為舉例雜項(xiàng)指令BKPTimmed_16BKPT0xFF32BKPT640第3章ARM9指令集和匯編飽和算術(shù)指令QADD,QSUB,QDADD和QDSUB飽和算術(shù)指令(saturatingarithmeticinstructions)在發(fā)生溢出時(shí),Q位會(huì)被置位,若結(jié)果小于–231,返回的結(jié)果為–231,若結(jié)果大于231-1,則返回的結(jié)果為231-1。因此如果在計(jì)算結(jié)束后目標(biāo)寄存器保存了飽和數(shù)(–231或231-1)且Q置位,則說(shuō)明程序發(fā)生了溢出。格式為舉例op{cond}Rd,Rm,RnQADDR3,R3,R2QDSUBR4,R3,R8第3章ARM9指令集和匯編ARM偽指令A(yù)DR小范圍的地址讀取偽指令,主要用來(lái)讀取基于PC相對(duì)偏移的地址或基于寄存器相對(duì)偏移的地址。格式為舉例ADR{cond}register,exprSUBR2,PC,0xC;相對(duì)PC偏移12個(gè)字節(jié)第3章ARM9指令集和匯編ADRL中等范圍地址取指?jìng)沃噶?,它的取值范圍比ADR要大,通常會(huì)用兩條指令來(lái)替代格式為舉例ARM偽指令A(yù)DR{cond}Lregister,exprstartMOVR4,#0x22ADRR2,start+60000第3章ARM9指令集和匯編LDR這里講的是LDR偽指令,不是內(nèi)存訪問(wèn)指令LDR。LDR偽指令是大范圍地址讀取偽指令,用于加載32位的立即數(shù)或是一個(gè)地址值格式為舉例ARM偽指令LDR{cond}register,=[expr|label-expr]LDRR1,=0xFF0LDRR2,=0xFFFLDRR3,=place第3章ARM9指令集和匯編4、Thumb指令簡(jiǎn)介T(mén)humb指令將32位ARM指令的一個(gè)子集進(jìn)行編碼,成為一個(gè)16位的指令集。相對(duì)于ARM指令集,Thumb指令擁有更高的代碼密度,這對(duì)于嵌入式設(shè)備來(lái)說(shuō)至關(guān)重要。Thumb指令繼承了ARM指令許多特點(diǎn),它也是采用Load/Store結(jié)構(gòu),有數(shù)據(jù)處理、數(shù)據(jù)傳送機(jī)流控制指令等。除了B指令外,Thumb指令都是無(wú)條件執(zhí)行的,許多Thumb指令數(shù)據(jù)處理指令都是采用2地址格式,即目的寄存器和源寄存器相同,而大多數(shù)ARM數(shù)據(jù)處理指令采用3地址格式第3章ARM9指令集和匯編BB指令是Thumb指令中唯一可以條件執(zhí)行的指令。格式為舉例Thumb跳轉(zhuǎn)指令B{cond}labelBEQlabelBloop第3章ARM9指令集和匯編BL帶鏈接的長(zhǎng)跳轉(zhuǎn)格式為舉例Thumb跳轉(zhuǎn)指令BLlabelBLsection1第3章ARM9指令集和匯編BXBX指令在跳轉(zhuǎn)的同時(shí),會(huì)選擇性的切換指令集格式舉例Thumb跳轉(zhuǎn)指令BXRmBXR3第3章ARM9指令集和匯編BLXBLX是帶鏈接的跳轉(zhuǎn),并選擇性的切換指令集。指令格式如下:格式舉例Thumb跳轉(zhuǎn)指令BLXRmBLXlabelBLXR4BLXarmsub第3章ARM9指令集和匯編Thumb通用數(shù)據(jù)處理指令A(yù)ND,ORR,EOR和BIC這四條指令是按位邏輯運(yùn)算指令,分別是按位與,按位或,按位異或和按位清零操作格式舉例opRd,RmORRR2,R3第3章ARM9指令集和匯編Thumb通用數(shù)據(jù)處理指令A(yù)SR,LSL,LSR和ROR這四條指令是移位指令,分這四條指令是按位邏輯運(yùn)算指令,分別是按位與,按位或,按位異或和按位清零操作格式舉例opRd,RsopRd,Rm,#exprASRR3,R5LSRR0,R3,#5LSLR1,R4,#0第3章ARM9指令集和匯編CMP和CMN比較指令和反值比較指令格式舉例Thumb通用數(shù)據(jù)處理指令CMPRn,#exprCMPRn,RmCMNRn,RmCMPR7,#255CMPR7,R12CMNR2,R3第3章ARM9指令集和匯編MOV,MVN和NEG格式:舉例Thumb通用數(shù)據(jù)處理指令MOVRd,#exprMOVRd,RmMVNRd,RmNEGRd,RmMOVR3,#0MOVR0,R12;此時(shí)不更新標(biāo)志位MVNR7,R1NEGR3,R3第3章ARM9指令集和匯編TST位測(cè)試指令格式舉例Thumb通用數(shù)據(jù)處理指令TSTRn,RmTSTR3,R4第3章ARM9指令集和匯編Thumb算術(shù)指令低寄存器

的ADD和SUB低寄存器是指指令中使用的寄存器范圍是R0-R7格式舉例opRd,Rn,RmopRd,Rn,#expr3opRd,#expr8ADDR2,R3,R4SUBR1,R2,#33ADDR5,#244第3章ARM9指令集和匯編高寄存器或低寄存器的ADD格式舉例Thumb算術(shù)指令opRd,RmADDR11,R3ADDR2,R3;此時(shí)和ADDR2,R2,R3等價(jià)ADDR3,R12第3章ARM9指令集和匯編sp的ADD和SUB這兩條指令將堆棧指針sp作為操作數(shù),用來(lái)增加或減少sp格式舉例Thumb算術(shù)指令A(yù)DDsp,#exprSUBsp,#exprADDsp#256SUBsp#vc+8第3章ARM9指令集和匯編Thumb算術(shù)指令pc或sp相關(guān)的ADD這條指令將sp或pc的值加上或減去一個(gè)常量,并將結(jié)果存入低寄存器中格式舉例ADDRd,Rp,#exprADDR5,sp,#64ADDR3,pc,#980第3章ARM9指令集和匯編ADC,SBC和MUL這三條指令分別是帶進(jìn)位的加

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論