汇编语言笔记(四):内中断
????匯編語言筆記:內中斷
章節目錄
作者能力有限, 如果您在閱讀過程中發現任何錯誤, 還請您務必聯系本人,指出錯誤, 避免后來讀者再學習錯誤的知識.謝謝!
概念
中斷信息:
任何一個通用 CPU 都具備一種能力, 可以在執行完當前正在執行的指令之后, 檢測到從 CPU 外部發送過來的或者內部產生的一種特殊信息, 并且可以立即對所接受到的信息進行處理. 這種特殊的信息稱為:中斷信息. 中斷意味著 CPU 不再繼續向下執行, 而是轉去處理這個特殊的信息.
CPU 內部產生的中斷稱為內中斷
對于 8086 CPU, 有以下四種中斷信息.
| 除法錯誤 | 0 |
| 單步執行 | 1 |
| 執行 into 指令 | 4 |
| 執行 int 指令 | n |
中斷類型碼是中斷來源信息的編碼. 在 8086CPU 中使用一個字節的長度來編碼中斷源.
中斷處理程序:
CPU 在收到中斷信息之后, 需要對中斷進行處理. 中斷處理程序就是用來處理對應中斷的程序. CPU 在收到中斷信息之后, 就會轉去執行對應的中斷處理程序. 中斷處理程序由程序員編寫.
中斷向量表: 是中斷向量的列表.
中斷向量: 是中斷程序的入口地址.
中斷向量表在內存中保存, 存放著 256 個中斷源所對應的中斷處理程序的入口地址. CPU 根據中斷類型碼作為中斷向量表的表項號, 定位相應的表項, 從而得到中斷處理程序的入口地址.
對于 8086PC 機, 中斷向量表存放在 0000:0000 ~ 0000:03FF 所在的內存中. 每個表項占用兩個字節的大小. 高地址字存放段地址, 低地址字存放偏移地址.
中斷過程
這個過程由 CPU 完成.
示例: 0 號中斷處理
下面的示例中, 我們將完成一個處理除法溢出的中斷處理程序. 完成后, 先執行中斷處理程序, 然后當系統發生除法中斷, 我們的中斷處理程序就會被執行, 在屏幕中央顯示 “overflow!” 字符串.
中斷處理程序:
程序一開始, 我們將我們的中斷處理程序 do0 和 do0Start 存儲在內存位置 0:200H 開始的地址中. 沒有直接申請對應的內存, 是因為不想涉及操作系統相關的操作. 0000:0000 ~ 0000:03FF 這段地址本是用來存放中斷向量表的, 但是大部分情況下并沒有那么多的中斷處理程序, 因此我們就借用了這段地址來存儲我們的中斷處理程序. 將 do0 存到 0:200H 的地址中這個操作 我們使用了 movsb 指令.
中斷處理程序 do0Start 完成在屏幕上顯示 “overflow!” 的功能. 這里, 我們將 “overflow!” 字符串保存在代碼段中, 是為了一起復制到 0:200H 中去. 如果我們為該字符串單獨定義一個數據段, 那么為了能訪問該數據段, 我們還需要額外的將該數據段也復制到 0:200H 相應的內存中去. 為了避免麻煩, 我們這里直接將它寫在代碼段中, 這樣數據會和代碼一次性被拷貝到相應內存中去.
因為我們處理的的是0號中斷, 因此我們在設置中斷向量表時, 是將對應的中斷處理程序地址(0:200h) 分別設置到 0:2 和 0:0 中去.
如果單純的編譯運行該程序, 不會有任何輸出, 因為該程序只是完成將0號中斷處理程序保存在內存地址 0:200H 開始的內存地址中, 并將該程序的內存地址保存到 0 號對應的向量表中, 以便當發生除法中斷時, 該程序會被調用.
測試代碼:
使用如下代碼測試一下我們的程序是否成功運行.
在我的機器上運行效果如下:
歡迎交流任何想法.
End…
總結
以上是生活随笔為你收集整理的汇编语言笔记(四):内中断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 静态添加DLL
- 下一篇: 逆向调试雷电思路总结