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

📄 flosqr.asm

📁 PIC单片机的汇编源码合集,应用比较广泛,设计程序时可做子程序来用
💻 ASM
字号:
;********************FLOSQR********************
;本程序实现标准浮点数开平方SQRT(x)。
;入口参数:X在ARGBH1:ARGBL1:EXP1中。
;出口参数:SQRT(X)在ARGBH1:ARGBL1:EXP1中。
;占用资源:W,STATUS,020H~02CH,两重堆栈。
;说明:     用户需自行指定 AARGB4,AARGB5,BARGB3,CEXP,DEXP,DARGB1,DARGB2,DARGB3

           IFNDEF       FLOSQR1
            #DEFINE     FLOSQR1

            INCLUDE     "RND3224.ASM"
            INCLUDE     "MUAD32.ASM"
            INCLUDE     "FXM2424U.ASM"


FLOSQR      BTFSC       AARGB0,MSB  ;检查是否为负数
            GOTO        DOMERR  
            CLRF        AARGB2      
            MOVF        AEXP,W      
            BTFSC       STATUS,Z    ;是0则返回
            RETLW       0x00
            MOVF        AEXP,W      ;将指数保存在CEXP中
            MOVWF       CEXP
            MOVF        FPFLAGS,W   ;将RND标志保存在DARGB3中
            MOVWF       DARGB3
            BCF         FPFLAGS,RND ;不圆整
            MOVLW       .127        ;计算z
            MOVWF       AEXP
            MOVF        AEXP,W      ;将z保存在DARG中
            MOVWF       DEXP
            MOVF        AARGB0,W
            MOVWF       DARGB0
            MOVF        AARGB1,W
            MOVWF       DARGB1
            CLRF        DARGB2
            BTFSS       AARGB0,MSB-1
            GOTO        SQRTL
SQRTH       POL         SQRT24H,4,0 ;在区间[1.5,2]上进行逼近       
            GOTO        SQRTOK
SQRTL       POL         SQRT24L,4,0 ;在区间[1,1.5]上进行逼近
SQRTOK      BTFSC       CEXP,LSB    ;指数是偶数还是奇数?
            GOTO        RRSQRTOK  
;********************乘以SQRT(2)************
            BSF         AARGB0,MSB
            MOVLW       0xB5        ; sqrt(2) = 1.41421356237
            MOVWF       BARGB0
            MOVLW       0x04
            MOVWF       BARGB1
            MOVLW       0xF3
            MOVWF       BARGB2
            CALL        FXM2424U
            INCF        AEXP,F
            BTFSC       AARGB0,MSB
            GOTO        RRSQRTOK  
            RLF         AARGB3,F
            RLF         AARGB2,F
            RLF         AARGB1,F
            RLF         AARGB0,F
            DECF        AEXP,F      
RRSQRTOK    BCF         AARGB0,MSB  ;隐藏最高位的1
            MOVLW       .127        
            ADDWF       CEXP,F
            RRF         CEXP,W      ;指数除以2
            MOVWF       AEXP
            BTFSS       DARGB3,RND
            RETLW       0x00
            BSF         FPFLAGS,RND
            CALL        RND3224
            RETLW       0x00
DOMERR      BSF         FPFLAGS,DOM ;范围溢出
            RETLW       0xFF
;在区间 [1.5,2]上的四次多项式系数COF 
SQRT24H0	EQU		0x7D		; SQRT24H0 = 3.5963132863E-1
SQRT24H00	EQU		0x38
SQRT24H01	EQU		0x21
SQRT24H02	EQU		0x99

SQRT24H1	EQU		0x7E		; SQRT24H1 = 8.3106978456E-1
SQRT24H10	EQU		0x54
SQRT24H11	EQU		0xC0
SQRT24H12	EQU		0xFD

SQRT24H2	EQU		0x7C		; SQRT24H2 = -2.3944355047E-1
SQRT24H20	EQU		0xF5
SQRT24H21	EQU		0x30
SQRT24H22	EQU		0xB1

SQRT24H3	EQU		0x7A		; SQRT24H3 = 5.5047377031E-2
SQRT24H30	EQU		0x61
SQRT24H31	EQU		0x79
SQRT24H32	EQU		0x5C

SQRT24H4	EQU		0x77		; SQRT24H4 = -5.6351436252E-3
SQRT24H40	EQU		0xB8
SQRT24H41	EQU		0xA7
SQRT24H42	EQU		0x03

;在区间[1,1.5]上的四次多项式系数COF

SQRT24L0	EQU		0x7D		; SQRT24L0 = 3.0221977303E-1
SQRT24L00	EQU		0x1A
SQRT24L01	EQU		0xBC
SQRT24L02	EQU		0x8B

SQRT24L1	EQU		0x7E		; SQRT24L1 = 9.8831235597E-1
SQRT24L10	EQU		0x7D
SQRT24L11	EQU		0x02
SQRT24L12	EQU		0x0A

SQRT24L2	EQU		0x7D		; SQRT24L2 = -4.0192034196E-1
SQRT24L20	EQU		0xCD
SQRT24L21	EQU		0xC8
SQRT24L22	EQU		0x81

SQRT24L3	EQU		0x7C		; SQRT24L3 = 1.3009144111E-1
SQRT24L30	EQU		0x05
SQRT24L31	EQU		0x36
SQRT24L32	EQU		0xB1

SQRT24L4	EQU		0x79		; SQRT24L4 = -1.8702682470E-2
SQRT24L40	EQU		0x99
SQRT24L41	EQU		0x36
SQRT24L42	EQU		0x36
               ENDIF

 

⌨️ 快捷键说明

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