Recherche…


Remarques

Que sont les registres?

Le processeur peut fonctionner sur des valeurs numériques (nombres), mais celles-ci doivent être stockées quelque part en premier. Les données sont stockées principalement dans la mémoire, ou à l'intérieur de l'opcode d'instruction (qui est généralement stocké dans la mémoire), ou dans une mémoire sur puce spéciale placée directement dans le processeur, appelé registre .

Pour travailler avec la valeur dans le registre, vous n'avez pas besoin de l'adresser par adresse, mais des mnémoniques spéciaux sont utilisés, comme par exemple ax sur x86, ou A sur Z80, ou r0 sur ARM.

Certains processeurs sont construits d'une manière, où presque tous les registres sont égaux et peuvent être utilisés à toutes fins utiles (souvent de groupe RISC de processeurs), d' autres ont une spécialisation distincte, lorsque seuls certains registres peuvent être utilisés pour l' arithmétique ( « accumulateur » sur les processeurs début ) et d’autres registres pour l’adressage de mémoire uniquement, etc.

Cette construction en utilisant la mémoire directement sur la puce de processeur a un énorme implication de la performance, l' addition de deux nombres de registres stockant Retour à l' inscription se fait généralement dans le temps le plus court possible par ce processeur (exemple sur processeur ARM: ADD r2,r0,r1 définit r2 à (r0 + r1) valeur, en cycle de processeur unique).

Au contraire, lorsque l'un des opérandes fait référence à un emplacement mémoire, le processeur peut rester en attente pendant un certain temps, en attendant que la valeur vienne de la puce mémoire (sur x86, des valeurs de cache L0 Le processeur tourne lorsque la valeur ne se trouve dans aucun cache et doit être lu directement à partir de la mémoire DRAM.

Ainsi, lorsque le programmeur crée un code de traitement de données, il souhaite généralement que toutes les données soient en cours de traitement dans les registres pour obtenir les meilleures performances. Si ce n'est pas possible, et que des lectures / écritures de mémoire sont requises, celles-ci doivent être minimisées et former un modèle qui coopère avec l'architecture de cache / mémoire de la plate-forme particulière.

La taille native du registre en bits est souvent utilisée pour grouper les processeurs, comme Z80 étant un "processeur 8 bits" , et 80386 étant un "processeur 32 bits" - bien que ce regroupement soit rarement clair. Par exemple, Z80 fonctionne également avec des paires de registres, formant des valeurs natives de 16 bits, tandis que des CPU 32 bits 80686 ont des instructions MMX pour fonctionner avec des registres de 64 bits en mode natif.

Zilog Z80 enregistre

Registres: 8 bits: A , B , C , D , E , H , L , F , I , R , 16 bits: SP , PC , IX , IY et ombres de certains registres 8b: A' , B' , C' , D' , E' , H' , L' et F' .

La plupart des registres à 8 bits peuvent également être utilisés par paires en tant que registres 16 bits: AF , BC , DE et HL .

SP est un pointeur de pile , marquant le bas de la mémoire de la pile (utilisé par les instructions PUSH / POP / CALL / RET ).
PC est un compteur de programme , pointant sur l'instruction en cours d'exécution.
I est un registre d'interruption , fournissant un octet haut de l'adresse de table vectorielle pour le mode d'interruption IM 2 .
R est un registre de rafraîchissement , il s'incrémente chaque fois que le CPU récupère un opcode (ou un préfixe d'opcode).
Des instructions non officielles existent sur certains processeurs Z80 pour manipuler des parties de 8 bits de IX comme IXH:IXL et IY comme IYH:IYL .

Aucune instruction ne permet d'accéder directement aux variantes d'ombre, l'instruction EX AF,AF' EXX entre AF et AF' , et l'instruction EXX échangera BC,DE,HL avec BC',DE',HL' .


Chargement de la valeur dans un registre:

    ; 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

Les combinaisons correctes des opérandes source et destination possibles sont limitées (par exemple, LD H,(a16) n'existe pas).


Stocker de la valeur dans une mémoire:

    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 registres

Dans le monde à 32 bits, les registres à usage général se divisent en trois classes générales: les registres à usage général à 16 bits, les registres à usage général étendus à 32 bits et les moitiés de registre à 8 bits. Ces trois classes ne représentent pas du tout trois ensembles de registres entièrement distincts. Les registres 16 bits et 8 bits sont en fait des noms de régions à l' intérieur des registres 32 bits. La croissance des registres dans la famille de processeurs x86 a été obtenue en étendant les registres existants dans les anciens processeurs

Il existe huit registres à usage général 16 bits: AX, BX, CX, DX, BP, SI, DI et SP; et vous pouvez y placer toute valeur pouvant être exprimée en 16 bits ou moins.

Quand Intel a étendu l'architecture x86 à 32 bits en 1986, il a doublé la taille des huit registres et leur a donné de nouveaux noms en préfixant un E devant chaque nom de registre, résultant en EAX, EBX, ECX, EDX, EBP, ESI, EDI et ESP.

Avec x86_64, on a doublé la taille du registre et ajouté de nouveaux registres. Ces registres ont une largeur de 64 bits et sont nommés (barre oblique utilisée pour afficher un autre nom de registre): RAX / r0, RBX / r3, RCX / r1, RDX / r2, RBP / r5, RSI / r6, RDI / r7, RSP / r4 , R8, R9, R10, R11, R12, R13, R14, R15.

Bien que les registres à usage général puissent être utilisés à des fins techniques, chaque registre a également un objectif alternatif / principal:

  • AX (accumulateur) est utilisé dans les opérations arithmétiques.
  • CX (counter) est utilisé dans les instructions shift et rotation, et utilisé pour les boucles.
  • DX (data) est utilisé dans les opérations arithmétiques et E / S.
  • BX (base) utilisé comme pointeur vers les données (en particulier en tant que décalage vers le registre de segment DS en mode segmenté).
  • SP (stack) pointe vers le haut de la pile.
  • BP (base de pile) pointe vers la base de la pile.
  • SI (source) pointe vers une source en mémoire pour les opérations de flux (par exemple, lodsb ).
  • DI (destination) pointe vers une destination en mémoire pour les opérations de flux (par exemple, stosb ).

Les registres de segments, utilisés en mode segmenté, pointent vers différents segments de la mémoire. Chaque registre de segment de 16 bits donne une vue à 64 ko (16 bits) de données. Une fois qu'un registre de segment a été défini pour pointer sur un bloc de mémoire, les registres (tels que BX , SI et DI ) peuvent être utilisés comme décalages pour le registre de segment, permettant ainsi d'accéder à des emplacements spécifiques dans l'espace 64k.

Les registres à six segments et leurs utilisations sont les suivants:

registre Nom complet La description
SS Segment de pile Points à la pile
CS Segment de code Utilisé par le CPU pour récupérer le code
DS Segment de données Registre par défaut pour les opérations MOV
ES Segment supplémentaire Segment de données supplémentaire
FS Segment supplémentaire Segment de données supplémentaire
GS Segment supplémentaire Segment de données supplémentaire

x64 registres

L’architecture x64 est l’évolution de l’ancienne architecture x86, elle est restée compatible avec son prédécesseur (les registres x86 sont toujours disponibles), mais elle a également introduit de nouvelles fonctionnalités:

  • Les registres ont maintenant une capacité de 64 bits;
  • Il y a 8 autres registres à usage général;
  • Les registres de segment sont forcés à 0 en mode 64 bits;
  • Les 32, 16 et 8 bits inférieurs de chaque registre sont maintenant disponibles.

Polyvalent

registre prénom Sous-registres (bits)
RAX Accumulateur EAX (32), AX (16), AH (8), AL (8)
RBX Base EBX (32), BX (16), BH (8), BL (8)
RCX Compteur ECX (32), CX (16), CH (8), CL (8)
RDX Les données EDX (32), DX (16), DH (8), DL (8)
RSI La source ESI (32), SI (16), SL (8)
RDI Destination EDI (32), DI (16), DL (8)
RBP Pointeur de base EBP (32), BP (16), BPL (8)
RSP Pointeur de pile ESP (32), SP (16), SPL (8)
R8-R15 Nouveaux registres R8D-R15D (32), R8W-R15W (16), R8B-R15B (8)

Remarque

Les suffixes utilisés pour adresser les bits inférieurs des nouveaux registres signifient:

  • B octet, 8 bits;
  • W mot, 16 bits;
  • D double mot, 32 bits.


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow