汇编语言第六章 输入输出和WIN32编程
第六章 输入/输出和中断
和WIN32编程
前面已经讲过有关输入/输出的问题,主要是用DOS 中断调用INT 21H来完成键盘输入以及屏幕显示。对于计算机来说,仅有这种输入/输出还不够,因为DOS 的中断调用无法实现对其它外设的控制。关于如何用汇编程序实现主机与外设之间的信息交换,将是本章的主要内容。包括:
输入输出指令的使用格式及功能;
主机与外部设备之间传送数据的方式;
中断的概念及中断处理程序设计;
WIN32程序设计基本方法与技术。
6.1 I/O设备与数据传送方式
一. 主机与外设之间数据的传送方式
计算机与外设之间传送数据有如下4中方式:
1. 无条件传送方式:适合于CPU 与外设同步的情况。直接传送,高速外设与主机之间数据传送。
2. 查询传送方式:适合于低速外设与主机之间数据传送。
3. 中断传送方式:适合于低速外设与主机之间数据传送。
4. 直接存贮器(又称DMA )传送方式:适合于高速外存与主机的数据传送。
其中:无条件传送和查询传送,直接在端口上利用IN 和OUT 指令传送数据。
中断传送:在DOS 及BIOS 层上通过系统功能调用的中断指令实现。
直接存贮方式:在端口上,采用通道技术实现。在计算机准备好接收,外设准备好传送数据时,外设向CPU 发一个请求DMA 传送信号,此时CPU 让出总线控制权,使外设与主存在短时间内成批传送数据。
二. 外设与主机传送的接口与信息
1. 端口与接口
计算机的外设都是通过接口连接到系统上,每个接口由一组寄存器组成,寄存器都有一个称为I/O端口的地址编码。
也就是,每一台外设都通过硬件接口与主机端口相连,并交换信息。
接口的组成:设备状态寄存器、设备控制寄存器、数据寄存器。上述寄存器在I/O空间中都有固定编码。
I/O端口的地址空间:允许设置64K 个8位端口或32K 个16位端口。对I/O空间的访问用IN 或OUT 两个指令。
I/O端口地址分配,可以查手册。
如:40H ~43H 时钟/定时器,60H ~63H 为8255通讯芯片的接口。
2. 外设与主机的信息交换
传送的信息分为三类:
① 控制信息:CPU 把控制信息从端口输出到对应外设接口的控制寄存器中,告诉外设应做什么。
② 状态信息:把外设的状态寄存器中的内容送到对应的端口中,以便CPU 了解外设状态。
③ 数据信息:需要交换的数据(8位、16位)。
6.2 程序直接控制I/O方式
直接I/O方式有两种:
① 无条件传送方式:不查询外设状态寄存器的状态,直接用IN 或OUT 指令实现CPU 与外设信息传送。该方式的特点是:CPU 与外设必须同步工作。
② 查询传送方式:查询外设状态和控制寄存器中的内容,确定是否传送。特点:CPU 与外设不同步。
一. IN 和OUT 指令
通过前面的学习,我们已经知道,外设与主机传送信息,必须用IN 和OUT 指令。
1. 输入指令IN
功能:从外设寄存器取信息送入AX 或AL 。
4种形式:
IN AL, PORT
IN AX, PORT
IN AL, DX
功能:(PORT )→AL 功能:(PORT+1,PORT )→AX 功能:([DX])→AL
IN AX, DX 功能:([DX])→AX
由AL 或AX 决定取几个端口的内容。
2. 输出指令OUT
功能:将AX 或AL 内容送到外设寄存器中。
4种形式:
OUT PORT, AL
OUT PORT, AX
OUT DX, AL
OUT DX, AX 功能:(AL )→PORT 功能:(AX )→PORT (2个8位口) 功能:(AL )→[DX] 功能:(AX )→[DX]
同样,由AL 或AX 决定送到几个端口。如:
IN AL, 40H
OUT 80H, AL
MOV DX, 379H
IN AL, DX
注意:端口地址>255,就放到DX 中。
二. 程序直接控制传送方式
1. 无条件传送方式
特点:不查询外设状态,直接用IN 和OUT 指令传送信息。采
用这种方式,必须保证外设与CPU 在传送数据的过程中,具有相同速度(同步)。
例:扬声器发声程序。
已知扬声器的控制寄存器的端口地址为61H ,硬件结构如下:
程序通过I/O指令,使设备控制寄存器的b 1位为0或1(交替为0或1),与门的输入为0和1交替的电信号,输出为一个脉冲电流,经放大后,送扬声器使之发声。
2. 查询传送方式
特点:查询外设状态,条件满足时传送。适合于低速外设与CPU 传送信息。
① 输入
输入之前,查询数据是否准备好,若准备好则输入,否则等待。 流程:
例:串行通讯
I/O。
串行通讯端口:采用8250芯片,数据寄存器端口地址为3F8H ,状态寄存器端口地址为3FDH ,其中b 0位是输入数据数据准备位,b 5位是输出数据准备位。
串行口输入程序:
② 输出
输出之前,要查询外设是否“忙”,若“忙”则等待,否则输出数据。
流程:
例:串行口输出子程序。
查询方式的缺点:CPU 反复等待状态位,浪费大量CPU 资源。
6.3 中断传送方式
为了解决查询方式下,CPU 等待外设,浪费大量CPU 资源的问题,提出了中断传送方式。引入中断之后,有如下优点:
① 提高CPU 效率
② 可以处理突发事件
③ 提高了计算机工作的灵活性
在中断方式下,程序设计的主要任务:设置中断向量、编制中断处理程序。
一. 中断的概念
中断是一种使CPU 中止正在执行的程序,而转去处理特殊事件的操作,处理结束之后,又返回到断点处继续往下执行。
中断的处理过程:①中断请求、②中断响应、③中断处理、④中断返回。
中断系统:实现中断的软硬件设施。其中,硬件有:8259A 、中断源、中断请求等。软件有:中断向量表、中断处理程序。
二. 中断源(内中断/外中断)
内中断
来自CPU 内部事件:
① 程序中使用的INT 指令产生的中断;
② CPU 的某些错误结果产生的中断(除法、溢出、单步)。
内中断的处理特点:
① 中断类型号一般在指令中; ② 不受中断允许标志位IF 的影响。 外中断
由外设控制器、协处理器等CPU 以外的事件引起的中断,称为外中断。
外中断的处理特点:
① 中断类型号由8259A 提供,或由自制电路来提供; ② 受中断允许标志位IF 的影响(IF=1,响应中断)。 8086/8088中断源:
不可屏蔽中断请求由硬件故障引起:掉电、存贮器错、总线奇偶校验错等。
8086系统中断优先级:
11
除法错、INTO (溢出中断指令)、“INT n” NMI INTR
单步中断
其中,“INT n”可处理256种中断,n 的范围: BIOS 中断:10H ~1FH DOS 中断:20H ~3FH 自由中断:40H ~FFH 三. 中断向量表
1. 中断向量表的结构
中断向量表就是各种中断类型的处理程序的入口地址表。内存中从00000H ~003FFH 用于存放中断向量表。中断类型:0~FFH ,每个类型的中断占4个字节。
如:INT 4AH
中断向量地址 = 4AH*4 = 128H
12
2. 中断类型号的获取
(1) 除法错、单步中断、不可屏蔽中断NMI 、断点中断、溢出中断(中断号0~4)。中断类型号由CPU 芯片内的部件自动提供。
(2) 软中断INT n,执行时从指令流中读出类型号。 (3) 外中断
① 标准外设,利用8259A 提供的类型号;
② 非标准外设,自制电路通过接口提供给总线,获得类型
号。
3. 设置或取出中断向量指令 (1) 设置中断向量指令
功能:把由AL 指定的中断类型的中断向量DS :DX 放入中断向量表中。
(AH )=25H (AL )=中断类型号
13
DS :DX=中断向量 INT 21H
(2) 取出中断向量指令
功能:把AL 中指定的中断类型的中断向量从中断向量表中取出送到ES :DX 中。
(AH )=35H (AL )=中断类型号 INT 21H
4. 保护方式下的中断向量表
在保护方式下,中断矢量表称作中断描述符表(IDT),按照统一的描述符风格定义其中的表项;每个表项(称作门描述符) 存放中断处理程序的入口地址以及类别、权限等信息,占8个字节,共占用2KB 的主存空间。IDTR 决定IDT 的起始PA 。
14
四. 软中断及中断的有关指令
1. 软中断 形式:INT n 功能:
① (FLAGS )→↓(SP ) 同时0→IF 、TF
15
② (CS )→↓(SP ) (4*n+2)→CS ③ (IP )→↓(SP ) 2. 中断返回 形式:IRET 。 功能:
① ↑(SP )→IP ② ↑(SP )→CS ③ ↑(SP )→FLAGS 五. 举例
用空闲的中断类型号45H ,做新增的软中断类型号,实现功能:将AX 中的内容以十六进制形式在屏幕上输出。
实现步骤:
(1) 按指定功能编制中断处理子程序
(2) 在中断向量表中,找出一个空闲的中断号N
(3) 将新编制的中断处理子程序的入口地址送入中断向量表
4*N ~ 4*N + 3这四个字节中
(4) 调用“INT N ”调用N 号中断,执行新增的中断处理子
程序
16
(4*n)→IP
17
注意:
(1) 在中断处理子程序中,必须保护和恢复现场 (2) 设置中断向量前CLI ,设置中断向量后CLI (3) 利用IRET 实现中断返回
6.4 WIN32编程
一. WIN32编程基础
1. 段的简化定义
(1) 使用简化的段定义后,16位程序结构如下:
(2) 使用简化的段定义,32位程序结构如下:
18
2. 控制伪指令
32位汇编提供了类似高级语言的分支控制伪指令和循环控制伪指令
(1)分支控制伪指令 格式:.IF 条件表达式
语句序列 [.ELSEIF 条件表达式 语句序列]
[.ELSE 语句序列]
.ENDIF
19
功能:实现条件控制
注意:条件表达式中的关系操作符包括:==, !=, >, >=,
格式:.WHILE 条件表达式
循环体
.ENDW
格式:.REPEA T
循环体
.UNTIL 条件表达式
功能:实现循环结构 格式:.BREAK 功能:退出当前循环 格式:.CONTINUE
功能:终止本次循环,开始下一次循环 3. 函数的定义、调用与说明
32位汇编提供了函数的定义、调用与说明伪指令 (1)函数定义伪指令:
格式:函数名 PROC [函数类型][语言类型][USES
20
寄存器
表][参数名: 参数类型]
(2) 函数调用伪指令: 格式:INVOKE 函数名[, 参数] … 例:
(3) 函数说明伪指令
格式: 函数名 PROTO [函数类型][语言类型][USES寄存器表][参数名: 参数类型]
功能:说明本模块中要调用的函数,类似于EXTRN 外模块中的WIN32函数,例如WIN32 API DLL中的函数,需要用PROTO 说明后,才能用INVOKE 调用。WIN32 API函数的说明,一般放在.INC 头文件中,也可以单个地在主程序中说明。
4. WIN32编程环境、库和头文件 (1) WIN32编程环境 ● 使用MASM32工具包; ● 目录介绍
21
MASM32\BIN:可执行目录 MASM32\INCLUDE:头文件目录 MASM32\LIB:导入库文件目录 汇编过程:
生成源程序文件:A.ASM 生成资源脚本文件:A.RC
生成目标程序:“ML /c /coff A.ASM”,得到A.OBJ 生成资源文件:“RC A.RC”,得到A.RES
生成可执行程序:“LINK /subsystem: windows A.OBJ A.RES”,得到A.EXE
(2) 库和头文件
WIN32编程不再使用DOS 系统功能调用,而使用WIN32 API函数。这些WIN32函数在Windows 提供的动态链接库中。
WIN32编程环境提供了:
基本的WIN32函数库包括:
22
二. WIN32程序的结构
Windows 是一个多任务的操作系统,允许多个程序同时运行。其关键是:应用程序以窗口作输入/输出界面;以消息驱动;程序内部有一个消息循环。
1. 无消息循环的WIN32程序
23
2. 有消息循环的WIN32程序
完整的Windows 程序依靠消息来驱动。每个程序中有一个“死循环”——消息循环。程序不断等待可能输入的消息,然后对消息作判断,然后再做适当的处理。
(1) 消息驱动机制
24
(2) 框架
25
说明:
(1) GetMessage()从应用程序的消息队列中取一个消息 (2) DispatchMessage()分发消息,触发WndProc()函数 (3) WndProc()是一个回调函数(类似于中断处理子程序),一般不直接调用,而是在分发一个消息后,Windows 系统根据分发的消息调用(被OS 调用,触发)
(4) WndProc()根据不同的消息,调用不同的处理函数
27
第四次上机
1. 将实验3中的求n 个数的平均值、最大值、最小值用软中断实现。
2. 将实验3用windows 程序实现。 实验报告内容包括: 1. 题目 2. 源码 3. 注释
28