内部结构
外部特性
独立编址是将I/O端口单独编排地址,独立于存储器地址。
优点
:
缺点
:I/O指令功能简单,寻址方式没有存储器丰富统一编址是将I/O端口和存储器地址统一编排,共享一个地址空间。
优点
:
缺点
:
输入指令
:IN AL/AX/EAX, i8/DX
输出指令
: OUT i8/DX, AL/AX/EAX
IA-32处理器的I/O寻址方式只有两种,直接寻址和通过DX间接寻址
直接寻址
:由I/O指令直接提供8位I/O地址,只能寻址最低256个I/O地址(00-FFH)间接寻址
:用DX寄存器保存访问的I/O地址,能访问的地址(0000-FFFFH)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端口
对于输入输出指令IN
、OUT
、INS
、OUTS
,还有中断标志设置指令CLI
和STI
的执行涉及I/O端口,称之为I/O敏感指令。
标志寄存器EFLAGS
有一个IOPL
字段,表示程序具有的I/O特权级,只有程序的当前特权级低于或等于I/O特权级,I/O敏感指令才可以执行
; 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利用软件中断方式提供系统功能。IA-32处理器支持256个中断,每个中断用一个中断编号区别,即中断0~中断255号,中断调用指令是INT N
,其中N
表示调用的中断号。
DOS系统调用一般有如下四个步骤:
INT N
)执行功能调用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接口电路十分简单,接口中只考虑数据缓冲
,不考虑信号联络
。
在输出接口电路中,一般会安排一个锁存环节(锁存器
),以便将数据总线的数据暂时锁存,使较慢的设备有足够的时间进行处理,此时处理器可以利用系统总线完成其他工作。
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的中断系统采用向量中断机制
,能处理255
个中断,用中断向量号
0~255,其中可屏蔽中断还需要借助外部中断控制器实现优先权管理
内部中断是由于处理器内部的执行程序出现异常引起的程序中断,也称异常,例如执行除法指令出现的除法错误异常(向量号0),用于程序调试的异常(向量号1)和断点异常(向量号3)等
; ata
msg byte 0dh, 0ah,'No divide overflow!',0
; .code
call readuiw
mov bl, 1
div bl
mov eax, offset msg ;没有除法错误显示信息
call dipmsg
; .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
中断描述符
:保护方式下
,每个中断服务程序由一个中断描述符指向,中断描述符中保存着中断服务程序的16位段选择器、32位偏移地址和中断特权层,中断描述符保存在系统的中断描述符表中,由中断描述符表地址寄存器IDTR给出其地址。系统最多有256个中断,每个中断描述符包含8个字节,所以中断描述符表最大2KB(256*8),以中断描述符表所在的地址为基础,中断向量号乘以8就对用其中断描述符
中断向量表
:实地址方式下
使用中断向量表直接保存中断服务程序的入口地址。中断服务程序的地址含有16位段基地址CS
(高字部分)和16位偏移地址IP
(低字部分),共4个字节,按照低对低、高对高的小端存储方式保存在中断向量表中。中断向量表被处理器固定地安排在以物理地址最低端00000H开始,从中断向量号0依次安排在每个中断服务程序地址,256个中断占用1KB区域,向量号为N的中断服务程序地址要从物理地址=N*4取得
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主要为用户提供了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对各个中断的屏蔽是相互独立的,对较高优先权的中断请求实现屏蔽,并不影响较低优先权的中断请求