<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 匯編入門學(xué)習(xí)筆記 (十一)—— 內(nèi)中斷

          匯編入門學(xué)習(xí)筆記 (十一)—— 內(nèi)中斷

          作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          瘋狂的暑假學(xué)習(xí)之 匯編入門學(xué)習(xí)筆記 (十一)—— 內(nèi)中段

          本文引用地址:http://www.ex-cimer.com/article/201611/317785.htm

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

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

          1. 內(nèi)中斷的產(chǎn)生

          下面4中情況會產(chǎn)生內(nèi)中斷:

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

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

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

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

          2. 處理中斷信息

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

          3. 中斷過程

          例如:div除法溢出 的中斷類型是0,產(chǎn)生div除法溢出后,cpu知道中斷類型位0,cpu先保存標(biāo)志位,cs、ip,設(shè)置TF=0、IF=0,然后去到中斷向量表取出對應(yīng)中斷處理程序的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指令相當(dāng)于:

          pop ip

          pop cs

          pop f

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

          (1)保存到寄存器

          (2)處理中斷

          (3)恢復(fù)到寄存器

          (4)iret

          5. 寫一個中斷處理程序

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

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

          下面就修改0中斷的中斷程序,讓產(chǎn)生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開始的內(nèi)存空間中去
          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;設(shè)置要顯示信息在代碼中的位置
          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

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

          6. 單步中斷

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

          過程:

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

          (2)標(biāo)志寄存器入棧,TF,IF設(shè)置為0

          (3)CS,IP入棧

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

          7. 響應(yīng)中斷的特殊情況

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

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

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

          如:

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



          關(guān)鍵詞: 匯編入門內(nèi)中

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();