单片机乘法运算.docx
《单片机乘法运算.docx》由会员分享,可在线阅读,更多相关《单片机乘法运算.docx(9页珍藏版)》请在冰豆网上搜索。
![单片机乘法运算.docx](https://file1.bdocx.com/fileroot1/2023-1/10/16b59184-d118-48d2-a1df-d997dc5b7053/16b59184-d118-48d2-a1df-d997dc5b70531.gif)
单片机乘法运算
单片机乘法运算
1.操作数在寄存器中,R0--R7
2.操作数在内RAM中
3.操作数在外RAM中
不过都大同小异,以2例,是个乘法子程序。
入口:
乘数R0,被乘数R1,字节数R7,结果在R0
MULN:
LCALLN2N;多字节十六进制乘法
RLCA
RLCA
MOVR3,A
MULN1:
MOVA,R5
MOVR0,A
CLRC
LCALLRLCN
JNCMULN2
LCALLADDN
MULN2:
DJNZR3,MULN1
N1N:
MOVA,R1
ADDA,R7
MOVR0,A
MOVA,R7
CLRC
RRCA
MOVR7,A
MOVR2,A
ADDA,R1
MOVR1,A
MULN3:
DECR0
DECR1
MOVA,@R0
MOV@R1,A
DJNZR2,MULN3
MOVA,R5
MOVR0,A
RET
;
RLCN:
MOVA,R7;多字节二进制无符号数左移一位
RLCN1:
MOVR2,A
PUSHPSW
ADDA,R0
MOVR0,A
POPPSW
RLCN2:
DECR0
MOVA,@R0
RLCA
MOV@R0,A
DJNZR2,RLCN2
RET
;
N2N:
MOVA,R7
MOVR2,A
ADDA,R0
MOVR6,A
MOVA,R0
MOVR5,A
MOVA,R1
MOVR4,A
ADDA,R7
MOVR0,A
N2N1:
MOVA,@R1
MOV@R0,A
INCR0
INCR1
DJNZR2,N2N1
MOVA,R6
MOVR0,A
LCALLCLRN
MOVA,R4
MOVR0,A
LCALLCLRN
MOVA,R4
MOVR1,A
MOVA,R5
MOVR0,A
MOVA,R7
ADDA,R7
MOVR7,A
RET
;
ADDN:
MOVA,R7
MOVR2,A
ADDA,R0
MOVR0,A
MOVA,R7
ADDA,R1
MOVR1,A
CLRC
ADN1:
DECR0
DECR1
MOVA,@R1
ADDCA,@R0
MOV@R0,A
DJNZR2,ADN1
RET
;
CLRN:
MOVA,R7
MOVR2,A
ADDA,R0
MOVR0,A
CLRA
CLRN1:
DECR0
MOV@R0,A
DJNZR2,CLRN1
RET
比如你要把12345678H这个十六进制数乘以87654321H,那么你可以这样调用:
MOVR0,#30H;被乘数区
MOVR1,#40H;乘数区
MOVR7,#04H;字节数
MOV30H,#12H;填充被乘数
MOV31H,#34H
MOV32H,#56H
MOV33H,#78H
MOV40H,#87H;填充乘数
MOV41H,#65H
MOV42H,#43H
MOV43H,#21H
CALLMULN;调用
这时的结果在R0所指的数据区,即30H-37H共八个字节。
当然你是3字节乘法的话,把R7改成03H就可以了,
结果为6个字节,高字节在前,低字节在后。
一定要注意把R0所指的区留出存放结果的空间。
比如3字节乘
法,你要留出6个字节空间,5字节乘法要留出10个字节的空间。
反正很灵活的。
想做多少字节乘法都可以
。
这是除法子程序,入口、字节数、出口和乘法一样,不过有个限制:
只限于被除数小于除数,结果为纯小
数。
不知老兄是否适用。
DIVN:
LCALLDIV0;多字节16进制除法子程序
JCDIVN1
SETBOV
RET
DIVN1:
MOVA,R0
MOVR4,A
ADDA,R7
MOVR5,A
MOVA,R7
MOVB,#08H
MULAB
MOVR3,A
DIVN4:
LCALLDIVN8
JCDIVN5
LCALLADDN
CLRC
DIVN5:
MOVA,R5
MOVR0,A
LCALLRLCN
DJNZR3,DIVN4
LCALLDIVN8
JNCDIVN6
MOVA,R5
MOVR0,A
LCALLINCN
DIVN6:
MOVA,R1
PUSHACC
MOVA,R7
MOVR2,A
ADDA,R4
MOVR0,A
ADDA,R7
MOVR1,A
DIVN7:
DECR0
DECR1
MOVA,@R1
MOV@R0,A
DJNZR2,DIVN7
POPACC
MOVR1,A
CLROV
RET
;
DIVN8:
MOVA,R4
MOVR0,A
CLRC
LCALLRLCN
MOV2FH.4,C
LCALLSUBN
ANLC,/2FH.4
CPLC
RET
;
DIV0:
MOVA,R7
MOVR2,A
ADDA,R1
MOVR1,A
MOVA,R7
ADDA,R0
MOVR0,A
CLRC
DIV01:
DECR0
DECR1
MOVA,@R0
SUBBA,@R1
DJNZR2,DIV01
RET
;
ADDN:
MOVA,R7
MOVR2,A
ADDA,R0
MOVR0,A
MOVA,R7
ADDA,R1
MOVR1,A
CLRC
ADN1:
DECR0
DECR1
MOVA,@R1
ADDCA,@R0
MOV@R0,A
DJNZR2,ADN1
RET
;
INCN:
MOVA,R7
INCN1:
MOVR2,A
ADDA,R0
MOVR0,A
SETBC
INCN2:
DECR0
CLRA
ADDCA,@R0
MOV@R0,A
DJNZR2,INCN2
RET
;
RLCN:
MOVA,R7
RLCN1:
MOVR2,A
PUSHPSW
ADDA,R0
MOVR0,A
POPPSW
RLCN2:
DECR0
MOVA,@R0
RLCA
MOV@R0,A
DJNZR2,RLCN2
RET
;
SUBN:
MOVA,R7
MOVR2,A
ADDA,R0
MOVR0,A
MOVA,R7
ADDA,R1
MOVR1,A
CLRC
SUB1:
DECR0
DECR1
MOVA,@R0
SUBBA,@R1
MOV@R0,A
DJNZR2,SUB1
RET