📄 flodiv.asm
字号:
;********************FLODIV********************
;本程序实现标准浮点数除法。
;入口参数:被除数在ARGBH1:ARGBL1:EXP1中,除数在ARGBH2:ARGBL2:EXP2中。
;出口参数:结果在ARGBH1:ARGBL1:EXP1中。
;占用资源:W,STATUS,020H~02BH,两重堆栈。
;说 明: 1.加载本文件的同时也加载了另外2个文件"DUSUB.ASM","DUADD.ASM"
; 故用户在使用这2个子程序时可直接调用,不必重新加载.
IFNDEF FLODIV1
#DEFINE FLODIV1
FLODIV MOVF EXP2,W ;检测是否除数为0
BTFSC STATUS,Z
GOTO SETFDZ
MOVF EXP1,W
BTFSC STATUS,Z
GOTO RES024
DBNE0 MOVF ARGBH1,W
XORWF ARGBH2,W
MOVWF SIGN ;保护结果符号位
BSF ARGBH1,MSB ;最高位隐含的1
BSF ARGBH2,MSB
TALIGN CLRF TEMP1 ;TEMP1作为增阶标志
CALL DUSUB ;比较尾数大小
CALL DUADD
CLRF TEMP2
CLRF TEMP3
BTFSC STATUS,C
GOTO DALIGNOK
BCF STATUS,C ;调整尾数
RRF ARGBH1,F
RRF ARGBL1,F
RRF TEMP2,F
MOVLW 0x01
MOVWF TEMP1 ;增阶标志置1
DALIGNOK MOVF EXP2,W ;计算EXP
SUBWF EXP1,F
BTFSS STATUS,C
GOTO ALTB
AGEB MOVLW .127-1
ADDWF TEMP1,W
ADDWF EXP1,F
BTFSC STATUS,C
GOTO SETFOV ;上溢
GOTO DARGOK
ALTB MOVLW .127-1
ADDWF TEMP1,W
ADDWF EXP1,F
BTFSS STATUS,C
GOTO SETFUN ;下溢
DARGOK MOVLW D'16' ;初使化计数器
MOVWF TEMP4
DLOOP RLF TEMP3,F ;被除数和结果左移
RLF TEMP2,F
RLF ARGBL1,F
RLF ARGBH1,F
RLF TEMP1,F
CALL DUSUB ;相减
RLF ARGBH2,W
IORWF TEMP1,F
BTFSS TEMP1,LSB ;检测是否需要恢复被除数
GOTO DREST
BSF TEMP3,LSB
GOTO DOK
DREST CALL DUADD ;恢复被除数
BCF TEMP3,LSB
DOK DECFSZ TEMP4,F
GOTO DLOOP
DROUND BTFSC FPFLAGS,RND
BTFSS TEMP3,LSB
GOTO DIVOK
BCF STATUS,C
RLF ARGBL1,F ;计算保护位
RLF ARGBH1,F ;以便圆整
RLF TEMP1,F
CALL DUSUB ;相减
RLF ARGBH2,W
IORWF TEMP1,W
ANDLW 0x01
ADDWF TEMP3,F
BTFSC STATUS,C
INCF TEMP2,F
BTFSS STATUS,Z ;检测圆整过程是否产生进位
GOTO DIVOK
RRF TEMP2,F
RRF TEMP3,F
INCF EXP1,F
BTFSC STATUS,Z ;是否上溢
GOTO SETFOV
DIVOK BTFSS SIGN,MSB
BCF TEMP2,MSB ;隐藏MSB
MOVF TEMP2,W
MOVWF ARGBH1 ;结果送ARG1
MOVF TEMP3,W
MOVWF ARGBL1
RETLW 0
INCLUDE "DUADD.ASM"
INCLUDE "DUSUB.ASM"
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -