中断: 中断分为 软件中断 和 硬件中断,前者又称为内中断后者又称为外部中断;html
软件中断: 由CPU内部的某些事件引发的,不受中断容许标志IF的控制。包括:框架
<!-- more -->oop
int n
引发,n指出中断类型硬件中断: 由输入输出外设产生的中断请求引发的中断。 8086系统的硬件中断可分为 可屏蔽中断 和 不可屏蔽中断。全部的中断请求都有对应的中断处理子程序与之对应;spa
补充:debug
CPU的设计者必须在中断信息和其处理程序的入口地址之间创建某种联系,使得CPU能够根据中断信息能够找到哟啊执行的处理程序;设计
8086提供了256个中断类型,类型号为0~FFH;调试
CPU用8位的中断类型码经过中断向量表找到相应的中断处理程序的入后地址;code
用中断类型码找到中断向量,并用它设置CS和IP,这个工做是由CPU的硬件自动完成的,这个过程称为 中断过程;htm
8086中专门创建了一张中断向量表用于保存全部的中断向量。表位于内存最低地址区0开始的1KB单元。每一个中断向量占用4个字节,高位放段地址,低位放偏移地址;blog
中断向量表的地址为:00000H~003FCH;
其中,
8086CPU的中断过程:
一、取得中断类型码
二、标志寄存器的指入栈
三、设置标志寄存器的第8位TF和第9位IF的值0
四、CS的内容入栈
五、IP的内容入栈
六、从内存地址位中断类型码*4和中断类型码*4+2的两个字的单元中读取中断处理程序的入口地址设置IP和CS
CPU要随时均可能执行中断程序,因此中断处理程序必须一直在内存的某段空间中;同时,中断程序的入口地址,即中断向量必须储存在对应的中断向量表表项中;
中断处理程序的编写方法:
iret
指令返回iret指令的功能用汇编语法描述为:
pop IP pop CS popf
iret一般和硬件自动完成的中断程序配合使用;
入栈的顺序时标志寄存器、CS、IP,和iret的出栈相反;
当发生出发溢出时,CPU将进行如下工做:
中断处理程序do0,只需显示"overflow!"
由于除法溢出随时可能发生,CPU随时可能将cs:ip指向do0的入口,执行程序,因此为了简单能够将中断处理程序do0放到中断向量表的0000:0200处;
因此最后的处理是;
大体的框架:
assume cs:code code segment start: do0安装程序 设置中断向量表 mov ax,4c00h int 21h do0: 显示字符串:"overflow!" mov ax,4c00h int 21h ;do0程序在这段程序中并不执行,只是做为数据传送到中断向量表中,即安装程序 code ends end start
中断程序的安装可使用 rep movsb
来将do0的代码送入到0000:0200处;
大体框架:
assume cs:code code segment start: 设置es:di指向目的地址 设置ds:si指向源地址 设置cx的长度 设置传送方向为正 rep movsb 设置中断向量表 mov ax,4c00h int 21h do0: 显示字符串:"overflow!" mov ax,4c00h int 21h code ends end start
使用 rep movsb
要肯定的信息:
cld
由于do0的长度根据不一样的序求需求会改变,没有必要每一次都计算,能够在最后加一个 do0end:nop
,这样 mov cx,offset do0end-offset do0
便可,"-"是编译器识别的运算符号,编译器能够用它来进行两个 常数 的减法,同时,也能够处理表达式;
最后的安装程序:
assume cs:code code segment start: mov ax,0 mov es,ax mov di,0200h ;目的地址 mov ax,cs mov ds,ax mov si,offset do0 ;源地址 mov cx,offset do0end-offset do0 cld rep movsb 设置中断向量表 mov ax,4c00h int 21h do0: 显示字符串:"overflow!" mov ax,4c00h int 21h do0end:nop code ends end start
do0的任务是显示字符串,大体的框架:
do0: 设置ds:si指向字符串 mov ax,0b800h mov es,ax mov di,12*160+36*2 ;设置es:di指向显存空间中间位置 mov cx,9 ;设置cx为字符串长度 s: mov al,[si] mov es:[di],al inc si add di,2 loop s mov ax,4c00h int 21h do0end:nop
这里的字符串的存放不能像以前的程序那样放在总程序的数据段中,由于当总程序运行完后数据段也就释放,不能保证中断程序所显示的字符串仍是"overflow!";
因此要将字符串放在do0中,将其以通送到中断向量表的0000:0200处;
这样在发生除法溢出时,cs中存放的是do0的段地址,同时也是字符串的段地址,而由于程序要跳过字符串,不把他看成代码执行,因此在字符串以前要有一个jmp指令跳过字符串到实际的代码处,因此字符串的偏移地址就为0000:0200加2即0000:0202处(jmp占两个字节)
最后的程序:
do0: jmp short do0start db "overflow!" do0start: mov ax,cs mov ds,ax mov si,0202h ;设置ds:si指向字符串 mov ax,0b800h mov es,ax mov di,12*160+36*2 mov cx,9 s: mov al,[si] mov es:[di],al inc si add di,2 loop s mov ax,4c00h int 21h do0end:nop
设置中断向量即为将do0的入后地址0000:0200写入到中断向量表的0号表项中,使do0成为0号中断的中断处理程序;
0号表项的地址为0:0,其中0:0字单元存放偏移地址(ip),0:2字单元存放段地址(cs),
mov ax,0 mov es,ax mov word ptr es:[0*4],0200h mov word ptr es:[0*4+2],0
综上,最后的程序以下:
assume cs:code code segment start: mov ax,0 mov es,ax mov di,0200h mov ax,cs mov ds,ax mov si,offset do0 mov cx,offset do0end-offset do0 cld rep movsb mov ax,0 mov es,ax mov word ptr es:[0*4],0200h mov word ptr es:[0*4+2],0 mov ax,1000h mov bh,1 div bh mov ax,4c00h int 21h do0: jmp short do0start db "overflow!" do0start: mov ax,cs mov ds,ax mov si,202h mov ax,0b800h mov es,ax mov di,12*160+36*2 mov cx,9 s: mov al,[si] mov es:[di],al inc si add di,2 loop s mov ax,4c00h int 21h do0end:nop code ends end start
CPU在执行完一条指令后,若是检测到标志寄存器的TF位为1,则产生单步中断,单步中断的中断类型码为1;
他引起的中断类型以下:
使用t命令时,debug将TF设置为1,使得cpu执行完这条指令后引起单步中断;
执行单步中断的中断程序,全部寄存器的内容显示,等待输入;
中断处理程序也是由一条条指令组成的,若是在执行中断处理程序以前,TF=1,则CPU在执行完中断处理程序的第一条指令后,又要产生单步中断,则又要转去执行单步中断的中断处理程序…… ?
解决方法是在进入中断程序以前设置TF=0,也就是在前面说的中断过程当中的第二步标志寄存器入栈后设置TF=0的缘由;
CPU提供单步中断功能的缘由就是,为单步跟踪的执行过程,提供了实现机制。
有些状况下,CPU在执行完当前指令后,即便发生中断,也不相应,例如:在执行完向ss寄存器传送数据的指令后,发生中断时,CPU也不会响应,由于,ss:sp联合指向栈顶,对他们的设置应该连续完成;
若是在执行完设置ss的指令后,CPU响应中断,引起中断过程,要在栈中压入标志寄存器、CS和IP的值。 而ss改变,sp并未改变,ss:sp指向的不是正确的栈顶,将引发错误。
因此CPU在执行完设置ss的指令后,不响应中断。 这给连续设置 ss和sp,指向正确的栈顶提供了一个时机。 即,咱们应该利用这个特性,将设置ss和sp的指令连续存放,使得设置sp的指令紧接着设置ss的指令执行,而在此之间,CPU不会引起中断过程
解释了实验2中的(3)
Debug 利用单步中断来实现T命令的功能, 也就是说,用T命令执行一条指令后,CPU响应单步中断,执行Debug设置好的处理程序,才能在屏幕上显示寄存器的状态,并等待命令的输入。
而在mov ss,ax指令执行后,CPU根本就不响应任何中断,其中也包括单步中断,
因此Debug设置好的用来显示寄存器状态和等待输入命令的中断处理程序根本没有获得执行,因此咱们看不到预期的结果。
CPU接着向下执行后面的指令mov sp,10h,而后响应单步中断,咱们才看到正常的结果
(以上引用来自汇编老师的课件,转载请注明地址) https://www.cnblogs.com/31415926535x/p/10206507.html (end)