新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > ARM Cortex-M3 学习笔记(4-3)

ARM Cortex-M3 学习笔记(4-3)

作者:时间:2016-11-20来源:网络收藏
最近在学ARM Cortex-M3,找了本号称很经典的书“An Definitive Guide to The ARM Cortex-M3”在看。这个系列学习笔记其实就是在学习这本书的过程中做的读书笔记。

数据处理指令

Cortex-M3支持的数据处理指令非常多,这里就捡重要的、常用的来介绍。

本文引用地址:http://www.eepw.com.cn/article/201611/318831.htm

四则运算指令

基本的加、减法运算有四条指令,分别是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}; 以无符号数的边界进行饱和运算(带纹波的直流)



关键词: ARMCortex-M

评论


相关推荐

技术专区

关闭