1.5 Rejestry procesora

Procesor podczas wykonywania instrukcji posługuje się w dużej części pamięcią RAM. Pobiera z niej kolejne instrukcje do wykonania i dane, jeżeli instrukcja operuje na jakiś zmiennych. Poza pamięcią operacyjną procesor równie często podczas wykonywania instrukcji odwołuje się do swoich wewnętrznych rejestrów. Operowanie na wewnętrznych rejestrach jest znacznie szybsze niż odwoływanie się do pamięci operacyjnej. Pisząc programy w asemblerze trzeba więc tak planować kod, aby zmienne, które często są używane znajdowały się w rejestrach.

Rejestr jest elektronicznym układem pamięciowym, który zwykle ma niewielką pojemność kilkunastu bitów. Służy praktycznie, jak każda pamięć w komputerze, do przechowywania wartości liczbowych. W niektórych przypadkach są to zwykłe liczby będące parametrami funkcji matematycznych, a czasami są to rejestry, za pomocą których możemy sterować pracą procesora zmieniając stany ich pojedynczych bitów. Pierwszą i najważniejszą grupą rejestrów są rejestry ogólnego przeznaczenia GPR (General Purpose Registers). W standardowych procesorach zgodnych z architekturą x86 jest ich 4.

Nazwa ilość bitów opis
AX 16  (accumulator) rejestr akumulatora
BX 16  (base) rejestr bazowy
CX 16  (count) rejestr licznika
DX 16  (data) rejestr danych

Nazwy rejestrów są dość łatwe do zapamiętania ponieważ pierwsza litera pochodzi od angielskiego słowa oznaczającego ich funkcje, a dodatkowo dziwnym zbiegiem okoliczności są to kolejne litery alfabetu. Wszystkie rejestry GPR są rejestrami szesnastobitowymi, ale można się niezależnie odwoływać do każdej z ich 8 bitowych połówek.

Każdy z rejestrów GPR dzieli się na dwa rejestry opisujące jego starszą High i młodszą Low część co przedstawia poniższa tabela.

Nazwa starsza część młodsza część
AX AH AL
BX BH BL
CX CH CL
DX DH DL

Rejestr AX stosuje się przeważnie do większości obliczeń. Jest to standardowy rejestr w którym są umieszczane wyniki niektórych operacji arytmetycznych.

Rejestr DX również często stosuje się do przechowywania wyników niektórych operacji (przykładowo mnożenie), jeżeli wynik nie mieści się w zakresie rejestru AX.

Rejestr CX stosowany jako licznik w pętlach programowych i w instrukcjach powtórzeniowych.

Rejestr BX stosowany bardzo często do indeksowania pamięci czyli przechowuje adresy.

Dzięki podzieleniu rejestrów na połówki realizowanie niektórych algorytmów jest znacznie łatwiejsze. Jeżeli wpiszemy przykładowo do rejestru AX wartość 45C1h, to w rejestrze starszym AH zapisana zostanie wartość 45h, a w młodszym C1h. Możliwe jest używanie rejestrów 8 bitowych jako niezależnych rejestrów lub używanie całego rejestru do przechowywania wartości 16 bitowych.

W procesorze znajdują się dodatkowo rejestry segmentowe.

Nazwa ilość bitów opis
CS 16  segment kodu
DS 16  segment danych
ES 16  segment dodatkowy
SS 16  segment stosu

Wszystkie one są 16 bitowe i nie można ich dzielić na połowy. Rejestrów tych używa się przy adresowaniu pamięci. Każdy z rejestrów segmentowych jest załadowany wartością, która określa pewien obszar pamięci. Po odpowiednim ich użyciu możemy pobierać i zapisywać do tych obszarów dane.

Rejestry wskaźnikowe:

Nazwa ilość bitów opis
SI 16  wskaźnik źródła
DI 16  wskaźnik celu
BP 16  wskaźnik bazy
SP 16  wskaźnik stosu
IP 16  wskaźnik instrukcji

Rejestry wskaźnikowe w połączeniu z rejestrami segmentowymi służą do określania adresów w pamięci. Dlaczego do adresowania pamięci używany jest zestaw dwóch rejestrów opiszę w innym miejscu.

SI (Source Index), DI (Destination Index), para rejestrów używanych przede wszystkim do instrukcji procesora, które w sposób automatyczny operują na danych. Dodatkowo używany jest wtedy również rejestr licznika CX. Rejestr SI używany jest wtedy jako adres źródłowego ciągu danych, DI jako adres wynikowego ciągu danych, a CX określa rozmiar.

Rejestry SP (Stack Pointer), BP (Base Pointer) używane są najczęściej do struktury pamięci nazywanej stosem. O stosie trochę więcej napiszę w innym rozdziale.

Rejestr IP (Instruction Pointer) wraz z CS wskazuje adres następnej instrukcji, jaka zostanie wykonana przez procesor.

Teraz chciałbym jeszcze wprowadzić jeden rejestr, bez którego nie można by było się obejść budując pętlę programową. Jest to rejestr flag (Flag Register) oznaczany jako Flags. Rejestr flag jest 16 bitowym rejestrem, w którym każdy bit oznacza zaistnienie określonej sytuacji. Tak więc każdy jego bit trzeba rozpatrywać osobno.

Numer bitu 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Nazwa - - - - OF DF IF TF SF ZF - AF - PF - CF

CF (Carry Flag ) - Flaga ustawiona jeżeli w poprzedniej operacji nastąpiło przeniesienie. Czyli wynik operacji nie mieści się w rozmiarze zmiennej.

PF (Parity Flag) - Flaga parzystości. Ustawiona jeżeli ilość bitów o wartości 1 w mniej znaczącym bajcie (low) wyniku ostatniej operacji jest parzysta.

AF (Auxillary Flag) - Flaga wykorzystywana głównie przy operacjach na liczbach w formacie BCD. Ustawiona gdy w ostatniej operacji nastąpiło przeniesienie z bitu 3 na bit 4 lub pożyczka z bitu 4 na bit 3.

ZF (Zero Flag) - Flaga zera. Jeżeli wynik ostatniej operacji wynosił zero flaga zostaje ustawiona. W przeciwnym przypadku jest wyzerowana.

SF (Sign Flag) - Flaga znaku. Przyjmuje wartość najbardziej znaczącego bitu z wyniku ostatniej operacji.

TF (Trap Flag) - Ustawienie bitu oznacza tryb pracy krokowej procesora co oznacza, że po każdej wykonanej instrukcji procesor wykonuje określoną procedurę. Wyzerowana flaga oznacza normalny tryb pracy procesora.

IF (Interrupt Flag) - Ustawienie flagi oznacza, iż program może być przerywany przez zewnętrzne przerwania i procesor przechodzi wtedy do procedur ich obsługi (jest to normalny tryb pracy CPU). Wyzerowanie tej flagi oznacza zablokowanie obsługi przerwań zewnętrznych.

DF (Direction Flag) - Flaga określająca kierunek działania niektórych automatycznych instrukcji. Ustawiona flaga oznacza, że wybrany został kierunek o rosnących adresach.

OF (Overflow Flag) - Ustawiony bit oznacza, że w ostatniej operacji nastąpiło przeniesienie na bit znaku lub nastąpiła pożyczka z tego bitu.

Nie chciałem szczegółowo opisywać każdego z rejestrów ponieważ i tak większość z tych informacji zdążylibyście zapomnieć, zanim pokazałbym, jak się pisze programy. Przedstawiłem więc tylko ogólnie, jakie są podstawowe grupy rejestrów i do czego są przeważnie stosowane. Ich możliwości i dokładne zastosowanie będziecie mogli poznać w części, w której przedstawię pierwsze podstawowe programy.