博文

汇编实现八皇后(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......

阅读全文(3889) | 评论:1

汇编实现汉诺塔(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  ;弹出一个移动打印.;但到底有没有弹得出来的呢?如果结束了......

阅读全文(3522) | 评论:0