1、汇编语言程序设计课程设计报告专 业: 计算机科学与技术 班 级: 031 姓 名: 杨时雄 学 号: 2003944112 指导老师: 雷晓平、杨跃武、任朝晖、李娅 2006年 3 月 2 日佛山科学技术学院汇编语言程序设计课程设计报告班级:计算机1班 姓名:杨时雄 学号:2003944112 完成日期:2006-3-3课程名称:汇编语言课程设计题目:1. 定时/计数技术应用程序设计2. 键盘程序设计3. 屏幕窗口控制程序4. 多模块程序设计课程设计评语:成绩:设计指导老师:雷晓平、杨跃武、任朝辉、李娅完成时间: 2006 年 3 月 3 日一、 课程设计的目的1、 巩固和加强汇编语言程序设计
2、课程的理论知识2、 掌握汇编语言的程序设计方法,并了解综合问题的程序设计、研制、调试过程。3、 基本解决较大规模程序的设计和调试的方法。4、 培养独立分析问题和解决问题的能力以及创新能力和创新思维。5、 培养书写课程设计报告的能力。二、 课程设计的要求1、 程序设计。根据设计任务要求,首先选择设计方案、写错算法和程序框图,然后编程设计。2、 调试。通过程序调试,实现任务所要求的全部功能。3、 在屏幕上或其它设备上演示所完成的设计要求并验收。4、 写出完整的设计报告,其中包括对调试中出现的异常现象的分析和讨论。三、 课程设计课题题目一:定时/计数技术应用程序设计(一)总体方案的分析和设计1根据题
3、目的要求可知,数字钟的设计包括两个方面,一是计时,一是显示。本题的计时可利用INT 1CH调用次数来实现。由教材可知,INT ICH是每秒钟被系统定时器(中断类型8)调用18.2次,因此,在程序的数据段中设立1个计数单元COUNT,令INT 1CH用户中断服务程序每次对它加1,计若干次,直到1秒、再累加下去,直到计满1小时,然后清零,又重新开始。2时间的显示可以利用DOS功能调用INT 21H的9号功能,将时、分、秒单元的内容送到屏幕显示。3根据题目的要求,因为是利用系统的定时器资源,并且系统BIOS已对定时器进行了初始化,所以不再写定时器的初始化程序。程序分主程序和中断服务程序两部分设计。(
4、二)程序设计流程图见附录一。(三)各模块功能分析、使用相关技术说明该程序主要包括4个模块:1主模块:该模块主要是用来保持原来的中断,设置新的中断,最后再返回原来的断。2中断子程序:该模块实现对时间的显示,设定系统定时器调用18次后增加一秒,然后利用DOS功能调用INT 21H的9号功能,将时、分、秒单元的内容送到屏幕显示。3处理数据子程序:该模块主要进位对时间各位的影响,进而进行相应的处理,最后将数字钟各位转成ASCII码用于输出。4进位子程序:该模块主要是用于判断是否有进位产生以及相应的处理。(四)设计的创新之处、程序设计技巧的总结及分析首先,该程序设计技巧主要是懂得利用INC 1CH是每秒
5、钟利用系统计时器调用18.2次这一点,并且系统BIOS已对定时器进行了初始化,省去了写系统计时器初始化程序的功夫!其次,对进位的处理也比较好,将所有情况都考虑进去了,程序比较完善。(五)设计和调试中遇到的问题及解决的方法在该程序的设计及调试过程中,首先要清楚系统计时器是怎样被调用的,如果无法理解原理是不能把程序搞出来的,经过不停的查阅资料,最终我明白到系统BIOS已对定时器进行了初始化,从而知道如何判断是否1秒,并判断是否执行中断子程序。其次是要弄清楚怎么处理进位,以及数字钟各位的怎么相互影响。这时我就需要不断考虑各个情况以及相应对策,通过不断调试终于搞好了。(六)整个设计的结果分析及其他要说
6、明的问题该程序编译通过后执行,基本能够实现实现题目要求的功能,但当你按第二次键时,不管你按什么键都会推出数字钟。题目二:键盘程序设计(一)总体方案的分析和设计根据题目的要求,将输入的键AH(扫描码)和AL(ASCII码)中的二进制转成十六进制后分别显示出来。1. 输入字符并将其暂时储存;2. 将输入字符的二进制码转成十六进制;3. 显示所转换后的字符。(二)程序设计流程图见附录一。(三)各模块功能分析、使用相关技术说明该程序主要包括2个模块:1 主模块:该模块主要判断输入的键是否为退出键,通过调用子程序处理字符,最终将转换后的字符输出并显示;2 子模块:该模块实现将输入字符的二进制码转成十六进
7、制码;(四)设计的创新之处、程序设计技巧的总结及分析1该程序在执行时,首先判断输入的是否为ESC,避免运行后按退出而出现的BUG。2利用循环左移的方法来将输入的二进制数转成十六进制数。(五)设计和调试中遇到的问题及解决的方法在该程序的设计及调试过程中,首先是在程序刚运行后按下ESC无法退出并出现0000,通过对程序源代码的仔细研究和讨论,最终解决了问题;其次是在对INT21的调用方面出现偏差,“02显示输出”和“09显示字符串”没有理解透,经过多次调试后才将问题弄明白。(六)整个设计的结果分析及其他要说明的问题该程序编译通过后执行,能够实现实现题目要求的功能,达到实验的目的和要求。然而,程序还
8、是有不尽如人意的地方。程序只能显示常用字符的7位ASCII码(十六进制表示),并且在按“F11”、“F12”时无任何反应,连扫描码都无法显示出。题目三:屏幕窗口控制程序(一)总体方案的分析和设计根据题目的要求,主要利用BIOS功能调用int 10h。1.清屏及窗口生成部分,利用该中断类型的6号或7号功能;2.光标的设置部分,利用该中断类型的2号功能;3.按键判断部分,则可利用BIOS功能调用int 16h的0号功能,对AH中的扫描码进行判断后进入相关按键处理的子程序。(二)程序设计流程图见附录一。(三)各模块功能分析、使用相关技术说明该程序主要包括8个模块:1.主模块:该模块主要负责对按键的检
9、测及对各子模块的调用,主要利用比较与跳转指令实现该功能;2.清屏:该模块实现对屏幕的清除,主要利用BIOS功能调用int 10h的6号功能;3.窗口初始化:该模块实现窗口的生成及光标定位于(0,0)处,主要利用BIOS功能调用int 10h的2号及7号功能;4.向上光标控制:完成光标向上移动的功能,通过对DH中存储数值的修改进而调用int 10h的2号功能实现;5.其他向左、右、下各光标控制与向上光标控制类似;6.end按键:完成窗口的重置,通过修改保存窗口位置的变量然后调用int 10h的7号功能实现。(四)设计的创新之处、程序设计技巧的总结及分析该程序主要有两处作了特殊处理:其一,重置光标
10、位置时对光标的当前位置作了判断,若光标已到达最左、右、上、下,则不重置其位置;其二,当按下end键之后,对当前光标位置作为窗口的左上角或右下角通过变量count作了特殊处理,count为2时当前光标位置作为窗口的左上角,否则作为右下角。(五)设计和调试中遇到的问题及解决的方法在该程序的设计及调试过程中,首先遇到的问题是当按下光标控制键时,光标没有正确移动,通过的源程序仔细检查修改后,光标正确移动了;其次,程序退出时窗口并没关闭,通过在程序退出前调用清屏子程序最后解决了该问题。(六)整个设计的结果分析及其他要说明的问题该程序编译通过后执行,能够实现实现题目要求的功能,但存在一个bug,就是对窗口
11、的设置中,若出现左上角高度低于右下角高度的情况,程序将出错。由于时间关系就没有就没有去修改代码以对该情况进行特殊处理。题目四:多模块程序设计(一)总体方案的分析和设计 根据题目的要求可知程序要求输入和显示字符串:1、 输入和显示字符串,用到DOS(int 21h)的功能09跟功能10。2、 字母大小写转换要用到条件转移指令。3、 由于要模块,要用到public跟extrn指令。4、 将程序分4个模块,主模块(main),输入模块(input),输出模块(output),处理模块(deal)。将各个模块分别用masm指令汇编后,用link指令把各个模块连起来。(二)程序设计流程图见附录一。(三)
12、各模块功能分析、使用相关技术说明模块一:主模块(main)通过主模块调用各个子模块,主程序与模块之间通过变量传递数据。模块二:输入模块(input)通过调用DOS,把字符串放到bufa中,主要参考课本中的例子。模块三:输出模块(output)把放在bufa中的字符串,通过处理变为大写字母后,再逐个放到bufb中,最后把bufb的内容通过DOS显示出来。模块四:处理模块(deal)通过逐个接收bufa内的字符,并判断后,把小写字母转换为大写字母,其他字符按原样输出。(四)设计的创新之处、程序设计技巧的总结及分析1. 该程序主要运用了模快连接技术,根据public跟extrn的使用方法,使主程序连
13、接其他模块.2. 运行主程序时,首先输入需要转换的字符,之后保存在一空间(bufa)内,在判断是否转换后,再将字符放到另一个空间(bufb)内,最后通过显示模块就把保存在(bufb)内的内容都显示出来.(五)设计和调试中遇到的问题及解决的方法由于运用分模块技术,所以难免会出现错误,在写程序的时候,出现漏写public,extrn之类,程序原意在输入esc键按回车后就退出程序的,但不知道为何不成功,最后改为输入q后就退出程序.在判断输入的字符是否为小写字母时,要用到转移命令,刚开始时无从入手,后来参考了一些例子就做出来了.(六)整个设计的结果分析及其他要说明的问题程序开始要求从键盘输入字符,按回
14、车键后换行显示转换后的字符,接着又重新开始接收从键盘输入的字符,直到在接收时直接输入回车时,就退出程序.四、源程序清单 见附录二。五、收获、体会及建议通过这次课程设计,我收获不少,对以前学习的知识有了进一步的了解,对MASM5的使用也更加熟悉;这四个程序的设计,其实还是有些难度的,以前毕竟只停留在学习基础知识的阶段,所以对于真正的编程也不是很了解,对于语言的使用还很生疏,在编写程序的过程中还是遇见不少难题,不过在老师和同学的帮助下,最后还是完成了。不过在经过老师的提问之后,我还是发现我对当中的很多地方还不是很熟悉,可能这四个程序其中有些地方还是要问一下别人的,所以造成有些细节我不是很懂。我以后
15、会花时间投入这些,争取对这门课有更深的了解。由于我们平时基本都是在听课学习,似乎有点忽略了对学习内容的运用,所以开设这样的程序设计课其实对我们非常有益,我希望以后能有多点这些课,这样我们可以把所学的东西运用到实际中,有助于我们加深理解,和为以后出去社会工作打下基础。附录一:题目一:接收一个键该键是否为 空 格 键 ?再接收一个键该键是否为 空 格 键 ?开中断显示5个退格键显示时间转换为真实的时间开始显示时间time处理数据显示时间 结束返回 主程序框图 显示时间子程序框图数据处理dealdata处理进位carry数字转字符处理进位carry返回处理进位carry2处理进位carry返回返回处
16、理进位carry 数字转字符时间加1秒下一位加1cf 加1bx=bx-1置0时间的每一位加30hcl=cf?dh=ch?|bx|=0? 数字转字符子程序框图处理数据子程序框图案 处理进位子程序框图题目二:BINIHEX返回初始化循环计数值BX循环左移一个单位把最右面的数位转换为ASCII显示一个字符加上? 是ASCIIAF?选还计数值 0?Y NYNMAIN开始二进制转十六进制输出BINIHEX结束输入一个键输出字符分别输出回车、换行、空格该键是Esc?NYBINIHEX子程序框图 主程序框图实验三:是否向上接收键盘按键YN是否向下Y是否向左N是否Esc键是否End键是否向右NYYYNNN返回
17、DOS主程序开始清屏窗口初始化向上处理向下处理重置窗口处理向右处理向左处理Y结束设置背景为黑色,全屏调用int 10h的6号功能返回清屏子程序 光标是否在0行DH减1重置光标位置YN返回向上处理子程序光标是否在24行DH加1重置光标位置YN返回向下处理子程序光标是否在0列DL减1重置光标位置YN向左处理子程序返回光标是否在79列DL加1重置光标位置YN向右处理子程序返回count是否为2count加1,修改右下角位置End按键处理子程调用清屏子程序NYcount减1,修改左上角位置重置窗口返回实验四: 模块一 模块二输入字符input返回将输入的字符保存到bufa内从键盘输入字符 调用dos
18、输入字符 input主程序 main 结束end 显示字符output处理字符deal开始main 输入模块程序 input 模块三 模块四 显示字符output处理字符dealNY输入字符是否为q 退出dos结束程序 返回 用dos把bufb内的内容显示出来 返回N YNY比7ah大 比61h小 返回 减去20h Deal-dataSi+1Di+1调用子程序deal_data附录二:题目一源程序:.model small;-.stack;-.datammss db 0,0,:,0,0,$backspace db 8h,8h,8h,8h,8h,$cf db 0count dw 1;-.code
19、main proc farstart: mov ax,data mov ds,ax mov ah,7 int 21h cmp al,20h jz exit mov al,1ch mov ah,35h int 21h push es push bx push ds mov dx,offset time mov ax,seg time mov ds,ax mov al,1ch mov ah,25h int 21h pop ds in al,21h and al,11111110b out 21h,al sti ;-again: mov ah,1 int 16h jz again ;- pop dx
20、 pop ds mov al,1ch mov ah,25h int 21hexit: mov ax,4c00h int 21hmain endp;-time proc near push ds push ax push cx push dx mov ax,data mov ds,ax sti dec count jnz exit2 call dealdata mov dx,offset backspace mov ah,9 int 21h mov dx,offset mmss mov ah,9 int 21h call changeback mov count,18exit2: cli pop
21、 dx pop cx pop ax pop ds irettime endp;-dealdata proc near inc mmss+4 mov bx,4 mov cl,0 mov ch,10 call carry mov bx,3 mov ch,6 mov cl,1 call carry2 mov bx,1 mov ch,10 mov cl,2 call carry mov bx,0 mov ch,6 mov cl,3 call carry2 mov cl,0 mov cf,cl call changedata retdealdata endp;-carry proc near cmp c
22、l,cf jnz exit3 mov dh,mmss+bx cmp dh,ch jnz exit3 sub mmss+bx,ch cmp bx,0h jz exit3 dec bx inc mmss+bx inc cf exit3: retcarry endp;-carry2 proc near cmp cl,cf jnz exit3 mov dh,mmss+bx cmp dh,ch jnz exit4 sub mmss+bx,ch sub bx,2 inc mmss+bx inc cfexit4: retcarry2 endp;-changedata proc near mov bh,30h
23、 add mmss,bh add mmss+1,bh add mmss+3,bh add mmss+4,bh retchangedata endp;-changeback proc near mov bh,30h sub mmss,bh sub mmss+1,bh sub mmss+3,bh sub mmss+4,bh retchangeback endp;-end start题目二源程序:data segmentline db 0ah,0dh,SCAN ASCII CHAR,0ah,0dh, $space db $suf db ?data endscode segmentmain proc
24、far assume cs:code,ds:datastart: push ds sub ax,ax push ax mov ax,data mov ds,ax lea dx,line mov ah,09 int 21h;=输入字符repeat: mov ah,0 int 16h mov bx,axmov suf,al cmp al,1bh jz exit;=输出字符 call binihex lea dx,space mov ah,09 int 21h mov dl,suf mov ah,2 int 21h ;=回车换行空格 mov ah,2 mov dl,0dh int 21h mov d
25、l,0ah int 21h mov dl,00h int 21h jmp repeat exit: mov ax,4c00h int 21hmain endp;=二进制转成16进制后显示出来binihex proc near mov ch,4rotate:mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl printit add al,7h printit: mov dl,al mov ah,2 int 21h dec ch cmp ch,2 jz go cmp ch,0 jnz rotate retgo: lea
26、dx,space mov ah,09 int 21h cmp ch,0 jnz rotate retbinihex endpcode ends end 题目三源程序: .model small;- .stack;- .data vleft db 30 vright db 40 vtop db 10 vbottom db 15 count db 2;- .codemain proc farstart: mov ax,data mov ds,ax call clear_screen mov ah,2 mov dh,0 mov dl,0 mov bh,0 int 10h mov ah,7 mov a
27、l,0 mov bh,0eah mov ch,10 mov cl,30 mov dh,15 mov dl,40 int 10h;- mov dh,0 mov dl,0 again: mov ah,0 int 16h cmp ah,48h jz up1 cmp ah,50h jz down1 cmp ah,4bh jz left1 cmp ah,4dh jz right1 cmp ah,4fh jz end1 cmp ah,01h jz exit jmp againup1: call up jmp againdown1: call down jmp againleft1: call left j
28、mp againright1: call right jmp againend1: call endkey jmp again;- exit: call clear_screen mov ax,4c00h int 21hmain endp;* clear_screen proc near push ax push bx push cx push dx mov ah,6 mov al,0 mov bh,7 mov ch,0 mov cl,0 mov dh,24 mov dl,79 int 10h pop dx pop cx pop bx pop ax retclear_screen endp;*
29、up proc near cmp dh,0 jz next1 dec dh next1: mov ah,2 mov bh,0 int 10h retup endp ;* down proc near cmp dh,24 jz next2 inc dh next2: mov ah,2 mov bh,0 int 10h retdown endp;*left proc near cmp dl,0 jz next3 dec dl next3: mov ah,2 mov bh,0 int 10h retleft endp;* *right proc near cmp dl,79 jz next4 inc
30、 dl next4: mov ah,2 mov bh,0 int 10h retright endp;*endkey proc call clear_screen cmp count,2 jz deal inc count mov vbottom,dh mov vright,dl jmp continuedeal: dec count mov vtop,dh mov vleft,dl continue: mov ah,7 mov al,0 mov bh,0e2h mov ch,vtop mov cl,vleft mov dh,vbottom mov dl,vright int 10h ret
31、endkey endp;*;- end start题目四源程序:public info0,info1,info2,bufa,bufbextrn input:far,dealdata:far,output:fardata segmentinfo0 db 0ah,0dh,0ah,0dh,this is the change of letter to leter:$ info1 db 0ah,0dh,please input string:$info2 db 0ah,0dh,output string:$bufa db 100 db ? db 100 dup (?)bufb db 100 dup (
32、?)data endscode segmentassume ds:data,cs:codemain proc farstart: push ds sub ax,ax push ax mov ax,data mov ds,ax repeat: lea dx,info0 mov ah,9 int 21h lea dx,info1 mov ah,9 int 21h call input call dealdata lea dx,info2 mov ah,9 int 21h call output jmp repeat retmain endpcode ends end startextrn bufa:byte,bufb:byte public input code segmentassume cs:codeinput proc far lea dx,bufa mov ah,10 int 21h lea si,bufa+1 lea di,bufb mov ch,0 mov cl,si add si,1 retinput endp code ends en