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.


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow