📄 hanoi.asm
字号:
;数据段:在此处添加程序所需的数据
DATA SEGMENT
TOWERA DW 0 ;第一个塔,也就是最左边的那个
TOWERB DW 0 ;第二个塔,中间的那个
TOWERC DW 0 ;第三个塔,最右边的那个
HANOI DW 0 ; 盘子个数,由用户输入--需要判断啊!
COUNT DW 0 ; 移动的次数
DIST DB 8,?,8 DUP()
CR DB 13,10,24H
DATA ENDS
;*******************************************************************************
;堆栈段设置
STACK SEGMENT STACK
DB 400 DUP(0) ;初始化堆栈大小
STACK ENDS
;*********************************************************************************
;代码段设置
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
CALL CATCH
CALL BEGIN
MOV AH,01H
INT 21H ;按任意键退出
MOV AX,4C00H
INT 21H ;退出程序
CATCH PROC NEAR
MOV COUNT,0 ;初始化移动次数为0
LEA DX,DIST
MOV AH,0AH
INT 21H
MOV CL,DIST+2 ;讲输入的ASCII转换为数字并保存在HANOI中
AND CL,0FH
XOR CH,CH
MOV HANOI,CX
MOV TOWERA,'A'
MOV TOWERB,'B'
MOV TOWERC,'C'
RET
CATCH ENDP
BEGIN PROC NEAR
CMP HANOI,1
JE _NEXT
PUSH TOWERA
PUSH TOWERB
PUSH TOWERC
PUSH HANOI
INC COUNT
MOV AX,TOWERB
XCHG AX,TOWERC
MOV TOWERB,AX
DEC HANOI
CALL BEGIN
_NEXT:
;输出移动
MOV AH,02H
CALL SHOW
CMP COUNT,0
JZ _EXIT
POP HANOI
POP TOWERC
POP TOWERB
POP TOWERA
DEC COUNT
CALL SHOW
MOV AX,TOWERA
XCHG AX,TOWERB
MOV TOWERA,AX
DEC HANOI
CALL BEGIN
_EXIT:
RET
BEGIN ENDP
SHOW PROC NEAR
MOV DX,TOWERA
INT 21H
MOV DL,'-'
INT 21H
MOV DL,'>'
INT 21H
MOV DX,TOWERC
INT 21H
MOV DL,' '
INT 21H
MOV DX,13
INT 21H
MOV DX,10
INT 21H
RET
SHOW ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -