.386
.model flat
.stack 4096
include io.h
ExitProcess proto near32 stdcall, ExitCode:dword
cr equ 0dh
lf equ 0ah
.data
string1 byte "请输入汉诺塔数:", cr, lf
strNum byte 10 dup(?)
result byte 10 dup(' ')
byte cr, lf, 0
.code
;递归时注意:在每一层的递归中,保证ebp基址指针的只是一样的(如果你使用了它)
Hanoi Proc near32
push ebp
mov ebp, esp
mov ecx, [ebp+20];得到当前剩余的砖块的数目
jecxz Finish
;完成n-1块从a柱子借助c柱子移向b柱子
dec ecx
push ecx
pushd [ebp+16]; a
pushd [ebp+8]; c
pushd [ebp+12]; b
call Hanoi
add esp, 16;移除参数 a, b, c, 和砖块数目
;完成a柱子上的最后一块移向c柱子
mov al, [ebp+16];得到a柱子的编号
mov result, al
mov al, '-'
mov result+1, al
mov al, '>'
mov result+2, al
mov al, [ebp+8];得到c柱子的编号
mov result+3, al
output result;输出移动结果
;完成n-1块从b柱子借助a柱子移向c柱子
mov ecx, [ebp+20]
dec ecx
push ecx; 得到剩下的盘子
push [ebp+12]; b
push [ebp+8]; c
push [ebp+16]; a
call Hanoi
add esp, 16;移除参数
Finish:
pop ebp;还原ebp指针
ret ;
Hanoi Endp
_start:
output string1
input strNum, 10
atod strNum
push eax;初始化操作
pushd 'a'
pushd 'b'
pushd 'c'
call Hanoi
invoke ExitProcess, 0
public _start
end