Zoeken…


Opmerkingen

Wat zijn registers?

De processor kan op numerieke waarden (getallen) werken, maar deze moeten eerst ergens worden opgeslagen. De gegevens worden meestal opgeslagen in het geheugen, of in de instructie opcode (die meestal ook in het geheugen wordt opgeslagen), of in speciaal on-chip geheugen dat direct in de processor wordt geplaatst, dit wordt register genoemd .

Om met waarde in register te werken, hoeft u het niet per adres te adresseren, maar speciale mnemonische "namen" worden gebruikt, zoals bijvoorbeeld ax op x86 of A op Z80, of r0 op ARM.

Sommige processors zijn op een manier geconstrueerd, waarbij bijna alle registers gelijk zijn en voor alle doeleinden kunnen worden gebruikt (vaak RISC-groep van processors), anderen hebben een verschillende specialisatie, terwijl slechts enkele registers kunnen worden gebruikt voor rekenkunde ( "accumulator" op vroege CPU's) ) en andere registers alleen voor geheugenadressering, enz.

Deze constructie waarbij geheugen rechtstreeks op de processorchip wordt gebruikt, heeft grote implicaties voor de prestaties, het toevoegen van twee nummers uit registers die het opnieuw opslaan om te registreren, wordt meestal zo snel mogelijk gedaan door die processor (Voorbeeld op ARM-processor: ADD r2,r0,r1 stelt r2 op (r0 + r1) waarde, in enkele processorcyclus).

Integendeel, wanneer een van de operanden naar een geheugenlocatie verwijst, kan de processor enige tijd blokkeren, wachtend op de waarde die uit de geheugenchip komt (op x86 kan dit variëren van nul wachten op waarden in LO-cache tot honderden CPU-cycli wanneer de waarde zich niet in een cache bevindt en rechtstreeks van de geheugen-DRAM-chip moet worden gelezen).

Dus wanneer programmeur een aantal gegevensverwerkingscode maakt, wil ze meestal alle gegevens tijdens de verwerking in registers hebben om de beste prestaties te krijgen. Als dat niet mogelijk is en geheugen lezen / schrijven vereist is, moeten deze worden geminimaliseerd en een patroon vormen dat samenwerkt met caches / geheugenarchitectuur van het specifieke platform.

De native grootte van het register in bits wordt vaak gebruikt om processoren te groeperen, zoals Z80 als "8-bit processor" en 80386 als "32-bit processor" - hoewel die groepering zelden duidelijk is. Z80 werkt bijvoorbeeld ook met paren registers, waardoor een native 16-bits waarde wordt gevormd, en de 32-bits 80686 CPU heeft MMX-instructies om native met 64-bits registers te werken.

Zilog Z80 registers

Registers: 8 bit: A , B , C , D , E , H , L , F , I , R , 16 bit: SP , PC , IX , IY en schaduwen van sommige 8b-registers: A' , B' , C' , D' , E' , H' , L' en F' .

De meeste van de 8 bit registers kunnen ook in paren worden gebruikt als 16 bit registers: AF , BC , DE en HL .

SP is stapelwijzer , die de onderkant van het stapelgeheugen markeert (gebruikt door PUSH / POP / CALL / RET instructies).
PC is programma teller , wijzend naar de momenteel uitgevoerde instructie.
I is het register Onderbreken en levert een hoge byte van het vectortabeladres voor de IM 2 onderbrekingsmodus.
R is register vernieuwen , het wordt elke keer dat de CPU een opcode (of opcode prefix) ophaalt, verhoogd.
Sommige onofficiële instructies bestaan op sommige Z80-processors om 8bit-delen van IX te manipuleren als IXH:IXL en IY als IYH:IYL .

Schaduwvarianten zijn niet rechtstreeks toegankelijk via een instructie, de EX AF,AF' instructie EXX tussen AF en AF' en EXX instructie EXX BC,DE,HL met BC',DE',HL' .


Waarde laden in een register:

    ; 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

Correcte combinaties van mogelijke bron- en doeloperanden zijn beperkt (bijvoorbeeld LD H,(a16) bestaat niet).


Waarde opslaan in een geheugen:

    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 registers

In de 32-bits wereld vallen de registers voor algemene doeleinden in drie algemene klassen: de 16-bits registers voor algemene doeleinden, de 32-bits uitgebreide registers voor algemene doeleinden en de 8-bits registerhelften. Deze drie klassen vertegenwoordigen helemaal geen drie volledig verschillende sets registers. De 16-bit en 8-bit registers zijn eigenlijk namen van regio's binnen de 32-bit registers. De groei van het register in de x86 CPU-familie is tot stand gekomen door de bestaande registers in oudere CPU's uit te breiden

Er zijn acht 16-bits algemene registers: AX, BX, CX, DX, BP, SI, DI en SP; en u kunt elke waarde erin plaatsen die kan worden uitgedrukt in 16 bits of minder.

Toen Intel in 1986 de x86-architectuur uitbreidde tot 32 bits, verdubbelde het de grootte van alle acht registers en gaf ze nieuwe namen door een E voor elke registernaam te plaatsen, resulterend in EAX, EBX, ECX, EDX, EBP, ESI, EDI en ESP.

Met x86_64 kwam nog een verdubbeling van de registergrootte, evenals de toevoeging van enkele nieuwe registers. Deze registers zijn 64 bits breed en hebben een naam (slash gebruikt om alternatieve registernaam weer te geven): RAX / r0, RBX / r3, RCX / r1, RDX / r2, RBP / r5, RSI / r6, RDI / r7, RSP / r4 , R8, R9, R10, R11, R12, R13, R14, R15.

Hoewel de registers voor algemene doeleinden technisch voor alles kunnen worden gebruikt, heeft elk register ook een alternatief / hoofddoel:

  • AX (accumulator) wordt gebruikt in rekenkundige bewerkingen.
  • CX (teller) wordt gebruikt in de instructies voor schakelen en roteren en gebruikt voor lussen.
  • DX (data) wordt gebruikt in rekenkundige en I / O-bewerkingen.
  • BX (basis) gebruikt als een pointer naar gegevens (specifiek als een offset naar het DS-segmentregister in gesegmenteerde modus).
  • SP (stapel) wijst naar de bovenkant van de stapel.
  • BP (stapelbasis) wijst naar de basis van de stapel.
  • SI (bron) lodsb naar een bron in het geheugen voor lodsb (bijv. lodsb ).
  • DI (bestemming) stosb naar een bestemming in het geheugen voor stosb (bijv. stosb ).

Segmentregisters, gebruikt in gesegmenteerde modus, wijzen naar verschillende segmenten in het geheugen. Elk 16-bits segmentregister geeft 64k (16 bits) gegevens weer. Nadat een segmentregister is ingesteld om naar een geheugenblok te wijzen, kunnen registers (zoals BX , SI en DI ) als offsets naar het segmentregister worden gebruikt, zodat toegang tot specifieke locaties in de 64k-ruimte kan worden verkregen.

De zes segmentregisters en hun toepassingen zijn:

Registreren Voor-en achternaam Beschrijving
SS Stack-segment Wijst naar de stapel
CS Codesegment Gebruikt door de CPU om de code op te halen
DS Gegevenssegment Standaardregister voor MOV-bewerkingen
ES Extra segment Extra gegevenssegment
FS Extra segment Extra gegevenssegment
GS Extra segment Extra gegevenssegment

x64 registers

De x64-architectuur is de evolutie van de oudere x86-architectuur, maar bleef compatibel met zijn voorganger (x86-registers zijn nog steeds beschikbaar) maar introduceerde ook nieuwe functies:

  • Registers hebben nu een capaciteit van 64 bits;
  • Er zijn 8 meer algemene registers;
  • Segmentregisters worden gedwongen tot 0 in 64-bits modus;
  • De onderste 32, 16 en 8 bits van elk register zijn nu beschikbaar.

Voor algemeen gebruik

Registreren Naam Subregisters (bits)
RAX Accumulator EAX (32), AX (16), AH (8), AL (8)
RBX Baseren EBX (32), BX (16), BH (8), BL (8)
RCX Teller ECX (32), CX (16), CH (8), CL (8)
RDX Gegevens EDX (32), DX (16), DH (8), DL (8)
RSI Bron ESI (32), SI (16), SL (8)
RDI Bestemming EDI (32), DI (16), DL (8)
RBP Basiswijzer EBP (32), BP (16), BPL (8)
RSP Stapel aanwijzer ESP (32), SP (16), SPL (8)
R8-R15 Nieuwe registers R8D-R15D (32), R8W-R15W (16), R8B-R15B (8)

Notitie

De achtervoegsels die worden gebruikt om de lagere bits van de nieuwe registers aan te pakken, staan voor:

  • B byte, 8 bits;
  • W-woord, 16 bits;
  • D dubbel woord, 32 bits.


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow