嵌入式系统原理与应用常用Cortex-M汇编指令_第1页
嵌入式系统原理与应用常用Cortex-M汇编指令_第2页
嵌入式系统原理与应用常用Cortex-M汇编指令_第3页
嵌入式系统原理与应用常用Cortex-M汇编指令_第4页
嵌入式系统原理与应用常用Cortex-M汇编指令_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

二常用Cortex-M汇编指令附录一列出了常用地Cortex-M汇编指令,包括:数据操作指令,转移指令,存储器数据传送指令,异常及其它指令等,上述每一类指令都按照一六位指令与三二位指令分别讲解。一.数据操作指令表一.一一六位数据操作指令指令名称指令格式指令功能ADC(带位加法)ADC<Rd>,<Rm>Rd+=Rm+CADD(加法)ADD<Rd>,<Rn>,#<imm三>Rd=Rn+imm三ADD<Rd>,#<imm八>Rd+=imm八ADD<Rd>,<Rn>,<Rm>Rd=Rn+RmADD<Rd>,<Rm>Rd+=RmADD<Rd>,PC,#<imm八>*四Rd=PC+imm八*四ADD<Rd>,SP,#<imm八>*四Rd=SP+imm八*四ADD<Rd>,SP,#<imm七>*四Rd=SP+imm七*四ADDSP,SP,#<imm七>*四SP+=imm七*四AND(按位与)AND<Rd>,<Rm>Rd&=RmASR(算术右移)ASR<Rd>,<Rm>,#<imm五>Rd=Rm算术右移imm五ASR<Rd>,<Rs>Rd=Rd算术右移寄存器Rs数个位数BIC(按位清零)BIC<Rd>,<Rs>Rd&=~RsN(负向比较)N<Rn>,<Rm>将Rm取二制补码后再与Rn比较P(比较)P<Rn>,#<imm八>Rn与八位立即数比较,并根据结果更新标志位地值P<Rn>,<Rm>Rn与Rm比较,并根据结果更新标志位地值EOR(异或)EOR<Rd>,<Rm>Rd^=RmLSL(逻辑左移)LSL<Rd>,<Rm>,#<imm五>Rd=Rm<<imm五LSL<Rd>,<Rs>Rd<<=RsLSR(逻辑右移)LSR<Rd>,<Rm>,#<imm五>LSR<Rd>,<Rs>Rd=Rm>>imm五Rd>>=RsMOV(传送)MOV<Rd>,#<imm八>Rd=(U三二)imm八MOV<Rd>,<Rm>Rd=RmMUL(乘法)MUL<Rd>,<Rm>Rd*=RmMVN(取按位取反值)MVN<Rd>,<Rm>Rd=~RmNEG(取补码值)NEG<Rd>,<Rm>Rd=~Rm+一ORR(按位或)ORR<Rd>,<Rm>Rd|=RmSBC(带借位减法)SBC<Rd>,<Rm>Rd-=Rm+CSUB(减法)SUB<Rd>,#<imm八>Rd-=imm八SUB<Rd>,<Rn>,<Rm>Rd=Rn-RmSUBSP,#<imm七>*四SP-=imm七*四TST(测试)TST<Rn>,<Rm>执行Rn&Rm,并根据结果更新标志位REV(反转)REVH/REV一六(反转)REV<Rd>,<Rn>Rd=Rn字内地字节顺序反转REV一六<Rd>,<Rn>Rd=Rn两个半字内地字节顺序反转SXTB(字节提取扩展符号位)SXTB<Rd>,<Rm>从寄存器Rm提取字节[七:零],传送到寄存器Rd,并用符号位扩展到三二位SXTH(半字提取扩展符号位)SXTH<Rd>,<Rm>从寄存器Rm提取半字[一五:零],传送到寄存器Rd,并用符号位扩展到三二位UXTB(字节提取扩展零位)UXTB<Rd>,<Rm>从寄存器Rm提取字节[七:零],传送到寄存器Rd,并用零位扩展到三二位UXTH(半字提取扩展零位)UXTH<Rd>,<Rm>从寄存器Rm提取半字[一五:零],传送到寄存器Rd,并用零位扩展到三二位表一.二三二位数据操作指令指令名称指令格式指令功能ADC(带位加法)ADC{S}.W<Rd>,<Rn>,#<imm一二>Rd=Rn+imm一二+C。有S就按结果更新标志位,下同ADC{S}.W<Rd>,<Rn>,<Rm>{,<shift>}Rd=Rn+移位后地Rm+C位ADD(加法)ADD{S}.W<Rd>,<Rn>,#<imm一二>Rd=Rn+imm一二ADD{S}.W<Rd>,<Rm>{,<shift>}Rd=Rd+移位后地RmADDW(宽加法)ADDW.W<Rd>,<Rn>,#<imm一二>Rd=Rn+imm一二AND(按位与)AND{S}.W<Rd>,<Rn>,#<imm一二>Rd=Rn&imm一二ASR(算术右移)ASR{S}.W<Rd>,<Rn>,<Rm>Rd=Rn>>Rm,有S按结果更新标志位BIC(按位清零)BIC{S}.W<Rd>,<Rn>,#<imm一二>Rd=Rn&~imm一二BIC{S}.W<Rd>,<Rn>{,<shift>}Rd&=移位后地Rn取反BFC(位区清零)BFC.WRd,#<lsb>,#<width>Rd[(width+lsb-一):lsb]=零,Rd其它位不受影响。BFI(位区插入)BFI.WRd,Rn,#<lsb>,#<width>Rd[(width+lsb-一):lsb]=Rn[(width-一):零],Rd其它位不受影响。N(负向比较)N.W<Rn>,#<imm一二>Rn与一二位立即数取补后地值比较,更新标志位N.W<Rn>,<Rm>{,<shift>}Rn与移位后地Rm取补后地值比较,更新标志位P(比较)P.W<Rn>,#<immed_一二>Rn与一二位立即数比较P.W<Rn>,<Rm>{,<shift>}Rn与移位后地Rm比较,Rm地值不变CLZ(计算前导零个数)CLZ.W<Rd>,<Rn>Rd=Rn前导零地数目EOR(异或)EOR{S}.W<Rd>,<Rn>,<Rm>{,<shift>}Rd=Rn与按需移位后地Rm作异或操作,Rm地值不变LSL(逻辑左移)LSL{S}.W<Rd>,<Rn>,<Rm>Rd=Rn<<RmLSR(逻辑右移)LSR{S}.W<Rd>,<Rn>,<Rm>Rd=Rn>>RmMLA(乘加)MLA.W<Rd>,<Rn>,<Rm>,<Racc>Rd=Racc+Rn*RmMLS(乘减)MLS.W<Rd>,<Rn>,<Rm>,<Racc>Rd=Racc-Rn*RmMOVW(加载)MOVT(加载)MOVW.W<Rd>,#<imm一六>将一六位立即数传送到Rd地低半字,并把高半字清零MOVT.W<Rd>,#<imm一六>将一六位立即数传送到Rd地高半字,Rd地低半字不受影响MUL(乘法)MUL.W<Rd>,<Rn>,<Rm>Rd=Rn*RmORR(按位或)ORN(按位或)ORR{S}.W<Rd>,<Rn>,#<imm一二Rd=Rn|imm一二ORR{S}.W<Rd>,<Rn>,<Rm>{,<shift>}先移位Rm,然后Rd=Rn|新RmORN{S}.W<Rd>,<Rn>,#<immed一二)Rd=Rn|~imm一二ORN{S}.W<Rd>,<Rn>,<Rm>{,<shift>}先移位Rm,然后Rd=Rn|~新RmRBIT(位反转)RBIT.W<Rd>,<Rm>Rd=Rm按位反转后地值REV(反转)REVH/REV(一六反转)REVSH(反转)REV.W<Rd>,<Rm>Rd=Rm字内地字节顺序反转REV一六.W<Rd>,<Rn>Rd=Rn每个半字内地字节顺序反转REVSH.W<Rd>,<Rn>Rd=Rn低半字内地字节反转后再符号扩展ROR(循环右移)ROR{S}.W<Rd>,<Rn>,<Rm>Rd=Rn循环右移Rm位RRX(带位循环右移一位)RRX.WRd,RnRd=(Rn>>一)+(C<<三一)SBFX(带符号位段提取)SBFX.W<Rd>,<Rn>,#<lsb>,#<width>抽取Rn以lsb位为最低有效位,width宽度地位段,并带符号扩展到RdSDIV(带符号除法)SDIV<c><Rd>,<Rn>,<Rm>Rd=Rn/RmSMLAL(带符号六四位乘加)SMLAL.W<RdLo>,<RdHi>,<Rn>,<Rm>RdHi:RdLo+=Rn*RmSMULL带符号六四位乘法SMULL.W<RdLo>,<RdHi>,<Rn>,<Rm>RdHi:RdLo=Rn*RmSSAT(带符号数饱与运算)SSAT<C><Rd>,#<imm>,<Rn>{,<shift>}先移位Rn,再把Rn地低imm位执行带符号饱与操作,并把结果带符号扩展后写到RdSBC(减法)SUB(减法)SUBW(减法)SBC{S}.W<Rd>,<Rn>,#<imm一二>Rd=Rn-imm一二-CSUB{S}.W<Rd>,<Rn>,#<imm一二>Rd=Rn-imm一二SUB{S}.W<Rd>,<Rn>,<Rm>{,<shift>}先移位Rm,Rd=Rn-新RmSUBW.W<Rd>,<Rn>,#<imm一二>Rd=Rn-imm一二SXTB(带符号扩展)SXTH(带符号扩展)SXTB.W<Rd>,<Rm>{,ROR#<imm>}先循环移位Rm,然后取出Rm地低八位,带符号扩展到三二位,并存储到RdSXTH.W<Rd>,<Rm>{,ROR#<imm>}先循环移位Rm,然后取出Rm地低一六位,带符号扩展到三二位,并存储到RdTEQ(按位异或)TEQ.W<Rn>,#<imm一二>Rn与imm一二按位异或,并根据结果更新标志位TEQ.W<Rn>,<Rm>{,<shift>}先移位Rm,然后Rn与Rm按位异或,并根据结果更新标志位TST(按位与)TST.W<Rn>,#<imm一二)>Rn与imm一二按位与,并根据结果更新标志位TST.W<Rn>,<Rm>{,<shift>}先移位Rm,然后Rn与Rm按位与,并根据结果更新标志位UBFX(抽取)UBFX.W<Rd>,<Rn>,#<lsb>,#<width>抽取Rn以lsb位为最低有效位,width宽度地位段,并无符号扩展到RdUDIV(无符号除法)UDIV<c><Rd>,<Rn>,<Rm>Rd=Rn/RmUMLAL(无符号六四位乘加)UMLAL.W<RdLo>,<RdHi>,<Rn>,<Rm>RdHi:RdLo+=Rn*RmUMULL(无符号六四位乘法)UMULL.W<RdLo>,<RdHi>,<Rn>,<Rm>RdHi:RdLo=Rn*RmUSAT(无符号扩展)UXTB(无符号扩展)UXTH(无符号扩展)USAT<c><Rd>,#<imm>,<Rn>{,<shift>}先移位Rn,再把Rn地低imm位执行带符号饱与操作,将结果无符号扩展后写到RdUXTB.W<Rd>,<Rm>{,<rotation>}先循环移位Rm,然后取出Rm地低八位,无符号扩展到三二位,并存储到RdUXTH.W<Rd>,<Rm>{,<rotation>}先循环移位Rm,然后取出Rm地低一六位,无符号扩展到三二位,并存储到Rd二.转移指令表一.三一六位转移指令指令名称指令格式指令功能B(转移)BL(转移)BLX(转移)B<cond><targetaddress>按<cond>条件决定是否跳转B<label>无条件跳转BL<Rm>带链接跳转BLX<Rm>转移到由寄存器Rm给出地地址,Rm地LSB切换处理器状态,值得注意地是:因它带有改变状态地功能,因此Rm地LSB需要是一,以确保不会试图入Arm状态CBZ(比较转移)CBNZ(比较转移)CBZ<Rn>,<label>比较结果为零时跳转CBNZ<Rn>,<label>比较结果不为零时分支IT(条件转移)IT<cond>以下面一条指令为条件IT<x><cond>以下面两条指令为条件IT<x><y><cond>以下面三条指令为条件IT<x><y><z><cond>以下面四条指令为条件表一.四三二位转移指令指令名称指令格式指令功能B(转移)BL(转移)B.W<label>无条件分支BL<label>带链接地分支BL<C><label>带链接地分支(立即数)TBB(查表转移)TBH(查表转移)TBB[<Rn>,<Rm>]PC+=((U八)*(Rn+Rm))*二,从字节数组选一个八位前向跳转地址并转移TBH[<Rn>,<Rm>,LSL#一]PC+=((U一六)*(Rn+Rm*二))*二,从半字节数组选一个一六位前向跳转地址并转移三.存储器数据传送指令表一.五一六位存储器数据传送指令指令名称指令格式指令功能LDR(从存储器加载字到寄存器)LDR<Rd>,[<Rn>,#<offset五*四>]加载Rn[offset五*四]地址处地字到RdLDR<Rd>,[<Rn>,<Rm>]加载Rn[Rm]地址处地字到RdLDR<Rd>,[PC,#<offset八>*四]加载PC[offset八*四+四]地址处地字到RdLDR<Rd>,[SP,#<offset八>*四]加载SP[offset八*四]地址处地字到RdLDRH(从存储器加载半字到寄存器)LDRH<Rd>,[<Rn>,#<offset五>*二]加载Rn[offset五*二]地址处地半字到RdLDRH<Rd>,[<Rn>,<Rm>]加载Rn[Rm]地址处地半字到RdLDRB(从存储器加载字节到寄存器)LDRB<Rd>,[<Rn>,#<offset五>]加载Rn[offset五]地址处地字节到RdLDRB<Rd>,[<Rn>,<Rm>]加载Rn[Rm]地址处地字节到RdLDRSH(加载半字并扩展符号位)LDRSH<Rd>,[<Rn>,<Rm>]加载Rn+Rm地址处地半字,并带符号扩展送到RdLDRSB(加载字节并扩展符号位)LDRSB<Rd>,[<Rn>,<Rm>]加载Rn+Rm地址处地字节,并带符号扩展送到RdSTR(将寄存器地字存储到存储器)STR<Rd>,[<Rn>,#<offset五>*四]Rn[offset五*四]=RdSTR<Rd>,[<Rn>,<Rm>]Rn[Rm]=RdSTR<Rd>,[SP,#<offset八>*四]SP[offset八*四]=RdSTRH(将寄存器地低半字存储到存储器)STRH<Rd>,[<Rn>,#<offset五>*二]*((U一六*)(Rn+offset五*二))=(U一六)RdSTRH<Rd>,[<Rn>,<Rm>]*((U一六*)(Rn+Rm))=(U一六)RdSTRB(将寄存器地低字节存储到存储器)STRB<Rd>,[<Rn>,#<offset五>]*((U八*)(Rn+offset五))=(U八)RdSTRB<Rd>,[<Rn>,<Rm>]*((U八*)(Rn+Rm))=(U八)RdLDMIA(多字加载)LDMIA<Rn>!,<register>多个连续地存储器字加载STMIA(多字存储)STMIA<Rn>!,<registers>将多个寄存器字保存到连续地存储单元,首地址由Rn给出,每保存完一个Rn+四PUSH(压栈)PUSH<registers>若干寄存器压栈PUSH<registers,LR>若干寄存器与LR压栈POP(出栈)POP<registers>若干寄存器出栈PUSH<registers,PC>若干寄存器与PC出栈表一.六三二位存储器数据传送指令指令名称指令格式指令功能LDR(从存储器加载字到寄存器)LDR.W<Rxf>,[<Rn>,#<offset一二>]Rxf=Rn[offset一二]LDR.WPC,[<Rn>,#<offset一二>]PC=Rn[offset一二]LDR.W<Rxf>,[<Rn>],#+/–<offset八>Rxf=*Rn;Rn+/-=offset八LDR.W<Rxf>,[<Rn>,#<+/–<offset八>]!Rn+/-=offset八;Rxf=*RnLDR.WPC,[<Rn>,#+/–<offset八>]!PC=Rn[offset八]Rn+/-=offset八LDR.W<Rxf>,[<Rn>,<Rm>{,LSL#<shift>}]Rxf=Rn[左移后地Rm],左移只能是零,一,二,三LDR.WPC,[<Rn>,<Rm>{,LSL#<shift>}]PC=Rn[左移后地Rm],左移只能是零,一,二,三LDR.W<Rxf>,[PC,#+/–<offset一二>]Rxf=PC[+/–offset一二]LDR.WPC,[PC,#+/–<offset一二>]PC=PC[+/–offset一二]LDRH(从存储器加载半字到寄存器)LDRH.W<Rxf>,[<Rn>,#<offset一二>]Rxf=(U一六)Rn[offset一二]LDRH.W<Rxf>,[<Rn>,#<+/–<offset八>]!Rxf=(U一六)Rn[offset八];Rn+/-=offset八LDRH.W<Rxf>,[<Rn>,<Rm>{,LSL#<shift>}]Rxf=(U一六)Rn[左移后地Rm],左移只能是零,一,二,三LDRH.W<Rxf>,[PC,#+/–<offset一二>]Rxf=(U一六)PC[+/–offset一二]LDRB(从存储器加载字节到寄存器)LDRB.W<Rxf>,[<Rn>,#<offset一二>]Rxf=(U八)Rn[offset一二]LDRB.W<Rxf>.[<Rn>],#+/-<offset八>Rxf=(U八)*Rn;Rn+/-=offset八LDRB.W<Rxf>,[<Rn>,<Rm>{,LSL#<shift>}]Rxf=(U八)Rn[左移后地Rm];左移只能是零,一,二,三LDRB.W<Rxf>,[<Rn>,#<+/–<offset八>]!Rxf=Rn[offset八];Rn+/-=offset八LDRB.W<Rxf>,[PC,#+/–<offset一二>]Rxf=PC[+/–offset一二]LDRSH(加载半字并扩展符号位)LDRSH.W<Rxf>,[<Rn>,#<offset一二>]加载Rn+offset一二地址处地半字,并带符号扩展到RxfLDRSH.W<Rxf>,[<Rn>],#+/-<offset八>加载Rn地址处地半字,并带符号扩展到Rxf。然后Rn+/-=offset八LDRSH.W<Rxf>,[<Rn>,#<+/–<offset八>]!先做Rn+/-=offset八,再加载新Rn地址处地半字,并带符号扩展到RxfLDRSH.W<Rxf>,[<Rn>,<Rm>{,LSL#<shift>}]先把Rm按要求左移零,一,二,三位,再加载Rn+新Rm地址处地半字,并带符号扩展到RxfLDRSH.W<Rxf>,[PC,#+/–<offset一二>]加载PC+/–offset一二地址处地半字,并带符号扩展到RxfLDRSB(加载字节并扩展符号位)LDRSB.W<Rxf>,[<Rn>,#<offset一二>]加载Rn+offset一二地址处地字节,并带符号扩展到RxfLDRSB.W<Rxf>.[<Rn>],#+/-<offset八>加载Rn地址处地字节,并带符号扩展到Rxf,然后Rn+/-=offset八LDRSB.W<Rxf>,[<Rn>,#<+/–<offset八>]!先Rn+/-=offset八,再加载新Rn地址处地字节,并带符号扩展到RxfLDRSB.W<Rxf>,[<Rn>,<Rm>{,LSL#<shift>}]先把Rm按要求左移零,一,二,三位,再加载Rn+新Rm地址处地字节,并带符号扩展到RxfLDRSB.W<Rxf>,[PC,#+/–<offset一二>]加载PC+/-offset一二地址处地字节,并带符号扩展到RxfLDRD(加载双字)LDRD.W<Rxf>,<Rxf二>,[<Rn>,#+/–<offset八>*四]{!}读取Rn地址加上八位偏移量乘以四处地双字到Rxf(低三二位),Rxf二(高三二位),前索引。并且可选在加载后更新RnLDRD.W<Rxf>,<Rxf二>,[<Rn>],#+/–<offset八>*四读取Rn处地双字到Rxf(低三二位),Rxf二(高三二位);Rn+/-=offset八*四LDM(多字连续加载)LDM{IA|DB}.W<Rn>{!},<registers>多存储器寄存器加载,加载后加四或加载前减四STR(将寄存器地字存储到存储器)STR.W<Rxf>,[<Rn>,#<offset一二>]Rn[offset一二]=RxfSTR.W<Rxf>,[<Rn>],#+/–<offset八>Rn=Fxf,Rn+/-=offset八STR.W<Rxf>,[<Rn>,<Rm>{,LSL#<shift>}]先左移Rm,然后Rn[新Rm]=Rxf,左移位数只能是零,一,二,三STR{T}.W<Rxf>,[<Rn>,#+/–<offset八>]{!}Rn[+/-offset八]=Rxf,若有‘!’,则需执行Rn+/-=offset八STRB(将寄存器地低字节存储到存储器)STRB{T}.W<Rxf>,[<Rn>,#+/–<offset八>]{!}*((U八*)(Rn+offset八))=(U八)Rxf,若有‘!’,则需执行Rn+/-=offset八STRB.W<Rxf>,[<Rn>,#<offset一二>]*((U八*)(Rn+offset一二))=(U八)RxfSTRB.W<Rxf>,[<Rn>],#+/–<offset八>*((U八*)Rn)=(U八)Rxf,Rn+/-=offset八STRB.W<Rxf>,[<Rn>,<Rm>{,LSL#<shift>}]先左移Rm,左移位数只能是零,一,二,三,再*((U八*)(Rn+新Rm))=(U八)RxfSTM(将多寄存器地字存储到连续存储空间)STM{IA|DB}.W<Rn>{!},<registers>)多个寄存器字连续保存到由Rn给出地首地址,每存储一个后自增(IA)/每存储一个前自减(DB)STRD(将二个寄存器地双字存到存储器)STRD.W<Rxf>,<Rxf二>,[<Rn>,#+/–<offset八

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论