新闻  |   论坛  |   博客  |   在线研讨会
pic乘除运算子程序
zhchxgh | 2009-07-04 00:47:52    阅读:1670   发布文章

pic乘除运算子程序 

#define    STATUS    3

#define    skpb    skpnc    ;skip if borrowed
#define    skpnb    skpc    ;skip if no borrow

    cblock    0x10
PROD:2            ;2 bytes for production
QUOT:2            ;2 bytes for quotient
PAVRA            ;divider/multiplier
PAVRB            ;reminder / multiplier
PAVRC            ;additional byte space
mcount            ;loop counter
    endc

    org    000h

    ;movlw    0x20;
    ;movwf    PAVRA
    ;movlw    0x30
    ;movwf    PAVRB

    call    BBYTE_DIV

    goto    $-1

;====================================
;PROD:2 = PAVRA * PAVRB
;====================================
BYTE_MUL
    clrf    PROD
    clrf    PROD+1
    movlw    .8
    movwf    mcount
_mul1
    rlf    PROD,f        ;left shift 16-bit with LSB=0
    bcf    PROD,0
    rlf    PROD+1,f    
    rlf    PAVRA,w        ;make left-rotate shift
    rlf    PAVRA,f        ;and check MSB
    skpc            ;skip if MSB=1
    goto    _mul2        ;MSB=0
    ;do when MSB=1
    movf    PAVRB,w
    addwf    PROD,f
    skpnc
    incf    PROD+1,f
_mul2    
    decfsz    mcount,f
    goto    _mul1    
    retlw    0


;====================================
;WORD divided by BYTE               =
;PROD:2 / PAVRA                     = 
;QUOT:2 = Quotient                  =
;PAVRB  = Reminder                  =
;====================================
WBYTE_DIV
    movf    PAVRA,f
    skpnz
    retlw    1        ;return if divider=0
    clrf    PAVRB
    clrf    PAVRC
    clrf    QUOT
    clrf    QUOT+1
    movlw    .16
    movwf    mcount
_wdiv1
    rlf    QUOT,f        ;adjust Quotient
    rlf    QUOT+1,f
    bcf    QUOT,0
    ;
    rlf    PROD+1,w
    rlf    PROD,f
    rlf    PROD+1,f
    ;
    rlf    PAVRB,f
    rlf    PAVRC,f
    ;
    movf    PAVRA,w
    subwf    PAVRB,f
    skpb            ;skip if borrow
    goto    _wdiv2
    ;if borrow
    btfsc    PAVRC,0
    goto    _wdiv2
    addwf    PAVRB,f
    bcf    PAVRC,0
    goto    _wdiv3
_wdiv2    ;if no borrow
    bcf    PAVRC,0
    bsf    QUOT,0    
_wdiv3
    decfsz    mcount,f
    goto    _wdiv1    
    retlw    0

;====================================
;BYTE divided by BYTE               =
;PROD[0] / PAVRA                    = 
;QUOT[0] = Quotient                 =
;PAVRB   = Reminder                 =
;====================================
BBYTE_DIV
    movf    PAVRA,f
    skpnz
    retlw    1        ;return if divider=0
    clrf    PAVRB        ;clear reminder
    clrf    QUOT        ;clear quotient
    movlw    .8
    movwf    mcount        ;for 8 times shift
_bdiv1
    rlf    QUOT,f        ;adjust Quotient
    bcf    QUOT,0        ;left shift i bit
    ;
    rlf    PROD,w        ;get 1 bit, MSB first
    rlf    PROD,f        ;do rotate shift
    ;
    rlf    PAVRB,f        ;set to LSB of reminder
    ;
    movf    PAVRA,w        ;reminder - divider
    subwf    PAVRB,f
    skpb            ;skip if borrow
    goto    _bdiv2
    ;do if borrowed
    addwf    PAVRB,f        ;cancel subtraction
    goto    _bdiv3        ;go for next
_bdiv2    ;do if no borrow
    bsf    QUOT,0        ;reminder > divider
                ;update quotient
_bdiv3
    decfsz    mcount,f    ;loop test
    goto    _bdiv1        ;do 8 times
    retlw    0        ;completed

    END

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客