彙編語言基本概念(續12)

前面講到CPU通過三種總線與各類設備打交道,其中存儲器是和CPU的地址、數據及控制總線相連,CPU將其看作一個邏輯內存空間。採用統一的編址方式。但是存儲器芯片除了硬盤、內存條之外,還有一些接口卡如顯卡、網卡等,這些設備上是自有內部芯片和內部寄存器,這些寄存器從CPU來看也是存儲器的概念。在不同的系統架構中,如何確定這些寄存器,也就是如何對它們編址是不一樣,在X86系統,引入一個新的編址空間叫端口,它與前面的內存地址空間隔開不一樣,採用不同的指令。而在一些其它的如PPC等硬件架構中,它是採用統一內存地址空間。所以它們不存在端口概念。因此,在8086CPU中CPU可以讀寫如下3個地方的數據:CPU內部寄存器、內存單元、端口。在8086CPU中對端口定位是通過端口地址,因爲端口所在的芯片是與CPU的三條總線相連,所以端口地址同內存地址一樣,可以通過地址總線來傳送,只是編址方式不同,CPU最多可以定位64KB的不同端口,範圍是0~65535,並且端口的讀寫不能用mov push,pop等內存指令,而是使用in 和out指令。如下圖所示:

image

如上圖所示,in al,20h (從20h號端口讀入一個字節),執行時首先CPU通過地址線找到in al,20h指令,通過數據線讀入e420進入指令執行ALU中,ALU開始執行首先訪問20H端口,接着通過控制線發出讀命令,選中端口所在的芯片,並通知它讀取數據,端口所在的芯片將20h端口中的數據61送入CPU的數據線,並最終到達al寄存器中。同樣寫也一樣,如下圖所示:

image

我們前面知道地址線寬度是20位,需要訪問的端口號值是存放在寄存器中,因此端口號最大16位,如果大於8位使用dx中介。8086CPU有一個特殊規定就是隻能使用ax或al來存放讀入的數據或者要發送的數據。

image

這裏需要注意的是不能直接數值寫入端口如將8寫入端口20h中,out 20h,8這種寫法是錯誤的,需要先將8存入al中然後進行操作。

8086CPU還提供了一種移位的指令,這種指令同高級語言中移位操作符相似,分爲左移與右移兩種,左移一個8位會丟掉一個最左位,右移一個8位會丟掉一個最右位,這丟掉的存放在CF中。其中shl是邏輯左移指令,它的功能是1)將一個寄存器或內存單元中的數據向左移位;2)將最後移出的一位寫入CF中;3)最低位用0補充。 mov al,01001000b shl al,1  執行後(al)=10010000b CF=0左移一位相當於*2。 如果要重複移位多次,將這些次數保存在cl中。同理shr 是邏輯右移。與shl操作相反。

image

image

注意,這裏CF中存儲只是最後一次操作中最後一次移出的一位。所以移動多位時如果中間有0或1丟掉,只取最後一次丟棄的值。上面的例子是以al作爲示例的,實際上ax也可以如下圖所示:

image

端口通常都是與外設相關,所以外設如I/O,CMOS都是有端口供CPU操作。其中CMOS RAM芯片在PC中一般用來掌管系統BIOS配置信息和時針信息。通常的CMOS 芯片包括一個實時鐘(電池供電)和一個128存儲單元的RAM存儲器。在這個RAM存儲器中0-0dh單元保存時間信息,其餘保存系統配置信息,供系統啓動時BIOS讀取。另外這個芯片提供了兩個端口70h和71h其中,70h爲地址端口,存放在訪問的CMOS RAM單元地址,71h爲數據端口,存放從選定的CMOS RAM單元中讀取的數據。CMOS中存儲時間的值是用BCD碼來表示,BCD碼是另外一種碼,不同於ANSI碼,它是以4位二進制表示十進制數碼錶,但不是十六進制和二進制之間的轉換,它只是用來表示十位數據符號的一種二進制表示,不存在值的真正意義上相同。類似於ANSI。如下圖所示:

image

在CMOS中使用BCD碼來表示兩位十進制,如12月用BCD碼是00010010,可以看出來一個十進制如4用BCD碼錶示是000001000b,而用ASCI表示則要加上30h成00110100b。下圖是一個綜合端口讀寫例子如下

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章