📄 flotds.asm
字号:
;********************FLOTDS********************
;本程序实现规格化浮点数转化为双字节有符号二进制整数。
;入口参数:原浮点数在ARGBH1:ARGBL1:EXP1中。
;出口参数:补码结果在SOUH:SOU中。
;占用资源:W,STATUS,020H,021H,023H,024H,025H,一重堆栈。
IFNDEF FLOTDS1
#DEFINE FLOTDS1
FLOTDS MOVLW 0C0H
ANDWF FPFLAGS,F
MOVF ARGBH1,W ;保存符号位
MOVWF SIGN
BSF ARGBH1,MSB ;最高位隐含的"1"
MOVLW .127+.15 ;从指数中去掉偏移量
SUBWF EXP1,F
BTFSC STATUS,C
GOTO SETIOV
COMF EXP1,F
INCF EXP1,F
MOVLW 8 ;若EXP1 >= 8,则右移一个字节
SUBWF EXP1,W
BTFSS STATUS,C
GOTO TSHIFT
MOVWF EXP1
RLF ARGBL1,F ;得到保护位
MOVF ARGBH1,W
MOVWF ARGBL1
CLRF ARGBH1
MOVLW 8 ;若仍有EXP1>=8,再右移一个字节
SUBWF EXP1,W
BTFSS STATUS,C
GOTO TSHIFT
MOVWF EXP1
RLF ARGBL1,F ;得到保护位
CLRF ARGBL1
MOVF EXP1,W
BTFSS STATUS,Z
BCF STATUS,C
GOTO SHIFTK
TSHIFT MOVF EXP1,W ;若EXP1 = 0,则移位结束
BTFSC STATUS,Z
GOTO SHIFTK
SHIFT BCF STATUS,C
RRF ARGBH1,F ;右移EXP1位
RRF ARGBL1,F
DECFSZ EXP1,F
GOTO SHIFT
SHIFTK BTFSC FPFLAGS,RND
BTFSS ARGBL1,LSB
GOTO INTK
BTFSS STATUS,C ;若保护位为1,则结果加1
GOTO INTK
INCF ARGBL1,F
BTFSC STATUS,Z
INCF ARGBH1,F
BTFSC ARGBH1,MSB ;检测是否上溢
GOTO SETIOV
INTK BTFSS SIGN,MSB ;负数取反
RETLW 0
COMF ARGBL1,F
COMF ARGBH1,F
INCF ARGBL1,F
BTFSC STATUS,Z
INCF ARGBH1,F
RETLW 0
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -