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

📄 hanoi2.asm

📁 汉诺塔问题:第1个接到任务的人叫第2个人把n-1只diskes从开始地送到中间地
💻 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 + -