int指令01 - 零基础入门学习汇编语言64
生活随笔
收集整理的這篇文章主要介紹了
int指令01 - 零基础入门学习汇编语言64
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
第十三章:int指令01
?讓編程改變世界
Change the world by program
?
引言
? 在第12章中,我們講解了中斷過程和兩種內中斷的處理。 這一章中,我們講解另一種重要的內中斷,由int指令引發(fā)的中斷。 ? 萬眾矚目,是什么呢?那就是DOS時代大名鼎鼎的int中斷。 int格式: int n,n為中斷類型碼。它的功能是引發(fā)中斷過程。 ?int指令
?CPU 執(zhí)行int n指令,相當于引發(fā)一個 n號中斷的中斷過程,執(zhí)行過程如下:
(1)取中斷類型碼n (2)標志寄存器入棧,IF = 0,TF = 0 (3)CS、IP入棧 (4)(IP) = (n*4),(CS) = (n*4+2) ? 從此處轉去執(zhí)行n號中斷的中斷處理程序。 可以在程序中使用int指令調用任何一個中斷的中斷處理程序。 ? 比如我們看下這個程序段:相關代碼下載 ? 程序是沒有做除法,但是在結尾使用了int 0指令。 CPU執(zhí)行int 0指令時,將引發(fā)中斷過程,執(zhí)行0號中斷處理程序,而系統(tǒng)設置的 0號中斷處理程序的功能是顯示“Divide overflow”,然后返回到系統(tǒng)。 ? 可見,int 指令的最終功能和call指令相似,都是調用一段程序。 因此,一般情況下,系統(tǒng)將一些具有一定功能的子程序,以中斷處理程序的方式提供給應用程序調用。 我們在編程的時候,可以用int指令調用這些子程序。當然,也可以自己編寫一些中斷處理程序供別人使用。 以后,我們可以將中斷處理程序簡稱為中斷例程。 ?編寫供應用程序調用的中斷例程
前面,我們已經(jīng)編寫過中斷0 的中斷例程了,現(xiàn)在我們討論可以供應用程序調用的中斷例程的編寫方法。 ? 我們通過兩個實例來討論: 實例一 編寫、安裝中斷7ch的中斷例程,實現(xiàn)求一word型數(shù)據(jù)的平方。 實例二 編寫、安裝中斷7ch的中斷例程,實現(xiàn)將一個全是字母,以 0結尾的字符串,轉化為大寫。 ?實例一: 編寫、安裝中斷7ch的中斷例程
? 功能:求一word型數(shù)據(jù)的平方。 參數(shù): (ax)=要計算的數(shù)據(jù)。 返回值:dx、ax中存放結果的高16位和低16位。 應用舉例:求2*3456^2 [codesyntax lang="asm"] assume cs:codecode segment start: mov ax,3456;(ax)=3456int 7ch ; 調用中斷7ch的中斷例程,計算ax中的數(shù)據(jù)的平方add ax,ax adc dx,dx ; 存放結果,講結果乘以2mov ax,4c00hint 21h code endsend start [/codesyntax] ? ?我們要做三部分工作:
(1)編程實現(xiàn)求平方功能的程序; (2)安裝程序,我們將其安裝在0:200處; (3)設置中斷向量表,將程序的入口地址保存在7ch表項中,使其成為中斷7ch的中斷例程。 ? 我們來實現(xiàn)安裝程序:相關代碼下載 ? 注意,在中斷例程 sqr的最后,要使用iret指令。 用匯編語法描述,iret指令的功能為:pop IP
pop CS
popf
? CPU執(zhí)行int 7ch指令進入中斷例程之前,標志寄存器、當前的CS和IP被壓入棧中,在執(zhí)行完中斷例程后,應該用iret指令恢復int 7ch 執(zhí)行前的標志寄存器和CS、IP的值,從而接著執(zhí)行應用程序。 int指令和iret指令的配合使用與call指令和ret指令的配合使用具有相似的思路。 ?實例二: 編寫、安裝中斷7ch的中斷例程
? 功能:將一個全是字母,以 0結尾的字符串,轉化為大寫。 參數(shù):ds:si指向字符串的首地址。 應用舉例:將data段中的字符轉化為大寫。 [codesyntax lang="asm"] assume cs:codedata segmentdb 'conversation',0 data endscode segment start: mov ax,datamov ds,axmov si,0int 7chmov ax,4c00hint 21h code endsend start [/codesyntax] ? 安裝程序:相關代碼下載 ? 最后,在中斷例程capital中用到了寄存器 si和cx,編寫中斷例程和編寫子程序的時候具有同樣的問題,就是要避免寄存器的沖突。 應該注意例程中用到的寄存器的值的保存和恢復。 [buy]?獲得所有教學視頻、課件、源代碼等資源打包?[/buy] [Downlink href='http://kuai.xunlei.com/d/LZBJKQLZQVES']視頻下載[/Downlink]轉載于:https://www.cnblogs.com/LoveFishC/archive/2011/04/28/3847063.html
總結
以上是生活随笔為你收集整理的int指令01 - 零基础入门学习汇编语言64的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sprintf_s与_snprintf与
- 下一篇: KL距离(衡量两个概率分布的差异情况)