【汇编语言】王爽 - 内中断复习
0 前言
基于王爽《匯編語(yǔ)言》和Coursera的《計(jì)算機(jī)組成》課程。
1 中斷分類
CPU在執(zhí)行指令的過(guò)程中,產(chǎn)生了一個(gè)異常/中斷,因?yàn)镃PU只能同時(shí)執(zhí)行一條指令,所以需要暫停該指令的執(zhí)行,轉(zhuǎn)而去處理異常/中斷信息。
這個(gè)異??梢詠?lái)源于
2 內(nèi)中斷實(shí)例分析:除法錯(cuò)中斷
我們來(lái)看一看除法錯(cuò)中斷發(fā)生的完整過(guò)程,來(lái)理解中斷的相關(guān)概念。
2.0 來(lái)源
程序?qū)嵗?/p> assume cs:datasg datasg segment start:mov ax,1000hmov bh,1div bhmov ax,4c00hint 21h datasg ends end start
2.1 產(chǎn)生 & 檢測(cè)
很明顯,1000h / 1得到的商超過(guò)了8位(AL的范圍),會(huì)產(chǎn)生溢出。從而被CPU內(nèi)部的中斷檢測(cè)部件檢測(cè)出來(lái),觸發(fā)中斷機(jī)制。
2.2 觸發(fā) & 執(zhí)行
中斷機(jī)制被觸發(fā)后,會(huì)做出一系列動(dòng)作,先執(zhí)行中斷程序,再回來(lái)繼續(xù)執(zhí)行原程序,注意,這里的說(shuō)明相對(duì)抽象。
2.3 修改0號(hào)中斷
0號(hào)中斷是存儲(chǔ)在8086CPU內(nèi)存的中斷向量表中,0x0000 ~ 0x03ff,共400H,也就是1MB的空間。
寫(xiě)一段程序,然后將其拷貝到被保護(hù)的內(nèi)存區(qū)域(指令和數(shù)據(jù)都要),然后,將中斷向量表對(duì)應(yīng)的地址修改,這樣,這段程序就成為了中斷服務(wù)程序,可以被動(dòng)調(diào)用,也可以主動(dòng)調(diào)用。
3 對(duì)中斷的理解
3.1 中斷是什么?
指令執(zhí)行過(guò)程中,有其他事務(wù)要優(yōu)先處理,需要放下當(dāng)前執(zhí)行的指令,執(zhí)行完其他事務(wù)再回來(lái)執(zhí)行。
這就好比,你在寫(xiě)作業(yè),突然你媽媽讓你去買醬油,你就需要先放下作業(yè),買完醬油回來(lái),再寫(xiě)作業(yè)。這里買醬油就是一個(gè)中斷。
3.2 中斷來(lái)源于哪?
外部中斷分為可屏蔽(可以不理會(huì)!)和不可屏蔽中斷(必須執(zhí)行!不可忽略!)。
3.3 中斷何時(shí)發(fā)生?
查看中斷向量表即可。
3.4 中斷執(zhí)行過(guò)程是什么?
3.5 中斷服務(wù)程序是什么?
普通的一段程序,如果其入口地址被放在了中斷向量表的某個(gè)中斷中,這個(gè)程序就是【中斷服務(wù)程序】。
發(fā)生中斷時(shí),系統(tǒng)給出的解決方案,就是中斷服務(wù)程序。其入口地址存放在中斷向量表中,程序系統(tǒng)默認(rèn)有,也可以自己編寫(xiě)。
3.6 中斷服務(wù)程序如何編寫(xiě)和安裝?
3.7 中斷的功能是什么?
3.7.1 自動(dòng)調(diào)用:(Checked)異常處理
比如除法錯(cuò)中斷,就是系統(tǒng)自動(dòng)檢測(cè)并處理的。
3.7.2 手動(dòng)調(diào)用:(Unchecked)異常處理
比如溢出中斷,需要手動(dòng)寫(xiě)INTO(Interrupt Overflow)指令,才會(huì)進(jìn)行處理,否則運(yùn)算溢出的時(shí)候不做任何處理。
3.7.3 手動(dòng)調(diào)用:系統(tǒng)調(diào)用(System Call)
主動(dòng)使用中斷,能夠幫助程序員快速實(shí)現(xiàn)一些功能,這也就是基于中斷機(jī)制的功能調(diào)用,極大提高了開(kāi)發(fā)效率。
4 單步中斷 & 斷點(diǎn)中斷
這兩個(gè)中斷類型,就是單步調(diào)試和斷點(diǎn)調(diào)試背后的實(shí)現(xiàn)機(jī)制,方便程序員調(diào)試程序。
4.1 單步中斷
TF標(biāo)志位為1的時(shí)候,發(fā)生單步中斷,然后就被置0,防止無(wú)限嵌套中斷發(fā)生。
單步中斷是為了方便調(diào)試程序和查看寄存器等相關(guān)內(nèi)容的值。
4.2 斷點(diǎn)中斷
對(duì)于INT n。n一共是256個(gè),占1個(gè)字節(jié),INT指令碼占1個(gè)字節(jié),共2個(gè)字節(jié),而**斷點(diǎn)中斷(INT 3)**特殊,占1個(gè)字節(jié),其編碼是1100_1100B,這與其實(shí)現(xiàn)機(jī)制有關(guān)。
斷點(diǎn)中斷是通過(guò)INT 3指令主動(dòng)調(diào)用的,執(zhí)行的時(shí)候,該指令會(huì)臨時(shí)替換斷點(diǎn)處的1個(gè)字節(jié),遇到了就發(fā)生中斷,顯示寄存器和其他相關(guān)內(nèi)容的值,便于程序員調(diào)試。
x86指令系統(tǒng)中,指令最少1個(gè)字節(jié),因此INT 3也是1個(gè)字節(jié),這樣INT 3的替換,至多影響1條指令。 如果不是1個(gè)字節(jié),可能影響2條指令,發(fā)生錯(cuò)誤。
4.3 應(yīng)用
例如debug的t命令,還有插入斷點(diǎn)等,都是基于單步中斷和斷點(diǎn)中斷機(jī)制實(shí)現(xiàn),它們的出現(xiàn)是為了方便程序調(diào)試,并且在debug程序中已經(jīng)能夠?qū)崿F(xiàn)中斷觸發(fā),對(duì)著這種指令,不要寫(xiě)在程序中,調(diào)試程序直接讓程序運(yùn)行在調(diào)試模式下就好了。
總結(jié)
以上是生活随笔為你收集整理的【汇编语言】王爽 - 内中断复习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 西津渡剧情介绍
- 下一篇: vue项目中的build目录是干嘛的?