📄 floadd.asm
字号:
;********************FLOADD********************
;本程序实现标准浮点数加法。
;入口参数:被加数在ARGBH1:ARGBL1:EXP1中,加数在ARGBH2:ARGBL2:EXP2中。
;出口参数:结果在ARGBH1:ARGBL1:EXP1中。
;占用资源:W,STATUS,020H~02BH,一重堆栈。
;说明: 加载本文件的同时也加载了另外一个文件"FLONRM.ASM"
; 故用户在使用这个子程序时可直接调用,不必重新加载
IFNDEF FLOADD1
#DEFINE FLOADD1
FLOADD MOVLW 0C0H
ANDWF FPFLAGS,F
MOVF ARGBH1,W ;符号位异或存入TEMP
XORWF ARGBH2,W
MOVWF TEMP1
CLRF TEMP2 ;扩展尾数
CLRF TEMP3
MOVF EXP1,W ;如果EXP1 >= EXP2,则取ARG1
SUBWF EXP2,W
BTFSS STATUS,C
GOTO USEA
MOVF EXP2,W ;如果 EXP1 < EXP2 则取ARG2
MOVWF TEMP4 ;交换ARG1和ARG2
MOVF EXP1,W
MOVWF EXP2
MOVF TEMP4,W
MOVWF EXP1
MOVF ARGBH2,W
MOVWF TEMP4
MOVF ARGBH1,W
MOVWF ARGBH2
MOVF TEMP4,W
MOVWF ARGBH1
MOVF ARGBL2,W
MOVWF TEMP4
MOVF ARGBL1,W
MOVWF ARGBL2
MOVF TEMP4,W
MOVWF ARGBL1
USEA MOVF EXP2,W ;如果ARG2 = 0,则返回ARG1
BTFSC STATUS,Z
RETLW 0x00
MOVF ARGBH1,W
MOVWF SIGN ;将符号位保存在SIGN中
BSF ARGBH1,MSB ;最高位隐含的"1"
BSF ARGBH2,MSB
MOVF EXP2,W ;计算移位次数存入EXP2
SUBWF EXP1,W
MOVWF EXP2
BTFSC STATUS,Z
GOTO ALIGNED
MOVLW 8
SUBWF EXP2,W
BTFSS STATUS,C ;如果EXP2 >= 8则移动一个字节
GOTO ALIGNB
MOVWF EXP2
MOVF ARGBL2,W ;作为后规格化保留位
MOVWF TEMP3
MOVF ARGBH2,W
MOVWF ARGBL2
CLRF ARGBH2
MOVLW 8
SUBWF EXP2,W
BTFSS STATUS,C ;如果仍有EXP2 >= 8,则ARG2 = 0
GOTO ALIGNB
MOVF SIGN,W ;结果等于ARG1
MOVWF ARGBH1
RETLW 0x00
ALIGNB MOVF EXP2,W ;如果EXP2 = 0,则不用移位
BTFSC STATUS,Z
GOTO ALIGNED
ALOOPB BCF STATUS,C ;右移EXP2位
RRF ARGBH2,F
RRF ARGBL2,F
RRF TEMP3,F
DECFSZ EXP2,F
GOTO ALOOPB
ALIGNED BTFSS TEMP1,MSB ;判断符号是否相同
GOTO AOK
COMF TEMP3,F ;如果符号不同,则ARG2求补
COMF ARGBL2,F
COMF ARGBH2,F
INCF TEMP3,F
BTFSC STATUS,Z
INCF ARGBL2,F
BTFSC STATUS,Z
INCF ARGBH2,F
AOK MOVF TEMP3,W
ADDWF TEMP2,F
MOVF ARGBL2,W
BTFSC STATUS,C
INCFSZ ARGBL2,W
ADDWF ARGBL1,F
MOVF ARGBH2,W
BTFSC STATUS,C
INCFSZ ARGBH2,W
ADDWF ARGBH1,F
BTFSC TEMP1,MSB
GOTO ACOMP
BTFSS STATUS,C
GOTO NRMRND
RRF ARGBH1,F ;尾数右移,指数加1
RRF ARGBL1,F
RRF TEMP2,F
INCFSZ EXP1,F
GOTO NRMRND
GOTO SETFOV
ACOMP BTFSC STATUS,C
GOTO FLONRM ;规格化并确定符号位
COMF TEMP2,F
COMF ARGBL1,F ;求补并将符号位取反
COMF ARGBH1,F ;然后规格化
INCF TEMP2,F
BTFSC STATUS,Z
INCF ARGBL1,F
BTFSC STATUS,Z
INCF ARGBH1,F
MOVLW 0x80
XORWF SIGN,F
GOTO FLONRM
NRMRND BTFSC FPFLAGS,RND
BTFSS ARGBL1,LSB
GOTO FIXSIGN24
BTFSS TEMP2,MSB ;如果保护位是1,则圆整
GOTO FIXSIGN24
INCF ARGBL1,F
BTFSC STATUS,Z
INCF ARGBH1,F
BTFSS STATUS,Z ;圆整导致进位否?
GOTO FIXSIGN24
RRF ARGBH1,F ;是,则右移
RRF ARGBL1,F
INCF EXP1,F
BTFSC STATUS,Z ;检测是否上溢
GOTO SETFOV
GOTO FIXSIGN24
INCLUDE "FLONRM.ASM"
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -