常用Cortex-M汇编指令
附录1列出了常用的Cortex-M汇编指令,包括:数据操作指令、转移指令、存储器数据传送指令、异常及其他指令等,上述每一类指令都按照16位指令和32位指令分别讲解。
1. 数据操作指令
表1.1  16位数据操作指令
SUB <Rd>, <Rn>, <Rm> Rd= Rn-Rm
SUB(减法)
SUB SP, #<imm7> * 4 SP-= imm7*4
TST(测试)TST <Rn>, <Rm> 执行Rn & Rm,并根据结果更新标志位
REV <Rd>, <Rn> Rd=Rn字内的字节顺序反转
REV(反转)
REVH/REV16(反转)REV16 <Rd>, <Rn> Rd=Rn两个半字内的字节顺序反转
SXTB(字节提取扩展符号位)SXTB <Rd>, <Rm> 从寄存器Rm中提取字节[7:0],传送到寄存器Rd中,并用符号位扩展到32位
SXTH(半字提取扩展符号位)SXTH <Rd>, <Rm> 从寄存器Rm中提取半字[15:0],传送到寄存器Rd中,并用符号位扩展到32位
UXTB(字节提取扩展零位)UXTB <Rd>, <Rm> 从寄存器Rm中提取字节[7:0],传送到寄存器Rd中,并
用零位扩展到32位
UXTH(半字提取扩展零位)UXTH <Rd>, <Rm> 从寄存器Rm中提取半字[15:0],传送到寄存器Rd中,并用零位扩展到32位
表1.2  32位数据操作指令
操作,Rm 的值不变
LSL (逻辑左移) LSL{S}.W <Rd>, <Rn>, <Rm> Rd= Rn<<Rm LSR (逻辑右移) LSR{S}.W <Rd>, <Rn>, <Rm> Rd= Rn>>Rm MLA (乘加) MLA.W <Rd>, <Rn>, <Rm>, <Racc> Rd= Racc+Rn*Rm MLS (乘减) MLS.W <Rd>, <Rn>, <Rm>, <Racc> Rd= Racc-Rn*Rm
MOVW.W <Rd>, #<imm16> 将16位立即数传送到Rd 的低半字中,并把高半字清零
MOVW (加载) MOVT (加载) MOVT.W <Rd>, #<imm16> 将16位立即数传送到Rd 的高半字中,Rd 的低半字不受影响 MUL (乘法) MUL.W <Rd>, <Rn>, <Rm> Rd= Rn*Rm ORR{S}.W <Rd>, <Rn>, #<imm12 Rd= Rn | imm12
ORR{S}.W <Rd>, <Rn>, <Rm>{, <shift>} 先移位Rm ,然后Rd= Rn | 新Rm ORN{S}.W <Rd>, <Rn>, #<immed12)  Rd= Rn | ~imm12
ORR (按位或) ORN (按位或) ORN{S}.W <Rd>, <Rn>, <Rm>{, <shift>} 先移位Rm ,然后Rd= Rn | ~新Rm RBIT (位反转) RBIT.W <Rd>, <Rm> Rd=Rm 按位反转后的值 REV.W <Rd>, <Rm> Rd=Rm 字内的字节顺序反转 REV16.W <Rd>, <Rn> Rd=Rn 每个半字内的字节顺序反转 REV (反转)
REVH/REV (16反转) REVSH (反转) REVSH.W <Rd>, <Rn> Rd=Rn 低半字内的字节反转后再符
号扩展
ROR (循环右移) ROR{S}.W <Rd>, <Rn>, <Rm> Rd= Rn 循环右移Rm 位 RRX (带进位循环右移一位)
RRX.W Rd, Rn
Rd = (Rn>>1)+(C<<31)
SBFX (带符号位段提取)
SBFX.W <Rd>, <Rn>, #<lsb>, #<width> 抽取Rn 中以lsb 位为最低有效位,
共width 宽度的位段,并带符号扩展到Rd 中 SDIV (带符号除法) SDIV<c><Rd>,<Rn>,<Rm>
Rd= Rn/Rm
SMLAL (带符号64位乘加)
SMLAL.W <RdLo>, <RdHi>, <Rn>, <Rm> RdHi:RdLo+= Rn*Rm SMULL 带符号64位乘法
SMULL.W <RdLo>, <RdHi>, <Rn>, <Rm> RdHi:RdLo= Rn*Rm
SSAT (带符号数饱和运算) SSAT<C><Rd>, #<imm>, <Rn>{, <shift>}  先移位Rn ,再把Rn 的低imm 位执
行带符号饱和操作,
并把结果带符号扩展后写到Rd
SBC{S}.W <Rd>, <Rn>, #<imm12>
offset指令是什么意思Rd= Rn- imm12-C SUB{S}.W <Rd>, <Rn>, #<imm12> Rd= Rn-imm12
SUB{S}.W <Rd>, <Rn>, <Rm>{, <shift>} 先移位Rm ,Rd= Rn-新Rm SBC (减法) SUB (减法) SUBW (减法) SUBW.W <Rd>, <Rn>, #<imm12> Rd= Rn-imm12
SXTB (带符号扩展) SXTH (带符号扩展)
SXTB.W <Rd>, <Rm>{,ROR #<imm>}
先循环移位Rm ,然后取出Rm 的低8位,带符号扩展到32位,并存储到Rd
SXTH.W <Rd>, <Rm>{,ROR #<imm>}
先循环移位Rm ,然后取出Rm 的低
16位,带符号扩展到32位,并存储到Rd
TEQ.W <Rn>, #<imm12>
Rn 与imm12按位异或,并根据结果更新标志位
TEQ (按位异或)
TEQ.W <Rn>, <Rm>{, <shift>} 先移位Rm ,然后 Rn 与Rm 按位异或,并根据结果更新标志位 TST.W <Rn>, #<imm12)>
Rn 与imm12按位与,并根据结果更新标志位
TST (按位与)
TST.W <Rn>, <Rm>{, <shift>}
先移位Rm ,然后 Rn 与Rm 按位与,并根据结果更新标志位
UBFX (抽取) UBFX.W <Rd>, <Rn>, #<lsb>, #<width> 抽取Rn 中以lsb 位为最低有效位,
共width 宽度的位段,并无符号扩展到Rd 中
UDIV (无符号除法) UDIV<c><Rd>,<Rn>,<Rm>
Rd= Rn/Rm
UMLAL (无符号64位乘加)
UMLAL.W <RdLo>, <RdHi>, <Rn>, <Rm> RdHi:RdLo+= Rn*Rm UMULL (无符号64位乘法)
UMULL.W <RdLo>, <RdHi>, <Rn>, <Rm> RdHi:RdLo= Rn*Rm
USAT <c><Rd>, #<imm>, <Rn>{, <shift>}  先移位Rn ,再把Rn 的低imm 位执
行带符号饱和操作,
将结果无符号扩展后写到Rd 中
UXTB.W <Rd>, <Rm>{, <rotation>}
先循环移位Rm ,然后取出Rm 的低
8位,无符号扩展到32位,并存储到Rd
USAT (无符号扩展) UXTB (无符号扩展) UXTH (无符号扩展)
UXTH.W <Rd>, <Rm>{, <rotation>}
先循环移位Rm ,然后取出Rm 的低16位,无符号扩展到32位,并存储到Rd
2. 转移指令
表1.3  16位转移指令
CBZ <Rn>, <label> 比较结果为零时跳转CBZ (比较转移)
CBNZ(比较转移)CBNZ <Rn>, <label> 比较结果不为零时分支
IT<cond> 以下面一条指令为条件
IT<x><cond> 以下面两条指令为条件IT(条件转移)
IT<x><y><cond> 以下面三条指令为条件
IT<x><y><z><cond> 以下面四条指令为条件
表1.4  32位转移指令
3. 存储器数据传送指令
表1.5  16位存储器数据传送指令

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。