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

📄 newmath.asm.svn-base

📁 keilC底层软件,能够结合硬件产生加解密密文,具有安全保护功能.
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
JUDGEINT:
	clr		c
	mov		a,r3
	rrc		a
	mov		r1,a			;r1=0.5*(乘数长度)
	add		a,r3
	mov		r0,a			;r0=1.5*(乘数长度)
JUDGEI_10:
	mov		dptr,#(TEMPSTART+BCDBIN2)
	clr		c				;-------- dptr + r0 -------
	mov		a,dpl
	add		a,r0
	mov		dpl,a
	mov		a,dph
	addc	a,#0
	mov		dph,a			;-------- dptr + r0 -------
	setb	c
JUDGEIN_10:
	movx	a,@dptr
	jnz		JUDGEIN_30
	inc		dptr
	djnz	r1,JUDGEIN_10
	clr		c
JUDGEIN_30:
	ret


;**********************************************
;函数说明: 将传入的两串操作数BCD码转换为BIN码后分别
;		  拷贝到第一操作数区和第二操作数区
;
;**********************************************
CHANGECOPY:
	mov		r3,#LENTH
	mov		r7,#LOW(TEMPSTART+BCDD1BUF)
	mov		r6,#HIGH(TEMPSTART+BCDD1BUF)
	mov		r5,#LOW(TEMPSTART+BCDBIN1)
	mov		r4,#HIGH(TEMPSTART+BCDBIN1)
	lcall	StrCopy				
	lcall	XBCD_BIN			;取第一操作数送到临时区转换为BIN
	mov		r7,#LOW(TEMPSTART+BCDBIN2)
	mov		r6,#HIGH(TEMPSTART+BCDBIN2)
	mov		r5,#LOW(TEMPSTART+BIND1BUF)
	mov		r4,#HIGH(TEMPSTART+BIND1BUF)
	lcall	StrCopy				;送到第一操作数区

	mov		r7,#LOW(TEMPSTART+BCDD2BUF)
	mov		r6,#HIGH(TEMPSTART+BCDD2BUF)
	mov		r5,#LOW(TEMPSTART+BCDBIN1)
	mov		r4,#HIGH(TEMPSTART+BCDBIN1)
	lcall	StrCopy				
	lcall	XBCD_BIN			;取第二操作数送到临时区转换为BIN

	mov		r7,#LOW(TEMPSTART+BCDBIN2)
	mov		r6,#HIGH(TEMPSTART+BCDBIN2)
	mov		r5,#LOW(TEMPSTART+BIND2BUF)
	mov		r4,#HIGH(TEMPSTART+BIND2BUF)
	lcall	StrCopy				;送到第二操作数区
	ret

;*********************************
; 取结果送到临时区转换为BCD
; 并与极大值相比较
;  IN : R3 -> 字符串长度
; OUT :	R7=0(等) R7=1(小) R7=2(大)
;KEEP : R3
;*********************************
COMPTOMAX:
	mov		r7,#LOW(TEMPSTART+BIND1BUF)
	mov		r6,#HIGH(TEMPSTART+BIND1BUF)
COMPTOM_10:
	mov		r5,#LOW(TEMPSTART+BCDBIN1)
	mov		r4,#HIGH(TEMPSTART+BCDBIN1)
	lcall	StrCopy				
	lcall	XBIN_BCD			;取结果送到临时区转换为 BCD

	mov		r7,#LOW(TEMPSTART+BCDBIN2)
	mov		r6,#HIGH(TEMPSTART+BCDBIN2)
	mov		r5,#LOW(TEMPSTART+MAXNUM)
	mov		r4,#HIGH(TEMPSTART+MAXNUM)
	lcall	XMEMCOMP			;与极大值相比较
	ret

;************************************************
; 对计算结果的处理,判断整数及小数的长度
;	 IN:	No
;	OUT: 	R1 -> 整数位数 (<=#LENTH)	
;			R0 -> 实际小数位数 (<=#LENTH)
;			B -> 需要四舍五入的标志(=0不需要,=1需要)
;************************************************
DORESULT:
	mov		r7,#LOW(TEMPSTART+BCDBIN2)
	mov		r6,#HIGH(TEMPSTART+BCDBIN2)
DORESU_10:
	mov		r5,#LOW(TEMPSTART+BCDD3BUF)
	mov		r4,#HIGH(TEMPSTART+BCDD3BUF)
	lcall	StrCopy				;将结果放入结果区域
	ret


;DORESULT:
;	mov		r7,#LOW(TEMPSTART+BCDBIN2)
;	mov		r6,#HIGH(TEMPSTART+BCDBIN2)
;DORESU_10:
;	mov		r5,#LOW(TEMPSTART+BCDD3BUF)
;	mov		r4,#HIGH(TEMPSTART+BCDD3BUF)
;	lcall	StrCopy				;将结果放入结果区域
;
;	mov		r7,#LOW(TEMPSTART+BCDD3BUF)
;	mov		r6,#HIGH(TEMPSTART+BCDD3BUF)
;
;	lcall	CALBCDLEN			;整数BCD码长R1, 小数BCD码长R0
;	lcall	ACTDOTLEN			;截取有效小数位长R0 及 是否需要四舍五入处理的标志 R2(非0)
;	ret
	
;*******************************************
;  计算整数部分的有效BCD码长度(自高位向低位数)
;  计算小数部分的有效BCD码长度(自低位向高位数)
; 	 IN: 
;			R7 -> 字符串低位指针的低位
;			R6 -> 字符串低位指针的高位
;			R3 -> 字符串的长度
; 	OUT: 
;			R1 -> 整数部分BCD码的有效长度(<=#LENTH)
;			R0 -> 小数部分BCD码的有效长度(<=#LENTH)
;CHANGE:	A,B,R0,R1,R2,Cy
;  KEEP:	R3,R4~R7
;*******************************************
CALBCDLEN:
	mov		r0,#0
	mov		r1,#0
	mov		ar5,ar7
	mov		ar4,ar6			;字符串的低位地址

	mov		a,r3
	dec		a
	add		a,r7
	mov		dpl,a
	mov		a,r6
	addc	a,#0
	mov		dph,a			;指向字符串的高位地址

	clr		c
	mov		a,r3
	rr		a
	mov		r2,a			;整数的长为全长的一半
	mov		b,a
CALBCDL10:
	movx	a,@dptr
	jnz		CALBCDL16		;找到最高有效字节
	lcall	DPTRDEC1		
	djnz	r2,CALBCDL10	;如果a=0,继续
CALBCDL16:
	clr		c
	mov		a,r2
	rl		a
	mov		r1,a			;高位BCD字节数转为码的个数(此时的r1可能会多计一个,还需进一步判断最高有效字节的高字是否为零)
	jz		CALBCDL20		;如果高位BCD全部为零,直接进入小数部分的计数

	movx	a,@dptr			;找出首个非零字节判断高字是否为零
	anl		a,#0f0h
	jnz		CALBCDL20
	dec		r1
	ljmp	CALBCDL20
CALBCDL20:					;开始小数部分
	mov		dpl,r5
	mov		dph,r4
	mov		r2,b
CALBCDL30:
	movx	a,@dptr
	jnz		CALBCDL35		;找到最低有效字节
	inc		dptr
	djnz	r2,CALBCDL30	;如果a=0,继续
CALBCDL35:
	clr		c
	mov		a,r2
	rl		a
	mov		r0,a			;低位BCD字节数转为码的个数(此时的r0可能会多计一个,还需进一步判断最低有效字节的低字是否为零)
	jz		CALBCDL100		;如果低位BCD全部为零,结束

	movx	a,@dptr			;找出首个非零字节判断低字是否为零
	anl		a,#0fh
	jnz		CALBCDL100
	dec		r0
CALBCDL100:
	ret

;******************************************************
; 计算结果的实际有效的小数位数	if(r0+r1>LENTH) r0=LENTH-r1
;
;	 IN: 	R1 -> 整数位数 (<=#LENTH)	
;			R0 -> 小数位数 (<=#LENTH)
;	OUT:	R0 -> 实际小数位数
;			B -> 需要四舍五入的标志(=0不需要,=1需要)
;CHANGE:	A,B,R0,Cy
;  KEEP:	R1
;*******************************************************
ACTDOTLEN:
	mov		b,#0
	mov		a,r0
	add		a,r1
	cjne	a,#LENTH,ACTDOTL10
	sjmp	ACTDOTL30
ACTDOTL10:
	jc		ACTDOTL30		;<=LENTH
	mov		a,#LENTH
	subb	a,r1
	mov		r0,a
	mov		b,#1			;将用于四舍五入的处理
ACTDOTL30:
	ret

;*****************************************
; 结果的小数部分末位的四舍五入的处理
; 	 IN: 
;			R0 -> 小数部分自低到高数有效的BCD码的个数
;			R7 -> 字符串低位指针的低位
;			R6 -> 字符串低位指针的高位
;			R3 -> 字符串的长度
;CHANGE:	A,B,R1,R2,R5,Cy
;  KEEP:	R0,R3,R6,R7
;*****************************************
DEL4SAVE5:
	push	ar3
	push	ar6
	push	ar7
	clr		c
	mov		a,r3
	subb	a,r0
	mov		b,#2				;a为结果中小数部分自低到高数无效的BCD码的个数
	jnz		DEL4SAVE_1
	ljmp	DEL4SAVE_20			;当小数部分全部有效时也无需四舍五入的处理
DEL4SAVE_1:
	div		ab					;out:  a 为商数(即为无效字节长度), b 为余数
	xch		a,b
	jnz		DEL4SAVE_4			;余数不为零
	xch		a,b
	jz		DEL4SAVE_5			;if 无效字节长度=0
	dec		a
	sjmp	DEL4SAVE_5
DEL4SAVE_4:
	xch		a,b
DEL4SAVE_5:
	mov		r5,a				;无效字节长度保存
	add		a,r7
	mov		dpl,a
	mov		r7,a				;保存指针低位
	mov		a,r6
	addc	a,#0
	mov		dph,a
	mov		r6,a				;保存指针高位
	movx	a,@dptr
	mov		r2,a				;暂存
	mov		a,b
	jz		DEL4SAVE_6			;如果 b(前面 div  ab 产生的余数)为零,取该字节高4位的BCD
	mov		a,r2				;否则取低字BCD
	sjmp	DEL4SAVE_7	
DEL4SAVE_6:
	mov		a,r2
	swap	a
DEL4SAVE_7:
	anl		a,#0fh
	cjne	a,#4,DEL4SAVE_8
	sjmp	DEL4SAVE_13
DEL4SAVE_8:
	jc		DEL4SAVE_13			;<=4,舍去

	mov		a,r3				;>5 舍入
	rr		a
	mov		r3,a				;r3/2 四舍五入的字节长度
	
	mov		a,b
	jz		DEL4SAVE_10
	mov		a,r2
	add		a,#10h
	da		a
	movx	@dptr,a
	sjmp	DEL4SAVE_12
DEL4SAVE_10:
	inc		dptr
	movx	a,@dptr
	add		a,#01
DEL4SAVE_11:
	da		a
	movx	@dptr,a
	djnz	r3,DEL4SAVE_12
DEL4SAVE_13:				;将所有无效BCD码全部清为零
	mov		a,r7
	mov		dpl,a
	mov		a,r6
	mov		dph,a
	mov		a,b
	jz		DEL4SAVE_15
	movx	a,@dptr
	anl		a,#0f0h
	sjmp	DEL4SAVE_14a
DEL4SAVE_15:
	mov		a,#00h
DEL4SAVE_14a:
	movx	@dptr,a
DEL4SAVE_14:
	lcall	DPTRDEC1
	mov		a,r5
	jz		DEL4SAVE_20
	dec		r5
	sjmp	DEL4SAVE_15

DEL4SAVE_20:
	pop		ar7
	pop		ar6
	pop		ar3
	ret

DEL4SAVE_12:
	inc		dptr
	movx	a,@dptr
	addc	a,#0
	da		a
	movx	@dptr,a
	djnz	r3,DEL4SAVE_12
	sjmp	DEL4SAVE_13
;*****************************
;  字符串拷贝
;IN: 	源指针R7(低)R6(高)
;	  	目标指针R5(低)R4(高)
;		长度 R3
;OUT: 	NO
;CHANGE: R2,R4,R5,R6,R7,DPTR,A
;  KEEP: R3,Cy
;*****************************
StrCopy:
	mov		ar2,ar3
StrCp_10:
	mov		dpl,r7				
	mov		dph,r6
	movx	a,@dptr				
	lcall	R7R6ADD1				;指针加一
	mov		dpl,r5
	mov		dph,r4
	movx	@dptr,a
	lcall	R5R4ADD1				;指针加一
	djnz	r2,StrCp_10				;r3=LENGTH
	ret

;void CALLDIV(uchar xdata *StringPt1,uchar xdata *StringPt2,uchar Length);
;-------------------------------------------------------------;
;Description:   多字节无符号 BCD 码除法 (不考虑余数,但计算四舍五入)
;				令被除数与除数等长,不足位在高位补零.
;	OUT:	
;		A==除法益出标志. (A=0XFF, OVER; A=0, NOOVER)
;-------------------------------------------------------------;


;-------------------------------------------------------------;
;Description:   多字节无符号 BIN 码除法 (不考虑余数,但计算四舍五入)
;				令被除数与除数等长,不足位在高位补零.
;	 IN: R3-> 被除数的长度
;
;	OUT:	
;		A=0xFE 被除数为零,除法结果为零标志
;		A=0xFF 除数为零,除法益出标志.
;		A=0x00 正常状况下
;

⌨️ 快捷键说明

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