📄 hanoi2.asm
字号:
;汉诺塔问题:第1个接到任务的人叫第2个人把n-1只diskes从开始地送到中间地,自己只需要把最下面一只disk放到目的地,再叫第2个人把他
;原来搬到中间的n-1只diskes都搬到目的地。而第2个人则叫第3个人去把n-2只diskes从第2个人的开始地送到从第2个人的中间地,从第2个人
;只需要把最下面一只disk放到自己的目的地,再叫第3个人把他原来搬到第2个人中间地的n-2只diskes都搬到第2个人目的地。如此类推。
DATA SEGMENT
PANM DB 'C:\Hanoi.txt',0
COUNT DW ?
BUF DB 40955 DUP (' ')
STR DB 'Welcome To Hanoi!$'
STR0 DB 'input the number of diskes(01~13):$'
ERR DB 'ERROR!$'
STR1 DB 'The steps to move the diskes(From A to C)have been save to C:\Hanoi.txt$'
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 10 DUP (?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
START:MOV AX,DATA
MOV DS,AX
L1:CALL ENTER1
LEA DX,STR
CALL DISP9
CALL ENTER1
LEA DX,STR0
CALL DISP9
MOV AH,01H
INT 21H
SUB AL,30H
JC ER9 ;小于0跳
CMP AL,9
JA ER9 ;大于9跳
MOV DL,10
MUL DL
MOV CL,AL ;保存十位
MOV AH,01H
INT 21H
SUB AL,30H
JC ER9
CMP AL,9
JA ER9
ADD CL,AL ;加上个位
CMP CL,13
JA ER9 ;大于13跳
CMP CL,0
JE ER9 ;等于0跳
CALL ENTER1
LEA DX,STR1
CALL DISP9
CALL ENTER1
MOV BH,41H ;diskes的最开始的起始位置A
MOV BL,42H ;最开始时没有东西的中间位置B
MOV CH,43H ;所有diskes的目标位置C
LEA SI,BUF
MOV AX,0H
CALL Hanoi ;入口参数CL即diskes的数目,和A,B,C
MOV COUNT,AX
LEA DX,PANM
MOV CX,0H
MOV AH,3CH
INT 21H ;新建文件
JC EXT ;失败就结束
MOV BX,AX
MOV AL,02H
MOV AH,3DH
INT 21H ;打开文件
JC EXT ;失败就结束
LEA DX,BUF
MOV AH,40H
MOV CX,COUNT
INT 21H ;写文件
MOV AH,3EH
INT 21H ;关闭文件
EXT:MOV AH,4CH
INT 21H
ER9:CALL ENTER1
CALL ENTER1
LEA DX,ERR
MOV AH,09H
INT 21H ;输出ERROR
CALL ENTER1
JMP L1
Hanoi PROC ;入口参数CL即diskes的数目,和BH(起始),BL(中间),CH(目的),AX(记录个数)、BX、CX不受子程序保护
CMP CL,1 ;判断是否被分配到一只disk
JE DISP ;不是就把n只disk从它的现在的起始位移到现在的目的地
DEC CL
PUSH BX
PUSH CX
XCHG BL,CH ;分配下一个人的任务(指派其开始为BH、中间为CH、目的BL),故交换CL与BL
CALL Hanoi ;命令下一个人完成n-1只diskes从开始,借助目的,放到中间
POP CX
POP BX
CALL DISP1 ;自己就只把最下面的disk放到现在的目的地
XCHG BH,BL ;分配下一个人的任务(指派其开始为BL、中间为BH、目的CH),故交换BH与BL
CALL Hanoi ;命令下一个人完成n-1只diskes从中间,借助开始,放到目的
RET
DISP:CALL DISP1 ;最后被分配一只disk的人把disk直接放到目的地
RET
Hanoi ENDP
DISP1 PROC ;保存该人把一只disk从起始地送到目的地的路径到BUF,AX记录字符个数,SI不受子程序保护
MOV [SI],BH
INC SI
MOV BYTE PTR [SI],2DH
INC SI
MOV BYTE PTR [SI],3EH
INC SI
MOV [SI],CH
INC SI
MOV BYTE PTR [SI],20H
INC SI
ADD AX,5
RET
DISP1 ENDP
ENTER1 PROC ;回车换行
PUSH DX
PUSH AX
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
POP AX
POP DX
RET
ENTER1 ENDP
DISP9 PROC ;9号功能
PUSH AX
MOV AH,09H
INT 21H
POP AX
RET
DISP9 ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -