




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、匯編語言(第二版)第13章int指令匯編語言王爽(第二版)第13章-int指令第13章 int指令n13.1 int指令n13.2 編寫供應用程序調用的中斷例程n13.3 對int、iret和棧的深入理解n13.4 BIOS和DOS所提供的中斷例程n13.5 BIOS和DOS中斷例程的安裝過程n13.6 BIOS中斷例程應用n13.7 DOS中斷例程應用引言n中斷信息可以來自 CPU 的內部和外部,當CPU 的內部有需要處理的事情發生的時候,將產生需要馬上處理的中斷信息,引發中斷過程。引言n在第12章中,我們講解了中斷過程和兩種內中斷的處理。n這一章中,我們講解另一種重要的內中斷,由int指令
2、引發的中斷。13.1 int指令nint格式: int n,n為中斷類型碼。它的功能是引發中斷過程。nCPU 執行int n指令,相當于引發一個 n號中斷的中斷過程,執行過程如下:n(1)取中斷類型碼n;n(2)標志寄存器入棧,IF = 0,TF = 0;n(3)CS、IP入棧;n(4)(IP) = (n*4),(CS) = (n*4+2)。n從此處轉去執行n號中斷的中斷處理程序。13.1 int指令n可以在程序中使用int指令調用任何一個中斷的中斷處理程序。n比如,下面的程序: assume cs:code code segment start: mov ax,0b800h mov es,a
3、x mov byte ptr es:12*160+40*2, int 0 code ends end start13.1 int指令n這個程序在 Windows 202X中的 DOS方式下執行時,將在屏幕中間顯示一個“!”,然后顯示“Divide overflow”后返回到系統中。n“!”是我們編程顯示的,而,“Divide overflow”是哪里來的呢?n 我們的程序中又沒有做除法,不可能產生除法溢出。13.1 int指令n程序是沒有做除法,但是在結尾使用了int 0指令。nCPU執行int 0指令時,將引發中斷過程,執行 0號中斷處理程序,而系統設置的 0號中斷處理程序的功能是顯示“Di
4、vide overflow”,然后返回到系統。13.1 int指令n可見,int 指令的最終功能和call指令相似,都是調用一段程序。n一般情況下,系統將一些具有一定功能的子程序,以中斷處理程序的方式提供給應用程序調用。13.1 int指令n我們在編程的時候,可以用int指令調用這些子程序。n當然,也可以自己編寫一些中斷處理程序供別人使用。n以后,我們可以將中斷處理程序簡稱為中斷例程。 13.2 編寫供應用程序調用的中斷例程n前面,我們已經編寫過中斷0 的中斷例程了,現在我們討論可以供應用程序調用的中斷例程的編寫方法。n我們通過兩個問題來討論:n1、示例一n2、示例二13.2 編寫供應用程序調
5、用的中斷例程n示例一 編寫、安裝中斷7ch的中斷例程:n功能:求一word型數據的平方。n參數: (ax)=要計算的數據。n返回值:dx、ax中存放結果的高16位和低16位。n應用舉例:求2*34562n程序及分析13.2 編寫供應用程序調用的中斷例程 assume cs:code code segment start: mov ax,3456;(ax)=3456 int 7ch;調用中斷7ch的中斷例程,計算ax中的數據的平方 add ax,ax;dx:ax存放結果,講結果乘以2 mov ax,4c00h int 21h code ends end start n分析一下13.2 編寫供應用
6、程序調用的中斷例程n我們要做三部分工作:n(1)編程實現求平方功能的程序;n(2)安裝程序,我們將其安裝在0:200處;n(3)設置中斷向量表,將程序的入口地址保存在7ch表項中,使其成為中斷7ch的中斷例程。n安裝程序代碼13.2 編寫供應用程序調用的中斷例程n注意,在中斷例程 sqr的最后,要使用iret指令。n用匯編語法描述,iret指令的功能為: pop IP pop CS popf13.2 編寫供應用程序調用的中斷例程nCPU執行int 7ch指令進入中斷例程之前,標志寄存器、當前的CS和IP被壓入棧中,在執行完中斷例程后,應該用iret指令恢復int 7ch 執行前的標志寄存器和C
7、S、IP的值,從而接著執行應用程序。nint指令和 iret指令的配合使用與call指令和ret指令的配合使用具有相似的思路。13.2 編寫供應用程序調用的中斷例程n示例二 編寫、安裝中斷7ch的中斷例程:n功能:將一個全是字母,以 0結尾的字符串,轉化為大寫。n參數:ds:si指向字符串的首地址。n應用舉例: 將data段中的字符轉化為大寫。13.2 編寫供應用程序調用的中斷例程n應用舉例:將data段中的字符轉化為大寫。 assume cs:code data segment db conversation,0 data ends code segment start: mov ax,da
8、ta mov ds,ax mov si,0 int 7ch mov ax,4c00h int 21h code ends end start13.2 編寫供應用程序調用的中斷例程n安裝程序源碼n在中斷例程capital中用到了寄存器 si和cx,編寫中斷例程和編寫子程序的時候具有同樣的問題,就是要避免寄存器的沖突。n應該注意例程中用到的寄存器的值的保存和恢復。13.3 對int、iret和棧的深入理解n問題:用7ch中斷例程完成 loop指令的功能。nloop s 的執行需要兩個信息,循環次數和到s的位移,所以,7ch中斷例程要完成loop指令的功能,也需要這兩個信息作為參數。n我們用cx存放
9、循環次數,用bx存放位移。13.3 對int、iret和棧的深入理解n應用舉例:在屏幕中間顯示80個!。 assume cs:code code segment start: mov ax,0b800h mov es,ax mov di,160*12 mov bx,offset s - offset se;設置從標號se到標號s的轉移位移 mov cx,80 s: mov byte ptr es:di,! add di,2 int 7ch ;如果(cx)0,轉移到標號s處 se: nop mov ax,4c00h int 21h code ends end start13.3 對int、ire
10、t和棧的深入理解n在上面的程序中,用int 7ch調用7ch中斷例程進行轉移,用 bx 傳遞轉移的位移。n分析:為了模擬loop指令,7ch中斷例程應具備下面的功能:n(1)dec cxn(2)如果(cx)0,轉到標號s 處執行,否則向下執行。 13.3 對int、iret和棧的深入理解n下面我們分析7ch中斷例程如何實現到目的地址的轉移:n(1)轉到標號s顯然應設(CS)=標號s的段地址,(IP)=標號s的偏移地址;n(2)那么,中斷例程如何得到標號s的段地址和偏移地址呢? 分析n(3)現在知道,可以從棧中直接和間接地得到標號s的段地址和偏移地址,那么如何用它們設置CS:IP呢? 分析13.
11、3 對int、iret和棧的深入理解nint 7ch引發中斷過程后,進入 7ch中斷例程,在中斷過程中,當前的標志寄存器、CS和IP都要壓棧,此時壓入的CS和IP中的內容,分別是調用程序的段地址(可以認為是標號 s 的段地址)和int 7ch后一條指令的偏移地址(即標號se的偏移地址)。13.3 對int、iret和棧的深入理解n可見,在中斷例程中,可以從棧里取得標號s 的段地址和標號 se的偏移地址,而用標號se的偏移地址加上bx中存放的轉移位移就可以得到標號s的偏移地址。 13.3 對int、iret和棧的深入理解n可以利用iret指令,我們將棧中的se的偏移地址加上 bx 中的轉移位移,
12、則棧中的se的偏移地址就變為了s的偏移地址。n我們再使用iret指令,用棧中的內容設置CS、IP,從而實現轉移到標號s處。13.3 對int、iret和棧的深入理解n7ch中斷例程如下: lp: push bp mov bp,sp dec cx jcxz lpret add bp+2,bx lpret: pop bp iret13.3 對int、iret和棧的深入理解n因為要訪問棧,使用了 bp,在程序開始處將bp 入棧保存,結束時出?;謴汀當要修改棧中se的偏移地址的時候,棧中的情況為;n棧頂處是bp 原來的數值,下面是se的偏移地址,再下面是s的段地址,再下面是標志寄存器的值。13.3
13、對int、iret和棧的深入理解n而此時,bp中為棧頂的偏移地址,所以(ss)*16+(bp)+2)處為se 的偏移地址,將它加上bx 中的轉移位移就變為s的偏移地址。最后用iret出棧返回,CS:IP即從標號s處開始執行指令。n如果(cx)=0,則不需要修改棧中 se的偏移地址,直接返回即可。nCPU從標號se處向下執行指令。特別提示n檢測點(page246)n沒有通過此檢測點,請不要向下進行!13.5 BIOS和DOS中斷例程的安裝過程n而BIOS和DOS提供的中斷例程是如何安裝到內存中的呢?n我們下面講解它們的安裝過程。13.5 BIOS和DOS中斷例程的安裝過程n(1) 開機后,CPU
14、 一加電,初始化(CS)=0FFFFH,(IP)=0,自動從FFFF:0單元開始執行程序。FFFF:0處有一條轉跳指令,CPU執行該指令后,轉去執行BIOS中的硬件系統檢測和初始化程序。13.5 BIOS和DOS中斷例程的安裝過程n(2)初始化程序將建立BIOS 所支持的中斷向量,即將BIOS提供的中斷例程的入口地址登記在中斷向量表中。13.5 BIOS和DOS中斷例程的安裝過程n(3) 硬件系統檢測和初始化完成后,調用int 19h進行操作系統的引導。從此將計算機交由操作系統控制。13.5 BIOS和DOS中斷例程的安裝過程n(4)DOS 啟動后,除完成其它工作外,還將它所提供的中斷例程裝入
15、內存,并建立相應的中斷向量。特別提示n檢測點(page248 獨立思考后可共同討論)n沒有通過此檢測點,請不要向下進行!13.6 BIOS中斷例程應用n下面我們舉幾個例子,來看一下BIOS中斷例程的應用。nint 10h中斷例程是BIOS提供的中斷例程,其中包含了多個和屏幕輸出相關的子程序。13.6 BIOS中斷例程應用n一般來說,一個供程序員調用的中斷例程中往往包括多個子程序,中斷例程內部用傳遞進來的參數來決定執行哪個子程序。nBIOS 和DOS 提供的中斷例程,都用ah來傳遞內部子程序的編號。13.6 BIOS中斷例程應用n我們看一下int 10h中斷例程的設置光標位置功能。 mov ah
16、,2 mov bh,0 mov dh,5 mov dl,12 int 10h13.6 BIOS中斷例程應用n(ah)=2表示調用第 10h號中斷例程的 2號子程序,功能為設置光標位置,可以提供光標所在的行號(80*25字符模式下:024)、列號(80*25字符模式下:079),和頁號作為參數。n(bh)=0,(dh)=5,(dl)=12,設置光標到第0頁,第5行,第12列。13.6 BIOS中斷例程應用nbh中頁號的含義:內存地址空間中,B8000hBFFFFh共 32K的空間,為80*25 彩色字符模式的顯示緩沖區。n一屏的內容在顯示緩沖區中共占4000個字節。13.6 BIOS中斷例程應用
17、n顯示緩沖區分為8頁,每頁4K(4000),顯示器可以顯示任意一頁的內容。一般情況下,顯示第 0 頁的內容。n也就是說,通常情況下,B8000B8F9F中的4000個字節的內容將出現在顯示器上。13.6 BIOS中斷例程應用n再看一下int 10h中斷例程的在光標位置顯示字符功能。 mov ah,9;置光標 mov al,a;字符 mov bl,7;顏色屬性 mov bh,0;第0頁 mov cx,3;字符重復個數 int 10h13.6 BIOS中斷例程應用n(ah)=9 表示調用第10h號中斷例程的9號子程序;n功能為在光標位置顯示字符,可以提供要顯示的字符、顏色屬性、頁號、字符重復個數作
18、為參數。13.6 BIOS中斷例程應用n(bh)中的顏色屬性格式如下:n可以看出,和顯存中的屬性字節的格式相同。13.6 BIOS中斷例程應用n編程:在屏幕的5行12列顯示3個紅底高亮閃爍綠色的a。n程序源碼n注意:閃爍的效果必須在全屏DOS 方式下才能看到。13.7 DOS中斷例程應用nint 21h 中斷例程是DOS提供的中斷例程,其中包含了DOS提供給程序員在編程時調用的子程序。n我們從前一直使用的是 int 21中斷例程的4ch號功能,即程序返回功能,如下: mov ah,4ch ;程序返回 mov al,0 ;返回值 int 21h13.7 DOS中斷例程應用n(ah)=4ch表示調用第21h號中斷例程的 4ch號子程序,功能為程序返回,可以提供返回值作為參數。n我們前面使用這個功能的時候經常寫作: mov ax,4c00h int 21h13.7 DOS中斷例程應用n我們看一下int 21h中斷例程的在光標位置顯示字符串的功能: ds:dx指向字符串 ;要顯示的字符串需用“$”作為結束符 mov a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國木工加工機械市場調查研究報告
- 2025-2030年中國中頻電源行業市場現狀分析規劃研究報告
- 2025年中國日本式電纜線接頭市場調查研究報告
- 2025年中國新型指針萬用表數據監測報告
- 2025年中國數字氣象儀數據監測報告
- 2025至2031年中國綜合保護裝置行業投資前景及策略咨詢研究報告
- 2025至2031年中國緊湊型鏑燈行業投資前景及策略咨詢研究報告
- 肇慶市實驗中學高中歷史三:第課宋明理學高效課堂教學設計
- 2025-2030年中國GPS車輛監控調度系統市場發展趨勢與投資戰略決策報告
- 2025年中國硝基清面漆數據監測研究報告
- 《塑料材質食品相關產品質量安全風險管控清單》
- 中國手術部位感染預防指南
- 人教版中職數學拓展模塊一:6.1.1復數的相關概念課件
- 街道辦消防安全知識培訓課件
- 2024-2025學年數學人教版八年級上冊期中檢測卷
- 教育培訓機構運營流程手冊
- 人力資源許可證制度(服務流程、服務協議、收費標準、信息發布審查和投訴處理)
- 山東鐵投集團社會招聘筆試真題2023
- 2024小學語文新教材培訓講稿:一年級新教材修訂概況及教材介紹
- 2024年江西省高考生物試卷(含答案)
- JJF(民航) 0114-2024 民用航空自動氣象觀測系統氣壓傳感器校準規范
評論
0/150
提交評論