Porty obok przerwań stanowią najważniejszy sposób komunikacji z urządzeniami zewnętrznymi. I nie chodzi tutaj bynajmniej o porty szeregowe lub równoległe, chociaż mają one także pewien związek z tematem portów tutaj omawianych. Port jest to interfejs pomiędzy procesorem, a większością urządzeń zewnętrznych takich jak kontroler stacji dyskietek, porty szeregowe, równoległe, kontroler IDE, klawiatura, czy też karta graficzna. Każdy port posiada swój unikalny dwubajtowy numer, np. 0x3f0 (jeden z portów kontrolera stacji dyskietek).
000-01f - Kontroler DMA (Direct Memory Access)
020-03f - Kontroler przerwań 8259A
040-05f - Programowalny licznik 8253-5
060-06f - Kontroler klawiatury (klawiatura)
070-07f - Zegar czasu rzeczywistego, CMOS
0a0-0bf - Drugi kontroler przerwań 8259A
0c0-0df - Drugi kontroler DMA
170-177 - Port drugiego dysku twardego
1f0-1f7 - Port pierwszego dysku twardego
278-27f - Port równległy #2
2f8-2ff - Port szeregowy #2
370-377 - Kontroler drugiego napędu dyskietek
378-3ff - Port równoległy
3f0-3f7 - Kontroler napędu dyskietek
3f8-3ff - Port szeregowy
Podane numery portów mogą się w rzeczywistości różnic, w zależności od komputera oraz konfiguracji w BIOS'ie, jednak zwykle zgadzają się z powyższą listą.
W celu dostępu do portów procesor x86 oferuje odpowiednie instrukcje. Istnieje możliwość odczytu z portu po bajcie, słowie lub słowie podwójnym, jak również zapisu do portu.
Aby odczytać z portu, można posłużyć się instrukcją
IN PORT, WARTOŚĆ
aby zapisać
OUT PORT, WARTOŚĆ
Dla zainteresowanych odsyłam do dokumentacji Intela, lub strony na temat Assemblera z linków.
[1] Ralf Brown's Interrupt (i nie tylko) List - wersja do ściągnięcia zawierająca listę portów
[2] IntelR 64 and IA-32 Architectures Software Developer's Manuals