ARM Cortex-M3 學習筆記(4-3)
數據處理指令
Cortex-M3支持的數據處理指令非常多,這里就撿重要的、常用的來介紹。
本文引用地址:http://www.j9360.com/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}; 以無符號數的邊界進行飽和運算(帶紋波的直流)其他計算類指令
飽和運算
評論