📄 flomul.asm
字号:
;********************FLOMUL********************
;本程序实现标准浮点数乘法。
;入口参数:原浮点数在ARGBH1:ARGBL1:EXP1和ARGBH2:ARGBL2:EXP2中。
;出口参数:结果在ARGBH1:ARGBL1:EXP1中。
;占用资源:W,STATUS,020H~02BH,三重堆栈。
;说 明: 1.加载本文件的同时也加载了另外2个文件"DUMUL.ASM","DUADD.ASM"
; 故用户在使用这2个子程序时可直接调用,不必重新加载.
IFNDEF FLOMUL1
#DEFINE FLOMUL1
INCLUDE "DUMUL.ASM"
FLOMUL MOVLW 0C0H
ANDWF FPFLAGS,F
MOVF EXP1,W ;检测是否有0
BTFSS STATUS,Z
MOVF EXP2,W
BTFSC STATUS,Z
GOTO RES024
MBNE0 MOVF ARGBH1,W
XORWF ARGBH2,W
MOVWF SIGN ;保存符号位
MOVF EXP1,W
ADDWF EXP2,F
MOVLW .127-1
BTFSS STATUS,C
GOTO MTUN
SUBWF EXP2,F
BTFSC STATUS,C
GOTO SETFOV ;上溢标志
GOTO MOK
MTUN SUBWF EXP2,F
BTFSS STATUS,C
GOTO SETFUN
MOK BSF ARGBH1,MSB ;最高位隐含的1
BSF ARGBH2,MSB
CALL DUMUL
BTFSC RLTH,MSB ;检测是否需要规格化
GOTO MROUND
RLF SOUH,F
RLF RLT,F
RLF RLTH,F
DECF EXP2,F
MROUND BTFSC FPFLAGS,RND
BTFSS RLT,LSB
GOTO MULOK
BTFSS SOUH,MSB ;如果保护位是1,则圆整
GOTO MULOK
INCF RLT,F
BTFSC STATUS,Z
INCF RLTH,F
BTFSS STATUS,Z ;圆整导致进位?
GOTO MULOK
RRF ARGBH1,F ;如果这样,则右移
RRF ARGBL1,F
INCF EXP2,F
BTFSC STATUS,Z ;检测是否上溢
GOTO SETFOV
MULOK MOVF RLT,W
MOVWF ARGBL1
MOVF RLTH,W
MOVWF ARGBH1
MOVF EXP2,W
MOVWF EXP1 ;调整出口
BTFSS SIGN,MSB
BCF ARGBH1,MSB ;如果是正数则隐藏MSB
RETLW 0
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -