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

📄 mutdiv.asm.svn-base

📁 keilC底层软件,能够结合硬件产生加解密密文,具有安全保护功能.
💻 SVN-BASE
📖 第 1 页 / 共 4 页
字号:
		SUBB	A,@R1
		MOV		@R0,A
		INC		R0
		INC		R1
		DJNZ	R3,DEC1TIME10
		POP		ACC
		MOV		R3,A
		RET

;--------------------------------
;  被除数加除数一次,结果送回被除数
;	LENGTH = R3
;	IN :NO
;	OUT: NO
;--------------------------------
ADD1TIME:
		MOV		A,R3
		PUSH	ACC
		MOV		A,R7
		MOV		R0,A		;被除数最高位
		MOV		A,R5
		MOV		R1,A		;除数最低位
		CLR		C
ADD1TIME10:
		MOV		A,@R0
		ADDC	A,@R1
		MOV		@R0,A
		INC		R0
		INC		R1
		DJNZ	R3,ADD1TIME10
		POP		ACC
		MOV		R3,A
		RET


;===================================	
;===================================	
;===================================	
;===================================	
;-------------------------------;
;Description:   多字节 BIN 码乘法
;	IN:	
;		R7==被乘数起始地址(LOW)
;		R5==乘数起始地址(LOW)
;		R3==Length==为使程序简化,令 1<=R3<=32 BYTES
;		且令被乘数与乘数等长,不足位在高位补零.
;		这样总共最大移位 32*8=256,可用一个寄存器R2来控制
;	OUT:	
;		?==临时乘积起始地址(LOW) LEN=2*R3
;		?==最后的乘积起始地址(LOW) LEN=2*R3
;		最高位进位在CY中
;-------------------------------;
_NMUL:
	LCALL 	CLEAR_LSCJ		; 清中间积
	LCALL 	CLEAR_CJ		; 清乘积
	MOV		A,R3
	RL		A
	RL		A
	RL		A				; 假定R3<=16
	MOV		R2,A			; R2=总共最大移位BIT 数
	MOV		B,#0
NMUL_10:
	LCALL 	CS_RR1			; 乘数右移 1 BIT
	JNC 	NMUL_CY0
NMUL_CY1:
	MOV		A,R2
	PUSH	ACC
	LCALL 	CLEAR_LSCJ		; 清中间积
	LCALL 	BCSCOPY			; 被乘数COPY到中间积
	LCALL 	LSCJ_RLB		; 中间积左移B位
	LCALL 	LSCJJZJ			; 中间积加到终积
	POP		ACC
	MOV		R2,A
NMUL_CY0:
	INC B
	DJNZ R2,NMUL_10
	RET
;--------------------------
;将乘数R5右移 1 BIT, 保存于C
;R3,R5 不该变
;R0,A 该变
;--------------------------
CS_RR1:
	MOV A,R3
	PUSH ACC
	CLR	C
	MOV A,R5
	ADDC A,R3		;GET THE MAX ADDR POINTER 此处地址在选择时,务必保证不溢出.
	MOV	R0,A
	CLR C
CS_RRLOOP:
	DEC	R0
	MOV A,@R0
	RRC A
	MOV	@R0,A
	DJNZ R3,CS_RRLOOP	;R3 为移位的 BYTE 数
	POP ACC
	MOV R3,A
	RET

;----------------------------------
;将临时乘积左移 B BITS, C不保存,低位补0
;R3,R4,B 不该变
;R0,A 该变
;----------------------------------
LSCJ_RLB:
	MOV		A,B
	PUSH 	ACC
	JZ 		LSCJ_RLBEND
	CLR 	C
LSCJ_RLBLOOP:
	LCALL 	LSCJ_RL1
	DJNZ 	B,LSCJ_RLBLOOP
LSCJ_RLBEND:
	POP 	ACC
	MOV 	B,A
	RET
;----------------------------------
;将临时乘积 左移 1 BIT, C保存,低位补0
;R3 不该变
;R0,R2 该变
;----------------------------------
LSCJ_RL1:
	MOV 	A,R3
	MOV		R2,A		;PROTECT R3
	CLR		C
	RL		A
	RL		A
	ADDC	A,R7		;R7+R3*4=临时乘积BEGIN
	MOV		R0,A
	MOV 	A,R3
	RL 		A
	MOV 	R3,A		;乘积长度=两倍的被乘数长度
LSCJ_RLLOOP:
	MOV 	A,@R0
	RLC 	A
	MOV		@R0,A
	INC		R0
	DJNZ 	R3,LSCJ_RLLOOP	;R3 为移位的 BYTE 数
	MOV		A,R2		;RESTORE R3
	MOV 	R3,A
	RET

;=======================================;
;Description:   将被乘数 COPY 到 临时乘积
;	IN:	 NO
;	OUT: NO
;	R0,R1,R2 该变
;---------------------------------------;
BCSCOPY:
	MOV 	A,R3
	MOV		R2,A			;PROTECT R3
	MOV		A,R7
	MOV 	R0,A			;SOURCE
	CLR		C
	MOV		A,R3
	RL		A
	RL		A
	ADDC	A,R7			;R7+R3*4=临时乘积BEGIN
	MOV		R1,A			;DEST
BCSCOPY_LOOP:
	MOV		A,@R0
	MOV		@R1,A
	INC 	R0
	INC 	R1
	DJNZ R3,BCSCOPY_LOOP	;LENGTH
	MOV		A,R2
	MOV 	R3,A			;RESTORE R3
BCSCOPY80:
	CLR		A
	MOV		@R1,A
	INC		R1
	DJNZ 	R3,BCSCOPY80
	MOV		A,R2
	MOV 	R3,A			;RESTORE R3

	RET

;-------------------------------;
;	乘积清零
;-------------------------------;
CLEAR_CJ:
	CLR		C
	MOV		A,R3
	RL		A
	ADDC	A,R7		;R7+R3*2=乘积 BEGIN
	MOV		R0,A
	MOV		A,R3
	RL 		A
	LCALL CalClear
	RET
;-------------------------------;
;	临时乘积清零
;-------------------------------;
CLEAR_LSCJ:
	CLR		C
	MOV		A,R3
	RL		A
	RL		A
	ADDC	A,R7		;R7+R3*4=临时乘积BEGIN
	MOV		R0,A
	MOV		A,R3
	RL 		A
	LCALL CalClear
	RET


;=======================================;
;Description:   将临时乘积加到终积处
;	IN:	 NO
;	OUT: C 和的益出标志
;	R3,R7 不该变
;	R0,R1,A 该变
;---------------------------------------;
LSCJJZJ:
	MOV 	A,R3
	PUSH 	ACC

	CLR		C
	MOV		A,R3
	RL		A
	ADDC	A,R7		;R7+R3*2=乘积 BEGIN
	MOV		R1,A		;DEST	

	MOV		A,R3
	RL		A
	ADDC	A,R1		;R1+R3*2=临时乘积 BEGIN
	MOV 	R0,A		;SOURCE

	MOV		A,R3
	RL 		A
	MOV 	R3,A		;R3=R3*2 累加积的BYTE数
	CLR 	C
LSCJJZJ_LOOP:
	MOV		A,@R0
	ADDC 	A,@R1
	MOV		@R1,A
	INC 	R0
	INC 	R1
	DJNZ 	R3,LSCJJZJ_LOOP	;LENGTH

	POP 	ACC
	MOV 	R3,A
	RET

;===================================	
;===================================	
;===================================	
;===================================	
;-------------------------------;
;Description:   多字节 BIN 码加法
;	IN:	
;		R7==加数起始地址(LOW)
;		R5==被加数起始地址(LOW)
;		R3==Length
;	OUT:	
;		和在SourceAdd1指向的缓冲区中,最高位进位在CY中
;	USE:	PSW、A、R2    堆栈需求:  2字节
;-------------------------------;
_MBIN_ADD:
	MOV	A,R7
	MOV	R0,A
	MOV	A,R5
	MOV	R1,A
	CLR	C
MBIN_A10:	
	MOV	A,@R0
	ADDC	A,@R1			;按字节相加
	MOV	@R0,A				;和存回[R0]中
	INC	R0					;调整数据指针
	INC	R1
	DJNZ	R3,MBIN_A10		;处理完所有字节?
	RET
;========================================================================;
;bit BCD_Sub(uchar SourceAdd1,uchar SourceAdd2,uchar Length3)
;-------------------------------;
;Description:   多字节 BIN 码加法
;	IN:	
;		R7==被减数起始地址,数据存放格式为先低后高
;		R5==减数起始地址,数据存放格式为先低后高
;		R3==Length
;	OUT:	
;		差在SourceAdd1指向的缓冲区中,最高位进位在CY中
;	PSW、A、R2、R3    堆栈需求:  6字节
;-------------------------------;
_MBIN_SUB:
	MOV	A,R7
	MOV	R0,A
	MOV	A,R5
	MOV	R1,A
	CLR	C
MBIN_S10:	
	MOV	A,@R0
	SUBB	A,@R1			;按字节相减
	MOV	@R0,A				;存回[R0]中
	INC	R0					;调整数据指针
	INC	R1
	DJNZ	R3,MBIN_S10		;处理完所有字节?
	RET

;-------------------------------------;
;Description:   多字节 BIN 码比较大小
;	IN:	
;		R7==被减数起始地址,数据存放格式为先低后高
;		R5==减数起始地址,数据存放格式为先低后高
;		R3==Length
;	OUT:	
;		CY=0 AND A=0 两串数相等
;		CY=0 AND A=FF R7串大于R5串
;		CY=1  		 R7串小于R5串
;	PSW、A、R2、R3    堆栈需求:
;-------------------------------------;
_MBIN_COMP:
	CLR	C
	MOV	A,R7
	ADDC A,R3
	MOV	R0,A				;源指针最高 BYTE
	CLR	C
	MOV	A,R5
	ADDC A,R3
	MOV	R1,A				;目标指针最高 BYTE
	CLR	C
MBIN_CP10:	
	DEC	R0					;调整数据指针
	DEC	R1
	MOV	A,@R1
	MOV	B,A				;DEST   -> B
	MOV	A,@R0				;SOURCE -> A
	CJNE	A,B,MBIN_CP30	
	DJNZ	R3,MBIN_CP10	;处理完所有字节?
	CLR		A				;R7 = R5
MBIN_CP20:	
	RET
MBIN_CP30:
	JC		MBIN_CP20		;R7 < R5
	MOV		A,#0xFF
	SJMP	MBIN_CP20		;R7 > R5


;-------------------------------------;
;Description:   多字节 BIN 码比较大小
;	IN:	
;		R7==被减数起始地址,数据存放格式为先低后高(LOW)
;		DPTR==减数起始地址,数据存放格式为先低后高(LOW)
;		R3==Length
;	OUT:	
;		CY=0 AND A=0 两串数相等
;		CY=0 AND A=FF R7串大于DPTR 串
;		CY=1  		 R7串小于DPTR 串
;	PSW、A、R2、R3    堆栈需求:
;-------------------------------------;
_MBIN_COMPX:
	CLR		C
	MOV		A,R7
	ADDC 	A,R3
	MOV		R0,A			;源指针最高 BYTE
	CLR	C
	MOV		A,R3
	MOV		R1,A			;DPTR POINTER
	MOV		A,DPL
	MOV		R2,A			;DPL PROTECT
MBIN_CPX10:	
	MOV		A,R2
	MOV		DPL,A			;DPL RESTORE
	DEC	R0					;调整数据指针
	DEC	R1

	CLR		C
	MOV		A,DPL
	ADDC	A,R1
	MOV		DPL,A
	MOV		A,DPH
	ADDC	A,#0
	MOV		DPH,A
	MOVX	A,@DPTR			;DPTR + R1

	MOV		B,A			;DEST   -> B

	MOV		A,@R0			;SOURCE -> A
	CJNE	A,B,MBIN_CPX30	
	DJNZ	R3,MBIN_CPX10	;处理完所有字节?
	CLR		A				;R7 = DPTR
MBIN_CPX20:	
	RET
MBIN_CPX30:
	JC		MBIN_CPX20		;R7 < DPTR
	MOV		A,#0xFF
	SJMP	MBIN_CPX20		;R7 > DPTR

;-------------------------------------;
;Description:   多字节 BIN 码比较大小
;  IN:  R6	TABLE POINTER
; OUT:  DPTR
;-------------------------------------;
DPTRADD:
	MOV		B,#9				;表每行 9 BYTES。(4 BYTES 等级数,4 BYTES 速算扣除数,1 BYTE 税率)
DPTRADD05:
	MOV		A,R6
	MUL		AB					; 9*9=45 故乘的结果 B=0,只用 A
	MOV		B,A
DPTRADD10:
	CLR		C
	MOV		A,DPL
	ADDC	A,B
	MOV		DPL,A
	MOV		A,DPH
	ADDC	A,#0
	MOV		DPH,A				;DPTR + B
	RET
;-------------------------------------;
;Description:   SET DPTR NO.1 ADDR
;  IN:  NO
; OUT:  DPTR
;-------------------------------------;
_SETDPTR:
	MOV		A,R4
	MOV		R0,A
	MOV		A,@R0
	JZ		SETDPTR20			;IF TAXNO=0,THEN
	MOV		DPTR,#(TEMPSTART+FLASHBEGIN)+81	;跳到第二个税表表头
	SJMP	SETDPTR30
SETDPTR20:
	MOV		DPTR,#(FLASHBEGIN+TEMPSTART)
SETDPTR30:
	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

;---------------------------------------------------------------------
;函数名:DebtCalc	@2002/4/17
;入口:yieldno  -- 收益率种类
;	  outprice  -- 卖出价格
;	    inprice  -- 买入价格
;	   baseprice -- 发行价格
;		 yearno	 --  持有年数
;		debtno  --  国债种类
;出口:yieldtop 	收益率(无百分数格式,例如:输出为1050,则其收益率为 10。5%)
;---------------------------------------------------------------------
;RAM:
;1 byte		yieldno (0: sale 1: buy 2 hold)
;1 byte		debtno	(0: 3year   1: 5year)
;1 byte		years
;4 byte 	outprice(if yield=0,2)  or inprice (if yield=1)
;4 byte 	baseprice
;


DebtCalc10:
	LJMP		DebtCalc10A

_DebtCalc:
	MOV		A,R1

;	mov		a,#2dh			;???????????

	MOV		R4,A				;为可用内 RAM 之首地址,指向 -->TAXNO

CHECKDATA:
	ADD		A,#2
	MOV		R0,A			;+2
	MOV		A,@R0
	JZ		DebtErr			;YEAR=0 ERROR
;02-5-28 20:19
	DEC		R0				;IF YEAR != 0
	MOV		A,@R0
	INC		R0
	JNZ		CHECK_DEBT05	;KIND=5 年期
CHECK_DEBT03:				;KIND=3 年期
	MOV		A,@R0
	ANL		A,#0FCH			;02-6-4 9:10
	JZ		CHECK_DEBT10	;IF YEARS <= 3
	MOV		A,#3
	MOV		@R0,A
	SJMP	CHECK_DEBT10
CHECK_DEBT05:
	MOV		A,@R0
	CJNE	A,#6,CHECK_DEBT06
CHECK_DEBT08:						;IF A=6
	MOV		A,#5
	MOV		@R0,A
	SJMP	CHECK_DEBT10
CHECK_DEBT06:
	JNC		CHECK_DEBT08			;IF A>6
CHECK_DEBT10:	
	MOV		A,R4
	ADD		A,#3
	MOV		R0,A			;DEBT PRICE
	MOV		R1,#4
CHECKPRICE:
	MOV		A,@R0			;+3
	JNZ		CHECKPR50
	INC		R0
	DJNZ	R1,CHECKPRICE
	SJMP	DebtErr			;PRICE1=0 ERROR
CHECKPR50:
	MOV		A,R4
	ADD		A,#7
	MOV		R0,A
	MOV		R1,#4
CHECKPR60:
	MOV		A,@R0			;+7
	JNZ		CHECKEND
	INC		R0
	DJNZ	R1,CHECKPR60
DebtErr:					;PRICE2=0 ERROR
	MOV		A,R4
	MOV		R0,A
	MOV		A,#8
	LCALL	CalClear	;OUTPUT ALL CLEAR "0"
	RET
CHECKEND:
	MOV		A,R4


	MOV		R0,A
	MOV		A,@R0
	CJNE	A,#0,DebtCalc10
SaleCalc:
	LCALL	_SETLILVDPTR		;FIND FLASH POINTER
	MOV		A,R4
	ADD		A,#3
	MOV		R7,A
	ADD		A,#ALL_LENTH
	MOV		R5,A
	MOV		R3,#ALL_LENTH
	LCALL	_MBIN_SUB			;减的结果为(卖出价-买入价)	;+3 ~ +7
	JNC		SaleCalc20			;减的结果为正	02-4-22 11:48
	MOV		R6,#0FEH			;减的结果为负
	MOV		A,R7
	MOV		R0,A
	MOV		R1,#4
	LCALL	BuCode				;计算反码
	MOV		A,R7
	MOV		R0,A
	MOV		R1,#4
	LCALL	_MBIN_AONE			;计算补码( = 反码 + 1)	;+3 ~ +7
SaleCalc20:
	MOV		A,R5				;R7 NO CHANGE (+3)
	ADD		A,#ALL_LENTH
	MOV		R5,A				;R5=+11
	MOV		R3,#ALL_LENTH
	LCALL	_MBIN_MOV			;COPY +3~+6 -> +11~+14
	
	MOV		A,R5
	ADD		A,#ALL_LENTH
	MOV		R0,A				;R0=+15
	MOV		R1,A
	PUSH	ACC					;+15 PROTECT
	MOV		A,#ALL_LENTH
	LCALL	CalClear		;CLEAR +15 ~ +18
	MOV		A,#10H
	MOV		@R1,A
	INC		R1
	MOV		A,#27H
	MOV		@R1,A				;乘数 = 10000 (2710H)
	POP		ACC					;+15 RESTORE
	MOV		R5,A				;乘数 		+15 ~ +18
	SUBB	A,#ALL_LENTH
	MOV		R7,A				;被乘数		+11 ~ +14
	MOV		R3,#ALL_LENTH		;LENGTH
	LCALL	_NMUL				;(卖出价-发行价)*10000   RESULT  +19 ~ +26 (ONLY USE +19 ~ +24)
	
	MOV		A,R4
	ADD		A,#11
	MOV		R0,A
	MOV		A,#8
	LCALL	CalClear		;CLEAR +11 ~ +18 存放 商数
	MOV		A,R4
	ADD		A,#27
	MOV		R0,A
	MOV		R5,A				;DEST R5=+27~+34 (8 BYTES)
	MOV		A,#8

⌨️ 快捷键说明

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