文章目录
- I/O接口概述
- I/O接口的典型结构
- 基本功能
- I/O端口的编址
- 独立编址
- 统一编址
- 输入输出指令
- I/O寻址方式
- I/O数据传输量
- I/O保护
- 16位DOS应用程序
- DOS平台的源程序框架
- DOS功能调用
- 无条件传送和查询传送
- 无条件传送
- 三态缓冲器
- 锁存器
- 接口电路
- 查询传送
- 查询输入端口
- 查询输出端口
- 中断控制系统
- 中断传送
- 中断源识别
- 中断优先权排队
- 中断嵌套
- IA-32的中断系统
- 内部中断
- 外部中断
- 中断和异常的响应过程
- 中断描述符和中断向量表
- 内部中断服务程序
- 特点
- 中断控制器
- 8259A的寄存器
- 8259A的工作方式
- 外部中断服务程序
I/O接口概述
I/O接口的典型结构
内部结构
I/O接口电路实际是比较复杂的,但从应用角度,我们可以简化为3类可编程的寄存器,分别对应3类信号。
- 数据寄存器:保存处理器和外设之间交换的数据,可以分为数据输入寄存器和数据输出寄存器
- 状态寄存器:保存外设或其接口电路当前的工作状态信息
- 控制寄存器:保存处理器控制接口电路和外设操作的有关信息
外部特性
接口电路位于处理器和外设之间,起着桥梁作用
- 面向处理器一侧的信号与处理器总线或系统总线类似,有数据信号、地址信号、控制信号,以方便与处理器连接
- 面向外设一侧的信号与外设有关,以便与外设连接,由于外设种类太多,面向外设的一侧也各不相同。
基本功能
- 数据缓冲
- 信号变换
I/O端口的编址
独立编址
独立编址是将I/O端口单独编排地址,独立于存储器地址。
优点
:- 不占用存储器空间
- 专门的I/O指令比较清晰
缺点
:I/O指令功能简单,寻址方式没有存储器丰富
80x86采用独立编址方式,只使用最低16位地址信号,对应64K个8位I/O端口,这64K地址空间补需要分段管理,只能使用指令输入指令IN,和输出指令OUT访问
统一编址
统一编址是将I/O端口和存储器地址统一编排,共享一个地址空间。
优点
:- 不需要设计专门的I/O指令和引脚
- 具有和存储器寻址一样丰富的寻址方式
缺点
:- 占用存储地址空间
- 通过指令不易辨认是I/O操作
输入输出指令
输入指令
:IN AL/AX/EAX, i8/DX
输出指令
:OUT i8/DX, AL/AX/EAX
I/O寻址方式
IA-32处理器的I/O寻址方式只有两种,直接寻址和通过DX间接寻址
直接寻址
:由I/O指令直接提供8位I/O地址,只能寻址最低256个I/O地址(00-FFH)间接寻址
:用DX寄存器保存访问的I/O地址,能访问的地址(0000-FFFFH)
I/O数据传输量
IN/OUT指令只允许通过累加寄存器EAX与外设交换数据。8位I/O指令使用AL,16位I/O指令使用AX,32位I/O指令使用EAX
IN指令
:外设数据进入处理器的AL/AX/EAXOUT指令
:处理器数据通过AL/AX/EAX送出
in al, 21h ;从地址为21H的I/O端口读一个字节数据到AL
mov dx, 300h ;DX指向300H端口
out dx, al ;将AL中的字节数据送到地址为300H(DX)的I/O端口
I/O保护
对于输入输出指令IN
、OUT
、INS
、OUTS
,还有中断标志设置指令CLI
和STI
的执行涉及I/O端口,称之为I/O敏感指令。
标志寄存器EFLAGS
有一个IOPL
字段,表示程序具有的I/O特权级,只有程序的当前特权级低于或等于I/O特权级,I/O敏感指令才可以执行
16位DOS应用程序
DOS平台的源程序框架
; eg0700.asm in DOS
include io16.inc ;包含16位输入输出文件
.data ;定义数据段代填
...
.code ;定义代码段
start:
mov ax, @data
mov ds, ax
.....
exit 0 ;程序正常执行结束
.....
end start ;汇编结束
eg:输出Hello World
include io16.inc
.data
msg byte 'Hello, Assembly!', 13, 10, 0 ;定义要显示的字符串
.code
start:
mov ax,@data
mov ds,ax
mov eax, offset msg
call dispmsg
exit 0
end start
DOS功能调用
DOS利用软件中断方式提供系统功能。IA-32处理器支持256个中断,每个中断用一个中断编号区别,即中断0~中断255号,中断调用指令是INT N
,其中N
表示调用的中断号。
DOS系统调用一般有如下四个步骤:
- 在AH寄存器中设置系统功能调用号
- 在指定寄存器中设置入口参数
- 用中断调用指令(
INT N
)执行功能调用 - 根据出口参数分析功能调用的执行情况
1、3这两个步骤是一定需要的,2、4只是某些指令会用到
DOS功能调用的终端号主要是21H
,利用AH寄存器区别各种子功能
dispmsg子程序
:
dispmsg proc
push eax
push ebx
push edx
mov ebx, eax
dispm1: mov al, [ebx] ;取一个字符
test al, al ;判断是否结尾(0)
jz dispmsg2
mov ah, 2 ;AH=2,显示一个字符的DOS功能
mov dl, al ;设置入口参数
int 21h ;调用DOS(INT 21H)系统功能
inc ebx
jmp dispm1
dispm2: pop edx
pop ebx
pop eax
ret
dispmsg endp
无条件传送和查询传送
I/O接口的主要功能之一就是实现外设和主机的数据传送。数据传送可以通过处理器执行I/O指令完成,分为无条件传送、查询传送、中断传送。外设数据传送还可以以硬件为主加快传输速度,如直接存储器存取(DMA)、使用专门的I/O处理器
无条件传送
有些设备状态很少变化,可以认为总是处于就绪状态
,随时可以进行数据传送,这就是无条件传送,有时也称为立即传送或同步传送
用于无条件传送的I/O接口电路十分简单,接口中只考虑数据缓冲
,不考虑信号联络
。
三态缓冲器
三态指的是0
、1
、高阻值
锁存器
在输出接口电路中,一般会安排一个锁存环节(锁存器
),以便将数据总线的数据暂时锁存,使较慢的设备有足够的时间进行处理,此时处理器可以利用系统总线完成其他工作。
接口电路
74LS244
:为输入端口74LS273
:为输出端口D0~D7
:数据总线A0~A15
:地址线74LS06反相驱动器
:相当于8个非门
mov dx, 8000h ;dx向输入端口
in al, ax ;从输入端口读取开关状态
not al ;将开关取反
out dx, al ;送入输出端口
call delay ;调用子程序Dalay进行延时
查询传送
查询传送也称为异步传送。当处理器需要与外设交换数据时,首先查询外设的工作状态,只有在外设准备就绪的情况下才进行数据传送。
查询输入端口
mov dx, 5001h ;dx指向状态端口
status: in al, dx ;读取端口的状态
test al, 01 ;查询状态是否九旬
jz status ;D0=0状态未就绪继续查询
dec dx ;D0=1状态已就绪,dx指向5000h
in al, dx ;从数据端口读数据
查询输出端口
8位锁存器
:构成数据输出寄存器(数据端口),一侧连接系统的输出总线,一侧连接输出设备1位三态缓冲器和1位锁存器构成状态寄存器(状态端口)
:I/O译码地址位5001H
当处理器想要输出数据到外设时,首先应该查询状态端口,图上电路设计D7=0时0,表示外设已经准备就绪可以接收数据。此时处理器可以将数据写入数据端口,写入信号也作为D触发器的控制信号将D触发器置位为1,以便通知外设接收数据。当外设取走数据后~ACK
会将D触发器重新置位为0,这时外设就又处于可以接收数据的状态了
mov dx, 5001h
status:
in al, dx
test al, 80h
inz status
dec dx
mov al, buf
out dx, al
中断控制系统
中断传送
中断请求
:中断请求是外设向处理器提出的,对处理器来说它是随机发生的,但处理器的响应只会在每条指令的最后一个时钟周期区采样中断请求的输入引脚,所以外设提出的中断请求必须维持到得到响应中断响应
:中断响应是有一定条件的- 处理器只在每条指令执行完时才会去检测中断输入引脚,才可能响应
- 对可屏蔽中断,处理器应处在允许可屏蔽中断响应的状态
- 在中断请求时,处理器优先响应优先级更高的中断
- 中断请求应保持到响应他为止
- 如果遇到处理器正在执行中断返回、开中断等指令,则它必须在执行完现行指令后再接着执行一条其他指令,然后才能响应新的中断。这么做的目的是隔离两个中断
关中断
:处理器在响应中断后会关闭中断即不在响应其他中断,如果允许中断服务程序也被中断(中断嵌套
),需要用户编程再次打开中断断点保护
:保护断点地址和标志寄存器中断源识别
:微机系统可能有多个发生中断的原因,处理器首先识别出是哪个中断源提出请求保护现场
:一般是保护寄存器中断服务
:处理器执行响应的中断服务程序恢复现场
:恢复原来的工作环境开中断
:处理器响应中断后,一般都会自动关闭中断。如果用户不将它打开,在整个中断过程中处理器不会再响应其他新的中断,至少在中断返回前将中断打开中断返回
:IRET
指令,相较于RET
指令会进行更多的恢复工作,如恢复标志寄存器
中断源识别
中断源识别主要采用中断向量
中断优先权排队
中断优先权排队是系统设计者事先为每个中断源确定优先处理顺序
中断嵌套
当处理器正在为某个中断进行服务时,又有新的中断处理原则:
- 新的中断请求优先权低于或等于当前正在服务的中断,则不予处理或待当前中断完成后再处理
- 新的中断请求优先权高于或等于当前正在服务的中断,处理器暂停当前工作,先服务级别更高的中断
IA-32的中断系统
IA-32的中断系统采用向量中断机制
,能处理255
个中断,用中断向量号
0~255,其中可屏蔽中断还需要借助外部中断控制器实现优先权管理
内部中断
内部中断是由于处理器内部的执行程序出现异常引起的程序中断,也称异常,例如执行除法指令出现的除法错误异常(向量号0),用于程序调试的异常(向量号1)和断点异常(向量号3)等
- 除法错异常
在执行指令DIV或IDIV时,若除数为0或商超过了寄存器所能表达的范围,则产生一个向量号为0的内部终端,称为除法错异常
; ata
msg byte 0dh, 0ah,'No divide overflow!',0
; .code
call readuiw
mov bl, 1
div bl
mov eax, offset msg ;没有除法错误显示信息
call dipmsg
- 溢出异常
在执行溢出中断指令INTO时,若溢出标志OF为1,则产生一个向量号为4的内部中断,称为溢出中断
; .ata
msg byte 0dh, 0ah, 'NO overflow !', 0
; .code
call readuib ;输入一个无符号整数
all al, 100
jno noflow ;没有产生溢出,则输出未产生溢出信息
into ;有溢出产生溢出中断
jmp done
noflow:
mov eax, offset msg
call dispmsg
done:
外部中断
外部中断时由于处理器外部提出中断请求引起的程序中断。相对于处理器来说,外部中断时随机产生的,索引这里外部中断才是真正意义上的中断。外部中断分为两种,一种是可屏蔽中断
,另一种是不可屏蔽中断
不屏蔽中断
:
外部通过不可屏蔽中断(NMI
)请求信号向处理器提出中断请求,处理器在当前指令执行结束就予以响应,这个终端就是不可屏蔽中断,IA-处理器给不可屏蔽中断分配的向量号是2,主要用于处理系统的意外或故障,如电源掉电、存储器读写错误可屏蔽中断
:
对来自外部可屏蔽中断请求信号,在当前指令结束执行后予以响应,同时输出可屏蔽中断响应信号~INTA
除了要求当前指令执行结束外,对可屏蔽中断请求,处理器是否响应还取决于中断标志的状态。在IA-处理器中,若IF=1,则处理器是开中断的,可以响应,若IF=0,则处理器是关中断的,不能响应。
中断和异常的响应过程
中断描述符和中断向量表
-
中断描述符
:保护方式下
,每个中断服务程序由一个中断描述符指向,中断描述符中保存着中断服务程序的16位段选择器、32位偏移地址和中断特权层,中断描述符保存在系统的中断描述符表中,由中断描述符表地址寄存器IDTR给出其地址。系统最多有256个中断,每个中断描述符包含8个字节,所以中断描述符表最大2KB(256*8),以中断描述符表所在的地址为基础,中断向量号乘以8就对用其中断描述符 -
中断向量表
:实地址方式下
使用中断向量表直接保存中断服务程序的入口地址。中断服务程序的地址含有16位段基地址CS
(高字部分)和16位偏移地址IP
(低字部分),共4个字节,按照低对低、高对高的小端存储方式保存在中断向量表中。中断向量表被处理器固定地安排在以物理地址最低端00000H开始,从中断向量号0依次安排在每个中断服务程序地址,256个中断占用1KB区域,向量号为N的中断服务程序地址要从物理地址=N*4取得
内部中断服务程序
特点
- 与编写子程序类似,都是利用过程定义伪指令PROC和ENDP
- 进入中断服务程序后通常要执行STI指令开放可屏蔽中断
- 最后执行IRET指令返回
- 内部中断服务程序通常采用寄存器传递参数
eg:编写80H号中断服务程序,使其具有显示以0结尾字符串的功能。字符串缓冲区首地址为入口参数,利用DS和DX传递其段地址和偏移地址
;.data
intoff word ?
intseg word ?
intmsg byte 'A Instruction Interrupt!',13,10,0
;.code
mov ax,3580h ;获取系统的原80H中断向量表项
int 21h
mov intoff,bx ;保存偏移地址
mov intseg,es ;保存段基地址
push ds
mov dx,offset new80h
mov ax,seg new80h
mov ds,ax
mov ax,2580h ;设置本程序的80H中断向量表项
int 21h
pop ds
;
mov dx, offset intmsg ;设置入口参数DS和DX
int 80h ;调用80H中断服务程序,显示字符串
;
mov dx,intoff
mov ax,intseg
mov ds,ax
mov ax,2580h
int 21h
;80H内部中断服务程序:显示字符串(以0结尾);DS:DX=缓冲区首地址
new80h proc ;过程定义
sti ;开中断
push ax ;保护寄存器
push bx
push si
mov si,dx
new1: mov al,[si] ;获取想要显示的字符
cmp al,0 ;为0结束
jz new2
mov bx,0
mov ah,0eh
int 10h
inc si
jmp new1
new2: pop si
pop bx
pop ax
iret ;中断返回
new80h endp ;中断服务程序结束
中断控制器
8259A的寄存器
8259A主要为用户提供了3个8位可读可写的寄存器
中断请求寄存器
:保存8个外界中断请求信号IR0~IR7的请求状态。Di位为1表示IRi引脚有中断请求;Di位为0表示IRi引脚无请求中断服务寄存器
:保存正在被8259A服务的中断状态。Di位为1表示IRi中断正在服务中,Di位为0表示IRi中断没有被服务中断屏蔽寄存器
:保存对中断请求信号IR的屏蔽状态。Di位为1表示IRi中断被屏蔽(禁止),Di位为0表示允许IRi中断。IMR对各个中断的屏蔽是相互独立的,对较高优先权的中断请求实现屏蔽,并不影响较低优先权的中断请求