📄 flot3s.asm
字号:
;********************FLOT3S********************
;本程序实现规格化浮点数转化为3字节有符号二进制整数。
;入口参数:原浮点数在ARGBH1:ARGBL1:EXP1中。
;出口参数:补码结果在RLT:SOUH:SOU中。
;占用资源:W,STATUS,020H,021H,023H,024H,025H,026H,一重堆栈。
IFNDEF FLOT3S1
#DEFINE FLOT3S1
FLOT3S MOVLW 0C0H
ANDWF FPFLAGS,F
MOVF ARGBH1,W ;作准备
MOVWF ARGBL2
MOVF ARGBL1,W
MOVWF ARGBH1
CLRF ARGBL1
MOVF ARGBL2,W ;保存符号位
MOVWF SIGN
BSF ARGBL2,MSB ;最高位隐含的"1"
MOVLW .127+.23 ;从指数中去掉偏移量
SUBWF EXP1,F
BTFSC STATUS,C
GOTO SETIOV3
COMF EXP1,F
INCF EXP1,F
MOVLW 8 ;若EXP1 >= 8,则右移一个字节得到保护位
SUBWF EXP1,W
BTFSS STATUS,C
GOTO TSHIFT1
MOVWF EXP1
RLF ARGBL1,F ;得到保护位
MOVF ARGBH1,W
MOVWF ARGBL1
MOVF ARGBL2,W
MOVWF ARGBH1
CLRF ARGBL2
MOVLW 8
SUBWF EXP1,W
BTFSS STATUS,C
GOTO TSHIFT1
MOVWF EXP1
RLF ARGBL1,F
MOVF ARGBH1,W
MOVWF ARGBL1
CLRF ARGBH1
MOVLW 8
SUBWF EXP1,W
BTFSS STATUS,C
GOTO TSHIFT1
MOVWF EXP1
RLF ARGBL1,F
CLRF ARGBL1
MOVF EXP1,W
BTFSS STATUS,Z
BCF STATUS,C
GOTO SHIFTOK
TSHIFT1 MOVF EXP1,W ;若EXP1 = 0,则移位结束
BTFSC STATUS,Z
GOTO SHIFTOK
SHIFT1 BCF STATUS,C
RRF ARGBL2,F ;右移EXP1位
RRF ARGBH1,F
RRF ARGBL1,F
DECFSZ EXP1,F
GOTO SHIFT1
SHIFTOK BTFSC FPFLAGS,RND
BTFSS ARGBL1,LSB
GOTO INTOK
BTFSS STATUS,C
GOTO INTOK
INCF ARGBL1,F
BTFSC STATUS,Z
INCF ARGBH1,F
BTFSC STATUS,Z
INCF ARGBL2,F
BTFSC ARGBL2,MSB ;检测有无上溢
GOTO SETIOV3
INTOK BTFSS SIGN,MSB ;负数
RETLW 0
COMF ARGBL2,F
COMF ARGBH1,F
COMF ARGBL1,F
INCF ARGBL1,F
BTFSC STATUS,Z
INCF ARGBH1,F
BTFSC STATUS,Z
INCF ARGBL2,F
RETLW 0
SETIOV3 BSF FPFLAGS,IOV ;上溢标志置1
BTFSS FPFLAGS,SAT ;检测饱和允许位
RETLW 0xFF
CLRW ;饱和
BTFSS SIGN,MSB
MOVLW 0xFF
MOVWF ARGBL2 ;SIGN = 0, 0x 7F FF FF
MOVWF ARGBH1 ;SIGN = 1, 0x 80 00 00
MOVWF ARGBL1
RLF SIGN,F
RRF ARGBL2,F
RETLW 0xFF
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -