• 8086汇编 中断


    8086汇编 中断

    中断:CPU不再接着(刚执行完的指令)向下执行,而是转去处理中断信息。

    • 内中断:由CPU内部发生的事件而引起的中断
    • 外中断:由外部设备发生的事件引起的中断

    8086的内中断

    CPU内部产生的中断

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

    8086的中断类型码

    • (1)除法错误:0
    • (2)单步执行:1
    • (3)执行 into 指令:4
    • (4)执行 int n指令 ,立即数 n 为中断类型码。

    assume cs:codesg, ss:stacksg, ds:datasg
    stacksg segment
        db  200h dup (0)
    stacksg ends
    datasg segment
         ; ‘$': 9 退出显示的格式
         ; 13,10:回车换行
         szmsg db 13,10,'hello world!',13,10,'$'
    datasg ends
    codesg segment
    start:
          mov ax,datasg
          mov ds,ax
          lea dx, szmsg
         ; ah寄存器为9:终端号 9 显示信息、显示ds为段地址 dx 位偏移地址的包含信息
         ; 会取上面 szmsg 符号的 hello worold! 字符    
          mov ah,9
          int 21h
    
          ; ah寄存器为4c:则退出程序,为Dos状态
          mov ax,4c00h 
          int 21h
    codesg ends
    end start
    案例说明

    中断过程

    中断过程由CPU的硬件自动完成;
    用中断类型码找到中断向量,并用它设置CS和IP

    8086CPU的中断过程

    (1)从中断信息中取得中断类型码
    (2)标志寄存器的值入栈——中断过程中要改变标志寄存器的值,需要先行保护
    (3)设置标志寄存器的第8位TF 和第9位IF的值为0
    (4)CS的内容入栈;
    (5)IP的内容入栈;
    (6)从中断向量表读取中断处理程序的入口地址,设置IP和CS。

    编制中断处理程序

    (1)取得中断类型码N;

    (2) pushf

    (3) TF = 0,IF = 0

        TF(Trap Flag): 陷阱标志,用于单步调试;

         IF(Interrupt Flag):中断标志;

    (4) push CS

    (5) push IP

    (6)(IP) = (N*4),(CS) = (N*4+2)

    CPU随时都可能检测到中断信息,所以中断处理程序必须常驻内存(一直存储在内存某段空间之中)。

    中断处理程序的入口地址,即中断向量,必须存储在对应的中断向量表表项中(0000:0000-0000:03FF)。

    单步中断

    两个和中断相关的寄存器标志位

    TF-陷阱标志(Trap flag):用于调试时的单步方式操作。当TF=1时,每条指令执行完后产生陷阱,由系统控制计算机;当TF=0时,CPU正常工作,不产生陷阱。

    IF-中断标志(Interrupt flag):当IF=1时,允许CPU响应可屏蔽中断请求;当IF=0时,关闭中断。

    CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断(中断类型码为1),引发中断过程,执行中断处理程序。

    中断过程

    (1)取得中断类型码1;

    (2)标志寄存器入栈,TF、IF设置为0;

    (3) CS、IP入栈;

    (4)(IP)=(1*4),(CS)=(1*4+2)。

    • 中断处理程序也由一条条指令组成的。

    • 如果在执行中断处理程序之前,TF=1,则CPU在执行完中断处理程序的第一条指令后,又要产生单步中断,转去执行单步中断的中断处理程序的第一条指令……

    • 上面的过程将陷入一个永远不能结束的循环,CPU永远执行单步中断处理程序的第一条指令。

    • 所以,在进入中断处理程序之前,设置TF=0。

    应用:中断不响应的情况

    一般情况下,CPU在执行完当前指令后,如果检测到中断信息,就响应中断,引发中断过程。

    在有些情况下,CPU 在执行完当前指令后,即便是发生中断,也不会响应。

    例:在执行完向 ss寄存器传送数据的指令后,即便是发生中断,CPU 也不会响应。

    原因:ss:sp联合指向栈顶,而对它们的设置应该连续完成。

    以此保证对栈的正确操作!

    注:栈段 与 栈顶指针 必须连续起来去做。

    由int指令引发的中断

    int n引起的中断

    • CPU内部产生的中断信息
    • 除法错误
    • 单步执行
    • 执行into指令
    • 执行int 指令

    int格式: int n,n为中断类型码

      功能:引发中断过程

    CPU 执行int n指令,相当于引发一个 n号中断的中断过程,执行过程如下:

      (1)取中断类型码n;

      (2)标志寄存器入栈,IF = 0,TF = 0;

      (3)CS、IP入栈;

      (4)(IP) = (n*4),(CS) = (n*4+2)。  —从此处转去执行n号中断的中断处理程序。

    • int 指令的最终功能和call指令相似,都是调用一段程序。

    • 一般情况下,系统将一些具有一定功能的子程序,以中断处理程序的方式提供给应用程序调用。

    BIOS和DOS中断处理

    BIOS,是在系统板的ROM中存放着一套程序

    • 容量:8KB
    • 地址:从FE000H开始

    BIOS中的主要内容

    (1)硬件系统的检测和初始化程序

    (2)外部中断和内部中断的中断例程

    (3)用于对硬件设备进行I/O操作的中断例程

    (4)其他和硬件系统相关的中断例程

    使用BIOS功能调用,程序员不用了解硬件操作细节,直接使用指令设置参数,并中断调用BIOS例

    程,即可完成相关工作!

    使用BIOS功能调用:(1)方便编程;(2)能写出简洁、可读性好、易于移植的程序。

    一、在屏幕的5行12列显示3个红底高亮闪烁绿色的'a'

    用BIOS的10h中断

    (ah)=2时,调用第10h中断例程的2号子程序,设置光标位置

    (ah)=9时,调用第10h中断例程的9号子程序,在光标位置显示字符

    assume cs:code
    code segment
            mov ah,2        ;置光标功能
            mov bh,0        ;第0页
            mov dh,5        ;dh中放行号
            mov dl,12       ;dl中放列号
            int 10h        
            
            mov ah,9        ;显示字符功能
            mov al,'a'        ;字符
            mov bl,11001010b;颜色属性
            mov bh,0        ;第0页
            mov cx,3         ;字符重复个数
            int 10h
            mov ax,4c00h
            int 21h 
    code ends
    end
    案例

  • 相关阅读:
    7多态与异常处理的课上作业
    软工概论第十五周总结
    构建之法阅读笔记之三
    小组项目冲刺第六天的个人总结
    书店促销
    小组项目冲刺第五天的个人总结
    找水王
    软工概论第十四周总结
    动态规划——买书问题
    小组项目冲刺第四天的个人总结
  • 原文地址:https://www.cnblogs.com/xiangsikai/p/12485477.html
Copyright © 2020-2023  润新知