新聞中心

        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.104case.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}; 以無符號數的邊界進行飽和運算(帶紋波的直流)



        關鍵詞: ARMCortex-M

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 华蓥市| 鄂托克前旗| 景宁| 开平市| 巴彦淖尔市| 芜湖县| 城市| 新余市| 西昌市| 奇台县| 大宁县| 濉溪县| 珲春市| 莆田市| 灵璧县| 井冈山市| 阜南县| 霍山县| 藁城市| 昂仁县| 上饶县| 灵丘县| 丹寨县| 巨野县| 黄骅市| 河池市| 交城县| 兴业县| 博客| 青田县| 同心县| 多伦县| 东安县| 万山特区| 七台河市| 新乡市| 玉溪市| 南木林县| 且末县| 乌鲁木齐县| 游戏|