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

📄 calculation.asm

📁 MSC51计算除法例子子程序 (MCU-51)
💻 ASM
字号:
;--------------------------------------
;Title:	calculation study
;Date:	June 3 2004
;---------------------------------------


rBufA0		equ	30h
rBufA1		equ	31h
rBufA2		equ	32h
rBufA3		equ	33h

rDivCnt		equ	34h

rBufB0		equ	35h
rBufB1		equ	36h
rBufB2		equ	37h
rBufB3		equ	38h

		org	0000h
		jmp	L_Reset


L_Reset:
		mov	SP, #60h
		nop
		mov	R0, #0
		mov	R1, #0
		mov	R2, #099h
		mov	R3, #065h
		
		mov	R4, #06h
		mov	R5, #01h
		mov	R6, #0
		mov	R7, #0

		
		call	S_DivisionA


		nop
		mov	R2, #99h
		mov	R3, #0fh
		mov	R6, #0f0h
		mov	R7, #02h

		call	S_HexMul
		nop

		mov	R2, #000h
		mov	R3, #0ffh
		mov	R4, #0ah
		mov	R5, #0h

		mov	R6, #099h
		mov	R7, #01h
		call	S_Division
		nop
		

L_MainLoop:

		jmp	L_MainLoop


;---------------------------------------------------------------
;Func:	multiplication	
;	(R4,R5,R6,R7) = (R2,R3)*(R6,R7)	
;---------------------------------------------------------------
S_HexMul:

		mov	R4, #0
		mov	R5, #0
		mov	R0, #16
		clr	c
L_MulLoop:
		mov	a, R4
		rrc	a
		mov	R4, a
		mov	a, R5
		rrc	a
		mov	R5, a
		mov	a, R6
		rrc	a
		mov	R6, a
		mov	a, R7
		rrc	a
		mov	R7, a
		jnc	L_MulChk
		mov	a, R5
		add	a, R3
		mov	R5, a
		mov	a, R4
		addc	a, R2
		mov	R4, a
L_Mulchk:
		djnz	R0, L_MulLoop		
		
		mov	a, R4
		rrc	a
		mov	R4, a
		mov	a, R5
		rrc	a
		mov	R5, a
		mov	a, R6
		rrc	a
		mov	R6, a
		mov	a, R7
		rrc	a
		mov	R7, a
		ret



;---------------------------------------------------------------------------
;Func:	Division	
;	quotient is (R4,R5) = (R2,R3,R4,R5) / (R6,R7)
;	remainder is (R2,R3)
;---------------------------------------------------------------------------
S_Division:
		mov	a, R3			;check overflow or not?
		clr	c
		subb	a, R7
		mov	a, R2
		subb	a, R6
		jnc	L_DivOver		;overflow
		mov	B, #16
L_DivLoop:
		clr	c
		
		mov	a, R5
		rlc	a
		mov	R5, a
		
		mov	a, R4
		rlc	a
		mov	R4, a
		
		mov	a, R3
		rlc	a
		mov	R3, a
		
		xch	a, R2
		rlc	a
		xch	a, R2
		
		mov	F0, c
		clr	c
		subb	a, R7			;R1 = R3 - R7
		mov	R1, a
		mov	a, R2			;a = R2 - R6
		subb	a, R6
		jb	F0, L_DivSub
		jc	L_DivChk		
L_DivSub:
		mov	R2, a
		mov	a, R1
		mov	R3, a
		inc	R5
L_DivChk:	
		djnz	b, L_DivLoop	
		clr	F0
		ret
		
L_DivOver:	setb	F0
		ret		



;-----------------------------------------------------------------------------------------------------------------
;Func:	Division	
;	quotient is (R0,R1) = (R2,R3) / (R4,R5)
;	remainder is (R2,R3)
;-----------------------------------------------------------------------------------------------------------------
S_DivisionA:
		mov	R0, #0
		mov	R1, #0
		mov	B, #0
L_SDA1:		
		mov	a, R4
		jb	acc.7, L_SDA0
		
		clr	c
		mov	a, R5
		rlc	a
		mov	R5,a
		
		mov	a, R4
		rlc	a
		mov	R4,a
		inc	B
		mov	a, B
		cjne	a, #16, L_SDA1
		ret
L_SDA0:
		mov	a, R2
		jb	acc.7, L_SDA2
		mov	a, R3
		clr	c
		rlc	a
		mov	R3, a
		
		mov	a, R2
		rlc	a
		mov	R2, a
					;Note if B = 0 then error, so (R2,R3) must be > (R4,R5)
		djnz	B, L_SDA0		
		ret
L_SDA2:
		;(F0,R0,R1,R2,R3) - (R4,R5,R6,R7)
		
		clr	F0
L_DivComp:
		clr	c
		mov	a, R3
		subb	a, R5
		mov	R6, a
		
		mov	a, R2
		subb	a, R4
		mov	R7, a
		
		jc	L_ChkF0
L_AddResult:		
		mov	a, R6
		mov	R3, a
		mov	a, R7
		mov	R2, a
		
		setb	c
L_ShiftResult:		
		mov	a, R1
		rlc	a
		mov	R1, a
		mov	a, R0
		rlc	a
		mov	R0, a
		
		
		mov	a, B
		jz	L_DivRet
		
		dec	B
		jmp	L_ShiftA
L_DivRet:		
		ret
L_ShiftA:
		clr	c
		mov	a, R3
		rlc	a
		mov	R3, a
		
		mov	a, R2
		rlc	a
		mov	R2, a
	
		mov	F0, c
		jmp	L_DivComp
		
L_ChkF0:		
		jbc	F0, L_AddResult
		clr	c
		jmp	L_ShiftResult
		




		end













⌨️ 快捷键说明

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