Ricerca…


Osservazioni

Cosa sono i registri?

Il processore può operare su valori numerici (numeri), ma questi devono essere memorizzati da qualche parte prima. I dati sono memorizzati per lo più in memoria, o all'interno dell'opcode di istruzioni (che viene memorizzato di solito anche in memoria), o in una speciale memoria on-chip collocata direttamente nel processore, che si chiama registro .

Per lavorare con il valore nel registro, non è necessario indirizzarlo per indirizzo, ma vengono utilizzati "nomi" mnemonici speciali, come ad esempio ax su x86 o A su Z80 o r0 su ARM.

Alcuni processori sono costruiti in un modo, dove quasi tutti i registri sono uguali e possono essere utilizzati per tutti gli scopi (spesso gruppo di processori RISC), altri hanno una specializzazione distinta, quando solo alcuni registri possono essere utilizzati per l'aritmetica ( "accumulatore" sulle prime CPU) ) e altri registri solo per l'indirizzamento della memoria, ecc.

Questa costruzione che utilizza la memoria direttamente sul chip del processore ha enormi implicazioni in termini di prestazioni, aggiungendo due numeri da registri che lo memorizzano di nuovo in genere nel più breve tempo possibile da quel processore (Esempio su processore ARM: ADD r2,r0,r1 set r2 to (r0 + r1) valore, nel ciclo del singolo processore).

Al contrario, quando uno degli operandi fa riferimento a una posizione di memoria, il processore potrebbe bloccarsi per un po 'di tempo, in attesa che il valore arrivi dal chip di memoria (su x86 questo può variare da zero attendere i valori nella cache L0 a centinaia di La CPU cicla quando il valore non è in nessuna cache e deve essere letto direttamente dal chip di memoria DRAM).

Quindi, quando il programmatore sta creando un codice di elaborazione dati, di solito desidera avere tutti i dati durante l'elaborazione nei registri per ottenere le migliori prestazioni. Se ciò non è possibile, e sono richieste letture / scritture di memoria, queste dovrebbero essere ridotte al minimo e formare un modello che coopera con l'architettura cache / memoria della piattaforma particolare.

La dimensione nativa del registro in bit viene spesso utilizzata per raggruppare processori, come Z80 come "processore da 8 bit" e 80386 come "processore da 32 bit" - sebbene tale raggruppamento sia raramente un taglio chiaro. Ad esempio, Z80 funziona anche con coppie di registri, formando un valore di 16 bit nativo, e la CPU 80686 a 32 bit ha istruzioni MMX per lavorare in modo nativo con registri a 64 bit.

Registri Zilog Z80

Registri: 8 bit: A , B , C , D , E , H , L , F , I , R , 16 bit: SP , PC , IX , IY e ombre di alcuni registri 8b: A' , B' , C' , D' , E' , H' , L' e F' .

La maggior parte dei registri a 8 bit può essere utilizzata anche in coppia come registri a 16 bit: AF , BC , DE e HL .

SP è il puntatore dello stack , che segna la parte inferiore della memoria dello stack (utilizzata dalle istruzioni PUSH / POP / CALL / RET ).
PC è un contatore del programma , che punta alle istruzioni attualmente eseguite.
I è un registro di interrupt che fornisce un byte alto dell'indirizzo della tabella vettoriale per la modalità di interrupt IM 2 .
R è un registro di aggiornamento , che aumenta ogni volta che la CPU recupera un codice operativo (o prefisso opcode).
Alcune istruzioni non ufficiali esistono su alcuni processori Z80 per manipolare parti a 8 bit di IX come IXH:IXL e IY come IYH:IYL .

Le varianti di ombreggiatura non possono essere accessibili direttamente da alcuna istruzione, l'istruzione EX AF,AF' si scambierà tra AF e AF' , e l'istruzione EXX cambierà BC,DE,HL con BC',DE',HL' .


Caricamento del valore in 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

Le combinazioni corrette di possibili operandi sorgente e destinazione sono limitate (ad esempio LD H,(a16) non esiste).


Memorizzare il valore in 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

Registri x86

Nel mondo a 32 bit, i registri generici si suddividono in tre classi generali: i registri general-purpose a 16 bit, i registri general purpose estesi a 32 bit e le metà del registro a 8 bit. Queste tre classi non rappresentano affatto tre insiemi di registri completamente distinti. I registri a 16 bit e 8 bit sono in realtà nomi di regioni all'interno dei registri a 32 bit. La crescita del registro nella famiglia di CPU x86 è avvenuta estendendo i registri esistenti nelle vecchie CPU

Esistono otto registri general-purpose a 16 bit: AX, BX, CX, DX, BP, SI, DI e SP; e puoi inserire qualsiasi valore in essi che può essere espresso in 16 bit o meno.

Quando Intel ha espanso l'architettura x86 a 32 bit nel 1986, ha raddoppiato la dimensione di tutti e otto i registri e ha dato loro nuovi nomi anteponendo una E davanti a ciascun nome di registro, risultando in EAX, EBX, ECX, EDX, EBP, ESI, EDI e ESP.

Con x86_64 è arrivato un altro raddoppio delle dimensioni del registro, oltre all'aggiunta di alcuni nuovi registri. Questi registri sono a 64 bit di larghezza e sono denominati (barra utilizzata per mostrare il nome 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.

Mentre i registri di uso generale possono essere tecnicamente utilizzati per qualsiasi cosa, ogni registro ha anche uno scopo alternativo / principale:

  • AX (accumulatore) viene utilizzato nelle operazioni aritmetiche.
  • CX (contatore) viene utilizzato nello spostamento e ruota le istruzioni e utilizzato per i cicli.
  • DX (dati) viene utilizzato nelle operazioni aritmetiche e I / O.
  • BX (base) utilizzato come puntatore ai dati (in particolare come offset al registro del segmento DS in modalità segmentata).
  • SP (stack) punta in cima alla pila.
  • BP (stack stack) punta alla base della pila.
  • SI (fonte) punta a una fonte in memoria per le operazioni di streaming (ad esempio lodsb ).
  • DI (destinazione) punta a una destinazione in memoria per le operazioni di streaming (es. stosb ).

I registri di segmenti, usati in modalità segmentata, puntano a segmenti diversi nella memoria. Ogni registro del segmento a 16 bit fornisce una vista a 64k (16 bit) di dati. Dopo che un registro dei segmenti è stato impostato in modo da puntare a un blocco di memoria, i registri (come BX , SI e DI ) possono essere utilizzati come offset del registro dei segmenti in modo che sia possibile accedere a posizioni specifiche nello spazio a 64k.

I sei registri di segmenti e i loro usi sono:

Registrare Nome e cognome Descrizione
SS Stack Segment Punti in pila
CS Segmento di codice Utilizzato dalla CPU per recuperare il codice
DS Segmento di dati Registro predefinito per le operazioni MOV
ES Segmento Extra Segmento di dati extra
FS Segmento Extra Segmento di dati extra
GS Segmento Extra Segmento di dati extra

Registri x64

L'architettura x64 è l'evoluzione della vecchia architettura x86, ha mantenuto la compatibilità con il suo predecessore (i registri x86 sono ancora disponibili) ma ha anche introdotto nuove funzionalità:

  • I registri hanno ora una capacità di 64 bit;
  • Vi sono altri 8 registri general-purpose;
  • I registri di segmento sono forzati a 0 in modalità a 64 bit;
  • I 32, 16 e 8 bit inferiori di ciascun registro sono ora disponibili.

Scopo generale

Registrare Nome Subregisters (bit)
RAX Accumulatore EAX (32), AX (16), AH (8), AL (8)
RBX Base EBX (32), BX (16), BH (8), BL (8)
RCX contatore ECX (32), CX (16), CH (8), CL (8)
RDX Dati EDX (32), DX (16), DH (8), DL (8)
RSI fonte ESI (32), SI (16), SL (8)
RDI Destinazione EDI (32), DI (16), DL (8)
RBP Puntatore di base EBP (32), BP (16), BPL (8)
RSP Puntatore di pila ESP (32), SP (16), SPL (8)
R8-R15 Nuovi registri R8D-R15D (32), R8W-R15W (16), R8B-R15B (8)

Nota

I suffissi usati per indirizzare i bit inferiori dei nuovi registri indicano:

  • B byte, 8 bit;
  • Parola W, 16 bit;
  • D doppia parola, 32 bit.


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow