找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2892|回復(fù): 0
收起左側(cè)

AVR 系列單片機(jī)匯編 數(shù)值運(yùn)算子程序

[復(fù)制鏈接]
ID:901054 發(fā)表于 2021-4-5 22:31 | 顯示全部樓層 |閱讀模式
;***************************************************************************
;*
;* "mpy16u" - 16x16 Bit Unsigned Multiplication
;*
;* This subroutine multiplies the two 16-bit register variables
;* mp16uH:mp16uL and mc16uH:mc16uL.
;* The result is placed in m16u3:m16u2:m16u1:m16u0.
;*
;* Number of words        :14 + return
;* Number of cycles        :153 + return
;* Low registers used        :None
;* High registers used  :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,
;*                          m16u3,mcnt16u)
;*
;***************************************************************************

;***** Subroutine Register Variables

.def        mc16uL        =r16                ;multiplicand low byte
.def        mc16uH        =r17                ;multiplicand high byte
.def        mp16uL        =r18                ;multiplier low byte
.def        mp16uH        =r19                ;multiplier high byte
.def        m16u0        =r18                ;result byte 0 (LSB)
.def        m16u1        =r19                ;result byte 1
.def        m16u2        =r20                ;result byte 2
.def        m16u3        =r21                ;result byte 3 (MSB)
.def        mcnt16u        =r22                ;loop counter

;***** Code

mpy16u:        clr        m16u3                ;clear 2 highest bytes of result
        clr        m16u2
        ldi        mcnt16u,16        ;init loop counter
        lsr        mp16uH
        ror        mp16uL

m16u_1:        brcc        noad8                ;if bit 0 of multiplier set
        add        m16u2,mc16uL        ;add multiplicand Low to byte 2 of res
        adc        m16u3,mc16uH        ;add multiplicand high to byte 3 of res
noad8:        ror        m16u3                ;shift right result byte 3
        ror        m16u2                ;rotate right result byte 2
        ror        m16u1                ;rotate result byte 1 and multiplier High
        ror        m16u0                ;rotate result byte 0 and multiplier Low
        dec        mcnt16u                ;decrement loop counter
        brne        m16u_1                ;if not done, loop more
        ret




;......................

;被除數(shù):R19(HIGH)R18 R17 R16(LOW)

;除數(shù):R21(HIGH)R20

;結(jié)果:R17(HIGH)R16
;余數(shù):R19(HIGH)R18
;計(jì)數(shù)器,R22

;...................................................
d32v16u:                   ; 32位/16位無符號(hào)除法
        cp r18,r20         ;被除數(shù)高16位 > 除數(shù)
        cpc r19,r21        ;結(jié)果溢出
        brcc        cc            
        ldi r22,$10        ;初始化循環(huán)計(jì)數(shù)器
        rol r16            ;左移被除數(shù)
        rol r17
aa:
        rol r18            ;左移余數(shù)(被除數(shù)移到除數(shù))
        bst r19,7
        rol r19
        sub r18,r20        ;余數(shù)-除數(shù)
        sbc r19,r21
        brts         loop       ;夠減,跳至 loop
        brcc         loop
        add r18,r20        ;不夠減,再加除數(shù)
        adc r19,r21
        clc                ;清進(jìn)位位
        rjmp         loop1
loop:
        sec                ;置進(jìn)位位
loop1:
        rol r16            ;左移結(jié)果
        rol r17
        dec r22            ;計(jì)數(shù)器減 1
        brne        aa         ;不為 0,再循環(huán)
        clt                ;清 t 標(biāo)志
        ret
cc:
        set                ;置 t 標(biāo)志
        ret

;...................................











;......................

;被除數(shù):R17(HIGH) R16(LOW)

;除數(shù):R21(HIGH)R20

;結(jié)果:R17(HIGH)R16
;余數(shù):R19(HIGH)R18
;計(jì)數(shù)器,R22

;...................................................
d16v16u:                   ; 32位/16位無符號(hào)除法
;        cp r18,r20         ;被除數(shù)高16位 > 除數(shù)
;        cpc r19,r21        ;結(jié)果溢出
;        brcc        cc            
       
        clr r19
        clr r18
       
        ldi r22,$10        ;初始化循環(huán)計(jì)數(shù)器
        rol r16            ;左移被除數(shù)
        rol r17
vaa:
        rol r18            ;左移余數(shù)(被除數(shù)移到除數(shù))
        bst r19,7
        rol r19
        sub r18,r20        ;余數(shù)-除數(shù)
        sbc r19,r21
        brts         vloop       ;夠減,跳至 loop
        brcc         vloop
        add r18,r20        ;不夠減,再加除數(shù)
        adc r19,r21
        clc                ;清進(jìn)位位
        rjmp         vloop1
vloop:
        sec                ;置進(jìn)位位
vloop1:
        rol r16            ;左移結(jié)果
        rol r17
        dec r22            ;計(jì)數(shù)器減 1
        brne        vaa         ;不為 0,再循環(huán)
        clt                ;清 t 標(biāo)志
        ret
;cc:
;       set                ;置 t 標(biāo)志
;        ret


;..............................










;...r17:r16(hex)--->r20(萬位):r19(千位):r18(百位):r17(十位):r16(bcd)
                   ; 結(jié)果值在每字節(jié)里只存一位,即在每字節(jié)的低半字節(jié)里      
;.....................;調(diào)用16位二進(jìn)制轉(zhuǎn)5位十進(jìn)制子程
b16td5:
        ser r20              ;r20先送-1
b16td5_1:  
        inc r20              ;r20增1
    subi r16,low(10000)  ;(r17:r16)-10000
        sbci r17,high(10000)
        brcc         b16td5_1     ;夠減則返回b16td5_1
        subi r16,low(-10000) ;不夠減+10000,恢復(fù)余數(shù)
        sbci r17,high(-10000)
        ser r19              ;r19先送-1
b16td5_2:
        inc r19              ;r19增1   
        subi r16,low(1000)   ;(r17:r16)-1000
        sbci r17,high(1000)            
        brcc         b16td5_2     ;夠減則返回b16td5_2
        subi r16,low(-1000)  ;不夠減+1000,恢復(fù)余數(shù)
        sbci r17,high(-1000)
        ser r18              ;r18先送-1
b16td5_3:
        inc r18              ;r18增1   
subi r16,low(100)            ;(r17:r16)-100
        sbci r17,high(100)            
        brcc         b16td5_3     ;夠減則返回b16td5_3
        subi r16,low(-100)   ;不夠減+100,恢復(fù)余數(shù)
        sbci r17,high(-100)
        ser r17              ;r17先送-1
b16td5_4:
        inc r17              ;r17增1
        subi r16,10          ;(r17:r16)-10         
        brcc         b16td5_4     ;夠減則返回b16td5_4               
        subi r16,-10         ;不夠減+10,恢復(fù)余數(shù)
    ret
;...........................................







;...............;r16(high)r19(low)/r17 =r16(結(jié)果)+r19(余數(shù))

d16v8u:                 ;16/8無符號(hào)除法
        cp r16,r17      ;被除數(shù)高字節(jié) > 除數(shù)   
        brcc   ddd      ;結(jié)果溢出
        ldi r18,8       ;初始化循環(huán)計(jì)數(shù)器
        rol r19         ;左移余數(shù)(被除數(shù)低字節(jié))
aaa:
        bst r16,7
        rol r16         ;左移被除數(shù)高字節(jié)
        sub r16,r17     ;r16減r17
        brts        bbb
        brcc        bbb
        add r16,r17     ;結(jié)果為負(fù),則r16加r17
        clc             ;清進(jìn)位位
        rjmp        ccc
bbb:
        sec             ;夠減,置進(jìn)位位
ccc:
        rol r19         ;左移余數(shù)
        dec r18         ;減計(jì)數(shù)器
        brne        aaa     ;沒完成再循環(huán)
        clc
        mov r17,r16        
        mov r16,r19     ;r16存放結(jié)果
        mov r19,r17     ;r19存放余數(shù)
        ret
ddd:
        set
        ret

;..................................

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表