1、中断
CPU具有一种能力,可以在执行完当前指令之后,检测从内部产生或外部发来的特殊信息,并立即对其进行处理,这种特殊的信息,叫做中断信息。
中断即CPU不再接着刚执行完的指令向下执行,而是转去处理特殊信息。
中断分为:
- 内中断,CPU内部产生的特殊信息
- 外中断,CPU外部产生的特殊信息
1.1、内中断
中断信息必须包含标识来源的编码,叫做中断类型码。中断类型码为一个字节型数据,可表示256种中断信息来源。
产生中断信息的事件,即中断信息的来源,叫做中断源。
内中断分类:
- 除法错误,类型码0,如div指令产生溢出
- 单步执行,类型码1,即单步调试
- into指令,类型码4
- int指令,指令格式为
int n
,类型码为n
CPU在收到中断信息后,需要对中断信息进行处理,这可以由我们编程来决定,我们编写的处理中断信息的程序叫做中断处理程序。
CPU要想执行中断处理程序,则必须知道这个程序的入口,即CS:IP指向这个入口,CPU用8位中断类型码通过中断向量表找到对应中断程序的入口地址。
中断向量表在内存中保存,对于8086CPU机,其必须存放在0000:0000~0000:03FF处,这是规定好的。
中断向量表中每个中断类型码对应中断程序的段地址和偏移地址,共占2个字节。
CPU通过中断类型码,然后在中断向量表中找到中断处理程序的段地址和偏移地址,设置CS和IP,CPU开始执行中断处理程序。这个操作是CPU自动完成的,这个过程叫做中断过程。
具体过程如下:
- 从中断信息中取得中断类型码N
pushf
:标志寄存器的值入栈(中断过程中会改变标志寄存器的值,所以先保存之前的值)TF=0,IF=0
:设置标志寄存器第8位TF
和第9位IF
的值为0PUSH CS
:CS
内容入栈PUSH IP
:IP
内容入栈(IP)=(N*4),(CS)=(N*4+2)
:从内存地址为中断类型码*4
和中断类型码*4+2
的两个字中读取中断处理程序入口地址,设置CS和IP- 执行中断处理程序
中断处理程序编写步骤:
- 保存用到的寄存器
- 处理中断
- 恢复用到的寄存器
- 用
iret
指令返回
iret
指令功能:
pop IP
pop CS
popf
引发中断的具体事件:
- 除法错误:如果在执行
div
指令时,发生溢出错误,将产生中断类型码为0的中断信息,CPU检测到此信息然后引发中断过程,转去执行0号中断所对应的中断处理程序; - 单步中断:CPU执行完一条指令后,如果检测到
TF
位是1,则产生单步中断,转去执行1号中断处理程序,CPU提供单步中断功能,为单步跟踪程序执行过程提供了实现机制;
- int指令引发中断:可自定义调用中断处理程序,例如
int n
将调用n号中断处理程序;
在主板的ROM中存放的程序,叫做BIOS
(基本输入输出系统),主要包含以下内容:
- 硬件系统的检测和初始化程序;
- 外部中断和内部中断的中断例程;
- 用于对硬件设备进行I/O操作的中断例程;
- 其他和硬件系统相关的中断例程;
操作系统DOS也提供了中断例程,DOS中断例程就是操作系统向程序员提供的编程资源。int 21h
中断例程就是DOS提供的,即程序返回功能。
在执行完向
ss
寄存器传送数据指令后,即使发生中断,CPU也不会响应。因为ss:sp
联合指向栈顶,应该持续完成,否则将发生错误。
1.2、外中断
CPU能响应外设的输入,并向它们进行输出,这个过程叫做外中断。
外设的输入不直接送入内存和CPU,而是送入相关的接口芯片端口中。CPU向外设输出也不是直接送入外设,而是先送入端口,再由芯片送到外设。CPU通过端口和外设进行联系。
外中断源分为2类:
- 可屏蔽中断:CPU可以不响应的外中断,由标志寄存器
IF
决定,如果IF=1
则响应,否则屏蔽中断;- 中断过程将IF设置为0,就是保证在进入中断处理程序后,禁止其他的可屏蔽中断
- 8086CPU提供修改IF的指令:
sti
:IF=1,cli
:IF=0
- 不可屏蔽中断:
- CPU必须响应的外中断
- 中断类型码固定为2
几乎所有由外设引发的外中断,都是可屏蔽中断。
2、端口
在计算机中,各种存储器和CPU的地址总线、数据总线、控制总线相连,CPU控制它们时,都把它们当做内存来对待。除了各种存储器之外,还与很多芯片相连:
- 各种接口卡(网卡、显卡)上的接口芯片,它们控制接口卡工作;
- 主板上的接口芯片,CPU通过它们对部分外设进行访问;
- 其他芯片,存储相关系统信息,或进行相关的输入输出处理;
这些芯片中,都有一组可以由CPU读写的寄存器,CPU把这些寄存器都当做端口,对它们进行统一编址,从而建立一个统一的端口地址空间。
访问端口:
in al 60h
:从60h号端口读入一个字节out 20h,al
:往20h端口写入一个字节
PC机中,有一个CMOS RAM芯片,一般称为CMOS,特征如下:
- 包含一个实时钟和一个有128个存储单元的RAM存储器;
- 此芯片靠电池供电,可保证实时钟持续工作,RAM中信息不丢失;
- 128个字节的RAM中,内部实时钟占用0~0dh保存时间信息,其他单元保存系统配合信息,供系统启动时BIOS程序读取,也可通过BIOS配置CMOS RAM中的系统信息;
- 此芯片内部有2个端口:70h和71h,CPU通过这2个端口读写CMOS RAM;
- 70h为地址端口,存放要访问CMOS RAM单元的地址;71h为数据端口,存放从选定CMOS RAM单元中读取的数据,或要写入其中的数据;
在CMOS RAM中,存放着当前的时间:年、月、日、时、分、秒。每个长度为1个字节,这些数据以BCD码方式存放。
BCD码是以4位二进制数表示十进制数的编码方法。
3、直接定址表
假如a、b
标号代表2组数据空间,那么有如下写法既可以标记存储数据的单元地址,还可以标记其长度:
1 | 指令:mov ax,b |
通过数据能直接计算出所要找的元素的位置的表,叫做直接定址表。
直接定址表的好处:
- 使算法清晰简洁
- 加快运算速度
- 程序易于扩展