ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:89.70KB ,
资源ID:7356594      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7356594.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(葛磊课程设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

葛磊课程设计.docx

1、葛磊课程设计郑州航空工业管理学院微机原理与接口技术课程设计报告题 目 用字符组成汽车图形在屏幕显示从左向右开动的汽车 姓 名 葛磊 学 号 110607111 同组成员 郭振乾 姬恩泽 指导教师 王春彦 二一 三 年 12 月 12 日一.设计任务要求:利用汇编语言进行动态图形设计。内容:小车在公路上行驶,从屏幕左侧驶向右侧。在到达屏幕右侧 ,公路下降一段距离并改变颜色,然后小车继续由左向右行驶驶。当下降到屏幕底部时,又返回到屏幕顶部重复上述过程,直到有键按下。公路和小车的颜色不样。也要用INT 10H功能。二程序流程图及设计思路本程序主要分三段:数据段,堆栈段及代码段。其中数据段定义了小车的

2、图形集,堆栈段定义了堆栈空间,代码段执行各种功能,大体包括显示图形,延时,移动图形,清屏等,用三个循环实现动画整个功能:一、让小车从屏幕左侧跑到右侧二、让小车不断从屏幕上端跳到下端三、不断重复这一屏。定义了清屏、输出字符的宏,定义了显示小汽车和移动小汽车的子程序。本次动态图形设计,调用CRT显示功能实现。调用BOIS int 10h中断的相关功能,具体用以下步骤进行:1.确定小车由哪些字符组成。2.在设定的屏幕上显示小车图形。3.延迟一个时间周期,使动态图形更清晰。4.清除图形。 5.改变图形的行列坐标,修改图形显示位置,重复2、3、4步骤。6.写一个循环子程序,让小车从屏幕左侧行驶到屏幕右侧

3、。7.用loop指令,改变行坐标,让小车从屏幕的上一端跳到屏幕的下一端,重复执行,显示一屏。8用loop指令,不断重复这一屏。我的程序还有一个小技巧,清屏的时候不是像别人那样写长串代码,而是通过重新设置显示方式来清屏,这样程序变得简单。数学和逻辑推理对程序设计的重要性,找到简单、合适高效的算法可以大大节约程序运行时间和空间,优化了程序,提高程序运行效率,对于一个优秀的程序员来说非常重要。流程图如下: 三.程序设计及其调试 clear macro sch,scl,sdh,sdl,sbh ;清屏宏定义 mov ah,0 ; 设置显示方式为640*350彩色图形方式 mov al,10h int 1

4、0h mov ah,6 ;调用6号功能设置整个屏幕为bh值所对应的属性 sub al,al mov al,1 ;设置滚动行数为1 mov ch,sch ;窗口左上角(0行,0列) mov cl,scl mov dh,sdh ;窗口右下角(dh,79),行号dh每次加3 mov dl,sdl mov bh,sbh ; 道路属性,bh每次加1 int 10h endm show_str macro tishi ;输出字符宏定义 lea dx,tishi mov ah,09 int 21h endm;- data segment tishi1 db Welcome to run this progr

5、am. ,0dh,0ah,$ tishi2 db 13,10,$ tishi3 db This is producted by houjie $ tishi4 db 13,10,$ tishi5 db Now,input 1 or 2 to run this program(function 1:show a running car, function 2 :exit):,0dh,0ah,$ car db 8 ;小汽车的字符组合图形字符 db 0dch,0bh,0,0 db 4 dup(0dbh,15,0,1) db 0dch,0bh,0,0 db 4fh,7,1,-1 db 4fh,7,0,

6、-2 char_cnt dw ? pointer dw ? ;指针存偏移地址 line db ? ;存行号 column db ? ;存列号 data ends ;-stack segment stack db 200 dup(?) stack ends ;堆栈缓冲区;-code segment assume cs:code,ds:datastart: mov ax,data mov ds,ax mov ah,0 ; 设置显示方式为640*350彩色图形方式 mov al,10h int 10h show_str tishi1 ; 在显示器上显示字符串提示信息 show_str tishi2

7、show_str tishi3 show_str tishi4 show_str tishi5 mov ah,01h ;输入1或者2 int 21H cmp al,31h ;比较输入的字符是否为1 jne a ;不是1则转移到a call showcar sub ax,ax a :cmp al,32h ;比较输入的字符是否为2 jne start b : mov ah,4ch ;终止当前程序并返回调用程序 int 21h ;-showcar proc near ;显示小汽车子程序 mov ah,0 ; 设置显示方式为640*350彩色图形方式 mov al,10h int 10h push d

8、x push bx cmp ax,ax ;zf标志位置1 sub si,si mov dh,3 mov bh,7 next: cmp dh,22 ;公路是否退至屏幕底端? jb next1 sub dh,dh mov dh,3 next1: mov ah,01h ;检查键盘缓冲区中有无输入字符(zf是否等于0) int 16h jne fh ;zf等于0则退出程序 ;实现下移公路并改变颜色 clear 0,0,dh,79,bh ; 清屏宏调用 lea di,car ;di指向字符图形表 push dx call car_move cmp si,1 je fh pop dx pop ax add

9、 dh,3 add bh,1 cmp bh,8 ;循环改变公路的颜色 jb bs sub bh,bh mov bh,1 bs: mov ah,01h ;检查键盘缓冲区中有无输入字符(zf是否等于0) int 16h jne fh ;zf等于0则退出程序 jmp next fh: ret showcar endp;-car_move proc near ;移动子程序 push ax push bx push cx sub dh,2 ;从第2行1列位置开始显示汽车 mov dl,0 push dx push di mov ah,0fh ;取当前显示方式 int 10h sub ch,ch mov

10、cl,di ; cl存放字符个数 inc di ; di指向字符图形表中的第一个字符 mov char_cnt,cx ;存值 mov pointer,di mov line,dh mov column,dl locationnew_next: mov ah,01h ;检查键盘缓冲区中有无输入字符(zf是否等于0) int 16h jne exit3 ;zf不等于0执行exit3,等于0则退出程序 add dh,di+2 ;改变行列坐标 add dl,di+3 cmp dl,80 ;小车超过屏幕与否? jb show_string pop di pop dx pop cx pop bx pop

11、ax jmp exit2 show_string: mov ah,2 ;重新置光标位置 int 10h mov al,di ;取字符值,显示小车 mov bl,di+1 ;取字符属性,移动了小车 push cx mov cx,1 mov ah,09 ;显示字符 int 10h pop cx add di,4 ; di指向下一个字符 loop locationnew_next call delaytime call erase ;擦除,小车显示到下一位置 jmp short locationnew_next exit2 :ret exit3: mov si,1 jmp exit2 car_mov

12、e endp ;-erase proc near ;擦除子程序 mov cx,char_cnt mov di,pointer mov dh,line mov dl,column erase_next : add dh,di+2 add dl,di+3 mov ah,2 int 10h mov al,di mov bl,0 push cx mov cx,1 mov ah,9 int 10h pop cx add di,4 loop erase_next mov cx,char_cnt mov di,pointer mov dh,line inc column mov dl,column ret

13、erase endp;-delaytime proc near ; 延时子程序 push cx push dx mov dx,20000 ;最大到65530dly1 : mov cx,6801 dly2 : loop dly2 dec dx jnz dly1 pop dx pop cx ret delaytime endp ;-code endsend start(一)定义一个清屏宏clear,并且定义哑元sch, scl,sdh,sdl,sbh进行传参引用。代码具体分析如下:mov ah,0 ; 设置显示方式为640*350彩色图形方式mov al,10h int 10h mov ah,6

14、;调用6号功能设置整个屏幕为bh值所对应的属性 sub al,al mov al,1 ;设置滚动行数为1 mov ch,sch ;窗口左上角(0行,0列) mov cl,scl mov dh,sdh ;窗口右下角(dh,79),行号dh每次加3 mov dl,sdl mov bh,sbh ; 道路属性,bh每次加1 int 10h sch和scl分别显示左上角的行和列,sdh和sdl分别显示右上角的行和列,sbh表示显示道路属性。定义清屏宏方便以后的程序多次调用,可简化程序结构、增加源程序的可读性、提高源程序的可维护性。 此程序显示方式均设为640*350彩色图形方式(二)定义输出字符宏sho

15、w_str,哑元tishi进行传参,lea dx,tishi,将tishi的有效地址放入dx里面再显示出来。(三)界面提示输入,用call指令调用showcar子程序,主要代码如下:mov ah,01h ;输入1或者2 int 21H cmp al,31h ;比较输入的字符是否为1 jne a call showcar sub ax,ax a : cmp al,32h ;比较输入的字符是否为2 jne start b : mov ah,4ch ;终止当前程序并返回调用程序 int 21h 输入1或者2,cmp指令判断输入的是1的话,则调用子程序showcar,若不是则跳转到标号a进行cmp指令

16、判断是否是2,若是2则推出程序,若不是则返回初始。(四)显示小汽车子程序,定义showcar子程序,并且实现下移公路改变颜色。1、 mov ah,1 ; 设置显示方式为640*350彩色图形方式 mov al,10h int 10h push dx push bx cmp ax,ax ;zf标志位置1 sub si,si mov dh,3 mov bh,7 next: cmp dh,22 ;公路是否退至屏幕底端? jb next1 sub dh,dh mov dh,3 next1: mov ah,01h ;检查键盘缓冲区中有无输入字符(zf是否等于0) int 16h jne fh ;zf等于

17、0则退出程序将标志位置1,设置7行,每行间隔3,屏幕为22行,比较公路是否退至屏幕底端,若是则返回屏幕最上面,若不是则跳到标号next1,检查键盘缓冲区中有无输入字符(zf是否等于0),zf不等于0则显示小车,否则执行fh推出程序。2、实现下移公路并改变颜色,调用清屏宏clear和call指令调用car_move子程序。clear 0,0,dh,79,bh ; 清屏宏调用 lea di,car ;di指向字符图形表 push dx call car_move cmp si,1 je fh pop dx pop ax add dh,3 add bh,1 cmp bh,8 ;循环改变公路的颜色 j

18、b bs sub bh,bh mov bh,1 bs: mov ah,01h ;检查键盘缓冲区中有无输入字符(zf是否等于0) int 16h jne fh ;zf等于0则退出程序 jmp next 实现公路颜色的改变,小车每次跳转一次就改变一次公路颜色。比较si中的值是否是1,若等于就执行fh推出程序,不是1,就道路坐标增加3行,bh加1。cmp指令循环改变公路颜色,bh小于8执行bs,否则bh清零。(五)小车移动子程序car_move,让小车从屏幕左侧跑到右侧,让小车不断从屏幕上端跳到下端调用了延时delaytime子程序和擦出子程序erase,此处可以通过改变di和小车初始位置实现小车从

19、不同位置不同方向移动。 mov ah,0fh ;取当前显示方式 int 10h sub ch,ch mov cl,di ; cl存放字符个数 inc di ; di指向字符图形表中的第一个字符 mov char_cnt,cx ;存值 mov pointer,di mov line,dh mov column,dl locationnew_next: mov ah,01h ;检查键盘缓冲区中有无输入字符(zf是否等于0) int 16h jne exit3 ;zf不等于0执行exit3,等于0则退出程序 add dh,di+2 ;改变行列坐标 add dl,di+3 cmp dl,80 ;小车超

20、过屏幕与否? jb show_string pop di pop dx pop cx pop bx pop ax jmp exit2 show_string: mov ah,2 ;重新置光标位置 int 10h mov al,di ;取字符值 ,即小车 mov bl,di+1 ;取字符属性 ,移动了小车 push cx mov cx,1 mov ah,09 ;显示字符 int 10h pop cx add di,4 ; di指向下一个字符 loop locationnew_next call delaytime ;调用延时子程序 call erase ;调用擦除子程序,小车显示到下一位置 jm

21、p short locationnew_next exit2 : ret exit3: mov si,1 jmp exit2 car_move endp设置从第2行1列位置开始显示汽车,mov ah,ofh取当前显示方式,将ch清零,把di寄存器的值放入cl,之后di自加1,将cx,di,dh,dl分别放入寄存器保存。再检查键盘缓冲区中有无输入字符(zf是否等于0),zf等于0则退出,不等于0则执行exit3跳到该子程序开始位置。改变行列坐标。cmp指令判断小车是否超过屏幕,若没超过则执行show_string,重新置光标位置,取组成小车的字符值和字符属性,再显示在屏幕上,形成一个图形。Loo

22、p循环locationnew_next,此时调用延时子程序使图形更加清晰,之后调用擦除子程序,使小车显示到下一个位置。这样显示的最终结果就是小车在公路上跑。流程图如下:(六)定义擦除子程序erase,主要代码如下:erase_next : add dh,di+2 add dl,di+3 mov ah,2 ;置光标位置 int 10h mov al,di mov bl,0 ;清零,小车在该位置不再显示 push cx mov cx,1 mov ah,9 int 10h pop cx add di,4 ;地址后移一个字符,即小车移动 loop erase_next ;这是我的程序的一个小技巧,清屏

23、的时候不是像别人那样写长串代码,而是通过重新设置显示方式来清屏,这样程序变得简单。分别将char_cnt,pointer,line,column保存到相应的寄存器,将行地址加2,将列的地址加3,再置光标位置,将di中的值放入al,之后将bl清零,即小车就不再在该位置显示。地址后移一个字符,这样就实现了小车的移动。再执行loop循环,使小车能在公路上跑。(七)定义延时子程序delaytime主要代码如下:delaytime proc near ; 延时子程序 push cx push dx mov dx,20000 ;最大到65530 dly1 : mov cx,1000 ;延时时间 dly2

24、: loop dly2 dec dx jnz dly1设置小车延时1秒,dx每次自减1,当dx不等于0时则进行loop循环该部分,否则返回。此处可以通过改变延时时间来改变小车运动的速度程序运行结果主界面如图所示 公路下移并改变颜色,如下图 五、总结及心得一周的课程设计,让我基本上掌握了子程序的调用与运用;它不但大大减化了程序代码,使程序的逻辑性大大加强。汇编语言是一门与硬件直接打交道的语言,因此很多操作功能的使用需要反复调用,为此,程序显得十分烦琐,通过子程序的调用,可将这些重复的步骤,加以简化,为内存节省空间。可是,子程序也有弱点,它的形式参数只能为操作数与地址,当数据交错时,容易出错,于是

25、又引入了一个概念:宏。宏必须先定义,后调用,它的形式参数比较灵活,但是它不能节省空间。因此,我们常常要用宏与子程序相互联系起来。使我们的程序不断的优化,达到更好的效果,此外,对于数据缓冲区里的内部结构了解掌握也是非常重要的,这将是一个飞跃,因为它会使得我们对数据的处理更加的精准。通过编程和对编程过程中遇到的问题的思考,有效的提高了我对汇编的认识和理解,切实的提高了我的编程能力,补全了我的不足。通过这次课程设计,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握了各个指令的功能,特别是转向指令,以及正确地运用DEBUG指令。在整个程序的编写中,调试占了很大部分的时间

26、。要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟练的掌握debug命令,这对程序的调试是非常重要的。通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。设计过程中暴露出了自己的一些问题,动手和实践能力不足,知识上还有许多漏洞,缺乏大型程序的开发经验,理论联系实际的能力更有待提高。希望随着以后设计的增多,阅历的增长,能够逐渐弥补这些不足对我而言,知识上的收获重要,精神上的丰收更加可喜。以前特别讨厌编程,坐在电脑前面就头疼,根本找不到方法,这次之后我体会到,原来自己看懂程序之后再修改,会有很大的成就感,很开心。也让我知道了学无止境的道理,我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1