REJESTRY Procesor, a ściślej ALU, pracuje jedynie na danych zgromadzonych w rejestrach, więc żeby procesor wykonał jakieś działanie, trzeba najpierw załadować rejestry, później odczytać znajdujący się w nich wynik. W praktyce jest to szereg komórek pamięci, które znajdują się w obudowie procesora a nie na zewnątrz, w osobnym układzie scalonym. Grupy tych komórek mają ściśle określone nazwy i przeznaczenie. Wszystkie mają rozmiar 16 bitów. Oto ich schematyczna postać: bit: 15
7
AH BH CH DH
0
AL BL CL DL
Akumulator AX Rejestr bazowy BX Rejestr zliczający CX Rejestr danych DX
SP BP SI DI
Wskaźnik stosu Wskaźnik bazy Rejestr indeksowy źródła Rejestr indeksowy przeznaczenia
CS DS. SS ES
Rejestr segmentowy programu Rejestr segmentowy danych Rejestr segmentowy stosu Rejestr segmentowy dodatkowy
IP FLAGS
Wskaźnik programu Rejestr znaczników (flag)
A oto ich przeznaczenie : Rejestry AX,BX,CX,DX są rejestrami ogólnego przeznaczenia. Są wykorzystywane do przechowywania danych, wykonywania operacji logicznych arytmetycznych itp. AX wykorzystywany głównie do operacji arytmetyczno logicznych, BX wykorzystywany przy adresowaniu pamięci CX wykorzystywany jako licznik DX wykorzystywany przy operacjach mnożenia i dzielenia, a także do wysyłania i odbierania danych z portów. Każdy z nich można traktować jako parę rejestrów ośmiobitowych (np. AL i AH). Oto przykład Rejestr AL zawiera wartość l0h Rejestr AH zawiera wartość 2Bh Z tego wynika że rejestr AX zawiera wartość 2B10h Do każdego z tych 8-bitowych rejestrów istnieje niezależny dostęp. W komputerach 32-bitowych rejestry EAX,EBX,ECX,EDX pełnią rolę rejestrów ogólnego przeznaczenia. Podobnie jak powyżej, istnieje dostęp do bajtu (AH lub AL), słowa (AX) lub podwójnego słowa (EAX).
Rejestry SP i BP (ESP i EBP) są rejestrami wskaźnikowymi, są używane do adresowania pamięci. Rejestry SI,DI (ESI, EDI) służą do adresowania danych w zasięgu segmentu, SI indeksują pamięć oraz wskazują obszar z którego przesyłane są dane. DI indeksują pamięć oraz wskazują obszar do którego przesyłane są dane. Rejestr CS wskazuje segment programu, z którego pobierane są rozkazy do wykonania. Rejestr DS wskazuje segment, w którym znajdują się dane zdeklarowane w programie. Rejestr ES wskazuje dodatkowy segment danych. Rejestr SS wskazuje segment, w którym jest zdefiniowany stos. Rejestr IP (EIP) wskazuje aktualnie wykonywaną instrukcje programu. Rejestr Flags jest słowem, którego kolejne bity są ustawiane w zależności od zaistnienia jakiegoś zjawiska. W komputerach 32-bitowych sprawy nieco się komplikują. Oto obraz rejestrów procesorów typu 80386, i486 oraz Pentium: bit: 31 15 7 0 AH AL Akumulator EAX (AH i AL dają AX) Rejestr bazowy EBX (BH i BL dają BX) BH BL Rejestr zliczający ECX (CH i CL dają CX) CH CL Rejestr danych EDX (DH i DL dają DX) DH DL SP BP SI DI
Wskaźnik stosu ESP Wskaźnik bazy EBP Rejestr indeksowy źródła ESI Rejestr indeksowy przeznaczenia EDI
CS DS SS ES FS GS
Rejestr segmentowy programu Rejestr segmentowy danych Rejestr segmentowy stosu Rejestr segmentowy dodatkowy
IP
Wskaźnik programu EIP
FLAGS MSW CR2 CR3
Rejestr znaczników(flag) EFLAGS CR0 blok rejestrów sterujących pracą procesora
DR0 DR1 DR2 DR3 DR4 DR5 DR6 DR7
DR0-DR7: zbiór rejestrów uruchomieniowych, służących sterowaniu pułapkami sprzętowymi
TR6 TR7
Rejestry testujące pamięć asocjacyjną
Bit:47
0 GDTR IDTR
Rejestry systemowe LDTR TR
15
0
Rejestry GDTR i LDTR służą do ustalania adresów globalnych i lokalnych tablic deskryptorów Rejestr TR służy do przechowywania segmentu stanu aktualnie wykonywanego zadania. Rejestr IDTR służy do przechowywania adresu tablicy deskryptorów przerwań. Bajt znaczników: X X X X
OF DF IF TF SF ZF
X
AF
X
PF
X
CF
x - nie używane nastąpiło przeniesienie parzystość przeniesienie pomocnicze zero znak praca krokowa zezwolenie na przerwanie znacznik kierunku nadmiar (przepełnienie)
A oto przykłady : 1. Gdy dodajemy do siebie dwie liczby, załóżmy binarne, to w momencie gdy wyniku nie da się przedstawić na zadanej liczbie bitów, ustawiany jest znacznik CF: 1010 1110 +0111 0100 1 0010 0010 liczba przekracza 8 bitów = CF = 1
2. Gdy wykonane działanie, czy to arytmetyczne, czy też logiczne, da nam wynik o parzystej liczbie bitów o wartości 1, ustawiany jest znacznik PF 0010 1100 +1101 1101 1101 1101 6 bitów ustawionych =PF =1
3. gdy w wyniku działania na liczbach w kodzie BCD nastąpi przeniesienie z bitu 3 na 4 lub wystąpiła pożyczka z bitu 4 na 3 , ustawiany jest wskaźnik AF. 0010 1110 + 0111 0100 1010 0010 nastąpiło przeniesienie=AF=1 4. gdy wynik dowolnego działania jest równy 0, ustawiany jest znacznik ZF. 5. gdy najbardziej znaczący bit w wyniku dowolnego działania jest ustawiony, ustawiany jest także znacznik SF. Ma to znaczenie gdy operujemy na liczbach binarnych ze znakiem. Znacznik ten jest zgodny z bitem znaku. 6. gdy podczas jakiegokolwiek działania nastąpiło przeniesienie lub pożyczka z bitu znaku, to znacznik OF jest ustawiany. Ta flaga jest szczególnie istotna, gdy operujemy na liczbach ze znakiem. 7. gdy znacznik IF jest ustawiony, przerwanie maskowalne nią będzie wykonywane. Gdy IF=0 , procesor może wykonać skok do adresu obsługi przerwania. W komputerach 32-bitowych rejestr Eflags jest nieco rozszerzony i wygląda następująco (opisano jedynie nowe): VM RF N IOPL OF DF IF TF SF ZF MM T
X
AF
X
PF
X
CF
| x - nie używane znacznik poziomu ochrony wejścia/wyjścia znacznik zadania zagnieżdżonego znacznik wznowienia znacznik trybu wirtualnego
Rejestr CR0 służy do sterowania procesora i wygląda następująco: 31 PG x x x x..
0 x x ET TS K M PE M P
x - nie używane bit trybu wirtualnego bit monitorowania kooprocesora bit trybu emulacji kooprocesora bit przełączania zadania bit typu kooprocesora bit stronicowania