汇编语言专题实验报告.docx
- 文档编号:11643596
- 上传时间:2023-03-29
- 格式:DOCX
- 页数:9
- 大小:150.86KB
汇编语言专题实验报告.docx
《汇编语言专题实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言专题实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
汇编语言专题实验报告
汇编语言专题实验报告
设计题目:
键盘打字游戏
姓名:
班级:
计算机85
学号:
2008055126
2010年11月28日
1、对课程设计的认识
制作这款打字小游戏是为了对汇编语言程序设计有一个更深刻的了解,将所学的知识应用于实践,提高自己的编程水平。
鉴于用汇编语言编程的复杂性,为了使游戏能够实现自己预先的构想,所以自创了这款相对比较简单的打字游戏。
在游戏制作工作中会应用到80x86的指令系统和寻址方式,输入输出程序设计等,涉及到的知识领域还是很全面的,所以在通过完成这次编程,相信能得到不小的提高。
2、功能需求描述
经过多次尝试和验证,本程序大体能实现一下功能:
1、出现菜单主界面,按回车键出现由26个字母组成的乱序行,这时其中任一个字母落下;
2、在键盘上敲入该字母,如果输入正确,字母消失;
3、按ESC键返回主界面;
4、按空格键暂停;
5、按‘E’退出。
3、程序方案设计
程序首先通过宏的定义以及调用宏来画出游戏边框,再通过定义一个函数并调用MOVAH,09INT21H来显示字符串,DS:
DX定义字符串位置。
游戏主程序调用BIOSINT10的9号功能实现对目标文本的颜色和定位。
游戏主程序可以用MOVAH,00INT16H从键盘读取输入的字符再调用MOVAH,01INT21H让键盘输入显示在屏幕中AL=输入的字符,用CMP指令对输入的文本和目标文本进行比较,再利用选择语句在打错字符后对wrong的基数加1,在打对字符后对right的基数加1,并调用清屏函数clear将该字符消除。
对于要求柱形图实时显示正确和错误的数目,可以通过利用“*”在竖向上叠加来实现,字符串结束后直接退到dos环境。
整体设计方案流程图
4、程序详细设计
1、程序流程详细说明
首先运行程序,进入主界面,通过键盘输入字符,先判断是否是“E”,是则直接退出,如果不是“E”,则进入下一步判断是否为数字1,是就按速度1
下落字母,否就进入下一步判断,是否为数字2,是就按速度2下落字母,否就进入下一步判断,是否为数字3,是就按速度3下落字母,否就返回重新输入。
字母随机下落的过程中,检查键盘是否输入ESC,是就返回到主界面,否就继续下落,接着判断玩家输入的字母跟下落的字母是否一样,是就清除该字母,并使RIGHT的基数加1,否就使WRONG的基数加1,接着判断WRONG是否大于10,否就又重新随机下落一字母,是游戏就结束并显示最终成绩,接着就返回到主界面。
2、程序流程图
程序流程图
3、重点子程序分析
(1)、随机产生字母
先初始定义一个由78个无序字母组成的字母列STRD,此字母列包含从A-Z26个字母,将STRD的偏移地址存在DI中,又将字母列的备份存在SI中,定义一个计数寄存器CX,首先置CX为0,程序每产生一个随机字母后CX自动加1,并且比较每次循环时CX是否已经大于78,如果大于78则对屏幕初始化置0,如果大于则继续随机下落字母。
(2)、字母的下落
字母的下落是整个程序的核心部分,实现该功能的原理是让字母在规定的时间间隔内多次显示,字母每次下移1位,同时上一位自动以空格代替,这样在视觉上就起到了字母自动下落的效果,下落的速度由我们自己决定,本程序中设置了六种速度。
4、程序中使用的部分重要指令
(1)、通用数据转送指令MOV
它表示把操作数(SRC),转送给目的操作数(DIST),源操作数不变,目的操作数被源操作数所替代。
转送指令每次可以转送一个字节或一个字,可以实现CPU的内部寄存器之间的数据转送、寄存器和内存之间的数据转送,还可以将立即数送给CPU内部的寄存器。
本设计中大量的用到了MOV指令,如MOVAH,0AHMOVAL,OP3MOVCX,01HMOVBH,00H等等,以实现起数据的传送。
(2)、无条件转移指令JMP、CALL、RET
1)当程序中出现JMP指令时,无条件的跳至JMP后所跟的变量处。
其主要有段内短转移、段内直接转移、段间直接转移、段内间接转移、段间间接转移、段内间接转移等操作。
2)CALL指令为调用子程序,其功能为保护程序断点后,转到子程序处执行。
主要包括段内调用和段间调用。
3)RET返回指令,通常与CALL指令连用,从子程序返回主程序,通常放在子程序之后。
也包括段内返回和段间返回。
(3)条件转移指令
条件转移指令是根据执行该指令时CPU标志的状态而决定是否发生控制转移的指令。
如果满足条件则程序转移到指定的目标地址;如果不满足则继续执行该条件下的下一条指令。
一般与比较指令CMP连用。
在本程序设计中主要用到“JE(相等转移)”、“JA(大于转移)”、“JNE(不相等转移)”等。
(4)、堆栈操作指令PUSH、POP
PUSH进栈指令的功能是将操作数推入堆栈。
它的源操作数可以是16为通用寄存器、段寄存器或存储器中的数据字,打不能是立即数。
堆栈是以“先进后出”的方式工作的一个存储区,栈区的段址由SS寄存器的内容确定。
堆栈的最大容量可为64K,即一个段的最大容量。
堆栈指针SP始终指向栈顶,其值可以从FFFEH(偶地址)开始,向低地址方向发展,最小为0。
每次执行PUSH操作时,先修改SP的值,使SPSP-2后,然后把操作数压入堆栈种SP指示的位置上,低位字节放在较低地址单元,高位字节放在交高地址单元中。
POP出栈指令的功能是把当前的SP所指向的堆栈顶部的一个字送到指定的目的操作数中。
它的目的操作数可以是16位通用寄存器,段寄存器或存储单元,但CS不能做目的操作数。
每执行一次出栈操作,SPSP+2,即SP向高地址方向移动,指向新的栈顶。
(5)、算数运算指令ADD、SUB、DIV、INC
ADD加法指令,它的功能是将源操作数相加,结果送到目的操作数中,即
目的源+目的。
SUB减法指令,它的功能是将目的操作数减去源操作数,结果送回目的操作数,即目的目的–源。
DIV无符号数除法指令,它的功能是对两个无符号二进制数进行除法操作。
INC增量指令,它的功能是对目的操作数加1,结果送回目的操作数,即目的目的+1。
ADD,SUB这两条指令的原操作数可以是寄存器、存储器或立即数,目的操作数只能是用寄存器和存储单元。
使用时需注意源和目的操作数不能同时为存储器,而且他们的类型必须一致,即都是字节或字。
DIV指令的原操作数可以是字节或字,如果源操作数为字节,16位被除数必须放在AX中,8位除数为原操作数,他可以是寄存器或存储单元,相除之后,8位商在AL中,余数在AH中。
要是操作数为字,32位被除数在DX,AX中,其中DX为高位字,16位除数作源操作数,他可以是寄存器或存储单元。
相除之后,AX中存16位商,DX存16位余数。
要是被除数只有16位,除数也是16位,则必须将16位被除数送到AX中,再将DX寄存器清0,然后相除。
INC指令的目的操作数可以在通用寄存器或内存种,这条指令主要用在循环程序中,对地址指针和循环计数器等进行修改。
指令执行后影响AF、OF、PF、SF和ZF,但进位标志CF不受影响。
5、调试与测试
1编编程的过程中碰到了不少难题,主要难题有以下几点:
(1)、由于此程序子程序比较多,需要大量使用跳转指令,如JNE、JE、LOOP等。
由于用JNE,JE,LOOP跳转有条件的限制,它们要求是在-128-127字节之间。
由于刚开始没注意,在编完程序调试的过程中,出现跳转范围过大的错误,经过仔细思考,我们可以利用JMP作为间接跳转来实现。
如本程序中的:
CMPAL,31H
JNEMODIFYA
JMPTHB
MODIFYA:
CMPAL,32H
JNEMODIFYB
JMPTHC
由于THB和THC是在另外一个宏中,如果不用JMP作为间接跳转,直接写成:
CMPAL,31H
JNETHB
CMPAL,32H
JNETHC
这样在所定义的宏之间跳转时就会出现跳转范围过大的错误,经过编译显示如下错误:
用JMP做间接跳转则实现编译成功。
(2)、由于寄存器比较少,需要存储的变量又太多,因此我们常常需要在同一个寄存器中多次存储数据,寄存器的值是变换无常的。
显然,如果我们直接将不同的数据存入寄存器。
之前放入的数据就会被覆盖,程序在编译时就会发生错误。
经过仔细思考,我们可以利用堆栈的知识来解决。
堆栈是保护环境的主要工具,但一旦用错,后果也会很严重,比如我在调试程序的过程中,遇到过这样的问题:
在一个函数的开始,我先用PUSH把所有寄存器入栈了,在函数的执行中,我又把一个寄存器PUSH到栈中保存,却忘记了在执行POP指令之前把它恢复出来!
这样就造成了所有的寄存器的值都发生了变化,包括数据和代码段寄存器。
所以,我们要记住:
push和pop是相互对应的。
以上两个问题是在编程过程中碰到的最主要难题,虽然还有些问题,比如如何通过汇编语言作出游戏边框,但这些知识在汇编实验课本上都有相关知识点,通过借鉴它思想,我也最终弄出了游戏方框,虽不是完美的游戏方框,但总的来说还是比较美观的,还有许许多多的小问题在此就不一一例举了。
2、程序编译连接过程:
6、软件操作说明
1、欢迎界面
2、预进入游戏
3、游戏界面
4、游戏结束及汇报成绩界面
7、总结
经过两周的磨炼和努力,无论从工作上还是从自身角度,我自认都提高得非常迅速,发现了自己的能力和未被挖掘的潜力,认证了自身的坚强与韧力,总结出只有在强压与竞争中才会有意想不到的收获和进步。
虽然只是仅仅两周,但是这两周忙得确实很充实,又是思考,又是绘制流程图。
部分难题自己实在不能解决的,通过请教学长与同学最终都得到了解决。
如今课程设计已接近尾声,现回过头来想想,内心深深地体会到这次汇编课程设计为我们提供了与众不同的学习方法和学习机会,让我们从传统的被动授学转变为主动求学;从死记硬背的模式中脱离出来,转变为在实践中学习,增强了领悟、创新和推断的能力;掌握自学的方法,形成工程理论整体模式,使工作、学习、生活都步入系统化流程;思考方式成熟,逻辑性规范、明确。
这些方法的提高是终身受益的,深刻地感觉到这两周让我真正懂得了生活和学习的基本规律。
附件:
附件1、源程序代码文件
附件2、可执行文件
附件3、原始数据文件及结果文件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 专题 实验 报告