Programowanie w języku Assembler

Rejestry

Króciutki spis rejestrów procesorów 8086-80586.

Rejestry ogólnego przeznaczenia
Rejestry ogólnego przeznaczenia, jak sama nazwa wskazuje, mogą być używane w prawie dowolnym celu. Jednak ich nazwy sugerują zamierzone przez konstruktorów przeznaczenie.
Accumulator
Używany do operacji arytmetycznych i logicznych
32 - bitowy
EAX
16 - bitowy 
AX
8 - bitowe 
AH
AL
Base
Używany jako podstawa do wyznaczania adresu
32 - bitowy
EBX
16 - bitowy 
BX
8 - bitowe 
BH
BL
Counter
Używany do zliczania liczb przejść pętli (np. LOOP i REP)
32 - bitowy
ECX
16 - bitowy 
CX
8 - bitowe 
CH
CL
Data
Używany jako rejestr pomocniczy przy operacjach mnożenia i dzielenia oraz przy zapisie i odczycie z/do port.
32 - bitowy
EDX
16 - bitowy 
DX
8 - bitowe 
DH
DL

 

Jak widać w procesorze są tylko 4 rejestry ogólne, lecz można uzyskiwać dostęp do części z nich poprzez odwoływanie się do "podrejestrów"


O ile do rejestów 16-bitowych można odowłać się do obydwu jego części to nie można uzyskać w tak prosty sposób dostępu do obydwu części rejestrów 32-bitowych. (trzeba wykorzystać instrukcję BSWAP)


Rejestry stosu
Base Pointer
wskaźnik używany przy adresowaniu pamięci
32 - bitowy
EBP
16 - bitowy 
BP
Stack Pointer
wskaźnik stosu
32 - bitowy
ESP
16 - bitowy 
SP
Rejestry wskaźnikowe
Source Index
wskazuje miejsce w pamięci, skąd są przesyłane dane.
32 - bitowy
ESI
16 - bitowy 
SI
Destination Index
wskazuje miejsce w pamięci, dokąd są przesyłane dane.
32 - bitowy
EDI
16 - bitowy 
DI
Instruction Pointer
wskazuje następną instrukcję w segmencie.
32 - bitowy
EIP
16 - bitowy 
IP


Rejestry segmentu
Code Segment
wskazuje segment w pamięci, gdzie przechowywane są instrukcje
16 - bitowy
CS
Data Segment
wskazuje segment w pamięci, gdzie przechowywane są dane
16 - bitowy
DS
Stack Segment
wskazuje segment w pamięci, gdzie przechowywane są stos
16 - bitowy
SS
Extra Segment
wskazuje segment w pamięci, gdzie przechowywane są dane docelowe instrukcji łańcuchowych
16 - bitowy
ES
Rejestry segmentu (od 386+)
 
dodatkowy segment danych
16 - bitowy
FS
 
dodatkowy segment danych
16 - bitowy
GS


FLAGS - Przechowuje znaczniki różnych operacji. Jest to jeden rejestr, którego każdy bit ma określone znaczenie. W procesorach 8086-286 jest to rejestr 16 - bitowy. W procesorach 386+ jest to już rejestr 32 bitowy.


BitSymbolNazwaZnaczenie
0CF Carry FlagZnacznik przeniesienia (1 jeżeli nastąpiło przeniesienie z najbardziej znaczącego bitu)
11 
2PFParity FlagZnacznik parzystości (1 parzysta liczba bitów 1)
30 
4AFAuxiliary FlagZnacznik przeniesienia pomocniczego (1 jeżeli nastąpiło przeniesienie z 3 na 4 bit. Pomocne przy obliczaniu na liczbach w systemie BCD)
50 
6ZFZero FlagZnacznik zera (1 jeżeli otrzymano 0 w wyniku operacji)
7SF Sign FlagZnacznik znaku (1 jeżeli otrzymano liczbę ujemną w wyniku operacji)
8TFTrap FlagZnacznik pracy krokowej (1 po każdej wykonanej instrukcji procesora wywoływane jest jest przerwanie pracy krokowej)
9IFInterrupt FlagZnacznik zezwolenia na przerwanie (czy przerwanie sprzętowe ma być wykonywane natychmiast po zgłoszeniu, czy dopiero po skończeniu wykonywanego programu. STI ustawia, CLI zeruje)
ADFDirection FlagZacznik kierunku (0 dane będą przesyłane w kolejności adresów rosnących, 1 malejących. DI i SI zwiększane lub zmieniejszane. STD ustawia, CLD zeruje)
BOFOverflow flagZnacznik nadmiaru (np. gdy zabrakło bitów do zapisu liczby przy dodawaniu przeniesienie c0 i c-1 były różne)
CIOPL I/O Privilege Level (286+)Priorytet procesu (dwubitowy).
00 najwyższy - 11 najniższy
DIOPL I/O Privilege Level (286+)
ENTNested Task Flag (286+)Znacznik zagnieżdżenia (1 jeżeli nasz proces wywołał inny np. przez CALL)
F0 
10RF Resume Flag (386+)Znacznik wznowienia (używany przy debuggowaniu do wznowienia po wystąpieniu wyjątku)
Pozostałe 16 bitów w procesorach 386+
11VMVirtual Mode Flag (386+)1 - tryb wirtualny, 0 - Tryb rzeczywisty, Tryb chroniony lub Tryb emulacji 286
12ACAlignment Check (486SX+)Czy ma nastąpić przerwanie programu w przypadku, gdy procesor pobiera dane nie wyrównane (np. wartość typu word z nieparzystych adresów lub wartość typu dword z adresów, które nie dzielą się przez 4)
13VIFVirtual Interrupt Flag(586+)Kopia IF
14VIPVirtual Interrupt Pending(586+)Przerwania w trybie wirtualnym
15IDIdentification(586+)Umożliwia odczyt wersji procesora
16 - 1F 


Specjalne rejstry (386+)

Rejestry kontrolne. Odpowiadają za włączenie/wyłączenie pamięci cach itp.
CR0     Control Register 0        
CR2     Control Register 2        
CR3     Control Register 3        

Rejestry wspomagające debuggowanie.
DR0    Debug Register 0
DR1    Debug Register 1
DR2    Debug Register 2
DR3    Debug Register 3
DR6    Debug Register 6
DR7    Debug Register 7

Rejestry testowe. Pierwotnie umieszczone w celu testowania procesorów już po wyprodukowaniu. Niekiedy systemy operacyjne korzystają z nich w celu przeprowadzenia testów poprawności działania.
TR4     Test Register 4
TR5     Test Register 5
TR6     Test Register 6
TR7     Test Register 7

Opracowane na podstawie:
1. Dokumentacji Intela.
2. Art of Assembly Language

Uzupełnienie:
Marooned

2 komentarze

TKW 2004-08-26 10:38

A gdt, idt, etc? To też rejestry, lecz obsługiwane przez instrukcje l* i s*.

flabra 2003-11-05 08:22

To już szczegół bardziej elektrotechniczny, ale rzutuje na wykorzystanie rejestrów:

Wszystkie rejestry to rejestry równoległe, stąd b. łatwy do nich dostep, natomiast flagi to rejestr szeregowy, stąd pewne większe utrudnienia w dostępie do niego (np. pushf/pop ax i na odwrót push ax/popf) oraz specjalny zestaw instrukcji. W ostateczności, gdyby tak nie było to nie działałyby wszelkie rozkazy warunkowe (np. skoki je/jne , jz/jnz , ...)