• 汇编语言-内中断


    中断

    中断的意思是指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号中断处理程序。

  • 相关阅读:
    C# MVC模式设置404&500
    jQuery实现滚动条滚动到子元素位置(方便定位)
    Oracle数据库的导出导入
    Oracle之clob字段不能union的问题
    div中内容垂直居中的方法小结
    C#实现Oracle数据库插入clob字段类型数据
    C_结构体_笔记
    Practice_17_01_ABC
    Practice_17_01_GID
    【转】 vim显示行号、语法高亮、自动缩进的设置
  • 原文地址:https://www.cnblogs.com/chengmf/p/12499339.html
Copyright © 2020-2023  润新知