第十四章 埠

2022-09-19 07:48:09 字數 4175 閱讀 4943

在這一章,我們可以學到cpu不僅跟各種儲存器相連線,還與一下三種晶元會有互動:

各種介面卡,比如,網絡卡、顯示卡

主機板上的介面晶元,比如一些i/o介面

其他晶元,用來儲存相關的系統資訊,比如後面要講到的cmos ram

當然,這些晶元都擁有各自的讀寫暫存器,這些暫存器雖然都不在同乙個物理晶元裡,但是它們均有兩個共同點:

都和cpu的匯流排相連(通過它們所在的晶元處理)

cpu對它們進行讀或寫的時候都能通過控制線向它們所在的晶元發出埠讀寫命令。

那cpu是如何知道這些晶元的存在呢?

筆者個人猜測是主機板制訂的某些基礎規範,哪些裝置該接哪些介面,先保證系統的正常啟動;然後有些通用的多樣化的裝置,可以讓商家自行定製驅動程式,交由作業系統來讀寫。

那我們該如何使用這些晶元呢?

cpu會將已知的這些晶元上的暫存器進行統一編址,建立乙個統一的埠位址空間(這裡的埠就是代指可訪問的晶元上的暫存器),每個埠(晶元)在埠位址空間內都有乙個位址。

在學完這章節後,我們能知道cpu可以直接從以下三個地方讀取資料:

cpu內部的暫存器

記憶體單元(記憶體)

埠cpu最多可以定位 *64kb(0~65535)個不同的埠,埠位址和記憶體位址一樣可以通過位址匯流排進行傳輸。

埠的讀寫命令僅兩條:

in al||ax, 埠位址

out 埠位址, al||ax

但是和記憶體訪問指令的流程相差無幾:

mov ax, ds:[0ah]
cpu通過位址匯流排將位址資料 0ah 發出(注意,這個資料在硬體裡是乙個持續性的電壓,不是一次性的,請注意,不然會想不通cpu怎麼知道把位址資料發到**的問題,有興趣的可以閱讀我的計算機組成原理筆記)

cpu通過控制匯流排發出記憶體讀命令(也是乙個電壓),選中指定得儲存器晶元,並通知他將要讀取資料

存器將0ah號單元中得資料通過資料線送入cpu

in al, 60h
cpu通過位址匯流排鎖定埠位址為60h的埠

cpu通過控制匯流排發出埠讀命令,選中埠所在的晶元,並通知他將要讀取資料

埠所在的晶元將60h號埠中得資料通過資料線送入cpu

注意埠的讀寫指令裡,只能使用ax或al來存放從埠中讀入的 或 要傳送到埠的資料。訪問8位埠時用al,訪問16位埠時用ax。

另外對0~255以內的埠進行讀寫時:

in al, 20h

out 20h, al

對256~65535的埠進行讀寫時,埠號放在dx中:

mov dx, 3f8h

in al, dx

out dx, al

將乙個暫存器或記憶體單元中的資料向左移位

最後移出的一位寫入cf中(當移動n位時,cf裡只儲存最後乙個移出的資料)

最低位用0補充

舉個例子:

; 移動1位的例子

; 原資料

mov al, 01001000b

; 左移1位

; 原始資料 0100 1000

; 左移1位 01001 000

; 低位0補齊 1001 0000

; 由於移動了1位,最高位就是這個被移出的資料,故cf=0

shl al, 1

;結果(al) = 10010000b

; 移動2位的例子

; 原資料

mov cl, 2

mov al, 01001000b

; 原始資料 0010 1000

; 左移2位 010010 00

; 低位0補齊 0010 0000

; 由於移動了2位,最後一位就是這個被移出的資料,故cf=1

shl al, 2

;結果(al) = 00100000b

注意,移位在數學邏輯上相當於乘2,移動一次,n = n * 2,移動三次就相當於 n = n * 2 ^ 3 = ((n * 2) * 2) * 2

將乙個暫存器或記憶體單元中的資料向右移位

最後移出的一位寫入cf中(當移動n位時,cf裡只儲存最後乙個移出的資料)

最高位用0補充

這裡就不多介紹了,和邏輯左移一樣。另外計算機裡除開邏輯左移、邏輯右移還有乙個叫做算術右移(sar指令)(算術左移和邏輯左移一樣就不講了)。該指令相較於邏輯右移,僅在第三步 最高位補充上有所不同:

邏輯右移

算術右移

步驟一將乙個暫存器或記憶體單元中的資料向右移位

同邏輯右移

步驟二將最後移出的一位寫入cf中(當移動n位時,cf裡只儲存最後乙個移出的資料)

同邏輯右移

步驟三最高位用0補充

原最高位如果是1,那麼此時用1補充;否則用0補充

記憶體單元01

2345

6789

資訊秒分時

日月年以上的資料都是採用bcd碼的方式存放。

bcd碼簡單來說就是用四個二進位制位表示乙個10進製(0~9)。但是四個二進位制位每一位上代表的含義可以不同,比如我們傳統的認知——第一位表示1,第二位表示2,第三位表示4,第四位表示8,這種表示方法叫做8421bcd碼,此時十進位制8就用1000來表示;如果第一位表示1,第二位表示2,第三位表示4,第四位表示2,那麼這種表示方法就叫2421bcd碼,此時十進位制 7 就用 * 1110*表示。

舉個例子:

從cmos ram的8號單元中讀取當前月份的bcd碼

assume cs:codesg

codesg segment

start:

mov al, 8

out 70h, al

in al, 71h

mov ax, 4c00h

int 21h

codesg ends

end start

從cmos ram的8號單元中讀取當前月份 輸出在螢幕上

; 呼叫21h的02號功能

; 大全上說02號功能沒有返回引數??其實是有的,就是列印出來的字元的ascii碼

assume cs:codesg

codesg segment

start:

mov al, 8

out 70h, al

in al, 71h

mov ah, al

mov cl, 4

shr ah, cl

and al, 00001111b

add al, 30h

add ah, 30h

; 儲存一下,因為呼叫02h功能好像會在al輸出輸入的引數

mov bl, al

mov dl, ah

mov ah, 02h

int 21h

mov al, bl

mov dl, al

mov al, 0

mov ah, 02h

int 21h

mov ax, 4c00h

int 21h

codesg ends

end start

第十四章約束

約束 constraint 是一種保證資料完整性的規則。約束設定在單個字段或者多個字段組合上,寫入這些欄位的行資料必須要符合約束的規則 約束的五種型別 not null 非空約束,指定某列的所有行資料不能包含空值 unique 唯一性約束,指定列或者列的組合的所有行資料必須唯一 primary ke...

第十四章 約束

第十四章 約束 練習1 1.學校有乙個選課系統,其中包括如下關係模式 系 系編號 主鍵,系名稱 唯一鍵,系主任 非空約束,系所在校去 取值範圍只能在南湖校區和渾南校區 create table xi xi no varchar2 10 primary key,xi name varchar2 10 ...

第十四章 集合

1.集合 把個數不定的物件一起帶著走 集合是乙個存放任意數量的引用的物件的容器 多個物件放在另乙個物件中,此物件可成為乙個集合物件 注意 如果集合物件建立時不指定泛型,則在當前集合中可以存放任意型別的物件 包括 collection list set map list 介面的實現類有arraylis...