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


一、什么是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 70H,AL          ; 將地址傳入70 IO端口

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

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

 

       寫數據

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

       OUT 70H,AL          ; 將地址傳入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 70H,AL         ; 將地址傳入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來傳輸數據,以后研究。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM