《匯編語言》王爽(第二版)第13章-int指令_第1頁
《匯編語言》王爽(第二版)第13章-int指令_第2頁
《匯編語言》王爽(第二版)第13章-int指令_第3頁
《匯編語言》王爽(第二版)第13章-int指令_第4頁
《匯編語言》王爽(第二版)第13章-int指令_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

《匯編語言》課件

王爽著-清華大學(xué)出版社制作工具:MicrosoftPowerPoint2003本課件由匯編網(wǎng)()制作提供第13章int指令13.1int指令13.2編寫供應(yīng)用程序調(diào)用的中斷例程13.3對int、iret和棧的深入理解13.4BIOS和DOS所提供的中斷例程13.5BIOS和DOS中斷例程的安裝過程13.6BIOS中斷例程應(yīng)用13.7DOS中斷例程應(yīng)用引言中斷信息可以來自CPU的內(nèi)部和外部,當(dāng)CPU的內(nèi)部有需要處理的事情發(fā)生的時候,將產(chǎn)生需要馬上處理的中斷信息,引發(fā)中斷過程。引言在第12章中,我們講解了中斷過程和兩種內(nèi)中斷的處理。這一章中,我們講解另一種重要的內(nèi)中斷,由int指令引發(fā)的中斷。13.1int指令int格式:intn,n為中斷類型碼。它的功能是引發(fā)中斷過程。CPU執(zhí)行intn指令,相當(dāng)于引發(fā)一個n號中斷的中斷過程,執(zhí)行過程如下:(1)取中斷類型碼n;(2)標志寄存器入棧,IF=0,TF=0;(3)CS、IP入棧;(4)(IP)=(n*4),(CS)=(n*4+2)。從此處轉(zhuǎn)去執(zhí)行n號中斷的中斷處理程序。13.1int指令可以在程序中使用int指令調(diào)用任何一個中斷的中斷處理程序。比如,下面的程序:assumecs:codecodesegmentstart:movax,0b800hmoves,axmovbyteptres:[12*160+40*2],’!’int0codeendsendstart13.1int指令這個程序在Windows2000中的DOS方式下執(zhí)行時,將在屏幕中間顯示一個“!”,然后顯示“Divideoverflow”后返回到系統(tǒng)中?!?!”是我們編程顯示的,而,“Divideoverflow”是哪里來的呢?我們的程序中又沒有做除法,不可能產(chǎn)生除法溢出。13.1int指令程序是沒有做除法,但是在結(jié)尾使用了int0指令。CPU執(zhí)行int0指令時,將引發(fā)中斷過程,執(zhí)行0號中斷處理程序,而系統(tǒng)設(shè)置的0號中斷處理程序的功能是顯示“Divideoverflow”,然后返回到系統(tǒng)。13.1int指令可見,int指令的最終功能和call指令相似,都是調(diào)用一段程序。一般情況下,系統(tǒng)將一些具有一定功能的子程序,以中斷處理程序的方式提供給應(yīng)用程序調(diào)用。13.1int指令我們在編程的時候,可以用int指令調(diào)用這些子程序。當(dāng)然,也可以自己編寫一些中斷處理程序供別人使用。以后,我們可以將中斷處理程序簡稱為中斷例程。13.2編寫供應(yīng)用程序調(diào)用的中斷例程前面,我們已經(jīng)編寫過中斷0的中斷例程了,現(xiàn)在我們討論可以供應(yīng)用程序調(diào)用的中斷例程的編寫方法。我們通過兩個問題來討論:1、示例一2、示例二13.2編寫供應(yīng)用程序調(diào)用的中斷例程示例一編寫、安裝中斷7ch的中斷例程:功能:求一word型數(shù)據(jù)的平方。參數(shù):(ax)=要計算的數(shù)據(jù)。返回值:dx、ax中存放結(jié)果的高16位和低16位。應(yīng)用舉例:求2*3456^2程序及分析13.2編寫供應(yīng)用程序調(diào)用的中斷例程assumecs:codecodesegmentstart:movax,3456;(ax)=3456int7ch;調(diào)用中斷7ch的中斷例程,計算ax中的數(shù)據(jù)的平方

addax,ax;dx:ax存放結(jié)果,講結(jié)果乘以2movax,4c00hint21hcodeendsendstart

分析一下13.2編寫供應(yīng)用程序調(diào)用的中斷例程我們要做三部分工作:(1)編程實現(xiàn)求平方功能的程序;(2)安裝程序,我們將其安裝在0:200處;(3)設(shè)置中斷向量表,將程序的入口地址保存在7ch表項中,使其成為中斷7ch的中斷例程。安裝程序代碼13.2編寫供應(yīng)用程序調(diào)用的中斷例程注意,在中斷例程sqr的最后,要使用iret指令。用匯編語法描述,iret指令的功能為:

popIPpopCSpopf13.2編寫供應(yīng)用程序調(diào)用的中斷例程CPU執(zhí)行int7ch指令進入中斷例程之前,標志寄存器、當(dāng)前的CS和IP被壓入棧中,在執(zhí)行完中斷例程后,應(yīng)該用iret指令恢復(fù)int7ch執(zhí)行前的標志寄存器和CS、IP的值,從而接著執(zhí)行應(yīng)用程序。int指令和iret指令的配合使用與call指令和ret指令的配合使用具有相似的思路。13.2編寫供應(yīng)用程序調(diào)用的中斷例程示例二編寫、安裝中斷7ch的中斷例程:功能:將一個全是字母,以0結(jié)尾的字符串,轉(zhuǎn)化為大寫。參數(shù):ds:si指向字符串的首地址。應(yīng)用舉例:將data段中的字符轉(zhuǎn)化為大寫。13.2編寫供應(yīng)用程序調(diào)用的中斷例程應(yīng)用舉例:將data段中的字符轉(zhuǎn)化為大寫。

assumecs:codedatasegmentdb'conversation',0dataendscodesegmentstart:movax,datamovds,axmovsi,0int7ch movax,4c00h int21hcodeendsendstart13.2編寫供應(yīng)用程序調(diào)用的中斷例程安裝程序源碼在中斷例程capital中用到了寄存器si和cx,編寫中斷例程和編寫子程序的時候具有同樣的問題,就是要避免寄存器的沖突。應(yīng)該注意例程中用到的寄存器的值的保存和恢復(fù)。13.3對int、iret和棧的深入理解問題:用7ch中斷例程完成loop指令的功能。loops的執(zhí)行需要兩個信息,循環(huán)次數(shù)和到s的位移,所以,7ch中斷例程要完成loop指令的功能,也需要這兩個信息作為參數(shù)。我們用cx存放循環(huán)次數(shù),用bx存放位移。13.3對int、iret和棧的深入理解應(yīng)用舉例:在屏幕中間顯示80個‘!’。

assumecs:codecodesegmentstart:movax,0b800h moves,ax movdi,160*12 movbx,offsets-offsetse;設(shè)置從標號se到標號s的轉(zhuǎn)移位移

movcx,80s:movbyteptres:[di],'!' adddi,2 int7ch;如果(cx)≠0,轉(zhuǎn)移到標號s處

se:nop movax,4c00h int21hcodeendsendstart13.3對int、iret和棧的深入理解在上面的程序中,用int7ch調(diào)用7ch中斷例程進行轉(zhuǎn)移,用bx傳遞轉(zhuǎn)移的位移。分析:為了模擬loop指令,7ch中斷例程應(yīng)具備下面的功能:(1)deccx(2)如果(cx)≠0,轉(zhuǎn)到標號s處執(zhí)行,否則向下執(zhí)行。13.3對int、iret和棧的深入理解下面我們分析7ch中斷例程如何實現(xiàn)到目的地址的轉(zhuǎn)移:(1)轉(zhuǎn)到標號s顯然應(yīng)設(shè)(CS)=標號s的段地址,(IP)=標號s的偏移地址;(2)那么,中斷例程如何得到標號s的段地址和偏移地址呢?分析(3)現(xiàn)在知道,可以從棧中直接和間接地得到標號s的段地址和偏移地址,那么如何用它們設(shè)置CS:IP呢?分析13.3對int、iret和棧的深入理解int7ch引發(fā)中斷過程后,進入7ch中斷例程,在中斷過程中,當(dāng)前的標志寄存器、CS和IP都要壓棧,此時壓入的CS和IP中的內(nèi)容,分別是調(diào)用程序的段地址(可以認為是標號s的段地址)和int7ch后一條指令的偏移地址(即標號se的偏移地址)。13.3對int、iret和棧的深入理解可見,在中斷例程中,可以從棧里取得標號s的段地址和標號se的偏移地址,而用標號se的偏移地址加上bx中存放的轉(zhuǎn)移位移就可以得到標號s的偏移地址。13.3對int、iret和棧的深入理解可以利用iret指令,我們將棧中的se的偏移地址加上bx中的轉(zhuǎn)移位移,則棧中的se的偏移地址就變?yōu)榱藄的偏移地址。我們再使用iret指令,用棧中的內(nèi)容設(shè)置CS、IP,從而實現(xiàn)轉(zhuǎn)移到標號s處。13.3對int、iret和棧的深入理解7ch中斷例程如下:

lp:pushbpmovbp,sp deccx jcxzlpret add[bp+2],bxlpret:popbp iret13.3對int、iret和棧的深入理解因為要訪問棧,使用了bp,在程序開始處將bp入棧保存,結(jié)束時出?;謴?fù)。當(dāng)要修改棧中se的偏移地址的時候,棧中的情況為;棧頂處是bp原來的數(shù)值,下面是se的偏移地址,再下面是s的段地址,再下面是標志寄存器的值。13.3對int、iret和棧的深入理解而此時,bp中為棧頂?shù)钠频刂罚?(ss)*16+(bp)+2)處為se的偏移地址,將它加上bx中的轉(zhuǎn)移位移就變?yōu)閟的偏移地址。最后用iret出棧返回,CS:IP即從標號s處開始執(zhí)行指令。如果(cx)=0,則不需要修改棧中se的偏移地址,直接返回即可。CPU從標號se處向下執(zhí)行指令。特別提示 檢測點13.1(page246)沒有通過此檢測點,請不要向下進行!13.5BIOS和DOS中斷例程的安裝過程而BIOS和DOS提供的中斷例程是如何安裝到內(nèi)存中的呢?我們下面講解它們的安裝過程。13.5BIOS和DOS中斷例程的安裝過程(1)開機后,CPU一加電,初始化(CS)=0FFFFH,(IP)=0,自動從FFFF:0單元開始執(zhí)行程序。FFFF:0處有一條轉(zhuǎn)跳指令,CPU執(zhí)行該指令后,轉(zhuǎn)去執(zhí)行BIOS中的硬件系統(tǒng)檢測和初始化程序。13.5BIOS和DOS中斷例程的安裝過程(2)初始化程序?qū)⒔IOS所支持的中斷向量,即將BIOS提供的中斷例程的入口地址登記在中斷向量表中。13.5BIOS和DOS中斷例程的安裝過程(3)硬件系統(tǒng)檢測和初始化完成后,調(diào)用int19h進行操作系統(tǒng)的引導(dǎo)。從此將計算機交由操作系統(tǒng)控制。13.5BIOS和DOS中斷例程的安裝過程(4)DOS啟動后,除完成其它工作外,還將它所提供的中斷例程裝入內(nèi)存,并建立相應(yīng)的中斷向量。特別提示 檢測點13.2(page248獨立思考后可共同討論)沒有通過此檢測點,請不要向下進行!13.6BIOS中斷例程應(yīng)用下面我們舉幾個例子,來看一下BIOS中斷例程的應(yīng)用。int10h中斷例程是BIOS提供的中斷例程,其中包含了多個和屏幕輸出相關(guān)的子程序。13.6BIOS中斷例程應(yīng)用一般來說,一個供程序員調(diào)用的中斷例程中往往包括多個子程序,中斷例程內(nèi)部用傳遞進來的參數(shù)來決定執(zhí)行哪個子程序。BIOS和DOS提供的中斷例程,都用ah來傳遞內(nèi)部子程序的編號。

13.6BIOS中斷例程應(yīng)用我們看一下int10h中斷例程的設(shè)置光標位置功能。

movah,2movbh,0movdh,5movdl,12int10h13.6BIOS中斷例程應(yīng)用(ah)=2表示調(diào)用第10h號中斷例程的2號子程序,功能為設(shè)置光標位置,可以提供光標所在的行號(80*25字符模式下:0~24)、列號(80*25字符模式下:0~79),和頁號作為參數(shù)。(bh)=0,(dh)=5,(dl)=12,設(shè)置光標到第0頁,第5行,第12列。13.6BIOS中斷例程應(yīng)用bh中頁號的含義:內(nèi)存地址空間中,B8000h~BFFFFh共32K的空間,為80*25彩色字符模式的顯示緩沖區(qū)。一屏的內(nèi)容在顯示緩沖區(qū)中共占4000個字節(jié)。13.6BIOS中斷例程應(yīng)用顯示緩沖區(qū)分為8頁,每頁4K(≈4000),顯示器可以顯示任意一頁的內(nèi)容。一般情況下,顯示第0頁的內(nèi)容。也就是說,通常情況下,B8000~B8F9F中的4000個字節(jié)的內(nèi)容將出現(xiàn)在顯示器上。13.6BIOS中斷例程應(yīng)用再看一下int10h中斷例程的在光標位置顯示字符功能。

movah,9 ;置光標

moval,’a’ ;字符

movbl,7 ;顏色屬性

movbh,0 ;第0頁

movcx,3 ;字符重復(fù)個數(shù)

int10h13.6BIOS中斷例程應(yīng)用(ah)=9表示調(diào)用第10h號中斷例程的9號子程序;功能為在光標位置顯示字符,可以提供要顯示的字符、顏色屬性、頁號、字符重復(fù)個數(shù)作為參數(shù)。13.6BIOS中斷例程應(yīng)用(bh)中的顏色屬性格式如下:可以看出,和顯存中的屬性字節(jié)的格式相同。13.6BIOS中斷例程應(yīng)用編程:在屏幕的5行12列顯示3個紅底高亮閃爍綠色的‘a(chǎn)’。程序源碼注意:閃爍的效果必須在全屏DOS方式下才能看到。13.7DOS中斷例程應(yīng)用int21h中斷例程是DOS提供的中斷例程,其中包含了DOS提供給程序員在編程時調(diào)用的子程序。我們從前一直使用的是int21中斷例程的4ch號功能,即程序返回功能,如下:

movah,4ch;程序

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論