Sök…


Anmärkningar

Vad är register?

Processorn kan arbeta med numeriska värden (siffror), men dessa måste lagras någonstans först. Uppgifterna lagras mestadels i minnet, eller inuti instruktionsoptiskoden (som vanligtvis lagras i minnet), eller i speciellt on-chip-minne placerat direkt i processorn, som kallas register .

För att arbeta med värde i registret behöver du inte adressera det efter adress, men speciella mnemoniska "namn" används, till exempel ax på x86, eller A på Z80, eller r0 på ARM.

Vissa processorer är konstruerade på ett sätt, där nästan alla register är lika och kan användas för alla ändamål (ofta RISC-grupp av processorer), andra har distinkt specialisering, när bara vissa register kan användas för aritmetik ( "ackumulator" på tidiga processorer) ) och andra register endast för minnesadressering etc.

Denna konstruktion som använder minnet direkt på processorchipet har enorma prestandakonsekvenser, att lägga till två siffror från register som lagrar det för att registrera görs vanligtvis på kortast möjliga tid av den processorn (Exempel på ARM-processor: ADD r2,r0,r1 sätter r2 till (r0 + r1) värde, i en enda processorcykel).

Tvärtom, när en av operandarna refererar till en minnesplats, kan processorn stanna under en tid och vänta på att värdet kommer fram från minneschipet (på x86 kan detta sträcka sig från noll vänta på värden i L0-cache till hundratals CPU-cykler när värdet inte finns i någon cache och måste läsas direkt från minnet DRAM-chip).

Så när programmerare skapar en viss databehandlingskod vill hon vanligtvis ha all data under bearbetning i register för att få bästa prestanda. Om det inte är möjligt, och minnesläsningar / -skrivningar krävs, bör dessa minimeras och bilda ett mönster som samarbetar med cacheminne / minnesarkitektur för den specifika plattformen.

Den ursprungliga storleken på register i bitar används ofta för att gruppera processorer, som Z80 är "8-bitars processor" , och 80386 är "32-bitars processor" - även om den gruppering sällan är en tydlig klippning. Exempelvis fungerar Z80 också med registerpar som bildar ett 16 bitars värde och 32 bitars 80686 CPU har MMX-instruktioner för att arbeta med 64 bitars register nativt.

Zilog Z80-register

Register: 8 bit: A , B , C , D , E , H , L , F , I , R , 16 bit: SP , PC , IX , IY och skuggor av några 8b-register: A' , B' , C' , D' , E' , H' , L' och F' .

De flesta av de 8 bitars register kan också användas i par som 16 bitars register: AF , BC , DE och HL .

SP är stackpekaren som markerar botten i stackminnet (används av PUSH / POP / CALL / RET instruktioner).
PC är programräknare som pekar på den nuvarande exekverade instruktionen.
I är avbrottsregister som tillhandahåller högbyte av vektortabelladress för IM 2 avbrottsläge.
R är uppdateringsregister , det ökar varje gång CPU hämtar en opcode (eller opcode prefix).
Vissa inofficiella instruktioner finns på vissa Z80-processorer för att manipulera 8bit delar av IX som IXH:IXL och IY som IYH:IYL .

Det går inte att komma åt skuggvarianter direkt med någon instruktion, EX AF,AF' instruktionen EX AF,AF' kommer att byta mellan AF och AF' , och EXX instruktion byter BC,DE,HL med BC',DE',HL' .


Laddar värde i ett 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

Korrekta kombinationer av möjliga käll- och destinationsoperander är begränsade (till exempel LD H,(a16) finns inte).


Lagra värde i ett minne:

    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 register

I 32-bitarsvärlden faller de allmänna användningsregistrerna i tre allmänna klasser: 16-bitars allmänna användningsregister, de 32-bitars utvidgade allmänna användningsregistren och 8-bitars registerhalvor. Dessa tre klasser representerar inte alls tre helt uppsatta register. De 16-bitars och 8-bitars register är faktiskt namn på regioner inuti 32-bitars register. Registrera tillväxt i CPU-familjen x86 har uppstått genom att utöka register som finns i äldre CPU: er

Det finns åtta 16-bitars allmänna register: AX, BX, CX, DX, BP, SI, DI och SP; och du kan placera vilket värde som helst i dem som kan uttryckas i 16 bitar eller färre.

När Intel utvidgade x86-arkitekturen till 32 bitar 1986, fördubblades storleken på alla åtta register och gav dem nya namn genom att prefixa en E framför varje registernamn, vilket resulterade i EAX, EBX, ECX, EDX, EBP, ESI, EDI och ESP.

Med x86_64 kom ytterligare en fördubbling av registerstorleken samt tillägg av några nya register. Dessa register är 64 bitar breda och namnges (snedstreck används för att visa alternativt registernamn): RAX / r0, RBX / r3, RCX / r1, RDX / r2, RBP / r5, RSI / r6, RDI / r7, RSP / r4 R8, R9, R10, R11, R12, R13, R14, R15.

Medan register för allmänna ändamål tekniskt kan användas för vad som helst, har varje register också ett alternativt / huvudsakligt syfte:

  • AX (ackumulator) används i aritmetiska operationer.
  • CX (räknare) används i skift- och rotationsinstruktionerna och används för slingor.
  • DX (data) används i aritmetik- och I / O-operationer.
  • BX (bas) används som en pekare till data (specifikt som en förskjutning till DS-segmentregistret i segmenterat läge).
  • SP (stack) pekar på toppen av stacken.
  • BP (stapelbotten) pekar mot bunten av stapeln.
  • SI (källa) pekar på en källa i minnet för lodsb (t.ex. lodsb ).
  • DI (destination) pekar på en destination i minnet för stosb (t.ex. stosb ).

Segmentregister som används i segmenterat läge pekar på olika segment i minnet. Varje 16-bitars segmentregister ger 64k (16 bitar) data. Efter att ett segmentregister har ställts in för att peka på ett minnesblock, kan register (såsom BX , SI och DI ) användas som förskjutningar till segmentregistret så att specifika platser i 64k-rymden kan nås.

De sex segmentregistren och deras användning är:

Registrera Fullständiga namn Beskrivning
SS Stack Segment Pekar på stacken
CS Kodsegment Används av CPU för att hämta koden
DS Datasegment Standardregister för MOV-operationer
ES Extra segment Extra datasegment
FS Extra segment Extra datasegment
GS Extra segment Extra datasegment

x64-register

X64-arkitekturen är utvecklingen av den äldre x86-arkitekturen, den behöll kompatibiliteten med sin föregångare (x86-register finns fortfarande tillgängliga) men den introducerade också nya funktioner:

  • Registren har nu en kapacitet på 64 bitar;
  • Det finns åtta mer allmänna register;
  • Segmentregister tvingas till 0 i 64 bitar-läge;
  • De lägre 32, 16 och 8 bitarna i varje register är nu tillgängliga.

Generell mening

Registrera namn Underregister (bitar)
RAX Ackumulator EAX (32), AX (16), AH (8), AL (8)
RBX Bas EBX (32), BX (16), BH (8), BL (8)
RCX Disken ECX (32), CX (16), CH (8), CL (8)
RDX Data EDX (32), DX (16), DH (8), DL (8)
RSI Källa ESI (32), SI (16), SL (8)
RDI Destination EDI (32), DI (16), DL (8)
RBP Baspekaren EBP (32), BP (16), BPL (8)
RSP Stapelpekaren ESP (32), SP (16), SPL (8)
R8-R15 Nya register R8D-R15D (32), R8W-R15W (16), R8B-R15B (8)

Notera

Suffixen som används för att adressera de lägre bitarna i de nya registren står för:

  • B-byte, 8 bitar;
  • W-ord, 16 bitar;
  • D dubbelt ord, 32 bitar.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow