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

📄 newmath.asm.svn-base

📁 keilC底层软件,能够结合硬件产生加解密密文,具有安全保护功能.
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
	sjmp	Mbcd_Ad300	
Mbcd_Ad200:
	lcall	DORESULT			;拷贝计算结果(8字节整数+8字节小数)
	mov		r0,#11101111b		;设置标志 r0=0xef 结果没有溢出

;	lcall	DORESULT			;对计算结果的处理,判断整数及小数的长度
;	mov		a,b
;	jz		Mbcd_Ad210			;如果不存在四舍五入问题
;	lcall	DEL4SAVE5			;进行四舍五入处理
;	lcall	CALBCDLEN			;整数BCD码长R1, 小数BCD码长R0
;	lcall	ACTDOTLEN			;再次进行有效码长及小数点位数的确定
;Mbcd_Ad210:
;	mov		dptr,#(TEMPSTART+D3NUM)
;	mov		a,r0
;	movx	@dptr,a
Mbcd_Ad300:
	mov		dptr,#(TEMPSTART+ARITHFLAG)
	movx	a,@dptr
	lcall	JUDEGSIG_16			;设置结果是否溢出标志
	ret


;********************************
;	多字节带符号 BCD 码加法
;********************************
MBCD_ADD:
	mov		dptr,#(TEMPSTART+ARITHFLAG)				;取俩操作数符号
	movx	a,@dptr
	anl		a,#00000011b
	cjne	a,#0,MBCD_AD_10
	ljmp	MBCD_SU_21					;*************	+A + +B =+(a+b)
MBCD_AD_10:
	cjne	a,#1,MBCD_AD_20
	ljmp	MBCD_SU_30					;******			-A + +B =+(b-a)
MBCD_AD_20:
	cjne	a,#2,MBCD_AD_30
	ljmp	MBCD_SU_32					;******			+A + -B =+(a-b)
MBCD_AD_30:
	ljmp	MBCD_SU_12					;*************	-A + -B =-(a+b)

;********************************
;	多字节带符号 BCD 码减法
;********************************
MBCD_SUB:
	mov		dptr,#(TEMPSTART+ARITHFLAG)				;取俩操作数符号
	movx	a,@dptr
	anl		a,#00000011b
	cjne	a,#0,MBCD_SU_10
	sjmp	MBCD_SU_32			;******			+A - +B =+(a-b)
MBCD_SU_10:
	cjne	a,#1,MBCD_SU_20
MBCD_SU_12:						;*************  -A - +B =-(a+b)
	movx	a,@dptr
	orl		a,#00000100b
	sjmp	MBCD_SU_22					
MBCD_SU_20:
	cjne	a,#2,MBCD_SU_30
MBCD_SU_21:						;*************	+A - -B =+(a+b)
	movx	a,@dptr
	anl		a,#11111011b				
MBCD_SU_22:
	movx	@dptr,a						;加法结果符号可直接确定
	lcall	MBCD_ADD_NS					
	sjmp	MBCD_SU_50
MBCD_SU_30:						;******			;-A - -B =+(b-a)  
	mov		r3,#LENTH
	lcall	XMEMXCH						;第一第二操作数互换(BCD码)
MBCD_SU_32:
	lcall	MBCD_SUB_NS					;减法结果符号根据俩数大小确定
MBCD_SU_50:
	ret

;********************************
;	多字节无符号 BCD 码减法
;OUT:
;		R0=0x10 结果溢出标志.
;		R0=0xef 正常状况下
;********************************
MBCD_SUB_NS:
	mov		r3,#LENTH
	mov		r7,#LOW(TEMPSTART+BCDD1BUF)
	mov		r6,#HIGH(TEMPSTART+BCDD1BUF)
	mov		r5,#LOW(TEMPSTART+BCDD2BUF)
	mov		r4,#HIGH(TEMPSTART+BCDD2BUF)
	lcall	XMEMCOMP
	mov		a,r7
	cjne	a,#1,Mbcd_Su20		;被减数大于等于减数(r7=0 相等; r7=2 大于)
	lcall	XMEMXCH				;如果第一操作数小于第二操作数,则将第一第二操作数互换
	mov		dptr,#(TEMPSTART+ARITHFLAG)
	movx	a,@dptr
	orl		a,#00000100b
	movx	@dptr,a				;设置结果为负
	sjmp	Mbcd_Su10
;--------------------------- 12.18 改俞昆提"正负"号问题
Mbcd_Su20:
	mov		dptr,#(TEMPSTART+ARITHFLAG)
	movx	a,@dptr
	anl		a,#11111011b
	movx	@dptr,a				;设置结果为正
;--------------------------- 12.18 改俞昆提"正负"号问题
Mbcd_Su10:
	lcall	CHANGECOPY
	lcall	MBIN_SUB			;R3 未改变,仍然是#LENTH
	jc		Mbcd_Su100			;如果结果溢出(此分支不可能,因为俩7字节BIN减不会溢出8字节)
	lcall	COMPTOMAX			;取结果送到临时区转换为BCD,并与极大值相比较 out: R7
	mov		a,r7
	cjne	a,#2,Mbcd_Su200		;小于等于最大值
Mbcd_Su100:
	mov		r0,#LENTH
	mov		dptr,#(TEMPSTART+BCDD3BUF)
	lcall	Calcul_Clear
	mov		r0,#00010000b		;if r7=2 结果溢出,设置溢出标志 r0=010h, 并且全清结果
	sjmp	Mbcd_Su300	
Mbcd_Su200:
	lcall	DORESULT			;拷贝计算结果(8字节整数+8字节小数)
	mov		r0,#11101111b		;if r7=0 or 1 结果没有溢出,设置标志 r0=0xefh

;	lcall	DORESULT			;对计算结果的处理,判断整数及小数的长度
;	mov		a,b
;	jz		Mbcd_Su210			;如果不存在四舍五入问题
;	lcall	DEL4SAVE5			;进行四舍五入处理
;	lcall	CALBCDLEN			;整数BCD码长R1, 小数BCD码长R0
;	lcall	ACTDOTLEN			;再次进行有效码长及小数点位数的确定
;Mbcd_Su210:
;	mov		dptr,#(TEMPSTART+D3NUM)
;	mov		a,r0
;	movx	@dptr,a
Mbcd_Su300:
	mov		dptr,#(TEMPSTART+ARITHFLAG)
	movx	a,@dptr
	lcall	JUDEGSIG_16			;设置结果是否溢出标志
	ret


;********************************
;	多字节无浮号 BCD 码乘法
;OUT:
;		R0=0xEF 结果溢出标志.
;		R0=0x10 结果未溢出标志.
;********************************
MBCD_MUL:
	lcall	CHANGECOPY
	lcall	MBIN_MUL			;R3 未改变,仍然是#LENTH
	jnc		Mbcd_Mu050			
	mov		r0,#11101111b		;如果结果为零,设置标志 r0=0xef 结果没有溢出
	sjmp	Mbcd_Mu120
Mbcd_Mu050:
	mov		r3,#LENTH			;R3 被 MBIN_MUL 修改,因此需要重送
	mov		r7,#LOW(TEMPSTART+CENJI)
	mov		r6,#HIGH(TEMPSTART+CENJI)
	mov		r5,#LOW(TEMPSTART+BCDBIN1)
	mov		r4,#HIGH(TEMPSTART+BCDBIN1)

	push	ar3					;注意:转换的长度为乘数(或被乘数)的俩倍长故此处R3需要保存
	clr		c
	mov		a,r3
	rlc		a
	mov		r3,a
	lcall	StrCopy
	lcall	XBIN_BCD			;取结果送到临时区转换为 BCD
	pop		ar3
	lcall	JUDGEINT			;判断BCD码结果的整数部分是否溢出
	jc		Mbcd_Mu100

	mov		a,r3
	rrc		a
	add		a,#LOW(TEMPSTART+BCDBIN2)
	mov		r7,a
	mov		a,#HIGH(TEMPSTART+BCDBIN2)
	addc	a,#0
	mov		r6,a				;R6R7 指向BCD码乘积结果的最底有效字节
	mov		r5,#LOW(TEMPSTART+MAXNUM)
	mov		r4,#HIGH(TEMPSTART+MAXNUM)
	lcall	XMEMCOMP			;与极大值相比较
	mov		a,r7
	cjne	a,#2,Mbcd_Mu200		;小于等于最大值
Mbcd_Mu100:
	mov		r0,#00010000b		;if r7=2 结果溢出,设置溢出标志 r0=0x10 结果溢出
Mbcd_Mu120:
	push	ar0
	mov		r0,#LENTH
	mov		dptr,#(TEMPSTART+BCDD3BUF)
	lcall	Calcul_Clear
	pop		ar0
	sjmp	Mbcd_Mu300	
Mbcd_Mu200:
	clr		c
	mov		a,r3
	rrc		a
	add		a,#LOW(TEMPSTART+BCDBIN2)
	mov		r7,a
	mov		a,#HIGH(TEMPSTART+BCDBIN2)
	addc	a,#0
	mov		r6,a				;R6R7 指向BCD码乘积结果的最底有效字节
	lcall	DORESU_10			;拷贝计算结果(8字节整数+8字节小数)
Mbcd_Mu220:
	mov		r0,#11101111b		;if r7=0 or 1 结果正常,设置标志 r0=0xef 没有溢出

;	lcall	DORESU_10			;对计算结果的处理,判断整数及小数的长度
;	mov		a,b
;	jz		Mbcd_Mu210			;如果不存在四舍五入问题
;	lcall	DEL4SAVE5			;进行四舍五入处理
;	lcall	CALBCDLEN			;整数BCD码长R1, 小数BCD码长R0
;	lcall	ACTDOTLEN			;再次进行有效码长及小数点位数的确定
;Mbcd_Mu210:
;	mov		dptr,#(TEMPSTART+D3NUM)
;	mov		a,r0
;	movx	@dptr,a
Mbcd_Mu300:
	lcall	JUDGESIGN			;结果符号及溢出标志处理
	ret


;********************************
;	多字节无浮号 BCD 码除法
;OUT:
;		R0=0xEF 结果溢出标志.
;		R0=0x10 结果未溢出标志.
;********************************
MBCD_DIV:
	mov		r3,#LENTH
	mov		r7,#LOW(TEMPSTART+BCDD1BUF)
	mov		r6,#HIGH(TEMPSTART+BCDD1BUF)
	mov		r5,#LOW(TEMPSTART+BCDBIN1)
	mov		r4,#HIGH(TEMPSTART+BCDBIN1)

	mov		a,r3				;
	rl		a					;
	mov		r0,a				;
	mov		dptr,#(TEMPSTART+BCDBIN1)		;
	lcall	Calcul_Clear		;清空BCDBIN转换缓冲区

	lcall	StrCopy				;取被除数(BCD码)送到转换缓冲区
	lcall	TIME10N				;被除数放大10的N次幂倍(N 等于欲显示的有效小数位数)

	push	ar3
	mov		a,r3
	rl		a
	mov		r3,a
	lcall	XBCD_BIN			;被除数转换为BIN(转换的长度为被除数的俩倍)
	mov		r7,#LOW(TEMPSTART+BCDBIN2)
	mov		r6,#HIGH(TEMPSTART+BCDBIN2)
	mov		r5,#LOW(TEMPSTART+DIVD1BUF)
	mov		r4,#HIGH(TEMPSTART+DIVD1BUF)
	lcall	StrCopy				;送到第一操作数区
	pop		ar3

	mov		r7,#LOW(TEMPSTART+BCDD2BUF)
	mov		r6,#HIGH(TEMPSTART+BCDD2BUF)
	mov		r5,#LOW(TEMPSTART+BCDBIN1)
	mov		r4,#HIGH(TEMPSTART+BCDBIN1)

	mov		a,r3				;
	rl		a					;
	mov		r0,a				;
	mov		dptr,#(TEMPSTART+BCDBIN1)		;
	lcall	Calcul_Clear		;清空BCDBIN转换缓冲区

	lcall	StrCopy				
	mov		a,r3
	rl		a
	mov		r3,a
	lcall	XBCD_BIN			;取除数送到临时区转换为BIN

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

	lcall	MBIN_DIV			;out: a=0feh 商数为零; a=0ffh 除法溢出; a=0 一般情况
	cjne	a,#0feh,MBCD_D10
	mov		r0,#11101111b		;结果为零,r0=0xef 没有溢出标志
	sjmp	MBCD_D40
MBCD_D10:
	cjne	a,#0ffh,MBCD_D20	
	sjmp	MBCD_D35			;如果除法结果溢出
MBCD_D20:
	mov		r7,#LOW(TEMPSTART+SANADD)
	mov		r6,#HIGH(TEMPSTART+SANADD)
	mov		r5,#LOW(TEMPSTART+BCDBIN1)
	mov		r4,#HIGH(TEMPSTART+BCDBIN1)
	lcall	StrCopy				;商数拷贝到临时缓冲区
	lcall	XBIN_BCD			;转换为BCD码

	clr		c
	mov		a,r3
	rrc		a
	mov		r0,a				;r0=(偏移) 	dptr=#(BCDBIN1)+r0
	mov		r1,a				;r1=(长度)
	lcall	JUDGEI_10			;判断BCD码结果的整数部分是否溢出
	jc		MBCD_D35			;如果溢出

	mov		ar3,ar0				;恢复ar3为16字节
	mov		r7,#LOW(TEMPSTART+BCDBIN2)
	mov		r6,#HIGH(TEMPSTART+BCDBIN2)
	mov		r5,#LOW(TEMPSTART+MAXNUM)
	mov		r4,#HIGH(TEMPSTART+MAXNUM)
	lcall	XMEMCOMP			;与极大值相比较
	mov		a,r7
	cjne	a,#2,MBCD_D50		;小于等于最大值
MBCD_D35:
	mov		r0,#00010000b		;if r7=2 结果溢出,设置溢出标志 r0=0x10 结果溢出
MBCD_D40:
	push	ar0
	mov		r0,#LENTH			;全清结果
	mov		dptr,#(TEMPSTART+BCDD3BUF)
	lcall	Calcul_Clear
	pop		ar0
	sjmp	MBCD_D60
MBCD_D50:
	lcall	DORESULT			;拷贝计算结果(8字节整数+8字节小数)
	mov		r0,#11101111b		;if r7=0 or 1 结果正常,设置标志 r0=0xef 结果没有溢出

;	lcall	DORESULT			;对计算结果的处理,判断整数及小数的长度
;	mov		a,b
;	jz		MBCD_D55			;如果不存在四舍五入问题
;	lcall	DEL4SAVE5			;进行四舍五入处理
;	lcall	CALBCDLEN			;整数BCD码长R1, 小数BCD码长R0
;	lcall	ACTDOTLEN			;再次进行有效码长及小数点位数的确定
;MBCD_D55:
;	mov		dptr,#(TEMPSTART+D3NUM)
;	mov		a,r0
;	movx	@dptr,a
MBCD_D60:
	lcall	JUDGESIGN			;结果及溢出标志处理
	ret

;***********************************
;函数说明: 将被除数(BCD码)放大10的N次幂
; 		IN:	R3 -> 被除数(或除数)长度
;	CHANGE:	A,R0,R1,DPTR,Cy
;  	  KEEP: R3
;***********************************
TIME10N:
	mov		a,r3
	rl		a
	rl		a
	mov		r0,a				;总的移位次数=(r3/2)*8
TIME10_05:
	mov		dptr,#(TEMPSTART+BCDBIN1)
	mov		a,r3
	rl		a
	mov		r1,a				;需要移位的字节数
	clr		c
TIME10_10:
	movx	a,@dptr
	rlc		a
	movx	@dptr,a
	inc		dptr
	djnz	r1,TIME10_10
	djnz	r0,TIME10_05
	ret

;***************************************************
;函数说明: 判断乘积(或商数)的整数部分是否溢出(已经转为BCD码)
; 方法: 从乘积的最低字节向高位跳过 (乘数长度*1.5)字节
;		判断剩余字节是否全部为零,如果为零,没有溢出; 否则溢出.
;
;		 IN: R3->乘数(或被乘数)的字节长度
;  		OUT: Cy=1 溢出	;Cy=0 没有溢出	;
; CHANGE:	 R0,R1,A,DPTR,Cy
;	KEEP:	 R3
;***************************************************

⌨️ 快捷键说明

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