汇编语言随笔(11)- int 指令(返回到应用程序的中断例程),实验13(编写、应用中断例程)
int 指令
??????int 指令的格式為:int n,n為中斷類型碼。這里由 n 顯式的給出了調(diào)用哪一個中斷處理程序。
??????CPU 的中斷過程仍然是:
(1)取中斷類型碼n
(2)標志寄存器入棧,IF=0,TF=0
(3)CS、IP入棧
(4)(IP)=(nx4),(CS)=(nx4+2)
??????比如:當除法溢出時產(chǎn)生的0號中斷,會在屏幕上顯示“Divide overflow”。我們也可以通過 int 0 指令來讓屏幕上顯示“Divide overflow”,雖然此時并沒有發(fā)生除法溢出。
?????? 當編寫返回到應用程序的中斷處理程序時,它與返回到dos系統(tǒng)的中斷例程差別在于,它使用了iret指令來返回到應用程序,后者是通過 mov ax 4c00h ?????? int 21h來返回的。
??????iret指令的功能為IP 出棧,CS 出棧,標志寄存器出棧。它常和 int 指令來配合使用 ,就像 call 和 ret 指令一樣。
??????編寫程序?qū)崿F(xiàn):在屏幕中間顯示80個 '!’。要求用 int 指令來代替 loop 指令,其中需要將循環(huán)次數(shù)和指令轉(zhuǎn)移位移做為參數(shù)。將循環(huán)次數(shù)放在 cx 中,位移放在 bx 中,完整程序如下:
assume cs:codecode segmentstart: mov ax,0b800hmov es,axmov di,160*12mov bx,offset s-offset se ;設(shè)置標號s到se的轉(zhuǎn)移位移mov cx,80 ;循環(huán)次數(shù)s: mov byte ptr es:[di],'!'add di,2int 7chse: nopmov ax,4c00hint 21hcode endsend start??????7ch 中斷例程如下:
lp: push bpmov bp,spdec cx jcxz lpend ;判斷cx是否為0add [bp+2],bx ;用轉(zhuǎn)移位移bx更改IP的值lpend: pop bpiret??????采用 bp 來作為臨時寄存器,需要對它進行入棧保存,結(jié)束時恢復。當要用 bx 來修改原來的應用程序偏移地址 IP 時,棧中的情況為:sp 指向 bp 的值,sp+2 指向原來的 IP,sp+4 指向原來的 CS,sp+6 指向原來的標志寄存器。原來程序的段地址 CS 和標號 s 的段地址 CS 是相同,故只需要改變原 IP 的值即可,通過 add [bp+2],bx 來改變。
??????loop 指令是8位短轉(zhuǎn)移指令,用來替代它的 int 指令是16位的近轉(zhuǎn)移指令,這是需要注意的。
DOS和BIOS中斷例程
??????一般來說,一個供程序員調(diào)用的中斷例程往往包括多個子程序,中斷例程內(nèi)用傳遞進來的參數(shù)來決定執(zhí)行哪一個子程序。BIOS和DOS中的參數(shù)往往采用 ah 來傳遞。
??????int 10h 是BIOS提供的中斷例程,其中包含多個和屏幕輸出相關(guān)的子程序。
??????int 21h 是DOS提供的中斷例程。我們一直使用的是 int 21h 中斷例程的 4ch 號子程序,功能為程序返回,可以提供返回值作為參數(shù)。如下:
??????也可以像我們經(jīng)常使用的那樣:
mov ax,4c00hint 21實驗13
??????(1)編寫安裝 int 7ch 中斷例程,功能為顯示一個用0結(jié)束的字符串,中斷例程安裝在 0:200 處。
??????參數(shù):(dh)=行號,(dl)=列號,(cl)=顏色,ds:si指向字符串首地址。
??????程序舉例如下:
??????7ch 中斷例程安裝如下:
assume cs:codecode segmentmov ax,cs ;中斷處理程序安裝在0:200處mov ds,csmov si,offset smov ax,0mov es,axmov di,200hmov cx,offset send-offset scldrep movsbmov ax,0 ;設(shè)置中斷向量表mov ds,axmov word ptr ds:[7c*4],200hmov word ptr ds:[7c*4+2],0mov ax,4c00hint 21hs: push si ;中斷處理程序的實現(xiàn)push espush dimov ax,0b800hmov es,axmov di,160*dh+2*dllp: mov al,[si]cmp al,0je okmov es:[di],almov es:[di+1],cladd di,2inc sijmp short lpok: pop dipop espop siiretsend: nop ;這條指令是不會執(zhí)行的,因為它沒有被傳送過去code endsend start??????(2)略。
??????(3)下面程序在屏幕的2,4,6,8行顯示4句英文詩,補全程序如下:
assume cs:codecode segments1: db'Good,better,best,','$'s2: db'Never let it rest,','$'s3: db'Till good is better,','$'s4: db'And better,best.','$'s: dw offset s1,offset s2,offset s3,offset s4row: db 2,4,6,8start: mov ax,csmov ds,axmov bx,offset smov si,offset rowmov cx,4ok: mov bh,0 ;選擇顯示緩沖區(qū)第0頁mov dh,[si] ;dh中保存行號mov dl,0 ;dl中保存列號mov ah,2 ;調(diào)用int 10h的2號子程序:置光標int 10hmov dx,[bx] ;ds:dx為待顯示字符串的首地址,以'$'作為結(jié)尾符mov ah,9 ;調(diào)用int 21h的9號子程序:顯示字符串int 21hadd bx,2inc siloop okmov ax 4c00h ;調(diào)用int 21h的4c號子程序:程序返回,返回值為0int 21hcode endsend start總結(jié)
以上是生活随笔為你收集整理的汇编语言随笔(11)- int 指令(返回到应用程序的中断例程),实验13(编写、应用中断例程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言随笔(10)-内中断及实验12(
- 下一篇: 汇编语言随笔(13)- 外中断(可屏蔽中