博文
汇编实现八皇后(2007-04-02 08:15:00)
摘要:;程序功能:用深度优先搜索法解决八皇后问题并打印结果.;列数行数分别用1-8标记.所以八皇后的位置申请了9个
;调试感慨:汇编调试实在麻烦,不像C中在任何地方加个printf就可以知道;哪错了.跳来跳去的,不知哪里死循环了,实在不好调试.
.model small,stdcall
;由于皇后位置都是一位数,所以加上30H后作字符打印出. printResult macro local again,print,first push si ;不能改变它的值.
mov ah,02h ;输出状态不变. mov cx,2 ;对称的结果,所以打两个结果.again: mov si,1 print: mov dl,queen[si] cmp cx,2 je first mov bl,9 sub bl,dl mov dl,blfirst: add dl,30h int 21h inc si cmp si,9 ;到第9个就是说打完了. jnz print mov dl,' ' ;输出两个空格,为好看. int 21h int 21h loop again
pop si endm
.data ;改来改去,何必那么小气呢?用9个多方便,就一个字节,不必这么小气! queen db 9 dup(0) used db 9 dup(0) Nresult dw 0 ;结果的个数.
prompt db "The positions are:",0ah,0dh,'$' over db 0ah,0dh,"The number of the result is $".code
;函数功能:把存在ax寄存器里的二进制数用十进制打印出来.printaxd proc near mov bx,10000d ;二个字节的数最大就3万多. mov ch,0 ;还没出现第一个要打印的数(最高位的非0不需要打印) mov cl,5 ;最多有五位,所以一共除五次.&nbs......
汇编实现汉诺塔(2007-04-02 08:14:00)
摘要:;程序功能:用非递归实现汉诺塔.
;几日后,同学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 ;弹出一个移动打印.;但到底有没有弹得出来的呢?如果结束了......
