Assembly Language
Rejestry
Szukaj…
Uwagi
Co to są rejestry?
Procesor może działać na wartościach liczbowych (liczbach), ale muszą one być zapisane gdzieś jako pierwsze. Dane są przechowywane głównie w pamięci lub wewnątrz kodu operacyjnego instrukcji (który zwykle jest również przechowywany w pamięci) lub w specjalnej pamięci na chipie umieszczonej bezpośrednio w procesorze, która nazywa się rejestrem .
Aby pracować z wartością w rejestrze, nie musisz adresować jej przez adres, ale używane są specjalne mnemoniczne „nazwy”, takie jak na przykład ax
na x86, A
na Z80 lub r0
na ARM.
Niektóre procesory są skonstruowane w taki sposób, że prawie wszystkie rejestry są równe i mogą być używane do wszystkich celów (często grupa procesorów RISC), inne mają wyraźną specjalizację, gdy tylko niektóre rejestry mogą być używane do arytmetyki ( „akumulator” na wczesnych procesorach ) i inne rejestry wyłącznie do adresowania pamięci itp.
Ta konstrukcja wykorzystująca pamięć bezpośrednio na chipie procesora ma ogromny wpływ na wydajność, dodawanie dwóch liczb z rejestrów przechowujących go z powrotem do rejestru jest zwykle wykonywane w najkrótszym możliwym czasie przez ten procesor (przykład na procesorze ARM: ADD r2,r0,r1
ustawia r2
na (r0 + r1)
wartość, w cyklu jednoprocesorowym).
Wręcz przeciwnie, gdy jeden z operandów odwołuje się do lokalizacji w pamięci, procesor może utknąć na pewien czas, czekając na nadejście wartości z układu pamięci (na x86 może to wynosić od zera oczekiwania na wartości w pamięci podręcznej L0 do setek Procesor cyklicznie, gdy wartość nie znajduje się w żadnej pamięci podręcznej i musi być odczytana bezpośrednio z pamięci DRAM).
Więc kiedy programista tworzy kod przetwarzania danych, zwykle chce mieć wszystkie dane podczas przetwarzania w rejestrach, aby uzyskać najlepszą wydajność. Jeśli nie jest to możliwe, a odczyty / zapisy pamięci są wymagane, należy je zminimalizować i utworzyć wzorzec, który współpracuje z architekturą pamięci podręcznej / architektury konkretnej platformy.
Natywny rozmiar rejestru w bitach jest często używany do grupowania procesorów, na przykład Z80 oznacza „procesor 8-bitowy” , a 80386 oznacza „procesor 32-bitowy” - chociaż takie grupowanie rzadko jest wyraźne. Na przykład Z80 działa również z parami rejestrów, tworząc natywną wartość 16-bitową, a 32-bitowy procesor 80686 ma instrukcje MMX do pracy z rejestrami 64-bitowymi natywnie.
Rejestry Zilog Z80
Rejestry: 8 bitów: A
, B
, C
, D
, E
, H
, L
, F
, I
, R
, 16 bitów: SP
, PC
, IX
, IY
i cienie niektórych rejestrów 8b: A'
, B'
, C'
, D'
, E'
, H'
, L'
i F'
.
Większość rejestrów 8-bitowych może być również używana parami jako rejestry 16-bitowe: AF
, BC
, DE
i HL
.
SP
jest wskaźnikiem stosu , oznaczającym spód pamięci stosu (używany przez instrukcje PUSH
/ POP
/ CALL
/ RET
).
PC
jest licznikiem programu , wskazującym na aktualnie wykonywaną instrukcję.
I
rejestrem przerwań , dostarczającym wysoki bajt adresu tablicy wektorów dla trybu przerwań IM 2
.
R
jest rejestrem odświeżania , zwiększa się za każdym razem, gdy CPU pobiera kod operacji (lub prefiks operacji).
Istnieją niektóre nieoficjalne instrukcje dotyczące niektórych procesorów Z80 do manipulowania 8-bitowymi częściami IX
jako IXH:IXL
i IY
jako IYH:IYL
.
Nie można bezpośrednio uzyskać dostępu do wariantów cienia za pomocą dowolnej instrukcji, instrukcja EX AF,AF'
zamieni się między AF
i AF'
, a instrukcja EXX
zamieni BC,DE,HL
z BC',DE',HL'
.
Ładowanie wartości do rejestru:
; from other register
LD I,A ; copies value in A into I (8 bit)
LD BC,HL ; copies value in HL into BC (16 bit)
; directly with value encoded in instruction machine code
LD B,d8 ; 8b value d8 into B
LD DE,d16 ; 16b value d16 into DE
; from a memory (ROM/RAM)
LD A,(HL) ; value from memory addressed by HL into A
LD A,(a16) ; value from memory with address a16 into A
LD HL,(a16) ; 16b value from memory with address a16 into HL
POP IX ; 16b value popped from stack into IX
LD A,(IY+a8) ; IX and IY allows addressing with 8b offset
; from I/O port (for writing value at I/O port use "OUT")
IN A,(C) ; reads I/O port C, value goes to A
Prawidłowe kombinacje możliwych argumentów źródłowych i docelowych są ograniczone (na przykład LD H,(a16)
nie istnieje).
Przechowywanie wartości w pamięci:
LD (HL),D ; value D stored into memory addressed by HL
LD (a16),A ; value A into memory with address a16
LD (a16),HL ; value HL into 16b of memory with address a16
LD (IX+a8),d8 ; value d8 into memory at address IX+a8
LD (IY+a8),B ; value B into memory at address IY+a8
; specials ;)
PUSH DE ; 16b value DE pushed to stack
CALL a16 ; while primarily used for execution branching
; it also stores next instruction address into stack
Rejestry x86
W świecie 32-bitowym rejestry ogólnego przeznaczenia dzielą się na trzy ogólne klasy: 16-bitowe rejestry ogólnego przeznaczenia, 32-bitowe rozszerzone rejestry ogólnego przeznaczenia i 8-bitowe połówki rejestru. Te trzy klasy w ogóle nie reprezentują trzech całkowicie różnych zestawów rejestrów. Rejestry 16-bitowe i 8-bitowe są w rzeczywistości nazwami regionów w rejestrach 32-bitowych. Wzrost liczby rejestrów w rodzinie procesorów x86 nastąpił poprzez rozszerzenie rejestrów istniejących w starszych procesorach
Istnieje osiem 16-bitowych rejestrów ogólnego przeznaczenia: AX, BX, CX, DX, BP, SI, DI i SP; i możesz umieścić w nich dowolną wartość, która może być wyrażona w 16 bitach lub mniej.
Kiedy Intel rozszerzył architekturę x86 do 32 bitów w 1986 r., Podwoił rozmiar wszystkich ośmiu rejestrów i nadał im nowe nazwy, poprzedzając literą E przed każdą nazwą rejestru, co daje EAX, EBX, ECX, EDX, EBP, ESI, EDI i ESP.
Wraz z x86_64 nastąpiło kolejne podwojenie wielkości rejestru, a także dodanie kilku nowych rejestrów. Rejestry te mają szerokość 64 bitów i są nazywane (ukośnik używany do wyświetlania nazwy rejestru alternatywnego): RAX / r0, RBX / r3, RCX / r1, RDX / r2, RBP / r5, RSI / r6, RDI / r7, RSP / r4 , R8, R9, R10, R11, R12, R13, R14, R15.
Chociaż rejestry ogólnego przeznaczenia mogą być technicznie wykorzystywane do wszystkiego, każdy rejestr ma również alternatywny / główny cel:
- AX (akumulator) jest wykorzystywany w operacjach arytmetycznych.
- CX (licznik) jest używany w instrukcjach przesunięcia i obrotu oraz używany w pętlach.
- DX (dane) jest wykorzystywany w operacjach arytmetycznych i we / wy.
- BX (podstawa) używany jako wskaźnik do danych (w szczególności jako przesunięcie rejestru rejestru DS w trybie segmentowym).
- SP (stos) wskazuje na górę stosu.
- BP (podstawa stosu) wskazuje na podstawę stosu.
- SI (źródło) wskazuje na źródło w pamięci dla operacji strumieniowych (np.
lodsb
). - DI (miejsce docelowe) wskazuje miejsce docelowe w pamięci dla operacji strumieniowych (np.
stosb
).
Rejestry segmentów używane w trybie segmentacji wskazują różne segmenty w pamięci. Każdy 16-bitowy rejestr segmentowy daje widok 64k (16 bitów) danych. Po ustawieniu rejestru segmentu tak, aby wskazywał na blok pamięci, rejestry (takie jak BX
, SI
i DI
) mogą być używane jako przesunięcia rejestru segmentu, dzięki czemu można uzyskać dostęp do określonych lokalizacji w przestrzeni 64k.
Rejestry sześciu segmentów i ich zastosowania to:
Zarejestrować | Pełne imię i nazwisko | Opis |
---|---|---|
SS | Segment stosu | Wskazuje na stos |
CS | Segment kodu | Używany przez CPU do pobrania kodu |
DS | Segment danych | Domyślny rejestr operacji MOV |
ES | Dodatkowy segment | Dodatkowy segment danych |
FS | Dodatkowy segment | Dodatkowy segment danych |
GS | Dodatkowy segment | Dodatkowy segment danych |
Rejestry x64
Architektura x64 jest ewolucją starszej architektury x86, zachowała zgodność ze swoim poprzednikiem (rejestry x86 są nadal dostępne), ale wprowadziła również nowe funkcje:
- Rejestry mają teraz pojemność 64 bitów;
- Istnieje 8 innych rejestrów ogólnego przeznaczenia;
- Rejestry segmentowe są wymuszane na 0 w trybie 64-bitowym;
- Dostępne są teraz niższe 32, 16 i 8 bitów każdego rejestru.
Ogólny cel
Zarejestrować | Nazwa | Podrejestry (bity) |
---|---|---|
RAX | Akumulator | EAX (32), AX (16), AH (8), AL (8) |
RBX | Baza | EBX (32), BX (16), BH (8), BL (8) |
RCX | Licznik | ECX (32), CX (16), CH (8), CL (8) |
RDX | Dane | EDX (32), DX (16), DH (8), DL (8) |
RSI | Źródło | ESI (32), SI (16), SL (8) |
RDI | Miejsce docelowe | EDI (32), DI (16), DL (8) |
RBP | Wskaźnik podstawowy | EBP (32), BP (16), BPL (8) |
RSP | Wskaźnik stosu | ESP (32), SP (16), SPL (8) |
R8-R15 | Nowe rejestry | R8D-R15D (32), R8W-R15W (16), R8B-R15B (8) |
Uwaga
Sufiksy użyte do rozwiązania dolnych bitów nowych rejestrów oznaczają:
- Bajt B, 8 bitów;
- W słowo, 16 bitów;
- D podwójne słowo, 32 bity.