目錄
- 13.1 int 指令
- 13.2 編寫供應用程序調用的中斷例程
- 13.3 對int、iret和棧的深入理解
- 13.4 BIOS和DOS所提供的中斷例程
- 13.5 BIOS和DOS中斷例程的安裝過程
- 13.6 BIOS中斷例程應用
- 13.7 DOS中斷例程應用
- 實驗13 編寫、應用中斷例程
????中斷信息可以來自CPU的內部和外部,當CPU的內部有需要處理的事情發生的時候,將產生需要馬上處理的中斷信息,引發中斷過程。
13.1 int 指令
- int 指令的格式為:int n,n為中斷類型碼,它的功能是引發中斷過程。CPU執行int指令過程如下:
- (1)取得中斷類型碼 n
- (2)標志寄存器入棧,IF=0,TF=0
- (3)CS、IP入棧
- (4)(IP)=(n 4),(CS)=(n4+2)
????一般情況下,系統將一些具有一定功能的子程序,以中斷處理程序的方式提供給應用程序調用。 我們在編程的時候,可以用int指令調用這些子程序。當然也可以自己寫中斷處理程序給別人調用。我們可以將中斷處理程序簡稱為中斷例程。
????int 指令和call 指令的對比
int | call | |
---|---|---|
都跳轉到子程序執行 | 子程序是中斷處理程序,簡稱為中斷例程 | 常見的子程序 |
如何得到子程序入口地址 | 根據中斷類型碼查找中斷向量表 | 根據機器碼中的位移或CS IP或保存在寄存器、內存中的CS IP |
跳轉到子程序前要保存、設置哪些內容 | 保存標記寄存器、TF=0、IF=0,然后保存CS IP | 只要保存IP或CS IP |
保存在哪兒 | 保存在棧中 | 保存在棧中 |
如何返回 | 通常用iret指令返回 | 用ret或retf指令返回 |
????int指令的最終功能和call指令相似,都是調用一段程序。上面我自己總結的對比表格比較重要。
13.2 編寫供應用程序調用的中斷例程
????int指令和iret指令的配合使用與call指令和ret指令的配合使用具有相似的思路。編寫中斷例程和編寫子程序的時候具有同樣的問題,就是要避免寄存器沖突。應該注意例程中用到的寄存器的值的保存和恢復。
????碰到程序我都要自己寫一遍,這小節第二個程序,沒看清需求就寫了,寫得比例題中更全面一點,字符串中包含非字母的字符能識別,不處理。寫完這個程序挺得意的,雖然在高手眼中很簡單。
13.3 對int、iret和棧的深入理解
????這小節的例子就是用int指令模擬其它指令,如loop指令、jmp指令。書本中的知識比較簡單,無非就是注意一下int指令對棧的操作。
????我在思考解決這小節時,總結出我的一些問題。當我遇到一個問題時,不能一眼看出解決辦法,就本能抗拒問題,擔心解決不了問題,然后帶著這種恐懼的心,不是平常心,更談不上藐視問題的心態,去解決問題,更加人為的增加了自己解決問題的難度。其實從自學開始,我碰到了很多難題,都解決了,而且幾乎都是第二天就解決了。
????我總結自己解決問題的關鍵是,遇到問題的第一天,對問題不熟悉,又想解決問題就逼迫自己去分析問題,分析的過程中對問題本身,還有問題相關的知識也就熟悉了,有些問題在分析過程中就看出問題的本質,可能當天花半小時左右就解決了,難一點的問題第二天也解決了。第二天解決的關鍵就是,第一天對問題及問題相關的知識熟悉了,發現難題不難了,就能以一種平常心去思考問題,然后發現問題的本質,結合相關知識找到問題的答案。
????我的解題過程中充滿了不自信,遇到問題不能一眼看出答案,就覺得自己不如別人,就會產生恐懼,害怕自己不如別人,為了認可自己,證明自己不比別人差,就想著趕快解決問題,這反而就失去了解決問題需要的平常心,更加難以解決問題,進一步加深了自己內心的不自信、自卑。
????我想提醒自己的是,學習到現在已經解決了很多問題了,我不是天才,是個普通人,所以遇到的問題也就是普通人能解決的問題,只需要不恐懼,以一種平常心去面對問題,就能解決。因為事實如此,我至今遇到的問題都解決了。要知道能一眼看出答案的都不能稱為問題,問題就是要先熟悉問題,然后分析問題,了解問題相關知識點,最后用一顆平常心去找出問題的答案。著什么急呢。
????第二點我害怕遇到問題,遇到問題意味著我的學習速度要降下來,總想著快點把想學的東西學完,然后把知識換成錢。
????我想提醒自己的第二點就是,知識之所以值錢,是因為學習的過程中需要停下來思考,真正值錢的就是思考的部分。如果把一本書讀一遍就掌握了知識,那知識不稀缺,也不值錢。
????我今后要做的就是,從遇到問題開始,自信的以一種平常心,去熟悉問題,分析問題,找出問題的本質,然后解決問題。不追求解題速度,追求自信從容,說不定比追求速度更快、更順利的解決問題。
13.4 BIOS和DOS所提供的中斷例程
- BIOS中主要包含以下幾部分內容:
- (1)硬件系統的檢測和初始化程序
- (2)外部中斷和內部中斷的中斷例程
- (3)用于對硬件設備進行I/O操作的中斷例程
- (4)其它和硬件系統相關的中斷例程
????從操作系統的角度看,DOS的中斷例程就是操作系統向程序員提供的編程資源。 程序員在編程時可以用int指令直接調用BIOS和DOS提供的中斷例程,來完成某些工作。和硬件設備相關的DOS中斷例程中,一般都調用了BIOS的中斷例程。
????讀這小節時,我誤把書中介紹BIOS內容的內部中斷例程、外部中斷例程、對硬件設備進行IO操作的中斷例程,看成是中斷例程的分類了。糾結了很久,這里其實不強調分類,只是說明BIOS中包含的內容。如果非要分類的話,從CPU內外的角度來分,CPU內部引發的中斷,就是內部中斷/軟件中斷。包括異常(異常是CPU執行可能引發的問題);CPU外部引發的中斷叫外部中斷/硬件中斷,包括IO中斷。可以對硬件設備進行IO操作的中斷例程,內部中斷,外都中斷都有。不能看成一個分類。
13.5 BIOS和DOS中斷例程的安裝過程
????對于BIOS提供的中斷例程,只需將入口地址登記在中斷向量表即可,因為它們是固化到ROM中的程序,一直在內存中存在。
????BIOS這個軟件程序是硬件出廠時就安裝好的,是最基礎的軟件系統;DOS等操作系統終端用戶可以自己安裝或更換操作系統,相對于BIOS來說屬于后天安裝的。而且操作系統的安裝,需要有BIOS這個基本輸入輸出系統才能安裝。
13.6 BIOS中斷例程應用
????一般來說,一個供程序員調用的中斷例程中往往包含多個子程序,中斷例程內部用傳遞進來的參數決定執行哪個子程序。 BIOS和DOS提供的中斷例程,都用ah來傳遞內部子程序的編號。
- int 10h中斷例程是BIOS提供的中斷例程,其中包含了多個和屏幕輸出相關的子程序。
- ah=2 表示調用第10h號中斷例程的2號子程序,功能為設置光標位置,可以提供光標所在的行號、列號,和頁號作為參數
- ah=9 表示調用第10h號中斷例程的9號子程序,功能為在光標位置顯示字符,可以提供要顯示的字符、顏色屬性、頁號、字符重復個數作為參數。
13.7 DOS中斷例程應用
- int 21h 中斷例程是DOS提供的中斷例程,其中包含了DOS提供給程序員在編程時調用的子程序。
- ah=4ch 表示調用第21h號中斷例程的4ch號子程序,功能為程序返回,可以提供返回值作為參數
- ah=9 表示調用第21h號中斷例程的9號子程序,功能為在光標位置顯示字符串, 要顯示的字符串需用“$”作為結束符,可提供字符串的地址作為參數。
實驗13 編寫、應用中斷例程
- 前面兩個實驗,很簡單,關鍵就是第三個實驗,書中也要求我們細細體會其中的編程思想,下面是我的一些理解:
- (1)本來想寫“offset不支持在數據段和棧段中使用的”,因為我看到此刻offset都只在代碼段中使用,我覺得不可能這么傻,后來查了資料,發現可以在其他段中用offset,甚至于要求就是這么寫的,這樣數據段、棧段、代碼段才能結構分明,本書后面第16章就介紹了offset在更全面的應用。
- (2)某些看似可以利用循環指令的需求,循環體的規律可能不直接,我們需要創造出規律。這里類似高級語言的指針、間接指針相關知識。