📄 16×16位定点数除法子程序.txt
字号:
; 2.3 16×16位定点数除法子程序
;子程序采用反复的减法算法,除数和被除数分别为16位二进制有符号数
;(均采用补码表示,第16位为符号位),商为16位二进制有符号数,
;第16位为符号位。子程序的入口条件和出口条件如下:
;【校验举例2】 769÷3856=0.199429(十进制)
;化为十六进制数:0301H÷0F10H;
;结果:(商)0000H,(余数)0301H(十六进制)。
;入口条件:被除数存放在ACCBHI、ACCBLO单元中;
; 除数存放在ACCAHI、ACCALO单元中。
;出口条件:商存放在ACCBHI、ACCBLO单元中;
; 余数存放在ACCCHI、ACCCLO单元中。
LIST p=16f877
INCLUDE p16f877.inc
ACCALO EQU 20 ;存放除数低8位
ACCAHI EQU 21 ;存放除数高8位
ACCBLO EQU 22 ;存放被除数和商的低8位
ACCBHI EQU 23 ;存放被除数和商的高8位
ACCCLO EQU 24 ;存放余数低8位
ACCCHI EQU 25 ;存放余数高8位
ACCDLO EQU 26 ;临时寄存器
ACCDHI EQU 27 ;临时寄存器
TEMP EQU 28 ;临时寄存器
SIGN EQU 29 ;存放商的符号
ORG 0X0000
START GOTO MAIN
;***16×16位数除法子程序,入口地址ACCB /ACCA,出口地址ACCB ***
ORG 0X0100
NEG_B DECF ACCBLO
COMF ACCBLO
BTFSC STATUS,Z
DECF ACCBHI
COMF ACCBHI
OVER RETURN ;乘法结束,子程序返回
NEG_A COMF ACCALO ;ACCALO取反加1
INCF ACCALO
BTFSC STATUS,Z ;低8位有进位吗?
DECF ACCAHI ;有,ACCAHI减1,再取反
COMF ACCAHI ;否则ACCAHI直接取反
RETURN ;子程序返回
SETUP MOVLW .15 ;初始化TEMP寄存器
MOVWF TEMP
MOVF ACCBHI,0 ;ACCB送ACCD
MOVWF ACCDHI
MOVF ACCBLO,0
MOVWF ACCDLO
CLRF ACCBHI ;清ACCB
CLRF ACCBLO
RETURN ;子程序返回
D_div CALL S_SIGN ;确定商的符号,并将负数取补
CALL SETUP ;初始化TEMP,将被除数移至ACCD,
;(SETUP子程序请参见16×16位定点数
;乘法子程序SETUP)
INCF TEMP
CLRF ACCCHI ;清余数寄存器
CLRF ACCCLO
DLOOP BCF STATUS,C ;清进位位
RLF ACCDLO ;被除数、余数左移1位
RLF ACCDHI
RLF ACCCLO
RLF ACCCHI
MOVF ACCAHI,0 ;ACCCHI-ACCAHI
SUBWF ACCCHI,0
BTFSS STATUS,Z ;ACCCHI=ACCAHI?
GOTO NOCHK
MOVF ACCALO,0 ;是,ACCCLO-ACCALO
SUBWF ACCCLO,0
NOCHK BTFSS STATUS,C ;ACCC>ACCA?
GOTO NOGO
MOVF ACCALO,0 ;是,余数减除数
SUBWF ACCCLO
BTFSS STATUS,C
DECF ACCCHI
MOVF ACCAHI,0
SUBWF ACCCHI
BSF STATUS,C ;置进位位
NOGO RLF ACCBLO ;商左移1位
RLF ACCBHI
DECFSZ TEMP ;循环完毕?
GOTO DLOOP
BTFSS SIGN,7 ;是,确定商的符号
GOTO DIVOVER ;为正,除法结束,跳转到结束行
COMF ACCCLO ;为负,商和余数分别取补
INCF ACCCLO
BTFSC STATUS,Z
DECF ACCCHI
COMF ACCCHI
CALL NEG_B ;见乘法程序中间NEG_B
DIVOVER RETURN ;子程序返回
;************除法运算确定结果符号子程序*******************
S_SIGN MOVF ACCAHI,0 ;ACCAHI异或ACCBHI,结果送SIGN单元
XORWF ACCBHI,0
MOVWF SIGN
BTFSS ACCBHI,7 ;ACCB为负?
GOTO CHEK_A ;否,检查ACCA
COMF ACCBLO ;是,ACCB取补
INCF ACCBLO
BTFSC STATUS,Z
DECF ACCBHI
COMF ACCBHI
CHEK_A BTFSC ACCAHI,7 ;ACCA为负?
CALL NEG_A ;ACCA为负,取补(NEG_A子程序请参见
;16×16位定点数乘法子程序NEG_A)
RETURN ;ACCA和ACCB均为负,返回
MAIN MOVLW 0X01 ;被除数0301H送ACCB
MOVWF ACCBLO
MOVLW 0X03
MOVWF ACCBHI
MOVLW 0X10 ;除数0F10H送ACCA
MOVWF ACCALO
MOVLW 0X0F
MOVWF ACCAHI
CALL D_div ;调用双字节除法子程序,求商
goto $
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -