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
案例

posted @ 2020-03-13 11:52  kevin.Xiang  阅读(...)  评论(...编辑  收藏