Cosa significa la "R" nei nomi dei registri x64?


27

So che i registri a 32 bit sono stati nominati come i registri a 16 bit con un prefisso 'E' per indicare esteso. Ho sempre pensato che significasse esteso da 16 a 32 bit, anche se non l'ho mai visto esplicitamente.

Stavo cercando di scoprire che cosa significhi la "R", ma le mie abilità su Google mi hanno fallito. Qualcuno sa?


Risposte:


32

Significa registrarsi e non è tutto per ragioni storiche.

La parte storica è che Intel ha preso l'abitudine di enumerare i registri con lettere con l'8008 (da A a E più H e L). Questo schema era più che adeguato all'epoca perché i microprocessori avevano pochissimi registri e non avrebbero potuto ottenere di più, e la maggior parte dei progetti lo ha fatto. Il sentimento prevalente era quindi che il software sarebbe stato riscritto per le nuove CPU come apparivano, quindi cambiare lo schema di denominazione dei registri tra i modelli non sarebbe stato un grosso problema. Nessuno prevedeva che l'8088 si evolvesse in una "famiglia" dopo essere stato incorporato nel PC IBM, e il giogo della compatibilità con le versioni precedenti ha praticamente costretto Intel a dover adottare schemi come la "E" sui registri a 32 bit per mantenerlo.

La parte non storica è tutta pratica. L'uso delle lettere per i registri per scopi generici ti limita a 26, meno se si eliminano quelli che potrebbero causare confusione con i nomi dei registri per scopi speciali come il contatore del programma, i flag o il puntatore dello stack.

Non ho una fonte per confermarlo, ma sospetto che la scelta Rcome prefisso e l'introduzione di R8 fino a R15 su CPU a 64 bit segnali una transizione verso registri numerati, che sono stati la norma tra 32-bit-e - architetture più grandi non derivate dall'8008 per quasi mezzo secolo. IBM lo ha fatto negli anni '60 con la 360 ed è stato seguito da PowerPC, DEC Alpha, MIPS, SPARC, ARM, Intel i860 e i960 e molti altri che sono stati dimenticati da tempo.

Noterai che i registri esistenti si adatterebbero perfettamente da R0 a R7 se esistessero, e non mi sorprenderebbe un po 'se fossero trattati in quel modo internamente. I registri lunghi esistenti (RAX / EAX / AX / AL, RBX / EBX / BX / BL, ecc.) Probabilmente rimarranno in circolazione fino allo scoppio del sole.


1
Un po 'anticlimatica ma immagino che non dovrei essere troppo sorpreso. Grazie.
Matt,

3
Questo è stato tutto il dramma che ho potuto raccogliere. :-)
Blrfl

+1 per la lettura molto interessante. Ma se dovesse essere riassunto in una sola riga, sarebbe stata la risposta che ho dato. Tutte queste informazioni ricche e interessanti vengono ridotte a "ragioni storiche" se riassunte.
Mike Nakis,

6
AMD ha preso in considerazione la possibilità di rinominare o aliasare gli 8 registri bassi in r0- r7o utilizzare UAXinvece di r8, ecc . "Capire come nominare al meglio i registri era in realtà una delle parti più difficili del fare l'estensione del registro." (Vedi stackoverflow.com/a/35619528/224132 per qualche altra storia x86-64 ordinata.) Inoltre, l'ordine non è RAX / RBX / ... nella codifica binaria, è AX, CX, DX, BX
Peter Cordes

9

Nei processori precedenti, non tutti i registri erano uguali:

  • Non c'era abbastanza spazio sui chip per avere un'unità sommatrice per ciascun registro.
  • Con 8 bit, non c'erano abbastanza codici operativi disponibili per tutte le possibili combinazioni di sorgente e destinazione.

Supponendo quindi che un registro specifico fosse sempre implicato quando era coinvolto l'adder, rendeva il chip meno complesso e i codici operativi più brevi.

Ad esempio, il 6510 (utilizzato in Commodore 64) può essere aggiunto solo tramite il registro A e l'indicizzazione utilizza X o Y. Esistono istruzioni INC X e INC Y, ma nessuna INC A.

Poiché i registri avevano usi diversi, i mnemonici venivano scelti in base al loro utilizzo. Ad esempio, A, X e Y nel 6510 (anziché A, B e C).

I nomi nell'8086 sono scelti per riflettere anche il loro utilizzo. Con 4 registri di uso generale, era logico chiamarli AX, BX, CX e DX. Registri di indicizzazione aggiuntivi erano chiamati BP e SP (mnemonico: Base Pointer, Stack Pointer).

Poiché molti codici operativi sono stati estesi a 16 bit, c'era spazio per indicare quale registro su quattro è stato utilizzato. Tuttavia, alcuni dei motivi storici ancora applicati, dato che CX era un po 'speciale: REP e simili, che sono codici op a 8 bit, usano sempre CX come contatore. Un semplice mnemonico, CX = Counter, aiuta a ricordare quale viene usato.

Gli opcode per i successori dell'8086 dovevano essere retrocompatibili e sono un disastro a causa degli opcode di lunghezza variabile. Quando i bus a 32 bit sono diventati più comuni, sono stati provati processori con lunghezza del codice operativo fissa. Ciò semplifica la parte di decodifica della CPU, che ha liberato spazio che potrebbe essere utilizzato, ad esempio, per più registri.

I processori che hanno seguito questa linea di pensiero sono chiamati processori RISC (Reduced Instruction Set CPU), in contrasto con il CISC (Complex Instruction Set CPU).

Più registri si traducono in meno perdite di memoria. Fondamentalmente, i registri sono la cache più veloce disponibile, quindi aumentare il numero di registri è una buona idea, anche al giorno d'oggi. La mancanza di istruzioni specializzate è stata (si spera più di) compensata dalla più rapida trasmissione di semplici istruzioni.

I codici operativi a 32 bit di lunghezza fissa dispongono di spazio sufficiente per includere una sorgente, una seconda sorgente, un'operazione e una destinazione. SPARC è riuscito a wringle 5 bit per ciascuna sorgente, seconda sorgente e destinazione, e quindi aveva 32 registri visibili contemporaneamente.

32 registri sono troppi per usare le lettere, e comunque erano per lo più uguali, quindi numerarli era la scelta ovvia. La "R" veniva utilizzata per distinguerli dalle costanti 0..31 e "R" era un semplice mnemonico per Register. Pertanto: R0..R31.

Nel corso degli anni, il Pentium e i suoi successori hanno mantenuto la retrocompatibilità. Tuttavia, anche molte delle idee RISC di maggior successo sono state integrate. Spesso, queste nuove istruzioni simili a RISC verranno eseguite più rapidamente rispetto alle versioni compatibili con le versioni precedenti.

Intel ha inoltre aumentato il numero di registri per ridurre il numero di accessi alla memoria.

E a quanto pare, Intel ha finalmente iniziato a utilizzare la notazione R. La compatibilità con le versioni precedenti garantirà che AX, BX, ... rimarranno, ma scommetto che AX è solo un sinonimo per es. R0.


Disclaimer : quanto sopra è la mia visione della storia. Sarà incompleto perché non ero presente per assistere in prima persona alle parti precedenti della storia. Tuttavia, spero che sia utile per alcuni.


1
La famiglia 6500 in realtà non aveva bisogno di un'istruzione dedicata per incrementare l'accumulatore poiché un'aggiunta in modalità immediata di 1 richiedeva gli stessi due cicli di un INXo INY, sebbene il codice occupasse un byte aggiuntivo. Ho scritto un sacco di assemblaggio per quel chip e in pratica quel tipo di incremento era raro al di fuori del fare matematica che ne aveva bisogno.
Blrfl,

@Blrfl Hai ragione: ADD 1funziona quindi non è stato necessario un 'aumento A' specializzato. E non ricordo nemmeno di averne bisogno.
Sjoerd

1
Va notato che non è stato Intel che ha aumentato il numero di registri in x64 e li ha nominati, ma AMD, poiché le estensioni a 64 bit a x86 sono state create da AMD . Il design a 64 bit di Intel era Itanium , che non ha funzionato così bene, anche se ha inserito molti registri (128 interi per tutti gli usi, più molti altri).
8

5

Significa solo 'registrati'. Per ragioni storiche.


Non è poi così storico se al momento si riferisce a un registro, vero? Direi che gli altri nomi per i registri (AX, EAX, ecc.) Sono più per ragioni storiche. Ma che la "R" in RAX è attualmente molto applicabile.
Carl G,

1
(+1) meme: "Se riesci a spiegarlo a lungo, puoi spiegarlo a breve."
user7813604
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.