汇编语言程序设计6_第1页
汇编语言程序设计6_第2页
汇编语言程序设计6_第3页
汇编语言程序设计6_第4页
汇编语言程序设计6_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章输入输出程序设计主编郭显久大连海洋大学信息工程学院gxj@2011年8月9日《汇编语言程序设计》教材配套课件大连理工大学出版社输入/输出概述程序直接控制输入/输出方式中断输入/输出方式DOS系统功能调用BIOS中断调用提纲6.1.1CPU与外部设备由于外部设备种类繁多,工作原理各不相同,因此计算机与外部设备进行数据交换需要满足两个条件,即:首先通过相应的专门接口电路将计算机和其外部设备连接起来,接口实现对信号的控制与管理;其次是要有相应的软件来驱动外部设备,使之能够完成所要求的工作。图6.1为计算机与外部设备连接示意图。6.1输入/输出概述

在图中,计算机的外部设备都是通过I/O接口连接到系统上的,I/O接口包括数据、控制和状态三种不同性质的信息,分别由相应的寄存器存放。1.数据寄存器:用来存放外部设备与CPU之间传送的数据,这种寄存器实际上起缓冲区的作用。不同的I/O设备要求传送的数据类型一般是不同的,例如,向显示器传送数据必须是ASCII码,而不能是二进制形式的数。2.控制寄存器:CPU给外设或接口的命令通过此寄存器进行传送,通过控制命令告诉外设或接口要做什么。例如:CPU向打印机接口发送启动或停止打印的命令来控制打印机。3.状态寄存器:用来存放外设或接口的当前状态信息,CPU通过读取该信息,可以实时了解外设或接口的工作情况。对于输入设备,通常用准备好(READY)信号来表示外设已准备好数据,这时CPU可以从其读入数据。对于输出设备,通常用忙(BUSY)信号表示外设是否处于空闲状态,如处于空闲状态,则CPU可以向其发送数据,否则CPU要等待。

这些寄存器都分配一个称为I/O端口的地址编码,CPU和内存就是通过这些端口和外部设备进行通信的。在8086微机中,I/O端口的编址在一个独立的地址空间中,在这个I/O空间中允许设置64K个8位或32K个16位端口地址。表6.1列出了部分I/O端口地址,对于不同型号的计算机及其接口,其I/O端口的地址有时不完全相同。

6.1输入/输出概述6.1.2输入/输出指令

CPU寻址外部I/O端口有两种方式,一是存储器寻址方式,在这种编址方式中,把I/O端口作为存储器的一个存储单元,统一纳入存储器地址空间,为每一个端口分配一个存储器地址,CPU可以用访问存储器的方式来访问I/O端口。这种编址方式的优点是:不用专门设置访问端口的指令,用于访问存储器的指令都可以用于访问端口。缺点是:由于端口占用了存储器的一部分存储空间,使得存储器的实际存储空间减少;程序I/O操作不清晰,难以区分程序中的I/O操作和存储器操作;由于指令长度比专门的I/O指令长,因此执行时间要长。在MCS-51、MCS-96等单片机系统中,多数采用这种编址方法。6.1输入/输出概述1.输入指令IN

指令格式:IN 累加器,端口地址IN指令是从指定端口读取一个字节或字,传送到AL或AX中。端口寻址可采用直接寻址或间接寻址两种方式,当采用直接寻址时,端口地址是一个8位立即数,其范围是0~255;当采用间接寻址方式时,端口地址必须存放在DX寄存器中,其范围是0~65535。具体指令格式有以下四种:

IN AL,PORT ;AL←(PORT)

IN AX,PORT ;AX←(PORT+1:PORT)

IN AL,DX ;AL←((DX)) IN AX,DX ;AX←((DX+1):(DX))例6.1

下面两条指令将端口地址0028H和0029H的内容传送到存存器DATAW单元中。

IN AX,28H MOV DATAW,AX

例6.2LPT1打印机状态端口地址为379H,试将其状态信息读入AL。

MOV DX,379H IN AL,DX6.1输入/输出概述2.输出指令OUT

指令格式:OUT 端口地址,累加器OUT指令将AL(字节)或AX(字)的内容输出到指定端口。端口寻址方式与输入指令相同,所以输出指令也有以下四种格式:

OUT PORT,AL ;(PORT)←(AL) OUT PORT,AX ;(PORT+1:PORT)←(AX)

OUT DX,AL ;(DX)←(AL) OUT DX,AX ;(DX+1:DX)←(AX)

例6.3LPT1打印机控制端口地址为37AH,试向其写入控制字0CH。

MOV DX,37AH MOV AL,0CH OUT DX,AL需要注意的是:I/O指令中使用的寄存器必须是AL或AX。端口寻址方式中,间接寻址可以覆盖直接寻址的地址范围,但直接寻址范围只能是0~255。I/O指令端口地址没有使用分段寻址,因而端口地址范围在0~65535的64KB之间。6.1输入/输出概述程序直接控制输入/输出方式又分为两种,一是为直接方式,是指CPU可在任何时刻直接用I/O指令与外部设备进行数据交换。显然,这种方式对外设有很高的要求,它必须能像内存一样时刻准备着与CPU进行数据传递,并且能够跟上CPU的速度,保证传送信息的正确性。另一种是查询方式,有些外部设备传递数据的速度比较慢,而CPU执行指令的速度比它快很多,所以如果不考虑外设与CPU之间的速度匹配问题,就可能造成数据丢失。

6.2.1直接方式直接输入/输出方式的优点是硬件电路简单,程序编写容易,调试方便等。

例6.4

有一数据采集系统,所采集的参数有流量、压力和温度。参数都经过数字传感器转为数字量存入接口寄存器中,硬件连接如图6.2所示,试编程实现参数的采集,并将数据存入BUFFER单元中。

如图所示,设端口地址分别为30H、31H和32H,端口寻址是通过地址译码器选中和IO/M有效来选通相应的端口地址。由于所采集的物理量变化缓慢,采集的时间不受限制,传感器输出始终处于准备好的状态,因此可以直接访问传感器的端口来读取参数。6.2程序直接控制输入/输出方式

DATA SEGMENTBUFFER DB 3DUP(?) ;定义数据存储区PORT1 EQU 30H ;定义端口地址常量PORT2 EQU 31HPORT3 EQU 32HDATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATASTART: PUSH DS SUB AX,AX PUSH AX

MOV AX,DATA MOV DS,AXNEXT: LEA BX,BUFFER ;取数据存储区有效地址

IN AL,PORT1 ;读温度数据

MOV [BX],AL ;存温度数据 CODE ENDS

ENDSTART6.2程序直接控制输入/输出方式

INC BX IN AL,PORT2 ;读流量数据

MOV [BX],AL ;存流量数据

INC BX IN AL,PORT3 ;读压力数据

MOV [BX],AL ;存压力数据

CALL TREAT ;调用数据处理子程序

JMP NEXTMAIN ENDPTREAT PROC NEAR ;数据处理子程序 ┇

RETTREAT ENDPCODE ENDS END START6.2程序直接控制输入/输出方式

例6.5

利用计算机8253-5定时器声源产生一发声程序。该程序按照输入指定可发出一个或多个长音(每个长音为3秒),以及一个或多个短音(每个短音为0.5秒)。每个发音之间的间歇为0.5秒。计算机发声系统硬件原理框图如图6.3所示。

该系统的发生原理是:8253-5定时器通道2计数器的门控信号由8255端口B的D0位控制,通道2计数器的输出信号能否驱动扬声器,还取决于8255端口B的D1位,当D0D1=11时即将定时器与扬声器接通,可使扬声器发出声音。对8253-5定时器通道2计数器的编程为方式3,预置一固定的音调频率(输入一除数),当D0=1时,计数器开始计数,通道2计数器可产生输出信号。若置入计数初值为533H,则计数器可产生一方波频率序列,其频率等于6.2程序直接控制输入/输出方式

1.1931816MHz/533H=896Hz。8253-5定时器通道2计数器的端口地址为42H,8253-5定时器控制字寄存器的端口地址为43H。其控制字的格式及设置如下:

6.2程序直接控制输入/输出方式

;判断长短音子程序(入口参数:DH=发出长音个数,DL=发出短音个数)LSSOUND PROC NEAR PUSHF ;保护标志寄存器

CLI ;关中断

OR DH,DH ;判断是否发长音

JZ SHORT1LONG1: MOV BL,6 ;置长音计数器

CALL SOUND ;调发声子程序LONG2: LOOP LONG2 ;发音之间的间歇

DEC DH ;继续发长音吗?

JNZ LONG1SHORT1: MOV BL,1 ;置短音计数器

CALL SOUND ;调发声子程序SHORT2: LOOP SHORT2 ;发音之间的间歇

DEC DL ;继续发短音吗?

JNZ SHORT1DELAY1: LOOP DELAY1 ;发完音间歇

6.2程序直接控制输入/输出方式

DELAY2: LOOP DELAY2 ;返回前间歇

POPF ;恢复标志寄存器

RETLSSOUND ENDP发声子程序(入口参数:BL=发音时间,单位:0.5秒)SOUND PROC NEAR MOV AL,10110110B ;通道2方式字

OUT 43H,AL ;写入控制字端口

MOV AX,533H ;确定896Hz除数

OUT 42H,AL ;先送LSB MOV AL,AH OUT 42H,AL ;再送MSB IN AL,61H ;读8255端口B MOV AH,AL ;保留原端口信息

OR AL,03H OUT 61H,AL ;接通扬声器

SUB CX,CX ;一次发声0.5秒 6.2程序直接控制输入/输出方式

6.2.2查询方式对于工作速度较低的外部设备,当CPU要向其输出数据时,在输出前必须要查询外设是否处于接收数据的状态。若处于接收状态,则CPU可执行OUT指令,向外设输出数据,否则重新查询,直到外设处于接收状态为止。同样,当CPU要从外设读入数据时,在读入前也必须查询输入设备是否处于数据准备好状态。若数据准备好,则CPU可执行IN指令,从外设读入数据,否则重新查询,直到外设准备好数据为止。需要注意的是:在外设没有准备好之前,CPU始终处于查询等待,不能做其它操作。如果外设可能由于故障等原因始终处于未准备好状态,为防止长时间查询而使CPU处于无限循环等待状态,则在实际查询输入/输出程序中可以设定一个超时参数。即在规定的时间内,若外设没有准备好,则放弃此次数据的交换过程。其一般查询方式的流程图如图6.4所示。6.2程序直接控制输入/输出方式

例6.6

控制打印机以查询方式工作,打印一个字符串,共打印10行,在打印过程中要进行超时检查,若超时,则在显示器上输出“PrinterError”。打印字符串如下: “Printacharacterstring”打印机是一种可以按查询方式工作的输出外设,它与主机连接的接口部件是打印机适配器,也就是平常所说的“标准并行接口”。打印机接口中包含数据寄存器、状态寄存器和控制寄存器,它们各自占据一个外设端口号码,分别是:数据寄存器—378H,状态寄存器—379H,控制寄存器—37AH。打印机接口的状态寄存器和控制寄存器各位的定义如下: 打印机状态寄存器:6.2程序直接控制输入/输出方式

6.2程序直接控制输入/输出方式

在本例中,为实现超时检查,使用状态寄存器的D0位作为超时标志,超时判断的方法是设定一个查询打印机“忙闲”位的次数,如果在这个数内,打印机始终处于“忙”状态,则断定为超时错误。该例流程图如图6.5所示。

6.2程序直接控制输入/输出方式

源程序如下:DATA SEGMENTPRINT DB ‘Printacharacterstring’,0DH,0AHRROR DB ‘PrinterError’,0DH,0AH,‘$’DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOVDX,37AH ;打印机初始化程序

MOVAL,08H ;打印机联机

OUT DX,AL MOVCX,1000 ;维持初始化信号一段时间INIT: LOOPINIT MOV AL,0CH OUT DX,AL ;结束初始化,保持联机

MOV CX,10 ;打印10行

6.2程序直接控制输入/输出方式

AGAIN: LEA BX,PRINT ;取待打印字符串首址NEXT: MOVDX,379H ;取打印机状态寄存器地址

MOV SI,0FFFFH ;设置查询次数

WAIT: INAL,DX ;读入打印机状态寄存器

TEST AL,80H JNZPRINTING ;打印机空闲,转去送数据

DEC SI ;查询次数减1 JNZ WAIT JMP PERROR ;超时,输出打印机出错PRINTING: DEC DX ;取数据端口号

MOV AL,[BX] ;取待打印字符

OUT DX,AL ;送字符到数据端口暂存

MOV DX,37AH ;选通打印机

MOV AL,0DH OUT DX,AL ;置STB信号为1 DEC AL6.2程序直接控制输入/输出方式

OUT DX,AL ;置STB信号为0 CMP [BX],0AH ;判断一行结束否?

JZNEWLINE ;结束,转打印新一行

INCBX ;修改字符串地址指针

JMPNEXTNEWLINE: LOOPAGAIN JMP EXITPRERROR: LEA DX,ERROR ;显示打印机出错信息

MOV AH,09H INT 21HEXIT: MOVAX,4C00H ;返回操作系统

INT 21HCODE ENDS END START6.2程序直接控制输入/输出方式

例6.7CPU要从三个设备轮流输入数据,设PROC1、PROC2和PROC3分别为设备1、设备2和设备3的数据输入子程序;设三个设备的状态寄存器的端口地址分别用STAT1、STAT2和STAT3表示,这三个状态寄存器的第5位是输入准备位,该位为“1”表示数据准备好。试编制CPU从这三个设备轮流输入数据的程序段。INPUT: IN AL,STAT1 ;读取设备1状态信息

TEST AL,20H ;检测第5位是否为1?

JZ DEV2 ;不为1,转设备2 CALL FARPTRPROC1 ;读入设备1的数据DEV2: IN AL,STAT2 ;读取设备2状态信息

TEST AL,20H ;检测第5位是否为1?

JZ DEV3 ;不为1,转设备3 CALL FARPTRPROC2 ;读入设备2的数据DEV3: IN AL,STAT3 ;读取设备3状态信息

TEST AL,20H ;检测第5位是否为1?

JZ NO_INPUT ;不为1,转不输入

CALL FARPTRPROC3 ;读入设备3的数据NO_INPUT: ┇6.2程序直接控制输入/输出方式

查询输入/输出方式的优点是:可以用程序安排几个输入输出设备的先后次序,来设定设备的优先级,最先查询的设备,其工作的优先级最高;另外通过联络可以实现CPU与外设间的正确输入输出操作,从而使不同工作速度的外设可以和CPU协调工作。但缺点是:为了知道外设的工作状态,要求CPU不断地查询外设的状态,当查询到的状态不是要求的状态时,CPU则要等待再查询,直到所需状态的到来。在此期间,CPU不能进行其它操作,白白浪费了CPU原本可以执行大量指令的时间。特别是当外设输入输出速度较低时(如键盘、打印机等),CPU用于查询的时间要比完成一次输入输出操作的时间长得多,从而造成了CPU的极大浪费。为解决这个问题,可采用下节介绍的中断输入/输出方式。6.2程序直接控制输入/输出方式

中断输入/输出方式就是为了提高CPU的工作效率而引入的,其基本思想是当CPU需要输入输出数据时,先执行启动外设工作的指令,然后CPU就继续执行原程序。如果是输入操作,当输入数据已存到外设接口的输入寄存器时,或输出操作,当外设接口输出寄存器已空闲时,就由外设向CPU发出中断请求。CPU收到外设中断请求后,就暂停原来正在执行的程序(即实现中断),转去执行输入(或输出)处理程序(即中断处理程序)。在完成所需要的输入(或输出)处理操作后,就返回原程序从被中断处接续执行。这种输入/输出方式不是CPU去查询外设的状态,而是当外设完成一次输入(或输出)操作后,主动向CPU发出中断请求,请求CPU为它服务。这样就把外设忙期间的时间让给CPU去做其它工作,因此极大地提高了CPU的工作效率。这种方式还允许CPU同时启动多个外设,即允许CPU与多个外设同时工作。6.3中断输入/输出方式

6.3.18086中断系统概述中断控制是现代计算机发展中的一种重要技术,它的出现原是为克服对外设I/O接口采用程序查询方式所带来的CPU低效率的弊端,故最初的中断一律是对外设而言的,称之为外中断(即硬件中断)。但随着计算机系统结构的不断复杂及应用技术日益提高,中断的使用范围也随之扩大,出现了另外两种中断类型:内中断和软中断,这就构成了一个完整的计算机中断系统。1.中断源类型所谓中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作。这些引起中断的事件称之为中断源。中断源可以来自于外部设备(如输入/输出请求)——称为外中断。也可以来自于内部硬件出错(如内存奇偶校验错、协处理器异常等);或者为处理器遇到某些特殊事件(如INTN指令、除数零、运算溢出或单步执行等)引起的,通常前者中断源引发的中断称之为不可屏蔽中断(NMI);后者中断源引发的中断称为软中断,为区别外中断,这里统称为内中断。8086CPU共支持256个中断,CPU为识别每一种中断源,将它们从0到255编号,赋以一个中断类型号N,简称为中断类型。8086CPU的中断源如图6.6所示,图中引线旁标示的是系统分配的中断类型号。6.3中断输入/输出方式

1)不可屏蔽中断(NMI)不可屏蔽中断是通过NMI信号端(中断类型号为2)向CPU发出中断请求的,该请求不受中断标志位IF的影响,所以该中断主要用于一些紧急的事件或故障处理。比如:存储器的奇偶效验检测或电源故障等。2)可屏蔽中断可屏蔽中断是外部中断,是通过INTR信号端向CPU发出中断请求的,该请求受中断标志位IF的影响。当IF设置为1时,CPU便可接受外部中断请求,此时称为开中断;当IF清为0时,CPU不接受外部中断请求,此时称为关中断。由图可以看出,外部中断是通过8259A可编程中断控制器控制,可使8个外部中断源通过INTR向CPU发出中断请求。标志寄存器中的IF位只是控制是否允许CPU响应外部中断,而不控制外部中断源是否可以向CPU发出中断请求。这个功能可由8259A的8位中断屏蔽寄存器来实现,它的端口地址为21H,用来控制8个外部中断源是否允许向CPU申请中断,屏蔽寄存器如图6.7所示。当某位为0时,允许外部设备中断;当为1时,禁止(屏蔽)外部设备的中断。因此,某个外设要想实现CPU响应其中断请求,必须满足IF=1和相应位为0这两个条件。6.3中断输入/输出方式

例如:允许键盘中断,可用下列指令实现:

STI ;开中断

IN AL,21H;读取中断屏蔽寄存器

AND AL,11111101B ;键盘中断允许位置0 OUT 21H,AL ;写入中断屏蔽寄存器3)内中断内中断不受中断标志位的影响,一旦出现这种中断,CPU就响应这一中断并执行相应处理程序。(1)INT指令引起的内中断当CPU执行完一条INTN指令后,立即产生中断并调用系统中相应的中断处理程序来完成中断功能。N为中断类型号,系统可提供256个中断类型号,除系统占用的类型号以外,用户可以利用保留的类型号来扩充新的中断处理功能。6.3中断输入/输出方式

(2)INTO中断该中断为溢出中断,其类型号为4,当程序执行过程中,遇到INTO指令时,且此时溢出标志OF=1,则产生中断并转入溢出中断处理程序。该处理程序只是给出一个出错信息,在处理程序结束时,不返回原程序而返回系统。若遇到INTO指令,但此时OF=0,则CPU继续执行原程序。例如下面的指令用来测试加法的溢出:

ADD AX,VALUE INTO

(3)除法错误中断该中断的类型号为0,当除数为零或商超过了寄存器所能表达的范围时,则CPU自动产生0号中断,并给出该中断的入口地址。用户可编写相应的中断处理程序,以解决除法溢出问题。(4)单步中断当把单步标志位TF置为1时,则在每执行完一条指令后,CPU自动产生类型号为1的中断—单步中断。在中断处理程序的控制下,给出有关寄存器的内容和各状态标志位的状态。使用单步中断可以一条指令一条指令地跟踪程序的运行,这在调试程序时非常有用。6.3中断输入/输出方式

2.中断优先级1)中断优先级在外中断、内中断中有多个中断源,为解决同时有多个中断源向CPU发出中断请求时的响应问题,CPU规定了中断源的优先级,中断源的优先顺序为:除法错误→INTO→INTN→NMI→INTR→单步中断。其中:在INTR(可屏蔽中断)中,有8个中断源,分别命名为IRQ0~IRQ7,系统默认IRQ0优先级最高,以后依次降低,IRQ7最低。由于这8个中断源受8259A可编程中断控制器控制,因此IRQ0~IRQ7可由8259A中断命令寄存器改变它们的优先级。当有多个中断源同时发出中断申请时,CPU将根据上述规定的优先次序,首先响应优先级最高的中断请求,在完成该中断处理程序后,再响应次高优先级的中断请求。以优先级顺序逐个处理各中断源的中断请求。6.3中断输入/输出方式

2)8259A中断命令寄存器8259A中断命令寄存器的端口地址为20H,各位如图6.8所示。例如:IRQ0~IRQ7为正常优先级顺序,现要求IR4为最低级中断请求,则向中断命令寄存器发送如下命令:

MOV AL,11100100B OUT 20H,AL命令执行完后,优先级的顺序为:IRQ5,IRQ6,IRQ7,IRQ0,IRQ1,IRQ2,IRQ3,IRQ46.3中断输入/输出方式

(3)EOI:中断结束位,当EOI=1时,当前正在处理的中断请求被清除。所以在每个中断处理程序结束时,必须把中断结束位置1,这表明该中断处理程序结束,并允许该中断源重新发出中断请求。否则,该中断源不能再发出中断请求,同时也会屏蔽掉对以后同级或低级中断的处理。当然在必要时候,在中断处理程序中也可利用EOI位清除当前的中断请求,使得在中断处理的过程中又能响应同级或低级中断请求。清除硬件中断用如下命令:

IN AL,20H OR AL,00100000B OUT 20H,AL3)中断嵌套所谓中断嵌套是指计算机正在执行一个中断处理程序时,有另一个优先级更高的中断源提出中断请求,这时计算机会暂时终止当前正在执行的级别较低的中断源的中断处理程序,转去处理高优先级的中断处理程序,待处理完毕后,再返回到被中断了的中断处理程序继续执行的过程。6.3中断输入/输出方式

80X86没有规定中断嵌套的层次,但在实际使用时,多重的中断嵌套要受到堆栈容量的限制,所以在编写中断程序时,一定要考虑有足够的堆栈单元来保存多次中断的断点及各寄存器的内容。为实现中断嵌套,需要注意的是:在每一个中断处理程序的开始部分要用STI指令将IF位置1—开中断,这样计算机在执行该中断处理程序过程中,可以响应比该中断源优先级更高的中断源的中断请求。若在中断处理程序中发出中断结束命令,即EOI位置1,则计算机在执行该中断处理程序过程中,在发出中断结束命令后,还可以响应同级或低优先级中断源的中断请求。6.3中断输入/输出方式

例6.8

在正常优先级方式下,假设在主程序执行过程中,IR2和IR4同时发出中断请求,而后IR1申请中断,最后IR3的中断请求也到达。其中断处理顺序如下:由于IR2比IR4中断优先级高,所以CPU首先响应IR2,从主程序转去处理IR2的中断处理程序。进人IR2中断处理程序后,立即将IF置为1。当IR1的中断请求到达后,因IR1的优先级高于IR2,CPU就立即中止执行IR2的程序,转去执行IR1的中断处理程序。在IR1处理程序中,由指令发出了EOI命令,结束了IR1的中断请求。返回IR2处理程序后,同样由于发出EOI命令清除了IR2的中断请求,所以在较低优先级的中断请求IR4到达后,即转向处理IR4的中断请求。在IR4处理程序的执行过程中,IR3的中断请求到达,当判断IF已被置为1,则又中断了IR4的程序,转去执行IR3的中断处理程序。在IR3程序中,也发出了开中断指令(STI)和中断结束命令(EOI),最后IRET指令使其返回到IR4程序,IR4的程序在返回IR2的程序之前也发出了EOI命令,结束了IR4的中断请求。IR2中断请求在前面已被清除,所以IR4执行完后,返回IR2继续执行直到返回主程序。各中断处理程序的执行顺序如图6.9所示。6.3中断输入/输出方式

6.3.2中断向量表1.中断向量表

在8086中断系统中,为每种中断都安排了一个中断类型号(类型号为0~0FFH),每种类型的中断都有相应的中断处理程序,来完成中断的任务。为了方便管理中断处理程序,系统把所有的中断处理程序的入口地址都集中在一起,构成一个中断向量表。每个入口地址占4个字节,高2个字节存放中断处理程序的段基址,低2个宇节存放中断处理程序的段内偏移地址。各中断处理程序的入口地址是按中断类型号的顺序存放在中断向量表中,因此每类中断向量的地址可由中断类型号乘以4计算出来。例如:当类型号8中断发生时,则系统从中断向量表地址4×8=0010H中取得8号类型的中断处理程序的入口地址,分别送入IP和CS寄存器中,CPU就可以转入相应的中断处理程序。256个中断处理程序的入口地址共占用1024个字节空间,位于存储器0000:0000H~0000:03FFH地址空间,中断向量表如图6.10所示。6.3中断输入/输出方式

表6.2列出了80x86各类型中断在中断向量表中的地址。2.存取中断向量我们知道,中断向量表是用来存放中断程序的入口地址的,当某类型中断请求被CPU响应后,CPU就到中断向量表中取得该类型中断的中断处理程序的入口地址,分别送入IP和CS寄存器中,即可运行该中断的处理程序。如果要想计算机运行用户自己编写的中断处理程序,用户可以利用保留的中断类型号来实现这一功能。具体做法是:将用户编写的中断处理程序的入口地址存入中断向量表即可。6.3中断输入/输出方式

例6.9

设N为保留的中断类型号,有一中断处理程序INTPR,当执行INTN指令后,即可运行INTPR程序。试编写程序段实现这一功能。CODE SEGMENTMAIN PROC FAR ┇ ;将中断处理程序的入口地址存入中断向量表

MOV AX,0 ;ES←中断向量表段基址

MOV ES,AX MOV BX,N*4 ;BX←类型号N的偏移地址

MOV AX,OFFSETINTPR ;AX←中断处理程序偏移地址

MOV ES:WORDPTR[BX],AX;置中断处理程序的偏移地址

MOV AX,SEGINTPR ;AX←中断处理程序的段地址

MOV ES:WORDPTR[BX+2],AX;置中断处理程序的段地址 ┇

INT N ;即可转入INTPR ┇MAIN ENDP6.3中断输入/输出方式

INTPR PROC NEAR ;中断处理程序 ┇

IRET ;中断返回指令INTPR ENDPCODE ENDS在上例中,ES存放中断向量表的段基址,BX存放中断类型号N在中断向量表的偏移地址。首先将类型号N的中断处理程序入口地址中的偏移地址和段地址分别存入中断向量表。这样当执行INTN指令后,便可执行INTPR中断处理程序。如果用户自己编写的中断处理程序代替系统某个中断类型的中断处理程序时,需要注意保存原有的中断向量。即在设置用户自己的中断向量时,首先保存原有的中断向量,然后再设置用户的中断向量,最后在用户的中断处理程序结束前恢复原中断向量。在存取中断向量时,最好不直接使用中断向量的绝对地址,而是利用DOS系统调用的21H类型中的25H和35H号功能来实现中断向量的存取,具体操作见表6.3。6.3中断输入/输出方式

例6.10

用DOS系统功能调用完成例6.9的中断向量的存取CODE SEGMENTMAIN PROC FAR ┇;从中断向量表中取原中断向量

MOV AL,N ;AL←中断类型号

MOV AH,35H INT 21H PUSH ES ;保存原中断向量

PUSH BX;将新的中断向量存入中断向量表中

PUSH DS MOV AX,SEGINTPR;DS←中断处理程序的段地址

MOV DS,AX MOV DX,OFFSETINTPR ;DX←偏移地址

MOV AL,N ;AL←中断类型号 MOV AH,25H INT 21H 6.3中断输入/输出方式

POP DS ┇ INT N ;即可转入INTPR ┇;在中断向量表中恢复原中断向量

POP DX ;从堆栈中取出原中断向量 POP DS ;将原中断向量存入中断向量表 MOV AL,N MOV AH,25H INT 21H ┇MAIN ENDPINTPR PROC NEAR ;中断处理程序 ┇

IRET ;中断返回指令INTPR ENDPCODE ENDS6.3中断输入/输出方式

6.3.3中断过程一个中断源的中断请求一旦被响应,系统便进入中断响应周期,CPU中断系统自动完成下列操作:1.取中断类型号N;2.标志寄存器(FLAGS)内容入栈;3.当前代码段寄存器(CS)内容入栈;4.当前指令指针寄存器(IP)内容入栈;5.禁止硬件中断和单步中断(IF=0,TF=0);6.从中断向量表偏移地址4×N单元中取字内容送入IP,从偏移地址4×N+2单元中取字内容送入CS;7.转去执行中断类型号N的中断处理程序;8.当中断处理程序执行完后,恢复断点,即从堆栈中弹回断点的偏移地址和段基址到IP和CS,并从堆栈中恢复标志寄存器内容,即实现了中断的返回。6.3中断输入/输出方式

由于在中断发生时,CPU自动清除了IF和TF位,这就使得CPU转入中断处理程序后,不再允许再产生新的中断。如果在此期间,还允许外部的中断请求,可在中断处理程序的开头通过STI指令再将IF位置1即可。此外,需要注意的是设备发到CPU的中断请求信号在时间上是随机的,如果此时CPU正在执行一条一般的指令,则要等这条指令执行完后,CPU才响应中断。但对加封锁的指令(如LOCKMOVAX,BX)应看作为一条指令处理;对加重复前缀的串指令(如REPMOVSB),也要作为一个整体来处理,但不是把串操作全部重复执行完,而是执行一次重复和串指令即可响应中断;对MOV指令和POP指令,如果处理对象是段寄存器,那么本条指令执行完后,接着再执行一条指令才响应中断。对开中断指令STI和中断返回指令IRET,也是要在STI或IRET指令执行完后,再执行一条指令才响应中断。6.3中断输入/输出方式

6.3.4中断处理程序举例1.中断处理程序结构中断处理程序是因中断源请求而运行的满足中断源要求的特定功能程序,因此中断处理程序是为该中断源服务的。中断处理程序的结构与子程序(即过程)相似,所有编写过程的一些规定和要求均适用于中断处理程序,包括用伪指令PROC/ENDP定义中断处理程序。但它与子程序的编写也有一些不同之处,下面是编写中断处理程序的典型结构。

1)现场保护:由于中断请求是随机发生的,它可能出现在执行程序中的任何部分,因此必须进行现场保护,以保证在执行完中断处理程序后,能够正确返回被中断的原程序断点处。一般来说,如果中断处理程序较简单,所用寄存器不多,则只需保护处理程序中使用的寄存器即可;但当中断处理程序较复杂,且使用较多寄存器时,则应保护所有的寄存器。2)中断嵌套:由中断过程知道,当CPU响应一个中断时,总是自动把IF和TF位清0,禁止新的可屏蔽外中断源的请求,所以为了实现多级中断处理,应在中断处理程序的适当位置(例如已保护好现场)上使用开中断指令STI,使CPU的IF位置1,以便允许CPU响应高优先级中断源的中断请求,实现中断源的嵌套使用。6.3中断输入/输出方式

3)中断结束命令:对于外部中断,根据8259A中断控制器的使用要求,在中断处理程序某个位置或返回之前,应该发一条中断结束命令给8259A中断命令寄存器(端口地址为20H),撤消中断标志位,以便接收新的中断请求。

4)中断返回:中断处理程序返回时,应使用IRET指令,而不是过程返回指令RET。这是因为在中断响应时,中断逻辑将进行标志寄存器及断点的自动保护,所以在中断返回时,只有IRET指令才能自动恢复断点和标志寄存器的内容,而RET指令并不能恢复标志寄存器的内容。6.3中断输入/输出方式

例6.11中断处理程序的典型结构INTSTR PROC NEAR[/FAR] STI ;开中断

PUSH AX ;保护现场

PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH DS PUSH ES ┇ ;中断处理程序主体 ┇

MOV AL,20H;发中断结束命令(EOI=1)

OUT 20H,AL POP ES ;恢复现场

POP DS POP DI POP SI POP DX POP CX POP BX POP AX IRET ;中断返回INTSTRENDP6.3中断输入/输出方式

2.中断处理程序举例例6.12

编写以中断方式打印输出一个字符串的程序。假定字符串存放在BUFF开始的单元,字符串长度存放在CONT单元。印机是输出的机械设备,速度比CPU的处理速度慢得多。因此通常利用中断传送方式打印信息,在打印机空闲时,请求CPU给它打印数据,而不用让CPU不停地查询,这样可使CPU和打印机并行工作,以节省大量的CPU时间。采用中断方式打印字符时,首先将待打印的字符由CPU送人打印机的数据寄存器,然后通过控制寄存器发送一个选通信号给打印机。当打印机把字符打印完毕之后,通过状态线发送一个认可信号给CPU。允许CPU发送下一个字符。这时如果打印机工作在中断方式,那么同时向CPU发中断请求信号(通过8259A的IR7,中断类型号为0FH)。打印机接口中的数据寄存器、状态寄存器和控制寄存器端口地址分别是378H、379H、37AH,其状态寄存器和控制寄存器的定义见例6.6。6.3中断输入/输出方式

DATA SEGMENT ;定义数据段BUFF DB ‘8086CPUPrinterInterruptProgram’,0AH,0DHCONT DB $-BUFFDATA ENDSSTACK SEGMENT STACK ;定义堆栈段

DW 100HDUP(?)TOS LABEL WORDSTACK ENDSCODE SEGMEN ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARSTART: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSETTOS;设置栈顶指针寄存器SP MOV AL,0FH ;保存原中断向量

MOV AH,35H

6.3中断输入/输出方式

INT 21H

PUSH ES PUSH BX PUSH DS

MOV AX,SEGPINT ;中断处理程序入口的段基址

MOV DS,AX MOV DX,OFFSETPINT;入口的偏移地址

MOV AX,250FH ;设置打印中断处理程序向量

INT 21H POP DS IN AL,21H ;读8259A的中断控制寄存器

AND AL,7FH ;8259A允许打印机中断

OUT 21H,AL MOV DX,37AH ;DX←控制寄存器地址

MOV AL,00011100B ;置打印机为中断工作方式

OUT DX,AL6.3中断输入/输出方式

MOV DX,378H ;DX←数据寄存器地址

MOV BX,OFFSETBUFF ;取打印缓冲区首地址

MOV AL,[BX] ;取第一个字符

OUT DX,AL ;送打印机数据寄存器

INC BX ;缓冲区地址加1 DEC CONT ;字符串长度减1 STI ;开中断

MOV DX,37AH ;选通打印机

MOV AL,1DH OUT DX,AL ;置STB信号为1 DEC AL OUTDX,AL ;置STB信号为0 MOV SI,0FFFFH ;处于中断等待状态WAITP: MOV DI,0FFFFH ;实际应用可运行其它程序WAITP1: DEC DI JNZ WAITP1 DEC SI JNZ WAITP6.3中断输入/输出方式

POP DX ;恢复原中断向量

POP DS MOV AL,0FH MOV AH,25H INT 21H MOV AX,4C00H ;返回系统

INT 21HMAIN ENDPPINT PROC NEAR ;打印机中断处理程序

PUSH AX ;保护现场

PUSH CX MOV AL,[BX] ;取下一个字符

MOV DX,378H ;送打印机数据寄存器

OUT DX,AL INC BX DEC CONT ;未打印完,退出中断

JNZ EXIT6.3中断输入/输出方式

MOV DX,37AH MOV AL,00001100B;打印完,禁止打印机中断

OUT DX,ALEXIT: MOV AL,20H ;发出中断结束命令

OUT 20H,AL POP CX ;恢复现场

POP AX IRET ;中断返回PINT ENDPCODE ENDS END START6.3中断输入/输出方式

例6.13

利用保留的中断类型号65H设置内中断处理程序。要求该处理程序显示用户定义的字符串,字符串结尾标志符为“$”,串长度不超过256个字符(含回车换行符)。调用参数:AX存放字符串首地址。返回参数:BX存放实际显示的字符数。当显示字符数超过256时,(BH)=0FFH。源程序如下:DATA SEGMENT BUFF DB ‘Thisisaexampleaboutsoftinterrupt.’,0AH,0DH,’$’ERR DB ‘ERROR!’,0AH,0DH,’$’DATA ENDSSTACK SEGMENT STACK DW 100HDUP(?)TOS LABEL WORDSTACK ENDSCODE SEGMEN ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARSTART: MOV AX,DATA6.3中断输入/输出方式

MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSETTOS PUSH DS MOV AX,SEGINT65H;中断处理程序入口的段基址

MOV DS,AX MOV DX,OFFSETINT65H ;入口的偏移地址

MOV AX,2565H;设置新中断处理程序的中断向量

INT 21H POP DS MOV AX,OFFSETBUFF;取待显示字符串首地址

INT 65H ;调用65H类型中断

CMP BH,0FFH ;判断是否超过256个字符?

JNZ EXIT LEA DX,ERR ;超过显示错误信息

MOV AH,9 INT 21H6.3中断输入/输出方式

EXIT: MOV AX,4C00H INT 21HMAIN ENDPINT65H PROC NEAR ;65H内中断处理程序

PUSH DX ;保护现场

PUSH SI MOV BX,0 ;字符计数器清0 MOV SI,AXLOP: MOV DL,[SI];取字符

CMP DL‘$’ ;是结尾标志符吗?

JZ OVER ;是,转OVER MOV AH,2 ;显示字符

INT 21H INC BX JMP LOP ;没显示完,继续OVER: CMP BH,0 ;判断超过256个字符?

JZ QUIT ;结束

MOV BH,0FFH;超过,置BH为0FFHQUIT: POP SI ;恢复现场 POP DX

IRET ;中断返回INT65H ENDPCODE ENDS END START一般增加新的内中断,大多是系统开发时所需要。此时,就应该对原操作系统作些修改,以使新增加的内中断成为系统程序的一部分,再使用时就可以直接用内中断指令调用了。如果仅是在自己的应用系统中,要设置一些内中断以方便程序设计,满足应用系统的需要,此时只在自己的程序中编写相应的内中断处理程序,并填写其入口地址到中断向量表中即可。6.3中断输入/输出方式

DOS系统为用户提供了近百个功能子程序,可供汇编语言程序设计时直接调用。这样,程序员就不必编写这些繁杂的程序,也不必为此去搞清有关的设备、电路及接口等,而只须遵循DOS规定的调用方法就可直接调用了。对于机器的使用者来说,这些子程序都可看作是操作系统向用户提供的软件资源,又称为软接口。这些子程序的主要功能包括基本输入/输出管理(如键盘、显示器、打印机、磁盘等的管理)、文件和目录管理、其它管理(如内存、时间、日期等管理)等。DOS系统功能调用都利用INT21H中断指令,为了使用方便,系统已将所有功能子程序放在其中断服务程序中并按顺序编号,这个编号就是子程序的功能号。其调用方法是:(1)AH←功能号;(2)指定寄存器←入口参数;(3)INT21H。用户只须给出以上三方面信息,DOS就可根据所给信息自动转入相应子程序执行。下面就一些典型的系统功能调用进行介绍。6.4DOS系统功能调用6.4.1键盘输入功能调用1.键盘字符码和扫描码键盘和主机通过五芯电缆相连,这五根线分别是电源线、地线、复位线以及键盘数据线和键盘时钟线。PC机系列的键盘触点电路按16行×8列的矩阵来排列,用单片机Intel8048来控制对键盘的扫描。按键的识别采用行列扫描法,即根据对行线和列线的扫描结果来确定闭合键的位置,并通过键盘数据线将闭合键所对应的扫描码(8位)送往主机。当在键盘上“按下”或“放开”一个键时,如果键盘中断是允许的,就会产生一个类型9的中断,并转人到BIOS的键盘中断处理程序。该处理程序从8255可编程序接口芯片的输人端口60H读取一个字节,这个字节的低7位是键的扫描码。最高位为0或为1,分别表示键是“按下”状态还是“放开”状态。按下时,取得的字节称为通码,放开时取得的字节称为断码。如按下ESC键时产生一个通码为01(0000001B),放开ESC键时产生一个断码为81H(1000000lB)。键盘上的每个键都对应一个扫描码,所以根据扫描码就能唯一地确定哪一个键改变了状态。表6.4是键盘上每个键对应的扫描码(十六进制)。6.4DOS系统功能调用2.系统功能调用表6.5列出了与键盘有关的DOS系统功能调用,它包括单字符的读入和把一个字符串读入存储器缓冲区的功能。

6.4DOS系统功能调用1)单字符输入键盘单字符输入的INT21H系统功能调用有1、6、7和8号功能,它们的主要区别是是否检测Ctrl-Break和是否将键入的字符回显在屏幕上。其中6号功能既可用于显示器输出又可用于键盘输入,在用于键盘输入时,若无字符就绪,则ZF=1且AL=0,否则Z=0且AL=输入的字符,该字符不回显。可以使用如下代码序列完成键盘输入(其中功能号7和8与1相同):

MOV AH,01H INT 21H MOV CHAR,AL;保存键入的字符 ┇WAIT:MOV AH,06H MOV DL,0FFH;用于键盘输入

INT 21H JZ WAIT ;若无字符,则等待

MOV CHAR,AL;保存键入的字符 ┇

MOV AH,06H MOV DL,n ;n=00H~0FEH 6.4DOS系统功能调用

INT 21H ;用于显示DL中的字符 ┇CHAR DB ? ;定义保存字符变量2)字符串输入0AH号功能提供从键盘输入1个字符串(包括回车符)送至应用程序指定的输入缓冲区功能。该缓冲区的设置规定如下:(1)第1个字节设置为缓冲区能容纳的最大字符数(1~255)。(2)第2个字节存放输入的实际字符数(不包含回车符)。(3)第3个字节开始存放输入字符的ASCII码值。如果输入的字符数超过缓冲区所能容纳的最大字符数,则随后的输入被丢弃并且响铃,直至检测到一个回车键为止。在执行过程中,由键盘输入的字符并不立即存放到指定的缓冲区,而是先存入DOS内部的键盘字符缓冲区(长达128个字节)。这样,输入的字符串中允许通过退格键、删除键或其它DOS内部键盘驱动程序可识别的常用编辑键进行修改,也可由Ctrl-C中止该功能调用,直到键入回车符后,才将包括回车在内的所有实际输入宇符,由DOS内部缓冲区复制到应用程序指定的输入缓冲区中。通常使用该功能的调用格式如下:6.4DOS系统功能调用MAXLEN DB 50 ;缓冲区容纳最大的字符数ACTLEN DB ? ;用于存放实际输入的字符数STRING DB 50DUP(?) ;存放输入的字符串(包含回车) ┇ MOV AH,0AH ;AH←功能号

MOV DX,SEGMAXLEN ;DS←缓冲区的段基址

MOV DS,DX MOV DX,OFFSETMAXLEN;DX←缓冲区的偏移地址

INT 21H ;读键盘输入的字符串 ┇6.4DOS系统功能调用6.4.2显示输出功能调用DOS系统提供了3个显示输出的系统功能调用子程序,它们分别提供了每次显示输出1个字符或1个字符串的功能,这些功能都自动向前移动光标,即光标跟随字符(串)移动。显示输出的3个子功能见表6.6。这里2号功能是显示一个字符,并检查Ctrl-Break。在调用时,对DL中的字符ASCII码值(如:Ctrl-C:03H)、回车码:0DH、换行码:0AH、响铃码:07H和退格码:08H等控制码)都会作相应的处理。此外,20H~7FH的字符在屏幕上正常显示。6号功能见键盘的系统调用。对于9号功能子程序,在调用时,待显示的字符串必须以‘$’(24H)结束,而且字符串中不能含有控制码,即ASCII字符值应是20H~7FH。待显示字符串的段基址存放在DS寄存器中,串首的偏移地址存放在DX中。6.4DOS系统功能调用

例6.14

设程序PROG的运行密码为qazwsx,在运行该程序前,提示输入密码。当密码输入正确时,运行该程序,否则输出密码错误信息,并提示是否继续输入?若输入y,则返回密码输入,否则返回系统,试编写该程序。源程序如下:DATA SEGMENTMESS1 DB ‘PleaseInputPassword:’,0DH,0AH,‘$’;提示信息PASSWORD DB ‘qazwsx’ ;密码MESS2 DB ‘PasswordIsError!’,0DH,0AH,‘$’;提示的错误信息MESS3 DB ‘Continue?yORn:’,0DH,0AH,‘$’ BUFFER DB 10,?,10DUP(?) ;输入密码缓冲区DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATA

;赋段基址

MOV DS,AX MOV ES,AX

6.4DOS系统功能调用NEXT: MOV AX,SEGMESS1;显示输入密码提示信息

MOV DS,AX MOV DX,OFFSETMESS1

MOV AH,09H INT 21H MOV AX,SEGBUFFER ;输入密码

MOV DS,AX MOV DX,OFFSETBUFFER MOV AH,0AH INT 21H CALL CRLF ;调用回车换行子程序

MOV CL,BUFFER+1 ;取实际输入字符数

CMP CL,MESS2-PASSWORD;输入密码个数和原密 JZ CMPEV ;码个数比较AGAIN: MOV AX,SEGMESS2 ;显示密码输入错误

MOV DS,AX MOV DX,OFFSETMESS2

6.4DOS系统功能调用

MOV AH,09H INT 21H CALL CRLF ;调用回车换行子程序

MOV AX,SEGMESS3;显示是否继续输入密码

MOV DS,AX

MOV DX,OFFSETMESS3

MOV AH,09H INT 21H MOV AH,01H ;接收y或n INT 21H CMP AL,‘y’ ;是y,则继续输入密码

JZ NEXT JMP EXIT ;不是,返回系统CMPEV: LEA SI,PASSWORD;输入密码和原密码比较

LEA DI,BUFFER+2;输入密码首字符送DI MOV CX,MESS2-PASSWORD;密码字符个数

6.4DOS系统功能调用

CLD ;DF=0 REPZ CMPSB ;串比较

JNZ AGAIN ;密码不等转AGAIN?

CALL PROG ;相等调用PROG程序EXIT: MOV AX,4C00H ;返回系统

INT 21HMAIN ENDPPROG PROC NEAR ;被执行的程序(略) ┇ RETPROG ENDPCRLF PROC NEAR ;回车换行子程序

MOV DL,0DH MOV AH,02H INT 21H

MOV DL,0AH MOV AH,02H INT 21H

RETCRLF ENDP CODE ENDS END START6.4DOS系统功能调用6.4.3磁盘文件管理功能调用DOS系统有两个自成系统的磁盘文件管理功能,一个是传统的文件控制块功能(FCBfunctions),另一个是高级的文件句柄功能(Handlefunctions)。前者是借助于在应用程序中定义的文件控制块结构,与DOS的文件管理功能建立传递信息的接口。利用这个接口,应用程序既能建立、打开、关闭和删除文件,也能存取该文件中任意位置和任意长度的记录。但该功能使用繁琐,已逐渐被后者所取代。后者却是通过一个以零结尾的ASCII码串传递给DOS。该串指出了待建立或打开文件的路径名、文件名和扩展名。如果文件建立或打开操作成功,则DOS返回给应用程序一个文件句柄。其后,只要不对该文件实施关闭或删除操作,那么,任何时候应用程序都可利用该文件句柄,对相应的文件进行任意位置上任意字节长度的存取。本节只介绍文件句柄功能1.文件句柄相关概念1)文件字符串在文件建立、打开、删除或修改文件属性以及对文件树型目录操作时,DOS都要求应用程序以一个以零结尾的ASCII字符串指定文件,该字符串包括驱动器标识,路径名、文件名及扩展名。路径名之间允许用前斜杠\或后斜杠/作为分隔符。例如,定义一个树型文件:

6.4DOS系统功能调用

FilenameDB‘C:\SYSTEM\COMMAND.COM’,0在接受ASCII字符串的功能调用中,都要求应用程序用DS:DX双字指针指向该字符串变量的段基址和偏移地址,以告知DOS需要对指定的文件进行操作。2)文件句柄文件句柄是一个16位长度的二进制代码,即代表一个已被打开文件的通道号。借助于这个句柄,文件一旦被DOS打开,应用程序只需凭借由DOS返回的句柄即可对文件内容进行随意存取。系统上电初始化时,已对字符I/O标准设备预定义了五个句柄,即这五个设备(标准输入设备、标准输出设备、标准错误设备、标准辅助设备和标准列表设备)不必再重新打开便可使用。表6.7给出了DOS预定义的五个句柄。6.4DOS系统功能调用

3)返回错误代码通常,对文件句柄功能的调用只要符合调用格式,且确保有足够容量的内存缓冲区和相应的磁盘空间,操作往往是成功的,此时总以进位标志位CF=0返回。一旦操作失败,则CF=1且在AX中返回错误代码。错误代码与错误类型对照如表6.8所示。

4)文件属性文件属性是用一个字节的低6位来描述的,各位为1时含义如下:

6.4DOS系统功能调用D0:只读文件;D1:隐藏文件;D2:系统文件;D3:卷标;D4:子目录;D5:归档;当字节置0时,为普通文件。2.系统功能调用DOS文件句柄的管理子功能总共有20种之多。它们分别用于文件的建立、打开、关闭和删除以及记录的存取、目录的检索等操作。本节介绍与文件读写有关的几种功能调用,表6.9给出了与文件读写有关的几种功能调用的格式与作用。6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论