日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言随笔(11)- int 指令(返回到应用程序的中断例程),实验13(编写、应用中断例程)

發(fā)布時(shí)間:2025/6/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言随笔(11)- int 指令(返回到应用程序的中断例程),实验13(编写、应用中断例程) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ù)。如下:

mov ah,4ch ;4c作為參數(shù)進(jìn)行程序返回功能mov al,0 ;0作為返回值int 21h

??????也可以像我們經(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指向字符串首地址。
??????程序舉例如下:

assume cs:codedata segmentdb "welcome to masm!",0data endscode segmentstart: mov dh,10mov dl,10mov cl,2mov ax,data mov ds,axmov si,0int 7chmov ax,4c00hint 21hcode endsend start

??????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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。