Rejestry
Dryobates
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.
Bit | Symbol | Nazwa | Znaczenie |
0 | CF | Carry Flag | Znacznik przeniesienia (1 jeżeli nastąpiło przeniesienie z najbardziej znaczącego bitu) |
1 | 1 | ||
2 | PF | Parity Flag | Znacznik parzystości (1 parzysta liczba bitów 1) |
3 | 0 | ||
4 | AF | Auxiliary Flag | Znacznik przeniesienia pomocniczego (1 jeżeli nastąpiło przeniesienie z 3 na 4 bit. Pomocne przy obliczaniu na liczbach w systemie BCD) |
5 | 0 | ||
6 | ZF | Zero Flag | Znacznik zera (1 jeżeli otrzymano 0 w wyniku operacji) |
7 | SF | Sign Flag | Znacznik znaku (1 jeżeli otrzymano liczbę ujemną w wyniku operacji) |
8 | TF | Trap Flag | Znacznik pracy krokowej (1 po każdej wykonanej instrukcji procesora wywoływane jest jest przerwanie pracy krokowej) |
9 | IF | Interrupt Flag | Znacznik 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) |
A | DF | Direction Flag | Zacznik 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) |
B | OF | Overflow flag | Znacznik nadmiaru (np. gdy zabrakło bitów do zapisu liczby przy dodawaniu przeniesienie c0 i c-1 były różne) |
C | IOPL | I/O Privilege Level (286+) | Priorytet procesu (dwubitowy). 00 najwyższy - 11 najniższy |
D | IOPL | I/O Privilege Level (286+) | |
E | NT | Nested Task Flag (286+) | Znacznik zagnieżdżenia (1 jeżeli nasz proces wywołał inny np. przez CALL) |
F | 0 | ||
10 | RF | Resume Flag (386+) | Znacznik wznowienia (używany przy debuggowaniu do wznowienia po wystąpieniu wyjątku) |
Pozostałe 16 bitów w procesorach 386+ | |||
11 | VM | Virtual Mode Flag (386+) | 1 - tryb wirtualny, 0 - Tryb rzeczywisty, Tryb chroniony lub Tryb emulacji 286 |
12 | AC | Alignment 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) |
13 | VIF | Virtual Interrupt Flag(586+) | Kopia IF |
14 | VIP | Virtual Interrupt Pending(586+) | Przerwania w trybie wirtualnym |
15 | ID | Identification(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:
- Dokumentacji Intela.
- Art of Assembly Language
Uzupełnienie:
Marooned
A gdt, idt, etc? To też rejestry, lecz obsługiwane przez instrukcje l* i s*.
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 , ...)