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

📄 muad32.asm

📁 pic子程序库与运算平台(PIC系列的四则运算、多字节、浮点等运算函数)
💻 ASM
📖 第 1 页 / 共 2 页
字号:
                        BTFSC                   STATUS,Z
		INCF		BARGB1,F
                        BTFSC                   STATUS,Z
		INCF		BARGB0,F
AOK32           MOVF   		BARGB3,W
                ADDWF   	AARGB3,F
                MOVF            BARGB2,W
                BTFSC           STATUS,C
                INCFSZ          BARGB2,W
                ADDWF           AARGB2,F
                MOVF            BARGB1,W
                BTFSC           STATUS,C
                INCFSZ          BARGB1,W
                ADDWF           AARGB1,F
                MOVF            BARGB0,W
                BTFSC           STATUS,C
                INCFSZ          BARGB0,W
                ADDWF           AARGB0,F
                BTFSC           TEMP,MSB
                GOTO            ACOMP32
                BTFSS           STATUS,C
                GOTO            NRMRND4032
                RRF             AARGB0,F               ; shift right and increment EXP
                RRF             AARGB1,F
                RRF             AARGB2,F
                RRF             AARGB3,F
                INCFSZ          AEXP,F
                GOTO            NRMRND4032
                GOTO            SETFOV32
ACOMP32         BTFSC           STATUS,C
                GOTO            NRM4032			; normalize and fix sign    
            COMF        AARGB3,F
            COMF        AARGB2,F    ; negate, toggle sign bit and
            COMF        AARGB1,F    ; then normalize
            COMF        AARGB0,F
            INCF        AARGB3,F
            BTFSC       STATUS,Z
            INCF        AARGB2,F
            BTFSC       STATUS,Z
            INCF        AARGB1,F
            BTFSC       STATUS,Z
            INCF        AARGB0,F
                MOVLW           0x80
                XORWF           SIGN,F
                GOTO            NRM32

; 32位浮点数左规格式化
NRM3232
NRM32       CLRF        TEMP        ;指数减小量清0
            MOVF        AARGB0,W    ;高字节=0?
            BTFSS       STATUS,Z
            GOTO        NORM3232
            MOVF        AARGB1,W    ;是,则移8位
            MOVWF       AARGB0
            MOVF        AARGB2,W
            MOVWF       AARGB1
            CLRF        AARGB2
            BSF         TEMP,3      ;指数减小量加8
            MOVF        AARGB0,W    ;再次检测高字节=0?
            BTFSS       STATUS,Z
            GOTO        NORM3232
            MOVF        AARGB1,W    ;是,则移8位
            MOVWF       AARGB0
            CLRF        AARGB1
            BCF         TEMP,3      ;指数减小量加8
            BSF         TEMP,4
            MOVF        AARGB0,W    ;如果高字节=0, 则结果=0
            BTFSC       STATUS,Z
            GOTO        RES032
NORM3232    MOVF        TEMP,W
            SUBWF       EXP,F
            BTFSS       STATUS,Z
            BTFSS       STATUS,C
            GOTO        SETFUN32
            BCF         STATUS,C    ;清进位位
NORM3232A   BTFSC       AARGB0,MSB  ;如果MSB=1,则格式化完成
            GOTO        FIXSIGN32
            RLF         AARGB2,F    ;否则,左移并
            RLF         AARGB1,F    ;将EXP-1
            RLF         AARGB0,F
            DECFSZ      EXP,F
            GOTO        NORM3232A
            GOTO        SETFUN32    ;如果 EXP=0 则发生下溢
FIXSIGN32   BTFSS       SIGN,MSB
            BCF         AARGB0,MSB  ;结果为正则清除MSB
            RETLW       0
RES032      CLRF        AARGB0      ;结果为0
            CLRF        AARGB1
            CLRF        AARGB2
            CLRF        AARGB3
            CLRF        EXP
            RETLW       0

NRM4032         CLRF            TEMP			; clear exponent decrement
                MOVF            AARGB0,W		; test if highbyte=0
                BTFSS           STATUS,Z
                GOTO            NORM4032
                MOVF            AARGB1,W		; if so, shift 8 bits by move
                MOVWF           AARGB0
                MOVF            AARGB2,W
                MOVWF           AARGB1
                MOVF            AARGB3,W
                MOVWF           AARGB2
                CLRF            AARGB3
                BSF             TEMP,3                  ; increase decrement by 8
                MOVF            AARGB0,W		; test if highbyte=0
                BTFSS           STATUS,Z
                GOTO            NORM4032
                MOVF            AARGB1,W		; if so, shift 8 bits by move
                MOVWF           AARGB0
                MOVF            AARGB2,W
                MOVWF           AARGB1
                CLRF            AARGB2
                BCF             TEMP,3                  ; increase decrement by 8
                BSF             TEMP,4
                MOVF            AARGB0,W		; test if highbyte=0
                BTFSS           STATUS,Z
                GOTO            NORM4032
                MOVF            AARGB1,W		; if so, shift 8 bits by move
                MOVWF           AARGB0
                CLRF            AARGB1
                BSF             TEMP,3                  ; increase decrement by 8
                MOVF            AARGB0,W		; if highbyte=0, result=0
                BTFSC           STATUS,Z
                GOTO            RES032
NORM4032        MOVF            TEMP,W
                SUBWF           EXP,F
                BTFSS           STATUS,Z
                BTFSS           STATUS,C
                GOTO            SETFUN32
                BCF             STATUS,C                ; clear carry bit
NORM4032A       BTFSC           AARGB0,MSB		; if MSB=1, normalization done
                GOTO            NRMRND4032
                RLF             AARGB3,F                ; otherwise, shift left and 
                RLF             AARGB2,F                ; decrement EXP
                RLF             AARGB1,F
                RLF             AARGB0,F
                DECFSZ          EXP,F
                GOTO            NORM4032A
                GOTO            SETFUN32                ; underflow if EXP=0
NRMRND4032      BTFSC           FPFLAGS,RND
                BTFSS           AARGB2,LSB
                GOTO            FIXSIGN32
		BTFSS		AARGB3,MSB		; round if next bit is set
                GOTO            FIXSIGN32
		INCF		AARGB2,F
                BTFSC           STATUS,Z
                INCF            AARGB1,F
                BTFSC           STATUS,Z
                INCF            AARGB0,F
                BTFSS           STATUS,Z                      ; has rounding caused carryout?
                GOTO            FIXSIGN32
                RRF             AARGB0,F                ; if so, right shift
                RRF             AARGB1,F
                RRF             AARGB2,F
                INCF            EXP,F
                BTFSC           STATUS,Z                      ; check for overflow
                GOTO            SETFOV32
                GOTO            FIXSIGN32
SETFUN32        BSF             FPFLAGS,FUN             ; set floating point underflag
                BTFSS           FPFLAGS,SAT             ; test for saturation
                RETLW           0xFF                    ; return error code in WREG
                MOVLW           0x01                    ; saturate to smallest floating
                MOVWF           AEXP                    ; point number = 0x 01 00 00 00
                CLRF            AARGB0                  ; modulo the appropriate sign bit
                CLRF            AARGB1
                CLRF            AARGB2
                RLF             SIGN,F
                RRF             AARGB0,F
                RETLW           0xFF                    ; return error code in WREG
SETFOV32        BSF             FPFLAGS,FOV             ; set floating point underflag
                BTFSS           FPFLAGS,SAT             ; test for saturation
                RETLW           0xFF                    ; return error code in WREG
                MOVLW           0xFF
                MOVWF           AEXP                    ; saturate to largest floating
                MOVWF           AARGB0                  ; point number = 0x FF 7F FF FF
                MOVWF           AARGB1                  ; modulo the appropriate sign bit
                MOVWF           AARGB2
                RLF             SIGN,F
                RRF             AARGB0,F
                RETLW           0xFF                    ; return error code in WREG
               ENDIF
               

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -