您好,欢迎来到汇智旅游网。
搜索
您的当前位置:首页中断服务程序

中断服务程序

来源:汇智旅游网


目录

摘要 ........................................................................ 1 中断服务程序 ................................................................ 2 1设计任务与分析 ............................................................ 2

1.1 设计任务 ............................................................ 2 1.2 任务分析 ............................................................ 2 2 总体方案设计 .............................................................. 3

2.1 设计思路 ............................................................ 3 2.2 鼠标操作简介 ........................................................ 3

2.2.1 鼠标简介 ....................................................... 3 2.2.2 鼠标驱动程序的主要功能 ......................................... 3 2.3 本设计调用的中断服务程序 ........................................... 4 3 程序设计流程图及程序设计 ................................................ 6

3.1程序流程图 ........................................................... 6 3.2 主程序的设计与分析 .................................................. 7 3.3 小车显示子程序的设计与分析 .......................................... 9 3.4 清屏子程序的设计 ....................................................... 12 4 调试过程 ................................................................. 13 5 程序运行结果 ............................................................. 14 小结与体会 ................................................................. 16 附录: ..................................................................... 16 参考文献 ................................................................... 23

1

摘要

微机原理和接口技术是一门实践性强的学科,其中很多的原量、规则、现象等仅仅靠学习教科书是无法完全掌握的,必须通过实践才能比较直观和深刻的理解。所以做好课程设计能够对本课程有更深刻的认识。

本设计是一个中断服务程序,要求捕获鼠标的状态并用小车图形做出相应的表示。首先检测鼠标的状态,再通过读取小车字符来显示不同状态下的字符组合,从而画出小车图形。当按鼠标左键时,小车左边显示出一个L;当按鼠标右键时,小车右边显示一个R;当鼠标移动时,小车也跟着移动。通过一个循环体使得鼠标状态可以一直得到检测,从而实现所需的功能。

在进行课程设计的过程中,通过分析问题、提出解决方案、通过编程等手段实现解决方案、不断调试最终达到设计要求的全过程,帮助了我系统地掌握微机原理的接口技术的相关知识,达到了将知识融会贯通的目的。

关键词:中断服务程序,鼠标状态,小车

1

中断服务程序

1设计任务与分析

1.1 设计任务

设计一个程序,可以捕获鼠标左键,右键以及移动,并利用小车图形做出相应的表示。

1.2 任务分析

计算机在执行正常程序的过程中,出现异常事件(或事先安排好的事件),迫使CPU暂时中止现行程序的执行,转去执行事件处理程序。当处理完毕后,CPU再返回到 被暂时中止的程序继续执行,这个过程称为中断。

固化在ROM中的基本输入输出系统BIOS包含了主要I/O设备的处理程序和许多常用例行程序,他们一般以中断处理程序的形式存在。如显示输出的10H号中断处理程序,答应输出的17H号中断处理程序,键盘输入的16H号中断处理程序。BIOS直接建立在硬件的基础上。

本设计要求设计的中断程序可以捕获鼠标左键右键及其移动,因此程序肯定涉及到与鼠标功能有关的设计技巧,另外,还要通过小车图形做出相应的表示,所以还要有屏幕设置和坐标计算等过程。

2

2 总体方案设计 2.1 设计思路

此程序要求检测鼠标的状态,是否按下或是否移动,程序要求能循环检测鼠标的状态。

我们设计的思路是采用一个循环体,负责处理鼠标中断。首先读取鼠标状态,判断鼠标是否被按下,若没有被按下则转到检测鼠标是否移动,若鼠标被按下,则继续判断是左键还是右键按下,确定鼠标的状态后,再设置小车的形状并显示出来。在不同的状态下,小车的形状不一样。

汽车图形由10个文本字符组成,按下鼠标左键或右键或移动鼠标时,汽车的形状不一样。当按下左键时,小车是由字母L(ASCII码为4CH),四个实心方块(ASCII码为DBH),两个字母O(ASCII码为4FH)和3个空格符(ASCII码为32)组成;当按下右键时,小车是由四个实心方块,字母R(ASCII码为52H),两个车轮和3个空格符组成;当没有按键时,小车是由五个实心方块,两个车轮和3个空格符组成。以上十个文本字符都是以正常属性显示。

2.2 鼠标操作简介

2.2.1 鼠标简介

鼠标系统实际上由两个主要元素组成:鼠标机制和称作鼠标驱动程序的内存驻留程序。鼠标驱动程序提供与鼠标通信所需的全部低级支持。此外,它自动维持鼠标光标位置和发现是否按下了某个键。一旦装入驱动程序,鼠标就可以被随后执行的任意程序使用。

2.2.2 鼠标驱动程序的主要功能

可以通过PC中断33H访问鼠标和鼠标驱动程序的各种功能。所选择的特定函数依赖于中断时AX寄存器的值。三个其它寄存器(BX、CX和DX)用于把各种参数传送给鼠标例程。同样,鼠标函数使用这四个寄存器把鼠标的位置和按钮的状态返回给调用函数。鼠标中断的常用功能如表1所示

表1 鼠标中断常用功能表

功能 初始化 显示光标 输入值 无 无 3

输出值 AX BX 无 功能调用 AX=0000 AX=0001

隐藏光标 读取状态 设置位置 设置光标 X范围 Y范围 光标范围 无 无 CX、DX BX、CX、DX CX DX CX DX CX DX SI DI 无 BX、CX、DX 无 无 无 无 无 AX=0002 AX=0003 AX=0004 AX=0009 AX=0007 AX=0008 AX=0010 中断程序

CX ES:DX 无 AX=000C 2.3 本设计调用的中断服务程序

1.鼠标功能中断INT 33H (1)功能00H

功能描述:初始化鼠标,该操作只需要执行一次 入口参数:AX=00H

出口参数:AX=0000H——不支持鼠标功能,FFFFH——支持鼠标功能 BX=鼠标按钮个数(在支持鼠标功能时) (2)功能03H

功能描述:读取鼠标位置及其按钮状态 入口参数:AX=03H

出口参数:BX=按键状态:位0=1——按下左键

位1=1——按下右键 位2=1——按下中键

其它位——保留,内部使用 CX=水平位置 DX=垂直位置 2.屏幕功能调用 INT 10H (1)功能02H

功能描述:用文本坐标下设置光标位置

4

入口参数:AH=02H 出口参数:无 BH=显示页码 DH=行(Y坐标) DL=列(X坐标) (2)功能06H和07H

功能描述:初始化屏幕或滚屏

入口参数:AH=06H——向上滚屏,07H——向下滚屏 出口参数:无

AL=滚动行数(0——清窗口) BH=空白区域的缺省属性

(CH、CL)=窗口的左上角位置(Y坐标,X坐标) (DH、DL)=窗口的右下角位置(Y坐标,X坐标) (3)功能01H

功能:设置光标形状 入口参数: AH=01H 出口参数: 无

CH低四位=光标的起始行

CL低四位=光标的终止行 (本设计中设置为禁止光标显示) 3.DOS系统功能调用INT 21H 功能02H

功能描述:向标准输出设备(如:屏幕)输出一个字符。该输出还可被重定向,样做,则将无法判断磁盘是否满

入口参数:AH=02H 出口参数:无

DL=待输出字符的ASCII码

5

如果这

3 程序设计流程图及程序设计

3.1程序流程图

经过上述分析,可以画出程序流程图如图1所示:

鼠标是否移动

是 移动响应

图1 程序流程图

开始 程序初始化 读取鼠标状态 否 是否按键 是 左键按下 右键按下 左键响应 右键响应 结束

6

3.2 主程序的设计与分析

在DATA段定义9个变量: MDY DB MDX DB MS

DD

00H ;目的地列数 00H ;目的地行数 00H ;鼠标按键状态 00H ;光标位置横坐标 MSX DD MSY DD 00H CAR DB 00H CARL DB 00H CARR DB

00H 对鼠标进行初始化并读取鼠标状态: MOV AX,DATA MOV DX,AX

MOV AX,00H INT 33H RDMS:

MOV AX,03H INT 33H 判断鼠标状态:

CMP BX,WORD PTR MS JZ MSMV MOV WORD PTR MS,BX AND BX,0111

CMP BX,0 JZ RDMS AND BX,0110B CMP BX,0 JZ MSL

;光标位置纵坐标

;当前要显示字符的ASCII码 ;小车最左边一个字符的ASCII码 ;小车最右边一个字符的ASCII码 ;初始化鼠标 ;读取鼠标状态 ;读取鼠标按键变化

;保存当前鼠标按键状态 ;判断鼠标是否有状态变化

;判断按下左键还是右键

7

MSR: ;右键响应 MOV CX,WORD PTR MSX MOV DX,WORD PTR MSY

MOV CARL,0DBH ;设置小车形状为右键按下状态 MOV CARR,52H ;52H是字母R的ASCII码 CALL PRCAR JMP RDMS

MSL: MOV CX,WORD PTR MSX MOV DX,WORD PTR MSY

MOV CARL,4CH MOV CARR,0DBH

CALL PRCAR JMP RDMS

MSMV:

CMP CX,WORD PTR MSX JNZ MSM CMP DX,WORD PTR MSY JNZ MSM

JMP RDMS

MSM: MOV WORD PTR MSX,CX MOV WORD PTR MSY,DX

;显示小车

;重新检测鼠标状态 ;左键响应

;设置小车形状左键按下状态,4CH是字母L

的ASCII码

;显示小车

;重新检测鼠标状态 ;鼠标移动

;判断鼠标是否横行移动了

;判断鼠标是否纵向移动了 ;重新检测鼠标状态 ;鼠标移动 8

MOV CARL,0DBH ;设置小车形状为无按键按下状态 MOV CARR,0DBH

CALL PRCAR ;显示小车 JMP RDMS ;重新检测鼠标

主程序实现对鼠标的检测,通过判断鼠标的状态调用小车显示子程序,实现在不同的

状态下小车形状不一样且小车随鼠标移动而移动。当按鼠标左键时,小车左边显示出一个L;当按鼠标右键时,小车右边显示一个R;当鼠标移动时,小车也跟着移动。

3.3 小车显示子程序的设计与分析

由上面分析知,想要显示小车,要在屏幕上输出组成汽车的ASCII码,显

示小车的程序如下:

PRCAR PROC NEAR

ROR CX,1 ;计算小车坐标

CALL CLEAN ;清除屏幕

ROR CX,1 ROR CX,1 MOV AX,CX MOV CL,3 ROR

DX,CL

MOV CX,AX SUB CX,2 MOV MDY,CL MOV MDX,DL

MOV AL,CARL ;显示小车图形

MOV CAR,AL

CALL VISION ;显示小车的第一个字符

INC MDX

9

MOV CAR,4FH

CALL VISION ;显示小车的第二个字符,字母O

INC MDY DEC MDX

MOV CAR,0DBH CALL INC MOV CALL INC DEC MOV CALL

INC MOV CALL INC DEC MOV CALL INC MOV CALL VISION

MDX CAR,32

VISION MDY

MDX

CAR,0DBH

VISION MDX CAR,32

VISION MDY MDX

CAR,0DBH

VISION MDX CAR,32

VISION ;显示小车的第三个字符,方块

;显示第四个字符,一个空格

;显示第五个字符,方块 ;显示第六个字符,空格

;显示第七个字符,方块

;显示第八个字符,空格

10

INC MDY DEC MDX

MOV AL,CARR MOV CAR,AL

CALL VISION ;显示第九个字符

INC MDX MOV CAR,4FH CALL VISION RET PRCAR ENDP

VISION子程序将CAR中的字符显示到由MDY/MDX指定的位置上,程序如下: VISION PROC NEAR ;显示小车图案

MOV DL,MDY MOV DH,MDX MOV BH,00H MOV AH,02H

INT 10H ;显示字符

MOV DL,CAR ;DL中存有待输出字符的ASCII码 MOV AH,02H ;在屏幕上输出字符 INT 21H

MOV AH,01H ;禁止光标显示 MOV CX,2000H INT 10H

RET

VISION ENDP

小车显示子程序通过通过对小车坐标的计算以及显示实现不同的功能。

11

3.4 清屏子程序的设计

清屏的方式是利用中断初始化屏幕来达到清屏的目的,以下是程序的设计: CLEAN PROC NEAR

MOV AH,6 ;设置中断功能号(6号BIOS显示服务中断,初

始化屏幕的中断)

MOV AL,0 ;AL为滚动行数,0为清屏幕 MOV CH,0

MOV CL,0 MOV DH,24

MOV DL,79 MOV BH,7 INT 10H RET CLEAN ENDP

;(CH,CL)为窗口左上角位置(坐标:行,列) ;(DL,DH)为窗口右下角位置(坐标:列,行)最右

下角为(79,24)

;卷入行属性

;调用显示服务中断(属于BIOS中断) 12

4 调试过程

程序调试过程中,遇到了很多问题。比如,刚开始小车不能正确的显示出来,后来发现是空格符的问题;刚开始不知道怎么用小车表示出左右按键的变化,本来打算用颜色区分,后来选择了左右输出不同的字符;刚开始的调试时,屏幕上总会出现一个光标,虽然对结果不影响,但是影响美观,查资料后解决了一个问题。总体来说,调试可分为以下几个步骤:

1. 小车的正确显示。 2. 小车对左右键的响应。 3. 小车随鼠标移动而移动。

通过多次的参数改变,使整个程序能够满足要求。

13

5 程序运行结果

程序调试完毕后,经编译运行 程序运行结果如下: 当没有按鼠标时,小车形状如图2所示:

图2 没有按键时小车形状

单击鼠标左键后,小车形状如图3所示:

图3 单击左键的小车形状

单击鼠标右键后,小车形状如图4所示:

14

图4单击鼠标右键的小车形状

鼠标移动,小车也会跟着移动,如图5所示

图5 移动鼠标后小车位置对比图

15

小结与体会

作为自动化专业的学生,设计是我们将来必需的技能,这次课程设计恰恰给我们提供了一个应用自己所学知识的机会,从到图书馆查找资料到对程序的设计和调试再到最后设计的成型,都对我所学的知识进行了检验。可以说,本次课程设计有苦也有甜。 设计思路是最重要的,只要你的设计思路是成功的,那你的设计已经成功了一半。因此我们应该在设计前做好充分的准备,像查找详细的资料,为我们设计的成功打下坚实的基础。

设计过程是一个考验人耐心的过程,不能有丝毫的急躁,马虎,程序的修改要一步一步来,不能急躁,要求我们有一个比较正确的思路。要熟练地掌握课本上的知识,掌握各条指令的作用和格式,这样才能对调试中出现的问题进行分析解决。留给我印象最深的是要设计一个完整的程序,必须要有耐心,要有坚韧的毅力。在整个程序的设计过程中,花费时间最多的是各个程序段的串联顺序以及调用时机。设计过程中,我深刻的体会到在设计过程中,需要反复实践,其过程很可能相当烦琐,有时花很长时间设计出来的程序还是不正确。

总体来说,这次课程设计我受益匪浅。了解到自己在微机原理与接口技术这门课程上还有很大的欠缺。在摸索该如何设计程序使之实现所需功能的过程中培养了我的设计思维。在让我体会到了设计电路的艰辛的同时,更让我体会到成功的喜悦。

附录:

16

相关程序:

;___________________________DATA_________________________ DATA SEGMENT

MDY MDX MS MSX MSY CAR CARL CARR

DB DB DD DD DD DB DB DB

00H ;目的地列数 00H ;目的地行数 00H ;鼠标按键状态 00H ;光标位置横坐标 00H ;光标位置纵坐标

00H ;当前要显示字符的ASCII码 00H ;小车最左边一个字符的ASCII码 00H ;小车最右边一个字符的ASCII码

DATA ENDS

;________________________STACK___________________________________ STACK SEGMENT

DB 200 DUP(0)

STACK ENDS

;_________________________CODE___________________________________ CODE SEGMENT

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

;_________________________主程序__________________________________ START:

MOV AX , DATA

MOV DS , AX

MOV AX,00H ;初始化鼠标 INT 33H

RDMS:

MOV AX,03H ;读取鼠标状态 INT 33H

CMP BX,WORD PTR MS ;读取鼠标按键变化

17

JZ MSMV

MOV WORD PTR MS,BX ;保存当前鼠标按键状态 AND BX,0111

CMP BX,0 ;判断鼠标是否有状态变化 JZ RDMS AND BX,0110B

MSR:

MSMV: CMP BX,0 JZ MSL

MOV CX,WORD PTR MSX MOV DX,WORD PTR MSY

MOV CARL,0DBH MOV CARR,52H CALL PRCAR JMP RDMS MSL: MOV CX,WORD PTR MSX

MOV DX,WORD PTR MSY MOV CARL,4CH MOV CARR,0DBH

CALL PRCAR JMP RDMS

CMP CX,WORD PTR MSX JNZ MSM ;判断按下左键还是右键 ;右键响应 ;设置小车形状为右键按下状态

;52H是字母R的ASCII码

;显示小车

;重新检测鼠标状态

;左键响应

;设置小车形状左键按下状态,4CH

是字母L的ASCII码

;显示小车

;重新检测鼠标状态

;检测鼠标移动

;判断鼠标是否横行移动了

18

CMP DX,WORD PTR MSY ;判断鼠标是否纵向移动了 JNZ MSM

JMP RDMS ;重新检测鼠标状态

MSM: ;鼠标移动

MOV WORD PTR MSX,CX MOV WORD PTR MSY,DX

MOV CARL,0DBH ;设置小车为无按键按下状态 MOV CARR,0DBH

CALL PRCAR ;显示小车

JMP RDMS ;重新检测鼠标

;_________________________小车显示子程序_________________________ PRCAR PROC NEAR PUSH AX PUSH BX PUSH CX

PUSH DX

ROR CX,1 ;计算小车坐标

19

ROR CX,1 ROR CX,1 MOV AX,CX MOV CL,3 ROR DX,CL MOV CX,AX SUB CX,2 MOV MDY,CL MOV MDX,DL

CALL CLEAN ;清除屏幕

MOV AL,CARL ;显示小车图形 MOV CAR,AL

CALL VISION ;显示小车的第一个字符

INC MDX

MOV CAR,4FH

CALL VISION INC MDY

DEC MDX

MOV CAR,0DBH CALL VISION

INC MDX MOV CAR,32

CALL VISION INC MDY

DEC MDX

MOV CAR,0DBH

CALL VISION

INC MDX MOV CAR,32

CALL VISION INC MDY DEC MDX

;显示小车的第二个字符,字母O

;显示小车的第三个字符,方块

;显示第四个字符,一个空格

;显示第五个字符,方块 ;显示第六个字符,空格

20

MOV CAR,0DBH

CALL VISION ;显示第七个字符,方块

INC MDX

MOV CAR,32

CALL VISION ;显示第八个字符,空格

INC MDY DEC MDX

MOV AL,CARR MOV CAR,AL

CALL VISION ;显示第九个字符

INC MDX MOV CAR,4FH

CALL VISION ;显示第十个字符字母O POP DX

POP CX POP BX

POP AX RET

PRCAR ENDP

;_________________________字符显示子程序________________________ VISION PROC NEAR PUSH AX PUSH BX PUSH CX

PUSH DX

MOV DL,MDY

21

MOV DH,MDX MOV BH,00H MOV AH,02H

INT 10H ;显示字符

MOV DL,CAR ;DL中存有待输出字符的ASCII MOV AH,02H ;在屏幕上输出字符 INT 21H

MOV AH,01H ;禁止光标显示 MOV CX,2000H INT 10H POP DX

POP CX POP BX

POP AX

RET

VISION ENDP

;_________________________清屏子程序_________________________ CLEAR PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX

MOV AH,6 ;设置中断功能号

MOV AL,0 ;AL为滚动行数,0为清屏幕 MOV CH,0

MOV CL,0 ;(CH,CL)为窗口左上角位置 MOV DH,24

MOV DL,79 ;(DL,DH)为窗口右下角位置(坐

标:列,行)最右下角为(79,24)

22

MOV BH,7 ;卷入行属性 INT 10H ;调用显示服务中断 POP DX POP CX POP BX POP AX RET CLEAR ENDP CODE ENDS

END START

参考文献

23

[1] 邵玉祥.汇编语言程序设计.北京:科学出版社,2007 [2] 孙德文.微型计算机技术.北京:高等教育出版社,2001

[3] 沈美明.IBM-PC汇编语言程序设计.北京:清华大学出版社,1993

[4] 吴秀清 .微型计算机原理与接口技术.合肥:中国科学技术大学出版社,2002 [5] 周佩玲.微机原理与接口技术.北京:电子工业出版社,2008

[6] 王克义.微机原理——结构、编程与接口(高等学校计算机科学与技术教材)

24

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- hzar.cn 版权所有 赣ICP备2024042791号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务