📄 msmul.asm
字号:
;********************MSMUL********************
;本程序实现多字节有符号数乘法。
;入口参数:被乘数地址在SADR中,乘数地址在DADR中,字节数在CNT中(小于32字节),结果
; 地址在SADRH中。
;出口参数:结果在指定单元中,地址在SADR中,字节数在CNT中。
;占用资源:W,FSR,STATUS,020H~02BH,两重堆栈。
;说明: 1.结果与被乘数所占用的RAM单元不要重合
; 2.加载本文件的同时也加载了另外四个文件"MROR.ASM","MSHR.ASM",
; "MUADD.ASM","MSNEG.ASM"故用户在使用这个子程序时可直接调用,不必重新加载.
IFNDEF MSMUL1
#DEFINE MSMUL1
MSMUL MOVF CNT,W
MOVWF TEMP4
MOVWF TEMP3 ;TEMP3作为计数器
MOVF SADR,W
MOVWF SOU ;SOU保护被乘数地址
MOVF DADR,W
MOVWF RLTH ;RLTH存储乘数地址
MOVF SADRH,W
MOVWF RLT ;RLT存结果地址
ADDWF CNT,W
MOVWF SADRH ;SADRH存储结果中间位地址
RLF TEMP3,F
RLF TEMP3,F
RLF TEMP3,F ;字节数乘以8得到位数
MOVF SADRH,W
MOVWF FSR
LOOP21 CLRF INDF ;结果清0
INCF FSR,F
DECFSZ TEMP4,F
GOTO LOOP21
DECF SADR,W
ADDWF CNT,W
MOVWF FSR ;得到最高位字节地址
MOVF INDF,W
MOVWF SOUH
BTFSS SOUH,7 ;被乘数符号位
GOTO PLUS1
CALL MSNEG ;求补
PLUS1 DECF DADR,W
ADDWF TEMP4,W
MOVWF FSR ;得到乘数最高位地址
MOVF INDF,W
XORWF SOUH,F ;得到结果符号
BTFSS INDF,7
GOTO PLUS2
MOVF DADR,W
MOVWF SADR
CALL MSNEG ;求补
PLUS2 BCF STATUS,C
LOOP22 MOVF SOU,W
MOVWF SADR ;恢复被乘数地址
CALL MROR ;被乘数循环右移
BTFSS STATUS,C
GOTO NOC6
MOVF SADRH,W
MOVWF SADR
MOVF RLTH,W
MOVWF DADR ;传递参数
CALL MUADD ;乘数加到结果中
NOC6 MOVF RLT,W
MOVWF SADR
RLF TEMP4,F ;
BCF STATUS,C ;
RLF CNT,F ;
RRF TEMP4,F ;得到结果字节数并保护C
CALL MSHR ;结果非循环右移
BCF STATUS,C
RRF CNT,F
DECFSZ TEMP3,F
GOTO LOOP22
MOVF RLT,W
MOVWF SADR
BTFSS SOUH,7
RETURN
MOVF CNT,W ;结果为负则求补
ADDWF CNT,F
CALL MSNEG
RETURN
INCLUDE "MROR.ASM"
INCLUDE "MSHR.ASM"
INCLUDE "MUADD.ASM"
INCLUDE "MSNEG.ASM"
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -