1、中断
CPU具有一种能力,可以在执行完当前指令之后,检测从内部产生或外部发来的特殊信息,并立即对其进行处理,这种特殊的信息,叫做中断信息。
中断即CPU不再接着刚执行完的指令向下执行,而是转去处理特殊信息。
中断分为:
内中断,CPU内部产生的特殊信息
外中断,CPU外部产生的特殊信息
2.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的值为0
PUSH CS:CS内容入栈
PUSH IP:IP内容入栈
(IP)=(N4),(CS)=(N4+2):从内存地址为中断类型码4和中断类型码4+2的两个字中读取中断处理程序入口地址,设置CS和IP
执行中断处理程序
中断处理程序编写步骤:
保存用到的寄存器
处理中断
恢复用到的寄存器
用iret指令返回
ret指令功能:
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组数据空间,那么有如下写法既可以标记存储数据的单元地址,还可以标记其长度:
指令:mov ax,b
相当于:mov ax,cs:[8]
指令:mov b,2
相当于:mov word ptr cs:[8],2
指令:inc b
相当于:inc word ptr cs:[8]
指令:mov al,a[si]
相当于:mov al,cs:0[si]
指令:mov al,a[3]
相当于:mov al,cs:0[3]
指令:mov al,a[bx+si+3]
相当于:mov al,cs:0[bx+si+3]
通过数据能直接计算出所要找的元素的位置的表,叫做直接定址表。
直接定址表的好处:
使算法清晰简洁
加快运算速度
程序易于扩展
如果此文章能给您带来小小的工作效率提升,不妨小额赞助我一下,以鼓励我写出更好的文章!