1.2 Podstawy

Procesory z rodziny x86 stosowane są najczęściej do komputerów klasy PC. Poznając specyfikę języka asemblera tej rodziny jesteśmy zmuszeni do poznania budowy i działania całego procesora ponieważ współpracuje on z całym szeregiem innych układów cyfrowych wchodzących w skład samego komputera.

Instrukcje asemblera służą przede wszystkim do wydawania poleceń, które w wyniku mają dać realizacje przez komputer określonego zadania. To ogólne stwierdzenie, ale powstaje od razu pytanie, jakie to są polecenia, czyli co komputer ma w środku i jakie operacje jest w stanie wykonywać. To jest klucz do umiejętności dobrego programowania w asemblerze. Czyli dobre poznanie urządzeń znajdujących się w obudowie komputera. Idąc od zupełnych podstaw za wykonywanie rozkazów odpowiedzialny jest procesor zwany skrótowo z angielskiego CPU (Central Processing Unit). Pobiera on algorytm w postaci kodu maszynowego i wykonuje kolejne instrukcje działając odpowiednio na zewnętrzne układy komputera. W procesorze znajduje się główne centrum sterowania całym komputerem. Tak więc nie ma się co dziwić, że jego budowa i sposób działa zostały opisane przez firmę Intel w 3 tomach zajmujących w sumie ponad 4 tysiące stron. Na szczęście znajomość nawet tylko 10% tej wiedzy może uczynić z nas bardzo dobrego programistę asemblera.

Procesor zajmuje się przede wszystkim wykonywaniem instrukcji. Kod źródłowy całego programu, jak i inne dane potrzebne procesorowi, zapisane są w pamięci komputera. Z pewnych względów dokonał się podział pamięci na różne miejsca składowania. Tak więc pamięć możemy podzielić na pamięć operacyjną zwaną potocznie RAM (pamięć ulotna) i pamięć masową zwaną również pamięcią stałą. Pamięć masowa jak sama nazwa wskazuje służy przede wszystkim do magazynowania bardzo dużej ilości danych, które nie są aktualnie potrzebne CPU w jego pracy. Dostęp do tych pamięci jest znacznie wolniejszy i bardziej złożony niż do pamięci operacyjnej RAM (Random Access Memory). W pamięci operacyjnej znajdują się dane i kod programu aktualnie wykonywanego. Dostęp do pamięci RAM jest bardzo szybki, ale jej cena jest znacznie wyższa niż pamięci masowych, tak więc na pewno mamy jej w komputerze trochę mniej. Z punktu widzenia CPU dostęp do pamięci RAM jest jedną z jego podstawowych potrzeb.

Jako, że na płycie głównej pamięci RAM znajdują się w znaczącej odległości od samego procesora to wbudowano w niego szereg niedużych bloków pamięci działających jeszcze szybciej niż pamięć RAM. Te komórki pamięci zwane są rejestrami i mają zwykle bardzo specyficzne zastosowanie. Takich rejestrów w procesorze jest obecnie bardzo dużo, a w większości każdy z nich ma inną funkcję. Z tego też wynika ilość stron dokumentacji takiego procesora. Do podstawowej wiedzy pozwalającej programować w asemblerze potrzebne będzie nam poznanie zaledwie kilkunastu takich rejestrów. Większość kodu napisanego w asemblerze będzie się opierała na umiejętności racjonalnego wykorzystania rejestrów. Dzięki temu nasze programy będą szybsze i będą zajmowały mniej miejsca w pamięci. 

Poza samym procesorem w komputerze znajduje się cała masa urządzeń tj. karty graficzne, muzyczne, chipsety, liczniki, dyski twarde i inne kontrolery. Komunikacja z tymi urządzeniami odbywa się w bardzo podobny sposób jak dostęp do pamięci RAM. Wszystkie te urządzenia połączone są między sobą serią ścieżek nadrukowanych na płytę główną. Te wszystkie połączenia dzieli się na 3 podstawowe grupy, które nazywa się magistralami lub też po prostu szynami. Tak więc rozróżniamy szyny:

  • - adresową
  • - danych
  • - sterującą

Szyna adresowa służy do adresowania rejestrów urządzeń lub adresowania komórek pamięci, do których chcemy uzyskać dostęp.

Szyna danych jest zestawem połączeń za pomocą których wysyłamy lub odbieramy dane z urządzenia zaadresowanego szyną adresową.

Szyna sterująca to właściwie cała reszta połączeń między urządzeniami. Są to głównie sygnały których obsługa w większości jest realizowana sprzętowo i programista nie musi znać ich specyfikacji. To głownie sygnały informujące o stanie urządzeń, np. czy urządzenie jest gotowe na przyjęcie danych lub określające kierunek przepływu sygnałów po szynie danych (zapis/odczyt).

W podsumowaniu przedstawię jak wygląda od strony CPU komunikowanie się z zewnętrznymi urządzeniami. Procesor widzi dwie tak zwane przestrzenie adresowe. Jedna przestrzeń jest to pamięć RAM, którą możemy zaadresować po przez szynę adresową i wymieniać z nią informację przez szynę danych. Pamięć RAM służy głównie do przechowywania danych i kodu programu. Druga przestrzeń jest to przestrzeń urządzeń wejścia/wyjścia I/O (Input / Output). Zwana potocznie jako porty. Ta przestrzeń ma stały rozmiar. Można ją identycznie jak w przypadku pamięci RAM adresować i wymieniać z nią dane. Przestrzeń portów I/O jest przestrzenią w której ściśle określone adresy odpowiadają odpowiednim rejestrom wewnętrznym innych urządzeń komputera. Tak więc odwołując się do pewnych adresów w tej przestrzeni możemy sterować pracą określonych urządzeń w komputerze. Co ciekawe, wykonując jedynie dwie operacje (odczyt i zapis) na określonych adresach w tej przestrzeni, możemy doprowadzić przykładowo do restartu komputera. W podobny sposób możemy restartować inne urządzenia między innymi klawiaturę. Zwykle jednak wykonuje się znacznie ciekawsze polecenia niż reset.

Poza dostępem do innych urządzeń procesor ma do dyspozycji bezpośredni dostęp do wszystkich własnych wewnętrznych rejestrów, za pomocą których może sterować swoją pracą. Opis rejestrów wewnętrznych CPU znajduje się w dalszych działach, ale jest to tylko opis podstawowych rejestrów. Jeżeli komuś to nie wystarczy, to w następnej kolejności polecam przeczytanie dokumentacji procesorów firmy Intel.