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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

汇编语言笔记(四):内中断

發(fā)布時(shí)間:2024/7/23 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言笔记(四):内中断 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

????匯編語言筆記:內(nèi)中斷

章節(jié)目錄

  • 概念
  • 中斷過程
  • 示例: 0 號(hào)中斷處理
  • 作者能力有限, 如果您在閱讀過程中發(fā)現(xiàn)任何錯(cuò)誤, 還請(qǐng)您務(wù)必聯(lián)系本人,指出錯(cuò)誤, 避免后來讀者再學(xué)習(xí)錯(cuò)誤的知識(shí).謝謝!

    概念

    中斷信息:
    任何一個(gè)通用 CPU 都具備一種能力, 可以在執(zhí)行完當(dāng)前正在執(zhí)行的指令之后, 檢測(cè)到從 CPU 外部發(fā)送過來的或者內(nèi)部產(chǎn)生的一種特殊信息, 并且可以立即對(duì)所接受到的信息進(jìn)行處理. 這種特殊的信息稱為:中斷信息. 中斷意味著 CPU 不再繼續(xù)向下執(zhí)行, 而是轉(zhuǎn)去處理這個(gè)特殊的信息.

    CPU 內(nèi)部產(chǎn)生的中斷稱為內(nèi)中斷

    對(duì)于 8086 CPU, 有以下四種中斷信息.

    中斷原因中斷類型碼
    除法錯(cuò)誤0
    單步執(zhí)行1
    執(zhí)行 into 指令4
    執(zhí)行 int 指令n

    中斷類型碼是中斷來源信息的編碼. 在 8086CPU 中使用一個(gè)字節(jié)的長(zhǎng)度來編碼中斷源.

    中斷處理程序:
    CPU 在收到中斷信息之后, 需要對(duì)中斷進(jìn)行處理. 中斷處理程序就是用來處理對(duì)應(yīng)中斷的程序. CPU 在收到中斷信息之后, 就會(huì)轉(zhuǎn)去執(zhí)行對(duì)應(yīng)的中斷處理程序. 中斷處理程序由程序員編寫.

    中斷向量表: 是中斷向量的列表.
    中斷向量: 是中斷程序的入口地址.

    中斷向量表在內(nèi)存中保存, 存放著 256 個(gè)中斷源所對(duì)應(yīng)的中斷處理程序的入口地址. CPU 根據(jù)中斷類型碼作為中斷向量表的表項(xiàng)號(hào), 定位相應(yīng)的表項(xiàng), 從而得到中斷處理程序的入口地址.

    對(duì)于 8086PC 機(jī), 中斷向量表存放在 0000:0000 ~ 0000:03FF 所在的內(nèi)存中. 每個(gè)表項(xiàng)占用兩個(gè)字節(jié)的大小. 高地址字存放段地址, 低地址字存放偏移地址.

    中斷過程

  • 從中斷信息中獲取中斷類型碼
  • 標(biāo)志寄存器的值入棧
  • 設(shè)置標(biāo)志寄存器的第八位 TF 和第九位 IF 的值為 0.
  • CS 的內(nèi)容入棧
  • IP 的內(nèi)容入棧
  • 從內(nèi)存地址為中斷類型碼*4和中斷類型碼*4+2的兩個(gè)單元中讀取中斷處理程序的入口地址放入IP和CS中
  • 這個(gè)過程由 CPU 完成.

    示例: 0 號(hào)中斷處理

    下面的示例中, 我們將完成一個(gè)處理除法溢出的中斷處理程序. 完成后, 先執(zhí)行中斷處理程序, 然后當(dāng)系統(tǒng)發(fā)生除法中斷, 我們的中斷處理程序就會(huì)被執(zhí)行, 在屏幕中央顯示 “overflow!” 字符串.

    中斷處理程序:

    程序一開始, 我們將我們的中斷處理程序 do0 和 do0Start 存儲(chǔ)在內(nèi)存位置 0:200H 開始的地址中. 沒有直接申請(qǐng)對(duì)應(yīng)的內(nèi)存, 是因?yàn)椴幌肷婕安僮飨到y(tǒng)相關(guān)的操作. 0000:0000 ~ 0000:03FF 這段地址本是用來存放中斷向量表的, 但是大部分情況下并沒有那么多的中斷處理程序, 因此我們就借用了這段地址來存儲(chǔ)我們的中斷處理程序. 將 do0 存到 0:200H 的地址中這個(gè)操作 我們使用了 movsb 指令.

    中斷處理程序 do0Start 完成在屏幕上顯示 “overflow!” 的功能. 這里, 我們將 “overflow!” 字符串保存在代碼段中, 是為了一起復(fù)制到 0:200H 中去. 如果我們?yōu)樵撟址畣为?dú)定義一個(gè)數(shù)據(jù)段, 那么為了能訪問該數(shù)據(jù)段, 我們還需要額外的將該數(shù)據(jù)段也復(fù)制到 0:200H 相應(yīng)的內(nèi)存中去. 為了避免麻煩, 我們這里直接將它寫在代碼段中, 這樣數(shù)據(jù)會(huì)和代碼一次性被拷貝到相應(yīng)內(nèi)存中去.

    因?yàn)槲覀兲幚淼牡氖?號(hào)中斷, 因此我們?cè)谠O(shè)置中斷向量表時(shí), 是將對(duì)應(yīng)的中斷處理程序地址(0:200h) 分別設(shè)置到 0:2 和 0:0 中去.

    如果單純的編譯運(yùn)行該程序, 不會(huì)有任何輸出, 因?yàn)樵摮绦蛑皇峭瓿蓪?號(hào)中斷處理程序保存在內(nèi)存地址 0:200H 開始的內(nèi)存地址中, 并將該程序的內(nèi)存地址保存到 0 號(hào)對(duì)應(yīng)的向量表中, 以便當(dāng)發(fā)生除法中斷時(shí), 該程序會(huì)被調(diào)用.

    測(cè)試代碼:

    使用如下代碼測(cè)試一下我們的程序是否成功運(yùn)行.

    在我的機(jī)器上運(yùn)行效果如下:

    歡迎交流任何想法.

    End…

    總結(jié)

    以上是生活随笔為你收集整理的汇编语言笔记(四):内中断的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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