您的位置 首页 IOT

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

最近在学ARMCortex-M3,找了本号称很经典的书AnDefinitiveGuidetoTheARMCortex-M3在看。这个系列学习笔记其实就是在学习这本…

最近在学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}; 以无符号数的鸿沟进行饱满运算(带纹波的直流)

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/264200.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部