出處:http://home.educities.edu.tw/wanker742126/asm/ch28.html
在 IBM PC 相容電腦裏,所有的周邊設備都是藉著輸出入埠和 CPU 相連,IBM PC 共有 65536 個輸出入埠,由編號 0000H 到 0FFFFH,其編排方式有點像一個區段的記憶體,但要寫入或讀取卻完全不同,有些輸出入埠只能讀不能寫,有些只能寫不能讀,有些可寫可讀,都跟和那一種周邊設備有關。每一種周邊設備使用數個輸出入埠與 CPU 相連,當然 PC 提供了六萬多個輸出入埠,而周邊設備不可能有這麼多,所以有許多輸出入埠是空下來的,並沒有使用。例如下表就是 PC/XT 常用的周邊裝置與相對應的輸出入埠。( PC/AT 與 PC/XT 的 I/O 埠稍微不同 )
| PC/XT I/O埠 | 周邊裝置 | 描 述 |
| 00~0F | 8237A-5 DMA 控制晶片 | 8237A-5 是用來加速記憶體和周邊裝置 ( 如硬碟 ) 之間的資料傳送 ( 註一 ) |
| 20~21 | 8259A 中斷控制器 | 負責管理中斷及中斷請求 ( IRQ ) |
| 40~43 | 8253-5 計時器 | 內含三個計時器,見下一章 |
| 60~63 | 8255A-5 PPI | 8255A 是一種可程式周邊界面晶片 ( Programmable Peripheral Interface,即 PPI ),通常鍵盤與喇叭接在這個晶片上。意即可經由程式控制鍵盤與喇叭。 |
| 200~20F | JOYSTICK | 一般用來接搖桿,玩電玩用 |
| 278~27F | 第二個平行埠 | 即 PARALLEL 2 或 LPT 2,一般用來接 KEY PRO |
| 2F8~2FF | 第二非同步埠 | 即 COM 2 或第二個 RS-232,一般用來接數據機或滑鼠 |
| 378~37F | 第一個平行埠 | 即 PARALLEL 1 或 LPT 1,一般用來接印表機 |
| 3F8~3FF | 第一非同步埠 | 即 COM 1 或第一個 RS-232,一般用來接數據機或滑鼠 |
回想以前,還未有 PnP 的時代裏,假如您想自己組裝電腦的話,一定要知道該周邊設備所使用的輸出入埠編,或者有些周邊裝置可以自行調整輸出入埠,使得所有的周邊裝置都有獨一無二的輸出入埠,這樣插入擴充槽後才能正常使用。假如有任何兩個周邊裝置使用相同的輸出入埠,或者有部份重疊,那麼下場只有兩種,不是不能開機,就是不能正常運作。
回歸正傳,寫程式時如果要在螢幕上顯示某一個字元,由印表機印出一份文件,甚至由鍵盤輸入一個字……時,我們怎麼做?大多數的人都是藉由 INT 中斷服務程式來替我們完成,但實際上這些中斷程式是藉由輸出入埠和周邊設備 ( 顯示器、印表機、鍵盤…… ) 溝通。這些都是因為 DOS 或 Win 9x 都已經寫好這些服務程式,我們只需拿來用就好了,假如我們有足夠的資料,我們也能自行控制這些輸出入埠,達到上述目的。
當我們改變某個輸出入埠內的資料,其實就是送某個資料到相對應的周邊設備去,而周邊設備就能依照我們的要求做動作,例如在螢幕上印出一個字。相反的假如要讀取某個周邊設備的狀態,也是利用輸出入埠把其內的資料傳回來。80X86 CPU 提供底下兩個指令用來溝通輸出入埠的。
OUT 指令
語法是:
out dx,al out 輸出入埠編號,al out dx,ax out 輸出入埠編號,ax
OUT 指令是把一個位元組或一個字組長度的資料送到輸出入埠,所送出的資料放在 AL 或 AX 暫存器。送出到那一個輸出入埠則由 DX 暫存器指定,或者也可以直接用輸出入埠編號指定。
IN 指令
語法是:
in al,dx in al,輸出入埠編號 in ax,dx in ax,輸出入埠編號
IN 指令和 OUT 指令恰好相反,是把輸出入埠的資料傳回 AL 或 AX 暫存器中。輸出入埠編號可以直接寫出來也可以放在 DX 暫存器中。
電腦的周邊設備很多,而每一種周邊設備的輸出入埠操作方法不同,而且有時候不當的數值會使周邊設備不正常運作,甚至當機,加上現在電腦產品的技術資料幾乎無法取得,因此輸出入埠的使用常蒙上一層神祕的陰影,小木偶就將手邊現有的資料與大家分享。( 小木偶參考民國 83 年 4 月份第三波雜誌林錦瑞先生的文章 (第 16 頁 )、 CMOS Registers 以及 Marc Feeley 的網頁。)
CMOS
CMOS 資料
CMOS ( complementary metal oxide semiconductor 的簡寫,是指互補金金氧化物半導體 ) 是一種耗電很低的記憶體,它是用來儲存電腦中的基本設備,例如硬碟數目及形式、軟碟數目及形式、記憶體大小、顯示器等等,還有像計時這種隨時改變的資料。CMOS 是靠電腦內的電池供應電流,所以即使電腦的電源關掉,其內的資料也不會流失,但是如果電池沒電,CMOS 的資料就後不正確,必須重設,幸好 CMOS 使用的電池是可充電的鋰電池,只要您常使用電腦,就能在使用時同時充電,所以不必擔心這種問題。
IBM PC/XT 等級的電腦是沒有 CMOS,到了 IBM PC/AT 電腦才配備了 CMOS,採用的是 MC146818A 晶片,可存放有 64 位元組的資料。而 386 機種通常是把它整合到其他晶片中 ( 例如 82C206 晶片 ),容量也擴充到 128 到 256 位元組。
CMOS 的資料看得見嗎?這是當然的,在電腦一開機時,會出現像底下的畫面,就是依據 CMOS 內的資料顯示於螢幕上的。
除了在開機時能看到外,您也可以在開機時尚未進入作業系統前,進入 BIOS 設定程式,也可以看到記錄於 CMOS 內的內容。在這一節裏,小木偶將要以自己製作的程式來讀取 CMOS,當然也可寫入 ( 設定 BIOS 時,其實就是修改 CMOS 的內容 ),但是這是很危險的,因為設定值不對很容易造成當機。
要寫程式顯示 CMOS 的資料,要先了解其內容。小木偶只找到前 64 個位元組的資料,如下表:
| 偏移位址 | 意義 |
| 00H~0DH | 即時時鐘 ( realtime clock ) |
| 0EH | 診斷狀態 ( diagnostic status ) |
| 0FH | 開機狀態 ( reat code ) |
| 10H | 軟碟機型式 ( diskette type ) |
| 11H | 保留 |
| 12H | 硬碟機型式 ( harddisk type ) |
| 13H | 保留 |
| 14H | 設備狀態 ( equipment status ) |
| 15H~16H | 傳統記憶體大小 ( base memory ) |
| 17H~18H | 延伸記憶體大小 ( extended memory ) |
| 19H | 第一台硬碟型態 ( first HD type ) |
| 1AH | 第二台硬碟型態 ( second HD type ) |
| 1BH~2DH | 保留 |
| 2EH~2FH | 記憶體之查核值 ( check sum ) |
| 30H~31H | 延伸記憶體大小 ( extended memory ) |
| 32H | 世紀數 ( BCD 格式 ) |
| 33H | 啟動旗標 |
| 34H~3FH | 保留 |
用 OUT/IN 指令寫入或讀取 CMOS
電腦是以 70H 與 71H 兩個輸出入埠與 CMOS 溝通,當要讀取 CMOS 的某個位址時,先把該位址填入埠 70H,然後再由埠 71H 讀取該位址之資料。舉例來說,要讀取『世紀數』,可以用下面程式:
mov al,32h
out 70h,al
in al,71h 這樣,CMOS 的位址 32H 的數值就在 AL 暫存器裏。同理,要改寫世紀數,也是要把 CMOS 的位址填入埠 70H,再把要改寫的世紀值輸出到埠 71H,如下面程式
mov al,32h
out 70h,al
mov al,20h
out 71h,alCMOS 內的一些欄位說明
小木偶就自己所收集到的資料,說明在 CMOS 內的資料意義。
位址 00H ~ 0DH 表示即時時鐘,其內容請看下表:
| 位址 | 意義 | 位址 | 意義 |
| 00H | 秒 | 07H | 日 |
| 01H | 08H | 月 | |
| 02H | 分 | 09H | 年 |
| 03H | 0AH | ||
| 04H | 小時 | 0BH | |
| 05H | 0CH | ||
| 06H | 星期 | 0DH |
位址 0EH 表示診斷狀態,這個位元組各位元的意義是
| 位元 | 意義 |
| 7 | 電池狀態 |
| 6 | 查核值狀態 |
| 5 | 結構狀態 |
| 4 | 記憶體大小記錄狀態 |
| 3 | 硬碟狀態 |
| 2 | 即時時鐘狀態 |
| 1 | 保留 |
| 0 | 保留 |
當位元值為一時,表示該項正常。例如位元七為一,表示電池正常,若為零,表示電力不足。
位址 10H 表示軟碟機型式,這個位元組被分成兩部份,較高的四個位元表示軟碟機 A: 的型式;較低的四個位元表示軟碟機 B: 的型式。雖然每個軟碟機被分配到四個位元組,共可以表示 16 種不同型式的軟碟機,但事實上,市面上所販賣的磁碟機只有五種而已,如下表:
BIT 值 軟碟機型式 -------------- 0000 未裝置該軟碟機 0001 5.25 吋 360K 軟碟機 0010 5.25 吋 1.2M 軟碟機 0011 3.5 吋 720K 軟碟機 0100 3.5 吋 1.44M 軟碟機 0101 3.5 吋 2.88M 軟碟機
位址 12H 是表示硬碟機的型態,同軟碟機類似,此位元組也分成兩部分,較高的四個位元組是表示第一台硬碟型式,較低的四個位元組是表示第二台硬碟型式,如果為 0000 表示該硬碟不存在,不為零,表示該硬碟型式。因為每台硬碟被分到四個位元組,故可表示 16 種型式的硬碟,但是硬碟發展遠較軟碟快速,從最先 IBM XT 所配備的 20MB 硬碟,到現在 80G 的硬碟,故可知這十六種型式,根本不夠用,所以這四個位元如果是『1111』的話,表示要到位址 19H 或 1AH 去取得真正的硬碟型式。但後來大概是真的發展太快,又加上不再使用磁軌、磁區、磁面來表示硬碟型式,都改用 TYPE 46,由使用者定義,後來更進一步由 BIOS 自己偵測。
位址 14H 是表示設備狀態,位元 7、6 表示軟碟機數目。位元 5、4 表示顯示卡種類:
位元5 位元4 顯示卡 ------------ 0 0 EGA/VGA 0 1 40 行 CGA 1 0 80 行 CGA 1 1 MGA ( 單色卡 )
位元 2、3 保留。位元 1 表示是否有浮點運算器,1 表示有,0 表示沒有。位元 0 表示是否有磁碟機 A:,1 表示有,0 表示沒有。
位址 15、16 這兩個位元組表示傳統記憶體大小,單位是 1KB,即 1024 個位元組為單位。舉例來說,若位址 15、16 的內容分別是 80H、02H,表示有 280HKB,換成十進位即 640KB。
位址 17、18 這兩個位元組表示延伸記憶體大小,單位是 1KB。
GoMCU