⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mutdiv.asm.svn-base

📁 keilC底层软件,能够结合硬件产生加解密密文,具有安全保护功能.
💻 SVN-BASE
📖 第 1 页 / 共 4 页
字号:
;	PUSH	ACC
;SavingCalc10:
;	MOV		A,@R0
;	RLC		A
;	MOV		@R0,A
;	INC		R0
;	DJNZ	R3,SavingCalc10
;	POP		ACC
;	MOV		R0,A
;	DJNZ	R2,SavingCalc05	;2000000*171*4 (先计税后值 *0.8 = *4/5) RESULT +11 ~ +18
;	
;	MOV		A,R4
;	ADD		A,#19
;	MOV		R0,A
;	MOV		R1,A
;
;	PUSH	ACC				;PROTECT +19
;	MOV		A,#8
;	LCALL	CalClear	;CLEAR +19 ~ +26  将用于存储 除数.(500)
;	MOV		A,#0xF4
;	MOV		@R1,A
;	INC		R1
;	MOV		A,#0x01
;	MOV		@R1,A			;fill with 除数 500
;	POP		ACC				;RESTORE +19
;	
;	MOV		R5,A			;DEST   R5=+19 ~ +26
;	SUBB	A,#8
;	MOV		R7,A			;SOURCE R7=+11 ~ +18
;	MOV		R3,#8
;	LCALL	_NDIV			;2000000*171/100*4/5  RESULT +3 ~ +10
;							;除的商绝对小于或等于 4 BYTES,故只需截取底 4 BYTES。(+0 ~ +3)
;	
;	MOV		A,R4
;	ADD		A,#7
;	MOV		R0,A
;	MOV		R1,A
;	MOV		A,#20
;	LCALL	CalClear	;CLEAR WORKING RAM +7 ~ +26 (TOTAL 20 BYTES)
;	
	MOV		A,R4
	MOV		R0,A
	MOV		A,@R0
	JNZ		SavingCalc25
;如果为活期:
SavingCalc20:
	MOV		A,R4
	INC		A
	MOV		R0,A			;天数 +1,+2
	ADD		A,#16
	MOV		R1,A			;+17,+18 (覆盖乘积2000000*171 RESULT +11 ~ +18 的高 2bytes)
	MOV		A,@R0
	MOV		@R1,A
	INC		R0
	INC		R1
	MOV		A,@R0
	MOV		@R1,A			;将天数存入乘数区 (2 BYTES)

	MOV		A,R4
	MOV		R5,A
	ADD		A,#11
	MOV		R7,A
	MOV		R3,#8
	LCALL	_MBIN_MOV		;COPY +11~+18 TO +0~+7

	MOV		A,R4
	ADD		A,#8
	MOV		R0,A
	MOV		A,#4
	LCALL	CalClear	;CLEAR +19 ~ +22 (乘数区 HIGH 4 BYTES)

	MOV		A,R4
	MOV		R7,A			;SOURCE R7= +0~+5
	ADD		A,#6
	MOV		R5,A			;DEST R5= +6~+11
	MOV		R3,#6
	LCALL	_NMUL			;2000000*171*DAYS RESULT +12 ~ +23(实际最大只用+12~+19 8 bytes)

	MOV		A,R4
	MOV		R0,A
	MOV		A,#12
	LCALL	CalClear	;CLEAR +0 ~ +11 (12 BYTES将用于存储商数.实际只用 +4 ~ +11)

	MOV		A,R4
	ADD		A,#20
	MOV		R0,A
	MOV		R1,A
	MOV		A,#8
	LCALL	CalClear	;CLEAR +20 ~ +27 (8 BYTES将用于存储除数.)

	MOV		A,#0x44
	MOV		@R1,A
	INC		R1
	MOV		A,#0x9E
	MOV		@R1,A
	INC		R1
	MOV		A,#0x45
	MOV		@R1,A			;存入除数 365*10000*5/4=4562500
	DEC		R1
	DEC		R1
	MOV		A,R1
	MOV		R5,A			;DEST R5 = +19 ~ +26
	SUBB	A,#8
	MOV		R7,A			;SOURCE R7 = +11 ~ +18
	MOV		R3,#8
	LCALL	_NDIV			;2000000*171*DAYS/365/10000/5*4  RESULT +3 ~ +10

SavingCalc22:
	MOV		A,R4
	MOV		R5,A			;DEST R5 = +0 ~ +7
	ADD		A,#4
	MOV		R7,A			;SOURCE R7 = +4 ~ +11
	MOV		R3,#8
	LCALL	_MBIN_MOV		;COPY +4 ~ +11 TO +0 ~ +7

	RET

SavingCalc25:
	CJNE	A,#1,SavingCalc40
;如果为定期 3月或者6月:
SavingCalc30:						;3 months
	MOV		A,R4
	INC		A
	MOV		R0,A			;月数 +1,+2
	ADD		A,#16
	MOV		R1,A			;+17,+18 (覆盖乘积2000000*171 RESULT +11 ~ +18 的高 2bytes)
	MOV		A,@R0
	MOV		@R1,A
	INC		R0
	INC		R1
	MOV		A,@R0
	MOV		@R1,A			;将月数存入乘数区 (2 BYTES)

	MOV		A,R4
	MOV		R5,A
	ADD		A,#11
	MOV		R7,A
	MOV		R3,#8
	LCALL	_MBIN_MOV		;COPY +11~+18 TO +0~+7

	MOV		A,R4
	ADD		A,#8
	MOV		R0,A
	MOV		A,#4
	LCALL	CalClear	;CLEAR +19 ~ +22 (乘数区 HIGH 4 BYTES)

	MOV		A,R4
	MOV		R7,A			;SOURCE R7= +0~+5
	ADD		A,#6
	MOV		R5,A			;DEST R5= +6~+11
	MOV		R3,#6
	LCALL	_NMUL			;2000000*171*DAYS RESULT +12 ~ +23(实际最大只用+12~+19 8 bytes)

	MOV		A,R4
	MOV		R0,A
	MOV		A,#12
	LCALL	CalClear	;CLEAR +0 ~ +11 (12 BYTES将用于存储商数.实际只用 +4 ~ +11)

	MOV		A,R4
	ADD		A,#20
	MOV		R0,A
	MOV		R1,A
	MOV		A,#8
	LCALL	CalClear	;CLEAR +20 ~ +27 (8 BYTES将用于存储除数.)

	MOV		A,#0xF0
	MOV		@R1,A
	INC		R1
	MOV		A,#0x49
	MOV		@R1,A
	INC		R1
	MOV		A,#0x02
	MOV		@R1,A			;存入除数 12*10000*5/4=150000
	DEC		R1
	DEC		R1
	MOV		A,R1
	MOV		R5,A			;DEST R5 = +19 ~ +26
	SUBB	A,#8
	MOV		R7,A			;SOURCE R7 = +11 ~ +18
	MOV		R3,#8
	LCALL	_NDIV			;2000000*171*MONTHS/12/10000/5*4  RESULT +3 ~ +10
	LJMP	SavingCalc22	;移商数到指针头



SavingCalc40:
	CJNE	A,#2,SavingCalc45
	LJMP	SavingCalc30			;6 months
SavingCalc45:
	CJNE	A,#3,SavingCalc50
	LJMP	SavingCalc80			;1 year
SavingCalc50:
	CJNE	A,#4,SavingCalc55
	LJMP	SavingCalc80			;2 year
SavingCalc55:
	CJNE	A,#5,SavingCalc60
	LJMP	SavingCalc80			;3 year
SavingCalc60:
	CJNE	A,#6,SavingCalc65
	LJMP	SavingCalc80			;5 year
SavingCalc65:
	MOV		A,R4
	MOV		R0,A
	CLR		A
	MOV		@R0,A
	INC		R0
	MOV		@R0,A
	INC		R0
	MOV		@R0,A
	INC		R0
	MOV		@R0,A			;RETURN 4 BYTES "00"
	RET

	
;如果为定期 1,2,3,5 年:
SavingCalc80:
	MOV		A,R4
	INC		A
	MOV		R0,A			;年数 +1,+2
	ADD		A,#16
	MOV		R1,A			;+17,+18 (覆盖乘积2000000*171 RESULT +11 ~ +18 的高 2bytes)
	MOV		A,@R0
	MOV		@R1,A
	INC		R0
	INC		R1
	MOV		A,@R0
	MOV		@R1,A			;将年数存入乘数区 (2 BYTES)

	MOV		A,R4
	MOV		R5,A
	ADD		A,#11
	MOV		R7,A
	MOV		R3,#8
	LCALL	_MBIN_MOV		;COPY +11~+18 TO +0~+7

	MOV		A,R4
	ADD		A,#8
	MOV		R0,A
	MOV		A,#4
	LCALL	CalClear	;CLEAR +19 ~ +22 (乘数区 HIGH 4 BYTES)

	MOV		A,R4
	MOV		R7,A			;SOURCE R7= +0~+5
	ADD		A,#6
	MOV		R5,A			;DEST R5= +6~+11
	MOV		R3,#6
	LCALL	_NMUL			;2000000*171*DAYS RESULT +12 ~ +23(实际最大只用+12~+19 8 bytes)

	MOV		A,R4
	MOV		R0,A
	MOV		A,#12
	LCALL	CalClear	;CLEAR +0 ~ +11 (12 BYTES将用于存储商数.实际只用 +4 ~ +11)

	MOV		A,R4
	ADD		A,#20
	MOV		R0,A
	MOV		R1,A
	MOV		A,#8
	LCALL	CalClear	;CLEAR +20 ~ +27 (8 BYTES将用于存储除数.)

	MOV		A,#0xD4
	MOV		@R1,A
	INC		R1
	MOV		A,#0x30
	MOV		@R1,A			;存入除数 10000*5/4=12500
	DEC		R1
	MOV		A,R1
	MOV		R5,A			;DEST R5 = +19 ~ +26
	SUBB	A,#8
	MOV		R7,A			;SOURCE R7 = +11 ~ +18
	MOV		R3,#8
	LCALL	_NDIV			;2000000*171*YEARS/10000/5*4  RESULT +3 ~ +10
	LJMP	SavingCalc22	;移商数到指针头

;---------------------
;JUDGE THE INPUT DATA 
;INPUT, OUTPUT : NO
;MAY BE CHANGE +1,+2
;---------------------
DATAJUDGE:
	MOV		A,R4
	MOV		R0,A
	MOV		A,@R0
	INC		R0					;ONLY JUDGE TIME(LOW)
	JZ		DATAJU100			;储种为活期不加判断
	CJNE	A,#1,DATAJU010
	MOV		A,@R0				; 定期 3 个月
	CLR		C
	SUBB	A,#3
	JNC		DATAJU100			;>= 3 MONTHS
	SJMP	DATAJU080
DATAJU010:
	CJNE	A,#2,DATAJU020
	MOV		A,@R0				; 定期 6 个月
	CLR		C
	SUBB	A,#6
	JNC		DATAJU100			;>= 6 MONTHS
	SJMP	DATAJU080
DATAJU020:
	CJNE	A,#4,DATAJU030
	MOV		A,@R0				; 定期 2 年
	CLR		C
	SUBB	A,#2
	JNC		DATAJU100			;>= 2 YEARS
	SJMP	DATAJU080
DATAJU030:
	CJNE	A,#5,DATAJU040
	MOV		A,@R0				; 定期 3 年
	CLR		C
	SUBB	A,#3
	JNC		DATAJU100			;>= 3 YEARS
	SJMP	DATAJU080
DATAJU040:
	CJNE	A,#6,DATAJU100
	MOV		A,@R0				; 定期 5 年
	CLR		C
	SUBB	A,#5
	JNC		DATAJU100			;>= 5 YEARS
DATAJU080:
	INC		R0
	MOV		A,@R0				;继续判断数据高位是否为零。
	JNZ		DATAJU100
	DEC		R0
	CLR		A
	MOV		@R0,A				;数据高,低位均清零。
DATAJU100:
	RET


;========================================================================;
;MBIN_MOV(uchar SourceAdd1,uchar SourceAdd2,uchar Length3)
;-------------------------------;
;Description:   多字节移位
;	IN:	
;		R7==源地址,数据存放格式为先低后高
;		R5==目的地址,数据存放格式为先低后高
;		R3==Length
;	OUT:	NO
;-------------------------------;
_MBIN_MOV:
	MOV		A,R7
	MOV		R0,A
	MOV		A,R5
	MOV		R1,A
MBIN_MOV10:
	MOV		A,@R0
	MOV		@R1,A
	INC		R0
	INC		R1
	DJNZ	R3,MBIN_MOV10
	RET

;-----------------------------
;计算反码 
; IN: R0 --> 入口地址指针 
;	  R1 --> 长度
; OUT: NO
;-----------------------------
BuCode:
	MOV		A,@R0
	XRL		A,#0xFF
	MOV		@R0,A
	INC		R0
	DJNZ	R1,BuCode
	RET

;-----------------------------
;	 计算字串加一
; IN: R0 --> 入口地址指针 
;	  R1 --> 长度(MUST >=2)
; OUT:  Cy=1 OVER; ELSE Cy=0
;-----------------------------
_MBIN_AONE:
	DEC	R1
	MOV		A,@R0
	ADD	A,#1
	MOV		@R0,A
MBIN_AONE20:
	INC		R0
	MOV		A,@R0
	ADDC	A,#0
	MOV		@R0,A
	DJNZ	R1,MBIN_AONE20
	RET

;========================================================================;
;bit _BCDADD(uchar SourceAdd1,uchar SourceAdd2,uchar Length3)
;-------------------------------;
;Description:   多字节BCD码加法
;	IN:	
;		R7==加数起始地址
;		R5==被加数起始地址
;		R3==Length
;	OUT:	
;		和在SourceAdd1指向的缓冲区中,最高位进位在CY中
;	USE:	PSW、A、R2    堆栈需求:  2字节
;-------------------------------;
_BCDADD:
	mov	a,r7
	mov	r0,a
	mov	a,r5
	mov	r1,a
	MOV	A,R3				;取字节数至R2中
	MOV	R2,A
	ADD	A,R0				;初始化数据指针
	MOV	R0,A
	MOV	A,R2
	ADD	A,R1
	MOV	R1,A
	CLR	C
BCD1:	
	DEC	R0				;调整数据指针
	DEC	R1
	MOV	A,@R0
	ADDC	A,@R1				;按字节相加
	DA	A				;十进制调整
	MOV	@R0,A				;和存回[R0]中
	DJNZ	R2,BCD1				;处理完所有字节?
	RET




;========================================================================;
;uchar BIN_BCD(uchar SourceAdd,uchar DestAdd,uchar length)
;-------------------------------;
;Description:   converte BIN to BCD format
;	IN:	
;		R7==BIN buffer address,存放顺序为先低后高
;		R5==BCD buffer address,存放顺序为先低后高
;		R3==converte length
;	OUT:	No
;		R7==BCD 长度
;	USE:	A,B,DPTR,R0,R2,R3,R5,R6,R7
;-------------------------------;
BIN_BCD_Pro:
	mov	a,r5
	mov 	r0,a     				;clear target area
	mov	a,r3
	mov	r6,a
	lcall	CalClear
	mov	a,r3
	mov	b,#8
	mul	ab
	mov	r2,a					;bin lenght
bin_bcd13:      
	mov	a,r7
	mov     r0,a
	mov	b,r3
	clr     c
bin_bcd11:      
	mov     a,@r0
	rlc     a
	mov     @r0,a
	inc     r0
	djnz    b,bin_bcd11
	mov	b,r6
	mov	a,r5
	mov	r0,a
bin_bcd12:      
	mov     a,@r0
	addc    a,@r0
	da      a
	mov     @r0,a
	inc     r0
	djnz    b,bin_bcd12
	jnc	bin_bcd131
	mov	@r0,#00h
	inc	r6
	inc	b
	ljmp	bin_bcd12	
bin_bcd131:
	djnz    r2,bin_bcd13
	mov	a,r6
	mov	r7,a
	ret
;========================================================================;
;uchar BCD_BIN(uchar SourceAdd,uchar DestAdd,uchar length)
;-------------------------------;
;Description:   converte BCD to BIN
;	IN:	
;		R7==BCD buffer address,存放格式为先低后高
;		R5==BIN buffer address,存放格式为先低后高,指针指向低字节(out)
;		R3==converte length
;	OUT:	
;	USE:	
;-------------------------------;
BCD_BIN_Pro:
	mov	a,r7
	mov	r0,a					;pointer
	add	a,r3
	dec	a
	mov	r1,a					;交换高低字节
	mov	a,r3
	clr	c
	rrc	a					;/2
	mov	r6,a
ExchangeDataLoop:
	xch	a,@r0
	xch	a,@r1
	xch	a,@r0
	inc	r0
	dec	r1
	djnz	r6,ExchangeDataLoop

	mov	a,r5
	mov	r0,a					;clear BIN buffer
	mov	a,r3					;length
	lcall	CalClear
	mov	a,r7
	mov	r0,a					;BCD buffer pointer
	mov	a,r3					;length
	mov	r4,a
BCD_BIN_Calcul:
	lcall	Mul10
	mov	a,@r0
	swap	a
	anl	a,#0fh
	lcall	AddSum
	lcall	Mul10
	mov	a,@r0
	anl	a,#0fh
	lcall	AddSum
	inc	r0
	djnz	r4,BCD_BIN_Calcul
	ret

;========================================================================;
;Description:   缓冲区清零处理,*SourceAdd为缓冲区首址,Length为清零的长度
;	IN:	
;		R0==缓冲区首址
;		A ==Length
;	OUT:	No
;	USE:	R0,A,destroyed register B
;-------------------------------;
CalClear:
	mov	@r0,#00h
	inc	r0
	dec	a
	jnz	CalClear
	RET
;------------------------------------------------------------------------;
Mul10:
	mov	a,r3				;length
	mov	r6,a
	mov	a,r5				;dest
	mov	r1,a
	mov	r2,#00h
	clr	c
Mul10_Loop:
	mov	a,@r1
	mov	b,#10
	push	psw
	mul	ab
	pop	psw
	addc	a,r2
	mov	@r1,a
	mov	r2,b
	inc	r1
	djnz	r6,Mul10_Loop
	ret
;------------------------------------------------------------------------;
AddSum:
	mov	b,r5
	mov	r1,b				;dest
	mov	b,r3
	add	a,@r1
	mov	@r1,a
	djnz	b,AddSumLoop
	ljmp	AddSumExit
AddSumLoop:
	inc	r1
	mov	a,@r1
	addc	a,#00h
	mov	@r1,a
	djnz	b,AddSumLoop
AddSumExit:
	ret
	
	
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -