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

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

生活随笔

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

编程问答

外中断02 - 零基础入门学习汇编语言70

發(fā)布時(shí)間:2023/12/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 外中断02 - 零基础入门学习汇编语言70 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第十五章:外中斷02

?

讓編程改變世界

Change the world by program


?

小甲魚(yú)和大家談?wù)勑?/h2> ? 一個(gè)帖子引發(fā)小甲魚(yú)的反省! 貓姐曾經(jīng)說(shuō)過(guò),步子別邁太大,容易扯著蛋! 結(jié)果還真蛋疼了…… ? 因此,小甲魚(yú)要學(xué)會(huì)淡定面對(duì),不能忘記當(dāng)初的宗旨!做視頻也好、做網(wǎng)站也好,對(duì)得住大家才對(duì)得住自己的良心! 最后:希望大家繼續(xù)支持魚(yú)C、支持小甲魚(yú),看到大家都能坦誠(chéng)相待,很開(kāi)心,很幸福! ?

編寫(xiě)int 9 中斷例程

?

復(fù)習(xí)一下前邊的內(nèi)容中,我們可以總結(jié)出鍵盤(pán)輸入的處理過(guò)程:

(1)鍵盤(pán)產(chǎn)生掃描碼; (2)掃描碼送入60h 端口; (3)一旦偵測(cè)到60h端口有動(dòng)靜,引發(fā)9 號(hào)中斷; (4)CPU執(zhí)行int 9 中斷例程處理鍵盤(pán)輸入。 以上的過(guò)程,前三步都由硬件系統(tǒng)自動(dòng)完成。我們能夠改變的只有第四步,修改int 9 終端程序。 但是,在這門(mén)課程中,我們不準(zhǔn)備完整地編寫(xiě)一個(gè)鍵盤(pán)中斷的處理程序,因?yàn)橐婕暗揭恍┯布?xì)節(jié),而這些內(nèi)容脫離了我們的內(nèi)容主線。 插入語(yǔ):如果有興趣想更為深入的學(xué)習(xí)匯編語(yǔ)言,探究匯編語(yǔ)言的奧妙,可以關(guān)注小甲魚(yú)今后推出的《The Art of Assembly Language》。 ?

但是,我們卻還要編寫(xiě)新的鍵盤(pán)中斷處理程序,來(lái)進(jìn)行一些特殊的工作,那么這些硬件細(xì)節(jié)如何處理呢?

如果單純要完成這點(diǎn)還是相對(duì)比較簡(jiǎn)單的,因?yàn)锽IOS 提供的int 9中斷例程已經(jīng)對(duì)這些硬件細(xì)節(jié)進(jìn)行了處理。 我們只要在自己編寫(xiě)的中斷例程中調(diào)用BIOS 的int 9中斷例程就可以了。 ?

任務(wù)演示:在屏幕中間依次顯示 “a”~“z” ,并可以讓人看清。在顯示的過(guò)程中,按下Esc鍵后,改變顯示的顏色。

?

我們先來(lái)看一下如何依次顯示“a”~“z”:

[codesyntax lang="asm"] assume cs:codecode segmentstart: mov ax,0b800hmov es,axmov ah,'a's: mov es:[160*12+40*2],ahinc ahcmp ah,'z'jna smov ax,4c00hint 21hcode endsend start [/codesyntax] ? 我們發(fā)覺(jué),因?yàn)橐粋€(gè)字母剛顯示到屏幕上,CPU執(zhí)行幾條指令后,就又變成了另一個(gè)字母,字母之間切換得太快,因此我們無(wú)法看清。 理想狀況是:我們應(yīng)該在每顯示一個(gè)字母后,延時(shí)一段時(shí)間,讓人看清后,再顯示下一個(gè)字母。 ?

那么如何延時(shí)呢?

不如……我們讓CPU 執(zhí)行一段時(shí)間的空循環(huán)。有時(shí)候讓它做點(diǎn)無(wú)用功哈~ ? 請(qǐng)看源代碼并試圖分析作者的做法:相關(guān)代碼下載 ? 現(xiàn)在顯示“a”~“z”的任務(wù)我們基本完成了,并做到可以讓人看清,雖然做法有些無(wú)恥…… ? 那么接下來(lái)將進(jìn)一步來(lái)實(shí)現(xiàn):按下 Esc 鍵后,改變顯示的顏色!怎么辦呢? 鍵盤(pán)輸入到達(dá)60h 端口后,就會(huì)引發(fā) 9號(hào)中斷,CPU 則轉(zhuǎn)去執(zhí)行int 9中斷例程。 ? 我們可以編寫(xiě)int 9中斷例程,功能如下: (1)從60h端口讀出鍵盤(pán)的輸入; (2)調(diào)用BIOS 的int 9 中斷例程,處理其他硬件細(xì)節(jié); (3)判斷是否為Esc的掃描碼,如果是,改 變顯示的顏色后返回;如果不是則直接返回。 ? ?

接下來(lái),我們對(duì)這些功能的實(shí)現(xiàn)一一進(jìn)行分析!

?

第一步:從端口60h讀出鍵盤(pán)的輸入

in al,60h ?

第二步:調(diào)用BIOS的int 9中斷例程

注:有一點(diǎn)要注意的是,我們寫(xiě)的中斷處理程序要成為新的int 9中斷例程,主程序必須要將中斷向量表中的int 9中斷例程的入口地址改為我們寫(xiě)的中斷處理程序的入口地址。 那么在新的中斷處理程序中調(diào)用原來(lái)的int 9中斷例程時(shí),中斷向量表中的int 9中斷例程的入口地址卻不是原來(lái)的int 9 中斷例程的地址。所以我們不能使用int 指令直接調(diào)用。 ? 這里有必要解釋一下:。。。。。。 對(duì)于我們現(xiàn)在的問(wèn)題,假設(shè)我們將原來(lái)int 9中斷例程的偏移地址和段地址保存在ds:[0]和ds:[2]單元中。 那么我們?cè)谛枰{(diào)用原來(lái)的int 9中斷例程時(shí)候,就可以在 ds:[0]、ds:[2] 單元中找到它的入口地址。 ?

那么,有了入口地址后,我們?nèi)绾芜M(jìn)行調(diào)用呢?

當(dāng)然不能使用指令int 9來(lái)調(diào)用。我們可以用別的指令來(lái)對(duì)int指令進(jìn)行一些模擬,從而實(shí)現(xiàn)對(duì)中斷例程的調(diào)用。 ? 我們來(lái)看,int 指令在執(zhí)行的時(shí)候,CPU 進(jìn)行下面的工作: (1)取中斷類(lèi)型碼n; (2)標(biāo)志寄存器入棧; (3) IF=0,TF=0; (4) CS 、IP 入棧; (5)(IP) = (n*4),(CS) = (n*4+2)。 取中斷類(lèi)型碼是為了定位中斷例程的入口地址,在我們的問(wèn)題中,中斷例程的入口地址已經(jīng)知道。 所以,我們用別的指令模擬int 指令時(shí)候,不需要做第(1)步。 ? 在假設(shè)要調(diào)用的中斷例程的入口地址在ds:0和ds:2單元中的前提下,我們將int 過(guò)程用下面幾步模擬: (1)標(biāo)志寄存器入棧; (2)IF=0,TF=0; (3)CS、IP入棧; (4)(IP)=((ds)*16+0),(CS)=((ds)*16+2)。 可以注意到第(3)、(4)步和call dword ptr ds:[0]的功能一樣。 ? call dword ptr ds:[0] 的功能也是: (1)CS 、IP 入棧; (2)(IP)=((ds)*16+0),(CS)=((ds)*16+2)。 如果這點(diǎn)上有疑問(wèn)的童鞋,不妨可以復(fù)習(xí)下10.6節(jié)的內(nèi)容。 ?

所以經(jīng)過(guò)我們總結(jié)后,int 過(guò)程的模擬最終變?yōu)?#xff1a;

(1)標(biāo)志寄存器入棧; (2)IF=0,TF=0; (3)call dword ptr ds:[0] 對(duì)于(1),可用pushf實(shí)現(xiàn)。 對(duì)于(2),我們又得動(dòng)點(diǎn)歪腦筋,沒(méi)辦法,資源條件極其卑劣的8086 要么使人放棄,要么逼出天才!我們可用以下程序間接實(shí)現(xiàn): ? 實(shí)現(xiàn)IF=0,TF=0步驟:

pushf

pop ax

and ah,11111100b ; IF和OF為標(biāo)志寄存器的

; 第9位和第8位

push ax

popf

? 這樣,模擬int指令的調(diào)用功能,調(diào)用入口地址在ds:0、ds:2中的中斷例程的程序如下:

pushf ;標(biāo)志寄存器入棧

pushf

pop ax

and ah,11111100b ; IF和OF為標(biāo)志寄存器的第9

; 位和第8位

push ax

popf ;IF=0、TF=0

call dword ptr ds:[0]

?

第三步:如果是Esc鍵的掃描碼,改變顯示的顏色后返回……

? 那么,下一個(gè)問(wèn)題:如何改變顯示的顏色? [buy]?獲得所有教學(xué)視頻、課件、源代碼等資源打包?[/buy] [Downlink href='http://kuai.xunlei.com/d/LWPDSCJPSSUD']視頻下載[/Downlink]

轉(zhuǎn)載于:https://www.cnblogs.com/LoveFishC/archive/2011/05/27/3846090.html

總結(jié)

以上是生活随笔為你收集整理的外中断02 - 零基础入门学习汇编语言70的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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