




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第12章 內(nèi)中斷12.1 內(nèi)中斷的產(chǎn)生12.2 中斷處理程序12.3 中斷向量表12.4 中斷過(guò)程12.5 中斷處理程序12.6 除法錯(cuò)誤中斷的處理12.7 編程處理 0 號(hào)中斷12.8 安裝12.9 do012.10 設(shè)置中斷向量12.11 單步中斷12.12 響應(yīng)中斷的特殊情況引言中斷的意思是指,CPU不再接著(剛執(zhí)行完的指令)向下執(zhí)行,而是轉(zhuǎn)去處理這個(gè)特殊信息。注意,我們這里所說(shuō)的中斷信息,是為了便于理解而采用的種邏輯上的說(shuō)法。它是對(duì)幾個(gè)具有先后順序的硬件操作所產(chǎn)生的事件的統(tǒng)一描述。12.1 內(nèi)中斷的產(chǎn)生當(dāng)CPU 的內(nèi)部有什么事情發(fā)生的時(shí)候,將產(chǎn)生需要馬上處理的中斷信息呢?對(duì)于8086C
2、PU,當(dāng)內(nèi)部有下面情況發(fā)生的時(shí)候,將產(chǎn)生中斷信息:1、除法錯(cuò)誤,比如:執(zhí)行div指令產(chǎn)生的除法溢出;2、單步執(zhí)行;3、執(zhí)行int0指令;4、執(zhí)行int 指令。12.1 內(nèi)中斷的產(chǎn)生上述的4種中斷源,在8086CPU中的中斷類型碼如下:(1)除法錯(cuò)誤:0(2)單步執(zhí)行:1(3)執(zhí)行 int0 指令:(4)執(zhí)行 int 指令 ,該指令的格式為 int n,指令中的n為字節(jié)型立即數(shù),是提供給CPU的中斷類型碼。12.2 中斷處理程序CPU的設(shè)計(jì)者必須在中斷信息和其處理程序的入口地址之間建立某種聯(lián)系,使得CPU根據(jù)中斷信息可以找到要執(zhí)行的處理程序。我們知道,中斷信息中包含有標(biāo)識(shí)中斷源的類型碼。根據(jù)CP
3、U的設(shè)計(jì),中斷類型碼的作用就是用來(lái)定位中斷處理程序。 12.2 中斷處理程序比如CPU 根據(jù)中斷類型碼 4,就可以找到4號(hào)中斷的處理程序??呻S之而來(lái)的問(wèn)題是,若要定位中斷處理程序,需要知道它的段地址和偏移地址,而如何根據(jù) 8位的中斷類型碼得到中斷處理程序的段地址和偏移地址呢? 12.3 中斷向量表CPU用 8 位的中斷類型碼通過(guò)中斷向量表找到相應(yīng)的中斷處理程序的入口地址。那么什么是中斷向量表呢? 中斷向量表就是中斷向量的列表。12.3 中斷向量表中斷向量表在內(nèi)存中保存,其中存放著 256個(gè)中斷源所對(duì)應(yīng)的中斷處理程序的入口,如下圖所示:12.3 中斷向量表中斷向量表在內(nèi)存中存放,對(duì)于8086PC
4、機(jī),中斷向量表指定放在內(nèi)存地址0處。從內(nèi)存0000:0000到0000:03FF的1024個(gè)單元中存放著中斷向量表。特別提示檢測(cè)點(diǎn)12.1(p227)沒(méi)有完成此檢測(cè)點(diǎn),請(qǐng)不要向下進(jìn)行。12.4 中斷過(guò)程從上面的講解中,我們知道,可以用中斷類型碼,在中斷向量表中找到中斷處理程序的入口。找到這個(gè)入口地址的最終目的是用它設(shè)置CS和IP,使CPU執(zhí)行中斷處理程序。12.4 中斷過(guò)程用中斷類型碼找到中斷向量,并用它設(shè)置CS和IP,這個(gè)工作是由CPU的硬件自動(dòng)完成的。CPU 硬件完成這個(gè)工作的過(guò)程被稱為中斷過(guò)程。12.4 中斷過(guò)程在使用 call 指令調(diào)用子程序時(shí)有同樣的問(wèn)題,子程序執(zhí)行后還要返回到原來(lái)的
5、執(zhí)行點(diǎn)繼續(xù)執(zhí)行, 所以,call 指令先保存當(dāng)前 CS 的 IP值,然后再設(shè)置CS和IP。12.4 中斷過(guò)程8086CPU的中斷過(guò)程:(1)(從中斷信息中)取得中斷類型碼;(2)標(biāo)志寄存器的值入棧( 因?yàn)樵谥袛噙^(guò)程中要改變標(biāo)志寄存器的值,所以先將其保存在棧中。);(3)設(shè)置標(biāo)志寄存器的第8位TF 和第9位IF的值為0;(這一步的目的后面將介紹) (4)CS的內(nèi)容入棧;(5)IP的內(nèi)容入棧;(6)從內(nèi)存地址為中斷類型碼*4 和中斷類型碼 *4+2 的兩個(gè)字單元中讀取中斷處理程序的入口地址設(shè)置IP和CS。12.4 中斷過(guò)程CPU在收到中斷信息之后,如果處理該中斷信息,就完成一個(gè)由硬件自動(dòng)執(zhí)行的中斷
6、過(guò)程。 (程序員無(wú)法改變這個(gè)過(guò)程中所要做 的工作)12.4 中斷過(guò)程中斷過(guò)程的主要任務(wù)就是用中斷類型碼在中斷向量表中找到中斷處理程序的入口地址,設(shè)置CS和IP。因?yàn)橹袛嗵幚沓绦驁?zhí)行完成后,CPU還要回過(guò)頭來(lái)繼續(xù)執(zhí)行被中斷的程序, 所以要在設(shè)置CS、IP之前,先將它們的值保存起來(lái)。12.4 中斷過(guò)程可以看到CPU將它們保存在棧中。我們注意到,在中斷過(guò)程中還要做的一個(gè)工作就是設(shè)置標(biāo)志寄存器的TF、IF位。對(duì)于這樣做的目的,我們將在后面的內(nèi)容和下一章中進(jìn)行討論。12.4 中斷過(guò)程因?yàn)樵趫?zhí)行完中斷處理程序后,需要恢復(fù)在進(jìn)入中斷處理程序之前的CPU現(xiàn)場(chǎng) (某一時(shí)刻,CPU中各個(gè)寄存器的值)。 所以應(yīng)該在
7、修改標(biāo)記寄存器之前,將它的值入棧保存。12.4 中斷過(guò)程我們更簡(jiǎn)潔的描述中斷過(guò)程,如下:(1)取得中斷類型碼N;(2) pushf(3) TF = 0,IF = 0(4) push CS(5) push IP(6)(IP) = (N*4),(CS) = (N*4+2)在最后一步完成后,CPU 開(kāi)始執(zhí)行由程序員編寫的中斷處理程序。中斷過(guò)程演示 12.5 中斷處理程序由于CPU隨時(shí)都可能檢測(cè)到中斷信息,也就是說(shuō),CPU 隨時(shí)都可能執(zhí)行中斷處理程序,所以中斷處理程序必須一直存儲(chǔ)在內(nèi)存某段空間之中。而中斷處理程序的入口地址,即中斷向量,必須存儲(chǔ)在對(duì)應(yīng)的中斷向量表表項(xiàng)中。12.5 中斷處理程序中斷處理程
8、序的編寫方法和子程序的比較相似,下面是常規(guī)的步驟: (1)保存用到的寄存器。(2)處理中斷。(3)恢復(fù)用到的寄存器。(4)用 iret 指令返回。iret指令的功能用匯編語(yǔ)法描述為: pop IP pop CS popf12.5 中斷處理程序iret通常和硬件自動(dòng)完成的中斷過(guò)程配合使用??梢钥吹?,在中斷過(guò)程中,寄存器入棧的順序是標(biāo)志寄存器、CS、IP ,而iret的出棧順序是 IP、CS、標(biāo)志寄存器,剛好和其對(duì)應(yīng),實(shí)現(xiàn)了用執(zhí)行中斷處理程序前的CPU現(xiàn)場(chǎng)恢復(fù)標(biāo)志寄存器和CS、IP的工作。12.5 中斷處理程序iret指令執(zhí)行后,CPU回到執(zhí)行中斷處理程序前的執(zhí)行點(diǎn)繼續(xù)執(zhí)行程序。12.6 除法錯(cuò)誤
9、中斷的處理下面的內(nèi)容中,我們通過(guò)對(duì) 0號(hào)中斷,即除法錯(cuò)誤的中斷處理,來(lái)體會(huì)一下前面所講的內(nèi)容。12.6 除法錯(cuò)誤中斷的處理當(dāng)CPU執(zhí)行div等除法指令的時(shí)候,如果發(fā)生了除法溢出錯(cuò)誤,將產(chǎn)生中斷類型碼為 0 的中斷信息,CPU將檢測(cè)到這個(gè)信息,然后引發(fā)中斷過(guò)程,轉(zhuǎn)去執(zhí)行 0 號(hào)中斷所對(duì)應(yīng)的中斷處理程序。12.6 除法錯(cuò)誤中斷的處理我們看一下下面的程序的執(zhí)行結(jié)果: mov ax,1000h mov bh,1 div bh12.7 編程處理 0 號(hào)中斷現(xiàn)在我們考慮改變一下0號(hào)中斷處理程序的功能,即重新編寫一個(gè)0號(hào)中斷處理程序,它的功能是在屏幕中間顯示“overflow!”后,然后返回到操作系統(tǒng)。如下
10、圖所示12.6 除法錯(cuò)誤中斷的處理12.7 編程處理 0 號(hào)中斷當(dāng)CPU執(zhí)行div bh時(shí),發(fā)生了除法溢出錯(cuò)誤,產(chǎn)生0號(hào)中斷信息,從而引發(fā)中斷過(guò)程,CPU執(zhí)行我們編寫的0號(hào)中斷處理程序。在屏幕中間顯示提示信息“overflow!”后,返回到操作系統(tǒng)中。12.7 編程處理 0 號(hào)中斷編程:當(dāng)發(fā)生除法溢出時(shí),在屏幕中間顯示“overflow!”,返回DOS。分析12.7 編程處理 0 號(hào)中斷分析(1)當(dāng)發(fā)生除法溢出的時(shí)候,產(chǎn)生0號(hào)中斷信息,從而引發(fā)中斷過(guò)程。 此時(shí),CPU將進(jìn)行以下工作: 取得中斷類型碼0; 標(biāo)志寄存器入棧,TF、IF設(shè)置為0; CS、IP入棧; (IP) = (0*4),(CS)
11、 = (0*4+2)12.7 編程處理 0 號(hào)中斷分析(2)可見(jiàn) ,當(dāng)中斷 0 發(fā)生時(shí),CPU將轉(zhuǎn)去執(zhí)行中斷處理程序。 只要按如下步驟編寫中斷處理程序,當(dāng)中斷0發(fā)生時(shí),即可顯示“overflow!”。 相關(guān)處理。 向顯示緩沖區(qū)送字符串“overflow!”。 返回DOS12.7 編程處理 0 號(hào)中斷我們將這段程序稱為do0。分析(3)現(xiàn)在的問(wèn)題是:do0 應(yīng)放在內(nèi)存中。 因?yàn)槌ㄒ绯鲭S時(shí)可能發(fā)生,CPU隨時(shí)都可能將 CS:IP指向 do0的入口,執(zhí)行程序。 12.7 編程處理 0 號(hào)中斷那么do0應(yīng)該放在哪里呢? 由于我們是在操作系統(tǒng)之上使用計(jì)算機(jī),所有的硬件資源都在操作系統(tǒng)的管理之下,所以我
12、們要想得到一塊內(nèi)存存放do0,應(yīng)該向操作系統(tǒng)申請(qǐng)。12.7 編程處理 0 號(hào)中斷但在這里出于兩個(gè)原因我們不想這樣做:過(guò)多地討論申請(qǐng)內(nèi)存將偏離問(wèn)題主線;我們學(xué)習(xí)匯編的一個(gè)重要目的就是要獲得對(duì)計(jì)算機(jī)底層的編程體驗(yàn)。 所以,在可能的情況下,我們不去理會(huì)操作系統(tǒng),而直接面向硬件資源。12.7 編程處理 0 號(hào)中斷問(wèn)題變得簡(jiǎn)單而直接,我們只需找到一塊別的程序不會(huì)用到的內(nèi)存區(qū),將do0傳送到其中即可。前面講到,內(nèi)存0000:00000000:03FF,大小為1KB的空間是系統(tǒng)存放中斷處理程序入口地址的中斷向量表。12.7 編程處理 0 號(hào)中斷8086 支持 256 個(gè)中斷,但是,實(shí)際上,系統(tǒng)中要處理的中斷
13、事件遠(yuǎn)沒(méi)有達(dá)到256 個(gè) 。 所以在中斷向量表中,有許多單元是空的。中斷向量表是PC系統(tǒng)中最重要的內(nèi)存區(qū),只用來(lái)存放中斷處理程序的入口地址,DOS 系統(tǒng)和其他應(yīng)用程序都不會(huì)隨便使用這段空間。12.7 編程處理 0 號(hào)中斷我們可以利用中斷向量表中的空閑單元來(lái)存放我們的程序。一般情況下: 從0000:0200至0000:02FF的256個(gè)字節(jié)的空間所對(duì)應(yīng)的中斷向量表項(xiàng)都是空的,操作系統(tǒng)和其他應(yīng)用程序都不占用。 我們?cè)谇懊娴恼n程中使用過(guò)這段空間(參見(jiàn)5.7節(jié))。12.7 編程處理 0 號(hào)中斷根據(jù)以前的編程經(jīng)驗(yàn),我們可以估計(jì)出,do0的長(zhǎng)度不可能超過(guò)256個(gè)字節(jié)。結(jié)論:我們可以將do0傳送到內(nèi)存000
14、0:0200處。12.7 編程處理 0 號(hào)中斷分析(4 - 1) 我們將中斷處理程序do0放到 0000:0200 后,若要使得除法溢出發(fā)生的時(shí)候,CPU轉(zhuǎn)去執(zhí)行do0,則必須將do0的入口地址,即0000:0200登記在中斷向量表的對(duì)應(yīng)表項(xiàng)中。12.7 編程處理 0 號(hào)中斷分析(4 - 2) 因?yàn)槌ㄒ绯鰧?duì)應(yīng)的中斷類型碼為0,它的中斷處理程序的入口地址應(yīng)該從04地址單元開(kāi)始存放,段地址存放在 04+2 字單元中,偏移地址存放在04字單元中。 12.7 編程處理 0 號(hào)中斷分析(4 - 3) 也就是說(shuō)要將do0的段地址0存放在 0000:0002 字單元中 ,將偏移地址200H存放在0000:
15、0000字單元中。 12.7 編程處理 0 號(hào)中斷總結(jié)上面的分析,我們要做以下幾件事情:(1)編寫可以顯示“overflow!”的中斷處理程序:do0;(2)將do0送入內(nèi)存0000:0200處;(3)將do0的入口地址0000:0200存儲(chǔ)在中斷向量表0號(hào)表項(xiàng)中。程序框架12.7 編程處理 0 號(hào)中斷程序12.1 assume cs:code code segment start: do0安裝程序 設(shè)置中斷向量表 mov ax,4c00h int 21h do0: 顯示字符串“overflow!” mov ax,4c00h int 21hcode endsend start12.7 編程處理
16、 0 號(hào)中斷我們可以看到,上面的程序分為兩部分:(1)安裝do0,設(shè)置中斷向量的程序(2)do0程序12.1執(zhí)行時(shí),do0的代碼是不執(zhí)行的,它只是作為do0安裝程序所要傳送的數(shù)據(jù)。12.7 編程處理 0 號(hào)中斷程序12.1執(zhí)行時(shí),首先執(zhí)行do0安裝程序,將 do0 的代碼拷貝到內(nèi)存 0:200處,然后設(shè)置中斷向量表,將do0的入口地址,即偏移地址200H和段地址0,保存在0號(hào)表項(xiàng)中。這兩部分工作完成后,程序就返回了。12.7 編程處理 0 號(hào)中斷程序的目的就是在內(nèi)存0:200處安裝do0 的代碼,將0號(hào)中斷處理程序的入口地址設(shè)置為0:200。do0的代碼雖然在程序中,卻不在程序執(zhí)行的時(shí)候執(zhí)行。
17、它是在除法溢出發(fā)生的時(shí)候才得以執(zhí)行的中斷處理程序。12.7 編程處理 0 號(hào)中斷do0部分代碼的最后兩條指令是依照我們的編程要求,用來(lái)返回DOS的?,F(xiàn)在,我們?cè)诜催^(guò)來(lái)從CPU的角度看一下,什么是中斷處理程序? 12.7 編程處理 0 號(hào)中斷我們來(lái)看一下do0是如何變成0號(hào)中斷的中斷處理程序的:(1)程序12.1 在執(zhí)行時(shí),被加載到內(nèi)存中,此時(shí)do0的代碼在程序12.1 所在的內(nèi)存空間中,它只是存放在程序12.1的代碼段中的一段要被傳送到其他單元中的數(shù)據(jù),我們不能說(shuō)它是0號(hào)中斷的中斷處理程序;12.7 編程處理 0 號(hào)中斷do0是如何變成0號(hào)中斷的中斷處理程序的:(2)程序12.1中安裝do0
18、的代碼執(zhí)行完后,do0的代碼被從程序12.1的代碼段中拷貝到0:200處。此時(shí),我們也不能說(shuō)它是0號(hào)中斷的中斷處理程序,它只不過(guò)是存放在0:200處的一些數(shù)據(jù);12.7 編程處理 0 號(hào)中斷do0是如何變成0號(hào)中斷的中斷處理程序的:(3)程序12.1中設(shè)置中斷向量表的代碼執(zhí)行完后,在0號(hào)表項(xiàng)中填入了do0的入口地址0:200,此時(shí)0:200 處的信息,即do0 的代碼,就變成了0號(hào)中斷的中斷處理程序。 因?yàn)楫?dāng)除法溢出(即0號(hào)中斷)發(fā)生時(shí),CPU將執(zhí)行0:200處的代碼。12.7 編程處理 0 號(hào)中斷回憶以下:我們?nèi)绾巫屢粋€(gè)內(nèi)存單元成為棧頂? 將它的地址放入SS、SP中;我們?nèi)绾巫專粋€(gè)內(nèi)存單元
19、中的信息被CPU當(dāng)作指令來(lái)執(zhí)行? 將它的地址放入CS、IP中;那么,我們?nèi)绾巫屢欢纬绦虺蔀镹號(hào)中斷的中斷處理程序? 將它的入口地址放入中斷向量表的N號(hào)表項(xiàng)中。12.7 編程處理 0 號(hào)中斷下面的內(nèi)容中,我們討論每一部分程序的具體編寫方法。12.8 安裝我們可以使用movsb指令,將do0的代碼送入0:0200處。程序框架12.8 安裝我們來(lái)看一下,用rep movsb指令的時(shí)候需要確定的信息:(1)傳送的原始位置,段地址:code,偏移地址:offset do0;(2)傳送的目的位置:0:200;(3)傳送的長(zhǎng)度:do0部分代碼的長(zhǎng)度;(4)傳送的方向:正向。更明確的程序12.8 安裝 ass
20、ume cs:code code segment start: 設(shè)置es:di指向目的地址 設(shè)置ds:si指向源地址 設(shè)置cx為傳輸長(zhǎng)度 設(shè)置傳輸方向?yàn)檎?rep movsb 設(shè)置中斷向量表 mov ax,4c00h int 21h do0: 顯示字符串“overflow!” mov ax,4c00h int 21hcode endsend start assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do0;設(shè)置ds:si指向源地址 mov ax,0 mov es,ax mov di,200h ;設(shè)置es
21、:di指向目的地址 mov cx,do0部分代碼的長(zhǎng)度;設(shè)置cx為傳輸長(zhǎng)度 cld ;設(shè)置傳輸方向?yàn)檎?rep movsb 設(shè)置中斷向量表 mov ax,4c00h int 21h do0: 顯示字符串“overflow!” mov ax,4c00h int 21hcode endsend start12.8 安裝問(wèn)題是,我們?nèi)绾沃纃o0代碼的長(zhǎng)度?最簡(jiǎn)單的方法是,計(jì)算一下do0 所有指令碼的字節(jié)數(shù)。 但是這樣做太麻煩了,因?yàn)橹灰猟o0的內(nèi)容發(fā)生了改變,我們都要重新計(jì)算它的長(zhǎng)度。12.8 安裝我們可以利用編譯器來(lái)計(jì)算do0的長(zhǎng)度。具體做法 assume cs:code code segmen
22、t start: mov ax,cs mov ds,ax mov si,offset do0;設(shè)置ds:si指向源地址 mov ax,0 mov es,ax mov di,200h ;設(shè)置es:di指向目的地址 mov cx,offset do0end-offset do0;設(shè)置cx為傳輸長(zhǎng)度 cld ;設(shè)置傳輸方向?yàn)檎?rep movsb 設(shè)置中斷向量表 mov ax,4c00h int 21h do0: 顯示字符串“overflow!” mov ax,4c00h int 21hdo0end:nopcode endsend start12.8 安裝“-”是編譯器識(shí)別的運(yùn)算符號(hào),編譯器可以用它
23、來(lái)進(jìn)行兩個(gè)常數(shù)的減法。比如:mov ax,8-4,被編譯器處理為指令: mov ax,4。編譯器可以處理表達(dá)式,比如: 指令: mov ax,(5+3)*5/10,被編譯器處理為指令: mov ax,412.8 安裝好了,知道了“-”的含義,對(duì)于用offset do0end-offset do0,得到do0代碼的長(zhǎng)度的原理,我們就不再多說(shuō)了,相信到現(xiàn)在,讀者已經(jīng)可以自己進(jìn)行分析了。下面我們編寫do0程序。12.9 do0do0程序的主要任務(wù)是顯示字符串,程序如下: do0:設(shè)置ds:si指向字符串 mov ax,0b800h mov es,ax mov di,12*160+36*2;設(shè)置es:
24、di指向顯存空間的中間位置 mov cx,9 ;設(shè)置cx為字符串長(zhǎng)度 s: mov al,si mov es:di,al inc si add di,2 loop s mov ax,4c00h int 21hdo0end:nop12.9 do0程序?qū)懞昧耍梢@示的字符串放在哪里呢?我們看程序12.2源碼12.9 do0程序12.2看似合理,可實(shí)際上卻大錯(cuò)特錯(cuò)。錯(cuò)誤分析12.9 do0程序12.2錯(cuò)誤分析注意,“overflow!”在程序12.2的data段中。程序12.2執(zhí)行完成后返回,它所占用的內(nèi)存空間被系統(tǒng)釋放,而在其中存放的“overflow!”也將很可能被別的信息覆蓋;12.9 do
25、0程序12.2錯(cuò)誤分析(續(xù))而do0程序被放到了0:200處,隨時(shí)都會(huì)因發(fā)生了除法溢出而被CPU 執(zhí)行,很難保證 do0 程序從原來(lái)程序12.2所處的空間中取得的是要顯示的字符串“overflow!”。12.9 do0因?yàn)?do0 程序隨時(shí)可能被執(zhí)行,而它要用到字符串“overflow”,所以該字符串也應(yīng)該存放在一段不會(huì)被覆蓋的空間中。正確的程序如下:程序12.3源碼12.9 do0在程序12.3中,我們將“overflow!”放到do0程序中,程序12.3執(zhí)行時(shí),將標(biāo)號(hào)do0到標(biāo)號(hào)do0end之間的內(nèi)容送到0000:0200處。12.9 do0注意,因?yàn)樵赿o0程序開(kāi)始處的“overflow
26、!”不是可以執(zhí)行的代碼,所以在“overflow!”之前加上一條jmp 指令,轉(zhuǎn)移到正式的do0 程序。 當(dāng)除法溢出發(fā)生時(shí),CPU 執(zhí)行0:200 處的jmp 指令,跳過(guò)后面的字符串,轉(zhuǎn)到正式的do0 程序執(zhí)行。12.9 do0do0程序執(zhí)行過(guò)程中必須要找到“overflow!”,那么它在哪里呢?首先來(lái)看段地址,“overflow!”和do0的代碼處于同一個(gè)段中,而除法溢出發(fā)生時(shí),CS中必然存放do0的段地址,也就是“overflow!”的段地址;12.9 do0再來(lái)看偏移地址,0:200處的指令為jmp short do0start ,這條指令占兩個(gè)字節(jié),所以“overflow!”的偏移地址
27、為202h 。12.10 設(shè)置中斷向量下面,我們將do0的入口地址0:200,寫入中斷向量表的 0 號(hào)表項(xiàng)中,使do0成為0 號(hào)中斷的中斷處理程序。12.10 設(shè)置中斷向量0號(hào)表項(xiàng)的地址為0:0,其中0:0字單元存放偏移地址,0:2字單元存放段地址。程序如下: mov ax,0 mov es,ax mov word ptr es:0*4,200h mov word ptr es:0*4+2,012.11 單步中斷基本上,CPU在執(zhí)行完一條指令之后,如果檢測(cè)到標(biāo)志寄存器的TF位為1,則產(chǎn)生單步中斷,引發(fā)中斷過(guò)程。單步中斷的中斷類型碼為1,則它所引發(fā)的中斷過(guò)程如下:(1)取得中斷類型碼1;(2)標(biāo)
28、志寄存器入棧,TF、IF設(shè)置為0;(3) CS、IP入棧;(4)(IP)=(1*4),(CS)=(1*4+2)。12.11 單步中斷如上所述,如果TF=1,則執(zhí)行一條指令后,CPU就要轉(zhuǎn)去執(zhí)行1號(hào)中斷處理程序。CPU為什么要提供這樣的功能呢?12.11 單步中斷我們?cè)谑褂肈ebug的T命令的時(shí)候,有沒(méi)有想過(guò)這樣的問(wèn)題,Debug如何能讓CPU在執(zhí)行一條指令后,就顯示各個(gè)寄存器的狀態(tài)?我們知道,CPU在執(zhí)行程序的時(shí)候是從CS:IP指向的某個(gè)地址開(kāi)始,自動(dòng)向下讀取指令執(zhí)行。12.11 單步中斷也就是說(shuō),如果CPU不提供其他功能的話,就按這種方式工作,只要CPU一加電,它就從預(yù)設(shè)的地址開(kāi)始一直執(zhí)行下
29、去,不可能有任何程序能控制它在執(zhí)行完一條指令后停止,去做別的事情。12.11 單步中斷可是,我們?cè)贒ebug中看到的情況卻是,Debug可以控制CPU執(zhí)行被加載程序中的一條指令,然后讓它停下來(lái),顯示寄存器的狀態(tài)。Debug有特殊的能力嗎?12.11 單步中斷我們只能說(shuō)Debug利用了CPU提供的一種功能。只有CPU提供了在執(zhí)行一條指令后就轉(zhuǎn)去做其他事情的功能,Debug或是其他的程序才能利用CPU提供的這種功能做出我們使用T命令時(shí)的效果。12.11 單步中斷好了,我們來(lái)簡(jiǎn)要地考慮一下Debug是如何利用CPU所提供的單步中斷的功能的。首先,Debug提供了單步中斷的中斷處理程序,功能為顯示所有
30、寄存器中的內(nèi)容后等待輸入命令。12.11 單步中斷然后,在使用 T 命令執(zhí)行指令時(shí),Debug 將TF設(shè)置為 1,使得CPU在工作于單步中斷方式下,則在CPU執(zhí)行完這條指令后就引發(fā)單步中斷,執(zhí)行單步中斷的中斷處理程序,所有寄存器中的內(nèi)容被顯示在屏幕上,并且等待輸入命令。12.11 單步中斷那么,接下來(lái)的問(wèn)題是,當(dāng)TF=1時(shí),CPU在執(zhí)行完一條指令后將引發(fā)單步中斷,轉(zhuǎn)去執(zhí)行中斷處理程序。注意12.11 單步中斷注意:中斷處理程序也是由一條條指令組成的,如果在執(zhí)行中斷處理程序之前,TF=1,則CPU在執(zhí)行完中斷處理程序的第一條指令后,又要產(chǎn)生單步中斷,則又要轉(zhuǎn)去執(zhí)行單步中斷的中斷處理程序,在執(zhí)行完中斷處理程序的第一條指令后,又要產(chǎn)生單步中斷,則又要轉(zhuǎn)去執(zhí)行單步中斷的中斷處理程序 12.11 單步中斷看來(lái),上面的過(guò)程將陷入一個(gè)永遠(yuǎn)不能結(jié)束的循環(huán),CPU永遠(yuǎn)執(zhí)行單步中斷處理程序的第一條指令。12.11 單步中斷CPU當(dāng)然不能讓這種情況發(fā)生,解決的辦法就是,在進(jìn)入中斷處理程序之前,設(shè)置TF=0。 從而避免CPU在執(zhí)行中斷處理程序的時(shí)候
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國(guó)硫化艷綠行業(yè)市場(chǎng)現(xiàn)狀供需分析及重點(diǎn)企業(yè)投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030中國(guó)電纜放線器行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略研究報(bào)告
- 2025-2030中國(guó)電池測(cè)試儀行業(yè)發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 2025年米花糖項(xiàng)目可行性研究報(bào)告
- 2025年離型鋁膜項(xiàng)目可行性研究報(bào)告
- 2024秋七年級(jí)歷史上冊(cè)第一單元史前時(shí)期練習(xí)新人教版
- 手表行業(yè)競(jìng)爭(zhēng)格局-全面剖析
- 新材料在城市應(yīng)用研究-全面剖析
- 用戶體驗(yàn)在移動(dòng)應(yīng)用設(shè)計(jì)中的作用-全面剖析
- 物流標(biāo)準(zhǔn)化體系建設(shè)-全面剖析
- 甘肅省衛(wèi)生健康委公務(wù)員考試招聘112人往年題考
- 數(shù)字化賦能護(hù)理質(zhì)量管理研究進(jìn)展與價(jià)值共創(chuàng)視角
- 電網(wǎng)工程設(shè)備材料信息參考價(jià)(2024年第四季度)
- 電子產(chǎn)品生產(chǎn)工藝流程手冊(cè)
- DB15T 2403-2021肉羊育種數(shù)據(jù)管理規(guī)范
- 口腔種植專用病歷【范本模板】
- 《空中領(lǐng)航學(xué)》4.2 確定飛機(jī)位置
- 鄰二氮菲分光光度法測(cè)定微量鐵(精)
- 產(chǎn)業(yè)經(jīng)濟(jì)學(xué)完整版ppt全套教程課件(最新)
- GB-T 18348-2022 商品條碼 條碼符號(hào)印制質(zhì)量的檢驗(yàn)(高清版)
- 預(yù)防艾滋病、梅毒、乙肝母嬰傳播實(shí)驗(yàn)室檢測(cè)
評(píng)論
0/150
提交評(píng)論