📄 msdiv.asm
字号:
;********************MSDIV********************
;本程序实现多字节有符号数除法。
;入口参数:被除数地址在SADR中,除数地址在DADR中,字节数在CNT中(小于32字节),将来
; 余数地址在SADRH中。
;出口参数:商地址在SADR中,余数地址在SADRH中,字节数在CNT中。
;占用资源:W,FSR,STATUS,020H~026H,028H~02BH,两重堆栈。
;说 明: 1.除数,被除数,余数所占用的RAM单元不要重合.
; 2.程序执行后,被除数被破坏.
; 3.加载本文件的同时也加载了另外三个文件"MSHL.ASM","MUSUB.ASM",
; "MUADD.ASM","MSHR.ASM","MSNEG.ASM",故用户在使用这个子程序时可直
; 接调用,不必重新加载.
IFNDEF MSDIV1
#DEFINE MSDIV1
MSDIV MOVF CNT,W
MOVWF TEMP4
MOVWF TEMP3 ;TEMP3作为计数器
BCF STATUS,C
RLF TEMP3,F
RLF TEMP3,F
RLF TEMP3,F ;字节数乘以8得到循环次数
MOVF SADRH,W
MOVWF FSR
LOOP85 CLRF INDF
INCF FSR,F
DECFSZ TEMP4,F
GOTO LOOP85 ;余数清0
MOVF SADR,W
MOVWF SOU ;SOU存储被除数地址
MOVF DADR,W
MOVWF RLT ;RLT暂存除数地址
DECF CNT,W
ADDWF SADR,W
MOVWF FSR ;得到最高位字节地址
MOVF INDF,W
MOVWF SOUH
BTFSS SOUH,7 ;除数符号位
GOTO PLUS3
CALL MSNEG ;求补
PLUS3 DECF CNT,W
ADDWF DADR,W
MOVWF FSR ;得到被除数最高位地址
MOVF INDF,W
XORWF SOUH,F ;得到结果符号
BTFSS INDF,7
GOTO PLUS4
MOVF DADR,W
MOVWF SADR
CALL MSNEG ;求补
PLUS4 MOVF SOU,W
MOVWF SADR
CALL MSHL ;被除数带进位左移1位
MOVF SADRH,W
MOVWF SADR
CALL MSHL ;余数左移
LOOP84 MOVF RLT,W
MOVWF DADR ;传递参数
CALL MUSUB
BTFSC STATUS,C
GOTO NEXT47
MOVF RLT,W
MOVWF DADR
CALL MUADD ;恢复余数
BCF STATUS,C
NEXT47 MOVF SOU,W
MOVWF SADR
CALL MSHL ;被除数和商左移
MOVF SADRH,W
MOVWF SADR
CALL MSHL ;余数左移
DECFSZ TEMP3,F
GOTO LOOP84
MOVF SADRH,W
MOVWF SADR
BCF STATUS,C
CALL MSHR ;恢复余数
MOVF SOU,W
MOVWF SADR ;整理出口
BTFSS SOUH,7
RETLW 0
CALL MSNEG ;结果为负则求补
RETLW 1
INCLUDE "MSHL.ASM"
INCLUDE "MUADD.ASM"
INCLUDE "MUSUB.ASM"
INCLUDE "MSHR.ASM"
INCLUDE "MSNEG.ASM"
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -