汇编语言-内中断

中断的意思是指CPU不在接着(刚执行的指令)向下执行,而是转去处理这个特殊信息,而这个特殊的信息我们可以称其为中断信息。中断信息是要求CPU马上进行某种处理,并向所要进行的该种处理提供了必备的参数的通知信息。

内中断的产生

对于8086CPU,当CPU内部有下面的情况发生的时候,将产生响应的中断信息

  • 除法错误,比如,执行div指令产生的除法溢出;
  • 单步执行;
  • 执行into指令;
  • 执行int指令。

而中断信息中必须包含中断类型码的数据来标识终端信息的来源。中断类型码为一个字节型数据,可以表示256种中断信息的来源。
在8086CPU中的终端类型码如下。

  • 除法错误:0
  • 单步执行:1
  • 执行into指令:4
  • 执行int指令,该指令的格式为int n,指令中的n为字节型立即数,是提供给CPU的中断类型码。

中断处理程序

我们编写的,用来处理中断信息的程序被称为中断处理程序
要想执行中断处理程序如何从8位终端类型码得到处理程序的段地址和偏移地址呢?

中断向量表

  • 中断向量就是中断处理程序的入口地址。
  • 中断向量表就是中断处理程序入口地址的列表。

中断向量表在内存0000:0000到0000:03FF的1024个单元中保存,其中存放着256个中断信息的来源所对应的中断处理程序的入口,这个入口地址包括段地址和偏移地址,所以一个表项占两个字节,高地址字存放段地址,低地址字存放偏移地址。CPU只要知道了中断类型码,就可以将中断类型码作为中断向量表的表项号,定位相应的表项,从而得到中断处理程序的入口地址。

中断过程

中断过程就是用中断类型码找到中断向量,并用它设置CS和IP的过程。
下面是8086CPU在收到中断信息后,所引发的中断过程。

  • (从中断信息中)取得中断类型码;
  • 标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中);
  • 设置标志寄存器的第8位TF和第9位IF的值为0;
  • CS的内容入栈;
  • IP的内容入栈;
  • 从内存地址为中断类型码4和中断类型码4+2的两个子单元中读取中断处理程序的入口地址设置IP和CS。

更简洁的表述中断过程,如下:

取得中断类型码 N;
pushf
TF=0,IF=0
push CS
push IP
(ip)=(N*4),(CS)=(N*4+2)

中断处理程序和iret指令

中断处理程序的编写方法和子程序的比较相似,下面是常规的步骤:

  • 保存用到的寄存器;
  • 处理中断;
  • 恢复用到的寄存器;
  • 用iret指令返回。

iret指令的功能用汇编语法描述为:

pop ip
pop cs
popf

iret通常和硬件自动完成的中断过程配合使用。中断过程中,寄存器入栈的顺序和iret刚好相对应。

编写处理0号中断

;因为除法溢出随时可能发生,CPU随时都可能将CS:IP只想程序的入口,执行程序,所以我们将程序放入内存中。
;因为系统要处理的中断事件远没有达到256个,所以在中断向量表中,有许多单元是空的。

assume cs:code

code segment
start:

;安装:将中断处理程序代码送入中断向量表中。
    mov ax,cs
    mov ds,ax
    mov si,offset do0   ;ds:si指向源地址

    mov ax,0
    mov es,ax
    mov di,200h         ;es:di指向目的地址
    mov cx,offset do0end-offset do0 ;设置cx为传输长度 ;-是编译器识别的运算符号,编译器可以用它来进行两个常数的减法。
    cld		;设置传输方向为正
    rep movsb
    
;设置中断向量:将do0的入口地址,写入中断向量表的0号表项中,使do0为0号中断的中断处理程序
    mov ax,0
    mov es,ax
    mov word ptr es:[0*4],200h
    mov word ptr es:[0*4+2],0

    mov ax,4c00h
    int 21h
    
;中断处理程序代码
    do0: jmp short do0start 
        db "overflow!"  ;放在data段执行完后内存被系统释放数据可能被覆盖

    do0start:
        mov ax,cs
        mov ds,ax
        mov si,202h     ;ds:si指向字符串,复制到0:200处
		
        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,则它所引发的中断过程如下。

  1. TF陷阱标志(trap flag):用于调试的单步方式操作;
  2. TF = 1时每条指令执行后产生陷阱,由系统控制计算机;
  3. TF = 0时CPU正常工作。
  4. IF中断标志(interrupt flag);
  5. IF = 1允许CPU响应可屏蔽中断请求;
  6. IF = 0关闭中断。
  • 取得中断类型码1;
  • 标志寄存器入栈,TF,IF设置为0;
  • CS,IP入栈;
  • (IP)=(14),(CS)=(14+2)。

如上所述,如果TF=1,则执行好一条指令后,CPU就要转去执行1号中断处理程序。

你可能感兴趣的:(《汇编语言》)