Buscar..


Observaciones

¿Qué son los registros?

El procesador puede funcionar con valores numéricos (números), pero estos deben almacenarse en algún lugar primero. Los datos se almacenan principalmente en la memoria, o dentro del código de operación de la instrucción (que también se almacena generalmente en la memoria), o en la memoria especial en chip colocada directamente en el procesador, que se denomina registro .

Para trabajar con valor en el registro, no es necesario que lo dirija por dirección, pero se utilizan "nombres" mnemónicos especiales, como por ejemplo ax en x86, A en Z80 o r0 en ARM.

Algunos procesadores están construidos de una manera, donde casi todos los registros son iguales y se pueden usar para todos los propósitos (a menudo el grupo de procesadores RISC), otros tienen especialización distinta, cuando solo algunos registros se pueden usar para aritmética ( "acumulador" en CPU tempranas) ) y otros registros para direccionamiento de memoria solamente, etc.

Esta construcción que utiliza la memoria directamente en el chip del procesador tiene una gran implicación en el rendimiento, ya que agregar dos números de los registros que lo guardan para registrarse se realiza generalmente en el menor tiempo posible por ese procesador (Ejemplo en el procesador ARM: ADD r2,r0,r1 establece r2 en (r0 + r1) valor, en ciclo de procesador único).

Por el contrario, cuando uno de los operandos hace referencia a una ubicación de memoria, el procesador puede detenerse durante algún tiempo, esperando que llegue el valor del chip de memoria (en x86, esto puede ir desde cero, esperar los valores en caché L0 hasta cientos de Los ciclos de la CPU cuando el valor no está en ningún caché y se debe leer directamente desde el chip de memoria DRAM).

Entonces, cuando la programadora está creando algún código de procesamiento de datos, generalmente quiere tener todos los datos durante el procesamiento en registros para obtener el mejor rendimiento. Si eso no es posible, y se requieren lecturas / escrituras de memoria, entonces deben minimizarse y formar un patrón que coopere con las cachés / arquitectura de memoria de la plataforma en particular.

El tamaño nativo del registro en bits se usa a menudo para agrupar procesadores, como Z80 es "procesador de 8 bits" y 80386 es "procesador de 32 bits" , aunque esa agrupación rara vez es clara. Por ejemplo, Z80 opera también con pares de registros, formando un valor nativo de 16 bits, y la CPU de 32 bits 80686 tiene instrucciones MMX para trabajar de forma nativa con registros de 64 bits.

Zilog Z80 se registra

Registros: 8 bits: A , B , C , D , E , H , L , F , I , R , 16 bits: SP , PC , IX , IY y sombras de algunos registros 8b: A' , B' , C' , D' , E' , H' , L' y F' .

La mayoría de los registros de 8 bits se pueden usar también en pares como registros de 16 bits: AF , BC , DE y HL .

SP es el puntero de pila , que marca la parte inferior de la memoria de pila (utilizada por las instrucciones PUSH / POP / CALL / RET ).
PC es un contador de programa , que apunta a la instrucción actualmente ejecutada.
I es el registro de interrupción , que proporciona un byte alto de la dirección de la tabla de vectores para el modo de interrupción de IM 2 .
R es el registro de actualización , se incrementa cada vez que la CPU busca un código de operación (o prefijo de código de operación).
Algunas instrucciones no oficiales existen en algunos procesadores Z80 para manipular partes de IYH:IYL de IX como IXH:IXL e IY como IYH:IYL .

No se puede acceder directamente a las variantes de sombra mediante ninguna instrucción, la instrucción EX AF,AF' cambiará entre AF y AF' , y la instrucción EXX intercambiará BC,DE,HL con BC',DE',HL' .


Cargando valor en un registro:

    ; 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

Las combinaciones correctas de posibles operandos de origen y destino están limitadas (por ejemplo, LD H,(a16) no existe).


Almacenamiento de valor en una memoria:

    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

x86 registros

En el mundo de 32 bits, los registros de propósito general se dividen en tres clases generales: los registros de propósito general de 16 bits, los registros de propósito general extendidos de 32 bits y las mitades de registro de 8 bits. Estas tres clases no representan tres conjuntos de registros completamente distintos. Los registros de 16 bits y 8 bits son en realidad nombres de regiones dentro de los registros de 32 bits. El crecimiento de los registros en la familia de CPU x86 se ha producido al extender los registros existentes en las CPU más antiguas

Hay ocho registros de propósito general de 16 bits: AX, BX, CX, DX, BP, SI, DI y SP; y puede colocar cualquier valor en ellos que pueda expresarse en 16 bits o menos.

Cuando Intel expandió la arquitectura x86 a 32 bits en 1986, duplicó el tamaño de los ocho registros y les dio nuevos nombres prefijando una E delante de cada nombre de registro, dando como resultado EAX, EBX, ECX, EDX, EBP, ESI, EDI, y ESP.

Con x86_64 vino otra duplicación del tamaño del registro, así como la adición de algunos nuevos registros. Estos registros tienen 64 bits de ancho y se denominan (barra diagonal utilizada para mostrar el nombre del registro alternativo): RAX / r0, RBX / r3, RCX / r1, RDX / r2, RBP / r5, RSI / r6, RDI / r7, RSP / r4 , R8, R9, R10, R11, R12, R13, R14, R15.

Si bien los registros de propósito general se pueden usar técnicamente para cualquier cosa, cada registro también tiene un propósito alternativo / principal:

  • AX (acumulador) se utiliza en operaciones aritméticas.
  • CX (contador) se usa en las instrucciones de cambio y rotación, y se usa para bucles.
  • DX (datos) se utiliza en operaciones aritméticas y de E / S.
  • BX (base) se usa como puntero a los datos (específicamente como un desplazamiento al registro de segmento DS cuando está en modo segmentado).
  • SP (pila) apunta a la parte superior de la pila.
  • BP (base de pila) apunta a la base de la pila.
  • SI (fuente) apunta a una fuente en memoria para operaciones de transmisión (por ejemplo, lodsb ).
  • DI (destino) apunta a un destino en la memoria para operaciones de transmisión (por ejemplo, stosb ).

Los registros de segmentos, utilizados en el modo segmentado, apuntan a diferentes segmentos en la memoria. Cada registro de segmento de 16 bits da una vista a 64k (16 bits) de datos. Después de configurar un registro de segmento para que apunte a un bloque de memoria, los registros (como BX , SI y DI ) se pueden usar como compensaciones del registro de segmento para que se pueda acceder a ubicaciones específicas en el espacio de 64k.

Los seis registros de segmento y sus usos son:

Registro Nombre completo Descripción
SS Segmento de pila Apunta a la pila
CS Segmento de código Utilizado por la CPU para recuperar el código.
DS Segmento de datos Registro predeterminado para operaciones MOV
ES Segmento Extra Segmento de datos extra
FS Segmento Extra Segmento de datos extra
GS Segmento Extra Segmento de datos extra

x64 registros

La arquitectura x64 es la evolución de la arquitectura x86 anterior, mantuvo la compatibilidad con su predecesora (los registros x86 todavía están disponibles) pero también introdujo nuevas características:

  • Los registros tienen ahora una capacidad de 64 bits;
  • Hay 8 registros más de propósito general;
  • Los registros de segmento están forzados a 0 en modo de 64 bits;
  • Los 32, 16 y 8 bits más bajos de cada registro ahora están disponibles.

Propósito general

Registro Nombre Subregistros (bits)
RAX Acumulador EAX (32), AX (16), AH (8), AL (8)
RBX Base EBX (32), BX (16), BH (8), BL (8)
RCX Mostrador ECX (32), CX (16), CH (8), CL (8)
RDX Datos EDX (32), DX (16), DH (8), DL (8)
RSI Fuente ESI (32), SI (16), SL (8)
RDI Destino EDI (32), DI (16), DL (8)
RBP Puntero base EBP (32), BP (16), BPL (8)
RSP Puntero de pila ESP (32), SP (16), SPL (8)
R8-R15 Nuevos registros R8D-R15D (32), R8W-R15W (16), R8B-R15B (8)

Nota

Los sufijos utilizados para direccionar los bits más bajos de los nuevos registros representan:

  • Byte B, 8 bits;
  • W palabra, 16 bits;
  • D doble palabra, 32 bits.


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow