⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 floadd.asm

📁 PIC单片机的汇编源码合集,应用比较广泛,设计程序时可做子程序来用
💻 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 + -