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