¿Cuál es la función de un registro en una CPU?

En los primeros días de la arquitectura de la computadora, los registros eran elementos físicos hechos de chanclas, que podían almacenar palabras de datos de máquinas. El registro del contador del programa contenía la dirección de memoria de la siguiente instrucción. El registro de instrucciones contenía la instrucción obtenida de la memoria. El Registro de direcciones de memoria contenía la dirección para ser leída o escrita. Luego, el registro de datos de memoria contenía los datos a escribir o los resultados de una lectura. El acumulador contenía los resultados de la aritmética y podría servir como un operando para otras cosas.

Este tipo de pensamiento lleva a instrucciones simples y una lógica de control bastante obvia para secuenciar las operaciones de una máquina.

Un poco más tarde, los registros se volvieron más baratos y más rápidos, por lo que los arquitectos decidieron tener más, quizás 4 (Data General Nova) o 16 (IBM 360, PDP-11). Cosas como el registro de instrucciones y la dirección de memoria y los registros de datos aún podrían existir dentro de algún lugar, pero ya no formaban parte de la arquitectura oficial. Son útiles para construir hardware, pero no agregan nada a la comprensión de los programadores. Las instrucciones se convirtieron en cosas como

MOV R3, (R2) +

que podría cargar R3 con el contenido de la ubicación de memoria contenida en R2, después de lo cual R2 se incrementaría para apuntar a la siguiente dirección de memoria.

Podría haber un registro de dirección de memoria o un registro de datos de memoria allí, pero solo como una conveniencia para los diseñadores lógicos. En cambio, se extendió la idea de que los registros eran de “almacenamiento rápido” y los compiladores trabajaron duro para descubrir cómo poner las cosas importantes en los registros para que no se guardaran y se restauraran de la memoria. Los sistemas operativos evolucionaron para compartir el tiempo y la conmutación de procesos y la conmutación de subprocesos, y guardaron y restauraron registros cuidadosamente para preservar la ilusión de que el contenido de estos registros era parte del estado de la máquina.

Los registros son almacenamiento para programas, pero es un poco extraño, porque un hilo puede decirle a otro hilo “buscar en la ubicación 100” algunos datos compartidos, pero no puede decir “buscar en el registro AX” algunos datos compartidos. En otras palabras, ¡realmente no se puede hablar del registro como una ubicación! Solo puede hablar sobre el valor que tiene un registro. Sean lo que sean, no es la misma idea que la memoria.

Lo que realmente está sucediendo hoy es que los registros mencionados en los programas tienen muy poco que ver con celdas de almacenamiento o flipflops. En cambio, son nombres para valores que están limitados al contexto local de un hilo de ejecución. Pensemos en algunos ejemplos.

Supongamos que tiene una secuencia de instrucciones como

MOV AX, $ 100; cargar AX con el contenido de la ubicación de memoria 100
MUL AX, 3; triplicarlo
AGREGAR AX, # 5; agregar 5
MOV $ 104, AX; poner la suma en la ubicación de memoria 104
MOV AX, # 7; poner un 7 en AX

Una máquina moderna fuera de servicio notará que la instrucción de carga en la línea 1 y la instrucción en la línea 5 hablan sobre AX, pero al usar un registro físico diferente para estos dos AX, ambas instrucciones pueden ejecutarse en paralelo. Además, cuando los datos de la instrucción 1 finalmente regresan de la memoria, se pueden alimentar directamente a la ALU para multiplicarse por 3, en realidad no es necesario almacenarlos en ningún lugar. El resultado de la multiplicación se puede alimentar directamente desde la salida del multiplicador a la entrada del ADD, sin almacenarlo en ningún lugar. (Esto se llama omisión). El resultado del ADD puede enviarse directamente al sistema de memoria sin ser almacenado primero en ningún lugar.

Sin duda, si un programador pone un punto de interrupción en la instrucción 3, el valor en “AX” debe ser accesible, o si se produce una interrupción entre las instrucciones 3 y 4, el estado arquitectónico visible para los programadores debe guardarse, pero como un transitorio. De hecho, los valores a los que se refiere “AX” en las instrucciones 1,2,3 y 4 nunca se colocan realmente en un registro.

Dentro de un núcleo moderno, es probable que haya cientos de “registros” de hardware, pero en un momento dado, varios de ellos podrían ser diferentes encarnaciones de los AX en un programa, y ​​más podrían ser los AX para un hyperthread diferente que se ejecuta en el mismo núcleo. Por lo general, estos registros de hardware se escriben cuando se confirman las instrucciones, para preservar el “estado arquitectónico” en caso de interrupciones, pero es posible que nunca se lean. En cambio, los valores que se supone que tienen se pasan directamente entre las unidades funcionales, mientras que un trozo de lógica muy complicado a veces llamado “el búfer de reordenamiento” lleva la cuenta.

Por lo tanto, cada vez que un programa escribe un “registro”, normalmente se asigna uno nuevo y se le asigna temporalmente el nombre dado por la instrucción. Un registro en estos días es un nombre para un valor, no un lugar en particular donde se guardan datos.

Se podría construir una nueva arquitectura que no tuviera registros en absoluto en el conjunto de instrucciones, en lugar de usar direcciones de memoria. La máquina podría funcionar igual de rápido, interpretando las direcciones de memoria como nombres para valores en lugar de celdas de almacenamiento físico. La memoria real solo necesita actualizarse cuando el programa tiene que comunicarse con otros hilos o con el mundo exterior. La lógica sería mucho más complicada, porque los nombres serían mucho más grandes, pero funcionaría.

Register es una variable capaz de almacenar datos y una interfaz para que la CPU se comunique con E / S y memoria. Es muy rápido, pero no puede almacenar muchos datos.

Por ejemplo, el tamaño de registro de la CPU de 64 bits será generalmente de 64 bits y tendrá 32 números de registro. (64/2 = 32) Para más detalles, busque la referencia de arquitectura de CPU. (BRAZO, x86)

Si desea implementar un registro en un circuito electrónico, conecte el circuito D-flip flop en paralelo. El número del circuito D-flip flop será el número de bits. (Registro de 16 bits = 16 números de D-flip flop)

Sobre la relación entre el registro y el lenguaje de programación, puede pensar que las variables de programación son la mayoría de las veces registros. Existe una técnica de optimización de compilación llamada Asignación de registro. Esta técnica intenta asignar muchas variables con menos registros como sea posible. Además, en lenguaje C, hay un modificador llamado “registro”. Esto puede establecer una sola variable para registrar la memoria.

Déjame darte una analogía simple. Supongamos que desea recomendar dos libros de una biblioteca para completar una tarea. Lo que posiblemente harás es llevar los dos libros necesarios a tu escritorio y usarlos. Los diferentes componentes de almacenamiento / memoria de la computadora están organizados de forma jerárquica. La CPU utiliza los registros para almacenar las instrucciones requeridas de inmediato, como el escritorio de la biblioteca. La memoria primaria se usa como el estante de la biblioteca, las instrucciones que la CPU no está ejecutando actualmente reside allí.

Esta es una respuesta muy simplificada, pero creo que es una aproximación precisa que explica el uso de registros en la CPU.

Al menos en las CPU más antiguas, debe colocar algo en un registro antes de poder hacer algo con él. Todas las instrucciones son cosas como “incrementar R0” (registro 0) o “agregar R0 a R1 y poner la respuesta en R0”. Entonces puede guardar R0 en una dirección de memoria. Las operaciones de registro son más rápidas que incluso las operaciones de RAM, por lo que si puede hacer cálculos solo dentro del conjunto de registros, su programa se ejecutará más rápido.

Un registro es solo un conjunto de flipflops digitales que pueden almacenar un número binario, pero está conectado (o conectado a un bus rápido) a la ALU que tiene sumadores, etc. para realizar operaciones aritméticas.

La existencia de registro programable no es obligatoria. En mi primera computadora (una Honeywell-2200) las instrucciones fueron: “Opcode A_adress, B_address. “Y los operandos podrían tener CUALQUIER longitud. (incluso 100K) Un registro de dirección A y B, y un “bit de marca de palabra” en el extremo de los operandos controlaron las operaciones. Y las computadoras eran fáciles de usar. Los registros programables hicieron posible un hardware más barato. Y también ayudó a desarrollar microprocesadores baratos. Los programadores ensambladores pagan con más pensamiento. Hoy hablan de operandos de 64 bits de largo como resultado. DIVERTIDO 😀 😀 Pero la pila que usan las CPU modernas es realmente buena. (También utilicé computadoras con registros: PDP8, PDP11, DGC Nova, IBM360, IBM370, DPS8 e Intel) En algunas operaciones de CPU-s Register-Register, Register-Memory, Memory-Memoy (IBM, BULL mainframes) En Algunas CPU solo registran la memoria, registran el registro. Un ejemplo extremo DGC Nova. Hubo 4 acumuladores, y toda la aritmética ocurrió entre 2 de ellos. Con la memoria solo estaban STA (acumulador de almacenamiento) LDA (acumulador de carga). Pero me gustó esta máquina porque había un fantástico “generador de funciones” para la aritmética. Como sé, WOZ también admiró esta CPU. 🙂

(Por supuesto, en cada CPU hay registros de hardware que siempre encuentra. Los cuales son necesarios para la CPU en sí. Por ejemplo, Contador de programas, Registro de direcciones de memoria, etc.)

Un registro es un almacenamiento de acceso muy rápido que se utiliza para operandos (entradas) y resultados (salidas) para cálculos en curso.