微机原理课程设计学校:太原理工大学学院:信息工程学院设计题目:国际象棋棋盘绘制程序专业班级:姓名:学号:2一.课程设计的题目:国际象棋棋盘绘制程序二.程序功能简述本程序在屏幕上左侧绘制一个红黑相间的国际象棋棋盘,右侧绘制一个汉字‘棋’,棋字的四个角有角框。显示完后,按q退出。运行本程序后,从屏幕左上角开始,棋盘的奇数行位置逐行出现彼此相间15个像素宽的红色块(虚的),共出现五行,每行五个红色块,然后从第一行的第一个色块的右下角开始,在棋盘的偶数行位置逐行出现彼此相间15个像素宽的红色块(虚的),每行四块,共四行。其中红色块由8X8个彼此相间一个像素的红点组成,前一个色块和后一个色块之间有一定的显示时间间隔。然后,屏幕的右侧会按‘棋’的笔画顺序,一笔一画的显示汉字‘棋’,其中前一笔和后一笔之间有一定的显示时间间隔。然后按先横后竖的顺序,在棋字的四个角的斜上方显示四个角框。笔画同样有时间间隔。显示完后,若在键盘上输入q,则程序退出。三.主要设计思想简述本程序主要通过调用10H号BIOS中断的0CH号功能点调用来显示图像。将要显示点的坐标(line,cow)分别传送到dx,cx,然后将点的颜色代码传送al,接着调用10H号BIOS中断的0CH号功能,一个点就显示出来。显示矩形块以及笔画(横,竖,撇,捺)是先确定第一个点的坐标后,然后让点的行坐标line,列坐标cow按某种方式循环,每次循环后调用10H号BIOS中断的0CH号功能来完成点的显示。全部循环完后,这些点的排列就是要显示的矩形块或笔画。所以,点的行坐标line,列坐标cow的循环方式就决定了要显示的图像。显示矩形块(虚的)的循环方式是:line,cow都循环,line在外层,循环一次加2,cow在内层,循环一次加2,line循环的次数决定了方块的高,cow循环的次数决定了方块的宽。笔画横的循环方式是:只cow循环,循环一次加1,循环的次数决定了笔画横的长度。笔画竖的循环方式是:只line循环,循环一次加31,循环的次数决定了笔画竖的长度。笔画撇的循环方式是:line,cow都循环,在同一层。循环一次line加1,cow减1。循环的次数决定了笔画撇的长度笔画捺的循环方式是:line,cow都循环,在同一层。循环一次line加1,cow加1。循环的次数决定了笔画捺的长度。第一个点的坐标,循环方式,循环的次数决定了要显示的图形的位置,形状,尺寸。将位置不同的矩形块(虚的)按照棋盘的几何结构显示出来,就构成了棋盘。将位置,长度不同的笔画(横,竖,撇,捺)按照棋字的几何结构显示出来,就构成了棋字。边框同理。三.程序流程图4567。8四.源程序代码DATASEGMENTLINEDW0;矩形块左上角的行ROWDW0;矩形块左上角的列PIXDB10;矩形块的颜色NDW?;文字笔画的长度PIX_ADB11;文字笔画的颜色DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:;主程序MOVAX,DATAMOVDS,AXMOVAH,0MOVAL,4INT10H;设置320×200彩色图形方式movah,0bhmovbh,01movbl,0int10hKUAIMACROR,L,N;定义显示矩形块阵列宏LOCALLA,LBMOVROW,RMOVLINE,Lmovdi,N9LA:MOVCX,NLB:CALLDISP_RECTcalldelayADDrow,30LOOPLBMOVROW,Raddline,30DECDIJNZLAENDMHONG1MACROL,R,NUM,CHEN;定义显示笔画宏MOVLINE,LMOVROW,RMOVN,NUMCALLCHENCALLdelay1ENDMKUAI0,0,5;显示棋盘奇数行KUAI15,15,4;显示棋盘偶数行HONG130,165,21,HENG;显示‘棋’字HONG115,176,60,SHUHONG131,175,10,PIANHONG132,178,5,NAHONG130,191,30,HENGHONG115,196,45,SHUHONG115,214,45,SHUHONG140,196,19,HENG10HONG150,196,19,HENGHONG160,191,30,HENGHONG163,200,10,PIANHONG163,210,12,NAHONG110,160,5,HENG;显示角框HONG110,160,5,SHUHONG110,223,5,HENGHONG110,228,5,SHUHONG180,160,5,HENGHONG175,160,5,SHUHONG180,223,5,HENGHONG175,228,6,SHUL5:movah,8;按q返回DOSint21hcmpal,'q'JNEL5MOVAH,4CHINT21HDISP_RECTPROCnearPUSHAXPUSHCXPUSHDXPUSHSIPUSHDIMOVAH,0CH;指明写点调用MOVAL,PIX;取点的颜色11MOVDI,8;用于控制行显示循环MOVDX,LINE;取点的行坐标DISP_2:MOVSI,8;控制列显示循环MOVCX,ROW;取显示点的列坐标DISP_1:INT10H;完成点的显示INCCXinccx;列坐标加2DECSIJNZDISP_1;循环显示完一行INCDXincdx;行坐标加2DECDIJNZDISP_2;循环显示完8行POPDIPOPSIPOPDXPOPCXPOPAXRETDISP_RECTENDPDELAYPROCNEAR;延时子程序PUSHCXPUSHDXMOVDX,2500D11:MOVCX,25000D12:LOOPD12DECDXJNZD11POPDX12POPCXRETDELAYENDPDELAY1PROCNEAR;延时子程序1PUSHCXPUSHDXMOVDX,10000D11A:MOVCX,25000D12A:LOOPD12ADECDXJNZD11APOPDXPOPCXRETDELAY1ENDPHENGPROCnear;笔画横的子程序PUSHAXPUSHCXPUSHDXPUSHSIPUSHDIMOVAH,0CH;指明写点调用MOVAL,PIX_A;取点的颜色MOVDX,LINE;取点的行坐标MOVSI,N;控制列显示循环MOVCX,ROW;取显示点的列坐标DISP_3:INT10H;完成点的显示inccx;列坐标加1(行不变)DECSI13JNZDISP_3;循环显示完一行POPDIPOPSIPOPDXPOPCXPOPAXRETHENGENDPSHUPROCnear;笔画竖的子程序PUSHAXPUSHCXPUSHDXPUSHSIPUSHDIMOVAH,0CH;指明写点调用MOVAL,PIX_A;取点的颜色MOVDI,N;用于控制行显示循环MOVDX,LINE;取点的行坐标MOVCX,ROW;取显示点的列坐标DISP_4:INT10H;完成点的显示incDX;行坐标加1(列不变)DECDIJNZDISP_4;循环显示完一列POPDIPOPSIPOPDXPOPCXPOPAXRET14SHUENDPPIANPROCnear;笔画撇的子程序PUSHAXPUSHCXPUSHDXPUSHSIPUSHDIMOVAH,0CH;指明写点调用MOVAL,PIX_A;取点的颜色MOVDI,N;用于控制撇的长度MOVDX,LINE;取点的行坐标MOVCX,ROW;取显示点的列坐标DISP_5:INT10H;完成点的显示DECcx;列坐标减1incDX;行坐标加1DECDIJNZDISP_5POPDIPOPSIPOPDXPOPCXPOPAXRETPIANENDPNAPROCnear;笔画捺的子程序PUSHAXPUSHCXPUSHDX15PUSHSIPUSHDIMOVAH,0CH;指明写点调用MOVAL,PIX_A;取点的颜色MOVDI,N;用于控制显示循环MOVDX,LINE;取点的行坐标MOVCX,ROW;取显示点的列坐标DISP_6:INT10H;完成点的显示INCcx;列坐标加1incDX;行坐标加1DECDIJNZDISP_6POPDIPOPSIPOPDXPOPCXPOPAXRETNAENDPCODEENDSENDSTART五.总结报告①课程设计中所遇到的主要问题和解决方法。首先遇到的问题是程序的调试,我把程序写好并检查后没发现错误,然后上机汇16编却发现5个警告错误,看错误类型号,都是英语,看不懂,幸好课本后部附录里有翻译,这个问题解决了,但我还是不知道错误的那几行哪里错,看起来很正确。最后。经过思考和耐心检查,终于解决了,原来其中一行把宏实参0写成了O(读欧),这一行的错误导致了其他行的错误。调试程序确实需要耐心,这个错误很简单,但太隐蔽了,检查了20分钟,差点没抓狂。然后遇到的问题是画流程图,由于以前没画过,也不知道用什么软件,就去网上搜索,于是发现了windowsoffice套件中的Visio。Visio确实很好用,操作很简单,容易上手,画出的图很漂亮,流程图终于完成了。②创新和得意之处。这个程序是仿写的,但基本上只是借鉴了它的方法,95%的内容是重写的,增加了许多东西和功能。我觉的自己的这个程序比较起来还是简洁的,设计了两个宏和五个子程序来实现各种功能,然后在主程序中调用。代码看起来比较整齐,条理,如果要显示别的图像,只要在主程序中改一下宏的参数就可以了。③课程设计中存在的不足,需要进一步改进的设想。这个程序还是不够精练,五个图形子程序有许多相似的地方,功能区别不大,加上些判断,应该可以合并成一个子程序,两个延时子程序除了参数,其实是一个子程序,也可以合并成一个子程序,这样用内存会少很多。④课程设计的感想和心得体会。课程设计做完了,之前觉的很难,但做完以后,又感觉很简单,最起码对我的这个程序来说。曾经的困惑现在已经成了知识,有一种成就感。可以说,我享受了一次微机原理课程设计。对此而言,前几天的辛苦和思考都是值得的。真希望这样的课程设计能多些。在课程设计中,感觉真正的学到了东西。以前书本上的知识得到融会贯通,更加透彻的理解了知识间的联系。指令系统也更熟悉了,看来学编程只有两种方法,看程序,写程序,先看后写。在课程设计中,第一次领会到汇编语言的美妙。简洁,精确,效率,这就是汇编。汇编的简洁和对硬件的精确控制给我留下很深的映象。实现同样的功能,用c的17话编译出来也许得30条指令,但用汇编5,6条就解决了。写汇编程序时似乎可以看到cpu在如何工作。终于理解了学微机原理为什么要学汇编了。