新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 匯編入門學習筆記 (十一)—— 內中斷

匯編入門學習筆記 (十一)—— 內中斷

作者: 時間:2016-11-09 來源:網絡 收藏
瘋狂的暑假學習之 匯編入門學習筆記 (十一)—— 內中段

本文引用地址:http://butianyuan.cn/article/201611/317785.htm

參考: 《匯編語言》 王爽 第12章

中斷是指CPU在執(zhí)行完當前指令后收到某種信息(中斷信息),就不在接向下執(zhí)行,而去對接收到的信息進行處理。中斷信息可以來自CPU內部和外部,分內中斷,外中斷。

1. 內中斷的產生

下面4中情況會產生內中斷:

(1)除法錯誤。如:div除法溢出

(2)單步執(zhí)行。如debug中的單步調試

(3)執(zhí)行into指令。

(4)執(zhí)行int指令

2. 處理中斷信息

中斷信息中包含8位的中斷類型嗎,用來表示要執(zhí)行的中斷程序。但是,一個程序入口要cs和ip,8位不夠。這樣,系統中就有一個中斷向量表保存中斷程序的cs和ip,8位中斷類型嗎表示是中斷向量表中的第幾個。并且中斷向量表存放在 0000:0000到0000:03ff的1024個單元中。

3. 中斷過程

例如:div除法溢出 的中斷類型是0,產生div除法溢出后,cpu知道中斷類型位0,cpu先保存標志位,cs、ip,設置TF=0、IF=0,然后去到中斷向量表取出對應中斷處理程序的cs和ip(ip=(0*4),cs=(0*4+2)) 然后執(zhí)行中斷程序。

即:

(1)取得中斷類型嗎N

(2)pushf

(3)TF=0,IF=0

(4)push cs

(5)push ip

(6)(ip)=(N*4),(cs)=(N*4+2)

4. 中斷處理程序和iret指令

iret指令相當于:

pop ip

pop cs

pop f

一般中斷處理程序的步驟:

(1)保存到寄存器

(2)處理中斷

(3)恢復到寄存器

(4)iret

5. 寫一個中斷處理程序

0中斷是div除法溢出例如下面程序debug中就會產生overflow錯誤,在屏幕上顯示“Divide overflow”

  1. assumecs:code
  2. codesegment
  3. start:
  4. movax,1000H
  5. movbl,1
  6. divbl
  7. codeends
  8. endstart

下面就修改0中斷的中斷程序,讓產生div除法溢出時,在屏幕上顯示“Welcome to masm!”

  1. assumecs:code
  2. codesegment
  3. start:
  4. movax,cs
  5. movds,ax
  6. movsi,offsetdo0
  7. movax,0
  8. moves,ax
  9. movdi,200h
  10. movcx,offsetdo0end-offsetdo0;計算寫入大小
  11. cld
  12. repmovsb;把do0~do0end的代碼寫到0:200開始的內存空間中去
  13. movax,0
  14. moves,ax
  15. movwordptres:[0*4],200h;改變0中斷的中斷向量表,是0中斷指向我們要的中斷處理程序的位置
  16. movwordptres:[0*4+2],0
  17. movax,4c00h
  18. int21h
  19. do0:
  20. jmpshortdo0start
  21. dbWelcometomasm!;保存要顯示的信息
  22. do0start:
  23. movax,cs
  24. movds,ax
  25. movsi,202h;設置要顯示信息在代碼中的位置
  26. movax,0b800h
  27. moves,ax
  28. movdi,12*160+36*2;顯示的位置
  29. movcx,16
  30. s:
  31. moval,[si]
  32. moves:[di],al
  33. incsi
  34. adddi,1
  35. moval,02h;顯示的顏色等信息
  36. moves:[di],al
  37. adddi,1
  38. loops
  39. movax,4c00h
  40. int21h
  41. do0end:
  42. nop
  43. codeends
  44. endstart

先運行上面代碼生成的程序,把中斷程序拷貝到安全的內存中,改變中斷向量表。然后debug會發(fā)生div除法溢出的程序,就會看到屏幕中間顯示綠色 的“Welcome to masm!”。

6. 單步中斷

CPU每執(zhí)行完一條指令后,如果檢測到標志寄存器的TF為1,則會產生單步中斷,引發(fā)中斷過程。單步中斷的中斷類型嗎位1。

過程:

(1)取得中斷類型嗎1。

(2)標志寄存器入棧,TF,IF設置為0

(3)CS,IP入棧

(4)(IP)=(1*4),(CS)=(1*4+2)

7. 響應中斷的特殊情況

一般情況,如果CPU檢測到中斷信息,就會響應中斷。但有特殊情況。

當在執(zhí)行完向ss寄存器傳送的指令后,如果發(fā)現中斷,CPU不會響應。因為如果ss改變,sp沒有改變,ss:sp就不是指向正確的棧頂了。

所以改變ss于改變sp的命令要寫在一起

如:

  1. movax,1000h
  2. movss,ax
  3. movsp,0



關鍵詞: 匯編入門內中

評論


技術專區(qū)

關閉