Co oznacza „R” w nazwach rejestrów x64?

27

Wiem, że 32-bitowe rejestry zostały nazwane tak jak 16-bitowe rejestry z przedrostkiem „E”, co oznacza rozszerzenie. Zawsze zakładałem, że oznacza to rozszerzenie z 16 do 32 bitów, chociaż nigdy nie widziałem tego wyraźnie stwierdzonego.

Próbowałem dowiedzieć się, co oznacza skrót „R”, ale moje umiejętności wyszukiwania w Google zawiodły mnie. Ktoś wie?

Matt
źródło

Odpowiedzi:

32

Oznacza rejestrację , i to nie wszystko z przyczyn historycznych.

Historyczne jest to, że Intel przyzwyczaił się do wyliczania rejestrów z literami 8008 (od A do E plus H i L). Ten schemat był wtedy więcej niż wystarczający, ponieważ mikroprocesory miały bardzo niewiele rejestrów i raczej nie otrzymałyby więcej, a większość projektów to zrobiła. Panowało wówczas przekonanie, że oprogramowanie zostanie przepisane na nowe procesory, gdy się pojawią, więc zmiana schematu nazewnictwa rejestrów między modelami nie byłaby wielkim problemem. Nikt nie przewidział, że 8088 przekształci się w „rodzinę” po włączeniu do komputera IBM, a jarzmo wstecznej kompatybilności prawie zmusiło Intela do przyjęcia schematów takich jak „E” w 32-bitowych rejestrach, aby go utrzymać.

Część niehistoryczna jest praktyczna. Używanie liter do rejestrów ogólnego przeznaczenia ogranicza cię do 26, mniej, jeśli wyeliminujesz te, które mogą powodować zamieszanie w nazwach rejestrów specjalnego przeznaczenia, takich jak licznik programu, flagi lub wskaźnik stosu.

Nie mam źródła, aby to potwierdzić, ale podejrzewam, że wybór Rjako prefiksu i wprowadzenie R8 do R15 na 64-bitowych procesorach sygnalizuje przejście do rejestrów numerowanych, które były normą wśród 32-bitowych i - większe architektury nie wywodzące się z 8008 przez prawie pół wieku. IBM zrobił to w latach 60. XX wieku z modelem 360, a za nim poszły PowerPC, DEC Alpha, MIPS, SPARC, ARM, Intel i860 i i960 i kilka innych, o których od dawna zapomniano.

Zauważysz, że istniejące rejestry dobrze pasowałyby do R0 do R7, gdyby istniały, i nie zaskoczyłoby mnie to, gdyby były traktowane w ten sposób wewnętrznie. Istniejące długie rejestry (RAX / EAX / AX / AL, RBX / EBX / BX / BL itp.) Prawdopodobnie pozostaną, dopóki słońce nie wypali.

Blrfl
źródło
1
Trochę antyklimatyczne, ale chyba nie powinienem być zbyt zaskoczony. Dzięki.
Matt
3
To był cały dramat, który mogłem zebrać. :-)
Blrfl
+1 za bardzo interesującą lekturę. Ale jeśli miałoby to być podsumowane w jednym wierszu, to byłaby odpowiedź, którą udzieliłem. Wszystkie te bogate i interesujące informacje są zestawiane do „przyczyn historycznych”, jeśli zostaną podsumowane.
Mike Nakis,
6
AMD nie rozważyć zmianę nazwy lub aliasing niskie rejestry do 8 r0- r7lub używając UAXzamiast r8itp . „Ustalenie, jak najlepiej nazwać rejestry, było w rzeczywistości jedną z najtrudniejszych części rozszerzenia rejestru”. (Zobacz stackoverflow.com/a/35619528/224132, aby zapoznać się z inną schludną historią x86-64.) Ponadto zamówienie nie dotyczy RAX / RBX / ... w kodowaniu binarnym, to AX, CX, DX, BX
Peter Cordes,
9

We wcześniejszych procesorach nie wszystkie rejestry były równe:

  • Na chipach nie było wystarczającej ilości miejsca, aby mieć jednostkę dodającą dla każdego rejestru.
  • Przy 8 bitach nie było wystarczającej liczby kodów dla wszystkich możliwych kombinacji źródła i celu.

Zakładając, że jeden konkretny rejestr był zawsze wplątany, gdy zaangażowany był sumator, sprawił, że układ stał się mniej skomplikowany, a kody operacyjne krótsze.

Np. 6510 (używany w Commodore 64) może dodawać tylko przy użyciu rejestru A, a indeksowanie używa X lub Y. Istnieją instrukcje INC X i INC Y, ale nie ma INC A.

Ponieważ rejestry miały różne zastosowania, wybrano mnemoniki odzwierciedlające ich użycie. Np. A, X i Y w 6510 (zamiast A, B i C).

Nazwy w 8086 zostały wybrane, aby odzwierciedlić ich użycie. W przypadku 4 rejestrów ogólnego przeznaczenia logiczne było nazwanie ich AX, BX, CX i DX. Dodatkowe rejestry indeksujące nazwano BP i SP (mnemoniczne: wskaźnik podstawowy, wskaźnik stosu).

Ponieważ wiele kodów rozszerzono do 16 bitów, było trochę miejsca na wskazanie, który z czterech rejestrów został użyty. Jednak niektóre z historycznych powodów wciąż miały zastosowanie, ponieważ CX był nieco wyjątkowy: REP i polubienia, które są 8-bitowymi kodami, zawsze używają CX jako licznika. Prosty mnemonik, CX = Counter, pomaga zapamiętać, który z nich jest używany.

Kody dla następców 8086 musiały być kompatybilne wstecz i były nieporządkiem z powodu kodów o zmiennej długości. Kiedy 32-bitowe magistrale stały się bardziej popularne, wypróbowano procesory o stałej długości kodu operacyjnego. Upraszcza to część dekodującą procesora, która zwalnia miejsce, które można wykorzystać np. Dla większej liczby rejestrów.

Procesory, które postępowały zgodnie z tym tokiem myślenia, nazywane są procesorami RISC (CPU z ograniczonym zestawem instrukcji), w przeciwieństwie do procesora CISC (CPU z zestawem instrukcji złożonych).

Im więcej rejestrów, tym mniej rozprzestrzenia się w pamięci. Zasadniczo rejestry są najszybszą dostępną pamięcią podręczną, więc zwiększenie liczby rejestrów jest dobrym pomysłem, nawet w dzisiejszych czasach. Brak wyspecjalizowanych instrukcji został (miejmy nadzieję więcej) zrekompensowany szybszym wprowadzaniem prostych instrukcji.

32-bitowe kody o stałej długości mają wystarczającą ilość miejsca, aby uwzględnić źródło, drugie źródło, operację i miejsce docelowe. SPARC zdołał zawinąć 5 bitów dla każdego źródła, drugiego źródła i miejsca docelowego, a zatem miał 32 rejestry widoczne jednocześnie.

32 rejestrów jest zbyt wiele, aby używać liter, a i tak były one w większości równe, więc numerowanie ich było oczywistym wyborem. „R” służyło do odróżnienia ich od stałych 0..31, a „R” był łatwym mnemonikiem rejestru. Dlatego: R0..R31.

Przez lata Pentium i jego następcy zachowali zgodność wsteczną. Włączono jednak również wiele bardziej udanych pomysłów RISC. Często te nowe instrukcje podobne do RISC będą działać szybciej niż wersje kompatybilne wstecz.

Liczba rejestrów została również zwiększona przez Intel, aby zmniejszyć liczbę dostępów do pamięci.

I najwyraźniej Intel w końcu zaczął używać notacji R. Kompatybilność wsteczna zapewni, że AX, BX, ... pozostaną, ale założę się, że AX jest tylko synonimem np. R0.


Zastrzeżenie : Powyższe jest moim poglądem na historię. To będzie niekompletne, ponieważ nie byłem w pobliżu, by być świadkiem wcześniejszych części historii. Niemniej mam nadzieję, że niektórym się przyda.

Sjoerd
źródło
1
Rodzina 6500 naprawdę nie potrzebowała dedykowanej instrukcji, aby zwiększyć akumulator, ponieważ dodanie 1 trybu natychmiastowego zajęło te same dwa cykle co INXlub INY, chociaż kod zajmował dodatkowy bajt. Napisałem dużo montażu dla tego układu i w praktyce tego rodzaju przyrosty były rzadkie poza robieniem matematyki, która tego potrzebowała.
Blrfl
@Blrfl Masz rację: ADD 1działa, więc nie było potrzeby specjalistycznego „Zwiększania A”. I nie pamiętam, żeby tego potrzebowałem.
Sjoerd
1
Należy zauważyć, że to nie Intel zwiększył liczbę rejestrów w x64 i nazwał je, ale AMD, ponieważ 64-bitowe rozszerzenia x86 zostały utworzone przez AMD . 64-bitową konstrukcją Intela był Itanium , który nie radził sobie tak dobrze, chociaż wprowadził do niego wiele (128 liczb całkowitych ogólnego przeznaczenia i wiele innych) rejestrów.
8bittree
5

To po prostu oznacza „zarejestruj się”. Z przyczyn historycznych.

Mike Nakis
źródło
To nie jest tak historyczne, jeśli obecnie odnosi się do rejestru, prawda? Powiedziałbym, że inne nazwy rejestrów (AX, EAX itp.) Są bardziej ze względów historycznych. Ale to, że „R” w RAX ma obecnie bardzo duże zastosowanie.
Carl G
1
(+1) mem: „Jeśli potrafisz to wyjaśnić długo, możesz to wyjaśnić krótko”.
user7813604,