正文

汇编实现汉诺塔2007-04-02 08:14:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/freeeerf/24536.html

分享到:

;程序功能:用非递归实现汉诺塔. ;几日后,同学stone提出这个算法所需要的堆栈大小与n是线性关系,;初晒,讨论后再想,是的,的确是线性关系,并且所以需大小为(n-1)*8 ;经试验:结论正确. .model small,stdcall .data a dw 0 ;天啊,既然要push进去,当然要用dw啊.遗漏啊!!!!! b dw 0 cc dw 0 ;为什么标识符不能用c呢? n dw 0 ;汉诺塔的层数.具体在第29行设置. store dw 0 ;尚装在堆栈里的移动次数. prompt db "A good game:",0ah,0dh,'$' over db 0ah,0dh,"Press key to continue...$" .code main proc far mov ax,@data mov ds,ax  lea dx,prompt ;print the prompt mov ah,09h int 21h  mov store,0 mov a,'1' ;这样都行,难道编译器把它用常量替换了? mov b,'2' mov cc,'3'   ;设置汉诺塔的层数 mov n,6 go: cmp n,1 je next push a push b push cc push n inc store  ;换值. mov ax,b xchg ax,cc mov b,ax dec n jmp go next: ;打印一次移动. mov ah,02h mov dx,a int 21h mov dl,'-' int 21h mov dl,'>' int 21h mov dx,cc int 21h mov dl,' ' int 21h  ;弹出一个移动打印.;但到底有没有弹得出来的呢?如果结束了,就没得弹了 ;如果结束了还弹就会在运行时弹出"无效指令"的错误报告. cmp store,0 jz exit ;如果没得弹的了就移完了. pop n pop cc pop b pop a dec store mov dx,a int 21h mov dl,'-' int 21h mov dl,'>' int 21h mov dx,cc int 21h mov dl,' ' int 21h  ;换值. mov ax,a xchg ax,b mov a,ax dec n jmp go exit: lea dx,over ;print the prompt mov ah,09h int 21h  mov ah,01h ;to have a stop int 21h  mov ah,4ch ; Game Over int 21hmain endpend main

阅读(3522) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册