《汇编语言》讲稿_17

上传人:wm****3 文档编号:56955213 上传时间:2018-10-17 格式:PPT 页数:42 大小:267.50KB
返回 下载 相关 举报
《汇编语言》讲稿_17_第1页
第1页 / 共42页
《汇编语言》讲稿_17_第2页
第2页 / 共42页
《汇编语言》讲稿_17_第3页
第3页 / 共42页
《汇编语言》讲稿_17_第4页
第4页 / 共42页
《汇编语言》讲稿_17_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《《汇编语言》讲稿_17》由会员分享,可在线阅读,更多相关《《汇编语言》讲稿_17(42页珍藏版)》请在金锄头文库上搜索。

1、汇编语言课件,王爽 著清华大学出版社,制作工具:Microsoft PowerPoint2003,本课件由汇编网()制作提供,第17章 使用BIOS进行键盘输入和磁盘读写,17.1 int 9中断例程对键盘输入的处理 17.2 使用int 16h中断例程读取键盘缓冲区 17.3 字符串的输入 17.4 应用int13h中断例程对磁盘进行读写,引言,大多数有用的程序都需要处理用户的输入,键盘输入是最基本的输入。 程序和数据通常需要长期存储,磁盘是最常用的存储设备。 BIOS 为这两种外设的I/O提供了最基本的中断例程,在本章中,我们对它们的应用和相关的问题进行讨论。,17.1 int 9中断例程

2、对键盘输入的处理,我们已经讲过,键盘输入将引发9 号中断,BIOS 提供了int 9 中断例程。 CPU 在9 号中断发生后,执行int 9中断例程,从60h 端口读出扫描码,并将其转化为相应的ASCII 码或状态信息,存储在内存的指定空间(键盘缓冲区或状态字节)中。,17.1 int 9中断例程对键盘输入的处理,一般的键盘输入,在CPU 执行完int 9 中断例程后,都放到了键盘缓冲区中。 键盘缓冲区中有16 个字单元,可以存储15个按键的扫描码和对应的入ASCII 码。,17.1 int 9中断例程对键盘输入的处理,下面我们按照键盘缓冲区的逻辑结构,来看一下键盘输入的扫描码和对应 ASCI

3、I 码是如何写入键盘缓冲区的。 注意,17.1 int 9中断例程对键盘输入的处理,注意: 在我们的课程中,仅在逻辑结构的基础上,讨论BIOS键盘缓冲区的读写问题。 其实键盘缓冲区是用环形队列结构管理的内存区,但我们不对队列和环形队列的实现进行讨论,因为那是另一门专业课数据结构的内容。,17.1 int 9中断例程对键盘输入的处理,下面,我们通过下面几个键:A、B、C、D、E、shift_A、A的输入过程,简要地看一下int 9 中断例程对键盘输入的处理方法:处理键盘输入演示,17.2 使用int 16h中断例程读取键盘缓冲区,BIOS提供了int 16h 中断例程供程序员调用。int 16h

4、 中断例程中包含的一个最重要的功能是从键盘缓冲区中读取一个键盘输入,该功能的编号为0。,17.2 使用int 16h中断例程读取键盘缓冲区,下面的指令从键盘缓冲区中读取一个键盘输入,并且将其从缓冲区中删除:mov ah,0 int 16h结果:(ah)=扫描码,(al)=ASCII码。,17.2 使用int 16h中断例程读取键盘缓冲区,下面,我们接着上一节中的键盘输入过程,看一下 int 16h 如何读取键盘缓冲区。 int 16h读键盘缓冲区演示,17.2 使用int 16h中断例程读取键盘缓冲区,从上面我们可以看出,int 16h 中断例程的 0 号功能,进行如下的工作: (1)检测键盘

5、缓冲区中是否有数据; (2)没有则继续做第1 步; (3)读取缓冲区第一个字单元中的键盘输入; (4)将读取的扫描码送入ah,ASCII 码送入al; (5)将己读取的键盘输入从缓冲区中删除。,17.2 使用int 16h中断例程读取键盘缓冲区,可见,B1OS 的int 9 中断例程和int 16h 中断例程是一对相互配合的程序,int 9 中断例程向键盘缓冲区中写入,int 16h 中断例程从缓冲区中读出。 它们写入和读出的时机不同,int 9 中断例程在有键按下的时候向键盘缓冲区中写入数据;而int 16h 中断例程是在应用程序对其进行调用的时候,将数据从键盘缓冲区中读出。,17.2 使用

6、int 16h中断例程读取键盘缓冲区,我们在编写一般的处理键盘输入的程序的时候,可以调用int 16h 从键盘缓冲区中读取键盘的输入。 编程,接收用户的键盘输入,输入“r”,将屏幕上的字符设置为红色:输入“g”, 将屏幕上的字符设置为绿色;输入“b ”,将屏幕上的字符设置为蓝色。 程序源码,特别提示,检测点17.1(page294)没有通过此检测点,请不要向下进行!,17.3 字符串的输入,用户通过键盘输入的通常不仅仅是单个字符而是字符串。 下面我们讨论字符串输入中的问题和简单的解决方法。,17.3 字符串的输入,最基本的字符串输入程序,需要具备下面的功能: (1) 在输入的同时需要显示这个字

7、符串; (2)一般在输入回车符后,字符串输入结束; (3)能够删除已经输入的字符。 对于这三个功能,我们可以想象在DOS 中,输入命令行时的情况。,17.3 字符串的输入,编写一个接收字符串的输入子程序,实现上面三个基本功能。因为在输入的过程中需要显示,子程序的参数如下: (dh)、(dl)=字符串在屏幕上显示的行、列位置; ds:si 指向字符串的存储空间,字符串以0为结尾符。 下面我们进行分析,17.3 字符串的输入,(1)字符的输入和删除。 每个新输入的字符都存储在前一个输入的字符之后,而删除是从最后面的字符进行的。我们看下面的过程:空字符串:输入“a”:a输入“b”:ab 输入“c”:

8、abc输入“d”:abcd删除一个字符:abc删除一个字符:ab删除一个字符:a删除一个字符:,17.3 字符串的输入,可以看出在字符串输入的过程中,字符的输入和输出是按照栈的访问规则进行的,即后进先出。 这样,我们就可以用栈的方式来管理字符串的存储空间,也就是说,字符串的存储空间实际上是一个字符栈。 字符栈中的所有字符,从栈底到栈顶,组成一个字符串。,17.3 字符串的输入,(2)在输入回车符后,字符串输入结束。输入回车符后 ,我们可以在字符串中加入0,表示字符串结束。,17.3 字符串的输入,(3) 在输入的同时需要显示这个字符串。每次有新的字符输入和删除一个字符的时候,都应该重新显示字符

9、串,即从字符栈的栈底到栈顶,显示所有的字符。,17.3 字符串的输入,(4)程序的处理过程。现在我们可以简单地确定程序的处理过程如下: 调用int 16h读取键盘输入; 如果是字符,进入字符栈,显示字符栈中的所有字符;继续执行 ; 如果是退格键,从字符栈中弹出一个字符,显示字符栈中的所有字符;继续执行 ; 如果是Enter 键,向字符栈中压入0,返回。,17.3 字符串的输入,从程序的处理过程中可以看出,字符栈的入栈、出栈和显示栈中的内容,是需要在多处使用的功能,我们应该将它们写为子程序。,17.3 字符串的输入,子程序:字符栈的入栈、出栈和显示。 参数说明: (ah)=功能号,0表示入栈,1

10、表示出栈,2表示显示; ds : si 指向字符栈空间; 对于0 号功能:(al)=入栈字符; 对于1 号功能:(al)=返回的字符; 对于2 号功能:(dh)、(dl) =字符串在屏幕上显示的行、列位置。,17.3 字符串的输入,子程序代码 字符栈的访问规则如下所示: (1)栈空 (2)“a”入栈(3)“b”入栈,17.3 字符串的输入,另外一个要注意的问题是:显示栈中字符的时候,要注意清除屏幕上上一次显示的内容。我们现在写出完整的接收字符串输入的子程序。,17.4 应用int13h中断例程对磁盘进行读写,我们主要以 3.5 英寸软盘为例,进行讲解。 常用的3.5英寸软盘的结构: 分为上下两

11、面,每面有80个磁道,每个磁道又分为18个扇区,每个扇区的大小为512B。 总容量为:2面80磁道18扇区512B=1440KB1.44MB,17.4 应用int13h中断例程对磁盘进行读写,磁盘的实际访问由磁盘控制器进行,我们可以通过控制磁盘控制器来访问磁盘。 只能以扇区为单位对磁盘进行读写。 在读写扇区的时候,要给出面号、磁道号和扇区号。 面号和磁道号从0开始,而扇区号从1开始。,17.4 应用int13h中断例程对磁盘进行读写,如果我们通过直接控制磁盘控制器来访问磁盘,则需要涉及许多硬件细节。 BIOS提供了对扇区进行读写的中断例程,这些中断例程完成了许多复杂的和硬件相关的工作。 我们可

12、以通过调用BIOS中断例程来访问磁盘。,17.4 应用int13h中断例程对磁盘进行读写,BIOS 提供的访问磁盘的中断例程为int 13h 。如下,读取0面0道1扇区的内容到0:200:,mov ax,0mov es,axmov bx,200hmov al,1mov ch,0mov cl,1mov dl,0mov dh,0mov ah,2int 13h,17.4 应用int13h中断例程对磁盘进行读写,入口参数: (ah)=int 13h的功能号(2表示读扇区) (al)=读取的扇区数 (ch)=磁道号 (cl)=扇区号 (dh)=磁头号(对于软驱即面号,因为一个面用一个磁头来读写) (dl

13、)=驱动器号 软驱从0开始,0:软驱A,1:软驱B;硬盘从80h开始,80h:硬盘C,81h:硬盘D。 es:bx指向接收此扇区读入数据的内存区,17.4 应用int13h中断例程对磁盘进行读写,返回参数: 操作成功: (ah)=0,(al)=读入的扇区数 操作失败: (ah)=出错代码,17.4 应用int13h中断例程对磁盘进行读写,将0:200中的内容写入0面0道1扇区:,mov ax,0mov es,axmov bx,200hmov al,1mov ch,0mov cl,1mov dl,0mov dh,0mov ah,3int 13h,17.4 应用int13h中断例程对磁盘进行读写,

14、入口参数: (ah)=int 13h的功能号(3表示写扇区) (al)=写入的扇区数 (ch)=磁道号 (cl)=扇区号 (dh)=磁头号(面) (dl)=驱动器号 软驱从0开始,0:软驱A,1:软驱B;硬盘从80h开始,80h:硬盘C,81h:硬盘D。 es:bx指向将写入磁盘的数据,17.4 应用int13h中断例程对磁盘进行读写,返回参数: 操作成功: (ah)=0,(al)=写入的扇区数 操作失败: (ah)=出错代码注意,17.4 应用int13h中断例程对磁盘进行读写,注意:下面我们要使用int 13h 中断例程对软盘进行读写。直接向磁盘扇区写入数据是很危险的,很可能覆盖掉重要的数据。如果向软盘的0 面0 道1 扇区中写入了数据,要使软盘在现有的操作系统下可以使用,必须要重新格式化。,17.4 应用int13h中断例程对磁盘进行读写,注意: (续)在编写相关的程序之前,必须要找一张空闲的软盘。在使用int 13h中断例程时一定要注意驱动器号是否正确,千万不要随便对硬盘中的扇区进行写入。,17.4 应用int13h中断例程对磁盘进行读写,编程:将当前屏幕的内容保存在磁盘上。 分析:1 屏的内容占4000个字节,需要8 个扇区,我们用0面0道的18扇区存储显存中的内容。 程序代码,小结,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号