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

📄 浮点数除法子程序.txt

📁 实用子程序.rar本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订
💻 TXT
字号:
;浮点数除法子程序
;【校验举例2】 0.26222÷3.5025=0.074867
;化为十六进制数: 4321FF÷701502
;结果:4CA9FD
 
LIST            p=16f877
    INCLUDE        p16f877.inc
    ACCALO         EQU     20h        ;存放除数的尾数

    ACCAHI         EQU     21h
    EXPA        EQU     22h        ;存放除数的阶码
    ACCBLO         EQU     23h        ;存放被除数的尾数和商的尾数
    ACCBHI         EQU     24h
    EXPB         EQU     25h        ;存放被除数和商的阶码
    ACCCLO         EQU     26h        ;存放余数
    ACCCHI         EQU     27h
    ACCDLO         EQU     28h        ;临时寄存器
    ACCDHI         EQU     29h        ;临时寄存器
    TEMP         EQU     2Ah        ;临时寄存器
    TEMP1         EQU     30h        ;临时寄存器
    TIMES         EQU     31h        ;临时寄存器
    SIGN         EQU     2Bh        ;存放商的符号
    COUNT         EQU     2Fh        ;临时寄存器
    ACCEHI        EQU    30h        ;临时寄存器
    ACCELO        EQU    31h        ;临时寄存器
    ORG            0X0000
START    GOTO        MAIN
    ORG            0X0100
;***浮点数除法子程序,入口地址(ACCB、EXPB)/(ACCA、EXPA),出口地址ACCB、EXPB***
F_div    CALL         S_SIGN        ;确定商的符号,并将负数取补
    CLRF        ACCCHI        ;初始化ACCC寄存器
    CLRF         ACCCLO
    CALL         F_norm        ;规格化ACCB
    CLRF         ACCCLO
    CLRF         ACCCHI
    CLRF         TIMES
    MOVF         ACCAHI        ;除数为零?
    BTFSS         STATUS,Z
    GOTO         FD0            ;否,求商
    MOVF         ACCALO
    BTFSC         STATUS,Z
    RETLW         01            ;是,返回
FD0    CALL         NEG_A        ;除数取补
FD1    MOVF         ACCBHI,0    ;ACCBHI送ACCDLO
    MOVWF         ACCDLO
    CALL         D_add1        ;被除数尾数大于除数尾数?
    BTFSS         STATUS,C
    GOTO         FD2
RRF1    BCF             STATUS,C    ;是,被除数右移规格化,直到小于除数为止
    RRF             ACCBHI
    RRF             ACCBLO
    INCF         TIMES
    RRF             ACCCHI
    BCF             STATUS,C
    GOTO         FD1
FD2    CALL         DDIV        ;否,调用双字节除法子程序,求商的尾数
    MOVF         TIMES,0        ;根据右移规格化次数调整ACCB阶码
    ADDWF         EXPB
    MOVF         EXPA,0        ;求商的阶码
    SUBWF         EXPB
    CALL         F_norm        ;商规格化
    BTFSC         SIGN,7        ;商为负?
    CALL         NEG_B        ;是,取补
    CALL         NEG_A        ;除数还原
    RETURN                    ;浮点数除法完成,返回
;***********双字节纯小数除法子程序***************
DDIV    MOVLW         0X0F            ;初始化ACCDHI
    MOVWF         ACCDHI
DV1    BCF             STATUS,C
    RLF             ACCCLO        ;左移商
    RLF             ACCCHI
    RLF             ACCBLO        ;左移余数
    RLF             ACCBHI
    MOVF         STATUS,0    ;暂存STATUS寄存器
    MOVWF         ACCDLO
    MOVF         ACCBHI,0    ;ACCBHI送TEMP1
    MOVWF         TEMP1
    MOVF         ACCALO,0    ;ACCB-ACCA
    ADDWF         ACCBLO,0
    MOVWF         TEMP
    BTFSC         STATUS,C        
    INCF         TEMP1            
    MOVF         ACCAHI,0        
    ADDWF         TEMP1,0
    BTFSC         ACCDLO,0    ;左移余数时移出来的数为1?
    GOTO         DV2
TESTC    BTFSS         STATUS,C    ;是,再判断ACCB尾数是否大于ACCA
    GOTO         DV3
DV2    MOVWF         ACCBHI        ;是,余数送ACCB
    MOVF         TEMP,0
    MOVWF         ACCBLO
    INCF         ACCCLO        ;商加1
DV3    DECFSZ        ACCDHI        ;商求取完毕?
    GOTO         DV1
    MOVF         ACCCHI,0    ;是,将商送ACCB
    MOVWF         ACCBHI
    MOVF         ACCCLO,0
    MOVWF         ACCBLO
    RETLW         00    
;**********本子程序用于判断比较ACCB与ACCA的大小**********
D_add1    MOVF         ACCALO,0    ;加数、被加数低半字节相加
    ADDWF         ACCBLO,0
    BTFSC         STATUS,C    ;有进位?
    INCF         ACCDLO        ;ACCD低半字节加1
    MOVF         ACCAHI,0       ;ACCAHI+ACCDLO
    ADDWF         ACCDLO
    RETLW         0            ;子程序返回
;****************************************
SETUP    MOVLW         .15
    MOVWF         TEMP
    MOVF         ACCBHI,0
    MOVWF         ACCDHI
    MOVF         ACCBLO,0
    MOVWF         ACCDLO
    CLRF         ACCBHI
    CLRF         ACCBLO
    RETLW         0
;*************** ACCA取补子程序*************
NEG_A    COMF         ACCALO        ;ACCALO取反加1
    INCF         ACCALO
    BTFSC         STATUS,Z    ;低8位有进位吗?
    DECF         ACCAHI        ;有,ACCAHI减1,再取反
    COMF         ACCAHI        ;否,ACCAHI直接取反
    RETLW         0
;********* ACCB取补子程序*************
NEG_B    DECF         ACCBLO        ;ACCBLO取反加1
    COMF         ACCBLO
    BTFSC         STATUS,Z    ;低8位有进位吗?
    DECF         ACCBHI        ;有,ACCBHI减1,再取反
    COMF         ACCBHI        ;否,ACCBHI直接取反
    RETLW         0        
;*********浮点乘除法运算确定结果符号子程序**********
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为负,取补
    RETLW         0            ;ACCA和ACCB均为负,返回
;************浮点运算结果规格化子程序***************
F_norm      MOVF         ACCBHI        ;ACCB=0?
    BTFSS         STATUS,Z
    GOTO         C_norm
    MOVF         ACCBLO
    BTFSC         STATUS,Z
    RETLW         0            ;是,不需规格化,返回
C_norm    BTFSC        ACCBHI,7    ;否。ACCB为负?
     GOTO        C_norm2
C_norm1    BTFSC         ACCBHI,6    ;为正。规格化完毕?
    RETLW         0            ;ACCBHI.6=1,规格化结束
    CALL         SHFTSL        ;否。ACCB左移
    DECF         EXPB        ;EXPB减1
    GOTO         C_norm1        ;重新判断规格化完毕否?
C_norm2    BTFSS        ACCBHI,6    ;ACCB为负。规格化完毕否?
    RETLW        0            ;ACCBHI.6=0,规格化结束
    BCF            STATUS,C    
    CALL        SHFTSL        ;否,ACCB左移
    BSF            ACCBHI,7    ;加符号
    DECF        EXPB        ;EXPB减1
    GOTO        C_norm2        ;重新判断规格化完毕否?
SHFTSL    BCF             STATUS ,C    ;ACCB左移子程序    
    RLF             ACCCLO        
    RLF             ACCCHI
    RLF             ACCBLO
    RLF             ACCBHI
    RETLW         0



MAIN        MOVLW        0X21            ;被除数的尾数4321H送ACCB
    MOVWF        ACCBLO
    MOVLW        0X43
    MOVWF        ACCBHI
        MOVLW        0XFF            ;被除数的阶码FFH送EXPB
        MOVWF        EXPB
    MOVLW        0X15            ;除数尾数7015H送ACCA
    MOVWF        ACCALO
    MOVLW        0X70
    MOVWF        ACCAHI
    MOVLW        0X02            ;除数阶码送EXPA
    MOVWF        EXPA
    CALL        F_div            ;调用浮点数除法子程序,求商
    goto   $
    END

⌨️ 快捷键说明

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