[计算机组成原理与汇编语言]课程设计报告
广东技术师范学院天河学院
计算机组成原理与汇编语言
课程设计报告
题 目: 打字练习动画交互
设 计 者: 叶葆青 陈功财 卢勇盛
植志荣 卓荣辉
专业班级: 本计科132
学 号:[1**********]45 [1**********]02 [1**********]33 [1**********]51 [1**********]52
指导教师: 胡安明
所属系部: 计算机科学与技术系
2015年 6月10日
摘要
本课程设计是用汇编语言完成打字练习功能的实现,本文的出发
点从设计目的,概要设计,详细设计,程序调试以及心得体会五部分
来对该程序的设计进行详细解释和说明,并且结合了流程图和实际界
面截图。从构思,编写,调试到完整的是实现,每一部分都做了深入
的分析和说明。本文的核心部分是对于详细设计的讲解与分析,而这
当中的侧重点又在于设计思想的再现。当然,其他部分也是必不可少
的。
关键词: 功能模块,核心代码,随机字符,模块调用
目录
1.需求分析 ............................................................................................................................... 4
1.1概述 ............................................................................................................................ 4
1.2系统目标 .................................................................................................................... 4
1.3开发环境 .................................................................................................................... 4
2. 程序流程图及其说明 ......................................................................................................... 4
2.1程序流程图 ................................................................................................................ 5
2.2流程图说明 ................................................................................................................ 6
3. 程序调试 ............................................................................................................................. 6
4.心得体会 ............................................................................................................................... 7
5.参考文献 ................................................................................................................................ 8
6.附录(代码 ............................................................................................................................. 9
1.需求分析
2.1.1概述
这次课设的任务是写一个程序,运行可执行程序后,出现主界面,按回车键出现由
26个字母组成的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;按回车键进入打字练习;按ESC键返回主界面;按空格键暂停;按‘E’退出。通过课程设计,主要达到以下目的:
1. ,加强用汇编语言编程的能力;
2. 调用功能的应用,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制等;
3. 了解和掌握汇编语言程序设计过程、方法及实现,为以后微机原理课程的学习打下良好基础;增进对汇编语言的认识
4. 5. 掌握屏幕输出显示的设计方法。通过课程设计可以使我们更加了解书上的知识,了解书上的语句并且能够应用自己的程序中;
2.1.2系统目标
根据题目要求可以看到有以下几部分来实现打字练习:1.由26字母乱序组成一行显示
行。2.字母自动落下。3.从键盘输入的字母与落下字母相同则该字母消失,并且下一个字母自动接着落下。4.按下“Ese” 掌握汇编语言的中断键则程序返回到主界面。5.按空格键游戏暂停。6.在主界面按“E”则程序退出。打字练习的主要功能由以上六部分组成,每一部分之间的联系都是比较紧密的。对于以上及部分,最主要的部分就是第二三两个部分,这是打字练习的重点,需要详细设计其所需要的功能。
2.1.3开发环境
EMU8086平台
2. 程序流程图及其说明
2.1程序流程图
程序的核心模块是打字,各个模块功能的实现主要是通过键盘输入指令来融合的,主要流程是先到主界面,然后选择你想要进行的指令ENTER进入打字界面开始打字,E退出程序,
空格在打字练习时执行暂停的功能,ESC是从打字界面返回到主界面。核心模块的流程大体如下面的流程图图2-1:
2.2流程图说明
主界面是程序的初始入口,也是其他功能模块的接入点。主模块是打字模块,也是核心模块,主要通过各个键盘符来控制各个子模块之间的协调。子模块分为判断输入字符判断模块(这当中包含两个小的子模块:主界面输入字符判断和打字模块输入字符判断)、暂停模块、退出模块(这当中包含两个小的子模块:打字界面返回主界面模块和主界面退出程序模块)
3. 程序调试
1.程序运行后的主界面如图,主界面第一行是欢迎语,第二行是作者,然后往下是操作说明,
为使用者说明该程序的使用方法。
。
2.当用户按下ENTER键时,程序自动跳入到图4-2的界面,字母随机落下,用户便可以开始打字练习了。练习只要按照说明来做就可以了。
4. 心得体会
微机的应用已渗透到生活中的方方面面,利用微机,以前难以实现的东西轻而易举地成为现实。然而,作为工科学生,要了解微机的内部结构、系统构成、指令系统、输入输出接口、
存储器和接口的扩展等等,这些对我们来说非常重要。
汇编语言程序设计的方法和多模块程序设计。作为最基本的编程语言之一,汇编语言的重要性勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。尤其在和硬件关系非常密切的程序或要提高运算速度的程序,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能
这次微机原理课程设计历时一周,在整整一周的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序原理方框图化出来,但是我开始总觉得这样做没必要,很浪费时间。但是,这次课程设计完全改变了我以前的那种错误的认识,以前我接触的那些程序都是很短、很基础的,但是在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错
这次无论是设计个这程序还是写课程设计报告都让我学到了好多东西,有对课本知识更加深入的了解和掌握,也有对于流程图的设计以及绘制还有word的一些用法和排版等,都让我受益匪浅, 总之,非常感谢学校和老师给我们安排了这次课程设计,不仅让我掌握了更多的知识,还让我领会到要把一件事情做好并真正有所收获还得靠自己独立地去完成并坚持不懈!希望在以后的学习中还能多搞几次这种课程设计。
5.参考文献
[1]姚燕南,薛钧义主编.微型计算机原理与接口技术.高等教育出版社,2004.11
[2]温冬蝉,沈美明.IBMPC汇编语言程序设计.第2版.北京:清华大学出版社,2002.3
[3]齐志儒,高福祥主编.汇编语言程序设计.第2版.东北大学出版社,2001.1
[4]张弥左,王兆月,邢立军编著.微型计算机接口技术.机械工业出版社
[5]吴秀清.微型计算机原理与接口技术.合肥:中国科技大学出版社,2003
[6]易先清.微型计算机原理与应用.北京:电子工业出版社,2001
[7]李敬兆.8086/8088和基于ARM核汇编语言程序设计.第二版.合肥:中国科学技术大学出版社,2008.9
[8]王爽.汇编语言.北京:清华大学出版社,2003.9
6.附录(代码)
Init_game macro op1,op2,op3,op4,op5,op6
mov cx,00h
mov dh,op1
mov dl,op2
op6:mov ah,02h
mov bh,00h
int 10h
push cx
mov ah,0ah
mov al,op3
mov bh,00h
mov cx,01h
int 10h
pop cx
inc cx
inc op4
cmp cx,op5
jne op6
endm
clear_screen macro op1,op2,op3,op4 ;清屏宏定义
mov ah,06h
mov al,00h
mov bh,07h
mov ch,op1
mov cl,op2
mov dh,op3
mov dl,op4
int 10h
mov ah,02h
mov bh,00h
mov dh,00h
mov dl,00h
int 10h
endm
menu macro op1,op2,op3 ;菜单显示宏定义
mov ah,02h
mov bh,00h
mov dh,op1
mov dl,op2
int 10h
mov ah,09h
lea dx,op3
int 21h
endm
data segment
ZK db
no db
meg db
meg1 db
meg2 db
meg3 db
meg4 db
speed dw 600d
letters db
db
db
letters_bak db
db
db
letter_counter db 0
life_flag db 78 dup(0)
position_flag db 78 dup(0)
present_position db 1
data ends
stack segment para stack 'stack'
db 64 dup(0)
stack ends
code segment
main proc far
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
mov letter_counter,00h
mov present_position,1
lea si,position_flag
mov ah,00h
mov cx,00h
init_postion_flag:
mov [si],ah
inc si
inc cx
cmp cx,78d
jne init_postion_flag
lea di,letters
lea si,letters_bak
mov cx,00h
init_letters:
mov ah,[si]
mov [di],ah
inc si
inc di
inc cx
cmp cx,78d
jne init_letters
mov ah,00h
lea si,life_flag
mov cx,00h
init_life_flag:
mov [si],ah
inc si
inc cx
cmp cx,78d
jne init_life_flag
mov cx,00h
mov ah,01h
or ch,00010000b
int 10h
clear_screen 00d,00d,24d,79d
Init_game 00d,00d,0ah,dl,80d,nextsign1 Init_game 24d,00d,0ah,dl,80d,nextsign2 Init_game 00d,00d,0ah,dh,25d,nextsign3 Init_game 00d,79d,0ah,dh,25d,nextsign4 menu 05d,15d,ZK ;菜单信息的宏调用 menu 07h,15d,no
menu 09d,15d,meg
menu 11d,15d,meg1
menu 13d,15d,meg2
menu 15d,15d,meg3
menu 17d,15d,meg4
put: mov ah,02h ;设置光标位置 mov bh,00h
mov dh,22d
mov dl,33d
int 10h
mov ah,01h ;从键盘输入任意字符 int 21h
cmp al,0dh
je speed3
cmp al,45h
je exit
exit: mov ah,4ch
int 21h
speed3: mov ax,speed+12
mov speed,ax
jmp begin
begin: clear_screen 01d,01d,23d,78d ;清屏宏调用 clear_screen 01d,01d,23d,78d
Init_game 23d,01d,01h,dl,78d,nextsign5 mov ah,02h
mov bh,00h
mov dh,01h
mov dl,01h
int 10h
mov cx,00h
lea si,letters
nextletter:
mov ah,02h ;显示字母
mov dl,[si]
int 21h
inc si
inc cx
cmp cx,78d
je nextcycle
jmp nextletter
from_front:
sub present_position,78d
jmp gobackto_si
find_zero:
cmp letter_counter,78d
je recycle
cmp present_position,78d
je from_one
mov ah,00h
nextsi: add present_position,01h
inc si
cmp [si],ah
je gobackto_di
cmp present_position,78d
je from_one
jmp nextsi
from_one:mov present_position,01h
jmp gobackto_si
recycle:mov letter_counter,00h
mov present_position,01d
lea si,position_flag
mov cx,00h
mov ah,00h
clearsi: mov [si],ah
inc cx
cmp cx,78d
je nextcycle
inc si
jmp clearsi
nextcycle:
lea di,letters
lea si,position_flag
add present_position,31d
cmp present_position,78
ja from_front
gobackto_si:
add si,word ptr present_position
dec si
mov ah,[si]
cmp ah,01h
je find_zero
gobackto_di:
mov ah,01h
mov [si],ah
add di,word ptr present_position
dec di
mov dl,present_position
mov ah,02h
mov bh,00h
mov dh,01h
int 10h
mov cx,00h
nextrow: push cx
out_cycle: ; 延迟
push cx
mov cx,00h
in_cycle:
add cx,01h
cmp cx,1000
jne in_cycle
push dx
mov ah,06h ;
mov dl,0ffh
int 21h
pop dx
jz pass
cmp al,1bh ;
je to_start1
cmp al,
je pause
cmp al,[di] ;
je disappear
pass: pop cx
inc cx
cmp cx,speed
je print
jmp out_cycle
pause: push dx ;
mov ah,06h
mov dl,0ffh
int 21h
pop dx
cmp al,
jne pause
jmp pass
to_start1: ;
jmp start
print:
mov ah,0ah ;
mov al,
mov bh,00h
mov cx,01h
从键盘输入字符 如果键入ESC,则返回主菜单 如果键入SPACE,则游戏暂停 输入字母正确!则字母消失 暂停处理 返回主菜单 在当前光标位置写空格
int 10h
inc dh
mov ah,02h ;改变光标位置
mov bh,00h
int 10h
mov ah,0ah ;在当前光标位置写字母 mov al,[di]
mov bh,00h
mov cx,01h
int 10h
pop cx
inc cx
cmp cx,21d
je print_next_letter
jmp nextrow ;下一行
disappear: ;击中字母后输出空格 pop cx
pop cx
mov ah,0ah
mov al,
mov bh,00h
mov cx,01h
int 10h
jmp hit
print_next_letter:
lea si,life_flag
add si,word ptr present_position
dec si
mov ah,0ah
mov al,
mov bh,00h
mov cx,01h
int 10h
inc dh
mov ah,02h
mov bh,00h
int 10h
mov ah,0ah
mov al,
mov bh,00h
mov cx,01h
int 10h
mov ah,1
mov [si],ah
hit: mov ah,02h
mov bh,00h
mov dh,01h
mov dl,present_position
int 10h
mov al,[di] ; 出现下一个新字母的数法 add al,7
cmp al,7ah
ja convey_letter
mov ah,0ah
mov bh,00h
mov cx,01h
int 10h
mov [di],al
add letter_counter,01h
jmp nextcycle
convey_letter:
sub al,7ah
add al,61h
mov ah,0ah
mov bh,00h
mov cx,01h
int 10h
mov [di],al
add letter_counter,01h
jmp nextcycle
clear_screen 01,01,23,78
mov ah,02h
mov bh,00h
mov dh,11d
mov dl,20d
int 10h
inc dh
inc dh
mov ah,02h
mov bh,00h
int 10h
notkey:
mov ah,07h
int 21h
cmp al,0dh
je to_start
cmp al,1bh
je over
jmp notkey
to_start:
clear_screen 00,00,24,79 jmp start
over: clear_screen 01,01,23,78 mov ah,02h
mov bh,00h
mov dh,11d
mov dl,15h
int 10h
mov ah,02h
mov bh,00h
mov dh,13d
mov dl,15h
int 10h
mov ah,07h
int 21h
mov ah,07h
int 21h
clear_screen 00,00,24,79 mov ax,4c00h
int 21h
main endp
code ends
end start