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

📄 dt.asm

📁 在定时器中断中做LED的PWM输出 AT89C2051实现A/D转换的C51程序 单片机开发系统 指令系统 程序设计 定时与中断 系统扩展 接口技术 串行口
💻 ASM
字号:
;求解阶乘问题的递推算法。
N	DATA	30H	;参数N(N=01H~0AH)存放单元。
NFACT	EQU	31H	;N阶乘计算结果(BCD码)存放单元首址。

	ORG	0000H
	LJMP	TEST
	
	ORG	100H
TEST:	MOV	N,#5	;计数5!
	LCALL	FACT0	;结果得120
	MOV	N,#8	;计数8!
	LCALL	FACT0	;结果得40320
	MOV	N,#10	;计数10!
	LCALL	FACT0	;结果得3628800
STOP:	LJMP	STOP

FACT0:	MOV	A,N	;取参数N的值。
	LCALL	FACT	;调用计算阶乘的子程序。
	LCALL	HBCD	;将其转换成BCD码(该子程序省略)。
	MOV	R0,#NFACT ;然后将计算结果存放到指定单元。
	MOV	A,R1
	MOV	@R0,A
	INC	R0
	MOV	A,R2
	MOV	@R0,A
	INC	R0
	MOV	A,R3
	MOV	@R0,A
	INC	R0
	MOV	A,R4
	MOV	@R0,A
	RET

FACT:	MOV	R2,A	;保存目标阶数。
	MOV	A,#1	;从1阶开始。
	MOV	R3,A	;初始化当前阶数为1阶。
	MOV	R7,A	;初始化计算结果R5R6R7=000001H。
	CLR	A
	MOV	R5,A
	MOV	R6,A
FACT1:	MOV	A,R3	;取当前阶数。
	XRL	A,R2	;达到目标阶数否?
	JNZ	FACT2
	RET		;已经达到,结束计算。

FACT2:	INC	R3	;提高一阶。
	MOV	A,R7	;计算R3×R5R6R7-->R5R6R7。
	MOV	B,R3
	MUL	AB
	MOV	R7,A
	MOV	A,B
	XCH	A,R6
	MOV	B,R3
	MUL	AB
	ADD	A,R6
	MOV	R6,A
	CLR	A
	ADDC	A,B
	XCH	A,R5
	MOV	B,R3
	MUL	AB
	ADD	A,R5
	MOV	R5,A
	LJMP	FACT1	;继续递推。

HBCD:	CLR	A	;将十六进制数R5R6R7转换成BCD码R1R2R3R4
	MOV	R1,A
	MOV	R2,A
	MOV	R3,A
	MOV	R4,A
	MOV	R0,#18H
HB3:	MOV	A,R7
	RLC	A
	MOV	R7,A
	MOV	A,R6
	RLC	A
	MOV	R6,A
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	A,R4
	ADDC	A,R4
	DA	A
	MOV	R4,A
	MOV	A,R3
	ADDC	A,R3
	DA	A
	MOV	R3,A
	MOV	A,R2
	ADDC	A,R2
	DA	A
	MOV	R2,A
	MOV	A,R1
	ADDC	A,R1
	DA	A
	MOV	R1,A
	DJNZ	R0,HB3
	RET
	END

⌨️ 快捷键说明

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