汇编语言程序设计 第十二章 输入输出与中断
输入输出指令
IN 输入
IN ACC,PORT
操作 : 将端口内字(字节)传送到AX或AL中
如 : IN AL,B_PORT
IN AX,W_PORT
OUT 输出
OUT PORT,ACC
操作 : 将累加器AL或AX的内容传送到指定的端口
如 : OUT B_PORT,AL
OUT W_PORT,AX
OUT DX,AL
OUT DX,AX
INS/INSB/INSW
这三个是80286的新增指令
- INS DB_DATA/DW_DATA,DX
- INSB 传送数据为字节串
- INSW 传送数据为字串
OUTS/OUTSB/OUTSW
- OUTS DX,str
将DS:SI中数据串输出到DX指出的端口 - OUTSB
- OUTSW
类似INS/INSB/INSW , 只是方向不同
中断指令
中断
操作 :
F压栈
IF=0,TF=0
CS压栈
IP压栈
将中断服务程序的CS和IP更新自己的CS和IP
中断服务器的CS和IP:
CS:(\(i\_type\times 4 + 2 , i\_type\times 4 + 3\))
IP:(\(i\_type\times 4,i\_type\times 4 + 1\))
IP中断时 , 仍然停留在 int xx的地方
溢出中断(INTO)
如果OF=1,那么产生类型为4的软件中断 ; 否则 , 不产生任何操作
类型为4的软件中断:
F压栈
IF=0,TF=0
CS压栈
IP压栈
CS = (\(4\times 4 + 2, 4\times 4 + 3\))
IP = (\(4\times 4, 4\times 4 + 1\))
中断返回
IRET
操作 :
从堆栈中拿出IP, 拿出CS, 更新F
IP = (SP,SP+1) SP = SP+2
CS = (SP,SP+1) SP = SP+2
F = (SP,SP+1) SP = SP+2
外同步指令和空操作指令
停机
HLT 使CPU暂停
CPU执行HLT后 , 停止执行后续指令 , 直到产生中断请求信号(发生中断)或有复位信号(RESET变为低电平)时 , 才会退出暂停状态
发生中断时 , CPU去执行中断服务程序 , 然后执行完IRET后 , CPU返回被中断的程序执行点 , 执行HLT后面的程序
等待
WAIT 使CPU进入等待状态
CPU检测TEST线 , 当TEST线为低电平时 , 执行WAIT后的指令(仅仅这一种情况能使CPU停止执行WAIT)
交权
略
锁定
LOCK
操作 : 在执行某指令期间保持一个总线锁定信号 , LOCK引线变为低电平
空操作
NOP
操作 : 无
但是要花费3个时钟周期
CPU与外设间的数据传送
输入输出接口
外设一般是机械设备 , 工作速度比CPU执行指令的速度慢很多
因此现需要一个桥梁 , 被称为外部适配器
如显示适配器, 打印机适配器等
在适配器中有一个核心电子部件 , 称为接口芯片
接口芯片一般两种 :
-
并行接口
每一位信息都有自己通路 , 如8位数据则8根数据线 -
串行接口
只有一个数据通路 , 信息一位接着一位传输
接口电路
有为传送数据而设置的数据缓冲寄存器或锁存器
有为控制电路的工作方式而设定的工作寄存器或命令寄存器
有为反映外设和接口电路工作状态设置的状态响应器
有位使CPU与外设间用中断方式传送信息所需的逻辑电路 , 如中断寄存器 , 中断屏蔽寄存器
接口中数据缓冲器(锁存器) , 控制寄存器 , 状态寄存器都有自己的地址 , 称为端口地址
- 接口电路有两个或以上的数据端口
- 每个数据端口具有输入/输出锁存器或缓冲器
- 确定各端口工作方式的控制寄存器 , 选择端口传送方向及交换信息的方式
- 反应外设工作状态的寄存器
- 能用中断方式传送信息的逻辑电路
- 命令译码 , 端口地址译码及控制电路
CPU与外设之间的接口信号
- 数据
- 数字量
- 模拟量
- 开关量
- 状态信息
略 - 控制信息
控制输入输出设备的启动或停止
以上三种信息 , 各自都有不同的端口
一个外设往往有几个端口 , 各个端口都有自己的地址
CPU寻址的是端口地址 , 而不是笼统的外设
CPU与外设之间的数据传送方式
- 无条件I/O方式
外设数据传送是定时的 , 且时间已知 , CPU定时取入数据 - 查询传送(条件传送)
外设比CPU慢得多时 , 输入时 , CPU要查询外设是否就绪 , 若就绪 , 则输入数据 ;
输出时 , CPU要查询外设是否空闲 , 若空闲 , 则输出数据
如 :
MOV CX,0050H
MOV BX,0200H
AGAIN:IN AL,SR
TEST SL,80H
JZ AGAIN
IN AL,DR
MOV [BX],AL
INC BX
LOOP AGAIN
- 中断传送
即当外设需要时 , 主动向CPU提出请求 , 让CPU为其服务
中断系统概述
即 , 当CPU在执行某程序时 , 由于外界事件的需要而向CPU发送申请 , CPU暂停当前程序的执行而转去处理临时发生的事情
中断过程中执行的时间处理程序称为中断服务程序 , 相对于它来说 , 被中断者为主程序
中断请求与中断源
中断源 : 引起中断的原因
- 输入输出设备
- 数据通道中断源 , 磁盘机 , 磁带机
- 实时时钟 , 定时的数据采集 , 定时的控制等
- 故障源 , CPU内部或者外部 , 如电源故障(外部源) , 要求把正在执行的程序的状态保留下来 , 以备电源恢复时继续执行
- 为调试而设置的中断源
中断系统的功能
- 实现中断与返回
和子程序调用差不多 , 但是由于随机性 , 更复杂 - 实现优先级排队
- 实现中断嵌套
中断响应
- CPU响应中断的条件
- 中断响应时及响应期间CPU应该做的事
8086/8088的中断系统
外部中断
两种中断 , 非屏蔽中断请求输入和可屏蔽中断请求输入
用户不能禁止的为非屏蔽中断 , 该中断一旦出现CPU就必须立即响应 , 因此用于处理紧急事件
用户能禁止的称为可屏蔽中断 , 用户可以通过软件禁止该中断的中断源发出中断请求信号 , 或者关闭中断而对发出的请求不做响应
- 可屏蔽中断
可屏蔽中断指令
IF为中断允许标志位 , 用指令设置和清楚
当允许CPU响应外部设备的中断请求时 , 将IF置1 ; 否则 , IF置 0 , 使得CPU不响应INTR线上的中断请求
IF=1时 , 称CPU为开中断或中断允许状态
IF=0时 , 称CPU为关中断或中断屏蔽状态
STI指令是设置中断允许标志位的指令 , 也称开中断指令
STI \(\rightarrow\) IF=1
CLI用来关中断
CLI \(\rightarrow\) IF=0
8259A中断控制器
该控制器向808/8088CPU提供服务
外部中断通过INTR输入端向CPU请求中断
但是中断很多
因此中断首先交给8259A , 8259A对优先级排序后 , 将中断放在INTR上传输
同时8259A将中断方式码通过数据总线发送给CPU
每个8259A有8个中断申请输入端 , 因此单个就可以处理8级中断
通过级联8259A , 最多可以管理64级中断
CPU对可屏蔽中断的响应流程
a.响应中断
b.读取8259A发送的方式码
c.将F中内容压栈
d.IF=0,TF=0
e.CS压栈,IP压栈
f.根据方式码找到服务程序入口,并调用服务程序
g.执行用户中断服务程序
h.IP弹出,CS弹出
i.将F弹出
j.从中断中返回
上述a-g过程由硬件完成,h-j由IRET指令完成
- 非屏蔽中断
外部中断请求也可以加在CPU的NMI端上(如果是INTR端,那么是可屏蔽的) , 即非屏蔽中断请求输入端
NMI上不可屏蔽 , 即使IF=0
非屏蔽中断的方式码为2 , 响应非屏蔽中断时 , 不需要外部设备提供中断向量码
CPU收到NMI上中断后 , 自动通过向量码2在中断向量表中查找NMI的程序入口
响应过程 :
a.F压栈
b.IF=0,TF=0
c.CS压栈,IP压栈
d.根据2,找到入口,调用服务
e.执行非屏蔽中断服务程序
f.弹出IP,弹出CS
g.弹出F
h.中断返回
a-e硬件自动完成 , f-h由IRET完成
内部中断
方式0-除法错中断
执行DIV或IDIV的时候 , 商超过了机器所能表示的最大值 , 则产生方式0中断 , 是除法指令的一部分
方式1-单步中断
TF=1时 , 那么每执行完一步 , 都会产生TF=1的中断
方式3-断点中断
指令系统中有设置程序断点的单字节指令 , 执行后引起向量码为3的中断 , 也称单字节中断
方式4-溢出中断
OF=1时 , 执行INTO会产生方式4中断
用户定义的软中断
有INT指令 , 可以用该指令定义自己的软中断
- 中断向量码或包括在指令中 , 或者是预定的 ;
- 除单步中断外 , 内部中断无法禁止 ;
- 除单步中断外 , 任何内部中断都比外部中断高
中断向量表
00000H-0003FFH端 , 设置了256个4字节大小的表
其中前面是IP偏移量 , 后面是CS端地址
前5项是系统的 , 后面27项是扩充的
剩下224项供用户使用
将中断码\(\times 4\)后得到对应的入口地址
8259A中断控制器及其程序设计
8259A的程序设计
初始化命令字ICW
如果第四位写'1' 并且 写入偶地址(A0=0) , 那么它是ICW1
之后的三个为ICW2,ICW3,ICW4
ICW1的D1为SNGL , 如果为1 , 那么是单独使用
如果是0 , 那么是级联使用
ICW2的D3到D7为T3到T7
T3-T5为IR0-IR7的二进制编码
ICW3的S0-S7为D0-D7 , 是8259A作为主控制器时使用 , 比如设置IR6 , 那么表示IR端接入了一个从控制器
ICW3的D0-D2也是ID0-ID2 , 表示该8259A作为从控制器时的识别地址(接在主控制器的IR端的二进制编码值) , 此时高5位为0

浙公网安备 33010602011771号