📄 dt.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 + -