1. 程式人生 > >匯編學習筆記(10)-IO端口與指令

匯編學習筆記(10)-IO端口與指令

其中 浪費 完成 oop 執行 代碼 研究 可能 控制寄存器

一、什麽是IO端口

  計算機上有很多輸入輸出設備,比如顯示器,打印機,鼠標,鍵盤。這些設備通過接口和CPU相連接,並提供了一組寄存器給CPU用於控制對應的硬件,為了方便管理這些寄存器,CPU給這個寄存器統一分配地址,如管理內存一樣使用這些寄存器,這就稱之為IO端口。

二、IO端口輸入輸出指令

  80x86的IO端口編址和內存編址是分開的,使用一組特殊的命令訪問IO端口,註意的輸入輸出是對CPU而言的,比如輸入指的是數據進入CPU,相反輸出指的是從CPU輸出數據到IO端口

輸入指令

  IN AL, 立即數

  IN AX, 立即數

  IN AL,DX

   IN AX,DX

   以上指令是將指定IO端口數據讀取到AL或者AX中保存

  傳輸的數據可以是一個字或一個字節,可以使用立即數尋址或者使用間接尋址(只能使用DX寄存器)。使用立即數尋址尋址範圍只能是一個字節(8位),使用DX尋址可以是16位。

輸出指令

   Out 立即數,AL

  Out port, ax

  Out dx,al

   Out dx,ax

   以上指令是將AL 或者AX中的數據保存到指定的IO端口中。

    其他限制和In指令一樣

  簡單例子:

    主板上有一塊RT/CMOS RAM,裏面保存了一些時間信息,可以使用IO端口進行訪問,分配的地址是70H-7FH。我們可以使用IN,OUT指令來讀取它。

    地址是70H-7FH,一共16個地址也就是說一共是16個寄存器,但是CMOS中存儲了64字節的數據,所以就不可能一一對應了,必須使用一些方法了。

    方法是這樣的,CMOS將這16個寄存器分為 控制寄存器 數據寄存器 兩種寄存器.

    其中端口號70的寄存器是控制寄存器,71則是數據寄存器

  將要訪問的CMOS中的數據的偏移傳入 70號IO端口即可在71號IO端口讀取到對應的數據。

讀數據

MOV AL,N ; 選擇要讀取的數據

OUT AL,70H ; 將地址傳入70 IO端口

JMP $+2 ; 這條指令是用來拖延時間的,稍後解釋作用

IN AL,71h ; 從71 IO端口讀出數據

寫數據

MOV AL,N ; 選擇要讀取的數據

OUT AL,70H ; 將地址傳入70 IO端口

JMP $+2 ; 這條指令是用來拖延時間的,稍後解釋作用

MOV AL, x ; 將要寫的數據闖入AL寄存器

IN AL,71h ; 從71 IO端口讀出數據

三、數據傳送方式

  1.無條件傳送方式

以上我們使用的都是無條件傳送方式,直接使用IN OUT指令進行數據讀取。但是這會遇到一些問題,那就是同步問題,CPU的指令執行速度是非常之快的,而外設一般來說會比CPU的速度慢好幾個量級。

就拿上面的例子做解釋

運行命令 OUT AL,70H之後,CMOS會將 指定位置的數據放置到71H端口。緊接著CPU就執行IN AL,71H指令去讀取數據了。因為 CMOS準備數據是CMOS自己的事情不需要CPU的參與,所以這是個異步的操作,會有一個先後的順序,即如果CMOS的速度比CPU慢,CPU去讀71的數據的時候CMOS實際上還沒來得及將數據準備好,這樣CPU讀到的數據就是錯誤的了。

這也就解釋了為什麽上面的代碼中存在一個JMP指令,這個JMP指令就是拖延CPU的時間,以保證CMOS能將數據準備好。

但是其實這個很不保險,因為我們還是不能保證拖延一個指令周期就夠了。

所以有第二種數據存送方式: 查詢方式

  2.查詢方式

前面介紹了無條件存送方式存在的一個弊端,即速度不同的設備同步的問題,而查詢方式解決了這個弊端,解決方案是專門使用一個寄存器用來指示操作是否完成。

還是以前面的例子,

    MOV AL,N ; 選擇要讀取的數據

    OUT AL,70H ; 將地址傳入70 IO端口

Loop: JMP $+2 ; 這條指令是用來拖延時間的

IN AL,?? ; 這裏地址?? 是因為只是做個演示,實際這個功能沒有對應的標記寄存器,這依賴於具體硬件的實現

    cmp AL, 01h ; 檢查標誌,還沒準備好則不停循環等待

    jnz loop ; 如果從?? 除讀取到的數據不是1那麽就是詩句還沒準備好繼續循環

IN AL,71h ; 從71 IO端口讀出數據

從上可以看出,雖然查詢方式解決的同步的問題,但是這樣傻循環還是有點浪費CPU性能,所以還有下一種方式

  3. 中斷方式

中斷方式就是將任務交給外設,然後CPU繼續做其他事情,等外設完成的時候主動通過中斷來通知CPU任務完成了。

中斷具體內容將在下一節中介紹。

  4. 直接存儲器傳送(DMA)

DMA是專門的硬件設備,用於將高速設備中的數據直接傳輸到內存。這樣就可以解放出CPU的計算力使CPU可以專註與計算而不用將時間浪費在數據傳輸上。

CPU只要將相關的數據傳輸配置設置好,這樣DMA就可以總線空閑的時候來傳輸數據,數據傳輸完成之後DMA就會使用硬件中斷通知CPU數據傳輸完成了。

(書中沒有解釋如和使用DMA來傳輸數據,以後研究。)

匯編學習筆記(10)-IO端口與指令