版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ARM(LatestFull ARM处理器寻址方 寄存器寻 立即寻 寄存器偏移寻 寄存器间接寻 基址寻 多寄存器寻 堆栈寻 块拷贝寻 相对寻 指令集介 ARM指令 指令格 第2个操作 条件 ARM存储器访问指 LDR和 LDM和 ARM数据处理指 数据传送指 算术逻辑运算指 比较指 乘法指 ARM跳转指 ARM协处理器指 ARM杂项指 ARM伪指 Thumb指令 Thumb指令集与ARM指令集的区 Thumb存储器访问指 LDR和 PUSH和 LDMIA和 Thumb数据处理指 数据传送指 算术逻辑运算指 比较指 Thumb跳转指 Thumb杂项指 Thumb伪指 伪指 符号定义伪指 数据定义伪指 DCD和 DCFD和 DCFS和 DCQ和 DCW和 报告伪指 TTL和 汇编控制伪指 IF、ELSE和 MACRO和 WHIL和 杂项伪指 CODE16和 GET和 PEQUIRE8和 ARM伪指 Thumb伪指 ARM汇编程序设 文件格 ARM汇编的一些规 汇编语句格 标 基于PC的标 基于寄存器的标 绝对地 局部标 符 常 数字常 字符常 布尔常 段定 宏定义及其作 子程序的调 数据比较跳 循 数据块复 栈操 特殊寄存器定义及应 散转功 查表操 长跳 对信号量的支 伪指令使 一个完整的例 外围部件控 三级流水线介 C与汇编混合编 内嵌汇 内嵌汇编的指令用 内嵌汇编器与armasm汇编器的差 内嵌汇编注意事 访问全局变 C与汇编相互调 寄存器的使用规 堆栈使用规 参数传递规 C程序调用汇编程 汇编程序调用C程 ARM指令集列 ARM存储器访问指令表列 ARM数据处理指令列 ARM乘法指令列 ARM跳转指令列 ARM协处理器指令列 ARM杂项指令列 ARM伪指令列 Thumb指令集列 Thumb存储器访问指令列 Thumb数据处理指令列 Thumb跳转指令及软中断指令列 Thumb伪指令列 汇编预定义变量及伪指 预定义的寄存器和协处理器 通用寄存 程序状态寄存 浮点数寄存 协处理器及协处理器寄存 内置变量列 伪指令列 指令条件码列 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:算术右移(ArithmeticShiftRight,移位过程中保持符号位不变,即如0,1ROR:循环右移(RotateRight,由字的低端移出的位填入字的高端空出的位LSLLSLLSRLSRASRRORASRRORRRX ;将R2中的数值作为地址,取出此地址中的数据保存在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地址上的存储器单元内容,执行条件AL ;加法指令,R1+1=R1影响CPSR寄存器,带有SSUBNESR1,R1,#0xD;条件执行减法运算(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无条件执行(指令默认条件 ;R0与R1比较 ;若R0>R1,则R0=R0+1 ;若R0<=R1,则若两个条件均成立,则将这两个数值相加,CIf((a!=10)&&(b!=20))ARMR0a,R1R0R010,R1R010R120,指令执行ARMRISC指令是一条寄存器和存储器内容交换的指令,可用于信号量操作等。ARM处理器是冯.IO、程序数据的访问均要通过加载/存储指令进行。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单一字节或字的数据从/到内存.LDR;STR Rd,<地址>;加载指定地址上的数据(字),放入Rd中 LDR{cond}B{T}Rd,<地址>;加载字节数据,放入Rd中,即Rd最低字节有效,高24位清STR{cond}B{T}Rd,<地址>Rd,问看成是处理器是在用户模式下.TT.LDR/STR3立即数.立即数可以是一个无符号数值,这个数据可以加到基址寄存器,也可以从基址寄存器中减去这个数值.指令举例如下:LDRR1,[R0,#0x12]R0+0x12R1(R0LDRR1,[R0,#-0x12];将R0-0x12R1(R0LDRR1,[R0]R0R1寄存器.寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这个数值.指令举例值.指令举例如下: ;将R0+R2地址的数据计读出,保存到R1中(R0的值不变) ;将R0-R2地址处的数据计读出,保存到R1中(R0的值不变)(3)寄存器及移位常数.寄存器移位后的值可以加到基址寄存器,也可以从基址 R1,[R0,-R2,LSL#2];将R0-R2*4地址处的数据计读出,保存到R1中(R0,R2的值不变)从寻址方式的地址计算方法分,加载/存储指令有以下4种形式: RnRnR15.指令举例如下: Rd,[Rn,#-PC ;label,label±4KB后索引偏移.Rn的值用做传送数据的存储地址.在数据传送后,将偏移量与Rn.RnR15. R5R2R1R0+0x04,R0R2R3;读R6R7Rd,<Rd,<RdRd,<;加载半字数据,放入RdRd1616Rd,<Rd,16说明:带符号位半字/字节加载是指带符号位加载扩展到3232Rd2 ;将R9地址上的半字数据读出到R1,高16位用符号位扩展 R6,[R2],#2;将R2地址上的半字数据读出到R6,高16位用零扩展,,R2=R2+1 R1,[R0,#2]!;将R1的数据保存到R2+2地址中,只存储低2字节数据,R0=R0+2LDR/STR指令用于对内存变量的访问,内存缓冲区数据的访问、查表、外围部件 GPIOGPIO- GPIO R0,=GPIO- 32 ;IODIR=0x00FFFF00,IODIR R2,R2,LSL4,FUN-FUN-FUN-FUN-LDM批量加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数STM STM{cond}<模式 44IA:IB:DA:DB:FD:ED:FA:EA:表示最后的地址写回到Rnreglist“^”LDMPCPC ;加载R0指向的地址上的多字数据,保存到R3~R9中,R0值更新 ;将R3~R9的数据存储到R1指向的地址上,R1值更新 SP!,{R0-R7,LR};现场保存,将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指令用于将一个内存单元(该单元地址放在寄存器SWPSWP{cond}{B}进行交换;Rn,RnRdRmSWPSWPR1,R1,[R0]R1R0SWPR1,R2,,[R0];将R0R1SWP3MOVMVN),算术逻辑运算指令ARMSCMP,CMN,TSTTEQS,它们会直接影响状态标志.ARMMOVRdMOVMVNRdMVNADDRd,RnADDSUBRd,RnRd←Rn-SUBRSBRd,RnRd←operand2-RSBADCRd,RnADCSBCRd,RnRd←Rn-operand2-SBCRSCRd,RnRd←operand2-Rn-RSCANDRd,RnANDORRRd,RnORREORRd,RnEORBICRd,RnBICCMP标志N、Z、C、V←Rn-CMPCMN标志N、Z、C、CMNTST标志N、Z、C、TSTTEQ标志N、Z、C、TEQ MOV;R3=R1<<2,;PC=LRMVN{cond}{S}Rd,operand2MVNR2加法运算指令.将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)-带进位逆向减法指令.用寄存器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比较,设置相关标志位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中的值作无符号数相乘,64位乘积与UMLAL{cond}{S}RdLo,RdHi,Rm,RsUMLAL 64RmRs32RdLo32RdHiSMULL{cond}{S}RdLo,RdHi,Rm,RsSMULL 64位有符号乘加指令.指令将Rm和Rs中的值作有符号数相乘,64位乘积与SMLAL{cond}{S}RdLo,RdHi,Rm,RsSMLAL ARM则是直接向PCB,带链接的跳转指令BLBX. BLLR←PC-4,BXPC←label,B{cond}BWAITA0x1234B±32MbR14(LR)链接寄存器中,然BL{cond}BL B±32MB.BL带状态切换的跳转指令.跳转到RmRm[0]1,BX{cond}ADRLR0,ThumbFun+1BX ;跳转到R0R0ARMARMLDC{L}coproc,CRdSTC{L}coproc,CRd,MCRcoproc,ARMMRCcoproc,协处理器寄存器到ARMCDP{cond}其中:coproc opcodel协处理器的特定操作码 ;协处理器操作,操作码为1协处理器数据读取指令.LDCLDC{cond}{L}coproc,CRd,<其中 可选后缀,指明是长整数传送 指令操作的协处理器名.标准名为pn,n为0~15 LDC指令举例如下: p5,c2,[R2,#4];读取R2+4p5c2 p6c2协处理器数据写入指令.STC STC指令举例如下: STCp5,c1,[Ro,#-MCR{cond}其中coprocpn,n0~15.cpcodel协处理器的特定操作码. 存放第1个操作数的协处理器寄存器 存放第2个操作数的协处理器寄存器. MCR ARMMRC{cond}coprocpn,n,0~15opcodel协处理器的特定操作码.CRdCRn存放第1CRm2opcode2可选的协处理器特定操作码.MRC指令举例如下 SWIMRSRd←psr,psrCPSRMSRpsr_fields←Rd/#immed_8r,psrCPSR软中断指令.SWI,CPSRSWI{cond}其中immed_24240~16777215SWISWI0SWI0x123456以提供相关的服务,这两种方法均是用户软件协定.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要传送到状态寄存器指定域的立即数,8位. MSR ;CPSR[7…0]=0xD3, 程序中不能通过MSRCPSRTARM/ThumbIRQ/FIQ ADR,ADRL,LDR,NOP在汇编编译源程序时,ADRADRADR{cond}register,exper其 加载的目标寄存 地址表达式.当地址值是非字地齐时,取值范围-255~255字节之间;当地址是字对齐时,取值范围-1020~1020PCARM7TDMIADR ADRR2 ADR译源程序时,ADRLADRLADRLADR{cond}其中 加载的目标寄存器 地址表达式。当地址值是非字对齐时,取范围-64K~64K字节 R1 100ADRL R1Thumb_Sub+1;取得了Thumb子程序入口地址,且R1的0位置1 ;调用Thumb子程序,并切换处理器状态 寄存器.在汇编编译源程序时,LDR数未超出MOVMVNMOVMVNLDR量放入字池,并使用一条程序相对偏移的LDR.LDR 32 PC ;加载DATA_BUF地址+60 伪指令LDR(3232 GPIOIOPIN IOPIN PCARMLDRLDR空操作伪指令.NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能为MOV,R0,R0,NOPSUBSR1,R1,#1BNEDELAY1Thumb的,它具有16位的代码密度.Thumb不是一个完整的体系结构,不能指望处理只执行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立即数偏移的LDRSTR Rd,[Rn,#immed_5×4];存储数据(字)到指定地址的存储单元,要存储数据在Rd中LDRHRd,[Rn,#immed_5×4];加载半字数据,放入Rd中,即Rd低16位有效,高16位清零STRHRd,[Rn,#immed_5×4];存储半字数据,要存储的数据在Rd,最低16位有效LDRBRd,[Rn,#immed_5×4];加载字节数据,放入Rd中,即Rd最低字节有效,高24位清零STRBRd,[Rn,#immed_5×4];存储字节数据,要存储的数据在Rd,最低字节有效 加载或存储的寄存器.必须为R0~R7. 偏移量.它是一个无符立即数表达式,其取值为立即数偏移的半字和字节加载是无符号的.数据加载到Rd的最低有效半字或字节,Rd0.地址对准一一字传送时,必须保证传送地址为3216 基址寄存器.必须为R0~R7 Rd地址对准—字传送时,必须保证传送地址为3216 其中: 加载或存储的寄存器.必须为 偏移量.它是一个无符立即数表达式,其取值为 4PCSPLDRSTRPC+0x08R0LOCALDATR7SP+1020R3;存储R2SPPUSHSP {R0-R0~R7,LR{R0-R0~R7PCLDMIA批量加载/存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据.ThumbLDMIASTMIA,LDMIA;STM8 加载/存储的寄存器列表.寄存器必须为R0~R7LDMIA/STMIARn R0,{R2-R7}R0R2~R7,R0 R1!,{R2-R7}R2~R7R1,R1大多数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影响BICRd←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状态标←Rn-Rm,Rn、Rm影响CMP状态标←Rn-expr,Rn影响CMN状态标←Rn+Rm,Rn、Rm影响TST状态标←Rn&Rm,Rn、Rm影响8(operand2)传送到目标寄存器(Rd).指令格 目标寄存器 Rd#expr时,必须在R0~R7之8MOVRd,#exprN和ZC和VMOV,Rd,RmNZ,且清除标志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,第一个操作数寄存器.expr立即数,在0~1020SP操作的ADD指令的指令格式如下 ADDSP,SP,#-;SP=SP-SUBSUBSUBRd,Rn,#expr3SUBRd,#expr8其中Rd目标寄存器.必须在R0~R7RnR0~R7RmR0~R7expr330~7 8SPSUBSUBSP,#exprSUBSP,SP,#expr SUB;R0=R2-;R2=R1-;R6=R6-;SP=SP-带进位加法指令.将RmRdCPSRCRdADC 第二个操作数寄存器.必须在R0~R7之间ADC ADC64带进位减法指令.用寄存器RdRm,再减去CPSRCC1),Rd 其 目标寄存器,也是第一个操作数寄存器.必须在R0~R7之 N、Z、C和V SBC64,(R1,R0)=(R1,R0)-RdRm,Rd Rm第二操作数寄存器.必须在R0~R7之间条件码标志:指令会更新N和ZMUL指令举例如下MUL Rd 第二个操作数寄存器.必须在R0~R7之间条件码标志:指令会更新N和Z标志 ;R0=R0& 其 目标寄存器,也是第一个操作数寄存器.必须在R0~R7之 条件码标志:指令会更新N和Z 逻辑异或操作指令.寄存器RdRnRd 第二个操作数寄存器.必须在R0~R7之间条件码标志:指令会更新N和ZEOR 位清除指令.将寄存器RdRmRd 其 目标寄存器,也是第一个操作数寄存器.必须在R0~R7之间 条件码标志:指令会更新N和ZBIC R1ASRASR 目标寄存器,也是第一个操作数寄存器.必须在R0~R7之间 立即数移位的源寄存器.必须在R0~R7之间 ASR C0,C 寄存器控制移位中包含位量的寄存器.必须在R0~R7之间 立即数移位的源寄存器.必须在R0~R7之间 LSL C0,CRd 目标寄存器,也是第一个操作数寄存器.必须在R0~R7之间 立即数移位的源寄存器.必须在R0~R7之间 LSR指令举例如下 C0,CRdROR 目标寄存器.也是第一个操作数寄存器.必须在R0~R7之间 寄存器控制移位中包含移位量的寄存器.必须在R0~R7之ROR指令举例如下 比较指令.指令使用寄存器Rn的值减去第二个操作数的值,根据操作的结果理新CPSRCMPCMPCMP,Rn#expr,RnR0~R7CMP,Rn,RmRnR0~R15第二个操作数寄存器.RmR0~R15N、Z、C和VCMP ;R1与R2比较,设置相关标志CPSRCMN 第二个操作数寄存器.必须在R0~R7之CMN ;R0R2位测试指令.指令将寄存器RnRmCPSRR0~R7R0~R7N、Z、C和VTST指令举例如下 R1ThumbBBLBXPC←labelThumbB{cond} 若使用condlabel252~+256label±2KR14(LR)链接寄存器中, 的位于也必须为0,跳转时自动将CPSRTARMBXBX ;跳转到R0R0Thumb软中断指令.SWI.CPSRSWI SWI指令举例如下SWI10SWI0x55提供相关的服务,这两种方法均是用户软件协定.SWI异常中断处理程序要通过读取引SWI881818Thumb小范围的地址读取伪指令.ADR指令将基于PC相对偏移的地址值读取到寄存器中.ADR 其 加载的目标寄存器 ADR伪指令举例如下 register,expr其 加载的目标寄存器 寄存器.在汇编编译源程序时,LDRLDR.LDRLDR其中,register加载的目标寄存器expr32label_exprPCLADR ;加载DATA_BUF地址+60 PCThumbLDRLDR空操作伪指令.NOPARMMOV,R8,R8.NOPNOPARM汇编程序的由机器指令,伪指令和宏指令组成.伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处理.在前面的ADR,ADRL,LDR,NOP当程序被汇编时,汇编程序将对每个调用进行展开,用宏定义取代源程序中的宏指令.变量赋值:SETA,SETL为一个协处理定义名称:CPFPA:FNGBLAGBLLGBLA ;设置变量为LCLALCLL variable定义的局部变量名。在其作用范围内必须惟一。局部变量的作 SETASETLvariable_aSETAexpr_avariable_lSETLexpr_lvariable_sSETS其中variable_aGBLA,LCLAexpr_a赋值的常数.variable_lGBLL,LCLLexpr_l逻辑值,即{TRUE}或{FALSE}. GBLS {R0- name 其 要定义的协处理器的寄存器名称 l CP其 要定义的协处理器名称 5DNVFP DN SN其 要定义的VFP寄存器名称expr双精度的VFP0~15,单精度的VFP0~31. ;将VFP单精度寄存器3名称定义为 FN l0:SPACE分配一段字节的内存单元,并用指定的数据初始化分配一段字的内存单元,并用指令的数据初始化:DCD分配一段字的内存单元,并用单精度的浮点数据初始化:DCFSDCFSU;分配一段半字的内存单元,并用指定的数据初始化:DCWDCWU;ARMLTORGLTORG伪指令常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器MAP{VAR}设置为该地址值{VAR}为汇编器的内置变量.^MAPMAP其 数字表达式或程序中的标号.当指令中没base_register,expr exprbase_register ;定义数据域Timer,长度为4字节 ;定义数据域Attrib,长度为4字节 ;相当于LDR,R0,[R9,#4]MAPFIELD.MAP的base-registerFIELDbase-registerMAP当指令中包含这一项时,labelexpr.count1,4count2,4count3,4MAP,FIELD 1000DCB expr{,expr}{,expr}… -“Send,dataisDCDDCDexpr.DCD需要字对齐,一般可用来定义数据表格或其它常数.&DCD{label} {label}DCDUexpr{,expr}{,expr}… DCDO用于分配一段字内存单元.并将每个单元的内容初始化为该单元相对于静态基址寄存器的偏移量.DCDO伪指令作为基于静态基址寄存器R9的偏移量分配内存单元.DCDO{label}DCDO 其 内存块起始地址标号 ;分配32externsymR9个双精度的浮点数占据两个字单元。DCFD fpliteral{,fpliteral}{,fpliteral}… 单精度的浮点数占据一个字单元.DCFD 1.1E2,-在ARM,DCIexpr在Thumb,DCIexpr{label}DCI ;宏定义(定义NEWCMNRd,Rn指令) ;宏名为NEWCMN,参数为Rd和Rm DCQDCQ64literal.DCQ{label} {label}DCQU{-}literal{,{-其 内存块起始地址标号 时,取值范围为-263~-1 1234,-DCWDCWexpr.DCW DCWUexpr{,expr}{,expr}…其 内存块起始地址标号 -插入标题:TTLASSERT为断言错误伪指令.在汇编编译器对汇编程序的第二遍扫描中,如果其中ASSERT,ASSERT Top 其 数据表达式.若值为0,则在第一遍扫描时报告诊断 0,”Version0.1” cont1>cont2 ;如果cont1>cont2 1,”cont1 ;则在第一遍扫描时报告”cont1 n SET,GBL,LCL SET,GBL,LCL 102420484096819216384设置选项,显示MEND32768设置选项,不显示MEND默认情况下,-list选项生成常规的列表文件,包括变量声明,宏展开,条件汇编伪 TTLTTLSUBTTTLSUBT subc条件汇编控制:IF,ELSEENDIF宏定义 MACRO和重复汇编:WHILEIF,ELSEENDIF
其 用于控制的逻辑表达式.若条件成立,则代码段落在汇ELSEIF rt_udiv_1 R0,= rt_div0IF,ELSEENDIF {$parameter} 宏指令被展开时,label可被替换成相应的符号,通常为一 ;读取GPG0口的值 WHILWHILEWEND 其 用于控制的逻辑表达式.若条件成立,则代码段在汇 WHILEWEND 指令集定义:CODE16和CODE32 声明一个外部符号:IMPORTEXTERN包含文件:GET指示两段之间的依赖关系8:PEQUIRE8给特定的寄存器命名标记局部标号使用范围的界限 数字表达式,用于指定对齐的方式.取值为2的n次幂,如1,2,4,8,等,不能为0其没有expr.,则默认为字对齐方式.offset:offset+n*exprALIGN4ThumbALIGNCacheALIGN88地址标号通常自身没有对齐要求,而在ARM代码中要求地起标号对齐是字对齐的,ThumbALIGN4ALIGN2ALIGN Example PC UndtStackSpaceSPACE 将两个字节的数据放在同一个字的第一个字节和第四个字节中,带offsetALIGNAREA.ARMARM sectionname所定义的代码段或数据段的名称.如果该名称是以数据开头码段具有的约定的名称.如|text|表示C语言编译器产生的代码段或者与C语言库相关的代码段. AREAALIGNexpr.默认的情况下,ELF4,expr0~312exprexpr=3段,expr不能为01;sectionname COMDEF定义一个通用的段.该段可以包含代码或者数据.在其它源文件中,同名的COMDEFCOMMONCOMMON NOINIT0;READONLYREADONLY;READWRITEREADWRITE;使用AREAELFELF Example CODE3232ARMBX ExampleCODE,READONLYCODE16CODE32 END伪指令用于指示汇编编译器源文件已结束.每一个汇编源文件均要使用一个ENDENTRY. Example,CODE,READNOLY EQU*EQU基于寄存器的地址值,程序中的标号,3232当expr32typeexprT_bit,PLLCON,ABCDEXPORTGLOBALEXPORT 其 要声明的符号名 IMJPORTEXTERNIMPORT 其 要声明的符号名称 INCLUDEBLNOP GETGETINCLUDEGFT 其中filenameMAP和FIELD定义的结构化的数据类型,这样的源文件类似于C语言中的头文件,GET,INCLUDEINCBIN INCBIN其中filename要包含的源文件名,可以使用路径信息.INCBININCBININCBINcharlib.bin symbol要保留的局部标号.若没有此项,则除了基于寄存器处的所有符 其 所需要的标号的名称当进行链接处理时,包含了REQUIRE PEQUIRE8888RNname RN R6 RN R7{name}其 所定义的作用范围的名称当没有使用ROUT.ROUTROUTROUTROUT ;routineA %4routineAroutineA ;若条件成立,跳转到routineA ;routineAotherstuff ARMARM为小范围的地址读取伪指令.ADRPC对偏移的地址值读取到寄存器中,当地址值是非字对齐时,取值范围-255~255当地址值是字对齐时,取值范围-1020~1020器相对偏移的地址值读取到寄存器中,当地址值是非字对齐时,取值范围-64K~64K之间,当地址值是字对齐时,取值范围-256K~256KLDRPC4KB.为空操作伪指令.NOPARMMOVR0,R0LDFD ThumbThumb为小范围的地址读取伪指令.ADRPC1KB.为大范围的地址读取伪指令.LDR32PC1KB为空操作伪指令.NOPARMMOVR8,R8ARMCCCCARMARM格式:[标号 <指令|条件|S><操作数>[;注释
START Loop3PCPC99局部标号定义格式其中 局部标号,为 指示编译器只向前搜 如果F和BA和Troutname
123456十进制数,如0x4387,0xFF0,“$ “HelloWorld” “Theparameter“VFH””error$$2”布尔常量的逻辑真为{TRUE},逻辑假为{FALSE}. ARMARMARM30, 使用宏定义可以提高程序的可读性,简化程序代码和同步修改.ARMC的#defineMACROMEND程序程序清单见后,程序中定义了一个宏CALL,用于调用子程序,调用时设置所要调用的子程序名$Function及两个入口参数$dat1和$dat2.由于宏定义体中使用的是MOV$dat18CALL,3;设置子程序参数 BLPCLR, SP!{R0-R7,PCARM7TDMI(-S)是没有BLXBLX 汇编程序可以使用CMPARMR510,R1>R2,R1<=R2,;R1=R1&0x80,R1d70,0 程序可以使用存储器访问指令LDM/STM指令进行读取和存储,数据块复制示例如 R1!,{R2-R0!,{R2-10*N;NLDM/STMR13(SP),否则操作失败. SP!{R0- SP!{R0-ARMCMPR0,#MAXINDEX;判断索引号是否超出最大索引值ADDLOPC,PC,R0,LSL#2;若没有超出,则跳转到相应位置BERROR BFUN1BB R2,[R3,R5,LSL R50--FARMB和BLPC32PC,[PC,#- 也可使用伪指令 PC,=LADR_FUN实现长跳转 LDRNOP32 ;声明一个代码段Example ;切换到Thumb状态 ARMARMByBy email:\h100 CC在C程序嵌入汇编程序,可以实现一些高级语言没有的功能,提高程序执行效指令[;指令 /*注释嵌入汇编程序的例子如下所示,其中enable_IRQ函数为使能IRQ中断,而disable_IRQIRQIRQ MRS CPSRBICtmp,tmp,#0x80 CPSR 另外一个嵌入汇编程序的例子如下所示,其中my_strcpy函数是字符串复制函数,src,dstmy_strcpy(a,b)来调用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使用物理寄存器的指令中,不要使用过于复杂的C时,将会需要较多的物理寄存器.这些寄存器可能与指令中的物理寄存器使用冲突.指令展开.内嵌汇编指令中,如果包含常量操作数,该指令有可能被内嵌汇编器展开成几条指令.标号.CBCBLCSWIBLSWIBL312伪指令,而使用MOVRn,expr指令向寄存器赋值;不支持标号表达式;不支持ADR和ADRLBXPC时,N、Z、CVCCN,Z,C,V x/yR0 bad_f(int //xR0
R0,R0,#1x尽管根据编译器的编译规则似乎可以确定R0x,但这样的代码会使内嵌汇编器intbad_f(intx){ 使用内嵌式汇编无需保存和恢复寄存器.事实上,除了CPSRSPSR f(intx) asm LDMSTM模式,协处理器模式和FP,SL,SBAPCSC汇编语言中的”.”号作为操作数分隔符号.如果有CADD //“f(),z”C使用IMPORTLDRSTRLDRSTR 8LDMSTMC;加1PCCATPCS3ATPCSATPCS在汇编编译器中使用-apcsATPCSR0~R3记作V1~V8.如果在子程序中使用了寄存器V1~V8须保存这些寄存器的值,在返回前必须恢复这些寄存器的值.在ThumbR4~R7SPR14LR.它用于保存子程序的返回地址.如果R14R15PC.ATPCSFD8使用ADSDRAFT2调试器可以使用这些数据帧来查看堆栈中的相关信息.对于汇编语言来说,用户必须使FRAME.ARMDRAFT2存器和局部变量的区域).对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足下列条件:8在汇编程序中使用PRESERVE88对于参数个数可变的子程序,当参数不超过4R0~R34各字数据传送到寄存器R0,R1,R2,R34FPR0~R332R064R0R1ATPCSR0,R1调用汇编的C函数: voidstrcopy(char*d,constchar*s constchar*srcstr=“Firststring-source//定义字符串常量chardstsrt[]=“Secondstring-destination//定义字符串变量printf(“Beforecopying:\n”);printf(“’%s’\n‘%s\n,”srcstr,dststr);//显示源字符串和目标字符串的内容 printf(“Aftercopying:\n”)printf(“’%s’\n‘%s\n,”srcstr,dststr);strcopy ;R0;R1为源字符串的地 1IMPORTCCBLCC/*sum5()5intsum5(inta,litb,intc,intd,int 5汇编调用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标志N、Z、C、V←Rn-CMPCMN标志N、Z、C、CMNTST标志N、Z、C、TSTTEQ标志N、Z、C、TEQ 32 32 UMULL64UMLAL64SMULL64SMLAL64BBLLR←PC-4,BXPC←label,LDC{L}coproc,CRdSTC{L}coproc,CRd,MCRcoproc,ARMMRCcoproc,协处理器寄存器到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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年山东临床执业医师考试真题及答案
- 组织计划题答题思路及答案
- 2025年遵义市遵义县保安员招聘考试题库附答案解析
- 2025年陕西省渭南市蒲城县留置保安员笔试真题附答案解析
- 电工(高级)资格证考试综合检测题型汇编含答案详解【典型题】
- 2026年辽源职业技术学院高职单招职业适应性测试备考试题及答案详解
- 耳部疾病题库及答案
- 2025年鼻炎考试题及答案
- 电工(高级)资格证考试考前冲刺分析【黄金题型】附答案详解
- 2026年云南国土资源职业学院高职单招职业适应性测试备考试题及答案详解
- 会议纪要标准化撰写格式及案例参考
- 2025至2030供水产业行业项目调研及市场前景预测评估报告
- 高中诗歌手法鉴赏考试题
- 设备安装安全施工培训课件
- 投流年终工作总结
- 2026届陕西省西安市新城区高三上学期一模化学试题(含答案)
- 人机协同+智能安防系统可行性研究报告
- 统编教材五年级上册语文全册课后习题参考答案完整版
- 高空作业生命绳安全使用规范
- 车间消防安全注意事项知识
- 肋骨骨折出院健康宣教
评论
0/150
提交评论