版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
ARM(LatestFull ARM處理器尋址方 寄存器尋 立即尋 寄存器偏移尋 寄存器間接尋 基址尋 多寄存器尋 堆棧尋 塊拷貝尋 相對尋 指令集介 ARM指令 指令格 第2個操作 條件 ARM存儲器訪問指 LDR和 LDM和 ARM數(shù)據(jù)處理指 數(shù)據(jù)傳送指 算術(shù)邏輯運(yùn)算指 比較指 乘法指 ARM跳轉(zhuǎn)指 ARM協(xié)處理器指 ARM雜項指 ARM偽指 Thumb指令 Thumb指令集與ARM指令集的區(qū) Thumb存儲器訪問指 LDR和 PUSH和 LDMIA和 Thumb數(shù)據(jù)處理指 數(shù)據(jù)傳送指 算術(shù)邏輯運(yùn)算指 比較指 Thumb跳轉(zhuǎn)指 Thumb雜項指 Thumb偽指 偽指 符號定義偽指 數(shù)據(jù)定義偽指 DCD和 DCFD和 DCFS和 DCQ和 DCW和 報告?zhèn)沃? TTL和 匯編控制偽指 IF、ELSE和 MACRO和 WHIL和 雜項偽指 CODE16和 GET和 PEQUIRE8和 ARM偽指 Thumb偽指 ARM匯編程序設(shè) 文件格 ARM匯編的一些規(guī) 匯編語句格 標(biāo) 基于PC的標(biāo) 基于寄存器的標(biāo) 絕對地 局部標(biāo) 符 常 數(shù)字常 字符常 布爾常 段定 宏定義及其作 子程序的調(diào) 數(shù)據(jù)比較跳 循 數(shù)據(jù)塊復(fù) 棧操 特殊寄存器定義及應(yīng) 散轉(zhuǎn)功 查表操 長跳 對信號量的支 偽指令使 一個完整的例 外圍部件控 三級流水線介 C與匯編混合編 內(nèi)嵌匯 內(nèi)嵌匯編的指令用 內(nèi)嵌匯編器與armasm匯編器的差 內(nèi)嵌匯編注意事 訪問全局變 C與匯編相互調(diào) 寄存器的使用規(guī) 堆棧使用規(guī) 參數(shù)傳遞規(guī) C程序調(diào)用匯編程 匯編程序調(diào)用C程 ARM指令集列 ARM存儲器訪問指令表列 ARM數(shù)據(jù)處理指令列 ARM乘法指令列 ARM跳轉(zhuǎn)指令列 ARM協(xié)處理器指令列 ARM雜項指令列 ARM偽指令列 Thumb指令集列 Thumb存儲器訪問指令列 Thumb數(shù)據(jù)處理指令列 Thumb跳轉(zhuǎn)指令及軟中斷指令列 Thumb偽指令列 匯編預(yù)定義變量及偽指 預(yù)定義的寄存器和協(xié)處理器 通用寄存 程序狀態(tài)寄存 浮點數(shù)寄存 協(xié)處理器及協(xié)處理器寄存 內(nèi)置變量列 偽指令列 指令條件碼列 CPSR和SPSR分配 ARM9;R2->;R1- - SUBSR0,R0,#1 ;R0–1-> ;0xff00-> 16“0x”寄存器偏移尋址是ARM221 R0,R2,LSL#3 ;R23R0,R0=R2*8ANDSR1,R1,R2,LSLR3;R2R3R1R1LeftRightASR:算術(shù)右移(ArithmeticShiftRight,移位過程中保持符號位不變,即如0,1ROR:循環(huán)右移(RotateRight,由字的低端移出的位填入字的高端空出的位LSLLSLLSRLSRASRRORASRRORRRX ;將R2中的數(shù)值作為地址,取出此地址中的數(shù)據(jù)保存在R1中 R2,[R3,#0x0F];將R30x0FR2 R1,[R0,#-2]R02R1LDMIAR1!,{R2-R7,R12}R1R2-R7,R12,R11STMIAR0,{R3-R6,R10}R3-R6,R10R0,R01LDMFA,STMFALDMEA,STMEALDMFD,STMFDLDMED,STMED SP!,{R1- R1~R7,LR SP!,{R1- R1~R7,LRR0!,{R1-R1~R7R0!,{R1-R1~R7R0!,{R1-R1~R7R0!,{R1-R1~R7ROUTE1LOOPMOVARM指令集<opcode>{<cond>}{S}{<cond>}AL( LDR,STR EQ,NE CPSRCPSR, ;讀取R1地址上的存儲器單元內(nèi)容,執(zhí)行條件AL ;加法指令,R1+1=R1影響CPSR寄存器,帶有SSUBNESR1,R1,#0xD;條件執(zhí)行減法運(yùn)算(NE),R1-0xD=>R1,CPSR288 ;R20x0F, R0,[R1],#-4R1;R1-;PC=R0,nnnn1 其中,typeASR,LSL,ROR;Rs8 R1,R1,R1,LSL ;R1=R1-R15,UMULL無條件執(zhí)行(指令默認(rèn)條件 ;R0與R1比較 ;若R0>R1,則R0=R0+1 ;若R0<=R1,則若兩個條件均成立,則將這兩個數(shù)值相加,CIf((a!=10)&&(b!=20))ARMR0a,R1R0R010,R1R010R120,指令執(zhí)行ARMRISC指令是一條寄存器和存儲器內(nèi)容交換的指令,可用于信號量操作等。ARM處理器是馮.IO、程序數(shù)據(jù)的訪問均要通過加載/存儲指令進(jìn)行。ARM Rd←[addressing],addressing Rd←[addressing],addressing Rd←[addressing],addressingLDRBTRd←[addressing],addressing Rd←[addressing],addressingLDRSBRd←[addressing],addressingLDRSHRd←[addressing],addressing [addressing]←Rd,addressing [addressing]←Rd,addressing [addressing]←Rd,addressingSRTBT[addressing]←Rd,addressing [addressing]←Rd,addressingLDM{mode}reglist←[Rn…],RnSTM{mode}[Rn…]←reglist,Rn Rd←[Rd],[Rn]←[Rm](Rn≠Rd Rd←[Rd],[Rn]←[Rm](Rn≠RdLDR單一字節(jié)或字的數(shù)據(jù)從/到內(nèi)存.LDR;STR Rd,<地址>;加載指定地址上的數(shù)據(jù)(字),放入Rd中 LDR{cond}B{T}Rd,<地址>;加載字節(jié)數(shù)據(jù),放入Rd中,即Rd最低字節(jié)有效,高24位清STR{cond}B{T}Rd,<地址>Rd,問看成是處理器是在用戶模式下.TT.LDR/STR3立即數(shù).立即數(shù)可以是一個無符號數(shù)值,這個數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值.指令舉例如下:LDRR1,[R0,#0x12]R0+0x12R1(R0LDRR1,[R0,#-0x12];將R0-0x12R1(R0LDRR1,[R0]R0R1寄存器.寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值.指令舉例值.指令舉例如下: ;將R0+R2地址的數(shù)據(jù)計讀出,保存到R1中(R0的值不變) ;將R0-R2地址處的數(shù)據(jù)計讀出,保存到R1中(R0的值不變)(3)寄存器及移位常數(shù).寄存器移位后的值可以加到基址寄存器,也可以從基址 R1,[R0,-R2,LSL#2];將R0-R2*4地址處的數(shù)據(jù)計讀出,保存到R1中(R0,R2的值不變)從尋址方式的地址計算方法分,加載/存儲指令有以下4種形式: RnRnR15.指令舉例如下: Rd,[Rn,#-PC ;label,label±4KB后索引偏移.Rn的值用做傳送數(shù)據(jù)的存儲地址.在數(shù)據(jù)傳送后,將偏移量與Rn.RnR15. R5R2R1R0+0x04,R0R2R3;讀R6R7Rd,<Rd,<RdRd,<;加載半字?jǐn)?shù)據(jù),放入RdRd1616Rd,<Rd,16說明:帶符號位半字/字節(jié)加載是指帶符號位加載擴(kuò)展到3232Rd2 ;將R9地址上的半字?jǐn)?shù)據(jù)讀出到R1,高16位用符號位擴(kuò)展 R6,[R2],#2;將R2地址上的半字?jǐn)?shù)據(jù)讀出到R6,高16位用零擴(kuò)展,,R2=R2+1 R1,[R0,#2]!;將R1的數(shù)據(jù)保存到R2+2地址中,只存儲低2字節(jié)數(shù)據(jù),R0=R0+2LDR/STR指令用于對內(nèi)存變量的訪問,內(nèi)存緩沖區(qū)數(shù)據(jù)的訪問、查表、外圍部件 GPIOGPIO- GPIO R0,=GPIO- 32 ;IODIR=0x00FFFF00,IODIR R2,R2,LSL4,FUN-FUN-FUN-FUN-LDM批量加載/存儲指令可以實現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)STM STM{cond}<模式 44IA:IB:DA:DB:FD:ED:FA:EA:表示最后的地址寫回到Rnreglist“^”LDMPCPC ;加載R0指向的地址上的多字?jǐn)?shù)據(jù),保存到R3~R9中,R0值更新 ;將R3~R9的數(shù)據(jù)存儲到R1指向的地址上,R1值更新 SP!,{R0-R7,LR};現(xiàn)場保存,將R0~R7、LR入棧 SP!,{R0-R7,PC}^SPSTMFD/LDMFD、STMED。LDMED、STMFA/LDMFA、STMEA/LDMEA多寄存器傳送指令示意圖如圖所示,其中R1’ 指令STMIA 指令STMIB R1’指令STMDA R1!,R1’STMDBR1!,{R5-LDM/STMR0,{R2-8R2~R9SP!,{R0-DELAYSP!,{R0-寄存器和存儲器交換指令.SWP指令用于將一個內(nèi)存單元(該單元地址放在寄存器SWPSWP{cond}{B}進(jìn)行交換;Rn,RnRdRmSWPSWPR1,R1,[R0]R1R0SWPR1,R2,,[R0];將R0R1SWP3MOVMVN),算術(shù)邏輯運(yùn)算指令A(yù)RMSCMP,CMN,TSTTEQS,它們會直接影響狀態(tài)標(biāo)志.ARMMOVRdMOVMVNRdMVNADDRd,RnADDSUBRd,RnRd←Rn-SUBRSBRd,RnRd←operand2-RSBADCRd,RnADCSBCRd,RnRd←Rn-operand2-SBCRSCRd,RnRd←operand2-Rn-RSCANDRd,RnANDORRRd,RnORREORRd,RnEORBICRd,RnBICCMP標(biāo)志N、Z、C、V←Rn-CMPCMN標(biāo)志N、Z、C、CMNTST標(biāo)志N、Z、C、TSTTEQ標(biāo)志N、Z、C、TEQ MOV;R3=R1<<2,;PC=LRMVN{cond}{S}Rd,operand2MVNR2加法運(yùn)算指令.將operand2RnRdADD{cond}{S}Rd,Rn,operand2ADD R3,R1,R2,LSL#2SUB{cond}{S}Rd,Rn,operand2SUB ;R0=R0- RSB{cond}{S}Rd,Rn,operand2SUB ;R3=0xFF00- R1,R2,R2,LSL#2 RdADC{cond}{S}Rd,Rn,operand2ADC ADC64,(R1、R0)=(R1、R0)+(R3、非(C1RdSBC SBC64,(R1,R0)-帶進(jìn)位逆向減法指令.用寄存器operand2Rn,再減去CPSRCRdRSC{cond}{S}Rd,Rn,operand2RSC RSC64Rd AND 邏輯或操作指令.將operand2RnRd ORR R1,R2,LSR#4 R3,R1,R3,LSL#8ORRR28R3低8邏輯異或操作指令.將operand2RnRdEOR R1,R1,#0x0F;將R1的低4位取反 EORSR0,R5,#0x01R50x01R0,RdBICR14R2 CMP ;R1與R2比較,設(shè)置相關(guān)標(biāo)志位CMPSUBSCMPCMPCPSRCMN{cond}CMNR0,#1;R0+1,R01ZCPSRTST{cond}Rn,operand2TSTR0R14CPSR TEQ R0R1VCEQNE,EQNEARM 32 32 UMULL64UMLAL64SMULL64SMLAL6432RmRs32Rd MUL ;R0=R3×R7,CPSRNZ32RmRs332位保存到Rd中.指令格式如下: MLA指令舉例如下: 64RmRs32RsLo32RdHiUMULL{cond}{S}UMULL ;(R1、64位無符號乘加指令.指令將Rm和Rs中的值作無符號數(shù)相乘,64位乘積與UMLAL{cond}{S}RdLo,RdHi,Rm,RsUMLAL 64RmRs32RdLo32RdHiSMULL{cond}{S}RdLo,RdHi,Rm,RsSMULL 64位有符號乘加指令.指令將Rm和Rs中的值作有符號數(shù)相乘,64位乘積與SMLAL{cond}{S}RdLo,RdHi,Rm,RsSMLAL ARM則是直接向PCB,帶鏈接的跳轉(zhuǎn)指令BLBX. BLLR←PC-4,BXPC←label,B{cond}BWAITA0x1234B±32MbR14(LR)鏈接寄存器中,然BL{cond}BL B±32MB.BL帶狀態(tài)切換的跳轉(zhuǎn)指令.跳轉(zhuǎn)到RmRm[0]1,BX{cond}ADRLR0,ThumbFun+1BX ;跳轉(zhuǎn)到R0R0ARMARMLDC{L}coproc,CRdSTC{L}coproc,CRd,MCRcoproc,ARMMRCcoproc,協(xié)處理器寄存器到ARMCDP{cond}其中:coproc opcodel協(xié)處理器的特定操作碼 ;協(xié)處理器操作,操作碼為1協(xié)處理器數(shù)據(jù)讀取指令.LDCLDC{cond}{L}coproc,CRd,<其中 可選后綴,指明是長整數(shù)傳送 指令操作的協(xié)處理器名.標(biāo)準(zhǔn)名為pn,n為0~15 LDC指令舉例如下: p5,c2,[R2,#4];讀取R2+4p5c2 p6c2協(xié)處理器數(shù)據(jù)寫入指令.STC STC指令舉例如下: STCp5,c1,[Ro,#-MCR{cond}其中coprocpn,n0~15.cpcodel協(xié)處理器的特定操作碼. 存放第1個操作數(shù)的協(xié)處理器寄存器 存放第2個操作數(shù)的協(xié)處理器寄存器. MCR ARMMRC{cond}coprocpn,n,0~15opcodel協(xié)處理器的特定操作碼.CRdCRn存放第1CRm2opcode2可選的協(xié)處理器特定操作碼.MRC指令舉例如下 SWIMRSRd←psr,psrCPSRMSRpsr_fields←Rd/#immed_8r,psrCPSR軟中斷指令.SWI,CPSRSWI{cond}其中immed_24240~16777215SWISWI0SWI0x123456以提供相關(guān)的服務(wù),這兩種方法均是用戶軟件協(xié)定.SWI異常中斷處理程序要通過讀取SWI242412指令中的24R012在SWISWISWILRSWI TR0,[LR,#-Thumb(16Thumb8R0,[LR,#-ARM(32ARM24SP!,{R0-;SWIMRS{cond}Rd CPSR或SPSRSWI CPSRR1MRSR2,SPSRSPSRR2SPSR.MRSMSRCPSRSPSRSPSRMRSBICMSR SPSR.指令格式如下 其中:psrCPSR c(psr[7…0])xsfimmed_8r要傳送到狀態(tài)寄存器指定域的立即數(shù),8位. MSR ;CPSR[7…0]=0xD3, 程序中不能通過MSRCPSRTARM/ThumbIRQ/FIQ ADR,ADRL,LDR,NOP在匯編編譯源程序時,ADRADRADR{cond}register,exper其 加載的目標(biāo)寄存 地址表達(dá)式.當(dāng)?shù)刂分凳欠亲值佚R時,取值范圍-255~255字節(jié)之間;當(dāng)?shù)刂肥亲謱R時,取值范圍-1020~1020PCARM7TDMIADR ADRR2 ADR譯源程序時,ADRLADRLADRLADR{cond}其中 加載的目標(biāo)寄存器 地址表達(dá)式。當(dāng)?shù)刂分凳欠亲謱R時,取范圍-64K~64K字節(jié) R1 100ADRL R1Thumb_Sub+1;取得了Thumb子程序入口地址,且R1的0位置1 ;調(diào)用Thumb子程序,并切換處理器狀態(tài) 寄存器.在匯編編譯源程序時,LDR數(shù)未超出MOVMVNMOVMVNLDR量放入字池,并使用一條程序相對偏移的LDR.LDR 32 PC ;加載DATA_BUF地址+60 偽指令LDR(3232 GPIOIOPIN IOPIN PCARMLDRLDR空操作偽指令.NOP偽指令在匯編時將會被代替成ARM中的空操作,比如可能為MOV,R0,R0,NOPSUBSR1,R1,#1BNEDELAY1Thumb的,它具有16位的代碼密度.Thumb不是一個完整的體系結(jié)構(gòu),不能指望處理只執(zhí)行ARMARMThumbARMCODE32ARM3ARMR8~R15MOVADDR8~R15CPSRALUR8~R15ThumbCPSRALUThumbLDMSTMR0~R7R14,POPPC4.PUSHPOPThumbLDRRd←[Rm,#immed_5×4],Rd,RnLDRHRd←[Rm,#immed_5×2],Rd,RnLDRBRd←[Rm,#immed_5×1],Rd,RnSTRRn,#immed_5×4Rd←Rd,RnSTRHRn,#immed_5×2]Rd←Rd,RnSTRBRn,#immed_5×1]Rd←Rd,RnLDRRd←[Rn,Rm],Rd,Rn,RmLDRHRd←[Rn,Rm],Rd,Rn,RmLDRBRd←[Rn,Rm],Rd,Rn,RmLDRSHRd←[Rn,Rm],Rd,Rn,RmLDRSBRd←[Rn,Rm],Rd,Rn,RmSTR[Rn,Rm]←Rd,Rd,Rn,RmSTRH[Rn,Rm]←Rd,Rd,Rn,RmSTRB[Rn,Rm]←Rd,Rd,Rn,RmLDR基于PCRd←{PC,#immed_8×4]RdLDR基于PCRd←[label],RdLDR基于SPRd←{SP,#immed_8×4]RdSTR基于SP{SP,#immed_8×4]←Rd,RdLDMIAregist←[Rn…],RnSTMIA[Rn…]←reglist,RnPUSH[SP…]←reglist[,LR],SPPOPreglist[,PC]←[SP…],SPLDR立即數(shù)偏移的LDRSTR Rd,[Rn,#immed_5×4];存儲數(shù)據(jù)(字)到指定地址的存儲單元,要存儲數(shù)據(jù)在Rd中LDRHRd,[Rn,#immed_5×4];加載半字?jǐn)?shù)據(jù),放入Rd中,即Rd低16位有效,高16位清零STRHRd,[Rn,#immed_5×4];存儲半字?jǐn)?shù)據(jù),要存儲的數(shù)據(jù)在Rd,最低16位有效LDRBRd,[Rn,#immed_5×4];加載字節(jié)數(shù)據(jù),放入Rd中,即Rd最低字節(jié)有效,高24位清零STRBRd,[Rn,#immed_5×4];存儲字節(jié)數(shù)據(jù),要存儲的數(shù)據(jù)在Rd,最低字節(jié)有效 加載或存儲的寄存器.必須為R0~R7. 偏移量.它是一個無符立即數(shù)表達(dá)式,其取值為立即數(shù)偏移的半字和字節(jié)加載是無符號的.數(shù)據(jù)加載到Rd的最低有效半字或字節(jié),Rd0.地址對準(zhǔn)一一字傳送時,必須保證傳送地址為3216 基址寄存器.必須為R0~R7 Rd地址對準(zhǔn)—字傳送時,必須保證傳送地址為3216 其中: 加載或存儲的寄存器.必須為 偏移量.它是一個無符立即數(shù)表達(dá)式,其取值為 4PCSPLDRSTRPC+0x08R0LOCALDATR7SP+1020R3;存儲R2SPPUSHSP {R0-R0~R7,LR{R0-R0~R7PCLDMIA批量加載/存儲指令可以實現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù).ThumbLDMIASTMIA,LDMIA;STM8 加載/存儲的寄存器列表.寄存器必須為R0~R7LDMIA/STMIARn R0,{R2-R7}R0R2~R7,R0 R1!,{R2-R7}R2~R7R1,R1大多數(shù)Thumb2ARMR8~R15ThumbMOVRd←expr,Rd影響MOVRd←Rm,Rd、RmRdT和Rm均為R0~R7時,影響N,Z,清零MVNRd←(~Rm),Rd,Rm影響NEGRd←(-Rm),Rd,Rm影響ADDRd←Rn+Rm,Rd,Rn,Rm影響ADDRd←Rn+expr#,Rd,Rn影響ADDRd←Rd+expr8,Rd影響ADDRd←Rd+Rm,Rd,RmRdRmR0~R7時,影響ADDSP/PCRd←SP+exprPC+expr,RdADDSPSUBRd←Rn-Rm,Rd、Rn、Rm影響SUBRd←Rn-expr3,RdRn影響SUBRD←Rd-expr8,Rd影響SUBSPSP←SP-ADCRd←Rd+Rm+Carry,Rd、Rm影響SBCRd←Rd-Rm-(NOT)Carry,Rd、Rm影響MULRd←Rd*Rm,Rd、Rm影響ANDRd←Rd&Rm,Rd、Rm影響ORRRd←Rd|Rm,Rd、Rm影響EORRd←Rd^Rm,Rd、Rm影響B(tài)ICRd←Rd&(~Rm),Rd、Rm影響ASRRd←RdRs,Rd,Rs影響ASRRd←Rmexpr,Rd、Rm影響LSLRd←Rd<<Rs,Rd、Rs影響LSLRd←Rm<<expr,Rd、Rm影響LSRRd←Rd>>Rs,Rd、Rs影響LSRRd←Rm>>mexpr,Rd、Rm影響RORRd←RmRs,Rd、Rs影響CMP狀態(tài)標(biāo)←Rn-Rm,Rn、Rm影響CMP狀態(tài)標(biāo)←Rn-expr,Rn影響CMN狀態(tài)標(biāo)←Rn+Rm,Rn、Rm影響TST狀態(tài)標(biāo)←Rn&Rm,Rn、Rm影響8(operand2)傳送到目標(biāo)寄存器(Rd).指令格 目標(biāo)寄存器 Rd#expr時,必須在R0~R7之8MOVRd,#exprN和ZC和VMOV,Rd,RmNZ,且清除標(biāo)志CV.MOV;PC=LR,Rm(Rd). 源寄存器.必須在R0~R7之間指令會更新N和ZC和VMVN R2Rm1(Rd).R0~R7R0~R7NEG ;R1=-ADD 其中RdR0~R7RnR0~R7RmR0~R7expr330~7expr88ADDADD其中RdRmPCSPADD 其中RdR0~R7RpPCSP,第一個操作數(shù)寄存器.expr立即數(shù),在0~1020SP操作的ADD指令的指令格式如下 ADDSP,SP,#-;SP=SP-SUBSUBSUBRd,Rn,#expr3SUBRd,#expr8其中Rd目標(biāo)寄存器.必須在R0~R7RnR0~R7RmR0~R7expr330~7 8SPSUBSUBSP,#exprSUBSP,SP,#expr SUB;R0=R2-;R2=R1-;R6=R6-;SP=SP-帶進(jìn)位加法指令.將RmRdCPSRCRdADC 第二個操作數(shù)寄存器.必須在R0~R7之間ADC ADC64帶進(jìn)位減法指令.用寄存器RdRm,再減去CPSRCC1),Rd 其 目標(biāo)寄存器,也是第一個操作數(shù)寄存器.必須在R0~R7之 N、Z、C和V SBC64,(R1,R0)=(R1,R0)-RdRm,Rd Rm第二操作數(shù)寄存器.必須在R0~R7之間條件碼標(biāo)志:指令會更新N和ZMUL指令舉例如下MUL Rd 第二個操作數(shù)寄存器.必須在R0~R7之間條件碼標(biāo)志:指令會更新N和Z標(biāo)志 ;R0=R0& 其 目標(biāo)寄存器,也是第一個操作數(shù)寄存器.必須在R0~R7之 條件碼標(biāo)志:指令會更新N和Z 邏輯異或操作指令.寄存器RdRnRd 第二個操作數(shù)寄存器.必須在R0~R7之間條件碼標(biāo)志:指令會更新N和ZEOR 位清除指令.將寄存器RdRmRd 其 目標(biāo)寄存器,也是第一個操作數(shù)寄存器.必須在R0~R7之間 條件碼標(biāo)志:指令會更新N和ZBIC R1ASRASR 目標(biāo)寄存器,也是第一個操作數(shù)寄存器.必須在R0~R7之間 立即數(shù)移位的源寄存器.必須在R0~R7之間 ASR C0,C 寄存器控制移位中包含位量的寄存器.必須在R0~R7之間 立即數(shù)移位的源寄存器.必須在R0~R7之間 LSL C0,CRd 目標(biāo)寄存器,也是第一個操作數(shù)寄存器.必須在R0~R7之間 立即數(shù)移位的源寄存器.必須在R0~R7之間 LSR指令舉例如下 C0,CRdROR 目標(biāo)寄存器.也是第一個操作數(shù)寄存器.必須在R0~R7之間 寄存器控制移位中包含移位量的寄存器.必須在R0~R7之ROR指令舉例如下 比較指令.指令使用寄存器Rn的值減去第二個操作數(shù)的值,根據(jù)操作的結(jié)果理新CPSRCMPCMPCMP,Rn#expr,RnR0~R7CMP,Rn,RmRnR0~R15第二個操作數(shù)寄存器.RmR0~R15N、Z、C和VCMP ;R1與R2比較,設(shè)置相關(guān)標(biāo)志CPSRCMN 第二個操作數(shù)寄存器.必須在R0~R7之CMN ;R0R2位測試指令.指令將寄存器RnRmCPSRR0~R7R0~R7N、Z、C和VTST指令舉例如下 R1ThumbBBLBXPC←labelThumbB{cond} 若使用condlabel252~+256label±2KR14(LR)鏈接寄存器中, 的位于也必須為0,跳轉(zhuǎn)時自動將CPSRTARMBXBX ;跳轉(zhuǎn)到R0R0Thumb軟中斷指令.SWI.CPSRSWI SWI指令舉例如下SWI10SWI0x55提供相關(guān)的服務(wù),這兩種方法均是用戶軟件協(xié)定.SWI異常中斷處理程序要通過讀取引SWI881818Thumb小范圍的地址讀取偽指令.ADR指令將基于PC相對偏移的地址值讀取到寄存器中.ADR 其 加載的目標(biāo)寄存器 ADR偽指令舉例如下 register,expr其 加載的目標(biāo)寄存器 寄存器.在匯編編譯源程序時,LDRLDR.LDRLDR其中,register加載的目標(biāo)寄存器expr32label_exprPCLADR ;加載DATA_BUF地址+60 PCThumbLDRLDR空操作偽指令.NOPARMMOV,R8,R8.NOPNOPARM匯編程序的由機(jī)器指令,偽指令和宏指令組成.偽指令不像機(jī)器指令那樣在處理器運(yùn)行期間由機(jī)器執(zhí)行,而是匯編程序?qū)υ闯绦騾R編期間由匯編程序處理.在前面的ADR,ADRL,LDR,NOP當(dāng)程序被匯編時,匯編程序?qū)γ總€調(diào)用進(jìn)行展開,用宏定義取代源程序中的宏指令.變量賦值:SETA,SETL為一個協(xié)處理定義名稱:CPFPA:FNGBLAGBLLGBLA ;設(shè)置變量為LCLALCLL variable定義的局部變量名。在其作用范圍內(nèi)必須惟一。局部變量的作 SETASETLvariable_aSETAexpr_avariable_lSETLexpr_lvariable_sSETS其中variable_aGBLA,LCLAexpr_a賦值的常數(shù).variable_lGBLL,LCLLexpr_l邏輯值,即{TRUE}或{FALSE}. GBLS {R0- name 其 要定義的協(xié)處理器的寄存器名稱 l CP其 要定義的協(xié)處理器名稱 5DNVFP DN SN其 要定義的VFP寄存器名稱expr雙精度的VFP0~15,單精度的VFP0~31. ;將VFP單精度寄存器3名稱定義為 FN l0:SPACE分配一段字節(jié)的內(nèi)存單元,并用指定的數(shù)據(jù)初始化分配一段字的內(nèi)存單元,并用指令的數(shù)據(jù)初始化:DCD分配一段字的內(nèi)存單元,并用單精度的浮點數(shù)據(jù)初始化:DCFSDCFSU;分配一段半字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化:DCWDCWU;ARMLTORGLTORG偽指令常放在無條件跳轉(zhuǎn)指令之后,或者子程序返回指令之后,這樣處理器MAP{VAR}設(shè)置為該地址值{VAR}為匯編器的內(nèi)置變量.^MAPMAP其 數(shù)字表達(dá)式或程序中的標(biāo)號.當(dāng)指令中沒base_register,expr exprbase_register ;定義數(shù)據(jù)域Timer,長度為4字節(jié) ;定義數(shù)據(jù)域Attrib,長度為4字節(jié) ;相當(dāng)于LDR,R0,[R9,#4]MAPFIELD.MAP的base-registerFIELDbase-registerMAP當(dāng)指令中包含這一項時,labelexpr.count1,4count2,4count3,4MAP,FIELD 1000DCB expr{,expr}{,expr}… -“Send,dataisDCDDCDexpr.DCD需要字對齊,一般可用來定義數(shù)據(jù)表格或其它常數(shù).&DCD{label} {label}DCDUexpr{,expr}{,expr}… DCDO用于分配一段字內(nèi)存單元.并將每個單元的內(nèi)容初始化為該單元相對于靜態(tài)基址寄存器的偏移量.DCDO偽指令作為基于靜態(tài)基址寄存器R9的偏移量分配內(nèi)存單元.DCDO{label}DCDO 其 內(nèi)存塊起始地址標(biāo)號 ;分配32externsymR9個雙精度的浮點數(shù)占據(jù)兩個字單元。DCFD fpliteral{,fpliteral}{,fpliteral}… 單精度的浮點數(shù)占據(jù)一個字單元.DCFD 1.1E2,-在ARM,DCIexpr在Thumb,DCIexpr{label}DCI ;宏定義(定義NEWCMNRd,Rn指令) ;宏名為NEWCMN,參數(shù)為Rd和Rm DCQDCQ64literal.DCQ{label} {label}DCQU{-}literal{,{-其 內(nèi)存塊起始地址標(biāo)號 時,取值范圍為-263~-1 1234,-DCWDCWexpr.DCW DCWUexpr{,expr}{,expr}…其 內(nèi)存塊起始地址標(biāo)號 -插入標(biāo)題:TTLASSERT為斷言錯誤偽指令.在匯編編譯器對匯編程序的第二遍掃描中,如果其中ASSERT,ASSERT Top 其 數(shù)據(jù)表達(dá)式.若值為0,則在第一遍掃描時報告診斷 0,”Version0.1” cont1>cont2 ;如果cont1>cont2 1,”cont1 ;則在第一遍掃描時報告”cont1 n SET,GBL,LCL SET,GBL,LCL 102420484096819216384設(shè)置選項,顯示MEND32768設(shè)置選項,不顯示MEND默認(rèn)情況下,-list選項生成常規(guī)的列表文件,包括變量聲明,宏展開,條件匯編偽 TTLTTLSUBTTTLSUBT subc條件匯編控制:IF,ELSEENDIF宏定義 MACRO和重復(fù)匯編:WHILEIF,ELSEENDIF
其 用于控制的邏輯表達(dá)式.若條件成立,則代碼段落在匯ELSEIF rt_udiv_1 R0,= rt_div0IF,ELSEENDIF {$parameter} 宏指令被展開時,label可被替換成相應(yīng)的符號,通常為一 ;讀取GPG0口的值 WHILWHILEWEND 其 用于控制的邏輯表達(dá)式.若條件成立,則代碼段在匯 WHILEWEND 指令集定義:CODE16和CODE32 聲明一個外部符號:IMPORTEXTERN包含文件:GET指示兩段之間的依賴關(guān)系8:PEQUIRE8給特定的寄存器命名標(biāo)記局部標(biāo)號使用范圍的界限 數(shù)字表達(dá)式,用于指定對齊的方式.取值為2的n次冪,如1,2,4,8,等,不能為0其沒有expr.,則默認(rèn)為字對齊方式.offset:offset+n*exprALIGN4ThumbALIGNCacheALIGN88地址標(biāo)號通常自身沒有對齊要求,而在ARM代碼中要求地起標(biāo)號對齊是字對齊的,ThumbALIGN4ALIGN2ALIGN Example PC UndtStackSpaceSPACE 將兩個字節(jié)的數(shù)據(jù)放在同一個字的第一個字節(jié)和第四個字節(jié)中,帶offsetALIGNAREA.ARMARM sectionname所定義的代碼段或數(shù)據(jù)段的名稱.如果該名稱是以數(shù)據(jù)開頭碼段具有的約定的名稱.如|text|表示C語言編譯器產(chǎn)生的代碼段或者與C語言庫相關(guān)的代碼段. AREAALIGNexpr.默認(rèn)的情況下,ELF4,expr0~312exprexpr=3段,expr不能為01;sectionname COMDEF定義一個通用的段.該段可以包含代碼或者數(shù)據(jù).在其它源文件中,同名的COMDEFCOMMONCOMMON NOINIT0;READONLYREADONLY;READWRITEREADWRITE;使用AREAELFELF Example CODE3232ARMBX ExampleCODE,READONLYCODE16CODE32 END偽指令用于指示匯編編譯器源文件已結(jié)束.每一個匯編源文件均要使用一個ENDENTRY. Example,CODE,READNOLY EQU*EQU基于寄存器的地址值,程序中的標(biāo)號,3232當(dāng)expr32typeexprT_bit,PLLCON,ABCDEXPORTGLOBALEXPORT 其 要聲明的符號名 IMJPORTEXTERNIMPORT 其 要聲明的符號名稱 INCLUDEBLNOP GETGETINCLUDEGFT 其中filenameMAP和FIELD定義的結(jié)構(gòu)化的數(shù)據(jù)類型,這樣的源文件類似于C語言中的頭文件,GET,INCLUDEINCBIN INCBIN其中filename要包含的源文件名,可以使用路徑信息.INCBININCBININCBINcharlib.bin symbol要保留的局部標(biāo)號.若沒有此項,則除了基于寄存器處的所有符 其 所需要的標(biāo)號的名稱當(dāng)進(jìn)行鏈接處理時,包含了REQUIRE PEQUIRE8888RNname RN R6 RN R7{name}其 所定義的作用范圍的名稱當(dāng)沒有使用ROUT.ROUTROUTROUTROUT ;routineA %4routineAroutineA ;若條件成立,跳轉(zhuǎn)到routineA ;routineAotherstuff ARMARM為小范圍的地址讀取偽指令.ADRPC對偏移的地址值讀取到寄存器中,當(dāng)?shù)刂分凳欠亲謱R時,取值范圍-255~255當(dāng)?shù)刂分凳亲謱R時,取值范圍-1020~1020器相對偏移的地址值讀取到寄存器中,當(dāng)?shù)刂分凳欠亲謱R時,取值范圍-64K~64K之間,當(dāng)?shù)刂分凳亲謱R時,取值范圍-256K~256KLDRPC4KB.為空操作偽指令.NOPARMMOVR0,R0LDFD ThumbThumb為小范圍的地址讀取偽指令.ADRPC1KB.為大范圍的地址讀取偽指令.LDR32PC1KB為空操作偽指令.NOPARMMOVR8,R8ARMCCCCARMARM格式:[標(biāo)號 <指令|條件|S><操作數(shù)>[;注釋
START Loop3PCPC99局部標(biāo)號定義格式其中 局部標(biāo)號,為 指示編譯器只向前搜 如果F和BA和Troutname
123456十進(jìn)制數(shù),如0x4387,0xFF0,“$ “HelloWorld” “Theparameter“VFH””error$$2”布爾常量的邏輯真為{TRUE},邏輯假為{FALSE}. ARMARMARM30, 使用宏定義可以提高程序的可讀性,簡化程序代碼和同步修改.ARMC的#defineMACROMEND程序程序清單見后,程序中定義了一個宏CALL,用于調(diào)用子程序,調(diào)用時設(shè)置所要調(diào)用的子程序名$Function及兩個入口參數(shù)$dat1和$dat2.由于宏定義體中使用的是MOV$dat18CALL,3;設(shè)置子程序參數(shù) BLPCLR, SP!{R0-R7,PCARM7TDMI(-S)是沒有BLXBLX 匯編程序可以使用CMPARMR510,R1>R2,R1<=R2,;R1=R1&0x80,R1d70,0 程序可以使用存儲器訪問指令LDM/STM指令進(jìn)行讀取和存儲,數(shù)據(jù)塊復(fù)制示例如 R1!,{R2-R0!,{R2-10*N;NLDM/STMR13(SP),否則操作失敗. SP!{R0- SP!{R0-ARMCMPR0,#MAXINDEX;判斷索引號是否超出最大索引值A(chǔ)DDLOPC,PC,R0,LSL#2;若沒有超出,則跳轉(zhuǎn)到相應(yīng)位置BERROR BFUN1BB R2,[R3,R5,LSL R50--FARMB和BLPC32PC,[PC,#- 也可使用偽指令 PC,=LADR_FUN實現(xiàn)長跳轉(zhuǎn) LDRNOP32 ;聲明一個代碼段Example ;切換到Thumb狀態(tài) ARMARMByBy email:\h100 CC在C程序嵌入?yún)R編程序,可以實現(xiàn)一些高級語言沒有的功能,提高程序執(zhí)行效指令[;指令 /*注釋嵌入?yún)R編程序的例子如下所示,其中enable_IRQ函數(shù)為使能IRQ中斷,而disable_IRQIRQIRQ MRS CPSRBICtmp,tmp,#0x80 CPSR 另外一個嵌入?yún)R編程序的例子如下所示,其中my_strcpy函數(shù)是字符串復(fù)制函數(shù),src,dstmy_strcpy(a,b)來調(diào)用R0,R1,然#include<stdio.h>voidmy_strcpy(constchar*src, //ARM指令版本 world” my_strcpy,{R0,R1}my_strcpy()printf(“Originalstring:’%s’\n,”a);//顯示my_strcpy() PCBBL使用物理寄存器的指令中,不要使用過于復(fù)雜的C時,將會需要較多的物理寄存器.這些寄存器可能與指令中的物理寄存器使用沖突.指令展開.內(nèi)嵌匯編指令中,如果包含常量操作數(shù),該指令有可能被內(nèi)嵌匯編器展開成幾條指令.標(biāo)號.CBCBLCSWIBLSWIBL312偽指令,而使用MOVRn,expr指令向寄存器賦值;不支持標(biāo)號表達(dá)式;不支持ADR和ADRLBXPC時,N、Z、CVCCN,Z,C,V x/yR0 bad_f(int //xR0
R0,R0,#1x盡管根據(jù)編譯器的編譯規(guī)則似乎可以確定R0x,但這樣的代碼會使內(nèi)嵌匯編器intbad_f(intx){ 使用內(nèi)嵌式匯編無需保存和恢復(fù)寄存器.事實上,除了CPSRSPSR f(intx) asm LDMSTM模式,協(xié)處理器模式和FP,SL,SBAPCSC匯編語言中的”.”號作為操作數(shù)分隔符號.如果有CADD //“f(),z”C使用IMPORTLDRSTRLDRSTR 8LDMSTMC;加1PCCATPCS3ATPCSATPCS在匯編編譯器中使用-apcsATPCSR0~R3記作V1~V8.如果在子程序中使用了寄存器V1~V8須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值.在ThumbR4~R7SPR14LR.它用于保存子程序的返回地址.如果R14R15PC.ATPCSFD8使用ADSDRAFT2調(diào)試器可以使用這些數(shù)據(jù)幀來查看堆棧中的相關(guān)信息.對于匯編語言來說,用戶必須使FRAME.ARMDRAFT2存器和局部變量的區(qū)域).對于匯編程序來說,如果目標(biāo)文件中包含了外部調(diào)用,則必須滿足下列條件:8在匯編程序中使用PRESERVE88對于參數(shù)個數(shù)可變的子程序,當(dāng)參數(shù)不超過4R0~R34各字?jǐn)?shù)據(jù)傳送到寄存器R0,R1,R2,R34FPR0~R332R064R0R1ATPCSR0,R1調(diào)用匯編的C函數(shù): voidstrcopy(char*d,constchar*s constchar*srcstr=“Firststring-source//定義字符串常量chardstsrt[]=“Secondstring-destination//定義字符串變量printf(“Beforecopying:\n”);printf(“’%s’\n‘%s\n,”srcstr,dststr);//顯示源字符串和目標(biāo)字符串的內(nèi)容 printf(“Aftercopying:\n”)printf(“’%s’\n‘%s\n,”srcstr,dststr);strcopy ;R0;R1為源字符串的地 1IMPORTCCBLCC/*sum5()5intsum5(inta,litb,intc,intd,int 5匯編調(diào)用C程序的匯編程序: Example, ;LRsum5,R0;R1b,R2R3,[SP,#-e;R3sum5(),SPARMARM Rd←[addressing],addressing Rd←[addressing],addressing Rd←[addressing],addressingLDRBTRd←[addressing],addressing Rd←[addressing],addressingLDRSBRd←[addressing],addressingLDRSHRd←[addressing],addressing [addressing]←Rd,addressing [addressing]←Rd,addressing [addressing]←Rd,addressingSTRBT[addressing]←Rd,addressing [addressing]←Rd,addressingLDM{mode}reglist←[Rn…],RnSTM{mode}[Rn…]←reglist,Rn Rd←[Rd],[Rn]←[Rm](Rn≠Rd Rd←[Rd],[Rn]←[Rm](Rn≠RdARMMOVRdMOVMVNRdMVNADDRd,RnADDSUBRd,RnRd←Rn-SUBRSBRd,RnRd←operand2-RSBADCRd,RnADCSBCRd,RnRd←Rn-operand2-SBCRSCRd,RnRd←operand2-Rn-RSCANDRd,RnANDORRRd,RnORREORRd,RnEORBICRd,RnBICCMP標(biāo)志N、Z、C、V←Rn-CMPCMN標(biāo)志N、Z、C、CMNTST標(biāo)志N、Z、C、TSTTEQ標(biāo)志N、Z、C、TEQ 32 32 UMULL64UMLAL64SMULL64SMLAL64BBLLR←PC-4,BXPC←label,LDC{L}coproc,CRdSTC{L}coproc,CRd,MCRcoproc,ARMMRCcoproc,協(xié)處理器寄存器到ARMSWIMRSRd←psr,psrCPSRMSRpsr_fields←Rd/#immed_8r,psr為CPSRADRregister<-exprADRLregister<-exprregister,=expr/label-register<-expr/label-exprThumbLDRRd←[Rm,#immed_5×4],Rd,RnLDRHRd←[Rm,#immed_5×2],Rd,RnLDRBRd←[Rm,#immed_5×1],Rd,RnSTRRn,#immed_5×4Rd←Rd,RnSTRHRn,#immed_5×2]Rd←Rd,RnSTRBRn,#immed_5×1]Rd←Rd,RnLDRRd←[Rn,Rm],Rd,Rn,RmLDRHRd←[Rn,Rm],Rd,Rn,RmLDRBRd←[Rn,Rm],Rd,Rn,RmLDRSHRd←[Rn,Rm],Rd,Rn,RmL
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年財務(wù)基礎(chǔ)到財務(wù)經(jīng)理全科目考試題庫
- 2026年社會心理學(xué)研究方法與實踐題庫
- 2026年天津濱海職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題及答案詳細(xì)解析
- 2026湖北宏泰集團(tuán)應(yīng)屆高校畢業(yè)生春季招聘40人參考考試題庫及答案解析
- 2026貴州省自然資源廳直屬事業(yè)單位招聘20人民參考考試題庫及答案解析
- 外貌及五官課件
- 2026年河南交通職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試參考題庫含詳細(xì)答案解析
- 2026年湘潭醫(yī)衛(wèi)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試模擬試題及答案詳細(xì)解析
- 2026年常德職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試備考試題含詳細(xì)答案解析
- 2026年承德護(hù)理職業(yè)學(xué)院單招綜合素質(zhì)考試模擬試題含詳細(xì)答案解析
- 核酸口鼻采樣培訓(xùn)
- (新教材)2026年部編人教版一年級下冊語文 語文園地一 課件
- 2025年老年心理支持課件
- 孕期葉酸補(bǔ)充課件
- g120變頻器培訓(xùn)課件
- 煙草門店合作合同范本
- 職業(yè)病防治工作計劃與執(zhí)行步驟
- 二零二五年度快遞運(yùn)輸快遞網(wǎng)點加盟合作協(xié)議
- 相互抵款協(xié)議書范本
- (北師大版)八年級數(shù)學(xué)上冊(全冊)單元測試卷
- 電廠生產(chǎn)準(zhǔn)備管理制度
評論
0/150
提交評論