📄 hanoi.lst
字号:
Microsoft (R) Macro Assembler Version 6.11 04/25/08 08:59:01
C:\DOCUME~1\ADMINI~1\桌面\243200~2\hanoi\hanoi.asm Page 1 - 1
0000 data segment
0000 0000 bin dw 0 ;输入的数字
0002 000A [ chnum db 10 dup('0'),'$' ;存放移动次数
30
] 24
000D 0041 one dw 'A'
000F 0042 two dw 'B'
0011 0043 three dw 'C'
0013 2D 2D 3E 24 strshow db '-->$'
0017 0D 0A 24 chline db 0dh,0ah,'$' ;回车换行
001A 50 6C 65 61 73 65 prompt db 'Please input the plate number(1-99):$'
20 69 6E 70 75 74
20 74 68 65 20 70
6C 61 74 65 20 6E
75 6D 62 65 72 28
31 2D 39 39 29 3A
24
003F 0D 0A 59 6F 75 20 chtimes1 db 0dh,0ah,'You have moved $'
68 61 76 65 20 6D
6F 76 65 64 20 24
0051 74 69 6D 65 73 0D chtimes2 db 'times',0dh,0ah,'$'
0A 24
0059 inputlist label byte ;缓冲区
0059 03 maxlen db 3
005A 00 actlen db 0 ;实际个数
005B 0003 [ chinput db 3 dup ('0'),'$'
30
] 24
005F 0001 multfact dw 1
0061 data ends
0000 code segment
0000 main proc far
assume cs:code,ds:data
0000 start:
0000 B8 ---- R mov ax,data
0003 8E D8 mov ds,ax
0005 loopagain:
0005 8D 16 001A R lea dx,prompt
0009 B4 09 mov ah,09h
000B CD 21 int 21h
000D 8D 16 0059 R lea dx,inputlist ;输入个数
0011 B4 0A mov ah,0ah
0013 CD 21 int 21h
0015 E8 0080 call asctobin ;转化位数字 放在bin
0018 B8 0001 mov ax,1
001B 3B 06 0000 R cmp ax,bin
001F 77 E4 ja loopagain ;ax>=bin,即bin<=1
0021 B8 0063 mov ax,99
0024 39 06 0000 R cmp bin,ax ;bin>=99
0028 77 DB ja loopagain
002A FF 36 0000 R push bin ;参数
002E FF 36 000D R push one
0032 FF 36 000F R push two
0036 FF 36 0011 R push three
003A 8D 16 0017 R lea dx,chline ;回车换行
003E B4 09 mov ah,09h
0040 CD 21 int 21h
0042 E8 008D call hanoi
0045 8D 16 003F R lea dx,chtimes1
0049 B4 09 mov ah,09h
004B CD 21 int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;下面是把chnum的每个数字转化位ASK11码
004D B9 000A mov cx,0010
0050 8D 36 0002 R lea si,chnum
0054 shownum:
0054 80 3C 30 cmp byte ptr [si],'0'
0057 74 03 je notadd
0059 80 04 30 add byte ptr [si],48 ;转化为ASC11码
005C notadd:
005C 46 inc si
005D E2 F5 loop shownum
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
005F 8D 16 0002 R lea dx,chnum
0063 B4 09 mov ah,09h
0065 CD 21 int 21h
0067 8D 16 0051 R lea dx,chtimes2
006B B4 09 mov ah,09h
006D CD 21 int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;下面是从新初始化变量进行下次输入
006F C7 06 0000 R 0000 mov bin,0
0075 C6 06 005A R 00 mov actlen,0
007A C6 06 005B R 30 mov [chinput],'0'
007F C6 06 005C R 30 mov [chinput+1],'0'
0084 B9 000A mov cx,0010
0087 8D 36 0002 R lea si,chnum
008B put0:
008B C6 04 30 mov byte ptr [si],'0'
008E 46 inc si
008F E2 FA loop put0
0091 E9 FF71 jmp loopagain
0094 loopend:
0094 B4 4C mov ah,4ch
0096 CD 21 int 21h
0098 main endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 字符串转化为数字的子程序
0098 asctobin proc near
0098 50 push ax
0099 51 push cx
009A 80 3E 005A R 00 cmp actlen,0
009F 74 F3 je loopend ;没有输入
00A1 80 3E 005A R 01 cmp actlen,1 ;输入各位数
00A6 74 02 je l2
00A8 EB 0D jmp l3
00AA l2:
00AA 32 E4 xor ah,ah
00AC A0 005B R mov al,[chinput]
00AF 2C 30 sub al,48 ;48=30h
00B1 01 06 0000 R add bin,ax
00B5 EB 18 jmp out1
00B7 l3:
00B7 32 E4 xor ah,ah
00B9 A0 005C R mov al,[chinput+1]
00BC 2C 30 sub al,48
00BE 01 06 0000 R add bin,ax
00C2 A0 005B R mov al,[chinput]
00C5 2C 30 sub al,48
00C7 B1 0A mov cl,10
00C9 F6 E1 mul cl
00CB 01 06 0000 R add bin,ax
00CF out1:
00CF 59 pop cx
00D0 58 pop ax
00D1 C3 ret
00D2 asctobin endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; hanoi子程序
00D2 hanoi proc near
00D2 50 push ax ;保存工作
00D3 52 push dx
00D4 55 push bp
00D5 8B EC mov bp,sp ;堆栈顶指针 发到bp
00D7 B8 0001 mov ax,1
00DA 3B 46 0E cmp ax,word ptr [bp+14] ;将个数和1比较,前面工push了7次
00DD 74 02 je equal
00DF EB 33 jmp unequal
00E1 equal: ;个数为1 则输出 第2个参数符号-->第4个参数符号
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;下面是进行步骤记数
00E1 8D 36 000C R lea si,chnum+10
00E5 loopnum0:
00E5 32 E4 xor ah,ah
00E7 4E dec si
00E8 8A 04 mov al,[si]
00EA 04 01 add al,1
00EC 37 aaa ;如果有进位ah=1 ,al=相加后的树,如:3+9 -> al=2.ah=1
00ED 88 04 mov [si],al
00EF 80 FC 01 cmp ah,1
00F2 74 F1 je loopnum0 ;如果ah=1,说明有进位,将si向前移动一位,进行加1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
00F4 8B 56 0C mov dx,word ptr[bp+12] ;输出'a'
00F7 B4 02 mov ah,2 ;输出字符
00F9 CD 21 int 21h
00FB 8D 16 0013 R lea dx,strshow ;输出键号
00FF B4 09 mov ah,09h
0101 CD 21 int 21h
0103 8B 56 08 mov dx,word ptr [bp+8] ;输出'c'
0106 B4 02 mov ah,02h
0108 CD 21 int 21h
010A 8D 16 0017 R lea dx,chline
010E B4 09 mov ah,09h
0110 CD 21 int 21h
0112 EB 57 jmp exit
0114 unequal: ;个数>1
0114 8B 46 0E mov ax,[bp+14] ;个数发到AX
0117 83 E8 01 sub ax,1 ;个数-1
011A 50 push ax ;参数
011B FF 76 0C push [bp+12]
011E FF 76 08 push [bp+8]
0121 FF 76 0A push [bp+10]
0124 E8 FFAB call hanoi ;n-1个移动到b
0127 8D 36 000C R lea si,chnum+10 ;下面是把a->c,
012B loopnum1:
012B 32 E4 xor ah,ah
012D 4E dec si
012E 8A 04 mov al,[si]
0130 04 01 add al,1
0132 37 aaa
0133 88 04 mov [si],al
0135 80 FC 01 cmp ah,1
0138 74 F1 je loopnum1
013A 8B 56 0C mov dx,word ptr [bp+12] ;下面是输出
013D B4 02 mov ah,2
013F CD 21 int 21h
0141 8D 16 0013 R lea dx,strshow
0145 B4 09 mov ah,09h
0147 CD 21 int 21h
0149 8B 56 08 mov dx,word ptr [bp+8]
014C B4 02 mov ah,02h
014E CD 21 int 21h
0150 8D 16 0017 R lea dx,chline
0154 B4 09 mov ah,09h
0156 CD 21 int 21h
0158 8B 46 0E mov ax,[bp+14] ;然后再把n-1个由 第2个参数符号-->第4个参数符号
015B 83 E8 01 sub ax,1
015E 50 push ax
015F FF 76 0A push [bp+10]
0162 FF 76 0C push [bp+12]
0165 FF 76 08 push [bp+8]
0168 E8 FF67 call hanoi
016B exit:
016B 5D pop bp
016C 5A pop dx
016D 58 pop ax
016E C2 0008 ret 8
0171 hanoi endp
0171 code ends
end start
Microsoft (R) Macro Assembler Version 6.11 04/25/08 08:59:01
C:\DOCUME~1\ADMINI~1\桌面\243200~2\hanoi\hanoi.asm Symbols 2 - 1
Segments and Groups:
N a m e Size Length Align Combine Class
code . . . . . . . . . . . . . . 16 Bit 0171 Para Private
data . . . . . . . . . . . . . . 16 Bit 0061 Para Private
Procedures, parameters and locals:
N a m e Type Value Attr
asctobin . . . . . . . . . . . . P Near 0098 code Length= 003A Private
hanoi . . . . . . . . . . . . . P Near 00D2 code Length= 009F Private
main . . . . . . . . . . . . . . P Far 0000 code Length= 0098 Private
Symbols:
N a m e Type Value Attr
actlen . . . . . . . . . . . . . Byte 005A data
bin . . . . . . . . . . . . . . Word 0000 data
chinput . . . . . . . . . . . . Byte 005B data
chline . . . . . . . . . . . . . Byte 0017 data
chnum . . . . . . . . . . . . . Byte 0002 data
chtimes1 . . . . . . . . . . . . Byte 003F data
chtimes2 . . . . . . . . . . . . Byte 0051 data
equal . . . . . . . . . . . . . L Near 00E1 code
exit . . . . . . . . . . . . . . L Near 016B code
inputlist . . . . . . . . . . . Byte 0059 data
l2 . . . . . . . . . . . . . . . L Near 00AA code
l3 . . . . . . . . . . . . . . . L Near 00B7 code
loopagain . . . . . . . . . . . L Near 0005 code
loopend . . . . . . . . . . . . L Near 0094 code
loopnum0 . . . . . . . . . . . . L Near 00E5 code
loopnum1 . . . . . . . . . . . . L Near 012B code
maxlen . . . . . . . . . . . . . Byte 0059 data
multfact . . . . . . . . . . . . Word 005F data
notadd . . . . . . . . . . . . . L Near 005C code
one . . . . . . . . . . . . . . Word 000D data
out1 . . . . . . . . . . . . . . L Near 00CF code
prompt . . . . . . . . . . . . . Byte 001A data
put0 . . . . . . . . . . . . . . L Near 008B code
shownum . . . . . . . . . . . . L Near 0054 code
start . . . . . . . . . . . . . L Near 0000 code
strshow . . . . . . . . . . . . Byte 0013 data
three . . . . . . . . . . . . . Word 0011 data
two . . . . . . . . . . . . . . Word 000F data
unequal . . . . . . . . . . . . L Near 0114 code
0 Warnings
0 Errors
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -