【匯編語言】王爽 - 內中斷復習

0 前言

基于王爽《匯編語言》和Coursera的《計算機組成》課程。

1 中斷分類

CPU在執行指令的過程中,產生了一個異常/中斷,因為CPU只能同時執行一條指令,所以需要暫停該指令的執行,轉而去處理異常/中斷信息
在這里插入圖片描述
在這里插入圖片描述

這個異常可以來源于

  1. 內部中斷
    1. 指令執行本身:例如 0號中斷(除法錯中斷 自動檢測INT 0)、4號中斷(溢出中斷 INTOINT 4
    2. 程序調試,例如1號中斷(單步中斷 INT 1)、3號中斷(斷點中斷 INT 3
  2. 外部中斷:與CPU相關的信號有關
    1. 可屏蔽中斷
    2. 不可屏蔽中斷

2 內中斷實例分析:除法錯中斷

我們來看一看除法錯中斷發生的完整過程,來理解中斷的相關概念。

2.0 來源

程序實例

assume cs:datasg
datasg segment
start:mov ax,1000hmov bh,1div bhmov ax,4c00hint 21h
datasg ends
end start

2.1 產生 & 檢測

很明顯,1000h / 1得到的商超過了8位(AL的范圍),會產生溢出。從而被CPU內部的中斷檢測部件檢測出來,觸發中斷機制。

2.2 觸發 & 執行

中斷機制被觸發后,會做出一系列動作,先執行中斷程序,再回來繼續執行原程序,注意,這里的說明相對抽象。

  1. 識別中斷源,觸發對應的中斷信息(這里是0號中斷
  2. 保存現場
    1. 標志寄存器入棧 pushf
    2. 修改標志寄存器:IF = 0TF = 0(不接收可屏蔽中斷,不進行單步中斷)
    3. CS:IP入棧(老大CS先入棧,然后是IP)
  3. 根據中斷向量表中,相應中斷源的值,修改CS:IP,執行中斷服務程序
  4. 執行完后,執行iret,依次出棧,恢復現場。
  5. 接著執行下面的指令(可能是出現異常的指令,也可能是下一條指令,與實際情況有關)

2.3 修改0號中斷

0號中斷是存儲在8086CPU內存的中斷向量表中,0x0000 ~ 0x03ff,共400H,也就是1MB的空間。

寫一段程序,然后將其拷貝到被保護的內存區域(指令和數據都要),然后,將中斷向量表對應的地址修改,這樣,這段程序就成為了中斷服務程序,可以被動調用,也可以主動調用。

3 對中斷的理解

3.1 中斷是什么?

指令執行過程中,有其他事務要優先處理,需要放下當前執行的指令,執行完其他事務再回來執行。

這就好比,你在寫作業,突然你媽媽讓你去買醬油,你就需要先放下作業,買完醬油回來,再寫作業。這里買醬油就是一個中斷

3.2 中斷來源于哪?

  1. 程序內部出現異常
  2. 程序內部主動請求中斷
  3. 外部設備請求中斷

外部中斷分為可屏蔽(可以不理會!)和不可屏蔽中斷(必須執行!不可忽略!)。

3.3 中斷何時發生?

查看中斷向量表即可。

3.4 中斷執行過程是什么?

  1. 檢測到中斷
  2. 保存現場,屏蔽外界中斷,屏蔽單步中斷
  3. 根據中斷向量表的地址,修改CS:IP
  4. 執行中斷服務程序
  5. 恢復現場
  6. 繼續執行

3.5 中斷服務程序是什么?

普通的一段程序,如果其入口地址被放在了中斷向量表的某個中斷中,這個程序就是【中斷服務程序】

發生中斷時,系統給出的解決方案,就是中斷服務程序。其入口地址存放在中斷向量表中,程序系統默認有,也可以自己編寫。

3.6 中斷服務程序如何編寫和安裝?

  1. 編寫一段普通的程序(指令 + 數據)
  2. 將其拷貝到特殊的內存位置(指令和數據都要一起拷貝)
  3. 將其入口地址寫入到中斷向量表中

3.7 中斷的功能是什么?

3.7.1 自動調用:(Checked)異常處理

比如除法錯中斷,就是系統自動檢測并處理的。

3.7.2 手動調用:(Unchecked)異常處理

比如溢出中斷,需要手動寫INTO(Interrupt Overflow)指令,才會進行處理,否則運算溢出的時候不做任何處理。

3.7.3 手動調用:系統調用(System Call)

主動使用中斷,能夠幫助程序員快速實現一些功能,這也就是基于中斷機制的功能調用,極大提高了開發效率。

4 單步中斷 & 斷點中斷

這兩個中斷類型,就是單步調試斷點調試背后的實現機制,方便程序員調試程序。

4.1 單步中斷

TF標志位為1的時候,發生單步中斷,然后就被置0,防止無限嵌套中斷發生。

單步中斷是為了方便調試程序和查看寄存器等相關內容的值。

4.2 斷點中斷

對于INT n。n一共是256個,占1個字節,INT指令碼占1個字節,共2個字節,而**斷點中斷(INT 3)**特殊,占1個字節,其編碼是1100_1100B,這與其實現機制有關。

斷點中斷是通過INT 3指令主動調用的,執行的時候,該指令會臨時替換斷點處的1個字節,遇到了就發生中斷,顯示寄存器和其他相關內容的值,便于程序員調試。

x86指令系統中,指令最少1個字節,因此INT 3也是1個字節,這樣INT 3的替換,至多影響1條指令。 如果不是1個字節,可能影響2條指令,發生錯誤。

4.3 應用

例如debug的t命令,還有插入斷點等,都是基于單步中斷和斷點中斷機制實現,它們的出現是為了方便程序調試,并且在debug程序中已經能夠實現中斷觸發,對著這種指令,不要寫在程序中,調試程序直接讓程序運行在調試模式下就好了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384686.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384686.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384686.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【算法】蠻力法/窮舉法/枚舉法 的基本問題分析

炮兵問題的優化,設立邏輯數組 蠻力法設計思想 有策略地窮舉 驗證 制定窮舉策略避免重復 簡單來說,就是列舉問題所有可能的解,然后去看看是否滿足題目要求,是一種逆向解題方式。(我也不知道答案是什么,…

如何高效學習算法【實例 + 可視化】

對于初學者來說,學習算法,不應該先學習抽象的理論,那樣沒有感覺,越學越暈,應該: 有具體的例子有可視化過程 同時需要結合理論知識對照學習,理論扎實、實踐有效,同時要有結果反饋。…

【計算機網絡實驗·北航】實驗一:網絡實驗入門(1)

1.3 遠程在線環境使用 PCA、PCB、PCC和PCD:4臺PC機S1、S2:2臺交換機R1、R2:2臺路由器中間的設備:組網連線器 遠程組網連線: 使用PCA上的組網連線軟件,配置組網連線器,實現組網連線。 PCA和PCB…

【C++】int與string轉換

頭文件&#xff1a;<string>&#xff0c;注意&#xff0c;這與<string.h>、<cstring>不是一回事兒語法&#xff1a;int x to_string(str)&#xff0c;其中string str "1"。

【C++】rand函數的基本使用

rand()函數用于生成偽隨機數&#xff0c;每次生成的隨機數都不變&#xff0c;方便我們調試程序。 重要是的隨機數的范圍公式&#xff08;適用整數&#xff09; 公式&#xff1a; 確定范圍加偏移量 例如&#xff1a;a和b是整數 [a,b]&#xff0c;范圍是b - a 1&#xff0c…

【操作系統】虛擬化CPU、Memory,共享文件

幾個概念 CPU、虛擬CPU進程內存、虛擬地址空間 物理的CPU被OS虛擬成了多個虛擬的CPU&#xff0c;這些虛擬CPU分別運行各自的程序&#xff0c;這些正在運行的程序被稱為進程。物理內存被OS虛擬成了多個虛擬地址空間&#xff0c;每個進程都有獨立的、自己的地址空間&#xff0c;…

【Linux】編譯C語言文件(-o -lpthread)

在gcc中使用-o編譯 對于一個一般的程序&#xff0c;直接使用gcc <C語言文件名> -o <編譯后生成的文件名>即可&#xff0c;例如以下程序&#xff1a; // cpu.c #include <stdio.h> #include <unistd.h> #include <stdlib.h>int main(int argc,…

【Linux】Ubuntu下進行C語言編程

前言 需要您會使用Windows下cd切換目錄的基本命令&#xff0c;否則請先自學相關知識&#xff0c;之后再閱讀本文。 0 基礎命令 介紹最基礎的Linux終端命令。 su - root&#xff1a;切換到root用戶&#xff08;不用也可以&#xff09;ls&#xff1a;查看當前目錄位置cd&…

【Linux】Ubuntu 18下安裝Vim自動補全插件YouCompleteMe(可高速下載安裝)

前言 本文寫于2020年10月&#xff0c;如果你多年后看見這篇文章&#xff0c;方法可能已經失效&#xff0c;但是請牢記&#xff0c;盡量下載你所處時代的最新版本的軟件&#xff0c;會減少很多麻煩。 擺正心態 即便按照本文操作&#xff0c;由于你的系統狀態和我的不一樣&…

【操作系統】進程調度(1):FIFO(先進先出)算法 原理與實踐

0 前言 本文基于書籍《Operating System&#xff1a;Three Easy Pieces》。 中譯本&#xff1a;《操作系統導論》&#xff0c;中譯本質量還可以&#xff0c;但是英文版后來的更新&#xff0c;中文版目前沒有進行同步更新&#xff08;寫下此文的時間是2020年10月&#xff09; 1…

【操作系統】進程調度(2a):SJF(短任務優先) 算法 原理與實踐

0 前言 接上一篇文章&#xff1a;進程調度&#xff08;1&#xff09;&#xff1a;FIFO&#xff08;先進先出&#xff09;算法 原理與實踐 1 前提鋪墊 請參考上一篇文章的前提鋪墊部分&#xff0c;本文與之完全一致。 2 SJF 原理 SJF&#xff08;Shortest Job First&#x…

【操作系統】進程調度(2b):STCF(最短完成時間優先) 算法 原理與實踐

0 前言 接上一篇文章&#xff1a;進程調度&#xff08;2a&#xff09;&#xff1a;SJF&#xff08;短任務優先&#xff09; 算法 原理與實踐 1 前提鋪墊 與上一篇同。 2 STCF 原理 STCF&#xff08;Shortest Time-to-Completion First&#xff09;最短完成時間優先。 2.1…

【操作系統】進程調度(3):RR(輪轉) 算法 原理與實踐

0 前言 接上一篇文章&#xff1a;進程調度&#xff08;2b&#xff09;&#xff1a;STCF&#xff08;最短完成時間優先&#xff09; 算法 原理與實踐 1 前提鋪墊 除了與上一篇相同的&#xff0c;這里介紹新的基礎知識。 1.1 三種類型的程序 計算密集型&#xff08;CPU導向&…

【操作系統】進程調度(4):I/O、不可預測的運行時間

0 前言 上一篇文章&#xff1a;進程調度&#xff08;3&#xff09;&#xff1a;RR&#xff08;輪轉&#xff09; 算法 原理與實踐 1 前提鋪墊 與上一篇同。 2 引入I/O操作 之前我們一直提及的是計算密集型程序&#xff0c;現在我們的程序可以進行I/O交互了&#xff0c;它會…

堅定不移地加速,并且不斷解決新問題

想要更快更高效地做事&#xff0c;一定會帶來問題&#xff0c;我們要做的是 保證事情一定要做對堅定不移地解決問題&#xff0c;尋找方法&#xff0c;而不是回歸慢速 這里有幾個典型的例子 從單周期CPU&#xff0c;到多周期CPU&#xff0c;是為了提速&#xff0c;我們不必再…

運行bat批處理文件不出現黑框

if "%1""hide" goto CmdBegin start mshta vbscript:createobject("wscript.shell").run("""%~0"" hide",0)(window.close)&&exit :CmdBegin echo off java -jar logisim118.exe exit 只需要添加上述代…

【操作系統】使用循環創建線程,一個手殘導致的bug

讓我們先看看這個手殘的程序…… 這是一個簡單的生產者消費者問題。 #include <assert.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <unistd.h> #include <pthread.h> #include <sys/types.h> #incl…

【計算機系統設計】重點 · 學習筆記(0)

HDL等硬件描述語言&#xff0c;例如Verilog&#xff0c;是并行的&#xff0c;而不像軟件一樣的順序執行的&#xff0c;例如很多的always塊&#xff0c;initial塊&#xff0c;都是并行的&#xff0c;他們會轉換為硬件電路&#xff0c;而在仿真的時候&#xff0c;他們也是并發執行…

【計算機系統設計】學習筆記(1)03,04

疑問&#xff1a;sw和lw指令&#xff0c;獲取的地址不是4的整倍數&#xff08;字節不對齊&#xff09;的時候&#xff0c;應該如何處理&#xff1f; 東南大學MOCC 計算機系統綜合設計 03 03-1 寄存器 介紹了MIPS寄存器&#xff0c;32個寄存器的基本功能和使用&#xff0c;注…

【期末考試】計算機網絡、網絡及其計算 考試重點

個人簡介&#xff1a;Java領域新星創作者&#xff1b;阿里云技術博主、星級博主、專家博主&#xff1b;正在Java學習的路上摸爬滾打&#xff0c;記錄學習的過程~ 個人主頁&#xff1a;.29.的博客 學習社區&#xff1a;進去逛一逛~ 計算機網絡及其計算 期末考點 &#x1f680;數…