【匯編語言】內中斷(二) —— 安裝自己的中斷處理程序:你也能控制0號中斷

在這里插入圖片描述

文章目錄

  • 前言
  • 1. 編程處理0號中斷
    • 1.1 效果演示
    • 1.2 分析所要編寫的中斷處理程序
      • 1.2.1 引發中斷
      • 1.2.2 中斷處理程序
      • 1.2.3 中斷處理程序do0應該存放的位置
      • 1.2.4 中斷向量表的修改
      • 1.2.5 總結
    • 1.3 程序框架
    • 1.4 注意事項
    • 1.5 從CPU的角度看中斷處理程序
    • 1.6 一些問題的思考與解答
  • 2. 安裝
    • 2.1 使用movsb指令
    • 2.2 明確執行rep movsb前所設置的信息
    • 2.3 do0代碼的長度
  • 結語

前言

📌

匯編語言是很多相關課程(如數據結構、操作系統、微機原理)的重要基礎。但僅僅從課程的角度出發就太片面了,其實學習匯編語言可以深入理解計算機底層工作原理,提升代碼效率,尤其在嵌入式系統和性能優化方面有重要作用。此外,它在逆向工程和安全領域不可或缺,幫助分析軟件運行機制并增強漏洞修復能力。

本專欄的匯編語言學習章節主要是依據王爽老師的《匯編語言》來寫的,和書中一樣為了使學習的過程容易展開,我們采用以8086CPU為中央處理器的PC機來進行學習。

1. 編程處理0號中斷

1.1 效果演示

現在我們考慮改變一下0號中斷處理程序的功能,即重新編寫一個0號中斷處理程序,它的功能是在屏幕中間顯示“overflow!”然后返回到操作系統,如下圖所示。

在這里插入圖片描述

當CPU 執行div bh后,發生了除法溢出錯誤,產生0號中斷信息,引發中斷過程,CPU 執行我們編寫的0號中斷處理程序。在屏幕中間顯示提示信息“overflow!”后,返回到操作系統中。

1.2 分析所要編寫的中斷處理程序

1.2.1 引發中斷

當發生除法溢出的時候,產生0號中斷信息,從而引發中斷過程。

此時,CPU將進行以下工作:

① 取得中斷類型碼0;

② 標志寄存器入棧,TF、IF設置為0;

③ CS、IP入棧;

④ (IP) = (0*4),(CS) = (0*4+2)

1.2.2 中斷處理程序

可見 ,當中斷 0 發生時,CPU將轉去執行中斷處理程序。

只要按如下步驟編寫中斷處理程序,當中斷0發生時,即可顯示“overfow!”。

① 相關處理。

② 向顯示緩沖區送字符串“overfow!”。

③ 返回DOS

我們將這段程序稱為do0。

1.2.3 中斷處理程序do0應該存放的位置

現在的問題是:do0 應放在內存中。

因為除法溢出隨時可能發生,CPU隨時都可能將 CS:IP指向 do0的入口,執行程序。

那么do0應該放在哪里呢?

由于我們是在操作系統之上使用計算機,所有的硬件資源都在操作系統的管理之下,所以我們要想得到一塊內存存放do0,應該向操作系統申請。

但在這里出于兩個原因我們不想這樣做:

  • 原因之一:過多地討論申請內存將偏離問題主線;

  • 原因之二:我們學習匯編的一個重要目的就是要獲得對計算機底層的編程體驗。所以,在可能的情況下,我們不去理會操作系統,而直接面向硬件資源。

問題變得簡單而直接,我們只需找到一塊別的程序不會用到的內存區,將do0傳送到其中即可。

前面講到,內存0000:0000~0000:03FF,大小為1KB的空間是系統存放中斷處理程序入口地址的中斷向量表。8086支持256個中斷,但是,實際上,系統中要處理的中斷事件遠沒有達到256個。所以在中斷向量表中,有許多單元是空的。

中斷向量表是PC系統中最重要的內存區,只用來存放中斷處理程序的入口地址,DOS系統和其他應用程序都不會隨便使用這段空間。可以利用中斷向量表中的空閑單元來存放我們的程序。

一般情況下,從0000:0200至0000:02FF的256個字節的空間所對應的中斷向量表項都是空的,操作系統和其他應用程序都不占用。我們在前面的內容中使用過這段空間。

根據以前的編程經驗,我們可以估計出,do0的長度不可能超過256個字節。

結論:我們可以將do0傳送到內存0000:0200處。

1.2.4 中斷向量表的修改

我們將中斷處理程序do0放到 0000:0200 后,若要使得除法溢出發生的時候,CPU轉去執行do0,則必須將do0的入口地址。即0000:0200登記在中斷向量表的對應表項中

因為除法溢出對應的中斷類型碼為0,它的中斷處理程序的入口地址應該從0×4地址單元開始存放,段地址存放在 0×4+2 字單元中,偏移地址存放在0×4字單元中。

也就是說要將do0的段地址0存放在 0000:0002 字單元中,將偏移地址200H存放在0000:0000字單元中。

1.2.5 總結

總結上面的分析,我們要做以下幾件事情:

(1)編寫可以顯示“overfow!”的中斷處理程序:do0

(2)將do0送入內存0000:0200處

(3)將do0的入口地址0000:0200存儲在中斷向量表0號表項中

1.3 程序框架

程序的框架如下:

assume cs:code
code segmentstart: do0安裝程序設置中斷向量表 mov ax,4c00hint 21hdo0: 顯示字符串“Welcome to Fishc.com!” mov ax,4c00hint 21h
code ends
end start

我們可以看到,上面的程序分為兩部分:

  • (1)安裝do0,設置中斷向量的程序

  • (2)do0

1.4 注意事項

上面的程序框架執行時,do0的代碼是不執行的,它只是作為do0安裝程序所要傳送的數據

執行do0安裝程序,將 do0 的代碼拷貝到內存 0:200處,然后設置中斷向量表,即偏移地址200H和段地址0,保存在0號表項中。

這兩部分工作完成后,程序就返回了。

程序的目的就是在內存0:200處安裝do0 的代碼,將0號中斷處理程序的入口地址設置為0:200。

do0的代碼雖然在程序中,卻不在程序執行的時候執行。它是在除法溢出發生的時候才得以執行的中斷處理程序。

do0部分代碼的最后兩條指令是依照我們的編程要求,用來返回DOS的

1.5 從CPU的角度看中斷處理程序

現在,我們在反過來從CPU的角度看一下,什么是中斷處理程序?

do0變成0號中斷的中斷處理程序的過程:

  • (1)這個程序框架在執行時,被加載到內存中,此時do0的代碼在程序所在的內存空間中,它只是存放在程序的代碼段中的一段要被傳送到其他單元中的數據,我們不能說它是0號中斷的中斷處理程序;

  • (2)程序中安裝do0 的代碼執行完后,do0的代碼被從程序的代碼段中拷貝到0:200處。此時,我們也還不能說它是0號中斷的中斷處理程序,它只不過是存放在0:200處的一些數據;

  • (3)程序中設置中斷向量表的代碼執行完后,在0號表項中填入了do0的入口地址0:200,此時0:200 處的信息,即do0 的代碼,就變成了0號中斷的中斷處理程序

1.6 一些問題的思考與解答

我們如何讓一個內存單元成為棧頂?

答:將它的地址放入SS、SP中;

我們如何讓一個內存單元中的信息被CPU當作指令來執行?

答:將它的地址放入CS、IP 中;

那么,我們如何讓一段程序成為N號中斷的中斷處理程序?

答:將它的入口地址放入中斷向量表的N號表項中。

2. 安裝

下面的內容中,我們討論每一部分程序的具體編寫方法。

2.1 使用movsb指令

我們可以使用movsb指令,將do0的代碼送入0:0200處。

程序如下:

assume cs:code
code segmentstart: 設置es:di指向目的地址設置ds:si指向源地址設置cx為傳輸長度設置傳輸方向為正rep movsb設置中斷向量表mov ax,4c00hint 21hdo0: 顯示字符串“overflow!” mov ax,4c00hint 21hcode ends
end start

2.2 明確執行rep movsb前所設置的信息

我們來看一下,用rep movsb指令的時候需要確定的信息:

  • (1)傳送的原始位置,段地址:code,偏移地址:offset do0

  • (2)傳送的目的位置:0:200;

  • (3)傳送的長度:do0部分代碼的長度;

  • (4)傳送的方向:正向。

更明確的程序如下:

assume cs:codecode segment
start: mov ax, csmov ds, axmov si, offset do0			 ;設置ds:si指向源地址mov ax, 0mov es, axmov di, 200h       			 ;設置es:di指向目的地址mov cx, do0部分代碼的長度		;設置cx為傳輸長度cld         	             ;設置傳輸方向為正rep movsb;設置中斷向量表 mov ax, 4c00hint 21hdo0: ;顯示字符串“Welcome to Fishc.com!” mov ax, 4c00hint 21hcode ends
end start

2.3 do0代碼的長度

問題是,我們如何知道do0代碼的長度?

最簡單的方法是,計算一下do0 所有指令碼的字節數。但是這樣做太麻煩了,因為只要do0的內容發生了改變,我們都要重新計算它的長度。

其實,我們可以利用編譯器來計算do0的長度,具體做法如下:

 assume cs:codecode segmentstart: mov ax,csmov ds,axmov si,offset do0				;設置ds:si指向源地址mov ax,0mov es,axmov di,200h       				;設置es:di指向目的地址mov cx,offset do0end-offset do0	;設置cx為傳輸長度cld                     		;設置傳輸方向為正rep movsb;設置中斷向量表 mov ax,4c00hint 21hdo0: ;顯示字符串“overflow!” mov ax,4c00hint 21h
do0end:	nopcode ends
end start

“-”是編譯器識別的運算符號,編譯器可以用它來進行兩個常數的減法。

比如:mov ax,8-4,被編譯器處理為指令: mov ax,4

另外,編譯器還可以處理表達式。

比如指令: mov ax,(5+3)\*5/10,被編譯器處理為指令: mov ax,4

好了,知道了“-”的含義,對于用 ofset do0end-ofset do0,得到 do0 代碼的長度的原理,這里就不再多說了,相信到了現在,大家已經可以自己進行分析了。

后面的文章中我們將編寫 do0 程序。

結語

今天的分享到這里就結束啦!如果覺得文章還不錯的話,可以三連支持一下。

也可以點點關注,避免以后找不到我哦!

Crossoads主頁還有很多有趣的文章,歡迎小伙伴們前去點評,您的支持就是作者前進的動力!

在這里插入圖片描述

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

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

相關文章

華為OD E卷(100分)23-連續字母長度

前言 工作了十幾年,從普通的研發工程師一路成長為研發經理、研發總監。臨近40歲,本想辭職后換一個相對穩定的工作環境一直干到老, 沒想到離職后三個多月了還沒找到工作,愁腸百結。為了讓自己有點事情做,也算提高一下自己的編程能力…

VS2019中無法跳轉定義_其中之一情況

我習慣了使用VS2019看stm的代碼; 遇到的問題,在導入代碼后,發現有些函數調用不能跳轉到定義; 問題描述步驟 1、導入代碼 2、跳轉,無法跳轉 1、中文路徑 2、刪除.vs文件 和網上查的都沒辦法解決 最后發現是VS不支持 …

讓 Win10 上網本 Debug 模式 QUDPSocket 信號槽 收發不丟包的方法總結

在前兩篇文章里,我們探討了不少UDP丟包的解決方案。經過幾年的摸索測試,其實方法非常簡單, 無需修改代碼。 1. Windows 下設置UDP緩存 這個方法可以一勞永逸解決UDP的收發丟包問題,只要添加注冊表項目并重啟即可。即使用Qt的信號與槽&#…

【設計模式】觀察者模式深度講解

文章目錄 概覽一、定義與特點二、角色與職責三、實現方式四、應用場景五、優缺點 Java實現Python實現 概覽 觀察者模式(Observer Pattern)是一種行為型設計模式,它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題…

Elasticsearch:ES|QL 中的全文搜索 - 8.17

細心的開發者如果已經閱讀我前兩天發布的文章 “Elastic 8.17:Elasticsearch logsdb 索引模式、Elastic Rerank 等”,你就會發現在 8.17 的發布版中,有一個重要的功能發布。那就是 ES|QL 開始支持全文搜索了。在今天的文章中我們來嘗試一下。…

SQL和Python 哪個更容易自學?

SQL和Python不是一個物種,Python肯定更難學習。如果你從事數據工作,我建議先學SQL、有余力再學Python。因為SQL不光容易學,而且前期的投入產出比更大。 SQL是數據查詢語言,場景限于數據查詢和數據庫的管理,對大部分數據…

【unity】從零開始制作平臺跳躍游戲--界面的認識,添加第一個角色!

在上一篇文章中,我們已經完成了unity的環境配置與安裝?? 【Unity】環境配置與安裝-CSDN博客 接下來,讓我們開始新建一個項目吧! 新建項目 首先進入unityHub的項目頁面,點擊“新項目”: 我們這個系列將會以2D平臺…

怎么禁用 vscode 中點擊 go 包名時自動打開瀏覽器跳轉到 pkg.go.dev

本文引用怎么禁用 vscode 中點擊 go 包名時自動打開瀏覽器跳轉到 pkg.go.dev 在 vscode 設置項中配置 gopls 的 ui.navigation.importShortcut 為 Definition 即可。 "gopls": {"ui.navigation.importShortcut": "Definition" }ui.navigation.i…

Unity3D實現抽象類的應用場景例子

系列文章目錄 unity知識點 文章目錄 系列文章目錄??前言??一、示例??二、使用步驟??三、抽象類和接口的區別??3-1、抽象類??3-2、接口類??壁紙分享??總結??前言 假設我們正在制作一個游戲,游戲中有多種不同類型的角色,這些角色都有一些共同的行為(比如移…

數據倉庫工具箱—讀書筆記01(數據倉庫、商業智能及維度建模初步)

數據倉庫、商業智能及維度建模初步 記錄一下讀《數據倉庫工具箱》時的思考,摘錄一些書中關于維度建模比較重要的思想與大家分享🤣🤣🤣 博主在這里先把這本書"變薄"~有時間的小伙伴可以親自再讀一讀,感受一下…

docker啟動一個helloworld(公司內網服務器)

這里寫目錄標題 容易遇到的問題:1、docker連接問題 我來介紹幾種啟動 Docker Hello World 的方法: 最簡單的方式: docker run hello-world這會自動下載并運行官方的 hello-world 鏡像。 使用 Nginx 作為 Hello World: docker…

計算機組成原理(五):程序裝載

在計算機組成原理中,程序裝載(Program Loading)是指將程序從外存(如磁盤)加載到內存中,并為其運行做好準備的過程。程序裝載是實現程序從靜態存儲狀態到動態運行狀態的關鍵環節,涉及地址映射、內…

Python+OpenCV系列:模版匹配

文章目錄 1. 模板匹配基本原理2. cv2.matchTemplate() 函數函數原型: 3. 模板匹配步驟4. 單目標模板匹配示例5. 多目標模板匹配多目標模板匹配示例代碼解析: 6. 多模板匹配多模板匹配示例代碼解析 7. 總結 模板匹配是一種在圖像中尋找模板的位置的方法。…

基于IEEE 802.1Qci的時間敏感網絡(TSN)主干架構安全分析及異常檢測系統設計

中文標題:基于IEEE 802.1Qci的時間敏感網絡(TSN)主干架構安全分析及異常檢測系統設計 英文標題:Security Analysis of the TSN Backbone Architecture and Anomaly Detection System Design Based on IEEE 802.1Qci 作者信息&…

怎樣提升企業網絡的性能?

企業網絡的穩定性和高效性直接影響員工的工作效率。以下從多維度分析了一些有效策略,幫助公司提升網絡性能,營造更高效的辦公環境。 1. 升級網絡設備 采用性能更高的網絡硬件是優化網絡體驗的重要基礎。選擇支持高吞吐量、低延遲的設備(如企業…

scala基礎_數據類型概覽

Scala 數據類型 下表列出了 Scala 支持的數據類型: 類型類別數據類型描述Scala標準庫中的實際類基本類型Byte8位有符號整數,數值范圍為 -128 到 127scala.Byte基本類型Short16位有符號整數,數值范圍為 -32768 到 32767scala.Short基本類型I…

力扣239.滑動窗口最大值

文章目錄 一、前言二、單調隊列 一、前言 力扣239.滑動窗口最大值 滑動窗口最大值,這道題給定一個數組,以及一個窗口的長度,這個窗口會往后滑動,直到數組最后一個元素。 要求每個滑動窗口的中的最大值。對于這道題,我…

mac 安裝CosyVoice (cpu版本)

CosyVoice 介紹 CosyVoice 是阿里研發的一個tts大模型 官方項目地址:https://github.com/FunAudioLLM/CosyVoice.git 下載項目(非官方) git clone --recursive https://github.com/v3ucn/CosyVoice_for_MacOs.git 進入項目 cd CosyVoic…

電腦插件修復工具

DirectX修復工具 鏈接:夸克網盤分享

Maven 安裝配置(詳細教程)

文章目錄 一、Maven 簡介二、下載 Maven三、配置 Maven3.1 配置環境變量3.2 Maven 配置3.3 IDEA 配置 四、結語 一、Maven 簡介 Maven 是一個基于項目對象模型(POM)的項目管理和自動化構建工具。它主要服務于 Java 平臺,但也支持其他編程語言…