⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 16×16位定点数除法子程序.txt

📁 实用子程序.rar本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订
💻 TXT
字号:
; 2.3  16×16位定点数除法子程序
;子程序采用反复的减法算法,除数和被除数分别为16位二进制有符号数
;(均采用补码表示,第16位为符号位),商为16位二进制有符号数,
;第16位为符号位。子程序的入口条件和出口条件如下:
;【校验举例2】 769÷3856=0.199429(十进制)
;化为十六进制数:0301H÷0F10H;
;结果:(商)0000H,(余数)0301H(十六进制)。
;入口条件:被除数存放在ACCBHI、ACCBLO单元中;
 ;     除数存放在ACCAHI、ACCALO单元中。
;出口条件:商存放在ACCBHI、ACCBLO单元中;
;          余数存放在ACCCHI、ACCCLO单元中。    
    LIST    p=16f877
    INCLUDE    p16f877.inc
    ACCALO    EQU     20    ;存放除数低8位
    ACCAHI     EQU     21    ;存放除数高8位
    ACCBLO     EQU     22    ;存放被除数和商的低8位
    ACCBHI     EQU     23    ;存放被除数和商的高8位
    ACCCLO     EQU     24    ;存放余数低8位
    ACCCHI     EQU     25    ;存放余数高8位
    ACCDLO     EQU     26    ;临时寄存器
    ACCDHI     EQU     27    ;临时寄存器
    TEMP     EQU     28    ;临时寄存器
    SIGN     EQU     29    ;存放商的符号
    ORG    0X0000
START    GOTO    MAIN
;***16×16位数除法子程序,入口地址ACCB /ACCA,出口地址ACCB ***
    ORG    0X0100
NEG_B    DECF         ACCBLO
    COMF         ACCBLO
    BTFSC         STATUS,Z
    DECF         ACCBHI
    COMF         ACCBHI
OVER    RETURN                    ;乘法结束,子程序返回

NEG_A    COMF     ACCALO    ;ACCALO取反加1
    INCF     ACCALO
    BTFSC     STATUS,Z    ;低8位有进位吗?
    DECF     ACCAHI    ;有,ACCAHI减1,再取反
    COMF     ACCAHI    ;否则ACCAHI直接取反
    RETURN    ;子程序返回

SETUP    MOVLW     .15    ;初始化TEMP寄存器        
    MOVWF     TEMP
    MOVF     ACCBHI,0    ;ACCB送ACCD
    MOVWF    ACCDHI
    MOVF     ACCBLO,0
    MOVWF     ACCDLO
    CLRF     ACCBHI    ;清ACCB
    CLRF     ACCBLO
    RETURN        ;子程序返回



D_div    CALL     S_SIGN    ;确定商的符号,并将负数取补
    CALL    SETUP    ;初始化TEMP,将被除数移至ACCD,
            ;(SETUP子程序请参见16×16位定点数
            ;乘法子程序SETUP)
    INCF    TEMP
    CLRF    ACCCHI    ;清余数寄存器
    CLRF    ACCCLO
DLOOP    BCF    STATUS,C    ;清进位位
    RLF    ACCDLO    ;被除数、余数左移1位
    RLF    ACCDHI
    RLF    ACCCLO
    RLF    ACCCHI
    MOVF    ACCAHI,0    ;ACCCHI-ACCAHI
    SUBWF    ACCCHI,0
    BTFSS    STATUS,Z    ;ACCCHI=ACCAHI?
    GOTO    NOCHK
    MOVF    ACCALO,0    ;是,ACCCLO-ACCALO
    SUBWF    ACCCLO,0
NOCHK    BTFSS    STATUS,C    ;ACCC>ACCA?
    GOTO    NOGO
    MOVF    ACCALO,0    ;是,余数减除数
    SUBWF    ACCCLO
    BTFSS    STATUS,C
    DECF    ACCCHI
    MOVF    ACCAHI,0
    SUBWF    ACCCHI
    BSF    STATUS,C    ;置进位位
NOGO    RLF    ACCBLO    ;商左移1位
    RLF    ACCBHI
    DECFSZ    TEMP    ;循环完毕?
    GOTO    DLOOP
    BTFSS     SIGN,7    ;是,确定商的符号
    GOTO     DIVOVER    ;为正,除法结束,跳转到结束行
    COMF     ACCCLO    ;为负,商和余数分别取补
    INCF     ACCCLO
    BTFSC    STATUS,Z
    DECF     ACCCHI
    COMF     ACCCHI
    CALL    NEG_B    ;见乘法程序中间NEG_B
DIVOVER    RETURN        ;子程序返回
;************除法运算确定结果符号子程序*******************
S_SIGN    MOVF     ACCAHI,0    ;ACCAHI异或ACCBHI,结果送SIGN单元
    XORWF     ACCBHI,0
    MOVWF     SIGN            
    BTFSS     ACCBHI,7    ;ACCB为负?
    GOTO     CHEK_A    ;否,检查ACCA
    COMF     ACCBLO    ;是,ACCB取补
    INCF     ACCBLO
    BTFSC     STATUS,Z
    DECF     ACCBHI
    COMF     ACCBHI
CHEK_A    BTFSC     ACCAHI,7    ;ACCA为负?
    CALL     NEG_A    ;ACCA为负,取补(NEG_A子程序请参见
            ;16×16位定点数乘法子程序NEG_A)
    RETURN        ;ACCA和ACCB均为负,返回


MAIN    MOVLW    0X01    ;被除数0301H送ACCB
    MOVWF    ACCBLO
    MOVLW    0X03
    MOVWF    ACCBHI
    MOVLW    0X10    ;除数0F10H送ACCA
    MOVWF    ACCALO
    MOVLW    0X0F
    MOVWF    ACCAHI
    CALL    D_div    ;调用双字节除法子程序,求商
    goto   $
    END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -