最近在学ARM Cortex-M3,找了本声称很经典的书“An Definitive Guide to The ARM Cortex-M3”在看。这个系列学习笔记其实就是在学习这本书的过程中做的读书笔记。
数据处理指令
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}; 以无符号数的鸿沟进行饱满运算(带纹波的直流)