📄 浮点数开方程序.txt
字号:
;***浮点加子程序F_add详细的程序语句请参考前面章节***
;***浮点数除法子程序FDIV详细的程序语句请参考前面章节***
;【校验举例】 被开方数55AAH,02H (浮点数)
; 求得平方根:68B6H,01H (浮点数)
; 7 浮点数开方程序
; 如果被开方数是浮点数格式,代入的迭代初值也是浮点数格式,并且用浮点
;除法(浮点数的除以2操作可以由阶码减1得到)和浮点加法进行迭代运算,
;就是浮点数开方的基本思路。
;以下为浮点数开方的程序清单(其中包含校验程序部分)。该程序中包含浮点数
;加法程序和浮点数除法程序,这些程序与前面章节列出的程序完全相同,
;不再列出。
LIST P=16f877
INCLUDE p16f877.inc
;****************************************
;此子程序是16尾数,8位阶码开方程序
;入口条件:浮点数存放在ACCBHI和ACCBLO EXPB单元中.
;出口条件:结果放在ACCBHI和ACCBLO EXPB单元中.
;迭代次数由LUPCNT的地址值决定
;用CALL SQRTF指令调用,
;内含浮点除程序,浮点加减程序
;****************************************
ACCALO EQU 20H
ACCAHI EQU 21H
EXPA EQU 22H
ACCBLO EQU 23H
ACCBHI EQU 24H
EXPB EQU 25H
ACCCLO EQU 26H
ACCCHI EQU 27H
ACCDLO EQU 28H
ACCDHI EQU 29H
TEMP EQU 2AH
TEMP1 EQU 2BH
TIMES EQU 2CH
SIGN EQU 2DH
COUNT EQU 2EH
C_MUL EQU 2FH
C_DIV EQU 30H
FPOL EQU 31H ;符号放置位
NUMLO EQU 32H
NUMHI EQU 33H
NUMM EQU 34H
FULL EQU 35H
LUPCNT EQU 36H
CONSTANT C=0
CONSTANT Z=2
CONSTANT MODEL16=1
CONSTANT FALSE=0
;****************************************
ORG 0X0000
NOP
GOTO MAIN
ORG 0X0010
;****************************************
INIT1 DECF EXPB ;假设迭代根的初始值为其原值的一半
MOVF ACCBHI,W
MOVWF ACCAHI
MOVF ACCBLO,W
MOVWF ACCALO
MOVF EXPB,W
MOVWF EXPA
RETLW 0
SQRTF MOVLW LUPCNT
MOVWF COUNT
MOVF ACCBHI,W
MOVWF NUMHI
MOVF ACCBLO,W
MOVWF NUMLO
MOVF EXPB,W
MOVWF NUMM ;存储被开方的数
BTFSC ACCBHI,7
GOTO TIQIAN ;如果被开方数是个负数,则返回一极小数
CALL INIT1
SLOOP1 MOVF NUMLO,0
MOVWF ACCBLO
MOVF NUMHI,0
MOVWF ACCBHI
MOVF NUMM,0
MOVWF EXPB
CALL FDIV
CALL F_add
CALL INIT1
DECFSZ COUNT,1
GOTO SLOOP1
RETURN
;***********浮点加法子程序**************
F_add CALL SUBADJ ;调子程序判断EXPB和EXPA的大小
BTFSC STATUS,Z ;参与运算的两个数阶码相等?
GOTO PADD ;是,求尾数的和
BTFSC STATUS,C ;EXPB>EXPA?
CALL F_swap ;是,ACCB与ACCA互换
MOVF EXPA,0 ;否,求取两者的差值
SUBWF EXPB
SCLOOP CALL SHFTSR ;ACCB右移规格化
INCFSZ EXPB ;EXPB=EXPA?
GOTO SCLOOP ;否,继续右移
MOVF EXPA,0 ;是,存和(差)的阶码
MOVWF EXPB
PADD MOVF ACCAHI,0 ;ACCAHI或ACCBHI
IORWF ACCBHI,0
MOVWF SIGN ;存于SIGN寄存器
MOVF ACCBHI,0 ;暂存ACCBHI
MOVWF EXPA
CALL D_add ;尾数相加
BTFSS SIGN,7 ;ACCA和ACCB有负数?
BTFSC ACCBHI,7 ;否,把和的最高位和次高位同时进位?
GOTO ADD2 ;否,转ADD2
BTFSS ACCAHI,7 ;ACCA为负吗?
GOTO ADD3 ;ACCA和ACCB不同时为负,转ADD3
BTFSS EXPA,7 ;是,ACCB为负吗?
GOTO ADD3
BSF STATUS,C ;ACCA和ACCB同为负,带负号右移
RRF ACCBHI
RRF ACCBLO
INCF EXPB
ADD3 CLRF ACCCHI ;和(差)规格化
CLRF ACCCLO
CALL F_norm
RETURN ;子程序返回
ADD2 BCF STATUS,C ;最高位次高位不同时进位,ACCB右移
INCF EXPB
GOTO SHFTR
SHFTSR BCF STATUS,C ;ACCB带符号右移子程序
BTFSC ACCBHI,7
BSF STATUS,C
SHFTR RRF ACCBHI
RRF ACCBLO
RETURN ;子程序返回
;*************比较EXPB、EXPA大小子程序*************
SUBADJ MOVF EXPA,0 ;EXPA异或EXPB,结果送C_DIV
XORWF EXPB,0
MOVWF C_DIV
MOVF EXPA,0 ;EXPB-EXPA
SUBWF EXPB,0
BTFSS C_DIV,7 ;EXPA和EXPB同号?
RETURN ;是,进位位的值真确反映两者的大小,返回
BTFSS STATUS,C ;否,进位位的值取反
GOTO CHANGEC
BCF STATUS,C
RETURN
CHANGEC BSF STATUS,C
RETURN
;********* ACCB、ACCA互换子程序************
F_swap MOVF ACCAHI,0 ;ACCAHI、ACCBHI互换
MOVWF TEMP
MOVF ACCBHI,0
MOVWF ACCAHI
MOVF TEMP,0
MOVWF ACCBHI
MOVF ACCALO,0 ;ACCALO、ACCBLO互换
MOVWF TEMP
MOVF ACCBLO,0
MOVWF ACCALO
MOVF TEMP,0
MOVWF ACCBLO
MOVF EXPA,0 ;EXPA、EXPB互换
MOVWF TEMP
MOVF EXPB,0
MOVWF EXPA
MOVF TEMP,0
MOVWF EXPB
RETURN
;***********浮点数规格化子程序****************
F_norm MOVF ACCBHI ;ACCB=0?
BTFSS STATUS,Z
GOTO C_norm
MOVF ACCBLO
BTFSC STATUS,Z
RETURN ;是,不需规格化,返回
C_norm BTFSC ACCBHI,7 ;否。ACCB为负?
GOTO C_norm2
C_norm1 BTFSC ACCBHI,6 ;为正。规格化完毕?
RETURN ;ACCBHI.6=1,规格化结束
CALL SHFTSL ;否。ACCB左移
DECF EXPB ;EXPB减1
GOTO C_norm1 ;重新判断规格化完毕否?
C_norm2 BTFSS ACCBHI,6 ;ACCB为负。规格化完毕否?
RETURN ;ACCBHI.6=0,规格化结束
BCF STATUS,C
CALL SHFTSL ;否,ACCB左移
BSF ACCBHI,7 ;加符号
DECF EXPB ;EXPB减1
GOTO C_norm2 ;重新判断规格化完毕否?
SHFTSL BCF STATUS ,C ;ACCB左移子程序
RLF ACCCLO
RLF ACCCHI
RLF ACCBLO
RLF ACCBHI
RETURN
;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB***
D_add MOVF ACCALO,0 ;ACCB和ACCA低半字节相加
ADDWF ACCBLO
BTFSC STATUS,C ;有进位否?
goto $+6 ;有,
MOVF ACCAHI,0 ;ACCA、ACCB高半字节相加
ADDWF ACCBHI
BTFSC STATUS,C
BSF FULL,0
RETURN ;子程序返回
MOVFW ACCBHI ;ACCB高字节加1,再加ACCAHI
ADDLW 1h
BTFSC STATUS,C ;有进位否?
BSF FULL,0
MOVWF ACCBHI
GOTO $-D'10'
TIQIAN MOVLW 0X40
MOVWF ACCBHI
CLRF ACCBLO
MOVLW 0X80
MOVWF EXPB ;如果被开方数是一个负数,返回一个极小的浮点数
RETURN
MAIN NOP
MOVLW 0X55
MOVWF ACCBHI
MOVLW 0XAA
MOVWF ACCBLO ;被开方数的尾数55AAH赋值
MOVLW 0X02
MOVWF EXPB ;被开方数的阶码02H赋值
CALL SQRTF ;调用浮点开方子程序
NOP ;开方完毕,结果在ACCBHI、ACCBLO、EXPB
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -