⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hanoi.asm

📁 用递规子程序的方法实现HANOI塔问题.子程序模块个数不限. 要求: 盘子个数可以输入,第一个塔为A,第二个塔为B,第三个塔 的名称为C.打印出移动过程.
💻 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 + -