汇编课程设计.docx
- 文档编号:30299943
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:19
- 大小:43.37KB
汇编课程设计.docx
《汇编课程设计.docx》由会员分享,可在线阅读,更多相关《汇编课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
汇编课程设计
汇编课程设计
设计一中断处理程序设计
1.课程设计的目的…………………………………………………………………42.课程设计的要求…………………………………………………………………43.课程设计内容……………………………………………………………………43.1设计思想„„„„„„„„„„„„„„„„„„„„„„„„„„„43.2流程图„„„„„„„„„„„„„„„„„„„„„„„„„„„„53.3程序源代码„„„„„„„„„„„„„„„„„„„„„„„„„„53.4运行结果„„„„„„„„„„„„„„„„„„„„„„„„„„„104.结果分析与体会„„„„„„„„„„„„„„„„„„„„„„„„11设计二汽车小鸟动画
1.课程设计的目的………………………………………………………………122.课程设计的要求………………………………………………………………123.课程设计内容…………………………………………………………………123.1设计思想„„„„„„„„„„„„„„„„„„„„„„„„„„123.2流程图„„„„„„„„„„„„„„„„„„„„„„„„„„„123.3程序源代码„„„„„„„„„„„„„„„„„„„„„„„„„133.4运行结果„„„„„„„„„„„„„„„„„„„„„„„„„„19
4.结果分析与体会………………………………………………………………20
设计一中断处理程序设计
1.课程设计的目的
综合运用汇编语言的理论知识进行中断处理程序设计,通过理论推导得出相应结论,通过修改中断向量表,实现自己的中断,在DOS环境下,能够每隔一段时间中断一次,即在DOS环境上显示“Thebellisring!
”。
所使用的软件主要有记事本、宏汇编6.0等。
2.课程设计的要求
要求:
编写一个中断处理程序,要求在主程序运行过程中,每隔20秒响铃一次,同时在屏幕上显示信息”Thebellisring!
”,按键后恢复原状。
(1)学会DOS的使用,掌握程序设计方法。
(2)掌握汇编语言的基本概念、基本理论和基本方法。
注意事项:
(1)必须由中断来实现本设计。
(2)每次响铃时间间隔必须相等。
3.课程设计报告内容
3.1设计思想。
本设计通过修改中断向量表,将自己的中断程序写入中断向量表。
然后通
过调用该中断功能号来实现每隔20秒系统调用一次该中断,在屏幕上显示
“thebellisring!
”和系统的时间,按回车键结束显示。
在系统定时器的中断处理程序中,有一条中断指令INT1CH,时钟中断每发生一次(约18.2次每秒)都要嵌套调用一次中断类型1CH的处理程序,但并不做任何工作。
故采用364次调用来表示20秒的时间,从而实现对时间的计数。
本设计一共设置了4个子程序来完成我的中断程序的功能,其中delay子程序用于调用系统中断来读取系统时间并延时,window子程序用于开窗口来显示字符串信息及系统时间,time子程序用于显示系统当前时间从而对20秒进行计数,btod子程序用于将程序中所涉及到的十六进制数转换为十进制数,在整个程序中又涉及到了各个子程序之间的相互嵌套调用从而实现程序的完整功能。
3.2流程图
START
修改中断向量表
调用子程序设置延时20秒delay
清屏调用子程序
window
开窗口
设置响铃
设置光标位置
清屏显示字符串
返回调用子程序time
DOS中断调用显示系统时间
16进制转换为10进制显示时、分、秒
调用组程序
3.3程序源代码
DATASEGMENT;定义数据段DATAENDS
STACKSEGMENT;定义堆栈段STACKENDS
CODESEGMENT;定义代码段
ASSUMECS:
CODE,SS:
STACK,DS:
DATASTART:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETDO;将DO的首地址给SI
MOVAX,0;设置自己的中断,段地址为0偏移地址为200H
MOVES,AX
MOVDI,200H
MOVCX,OFFSETDOEND-OFFSETDO;将DO到DOEND的长度给CXCLD
REPMOVSB;将自己的中断写到中断向量表
MOVAX,0;将0给ES
MOVES,AX
MOVWORDPTRES:
[0*4],200H;修改中断向量
MOVWORDPTRES:
[0*4+2],0
INT0;调用中断
MOVAH,4CH;返回
INT21H
DO:
JMPMG
STRINGDB'THEBELLISRING!
$';定义字符串
DELAYTIMEEQU364;定义DELAYTIME的值为364
MG:
MOVAX,DATA
MOVDS,AX
SHOW:
CALLDELAY;调用子程序DELAYCALLWINDOW;调用子程序WINDOW
MOVDL,7;响铃
MOVAH,2;显示输出
INT21H
Y:
MOVAH,01;键盘输入
INT21H
CMPAL,0DH;判断输入是否为回车
JZA;如果为回车则跳转至A
JMPY;如果不为回车则跳转至Y
A:
MOVAH,6;清屏
MOVAL,0;初始化窗口MOVCH,0;设置左上角为第0行MOVCL,0;设置左上角为第0列MOVDH,26;右上角为第26行MOVDL,79;右上角为第79列MOVBH,7;卷入行属性INT10H
JMPSHOW;跳转至SHOWMOVAH,4CH;返回INT21H
DELAYPROC;子程序名称:
DELAY功能:
延时PUSHAX;保存现场PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
MOVAH,0;BIOS中断调用,读取当前时间INT1AH
MOVBX,DX;保存秒的数值ADDBX,DELAYTIME;延时值
COMP:
INT1AH
CMPDX,BX;等待
JNECOMP
POPDI;恢复现场POPSI
POPDX
POPBX
POPCX
POPAX
RET
DELAYENDP
WINDOWPROC;子程序名称:
WINDOW功能:
清屏,开窗口,显示字符串和时间
PUSHAX;保存现场PUSHBX
PUSHCX
PUSHDX
PUSHSI
MOVAH,6;清屏
MOVAL,0;窗口初始化MOVCH,0;左上角为第0行MOVCL,0;左上角为第0列MOVDH,26;右上角为第26行MOVDL,79;右上角为第79列MOVBH,7;卷入行属性INT10H
MOVAH,6;开窗口MOVAL,0;窗口初始化MOVCH,8;左上角为第8行MOVCL,30;左上角为第30列MOVDH,14;右上角为第14行MOVDL,55;右上角为第55列INT10H
MOVAH,2;设置光标位置MOVBH,0;设置页号为0MOVDH,10;第10行MOVDL,35;第35列INT10H
MOVDX,OFFSETSTRINGMOVAH,9;显示字符串STRINGINT21H
MOVAH,2;设置光标位置MOVBH,0;页数为0页MOVDH,12;第12行MOVDL,40;第40列INT10H
CALLTIME;调用子程序TIME显示系统当前时间POPSI;恢复现场
POPDX
POPCX
POPBX
POPAX
RET
WINDOWENDP
TIMEPROC;子程序名称:
TIME功能:
显示系统当前时间PUSHAX;保存现场
PUSHCX
PUSHDX
MOVAH,2CH;DOS中断调用读取系统当前时间INT21H
MOVAL,CH;显示时
CALLBTOD;调用子程序BTOD将16进制转换为10进制MOVDL,3AH;转换ASCII码
MOVAH,2;调用DOS显示输出INT21H
MOVAL,CL;显示分钟
CALLBTOD;调用子程序BTOD将16进制转换为10进制MOVDL,3AH;转换ASCII码
MOVAH,2;调用DOS显示输出INT21H
MOVAL,DH;显示秒
CALLBTOD;调用子程序BTOD将16进制转换为10进制POPDX;恢复现场POPCX
POPAX
RET
TIMEENDP
BTODPROC;子程序名称:
BTOD功能:
时间由十六进制转十进制入口参数PUSHAX;保存现场
PUSHBX
PUSHDX
XORAH,AH;将AH置为0MOVBL,10;做除法DIVBL
MOVBL,AH;保存余数MOVDL,AL;将商进行转换ORDL,30H;十位数转为ASCII码MOVAH,2;显示输出INT21H
MOVDL,BL;将余数进行转换ORDL,30H;个位数转为ASCII码MOVAH,2;显示输出INT21H
POPDX;恢复现场POPBX
POPAX
RET
BTODENDP
DOEND:
NOP
CODEENDS
ENDSTART
3.4运行结果:
程序运行之后过20秒将会出现如下的红色显示信息和系统响铃声,并显
示当前的时间,时间被锁定,按回车键即消失,按其他键无效,过20秒后该
信息又会出现。
4.结果分析与体会
开始,我还以为响铃是有声音的,但是运行程序时并未听到任何声音。
所以我只能猜测这个响铃即指屏幕显示。
在设计过程中,我对于如何实现20秒的延时问题,简直是毫无头绪。
通过阅读课本,我只能知道中断指令为INT1CH,而时钟中断每发生一次都要嵌套调用一次INT1CH的处理程序,但INT1CH的处理程序只是一条指令,它并不引起任何效果,只是为用户提供一个中断类型号,且每秒钟可以调用18.2次,如果用户有某种定时周期性的工作需要完成,就可以利用系统定时器的中断间隔,用自己设计的中断处理程序来代替或调用原有的INT1CH中断程序。
故该实验我采用364次调用来表示20秒的时间,从而实现对时间的计数.
本次中断处理程序设计让我对汇编语言的中断处理有了深刻的理解,巩固了我的编程知识。
经过多方查阅资料,长时间的待在图书馆,最终将这个设计题目完成了,但我觉得对于有关中断程序设计的方法还是不是很清楚,要看的东西还有很多。
通过这次设计,我知道了编写中断程序要注意的地方有很多,基本掌握了用户自编中断处理程序的基本形式。
中断程序设计的知识点比较多,所以,在今后的学习中,我会继续学习有关中断程序设计的方法与技能,特别是在设计过程中遇到的各种问题,我通过查阅相关资料,不仅解决了当前问题还增广了我的知识面,并提高了我对汇编的兴趣爱好,让我明白了实践才是检验所学的关键~
设计二汽车小鸟动画设计
1.课程设计的目的
此程序主要是利用BIOS功能调用的10H中断类型实现的。
先利用其功能设置显示方式为320*200彩色图形方式,由于程序中没有做好的汽车小鸟图形,需要先编写小鸟和汽车的字符图形的子程序,采用段内调用子程序的方法来实现,使用了堆栈技术。
2.课程设计的要求
要求:
汽车小鸟动画
运行可执行程序CAR.exe,选择1,小鸟飞过;选择2,汽车开过;选择3,退出。
3.课程设计报告内容
3.1设计思想。
根据基本原理设计思路拟定出设计方案。
先编写好小鸟和汽车的图形显示的子程序,以供之后段内调用子程序。
之后再编写小鸟飞过的子程序和汽车开过的子程序,利用转移指令,调用子程序以及中断程序和堆栈等功能来实现设计的功能。
3.2流程图
开始
设计为320*200彩色图形
清屏
3
2从键盘读取字结束提示语符1或2或3
设置彩色颜色1为绿红黄
设计背景色
设置彩色组设置汽车开始显示位
设置光标位置显示汽车字符图形
显示小鸟字符图形延时
延时出屏
出屏
3.3程序源代码
DATASEGMENT
INFO1DB0DH,0AH,'INPUT1,2,OR3:
(1:
BIRD,2:
CAR,3:
EXIT)$'
BUFADB200
DB?
DB200DUP(0)
BUFBDB200DUP(?
)
BIRDDB5;小鸟的字符图形表
DB1AH,06H,0,0
DB1AH,06H,0,1
DB1AH,06H,1,0
DB1AH,06H,0,1
DB20H,00H,0,1
CARDB7;汽车的字符图形表
DB23H,7,0,0
DB0B1H,7,0,1
DB0DBH,7,0,1
DB0DBH,7,0,1
DB4FH,7,0,1
DB4FH,7,0,-3
DB1,7,-2,1
DB20H,0,0,1
CHAR_CNTDW?
POINTERDW?
LINE_ONDB?
COL_ONDB?
DATAENDS
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAH,0;设置显示方式为320*200彩色图形方式
MOVAL,4
INT10H
LEADX,INFO1;在显示器上显示字符串
MOVAH,9
INT21H
MOVAH,0;从键盘读取字符到AL寄存器
INT16H
CMPAL,31H;比较AL是否等于1
JNEA
CALLXIAO
A:
CMPAL,32H;比较AL是否等于
JNEB
CALLQICHE
B:
CMPAL,33H;比较AL是否等于3
JNESTART
MOVAH,4CH;终止当前程序并返回调用程序
INT21H
CLEARMACROPCH,PCL,PDH,PDL,PBH;清屏宏定义
MOVAH,0
MOVAL,4
INT10H
MOVAH,6;调用6号功能
MOVAL,0;设置整个屏幕为空白
MOVCH,PCH
MOVCL,PCL;窗口左上角(0行,0列)
MOVDH,PDH
MOVDL,PDL;窗口右下角(24行,79列)
MOVBH,PBH;正常属性显示
INT10H
ENDM
XIAOPROC;小鸟子程序
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVAH,0
MOVAL,4
INT10H
MOVAH,0BH;设置背景色
MOVBH,0
MOVBL,01
INT10H
MOVAH,0BH;设置彩色组
MOVBH,1
MOVBL,1
INT10H
CLEAR0,0,24,79,7
MOVAH,0FH;读当前显示状态
INT10H
MOVDH,10
MOVDL,0
BEGIN:
MOVSI,2
MOVCX,1
LEADI,BIRD;DI指向小鸟字符表的首字母DISP:
CMPDL,80
JAEEXIT1
MOVAH,2;设置光标位置
INT10H
MOVAH,9;显示小鸟字符图形
MOVAL,[DI]
MOVBL,[DI+1]
INT10H
CALLDLY;延时
MOVAH,9
MOVAL,''
MOVBL,04
INT10H
INCDL
ADDDI,2
DECSI
JNZDISP
JMPBEGINEXIT1:
RET
XIAOENDP
DLYPROCNEAR;延时子程序
PUSHCX
PUSHDX
MOVDX,10000DL1:
MOVCX,6801DL2:
LOOPDL2
DECDX
JNZDL1
POPDX
POPCX
RET
DLYENDP
QICHEPROCNEAR;汽车子程序
PUSHAX
PUSHBX
PUSHCX
PUSHDX
MOVAH,0
MOVAL,4
INT10H
MOVAH,0BH;设置彩色组颜色为绿、红、黄
MOVBH,01
MOVBL,00
INT10H
CLEAR0,0,24,79,7;清屏宏调用
LEADI,CAR;DI指向字符图形表
MOVDH,5;从第5行5列位置开始显示汽车
MOVDL,0
CALLMOVE_SHAPE
RET
QICHEENDP
MOVE_SHAPEPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVAH,0FH;取当前显示方式
INT10H
SUBCH,CH
MOVCL,[DI];CL放字符个数
INCDI;DI指向字符图形表中的第一个字符
MOVCHAR_CNT,CX
MOVPOINTER,DI
MOVLINE_ON,DH
MOVCOL_ON,DLPLOT_NEXT:
ADDDH,[DI+2];改变行列坐标
ADDDL,[DI+3]
CMPDL,80;出屏否,
JBMOV_CRSR
POPDI
POPDX
POPCX
POPBX
POPAX
JMPEXIT2
MOV_CRSR:
MOVAH,2
INT10H
MOVAL,[DI];取字符值
MOVBL,[DI+1];取字符属性
PUSHCX
MOVCX,1
MOVAH,09;显示字符
INT10H
POPCX
ADDDI,4;DI指向下一个字符
LOOPPLOT_NEXT
CALLDLY
CALLERASE
JMPSHORTPLOT_NEXT
EXIT2:
RET
MOVE_SHAPEENDP
ERASEPROCNEAR
MOVCX,CHAR_CNT
MOVDI,POINTER
MOVDH,LINE_ON
MOVDL,COL_ONERASE_NEXT:
ADDDH,[DI+2]
ADDDL,[DI+3]
MOVAH,2
INT10H
MOVAL,[DI]
MOVBL,0
PUSHCX
MOVCX,1
MOVAH,9
INT10H
POPCX
ADDDI,4
LOOPERASE_NEXT
MOVCX,CHAR_CNT
MOVDI,POINTER
MOVDH,LINE_ON
INCCOL_ON
MOVDL,COL_ON
RET
ERASEENDP
CODEENDS
ENDSTART
3.4运行程序
当按1时,小鸟飞过
当按2时,汽车开过
4.结果分析与体会
在这次汇编课程设计过程中,由于平常练习时间少,我遇到了很多以前没有见到过的困难,比如:
在构思过程中首先遇到的问题是如何在DOS环境下画出自己想要的小鸟和小车图形,我来在实验指导书上找到了类似的
由于动画为全屏显示,无法截图,只好照下来进行截图,通过改变指令,也可以改变汽车和小鸟开始的位置。
在整个程序的编写中,调试占了很大部分的时间。
要想写好汇编语言的程序,必须认真对待代码的每一个细节,这对程序的调试是非常重要的。
通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编写和调试一定规模的汇编语言程序的水平。
参考文献
[1]龚尚福等编著.微型计算机汇编语言课程设计.西安电子科技大学出版社,2003[2]詹仕华,李应兴编著(汇编语言程序设计(中国电力出版社,2008[3]王爽编著(汇编语言(清华大学出版社,2003
[4]李兆凤编著(8088/8086汇编语言程序设计(中央广播大学出版社,1993
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 课程设计