汇编语言程序设计 第十二章 输入输出与中断

输入输出指令

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的新增指令

  1. INS DB_DATA/DW_DATA,DX
  2. INSB 传送数据为字节串
  3. INSW 传送数据为字串

OUTS/OUTSB/OUTSW

  1. OUTS DX,str
    将DS:SI中数据串输出到DX指出的端口
  2. OUTSB
  3. 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执行指令的速度慢很多

因此现需要一个桥梁 , 被称为外部适配器

如显示适配器, 打印机适配器等

在适配器中有一个核心电子部件 , 称为接口芯片

接口芯片一般两种 :

  1. 并行接口
    每一位信息都有自己通路 , 如8位数据则8根数据线

  2. 串行接口
    只有一个数据通路 , 信息一位接着一位传输

接口电路

有为传送数据而设置的数据缓冲寄存器或锁存器
有为控制电路的工作方式而设定的工作寄存器或命令寄存器
有为反映外设和接口电路工作状态设置的状态响应器
有位使CPU与外设间用中断方式传送信息所需的逻辑电路 , 如中断寄存器 , 中断屏蔽寄存器
接口中数据缓冲器(锁存器) , 控制寄存器 , 状态寄存器都有自己的地址 , 称为端口地址

  1. 接口电路有两个或以上的数据端口
  2. 每个数据端口具有输入/输出锁存器或缓冲器
  3. 确定各端口工作方式的控制寄存器 , 选择端口传送方向及交换信息的方式
  4. 反应外设工作状态的寄存器
  5. 能用中断方式传送信息的逻辑电路
  6. 命令译码 , 端口地址译码及控制电路

CPU与外设之间的接口信号

  1. 数据
  • 数字量
  • 模拟量
  • 开关量
  1. 状态信息
  2. 控制信息
    控制输入输出设备的启动或停止

以上三种信息 , 各自都有不同的端口
一个外设往往有几个端口 , 各个端口都有自己的地址
CPU寻址的是端口地址 , 而不是笼统的外设

CPU与外设之间的数据传送方式

  1. 无条件I/O方式
    外设数据传送是定时的 , 且时间已知 , CPU定时取入数据
  2. 查询传送(条件传送)
    外设比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
  1. 中断传送
    即当外设需要时 , 主动向CPU提出请求 , 让CPU为其服务

中断系统概述

即 , 当CPU在执行某程序时 , 由于外界事件的需要而向CPU发送申请 , CPU暂停当前程序的执行而转去处理临时发生的事情

中断过程中执行的时间处理程序称为中断服务程序 , 相对于它来说 , 被中断者为主程序

中断请求与中断源

中断源 : 引起中断的原因

  1. 输入输出设备
  2. 数据通道中断源 , 磁盘机 , 磁带机
  3. 实时时钟 , 定时的数据采集 , 定时的控制等
  4. 故障源 , CPU内部或者外部 , 如电源故障(外部源) , 要求把正在执行的程序的状态保留下来 , 以备电源恢复时继续执行
  5. 为调试而设置的中断源

中断系统的功能

  1. 实现中断与返回
    和子程序调用差不多 , 但是由于随机性 , 更复杂
  2. 实现优先级排队
  3. 实现中断嵌套

中断响应

  1. CPU响应中断的条件
  2. 中断响应时及响应期间CPU应该做的事

8086/8088的中断系统

外部中断

两种中断 , 非屏蔽中断请求输入和可屏蔽中断请求输入

用户不能禁止的为非屏蔽中断 , 该中断一旦出现CPU就必须立即响应 , 因此用于处理紧急事件
用户能禁止的称为可屏蔽中断 , 用户可以通过软件禁止该中断的中断源发出中断请求信号 , 或者关闭中断而对发出的请求不做响应

  1. 可屏蔽中断

可屏蔽中断指令

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指令完成

  1. 非屏蔽中断
    外部中断请求也可以加在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指令 , 可以用该指令定义自己的软中断

  1. 中断向量码或包括在指令中 , 或者是预定的 ;
  2. 除单步中断外 , 内部中断无法禁止 ;
  3. 除单步中断外 , 任何内部中断都比外部中断高

中断向量表

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

posted @ 2025-05-06 23:31  Guaninf  阅读(55)  评论(0)    收藏  举报