微机原理软件课程设计报告

电气工程学院

微机原理课程设计

报 告 书

课 题 名 吃豆子程序和电子秒表

班 级____ _________________

姓 名___________ _____

指导教师

日 期

目录

一:软件课程设计

1.1、概要及关键词................................1

1.2、课程设计题目................................1

1.3、设计思想简述................................1

1.4、程序流程图..................................2

1.5、程序源代码................................3-11

1.6、程序运行过程................................12

1.7、软件设计心得体会............................13

1.8、参考文献....................................13 二:硬件课程设计

2.1、硬件设计目的................................14

2.2、硬件设计内容................................14

2.3、硬件设计要求................................14

2.4、硬件设计电路..................................14

2.5、硬件程序代码................................14-19

2.6、硬件系统调试情况................................19

2.7、课程设计心得与体会.........................20

2.8、参考文献...................................20

一:软件课程设计

吃豆子程序

1.1摘 要:本程序通过汇编语言来实现在屏幕上显示多行“豆子”(用“.”表示)和“怪物”(用“3”表示),用一个“嘴巴”(用字符“C”表示),程序运行时,单击Enter进入游戏,通过方向键上下左右控制“嘴巴”的运动方向,如果遇到豆子就吃掉如果遇到怪物则游戏结束,当按Esc时游戏也会结束。这个程序是在Windows的平台上的MASM进行编译的。此程序提供一个可视化游戏界面,通过键盘输入相应的操作后,便可以执行整个游戏程序。通过本次汇编程序的设计,使我进一步熟练掌握了汇编程序中的一些相关命令的使用。讲书本理论知识在现实中得到实际的应用,帮助我进一步的了解汇编语言编程的一些原理 关键词:数据段 中断 子程序 代码段 调用 主程序

1.2课程设计题目(分析)

我选择汇编语言与微机原理课程设计的题目是吃豆子程序。之所以选择这个题目,是因为我觉得这个课程设计做出来会比较有意思,对于爱好游戏的广大学生来说也有一定的实用价值;这个题目相对而言不是很简单,它不但要运用我们上课所学的知识,还涉及到许多课外的内容。

吃豆子程序设计题目要求:在屏幕上显示多行“豆子”(用“.”表示),用一个“嘴巴”(用字符“C”表示),程序运行时,单击空格,“嘴巴”开始从左到右逐行还是“吃豆子”,一直到“豆子”被吃完停止或者单击空格暂停。

为了使游戏更好玩更有意思,我们讨论后将使程序通过汇编语言来实现在屏幕上显示多行“豆子”(用“.”表示)和“怪物”(用“3”表示),用一个“嘴巴”(用字符“C”表示),程序运行时,单击Enter进入游戏,通过方向键上下左右控制“嘴巴”的运动方向,如果遇到豆子就吃掉如果遇到怪物则游戏结束,当按Esc时游戏也会结束。

1.3设计思想简述

对于这个题目我的设计思想是:首先定义一个字符串,内容为字符“C”的ASCⅡ值还有其他的一些相关信息,然后把屏幕中设置多行多列,在行和列中随机放置豆子和怪物的位置,这就需要在编程一开始定义时就设置。进入游戏后由方向键来控制“C”的移动位置,当遇到豆子“.”时将其用空格代替使其消掉相当于吃掉了。当遇到怪物“3”时就跳出游戏,同样如果在游戏过程中按Esc也会退出游戏。

1.4 程序框图

1.5 源程序代码

MENU MACRO OP1,OP2,OP3 ;菜单显示宏定义

MOV AH,2

MOV BH,0

MOV DH,OP1

MOV DL,OP2

INT 10H

MOV AH,9

LEA DX,OP3

INT 21H

ENDM

STACK SEGMENT STACK

DB 200 DUP(0)

STACK ENDS

DATA SEGMENT

DISPLAY1 DB 'PRESS ESC KEY TO EXIT$'

MSG DB 'GAME IS OVER!$'

ARYDB'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0' DB '0','.', 0, 0, '3', 0, 0 ,'3', 0, 0, '3','3','.', 0, 0, 0, 0, '0' DB '0', 0, 0, '3','.','3','.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '0'

DB '0', 0, 0, '3', 0, 0, '3', 0, 0, '3', '3', '.', 0, 0, 0, 0, '3','0' DB '0','3', 0, 0, 0, 0, 0, '3', 0, 0, 0, 0, 0, 0, 0, '3','.','0' DB '0','3', 0, 0, 0, '3', 0, 0, '3', 0, 0, 0, 0, 0, '.','3', 0, '0' DB '0','.', 0, 0, 0, '3', 0, 0, '.', 0, 0, 0, '3','3','3','3', 0, '0' DB '0','3','3','3','3', 0, 0, '3', 0, 0, 0, 0, 0, 0, 0, 0, 0, '0' DB '0','3', 0,'.','3', 0, 0, '3', 0, 0, 0, 0, 0, 0, 0, 0, 0, '0' DB '0', 0, 0, 0, 0, 0,'3', '3', 0,'3','3','3','3','3', 0, 0, 0, '0' DB '0', 0, 0, 0, 0, 0,'.', '3', 0,'.','3','3','.', 0, 0, '3','3','0' DB'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0' CUR_POS DB 19

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START:

MOV AX,DATA

MOV DS,AX

MOV AH,0 ;设置显示方式

MOV AL,2

INT 10H

LOP0:

MENU 05,10,DISPLAY1 ;菜单信息的宏调用

MOV AH,2 ;设定光标位置

MOV DH,24

MOV DL,0

INT 10H

MOV AH,0 ;键盘中断调用

INT 16H

CMP AL,0DH ;如果按下Enter键,则进入游戏

JNE LOP0

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON ;显示游戏界面

MOV DH,6 ;设置光标位置,显示开始的字符'C'

MOV DL,21

MOV BH,0

MOV AH,2

INT 10H

MOV AL,'C'

CALL CHAR_PLAY

BEGIN: ;游戏开始阶段

MOV AH,0 ;键盘终端调用,根据用户输入的命令游戏

INT 16H

CMP AL,1BH ;如果按下ESC键,结束游戏

JZ EXIT

CALL EATBEAN ;吃豆子函数调用

MOV AH,2 ;根据命令后的行列值设置光标位置

INT 10H

MOV AH,8 ;获取当前光标位置字符,字符保存在AL中

INT 10H

CMP AL,'.'

JE XING_XING ;如果是'.'

CMP AL,'3' ;如果是怪物字符‘3’

JE UUU

JMP CCC

XING_XING:

MOV AL,'O' ;显示字符'O'后延迟一段时间

CALL CHAR_PLAY

CALL DELAY

JMP CCC

UUU:

MOV AL,'U' ;显示字符'U'后结束游戏

CALL CHAR_PLAY

CALL DELAY

JMP EXIT

CCC:

MOV AL,'C'

CALL CHAR_PLAY

JMP BEGIN

EXIT: ; 退出

MOV AH,2

MOV DX,1200H

INT 10H

MENU 19,22,MSG ;显示游戏结束信息

MOV AH,0 ;此处是为防止结束游戏后立即终止

INT 16H

MOV AH,4CH

INT 21H

DOU_MON PROC ;界面显示函数

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV BH,0

MOV DH,5

MOV DL,20

MOV SI,0

LOP1:MOV DL,20

LOP2:MOV AH,2

INT 10H

MOV AL,ARY[SI]

CALL CHAR_DISPLAY

INC SI

INC DL

CMP DL,38

JNE LOP2

INC DH

CMP DH,17

JNE LOP1

JIESHU:POP DX

POP CX

POP BX

POP AX

RET

DOU_MON ENDP

DELAY PROC

PUSH CX

PUSH DX

MOV DX,51000

DL500:

MOV CX,10000

Dl10MS:

LOOP Dl10MS

DEC DX

JNE DL500

POP DX

POP CX

RET

DELAY ENDP

char_display proc ;带颜色显示数组中字符的函数

PUSH AX

PUSH BX

PUSH DX

cmp al,'3'

jne xing

mov bl,4

jmp go

xing:

cmp al,'.'

jne bai

mov bl,2

jmp go

bai:

mov bl,7

go:mov ah,9

mov cx,1

int 10h

POP DX

POP BX

POP AX

ret

char_display endp

EATBEAN PROC ;吃豆子函数

LEA DI,ARY

ADD DI,WORD PTR CUR_POS ;用DI保存当前光标位置对应的数组中字符的偏移地址 CMP AH,4DH ;按下右键

JNZ LEFT

JMP PR

LEFT:CMP AH,4BH ;按下左键

JNZ UP

JMP PL

UP: CMP AH,48H ;按下上键

JNZ DOWN

JMP PU

DOWN:CMP AH,50H ;按下下键

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON

JMP PD

PR: INC DL

CMP DL,37

JNB BACK1

PUSH CX

MOV CL,CUR_POS

ADD CL,1

MOV CUR_POS,CL ;每向右移一步,当前位置加1

POP CX

MOV [DI],BYTE PTR 0 ;数组中该处字符用空格填充

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON

JMP TUICHU

BACK1: DEC DL

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON

JMP TUICHU

PL: DEC DL

CMP DL,20

JE BACK2

PUSH CX

MOV CL,CUR_POS

SUB CL,1

MOV CUR_POS,CL ;每向左移一步,当前位置减1

POP CX

MOV [DI],BYTE PTR 0

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON

JMP TUICHU

BACK2:INC DL

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON

JMP TUICHU

PU: DEC DH

CMP DH,5

JE BACK3

PUSH CX

MOV CL,CUR_POS

SUB CL,18

MOV CUR_POS,CL

POP CX

MOV [DI],BYTE PTR 0

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON ;重新显示屏幕

JMP TUICHU

BACK3:INC DH

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON ;重新显示屏幕

JMP TUICHU

PD: INC DH

CMP DH,16

JE BACK4

PUSH CX

MOV CL,CUR_POS

ADD CL,18

MOV CUR_POS,CL

POP CX

MOV [DI],BYTE PTR 0

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON ;重新显示屏幕

JMP TUICHU

BACK4: DEC DH

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON ;重新显示屏幕

TUICHU:RET

EATBEAN ENDP

CLEAR_SCREEN PROC;清屏函数定义

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

RET

CLEAR_SCREEN ENDP

CHAR_PLAY PROC ;显示知道颜色的字符函数

MOV AH,9

MOV BL,6

MOV CX,1

INT 10H

RET

CHAR_PLAY ENDP

CODE ENDS

END START

1.6程序运行过程

1.编译:

*:在windows xp系统下运行MASM汇编软件,编译程序,无错误与警告,执行下一步。

2.链接:

3.执行:

(2) 所遇到的主要问题和解决方法

在课程设计的过程当中遇到的主要问题就是对整个汇编知识不是很熟悉,部分代码不能灵活运用,也有部分代码不能理解,因此在设计过程中花了较多时间查阅书籍跟浏览网上资料;在编写完整个程序后,编译、链接、运行时,当用方向键来控制嘴巴时发现并没有按顺序吃豆子,重新检查程序发现是由于吃豆子程序中位置运算出现了错误,通过调整程序中的“DI” (当前光标位置对应的数组中字符的偏移地址)的值,最终解决了这个问题。再一个就是DOS指令不能灵活运用,导致程序运行过程中纰漏百出,这样也浪费了不少时间,最后通过多次尝试修改,终于完成了整个程序设计。

1.7课程设计的感想和心得体会。

通过本次汇编语言课程设计,让我更加明白实践的重要性,只有在实践中才能更加理解各种指令的功能。再者,学习理论知识的目的还是要拿来运用,通过实践来巩固所学的理论知识。并且通过这次课程设计实践,让我一改往日的厌学情绪,尤其是当程序运行正确的时候,那种来自内心的成就感,让我更加有信心学好汇编语言了。

在这次的课程设计过程中遇到不懂得问题敢于向同学老师提问,在讨论的过程中受益匪浅,更加加深了学习的主动性。如果遇到问题了还坐那里发呆,那肯定完成不了任务。在这个学习设计的过程中使我对于微机汇编这门课有了更深的理解!对于学习汇编语言这门专业课,以后要多看程序,多尝试编写程序,在实践的过程中发现问题,并及时解决问题。

1.8参考文献

[1] 钱小捷等编. 《微机原理与借口技术》,2008年1月,第4期第1版,机械工业出版社

[2] 宋彩莉等编. 《汇编语言程序设计学习指导》,2007年出版,西安交通大学版

[3] 沈美明等编. 《IBM-PC汇编语言程序设计》,2008年第1版,清华大学出版社

[4] 求伯君等编. 《新编深入DOS编程》,1994年6月版,学苑出版社

二:硬件课程设计

电子秒表

2.1硬件设计目的 让学生独立或集体讨论设计题目的总体设计方案、编程、软件硬件调试、编写设计报告等问题。通过本次课程设计使学生熟练掌握微机系统与接口扩展电路的设计方法,熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法

2.2 硬件设计内容

电子秒表:设计一个可任意启动/停止的电子秒表,要求用6位LED数码显示,计时单位为1/100秒。利用功能键进行启/停控制。其功能为:上电后计时器清0,当第一次(或奇数次)按下启/停键时开始计数。第2次(或偶数次)按下该键时停止计时,再一次按启/停键时清零后重新开始计时。利用8086类型2中断(即外部引入不可屏蔽中断),可用开关控制实现:暂停,复位;清零;保存数据功能。

2.3 硬件设计要求

同组同学要发扬团队协作精神,积极主动的提出问题、解决问题、讨论问题,互相帮助和启发。在设计中可以引用所需的参考资料,避免重复工作,加快设计进程,但必须和题目的要求相符合,保证设计的正确。在老师的指导下制定好自己各环节的详细设计进程计划,按给定的时间计划保质保量的完成个阶段的设计任务。设计中可边设计,边修改,软件设计与硬件设计可交替进行,问题答疑与调试和方案修改相结合,提高设计的效率,保证按时完成设计工作并交出合格的设计报告。

2.4

硬件设计电路

2.5 硬件程序代码

a1 equ 0000h

b1 equ 0002h

c1 equ 0004h

ctr1 equ 0006h

a2 equ 0200h

ctr2 equ 0206h

a3 equ 0100h

data segment

tab db 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H buf db 0,0,0,0

buf1 db 0,0,0,0,0,0,0,0

buf2 db 0,0

buf3 db 80 dup(?)

data ends

code segment 'code'

assume ds:data,cs:code

start: mov ax,data

mov ds,ax

mov ax,0

mov es,ax

mov di,08

mov ax,offset intr_key

cld

stosw

mov ax,seg intr_key

stosw

mov ax,data

mov es,ax

mov al,10001001b

mov dx,ctr1

out dx,al

n3: call jishu

jmp n3

n2: lea si,buf2

mov bh,00h

mov bl,1h[si]

lea di,buf3

add di,bx

add bl,8

mov 1h[si],bl

lea si,buf1

cld

;前为第一开关次数 ;中段入口地址设置 ;8255写入控制字

rep movsb n4: call dis jmp n4 n5: lea si,buf2 mov bh,00h mov bl,1h[si] cmp bl,0 jz n1 lea di,buf1 sub bl,8

mov 1h[si],bl lea si,buf3 add si,bx cld

mov cx,8 rep movsb n6: call dis jmp n6 n1: call qinlin jmp n1 ;jmp start

jishu proc near lea si,buf mov bl,[si] cmp bl,100 jnz s6 s1: mov bl,0 mov [si],bl mov ah,1h[si] cmp ah,59 jz s2 inc ah

mov 1h[si],ah jmp s6 s2: mov ah,0

mov 1h[si],ah mov ah,2h[si] cmp ah,59 jz S4 inc ah

mov 2h[si],ah jmp s6 ;计数子程序

mov 2h[si],ah mov ah,3h[si] cmp ah,23 jz s6 inc ah

mov 3h[si],ah s6:call chu mov cx,3 s5:call dis loop s5 call delay1s inc byte ptr[si] ret jishu endp

chu proc ;rukou al push si push bx mov bl,4 lea di,buf1 lea si,buf next:lodsb

mov ah,00 mov cl,10 div cl xchg ah,al stosb mov al,ah stosb

dec bl

jnz next pop bx pop si

ret

chu endp dis proc near push bx push cx lea bx,tab lea di,buf1 mov cx,8 mov ah,7Fh loop1: mov al,[di] xlat

;数处理子程序 ;显示buf1中的值

out dx,al mov dx,b1 mov al,ah out dx,al mov bh,1 call delay call qp lea bx,tab ror ah,1 inc di

loop loop1 pop cx pop bx ret

dis endp

delay1s proc near push dx push ax

mov dx,ctr2 mov al,00110000b out dx,al mov dx,a2 mov al,01h out dx,al mov al,00h out dx,al mov dx,a3 M1: in al,dx test al,01h jz M1 pop ax pop dx ret

delay1s endp

qp proc near mov al,0ffh mov dx,b1 out dx,al ret

qp endp

delay PROC NEAR PUSH bx PUSH CX ;8253延时子程序;8253 kongzi ;清频子程序 ;内部延时之程序

wait0: MOV CX,06h

wait1: LOOP wait1

DEC bh

JNZ wait0

POP CX

POP bx

RET

delay ENDP

intr_key proc near ;中断服务子程序

call key

test al,2h

jz n1

test al,4h

jz n5

lea di,buf2

mov bh,[di]

inc bh

mov [di],bh

test bh,1h

jnz n2

jmp n3

iret

intr_key endp

qinlin proc ;键盘清零子程序

mov ax,0

lea di,buf

mov cx,14

cld

rep stosb

call dis

qinlin endp

key proc ;读取键盘程序

mov dx,c1

in al,dx

ret

key endp

code ends

end start

2.6硬件系统调试情况

将asm32文件夹拷贝到C盘根目录下。启动Proteus后,选择Source 菜单下的“Define

Code Generation Tools”命令在打开的窗口中单击“New”按钮后,点击“Browse”按钮,打开MASM32文件夹,选中秒表程序,完成代码生成规则的设置

选择Source 菜单下的“Add/Remove Source Files”命令后可打开如图4.4所示的窗口,单击“New”按钮后,即打开图4.5所示的窗口。

点击仿真盘框中的运行按钮,如图4.10所示,电路进入仿真状态。通过点击开关,来回切换开关的状态,观察发光二极管的变化。此例中,某开关闭合,则与该开关序号相同的发光二极管则点亮。

2.7 硬件课程设计报告心得与体会

在经历了一个礼拜放软件课程设计后信心饱满的迎来了硬件的课程设计,在与小组成员讨论确定题目开始着手时发现非常迷茫。面对从未接触过的PROTUS这一仿真软件一时慌了。虽然不会不懂但是我们可以学习,于是网络和老师成了我们求助的对象,不断的查找资料询问老师让我们以最快的速度了解了这个软件的应用。

然后在设计这一环节中出现了很多问题,面对这些没有退怯在询问同学,老师下一个个的解决了,所以还是非常感谢老师和同学的帮助!最后终于完成了我们的课程设计,虽然说不是非常的完美但也成功实现目标,对此我们组员都感到很高兴。这两个星期的课程设计使我学习到了很多东西,对微机汇编有了更深的体会,对它有了更浓的兴趣!在后面的学习过程中将始终保持这样的热情与态度来学好每一门!

2.8参考文献

[1] 戴梅萼,史嘉权编著.微型计算机技术及应用(第三版).北京:清华大学出版社,2003

[2] 周明德编著.微型计算机系统原理及应用(第四版).北京:清华大学出版社,2002

[3] 李顺增,吴国东,赵河明等.微机原理及接口技术.北京:机械工业出版社,2006

[4] 杨立新.微型计算机原理和应用[M].北京:科学技术文献出版社,1986.11

电气工程学院

微机原理课程设计

报 告 书

课 题 名 吃豆子程序和电子秒表

班 级____ _________________

姓 名___________ _____

指导教师

日 期

目录

一:软件课程设计

1.1、概要及关键词................................1

1.2、课程设计题目................................1

1.3、设计思想简述................................1

1.4、程序流程图..................................2

1.5、程序源代码................................3-11

1.6、程序运行过程................................12

1.7、软件设计心得体会............................13

1.8、参考文献....................................13 二:硬件课程设计

2.1、硬件设计目的................................14

2.2、硬件设计内容................................14

2.3、硬件设计要求................................14

2.4、硬件设计电路..................................14

2.5、硬件程序代码................................14-19

2.6、硬件系统调试情况................................19

2.7、课程设计心得与体会.........................20

2.8、参考文献...................................20

一:软件课程设计

吃豆子程序

1.1摘 要:本程序通过汇编语言来实现在屏幕上显示多行“豆子”(用“.”表示)和“怪物”(用“3”表示),用一个“嘴巴”(用字符“C”表示),程序运行时,单击Enter进入游戏,通过方向键上下左右控制“嘴巴”的运动方向,如果遇到豆子就吃掉如果遇到怪物则游戏结束,当按Esc时游戏也会结束。这个程序是在Windows的平台上的MASM进行编译的。此程序提供一个可视化游戏界面,通过键盘输入相应的操作后,便可以执行整个游戏程序。通过本次汇编程序的设计,使我进一步熟练掌握了汇编程序中的一些相关命令的使用。讲书本理论知识在现实中得到实际的应用,帮助我进一步的了解汇编语言编程的一些原理 关键词:数据段 中断 子程序 代码段 调用 主程序

1.2课程设计题目(分析)

我选择汇编语言与微机原理课程设计的题目是吃豆子程序。之所以选择这个题目,是因为我觉得这个课程设计做出来会比较有意思,对于爱好游戏的广大学生来说也有一定的实用价值;这个题目相对而言不是很简单,它不但要运用我们上课所学的知识,还涉及到许多课外的内容。

吃豆子程序设计题目要求:在屏幕上显示多行“豆子”(用“.”表示),用一个“嘴巴”(用字符“C”表示),程序运行时,单击空格,“嘴巴”开始从左到右逐行还是“吃豆子”,一直到“豆子”被吃完停止或者单击空格暂停。

为了使游戏更好玩更有意思,我们讨论后将使程序通过汇编语言来实现在屏幕上显示多行“豆子”(用“.”表示)和“怪物”(用“3”表示),用一个“嘴巴”(用字符“C”表示),程序运行时,单击Enter进入游戏,通过方向键上下左右控制“嘴巴”的运动方向,如果遇到豆子就吃掉如果遇到怪物则游戏结束,当按Esc时游戏也会结束。

1.3设计思想简述

对于这个题目我的设计思想是:首先定义一个字符串,内容为字符“C”的ASCⅡ值还有其他的一些相关信息,然后把屏幕中设置多行多列,在行和列中随机放置豆子和怪物的位置,这就需要在编程一开始定义时就设置。进入游戏后由方向键来控制“C”的移动位置,当遇到豆子“.”时将其用空格代替使其消掉相当于吃掉了。当遇到怪物“3”时就跳出游戏,同样如果在游戏过程中按Esc也会退出游戏。

1.4 程序框图

1.5 源程序代码

MENU MACRO OP1,OP2,OP3 ;菜单显示宏定义

MOV AH,2

MOV BH,0

MOV DH,OP1

MOV DL,OP2

INT 10H

MOV AH,9

LEA DX,OP3

INT 21H

ENDM

STACK SEGMENT STACK

DB 200 DUP(0)

STACK ENDS

DATA SEGMENT

DISPLAY1 DB 'PRESS ESC KEY TO EXIT$'

MSG DB 'GAME IS OVER!$'

ARYDB'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0' DB '0','.', 0, 0, '3', 0, 0 ,'3', 0, 0, '3','3','.', 0, 0, 0, 0, '0' DB '0', 0, 0, '3','.','3','.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '0'

DB '0', 0, 0, '3', 0, 0, '3', 0, 0, '3', '3', '.', 0, 0, 0, 0, '3','0' DB '0','3', 0, 0, 0, 0, 0, '3', 0, 0, 0, 0, 0, 0, 0, '3','.','0' DB '0','3', 0, 0, 0, '3', 0, 0, '3', 0, 0, 0, 0, 0, '.','3', 0, '0' DB '0','.', 0, 0, 0, '3', 0, 0, '.', 0, 0, 0, '3','3','3','3', 0, '0' DB '0','3','3','3','3', 0, 0, '3', 0, 0, 0, 0, 0, 0, 0, 0, 0, '0' DB '0','3', 0,'.','3', 0, 0, '3', 0, 0, 0, 0, 0, 0, 0, 0, 0, '0' DB '0', 0, 0, 0, 0, 0,'3', '3', 0,'3','3','3','3','3', 0, 0, 0, '0' DB '0', 0, 0, 0, 0, 0,'.', '3', 0,'.','3','3','.', 0, 0, '3','3','0' DB'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0' CUR_POS DB 19

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START:

MOV AX,DATA

MOV DS,AX

MOV AH,0 ;设置显示方式

MOV AL,2

INT 10H

LOP0:

MENU 05,10,DISPLAY1 ;菜单信息的宏调用

MOV AH,2 ;设定光标位置

MOV DH,24

MOV DL,0

INT 10H

MOV AH,0 ;键盘中断调用

INT 16H

CMP AL,0DH ;如果按下Enter键,则进入游戏

JNE LOP0

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON ;显示游戏界面

MOV DH,6 ;设置光标位置,显示开始的字符'C'

MOV DL,21

MOV BH,0

MOV AH,2

INT 10H

MOV AL,'C'

CALL CHAR_PLAY

BEGIN: ;游戏开始阶段

MOV AH,0 ;键盘终端调用,根据用户输入的命令游戏

INT 16H

CMP AL,1BH ;如果按下ESC键,结束游戏

JZ EXIT

CALL EATBEAN ;吃豆子函数调用

MOV AH,2 ;根据命令后的行列值设置光标位置

INT 10H

MOV AH,8 ;获取当前光标位置字符,字符保存在AL中

INT 10H

CMP AL,'.'

JE XING_XING ;如果是'.'

CMP AL,'3' ;如果是怪物字符‘3’

JE UUU

JMP CCC

XING_XING:

MOV AL,'O' ;显示字符'O'后延迟一段时间

CALL CHAR_PLAY

CALL DELAY

JMP CCC

UUU:

MOV AL,'U' ;显示字符'U'后结束游戏

CALL CHAR_PLAY

CALL DELAY

JMP EXIT

CCC:

MOV AL,'C'

CALL CHAR_PLAY

JMP BEGIN

EXIT: ; 退出

MOV AH,2

MOV DX,1200H

INT 10H

MENU 19,22,MSG ;显示游戏结束信息

MOV AH,0 ;此处是为防止结束游戏后立即终止

INT 16H

MOV AH,4CH

INT 21H

DOU_MON PROC ;界面显示函数

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV BH,0

MOV DH,5

MOV DL,20

MOV SI,0

LOP1:MOV DL,20

LOP2:MOV AH,2

INT 10H

MOV AL,ARY[SI]

CALL CHAR_DISPLAY

INC SI

INC DL

CMP DL,38

JNE LOP2

INC DH

CMP DH,17

JNE LOP1

JIESHU:POP DX

POP CX

POP BX

POP AX

RET

DOU_MON ENDP

DELAY PROC

PUSH CX

PUSH DX

MOV DX,51000

DL500:

MOV CX,10000

Dl10MS:

LOOP Dl10MS

DEC DX

JNE DL500

POP DX

POP CX

RET

DELAY ENDP

char_display proc ;带颜色显示数组中字符的函数

PUSH AX

PUSH BX

PUSH DX

cmp al,'3'

jne xing

mov bl,4

jmp go

xing:

cmp al,'.'

jne bai

mov bl,2

jmp go

bai:

mov bl,7

go:mov ah,9

mov cx,1

int 10h

POP DX

POP BX

POP AX

ret

char_display endp

EATBEAN PROC ;吃豆子函数

LEA DI,ARY

ADD DI,WORD PTR CUR_POS ;用DI保存当前光标位置对应的数组中字符的偏移地址 CMP AH,4DH ;按下右键

JNZ LEFT

JMP PR

LEFT:CMP AH,4BH ;按下左键

JNZ UP

JMP PL

UP: CMP AH,48H ;按下上键

JNZ DOWN

JMP PU

DOWN:CMP AH,50H ;按下下键

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON

JMP PD

PR: INC DL

CMP DL,37

JNB BACK1

PUSH CX

MOV CL,CUR_POS

ADD CL,1

MOV CUR_POS,CL ;每向右移一步,当前位置加1

POP CX

MOV [DI],BYTE PTR 0 ;数组中该处字符用空格填充

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON

JMP TUICHU

BACK1: DEC DL

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON

JMP TUICHU

PL: DEC DL

CMP DL,20

JE BACK2

PUSH CX

MOV CL,CUR_POS

SUB CL,1

MOV CUR_POS,CL ;每向左移一步,当前位置减1

POP CX

MOV [DI],BYTE PTR 0

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON

JMP TUICHU

BACK2:INC DL

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON

JMP TUICHU

PU: DEC DH

CMP DH,5

JE BACK3

PUSH CX

MOV CL,CUR_POS

SUB CL,18

MOV CUR_POS,CL

POP CX

MOV [DI],BYTE PTR 0

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON ;重新显示屏幕

JMP TUICHU

BACK3:INC DH

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON ;重新显示屏幕

JMP TUICHU

PD: INC DH

CMP DH,16

JE BACK4

PUSH CX

MOV CL,CUR_POS

ADD CL,18

MOV CUR_POS,CL

POP CX

MOV [DI],BYTE PTR 0

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON ;重新显示屏幕

JMP TUICHU

BACK4: DEC DH

CALL CLEAR_SCREEN ;清屏调用

CALL DOU_MON ;重新显示屏幕

TUICHU:RET

EATBEAN ENDP

CLEAR_SCREEN PROC;清屏函数定义

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

RET

CLEAR_SCREEN ENDP

CHAR_PLAY PROC ;显示知道颜色的字符函数

MOV AH,9

MOV BL,6

MOV CX,1

INT 10H

RET

CHAR_PLAY ENDP

CODE ENDS

END START

1.6程序运行过程

1.编译:

*:在windows xp系统下运行MASM汇编软件,编译程序,无错误与警告,执行下一步。

2.链接:

3.执行:

(2) 所遇到的主要问题和解决方法

在课程设计的过程当中遇到的主要问题就是对整个汇编知识不是很熟悉,部分代码不能灵活运用,也有部分代码不能理解,因此在设计过程中花了较多时间查阅书籍跟浏览网上资料;在编写完整个程序后,编译、链接、运行时,当用方向键来控制嘴巴时发现并没有按顺序吃豆子,重新检查程序发现是由于吃豆子程序中位置运算出现了错误,通过调整程序中的“DI” (当前光标位置对应的数组中字符的偏移地址)的值,最终解决了这个问题。再一个就是DOS指令不能灵活运用,导致程序运行过程中纰漏百出,这样也浪费了不少时间,最后通过多次尝试修改,终于完成了整个程序设计。

1.7课程设计的感想和心得体会。

通过本次汇编语言课程设计,让我更加明白实践的重要性,只有在实践中才能更加理解各种指令的功能。再者,学习理论知识的目的还是要拿来运用,通过实践来巩固所学的理论知识。并且通过这次课程设计实践,让我一改往日的厌学情绪,尤其是当程序运行正确的时候,那种来自内心的成就感,让我更加有信心学好汇编语言了。

在这次的课程设计过程中遇到不懂得问题敢于向同学老师提问,在讨论的过程中受益匪浅,更加加深了学习的主动性。如果遇到问题了还坐那里发呆,那肯定完成不了任务。在这个学习设计的过程中使我对于微机汇编这门课有了更深的理解!对于学习汇编语言这门专业课,以后要多看程序,多尝试编写程序,在实践的过程中发现问题,并及时解决问题。

1.8参考文献

[1] 钱小捷等编. 《微机原理与借口技术》,2008年1月,第4期第1版,机械工业出版社

[2] 宋彩莉等编. 《汇编语言程序设计学习指导》,2007年出版,西安交通大学版

[3] 沈美明等编. 《IBM-PC汇编语言程序设计》,2008年第1版,清华大学出版社

[4] 求伯君等编. 《新编深入DOS编程》,1994年6月版,学苑出版社

二:硬件课程设计

电子秒表

2.1硬件设计目的 让学生独立或集体讨论设计题目的总体设计方案、编程、软件硬件调试、编写设计报告等问题。通过本次课程设计使学生熟练掌握微机系统与接口扩展电路的设计方法,熟练应用8086汇编语言编写应用程序和实际设计中的硬软件调试方法和步骤,熟悉微机系统的硬软件开发工具的使用方法

2.2 硬件设计内容

电子秒表:设计一个可任意启动/停止的电子秒表,要求用6位LED数码显示,计时单位为1/100秒。利用功能键进行启/停控制。其功能为:上电后计时器清0,当第一次(或奇数次)按下启/停键时开始计数。第2次(或偶数次)按下该键时停止计时,再一次按启/停键时清零后重新开始计时。利用8086类型2中断(即外部引入不可屏蔽中断),可用开关控制实现:暂停,复位;清零;保存数据功能。

2.3 硬件设计要求

同组同学要发扬团队协作精神,积极主动的提出问题、解决问题、讨论问题,互相帮助和启发。在设计中可以引用所需的参考资料,避免重复工作,加快设计进程,但必须和题目的要求相符合,保证设计的正确。在老师的指导下制定好自己各环节的详细设计进程计划,按给定的时间计划保质保量的完成个阶段的设计任务。设计中可边设计,边修改,软件设计与硬件设计可交替进行,问题答疑与调试和方案修改相结合,提高设计的效率,保证按时完成设计工作并交出合格的设计报告。

2.4

硬件设计电路

2.5 硬件程序代码

a1 equ 0000h

b1 equ 0002h

c1 equ 0004h

ctr1 equ 0006h

a2 equ 0200h

ctr2 equ 0206h

a3 equ 0100h

data segment

tab db 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H buf db 0,0,0,0

buf1 db 0,0,0,0,0,0,0,0

buf2 db 0,0

buf3 db 80 dup(?)

data ends

code segment 'code'

assume ds:data,cs:code

start: mov ax,data

mov ds,ax

mov ax,0

mov es,ax

mov di,08

mov ax,offset intr_key

cld

stosw

mov ax,seg intr_key

stosw

mov ax,data

mov es,ax

mov al,10001001b

mov dx,ctr1

out dx,al

n3: call jishu

jmp n3

n2: lea si,buf2

mov bh,00h

mov bl,1h[si]

lea di,buf3

add di,bx

add bl,8

mov 1h[si],bl

lea si,buf1

cld

;前为第一开关次数 ;中段入口地址设置 ;8255写入控制字

rep movsb n4: call dis jmp n4 n5: lea si,buf2 mov bh,00h mov bl,1h[si] cmp bl,0 jz n1 lea di,buf1 sub bl,8

mov 1h[si],bl lea si,buf3 add si,bx cld

mov cx,8 rep movsb n6: call dis jmp n6 n1: call qinlin jmp n1 ;jmp start

jishu proc near lea si,buf mov bl,[si] cmp bl,100 jnz s6 s1: mov bl,0 mov [si],bl mov ah,1h[si] cmp ah,59 jz s2 inc ah

mov 1h[si],ah jmp s6 s2: mov ah,0

mov 1h[si],ah mov ah,2h[si] cmp ah,59 jz S4 inc ah

mov 2h[si],ah jmp s6 ;计数子程序

mov 2h[si],ah mov ah,3h[si] cmp ah,23 jz s6 inc ah

mov 3h[si],ah s6:call chu mov cx,3 s5:call dis loop s5 call delay1s inc byte ptr[si] ret jishu endp

chu proc ;rukou al push si push bx mov bl,4 lea di,buf1 lea si,buf next:lodsb

mov ah,00 mov cl,10 div cl xchg ah,al stosb mov al,ah stosb

dec bl

jnz next pop bx pop si

ret

chu endp dis proc near push bx push cx lea bx,tab lea di,buf1 mov cx,8 mov ah,7Fh loop1: mov al,[di] xlat

;数处理子程序 ;显示buf1中的值

out dx,al mov dx,b1 mov al,ah out dx,al mov bh,1 call delay call qp lea bx,tab ror ah,1 inc di

loop loop1 pop cx pop bx ret

dis endp

delay1s proc near push dx push ax

mov dx,ctr2 mov al,00110000b out dx,al mov dx,a2 mov al,01h out dx,al mov al,00h out dx,al mov dx,a3 M1: in al,dx test al,01h jz M1 pop ax pop dx ret

delay1s endp

qp proc near mov al,0ffh mov dx,b1 out dx,al ret

qp endp

delay PROC NEAR PUSH bx PUSH CX ;8253延时子程序;8253 kongzi ;清频子程序 ;内部延时之程序

wait0: MOV CX,06h

wait1: LOOP wait1

DEC bh

JNZ wait0

POP CX

POP bx

RET

delay ENDP

intr_key proc near ;中断服务子程序

call key

test al,2h

jz n1

test al,4h

jz n5

lea di,buf2

mov bh,[di]

inc bh

mov [di],bh

test bh,1h

jnz n2

jmp n3

iret

intr_key endp

qinlin proc ;键盘清零子程序

mov ax,0

lea di,buf

mov cx,14

cld

rep stosb

call dis

qinlin endp

key proc ;读取键盘程序

mov dx,c1

in al,dx

ret

key endp

code ends

end start

2.6硬件系统调试情况

将asm32文件夹拷贝到C盘根目录下。启动Proteus后,选择Source 菜单下的“Define

Code Generation Tools”命令在打开的窗口中单击“New”按钮后,点击“Browse”按钮,打开MASM32文件夹,选中秒表程序,完成代码生成规则的设置

选择Source 菜单下的“Add/Remove Source Files”命令后可打开如图4.4所示的窗口,单击“New”按钮后,即打开图4.5所示的窗口。

点击仿真盘框中的运行按钮,如图4.10所示,电路进入仿真状态。通过点击开关,来回切换开关的状态,观察发光二极管的变化。此例中,某开关闭合,则与该开关序号相同的发光二极管则点亮。

2.7 硬件课程设计报告心得与体会

在经历了一个礼拜放软件课程设计后信心饱满的迎来了硬件的课程设计,在与小组成员讨论确定题目开始着手时发现非常迷茫。面对从未接触过的PROTUS这一仿真软件一时慌了。虽然不会不懂但是我们可以学习,于是网络和老师成了我们求助的对象,不断的查找资料询问老师让我们以最快的速度了解了这个软件的应用。

然后在设计这一环节中出现了很多问题,面对这些没有退怯在询问同学,老师下一个个的解决了,所以还是非常感谢老师和同学的帮助!最后终于完成了我们的课程设计,虽然说不是非常的完美但也成功实现目标,对此我们组员都感到很高兴。这两个星期的课程设计使我学习到了很多东西,对微机汇编有了更深的体会,对它有了更浓的兴趣!在后面的学习过程中将始终保持这样的热情与态度来学好每一门!

2.8参考文献

[1] 戴梅萼,史嘉权编著.微型计算机技术及应用(第三版).北京:清华大学出版社,2003

[2] 周明德编著.微型计算机系统原理及应用(第四版).北京:清华大学出版社,2002

[3] 李顺增,吴国东,赵河明等.微机原理及接口技术.北京:机械工业出版社,2006

[4] 杨立新.微型计算机原理和应用[M].北京:科学技术文献出版社,1986.11


相关内容

  • 电子信息工程专业认知度调查报告
  • 物 理 与 电 子 信 息 学 院 专业认知调查报告 专 业: 年 级: 姓 名: 学 号: 指导教师: 完成时间: 电子相关企业对电子专业毕业生基本技能要求的调查报告 前言 由于信息时代的到来,据调查,现阶段对于电子信息工程人才的需要量十分巨大,"电子信息工程"的专业,对缓解当 ...

  • 计算机应用技术
  • 培养目标 编辑 计算机应用技术证书该专业培养掌握计算机应用专业必要的基础理论, 能熟练掌握常用计算机软件操作,至少熟练掌握一门编程语言,具有一定分析问题和解决问题能力,并具有较强实践技能的高级计算机应用型人才.为全国计算机应用工作人员.企业各级管理人员.学校计算机教师及政府部门各级行政人员培养具有现 ...

  • 微机课程设计
  • 微机课程设计 一. 设计题目 计算机监测系统 二. 设计目的 本课程设计目的在于通过硬件.软件综合设计手段,提高电类工科专业本科生的计算机硬件与系统应用水平,加强设计.动手等实践能力,了解相关专业基础课知识在实践中的应用.通过设计,要求达到: 1. 掌握计算机应用系统典型硬件接口电路的原理.设计.连 ...

  • 微机接口课程设计报告
  • 微机接口课程 设计报告 课题名称 班 级 学 号 学生姓名 指导教师: 韩 雁 数字钟实验 2011 年 1 月 13 日 摘要 数字钟实验的目的是熟悉8255A.8253.8259等I/O接口的编程技术,掌握键盘扫描和LED动态显示的工作原理.此实验是制作一个时间显示系统.能实现C键清除,G键启动 ...

  • 计算机科学与技术专业本科课程简介
  • 计算机科学与技术专业本科课程简介 计算机导论 先修课程:无 计算机导论重要介绍数字计算机的发展历史.应用和特点,使学生从整体上对计算机系统的构成包括软件和硬件组成有初步的了解.着重介绍当前主流操作系统如DOS 文件系统和及WINDOWS 操作系统的使用及维护.在实用技术上,掌握文字处理.电子表格以及 ...

  • 电子信息工程
  • 电子信息工程 求助编辑百科名片 大学专业,培养目标是培养具备电子技术和信息系统的基础知识,能从事各类电子设备和信息系统的研究.设计.制造.应用和开发的高等工程技术人才. 目录 基本介绍 业务培养要求 专业背景与市场预测 培养目标 培养要求 主要课程 ①数学: ②理论: ③电路: ④计算机: 详细课程 ...

  • 微机原理课程设计报告(电子秒表)
  • 电子与控制工程学院 计算机原理与接口技术 课 程 设 计 姓 名 高强强 学 号 3206100232 专 业 建筑设施智能技术 设计题目 可任意启动停止的电子秒表 指导老师 傅攀峰 目录 1电子秒表课程设计要求············································ ...

  • 微机原理课程设计电子密码锁
  • 一.课程设计的目的和任务 1.设计目的 1. 了解和掌握8086,8255接口芯片以及LED灯的原理和功能. 2. 能用这些接口芯片构建一个简单的系统控制对象. 3. 掌握接口电路的综合设计与使用. 4. 通过自己动手,进一步了解计算机得工作原理,接口技术,提高计算机硬件,软件综合应用能力,即对微机 ...

  • 电子信息工程的前景和未来
  • 一: 如果从工程师和研究生的专业方向来看,电子信息专业的方向大概有 1)数字电子线路方向.从事单片机(8位的8051系列.32位的ARM系列等等).FPGA(CPLD).数字逻辑电路.微机接口(串口.并口.USB.PCI)的开发,更高的要求会写驱动程序.会写底层应用程序. 单片机主要用C语言和汇编语 ...