新聞中心

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

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

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

        本文引用地址:http://www.104case.com/article/201611/317785.htm

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

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

        1. 內中斷的產生

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

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

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

        (3)執行into指令。

        (4)執行int指令

        2. 處理中斷信息

        中斷信息中包含8位的中斷類型嗎,用來表示要執行的中斷程序。但是,一個程序入口要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)) 然后執行中斷程序。

        即:

        (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會發生div除法溢出的程序,就會看到屏幕中間顯示綠色 的“Welcome to masm!”。

        6. 單步中斷

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

        過程:

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

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

        (3)CS,IP入棧

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

        7. 響應中斷的特殊情況

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

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

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

        如:

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



        關鍵詞: 匯編入門內中

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 安达市| 寿宁县| 乐业县| 甘谷县| 思南县| 盐山县| 赣州市| 洛宁县| 汝阳县| 隆回县| 泾源县| 绥江县| 田林县| 仁寿县| 大悟县| 永和县| 肃宁县| 固原市| 大足县| 扬州市| 泰兴市| 三江| 武胜县| 郁南县| 临泉县| 佛坪县| 荣成市| 托克逊县| 襄城县| 历史| 土默特左旗| 斗六市| 巴林左旗| 英德市| 托克托县| 遂川县| 翁源县| 巫溪县| 长宁县| 商水县| 宁化县|