关于8259中断实验中的屏幕显示为什么使用INT10

首先了解一下有关中断的知识

一、中断分类及中断类型码

中断源 :引起中断的原因或发出中断请求的设备称为中断源。

• 中断的分类

共分为两类:硬件中断和软件中断

①硬件中断 :即通过外部的硬件产生的中断,如打印机、键盘等,有时也称为外部中断。硬件中断又可分为两类:可屏蔽中断和不可屏蔽中断。

不可屏蔽中断 :由 NMI 引脚引入,它不受中断允许标志的影响,每个系统中仅允许有一个,都是用来处理紧急情况的,如掉电处理。这种中断一旦发生,系统会立即响应;

可屏蔽中断 :由 INTR 引脚引入,它受中断允许标志的影响,也就是说,只有当 IF = 1 时,可屏蔽中断才能进入,反之则不允许进入,可屏蔽中断可有多个,一般是通过优先级排队,从多个中断源中选出一个进行处理。

②软件中断 (内部中断):即根据某条指令或者对标志寄存器中某个标志的设置而产生,它与硬件电路无关,常见的如除数为 0 ,或用 INT n 指令产生。

溢出中断由 INT0 指令引起

断点中断由 INT3 指令引起

单步由标志 TF 引起 ↘不对应指令

除 0 由计算结果引起 ↙不对应指令

• 中断类型码:

8086/8088 为每个中断源分配了一个中断类型码,其取值范围为 0 ~ 255 ,即可处理 56 种中断。其中包括软件中断,系统占用的中断以及开放给用户使用的中断。

二、中断向量和中断向量表

系统处理中断的方法很多,处理中断的步骤中最主要的一步就是如何根据不同的中断源进入相应的中断服务子程序,目前用的最多的就是向量式中断。

中断向量 :把各个中断服务子程序的入口都称为一个中断向量;

中断向量表 :将这些中断向量按一定的规律排列成一个表,就是所谓的中断向量表,当中断源发出中断请求时,即可查找该表,找出其中断向量,就可转入相应的中断服务子程序。

8086/8088 中断系统中的中断向量表是位于 0 段的 0 ~ 3FFFH 的存贮区内,每个中断向量占四个单元,其中前两个单元存放中断处理子程序的入口地址的偏移量( IP ),低位在前,高位在后;后两个单元存放中断处理子程序入口地址的段地址( CS ),也是低位在前,高位在后,整个中断向量的排列是按中断类型号进行的。见 P 图 5-14 。

图示给出了中断类型码与中断向量所在位置之间的对应关系。其中 00H ~ 04H 为专用中断, 05H ~ 3FH 为系统保留中断,用户一般是不能对它们定义的(这里面有一些为固定的用途,如 INT 21H 即为 MS - DOS 图 5-14

的系统调用), 40 ~ FF 为用户定义的中断。

00H ~ 04H ――系统专用

10H ~ 1FH ―― BIOS 用

40H ~ FFH ――用户用

08H ~ 0FH ――硬件中断

20H ~ 3FH ―― DOS 用

中断类型号* 4 即可计算某个中断类型的中断向量在整个中断向量表中的位置。如类型号为 20H ,则中断向量的存放位置为 20H * 4 = 80H ,(设中断服务子程序的入口地址为 4030 : 2010 ,则在 0000 : 0080H ~ 0000 : 0083H 中就应顺序放入 10H 、 20H 、 30H 、 40H 。当系统响应 20H 号中断时,会自动查找中断向量,找出对应的中断向量装入 CS 、 IP ,即转入该中断服务子程序。

三、中断响应过程与时序

8086/8088 对软件中断和硬件中断响应的过程是不同的,这是由于软件中断和硬件中断所产生的原因不同,下面主要讨论硬件中断的情况。

• 硬件中断的响应过程

硬件中断指的是由 NMI 引脚进入的非屏蔽中断或由 INTR 引脚进入的可屏蔽中断。下面以可屏蔽中断为例。

CPU 在 INTR 引脚上接到一个中断请求信号,如果此时 IF = 1 , CPU 就会在当前指令执行完以后开始响应外部的中断请求,这时, CPU 在 引脚连续发两个负脉冲,外设在接到第二个负脉冲以后,在数据线上发送中断类型码,接到这个中断类型码后, CPU 做如下动作:

①将中断类型码放入暂存器保存;

②将标志寄存器内容压入堆栈,以保护中断时的状态;

③将 IF 和 TF 标志清 0 ,目的是防止在中断响应的同时又来别的中断,而将 TF 清 0 是为了防止 CPU 以单步方式执行中断处理子程序。这时要特别提醒,因为 CPU 在中断响应时自动关闭了 IF 标志,因此用户如要进行中断嵌套时,必须在自己的中断处理子程序中用开中断指令来重新设置 IF ;

④保护断点,断点指的是在响应中断时,主程序当前指令下面的一条指令的地址。因此保护断点的动作就是将当前的 IP 和 CS 的内容入栈,保护断点是为了以后正确地返回主程序;

⑤根据取到的中断类型码,在中断向量表中找出相应的中断向量,将其装入 IP 和 CS ,即呆自动转向中断服务子程序。

对 NMI 进入的中断请求,由于其类型码固定为 2 ,因此 CPU 不用从外设读取类型码,也不需计算中断向量表的地址,只要将中断向量表中 0000 : 0008H ~ 0000 : 000BH 单元内容分别装入 IP 和 CS 即可。

图 5-15 给出了 8086/8088 中断响应过程的流程图,对这个图我们做几点说明:

① 8086/8088 除软件中断外,内部“非屏蔽中断”、“可屏蔽中断”均设立有优先级,其中内中(除单步外)――即 0 、 1 、 3 、 4 号中断的优先级高于非屏蔽中断,非屏蔽中断高于可屏蔽中断,单步中断优先级最低;

②只有在可屏蔽中断的情况下才判 IF = 1 ?,才取中断类型码,其余的没有这个动作。

③关于单步中断,它是每执行一条指令中断一次,显示出当时各寄存器的内容,供用户参考,当进入单步中断响应时, CPU 自动清除了 TF ,在中断返回后,由于恢复了响应时的标志寄存器的值,因此 TF = 1 ,执行完一条指令后又进入单步中断,直到程序将 TF 改为 0 为止。

④关于中断的嵌套, NMI 总是可以响应的,若在中断处理子程序中设立了开中断指令, INTR 的请求也能响应。

⑤弹出 IP 、 CS 、标志,返回断点的动作由 IRET 指令完成。

⑥有些情况下,即使条件满足, CPU 也不能马上响应中断,必须执行完下一条指令(而不是当前指令)才行。

• 正好执行 LOCK 指令;

• 执行往 SS 寄存器赋值的传送指令,因为一般要求连续用两条指令对 SS 和 SP 寄存器赋值,以保证堆栈指针的正确性。

⑦当遇到等待指令或串操作指令时,允许在指令执行的过程中进入中断。这时需注意在中断处理子程序中保护现场,以保证中断返回后能继续正确地执行这些指令。

---------------------------------------------------------------------------------------------------------------------

由此知道Int 10是8086系统中的中断向量类型码,而不是汇编BIOS中的类型码,而10~1F是给BIOS使用的,10号对应的就是屏幕显示I/O。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个用汇编语言编写的 8259 中断控制实验程序,同时实现了中断次数的显示: ```assembly section .data count db 0 ; 定义计数器 section .text handler: pusha ; 保存通用寄存器 inc byte [count] ; 每次中断,计数器加一 mov al, 0x20 out 0x20, al ; 发送中断结束命令 popa ; 恢复通用寄存器 iret ; 中断返回指令 global _start _start: ; 初始化主片和从片 mov al, 0x11 ; ICW1: 边沿触发模式,级联8259,需要ICW4 out 0x20, al ; 主片ICW1 out 0xa0, al ; 从片ICW1 mov al, 0x20 ; ICW2: 设置主片中断向量号为0x20~0x27 out 0x21, al ; 主片ICW2 mov al, 0x28 ; ICW2: 设置从片中断向量号为0x28~0x2f out 0xa1, al ; 从片ICW2 mov al, 0x04 ; ICW3: 设置从片连接到主片的IR2 out 0x21, al ; 主片ICW3 mov al, 0x02 ; ICW4: 8086模式 out 0x21, al ; 主片ICW4 out 0xa1, al ; 从片ICW4 ; 设置中断向量表 mov al, 0x08 mov ah, 0x35 mov dx, handler int 0x21 ; 开启中断 sti ; 循环显示计数器 loop: mov al, byte [count] call print_num call print_nl jmp loop print_num: ; 将数字转为字符串 push ax push bx push cx push dx xor bx, bx mov cx, 10 div cx add ax, 0x3030 mov byte [num_str+1], al mov byte [num_str], ah mov ah, 0x09 mov dx, num_str int 0x21 pop dx pop cx pop bx pop ax ret print_nl: ; 输出换行符 mov ah, 0x02 mov dl, 0x0a int 0x21 mov dl, 0x0d int 0x21 ret section .bss num_str resb 2 ; 存储数字字符串的缓冲区 ``` 在中断服务程序 `handler` ,每次中断时计数器 `count` 加一,并发送中断结束命令。在 `_start` 函数,先初始化 8259 芯片,然后设置中断向量表、开启中断,并通过一个无限循环不断显示计数器的值,同时调用 `print_num` 函数将数字转为字符串并输出,再调用 `print_nl` 函数输出换行符,以避免过于频繁的输出。 需要注意的是,在实际的应用场景,8259 芯片可能已经被 BIOS 或操作系统初始化,这时需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值