本帖最后由 liht1634 于 2010-1-10 09:34 编辑
LIST P=18F2321
#include <P18F2321.INC>
;被乘数SOUH:SOUL,乘数RES3:RES0(位数32位),乘积在16H-1BH中,高位在前
MUL32_16 ;SOUH:SOUL*RES3:RES0
CLRF 16H ;乘积清零
CLRF 17H
CLRF 18H
CLRF 19H
CLRF 1AH
CLRF 1BH
MOVLW 0E1H ;验证数据
MOVWF SOUH
MOVWF SOUL
MOVLW 00H
MOVWF RES3
MOVLW 03H
MOVWF RES2
MOVLW 87H
MOVWF RES1
MOVLW 0C1H
MOVWF RES0
MOVLW 20H ;20H=32乘数位数
MOVWF CNT1
LOOP1
BCF STATUS,C
RRCF RES3 ;连C右移一次
RRCF RES2
RRCF RES1
RRCF RES0
BTFSS STATUS,C
GOTO LOOP2
MOVF SOUL,W ;双字节加法
ADDWF 17H,F ;被加数16H:17H,加数SOUH:SOUL
BTFSC STATUS,C
INCF SOUH,F
MOVF SOUH,W
ADDWF 16H,F
LOOP2
RRCF 16H ;连C右移一次
RRCF 17H
RRCF 18H
RRCF 19H
RRCF 1AH
RRCF 1BH
DECFSZ CNT1,F
GOTO LOOP1
RETURN
我是根据程序匠人的移位法多字节乘法,出的结果不对,请对上面的程序给予指正为谢。算法如下:
|