📄 hanoi.asm
字号:
DSEG SEGMENT
INPUT1 DB 'PLEASE INPUT THE NUMBER BETWEEN 1 AND 9: $'
SPACE1 DB ' $'
ENTER1 DB 10,13,'$'
DSEG ENDS
;**************************************************
SSEG SEGMENT STACK
DB 100 DUP(?)
TOP EQU $
SSEG ENDS
;**************************************************
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START: MOV AX,DSEG
MOV DS,AX
LEA SP,TOP
CALL INPUT ;从键盘上读入最大码值存入到cl
MOV CL,CH ;将最大码值给cl
MOV BL,'X' ;x为源轴
MOV BH,'Z' ;z为目标轴
MOV CH,'Y' ;y为辅轴
CALL HANOI ;启动hanoi
MOV AH,4CH
INT 21H
HANOI PROC ;
PUSH BX
PUSH CX
PUSH AX ;用ax dx 来临时保存源、目标、辅轴
PUSH DX
MOV AL,BL
MOV AH,BH
MOV DH,CH
CMP CL,1
JNZ NEXT
MOV BL,AL ;将1码从x送到z
MOV CL,1
MOV BH,AH
CALL MOVETO
JMP ENDHANOI
NEXT: DEC CL ;将x上1-(n-1)的码送到y,z做辅轴
MOV BL,AL
MOV BH,DH
MOV CH,AH
CALL HANOI
MOV BL,AL ;将n码由x送到z
MOV BH,AH
INC CL
CALL MOVETO
MOV BL,DH ;将1-(N-1)码由Y送到Z,X为辅轴
MOV BH,AH
MOV CH,AL
DEC CL
;DEC CL
CALL HANOI
ENDHANOI:
POP DX
POP AX
POP CX
POP BX
RET
HANOI ENDP
MOVETO PROC
PUSH AX
PUSH BX
PUSH CX
MOV DL,BL
CALL SHOW ;显示源轴
CALL SPACE
MOV DL,'-'
CALL SHOW
MOV DL,'>'
CALL SHOW
MOV DL,BH
CALL SHOW ;显示目标轴
CALL SPACE
MOV DL,CL
OR DL,30H
CALL SHOW ;显示移动的码数
CALL ENTER
POP CX
POP BX
POP AX
RET
MOVETO ENDP
SHOW_STRING PROC
PUSH AX
MOV AH,09H
INT 21H
POP AX
RET
SHOW_STRING ENDP
SPACE PROC
PUSH DX
LEA DX,SPACE1
CALL SHOW_STRING
POP DX
RET
SPACE ENDP
ENTER PROC
PUSH DX
LEA DX,ENTER1
CALL SHOW_STRING
POP DX
RET
ENTER ENDP
SHOW PROC
PUSH AX
MOV AH,02H
INT 21H
POP AX
RET
SHOW ENDP
INPUT PROC
PUSH DX
PUSH AX
LEA DX,INPUT1
CALL SHOW_STRING
MOV AH,01H
INT 21H
AND AL,0FH
MOV CH,AL
CALL ENTER
POP AX
POP DX
RET
INPUT ENDP
MOV AH,4CH
INT 21H
CSEG ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -