汇编语言随笔(11)- int 指令(返回到应用程序的中断例程),实验13(编写、应用中断例程)
int 指令
??????int 指令的格式為:int n,n為中斷類(lèi)型碼。這里由 n 顯式的給出了調(diào)用哪一個(gè)中斷處理程序。
??????CPU 的中斷過(guò)程仍然是:
(1)取中斷類(lèi)型碼n
(2)標(biāo)志寄存器入棧,IF=0,TF=0
(3)CS、IP入棧
(4)(IP)=(nx4),(CS)=(nx4+2)
??????比如:當(dāng)除法溢出時(shí)產(chǎn)生的0號(hào)中斷,會(huì)在屏幕上顯示“Divide overflow”。我們也可以通過(guò) int 0 指令來(lái)讓屏幕上顯示“Divide overflow”,雖然此時(shí)并沒(méi)有發(fā)生除法溢出。
?????? 當(dāng)編寫(xiě)返回到應(yīng)用程序的中斷處理程序時(shí),它與返回到dos系統(tǒng)的中斷例程差別在于,它使用了iret指令來(lái)返回到應(yīng)用程序,后者是通過(guò) mov ax 4c00h ?????? int 21h來(lái)返回的。
??????iret指令的功能為IP 出棧,CS 出棧,標(biāo)志寄存器出棧。它常和 int 指令來(lái)配合使用 ,就像 call 和 ret 指令一樣。
??????編寫(xiě)程序?qū)崿F(xiàn):在屏幕中間顯示80個(gè) '!’。要求用 int 指令來(lái)代替 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è)置標(biāo)號(hào)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 來(lái)作為臨時(shí)寄存器,需要對(duì)它進(jìn)行入棧保存,結(jié)束時(shí)恢復(fù)。當(dāng)要用 bx 來(lái)修改原來(lái)的應(yīng)用程序偏移地址 IP 時(shí),棧中的情況為:sp 指向 bp 的值,sp+2 指向原來(lái)的 IP,sp+4 指向原來(lái)的 CS,sp+6 指向原來(lái)的標(biāo)志寄存器。原來(lái)程序的段地址 CS 和標(biāo)號(hào) s 的段地址 CS 是相同,故只需要改變?cè)?IP 的值即可,通過(guò) add [bp+2],bx 來(lái)改變。
??????loop 指令是8位短轉(zhuǎn)移指令,用來(lái)替代它的 int 指令是16位的近轉(zhuǎn)移指令,這是需要注意的。
DOS和BIOS中斷例程
??????一般來(lái)說(shuō),一個(gè)供程序員調(diào)用的中斷例程往往包括多個(gè)子程序,中斷例程內(nèi)用傳遞進(jìn)來(lái)的參數(shù)來(lái)決定執(zhí)行哪一個(gè)子程序。BIOS和DOS中的參數(shù)往往采用 ah 來(lái)傳遞。
??????int 10h 是BIOS提供的中斷例程,其中包含多個(gè)和屏幕輸出相關(guān)的子程序。
??????int 21h 是DOS提供的中斷例程。我們一直使用的是 int 21h 中斷例程的 4ch 號(hào)子程序,功能為程序返回,可以提供返回值作為參數(shù)。如下:
??????也可以像我們經(jīng)常使用的那樣:
mov ax,4c00hint 21實(shí)驗(yàn)13
??????(1)編寫(xiě)安裝 int 7ch 中斷例程,功能為顯示一個(gè)用0結(jié)束的字符串,中斷例程安裝在 0:200 處。
??????參數(shù):(dh)=行號(hào),(dl)=列號(hào),(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 ;中斷處理程序的實(shí)現(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 ;這條指令是不會(huì)執(zhí)行的,因?yàn)樗鼪](méi)有被傳送過(guò)去code endsend start??????(2)略。
??????(3)下面程序在屏幕的2,4,6,8行顯示4句英文詩(shī),補(bǔ)全程序如下:
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頁(yè)mov dh,[si] ;dh中保存行號(hào)mov dl,0 ;dl中保存列號(hào)mov ah,2 ;調(diào)用int 10h的2號(hào)子程序:置光標(biāo)int 10hmov dx,[bx] ;ds:dx為待顯示字符串的首地址,以'$'作為結(jié)尾符mov ah,9 ;調(diào)用int 21h的9號(hào)子程序:顯示字符串int 21hadd bx,2inc siloop okmov ax 4c00h ;調(diào)用int 21h的4c號(hào)子程序:程序返回,返回值為0int 21hcode endsend start總結(jié)
以上是生活随笔為你收集整理的汇编语言随笔(11)- int 指令(返回到应用程序的中断例程),实验13(编写、应用中断例程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 汇编语言随笔(10)-内中断及实验12(
- 下一篇: 汇编语言随笔(13)- 外中断(可屏蔽中