图示HANOI的移动过程
DATA SEGMENT ;数据段定义
A DW 5 ;用于标识哪一个盘在移动 SI
SUM DW 4 ;总共有多少个盘 DI
FIRSTPLANT DB 'A' ;第A根柱子 AX
SECONDPLANT DB 'B' ;第B根柱子 BX
THIRTHPLANT DB 'C' ;第C根柱子 CX
FLAG DW ? ;保护AX内容
FLAG1 DW 15 ;一共移动多少次
FIRSTPLANT1 DW 4,1,2,3,4 ;第A根柱子上有哪几个盘
SECONDPLANT1 DW 5 DUP(0) ;第B根柱子上有哪几个盘
THIRTHPLANT1 DW 5 DUP(0) ;第C根柱子上有哪几个盘
STRING0 DB ' |',0DH,0AH,'$'
STRING1 DB ' *|*',0DH,0AH,'$'
STRING2 DB ' **|**',0DH,0AH,'$'
STRING3 DB ' ***|***',0DH,0AH,'$'
STRING4 DB ' ****|****',0DH,0AH,'$'
STRING5 DB ' =============',0DH,0AH,'$'
STRING6 DB ' A',0DH,0AH,0DH,0AH,'$'
STRING7 DB ' B',0DH,0AH,0DH,0AH,'$'
STRING8 DB ' C',0DH,0AH,0DH,0AH,'$'
DIDAS DW 30
DATA ENDS
STACK SEGMENT stack ;堆栈段定义
DW 300 DUP(?)
TOP LABEL WORD
STACK ENDS
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
MOV AX,STACK ;堆栈段初始化
MOV SS,AX
LEA SP,TOP
MOV AX,DATA ;数据段初始化
MOV DS,AX
MOV SI,A
MOV DI,SUM
MOV AX,0
MOV BX,0
MOV CX,0
MOV BP,0
MOV AL,FIRSTPLANT
MOV BL,SECONDPLANT
MOV CL,THIRTHPLANT
PUSH DI
PUSH BP
PUSH AX
CALL PRINT
POP AX
POP BP
POP DI
L1:CMP DI,1
JE L2
CMP BP,1
JE L5
PUSH SI
PUSH DI
PUSH AX
PUSH BX
PUSH CX
L3:CALL HANNUO1
JMP L1
L2:DEC SI
CALL MOVE1
POP CX
POP BX
POP AX
POP DI
POP SI
MOV DX,FLAG1
CMP DX,0
JE L4
DEC SI
CALL MOVE1
DEC DI
CALL HANNUO2
JMP L1
L5:MOV BP,0
JMP L1
L4:;MOV AH,4CH
;INT 21H
RET
MAIN ENDP
HANNUO1 PROC NEAR
DEC SI
DEC DI
XCHG BX,CX
RET
HANNUO1 ENDP
HANNUO2 PROC NEAR
MOV BP,1
XCHG AX,BX
RET
HANNUO2 ENDP
MOVE1 PROC NEAR
PUSH DI
PUSH BP
MOV FLAG,AX
MOV BP,0
MOV DX,1
CMP AX,'A'
JNE R1
LEA DI,FIRSTPLANT1
JMP R3
R1:CMP AX,'B'
JNE R2
LEA DI,SECONDPLANT1
JMP R3
R2:LEA DI,THIRTHPLANT1
R3:SUB [DI],DX
ADD DI,SI
ADD DI,SI
MOV [DI],BP
CMP CX,'A'
JNE R4
LEA DI,FIRSTPLANT1
JMP R6
R4:CMP CX,'B'
JNE R5
LEA DI,SECONDPLANT1
JMP R6
R5:LEA DI,THIRTHPLANT1
R6:ADD [DI],DX
ADD DI,SI
ADD DI,SI
MOV [DI],SI
CALL PRINT
;MOV DX,AX
;MOV AH,2
;INT 21H
;MOV DL,'-'
;MOV AH,2
;INT 21H
;MOV DX,CX
;MOV AH,2
;INT 21H
;MOV DL,','
;MOV AH,2
;INT 21H
;MOV DX,SI
;ADD DL,30H
;MOV AH,2
;INT 21H
;MOV DL,0DH
;MOV AH,2
;INT 21H
;MOV DL,0AH
;MOV AH,2
;INT 21H
MOV AX,FLAG
MOV DX,FLAG1
DEC DX
MOV FLAG1,DX
POP BP
POP DI
RET
MOVE1 ENDP
PRINT PROC NEAR ;汉诺塔移动结果显示
CALL CLEAR
mov ax,0F3H
int 10H
LEA DI,FIRSTPLANT1
CALL PRINT1
LEA DX,STRING6
MOV AH,9
INT 21H
LEA DI,SECONDPLANT1
CALL PRINT1
LEA DX,STRING7
MOV AH,9
INT 21H
LEA DI,THIRTHPLANT1
CALL PRINT1
LEA DX,STRING8
MOV AH,9
INT 21H
CALL DELAY
mov ax,83H
int 10H
RET
PRINT ENDP
PRINT1 PROC NEAR ;汉诺塔移动结果显示
MOV DX,5
SUB DX,[DI]
PUSH DI
MOV DI,DX
LEA DX,STRING0
L6:CMP DI,0
JE L7
MOV AH,9
INT 21H
DEC DI
JMP L6
L7:MOV BP,4
POP DI
L8:ADD DI,2
CMP BP,0
JE Q6
CMP WORD PTR [DI],0
JE Q5
CMP WORD PTR [DI],1
JNE Q1
LEA DX,STRING1
JMP Q4
Q1:CMP WORD PTR [DI],2
JNE Q2
LEA DX,STRING2
JMP Q4
Q2:CMP WORD PTR [DI],3
JNE Q3
LEA DX,STRING3
JMP Q4
Q3:LEA DX,STRING4
Q4:MOV AH,9
INT 21H
Q5:DEC BP
JMP L8
Q6:LEA DX,STRING5
MOV AH,9
INT 21H
RET
PRINT1 ENDP
DELAY PROC NEAR ;每一步移动结果延时输出
PUSH DX
PUSH CX
XOR AX,AX
INT 1AH
MOV CS:TIMES,DX
MOV CS:TIMES[2],CX
READ_TIME: XOR AX,AX
INT 1AH
SUB DX,CS:TIMES
SBB CX,CS:TIMES[2]
CMP DX,DIDAS
JB READ_TIME
POP CX
POP DX
ret
Times dw 0,0
DELAY ENDP
CLEAR PROC NEAR ;显示每一步之后清屏
PUSH AX
PUSH BX
PUSH CX
MOV AH,6
MOV AL,0
MOV BH,7
MOV CH,0
MOV CL,0
MOV DH,24
MOV DL,79
INT 10H
MOV DX,0
MOV AH,2
INT 10H
POP CX
POP BX
POP AX
RET
CLEAR ENDP
CODE ENDS
END MAIN
盘子移动算法
(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;若判断还未将n - 1移动到B盘,则将还有多少个盘为移动、哪一个盘为移动等数据内容进栈,调用HANNUO1子程序。
(2)将A杆中剩下的第n号盘移至C杆,调用MOVE1子程序。
(3)以A杆为中介,从B杆将1至n-1号盘移至C杆。弹出栈顶存放,实现递归算法的回调。调用HANNUO2子程序,交换A、B柱子所表示的参数。及相当于第(1)步以C杆为中介,从A杆将1至n-1号盘移至B杆,则可继续调用HANNUO1子程序。
运行结果
初始状态:
最后状态: