数据处理指令
Cortex-M3支持的数据处理指令非常多,这里就捡重要的、常用的来介绍。
四则运算指令
基本的加、减法运算有四条指令,分别是ADD、SUB、ADC、SBC
ADD Rd,Rn, Rm ; Rd = Rn+Rm
ADD Rd,Rm ; Rd += Rm
ADD Rd,#imm ; Rd += imm
ADC Rd,Rn, Rm ; Rd = Rn+Rm+C
ADC Rd,Rm ; Rd += Rm+C
ADC Rd,#imm ; Rd += imm+C
SUB Rd,Rn ; Rd -= Rn
SUB Rd,Rn, #imm3 ; Rd = Rn-imm3
SUB Rd,#imm8 ; Rd -= imm8
SUB Rd,Rn, Rm ; Rd = Rm-Rm
SBC Rd,Rm ; Rd -= Rm+C
SBC.W Rd,Rn, #imm12 ; Rd = Rn-imm12-C
SBC.W Rd,Rn, Rm ; Rd = Rn-Rm-C
除此之外,还有反向减法指令RSB:
RSB.W Rd,Rn, #imm12 ; Rd = imm12-Rn
RSB.W Rd,Rn, Rm ; Rd = Rm-Rn
乘、除法指令包括 MUL、UDIV/SDIV 等。
MUL Rd,Rm ; Rd *= Rm
MUL.W Rd,Rn, Rm ; Rd = Rn*Rm
UDIV Rd,Rn, Rm ; Rd = Rn/Rm (无符号除法)
SDIV Rd,Rn, Rm ; Rd = Rn/Rm (带符号除法)
一条指令可以实现乘加运算(通常只在DSP中才有):
MLA Rd, Rm, Rn, Ra ; Rd = Ra+Rm*Rn
MLS Rd, Rm, Rn, Ra ; Rd = Ra-Rm*Rn
还能进行32位乘32位的乘法运算(结果为64位):
SMULL RL, RH, Rm, Rn ;[RH:RL]= Rm*Rn,带符号的64位乘法
SMLAL RL, RH, Rm, Rn ;[RH:RL]+= Rm*Rn,带符号的64位乘法
UMULL RL, RH, Rm, Rn ;[RH:RL]= Rm*Rn,无符号的64位乘法
SMLAL RL, RH, Rm, Rn ;[RH:RL]+= Rm*Rn,无符号的64位乘法
由于有了这些指令,Cortex-M3具有了相当的计算能力,可以采用Cortex-M3代替曾经只能用DSP才能完成的计算。
逻辑运算相关的指令也很多,常用的包括AND,ORR, BIC(位段清零), ORN(按位或反码), EOR(异或),LSL(逻辑左移), LSR(逻辑右移), ASR(算数右移), ROR(圆周右移), RRX(带进位右移一位)
;按位与
AND Rd, Rn ; Rd &= Rn
AND.W Rd, Rn, #imm12 ; Rd = Rn & imm12
AND.W Rd, Rm, Rn ; Rd = Rm & Rn
;按位或
ORR Rd, Rn ; Rd |= Rn
ORR.W Rd, Rn, #imm12 ; Rd = Rn | imm12
ORR.W Rd, Rm, Rn ; Rd = Rm | Rn
;按位清零
BIC Rd, Rn ; Rd &= ~Rn
BIC.W Rd, Rn, #imm12 ; Rd = Rn & ~imm12
BIC.W Rd, Rm, Rn ; Rd = Rm & ~Rn
;按位或反
ORN.W Rd, Rn, #imm12 ; Rd = Rn | ~imm12
ORN.W Rd, Rm, Rn ; Rd = Rm | ~Rn
;按位异或
EOR Rd, Rn ; Rd ^= Rn
EOR.W Rd, Rn, #imm12 ; Rd = Rn ^ imm12
EOR.W Rd, Rm, Rn ; Rd = Rm ^ Rn
;逻辑左移
LSL Rd, Rn, #imm5 ; Rd = Rn< LSL Rd, Rn ; Rd <<= Rn LSL.W Rd, Rm, Rn ; Rd = Rm< ;逻辑右移 LSR Rd, Rn, #imm5 ; Rd = Rn>>imm5 LSR Rd, Rn ; Rd >>= Rn LSR.W Rd, Rm, Rn ; Rd = Rm>>Rn ;算术右移 ASR Rd, Rn, #imm5 ; Rd = Rn>> imm5 ASR Rd, Rn ; Rd =>> Rn ASR.W Rd, Rm, Rn ; Rd = Rm>>Rn ;循环右移 ROR Rd, Rn ; ROR.W Rd, Rm, Rn ; 符号扩展指令 SXTB Rd, Rm ; Rd = Rm的带符号扩展,把带符号字节整数扩展到32位 SXTH Rd, Rm ; Rd = Rm的带符号扩展,把带符号半字整数扩展到32位 字节序反转指令 REV.W Rd, Rn; 在字中反转字节序 REV16.W Rd, Rn; 在高低半字中反转字节序 REVSH.W; 在低半字中反转字节序,并做带符号扩展 带符号扩展指令: SXTB Rd, Rm ; Rd = Rm的带符号扩展 SXTH Rd, Rm ; Rd = Rm的带符号扩展 数据序翻转指令: REV.W Rd, Rn ;在字中反转字节序 REV16.W Rd, Rn ;在高低半字中反转字节序 REVSH.W ; 在低半字中反转字节序,并做带符号扩展 饱和运算指令在其他单片机中很少见。这类指令的初衷非常好,但是C语言并不直接支持这类运算,要在C程序中使用要么采用内联汇编要么就要将其封装成个函数,都不是很方便。这可能会限制这类指令的使用。关于饱和运算指令的作用,可以用下图来形象的展示: 图 1 饱和运算指令的作用 下面是相关指令的用法: SSAT.W Rd, #imm5, Rn, {,shift}; 以带符号数的边界进行饱和运算(交流) USAT.W Rd, #imm5, Rn, {,shift}; 以无符号数的边界进行饱和运算(带纹波的直流)其他计算类指令
饱和运算
上一篇: ARM Cortex-M3 学习笔记(4-4)
下一篇:ARM Cortex-M3 学习笔记(5)
推荐阅读最新更新时间:2024-03-16 14:53