¿Qué significa la 'R' en los nombres de registro x64?

Respuestas:

32

Significa registrarse , y no es todo por razones históricas.

La parte histórica es que Intel se acostumbró a enumerar registros con letras con el 8008 (A a E más H y L). Ese esquema era más que adecuado en ese momento porque los microprocesadores tenían muy pocos registros y no era probable que obtuvieran más, y la mayoría de los diseños lo hicieron. El sentimiento predominante en ese momento era que el software se reescribiría para las nuevas CPU a medida que aparecían, por lo que cambiar el esquema de nombres de registro entre modelos no habría sido un gran problema. Nadie previó que el 8088 se convertiría en una "familia" después de ser incorporado a la PC de IBM, y el yugo de la compatibilidad con versiones anteriores obligó a Intel a tener que adoptar esquemas como la "E" en los registros de 32 bits para mantenerlo.

La parte no histórica es toda práctica. El uso de letras para registros de propósito general lo limita a 26, menos si elimina los que pueden causar confusión con los nombres de registros de propósito especial como el contador del programa, las banderas o el puntero de la pila.

No tengo una fuente para confirmarlo, pero sospecho que la elección Rcomo prefijo y la introducción de R8 a R15 en CPU de 64 bits indica una transición a los registros numerados, que han sido la norma entre 32 bits y arquitecturas más grandes no derivadas del 8008 durante casi medio siglo. IBM lo hizo en la década de 1960 con el 360 y ha sido seguido por PowerPC, DEC Alpha, MIPS, SPARC, ARM, Intel i860 e i960 y muchos otros que han sido olvidados por mucho tiempo.

Notarás que los registros existentes encajarían perfectamente en R0 a R7 si existieran, y no me sorprendería un poco si se los trata de esa manera internamente. Los registros largos existentes (RAX / EAX / AX / AL, RBX / EBX / BX / BL, etc.) probablemente permanezcan hasta que el sol se queme.

Blrfl
fuente
1
Un poco anticlimático, pero supongo que no debería sorprenderme demasiado. Gracias.
Matt
3
Ese fue todo el drama que pude reunir. :-)
Blrfl
+1 para la lectura muy interesante. Pero si se resumiera en una sola línea, habría sido la respuesta que le di. Toda esta información rica e interesante se reduce a "razones históricas" si se resume.
Mike Nakis
66
AMD se considere la posibilidad de cambiar el nombre o alias de los bajos registros de 8 a r0- r7, o usar UAXen lugar de r8, etc . "Descubrir cómo nombrar mejor los registros fue en realidad una de las partes más difíciles de hacer la extensión de registro". (Ver stackoverflow.com/a/35619528/224132 para algún otro historial x86-64 limpio.) Además, el pedido no es RAX / RBX / ... en la codificación binaria, es AX, CX, DX, BX
Peter Cordes
9

En los procesadores anteriores, no todos los registros eran iguales:

  • No había suficiente espacio en los chips para tener una unidad sumadora para cada registro.
  • Con 8 bits, no había suficientes códigos de operación disponibles para todas las combinaciones posibles de origen y destino.

Asumiendo que un registro específico siempre estuvo implicado cuando el sumador estuvo involucrado, hizo que el chip fuera menos complejo y los códigos de operación más cortos.

Por ejemplo, el 6510 (usado en Commodore 64) solo podía agregar usando el registro A, y la indexación usaba X o Y. Hay instrucciones INC X e INC Y, pero no INC A.

Como los registros tenían diferentes usos, se eligieron los mnemónicos que reflejaban su uso. Por ejemplo, A, X e Y en 6510 (en lugar de A, B y C).

Los nombres en el 8086 también se eligen para reflejar su uso. Con 4 registros de propósito general, era lógico nombrarlos AX, BX, CX y DX. Los registros de indexación adicionales se llamaron BP y SP (mnemónico: puntero base, puntero de pila).

Como muchos códigos de operación se extendieron a 16 bits, había espacio para indicar cuál de cada cuatro registros se usó. Sin embargo, algunas de las razones históricas aún se aplicaban, ya que CX era un poco especial: REP y los gustos, que son códigos de operación de 8 bits, siempre usan CX como contador. Un mnemónico simple, CX = Counter, ayuda a recordar cuál se usa.

Los códigos de operación para los sucesores del 8086 tenían que ser compatibles con versiones anteriores, y son un desastre como resultado de los códigos de operación de longitud variable. Cuando los buses de 32 bits se hicieron más comunes, se probaron procesadores con longitud de código de operación fija. Esto simplifica la parte de decodificación de la CPU, que libera espacio que podría utilizarse, por ejemplo, para más registros.

Los procesadores que siguieron esta línea de pensamiento se denominan procesadores RISC (CPU de conjunto de instrucciones reducidas), para contrastar con la CISC (CPU de conjunto de instrucciones complejas).

Más registros dan como resultado menos derrames a la memoria. Básicamente, los registros son el caché más rápido disponible, por lo que aumentar el número de registros es una buena idea, incluso hoy en día. La falta de instrucciones especializadas fue (con suerte más que) compensada por la producción más rápida de instrucciones simples.

Los códigos de operación de 32 bits de longitud fija tienen espacio suficiente para incluir una fuente, una segunda fuente, una operación y un destino. SPARC logró escribir 5 bits para cada fuente, segunda fuente y destino, y por lo tanto tenía 32 registros visibles al mismo tiempo.

32 registros son demasiados para usar letras, y en su mayoría eran iguales de todos modos, por lo que numerarlos era la opción obvia. La 'R' se usó para distinguirlos de las constantes 0..31, y 'R' fue un mnemónico fácil para Register. Por lo tanto: R0..R31.

Con los años, el Pentium y sus sucesores han mantenido una compatibilidad hacia atrás. Sin embargo, muchas de las ideas más exitosas de RISC también fueron incorporadas. Con frecuencia, esas nuevas instrucciones tipo RISC se ejecutarán más rápido que las versiones compatibles con versiones anteriores.

Intel también aumentó la cantidad de registros para reducir la cantidad de accesos a la memoria.

Y aparentemente, Intel finalmente ha comenzado a usar la notación R. La compatibilidad con versiones anteriores garantizará que AX, BX, ... permanezca, pero apuesto a que AX es solo un sinónimo de, por ejemplo, R0.


Descargo de responsabilidad : lo anterior es mi punto de vista sobre la historia. Será incompleto ya que no estaba cerca para presenciar las primeras partes de la historia de primera mano. Sin embargo, espero que sea útil para algunos.

Sjoerd
fuente
1
La familia 6500 realmente no necesitaba una instrucción dedicada para incrementar el acumulador porque una suma de modo inmediato de 1 tomó los mismos dos ciclos como un INXo INY, aunque el código ocupó un byte adicional. Escribí mucho ensamblaje para ese chip y en la práctica ese tipo de incremento era raro fuera de hacer las matemáticas que lo necesitaban.
Blrfl
@Blrfl Tienes razón: ADD 1funciona así que no hubo necesidad de un 'Aumento A' especializado. Y tampoco recuerdo haberlo necesitado.
Sjoerd
1
Cabe señalar que no fue Intel quien aumentó el número de registros en x64 y los nombró, sino AMD, ya que AMD creó las extensiones de 64 bits para x86 . El diseño de Intel de 64 bits fue Itanium , que no ha funcionado tan bien, aunque pusieron muchos registros (128 de propósito general, más muchos otros) en él.
8bittree
5

Solo significa 'registrarse'. Por razones históricas.

Mike Nakis
fuente
No es realmente tan histórico si actualmente se refiere a un registro, ¿verdad? Yo diría que los otros nombres para registros (AX, EAX, etc.) son más por razones históricas. Pero que la "R" en RAX es actualmente muy aplicable.
Carl G
1
(+1) meme: "Si puedes explicarlo largo, puedes explicarlo brevemente".
user7813604