Memory-mapped I/O
Rejestry urządzeń leżą w tej samej przestrzeni adresowej co pamięć, więc zwykły zapis pod adres może zapalić diodę.
Zamiast osobnych instrukcji wejścia-wyjścia — IN i OUT w x86, czyli port-mapped I/O — procesor czyta i zapisuje wybrane adresy, które trafiają nie do RAM-u, lecz do UART-a, timera lub portu GPIO. Tak działa każdy mikrokontroler z rdzeniem ARM, podobnie karty PCIe w komputerze, których rejestry widać w oknach adresów fizycznych.
Pułapka w C polega na tym, że kompilator uważa to za zwykłą pamięć. Dwa kolejne zapisy pod ten sam adres zostają scalone, a odczyt w pętli wyniesiony przed pętlę. Dlatego wskaźniki do rejestrów deklaruje się jako volatile, a na procesorach z buforami zapisu czasem potrzebna jest bariera pamięci, by zachować kolejność. Komputery domowe, jak Commodore 64, robiły to samo — dlatego PEEK i POKE potrafiły sterować dźwiękiem i grafiką.