flotds.asm

来自「pic单片机常用的汇编程序,很有用的,分成各个小模块」· 汇编 代码 · 共 67 行

ASM
67
字号
;********************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 + =
减小字号Ctrl + -
显示快捷键?