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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM