******************************************************************
1. 操作數(shù)在寄存器中,R0--R7
2. 操作數(shù)在內RAM中
3. 操作數(shù)在外RAM中
不過都大同小異,以2例,是個乘法子程序。
入口:乘數(shù)R0,被乘數(shù)R1,字節(jié)數(shù)R7,結果在R0
MULN: LCALL N2N ;多字節(jié)十六進制乘法
RLC A
RLC A
MOV R3,A
MULN1: MOV A,R5
MOV R0,A
CLR C
LCALL RLCN
JNC MULN2
LCALL ADDN
MULN2: DJNZ R3,MULN1
N1N: MOV A,R1
ADD A,R7
MOV R0,A
MOV A,R7
CLR C
RRC A
MOV R7,A
MOV R2,A
ADD A,R1
MOV R1,A
MULN3: DEC R0
DEC R1
MOV A,@R0
MOV @R1,A
DJNZ R2,MULN3
MOV A,R5
MOV R0,A
RET
;
RLCN: MOV A,R7 ;多字節(jié)二進制無符號數(shù)左移一位
RLCN1: MOV R2,A
PUSH PSW
ADD A,R0
MOV R0,A
POP PSW
RLCN2: DEC R0
MOV A,@R0
RLC A
MOV @R0,A
DJNZ R2,RLCN2
RET
;
N2N: MOV A,R7
MOV R2,A
ADD A,R0
MOV R6,A
MOV A,R0
MOV R5,A
MOV A,R1
MOV R4,A
ADD A,R7
MOV R0,A
N2N1: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,N2N1
MOV A,R6
MOV R0,A
LCALL CLRN
MOV A,R4
MOV R0,A
LCALL CLRN
MOV A,R4
MOV R1,A
MOV A,R5
MOV R0,A
MOV A,R7
ADD A,R7
MOV R7,A
RET
;
ADDN: MOV A,R7
MOV R2,A
ADD A,R0
MOV R0,A
MOV A,R7
ADD A,R1
MOV R1,A
CLR C
ADN1: DEC R0
DEC R1
MOV A,@R1
ADDC A,@R0
MOV @R0,A
DJNZ R2,ADN1
RET
;
CLRN: MOV A,R7
MOV R2,A
ADD A,R0
MOV R0,A
CLR A
CLRN1: DEC R0
MOV @R0,A
DJNZ R2,CLRN1
RET
比如你要把12345678H這個十六進制數(shù)乘以87654321H,那么你可以這樣調用:
MOV R0,#30H ;被乘數(shù)區(qū)
MOV R1,#40H ;乘數(shù)區(qū)
MOV R7,#04H ;字節(jié)數(shù)
MOV 30H,#12H ;填充被乘數(shù)
MOV 31H,#34H
MOV 32H,#56H
MOV 33H,#78H
MOV 40H,#87H ;填充乘數(shù)
MOV 41H,#65H
MOV 42H,#43H
MOV 43H,#21H
CALL MULN ;調用
這時的結果在R0所指的數(shù)據(jù)區(qū),即30H-37H共八個字節(jié)。當然你是3字節(jié)乘法的話,把R7改成03H就可以了,
結果為6個字節(jié),高字節(jié)在前,低字節(jié)在后。一定要注意把R0所指的區(qū)留出存放結果的空間。比如3字節(jié)乘
法,你要留出6個字節(jié)空間,5字節(jié)乘法要留出10個字節(jié)的空間。反正很靈活的。想做多少字節(jié)乘法都可以
。
這是除法子程序,入口、字節(jié)數(shù)、出口和乘法一樣,不過有個限制:只限于被除數(shù)小于除數(shù),結果為純小
數(shù)。不知老兄是否適用。
DIVN: LCALL DIV0 ;多字節(jié)16進制除法子程序
JC DIVN1
SETB OV
RET
DIVN1: MOV A, R0
MOV R4, A
ADD A, R7
MOV R5, A
MOV A, R7
MOV B, #08H
MUL AB
MOV R3, A
DIVN4: LCALL DIVN8
JC DIVN5
LCALL ADDN
CLR C
DIVN5: MOV A, R5
MOV R0, A
LCALL RLCN
DJNZ R3,DIVN4
LCALL DIVN8
JNC DIVN6
MOV A, R5
MOV R0, A
LCALL INCN
DIVN6: MOV A, R1
PUSH ACC
MOV A, R7
MOV R2, A
ADD A, R4
MOV R0, A
ADD A, R7
MOV R1, A
DIVN7: DEC R0
DEC R1
MOV A, @R1
MOV @R0, A
DJNZ R2,DIVN7
POP ACC
MOV R1, A
CLR OV
RET
;
DIVN8: MOV A,R4
MOV R0,A
CLR C
LCALL RLCN
MOV 2FH.4,C
LCALL SUBN
ANL C,/2FH.4
CPL C
RET
;
DIV0: MOV A,R7
MOV R2,A
ADD A,R1
MOV R1,A
MOV A,R7
ADD A,R0
MOV R0,A
CLR C
DIV01: DEC R0
DEC R1
MOV A,@R0
SUBB A,@R1
DJNZ R2,DIV01
RET
;
ADDN: MOV A,R7
MOV R2,A
ADD A,R0
MOV R0,A
MOV A,R7
ADD A,R1
MOV R1,A
CLR C
ADN1: DEC R0
DEC R1
MOV A,@R1
ADDC A,@R0
MOV @R0,A
DJNZ R2,ADN1
RET
;
INCN: MOV A,R7
INCN1: MOV R2,A
ADD A,R0
MOV R0,A
SETB C
INCN2: DEC R0
CLR A
ADDC A,@R0
MOV @R0,A
DJNZ R2,INCN2
RET
;
RLCN: MOV A,R7
RLCN1: MOV R2,A
PUSH PSW
ADD A,R0
MOV R0,A
POP PSW
RLCN2: DEC R0
MOV A,@R0
RLC A
MOV @R0,A
DJNZ R2,RLCN2
RET
;
SUBN: MOV A,R7
MOV R2,A
ADD A,R0
MOV R0,A
MOV A,R7
ADD A,R1
MOV R1,A
CLR C
SUB1: DEC R0
DEC R1
MOV A,@R0
SUBB A,@R1
MOV @R0,A
DJNZ R2,SUB1
RET
******************************************************************