📄 dsdiv.asm
字号:
;********************DSDIV********************
;本程序实现双字节有符号数除法。
;入口参数:被除数在SOUH:SOU中,除数在RLTH:RLT中。
;出口参数:商在SOUH:SOU中,余数在RLTH:RLT中.
;占用资源:W,STATUS,021H,023H~02BH,一重堆栈。
;说 明: 1.用户在调用该子程序之前必须确定除数不为零,否则得不到正确结果.
; 2.余数一定为正数.
; 3.被除数绝对值一定要大于除数的绝对值,否则将出错.
IFNDEF DSDIV1
#DEFINE DSDIV1
DSDIV MOVLW .16 ;循环16次
MOVWF CNT
MOVF RLTH,W
XORWF SOUH,W
MOVWF SADRH ;SADRH暂存相除后的符号位
BTFSS SOUH,7
GOTO NEXT45
COMF SOU,F
COMF SOUH,F
INCF SOU,F
BTFSC STATUS,Z
INCF SOUH,F ;负数取相反数
NEXT45 BTFSS RLTH,7
GOTO NEXT46
COMF RLT,F
COMF RLTH,F
INCF RLT,F
BTFSC STATUS,Z
INCF RLTH,F ;负数取相反数
NEXT46 MOVF SOUH,W
MOVWF TEMP4
MOVF SOU,W
MOVWF TEMP3 ;被除数转移到TEMP4:TEMP3中
CLRF SOUH
CLRF SOU ;SOUH:SOU用来存放商
CLRF TEMP2
CLRF TEMP1 ;TEMP2:TEMP1得到余数
LOOP83 BCF STATUS,C
RLF TEMP3,F
RLF TEMP4,F
RLF TEMP1,F
RLF TEMP2,F
MOVF RLTH,W
SUBWF TEMP2,W ;检测是否余数大于除数
BTFSS STATUS,Z
GOTO NOCHK1
MOVF RLT,W
SUBWF TEMP1,W ;如果高位相等则检测低位
NOCHK1 BTFSS STATUS,C
GOTO NOGO1
MOVF RLT,W ;余数减除数
SUBWF TEMP1,F
BTFSS STATUS,C
DECF TEMP2,F
MOVF RLTH,W
SUBWF TEMP2,F
BSF STATUS,C ;结果中移入1
NOGO1 RLF SOU,F
RLF SOUH,F
DECFSZ CNT,F
GOTO LOOP83
MOVF TEMP1,W
MOVWF RLT
MOVF TEMP2,W
MOVWF RLTH ;余数归位
BTFSS SADRH,7
RETLW 0 ;结果是正数则返回
COMF SOU,F
COMF SOUH,F
INCF SOU,F
BTFSC STATUS,Z
INCF SOUH,F
RETLW 0
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -