端口
在PC機系統中,和CPU通過總線相連的晶片除了各種存儲器外,還有以下3中晶片。
- 各種接口卡(比如,網卡,顯示卡)上的接口晶片,它們控制接口卡進行工作;
- 主機闆上的接口晶片,CPU通過它們對部分外設進行通路;
- 其他晶片,用來存儲相關的系統資訊,或者進行相關的輸入輸出處理。
這些晶片中,都有一組可以由CPU讀寫的寄存器。這些寄存器,它們在實體上可能處于不同的晶片中,但它們在以下兩點上相同。
- 都和CPU的總線相連,當然這種連接配接是通過它們所在的晶片中進行的。
- CPU對它們進行讀或寫的時候都通過控制總線向它們所在的晶片發出端口讀寫指令。
可見,從CPU的角度,将這些寄存器都當作端口,對它們進行統一編址,進而建立了一個同意的端口位址空間。每一的端口在位址空間中都有一個位址。
CPU可以直接讀寫以下3個地方的資料。
- CPU内部的寄存器
- 記憶體單元
端口的讀寫
在通路端口的時候,CPU通過端口位址來定位端口。因為端口所在的晶片和CPU通過總線相連,是以,端口位址和記憶體位址一樣,通過位址總線來傳遞。在PC系統中,CPU最多可以定位64KB個不同的端口。則端口位址的範圍為0~65535。
對端口的讀寫不能用mov,push,pop等記憶體讀寫指令。端口的讀寫指令隻有兩條:in 和 out,分别用于從端口讀取資料和往端口寫入資料。
CPU執行記憶體通路指令和端口通路指令時候,總線上的資訊:
通路記憶體:
mov ax,ds:[8] ;假設執行前(ds)=0
執行時與總線相關的操作如下所示:
- CPU通過位址線将位址資訊8發出
- CPU通過控制線發出記憶體讀指令,選中存儲器晶片,并通知它,将要從中讀取資料。
- 存儲器将8号單元中的資料通過資料線送入CPU
通路端口:
in al,60h ;從60h号端口讀入一個位元組
執行時與總線相關的操作如下:
- CPU通過位址線将位址資訊60h發出;
- CPU通過控制線發出端口讀指令,選中端口所在的晶片,并通知它,将要從中讀資料;
- 端口所在的晶片将60h端口中的資料通過資料線送入CPU。
注意在 in 和 out指令中,隻能使用ax或al來存放從端口中讀入的資料或要發送到端口的資料。通路8位端口(0~255)時用al,通路16位端口(256 ~ 65536)時用ax。
CMOS RAM 晶片
PC機中,有一個 CMOS RAM晶片,一般簡稱為CMOS。此晶片的特征如下。
- 包含一個實時鐘和一個有128個存儲單元的RAM存儲器。
- 該晶片靠電池供電。是以,關機後其内部的實時鐘仍可以正常工作,RAM中的資訊不丢失。
- 128個位元組的RAM中,内部實時鐘占用0~0dh單元來儲存時間資訊,其餘大部分單元用儲存系統配置資訊,供系統啟動時BIOS程式讀取。BIOS也提供了相關的程式,使我們可以在開機的時候配置 CMOS RAM中的系統資訊。
- 70h為位址端口,存放要通路的 CMOS RAM單元的位址;71h為資料端口,存放從標明的 CMOS RAM單元中讀取的資料,或要寫入到其中的資料。可見CPU對 CMOS RAM的讀寫分兩步進行,比如,讀 CMOS RAM的2号單元:
- 将2送入端口70h;
- 從端口71h讀出2号單元的内容。
shl 和 shr 指令
shl是邏輯左移指令,它的功能為:
- 将一個寄存器或記憶體單元中的資料向左移位;
- 将最後移出的一位寫入CF中;
- 最低位用0補充。
shr是邏輯右移指令,它和shl所進行的資料操作剛好相反。
- 将一個寄存器或記憶體單元中的資料向右移位;
- 最高位用0補充。