Registrul procesorului

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 17 iunie 2019; verificările necesită 24 de modificări .

Registrul procesorului  este un câmp de o lungime dată în memoria ultra-rapidă cu acces aleator (SRAM) din procesor. Este folosit de procesorul însuși, poate fi fie accesibil, fie inaccesibil de software. De exemplu, la preluarea următoarei instrucțiuni din memorie, aceasta este plasată în registrul de instrucțiuni , care nu poate fi accesat de programator.

Registre inaccesibile programatic

Registrele inaccesibile din punct de vedere programatic sunt orice registre de procesor care nu pot fi accesate într-un fel sau altul din programul care se execută. Un exemplu de astfel de registre este registrul de instrucțiuni deja menționat .

Registre accesibile de software

Registrele accesibile din punct de vedere programatic sunt registre care pot fi accesate într-un fel sau altul din programul care se execută. Aproape fiecare astfel de registru este desemnat prin identificatorul său de nume la nivel de limbaj de asamblare și codul de identificare numeric corespunzător la nivel de limbaj de mașină. În ceea ce privește accesibilitatea, registrele accesibile programatic nu sunt aceleași și sunt practic împărțite în două subgrupuri mari:

Registrele speciale [3] conțin date necesare funcționării procesorului - decalaje de tabel de bază, niveluri de acces etc.

O parte din registrele speciale aparține dispozitivului de control , care controlează procesorul prin generarea unei secvențe de microinstrucțiuni .

Accesul la valorile stocate în registre se realizează direct la frecvența ceasului procesorului și, de regulă, de câteva ori mai rapid decât accesarea câmpurilor din RAM (chiar dacă memoria cache conține datele necesare), dar cantitatea de RAM este departe depășește cantitatea totală de registre de procesor, „capacitatea” totală a registrelor de uz general / de date pentru procesoarele x86 (de exemplu, Intel 80386 și mai noi) 8 registre de 4 octeți = 32 de octeți (În procesoarele x86-64 - 16 din 8 octeți = 128 de octeți și niște registre vectoriale).

Câteva exemple

Tabelul arată numărul de registre de uz general în mai multe arhitecturi comune de microprocesoare. Este de remarcat faptul că, în unele arhitecturi, utilizarea registrelor individuale poate fi complicată. Deci, în SPARC și MIPS, registrul numărul 0 nu stochează informații și este întotdeauna citit ca 0, iar la procesoarele x86 cu un registru ESP(pointer către stivă), doar unele comenzi pot funcționa.

Arhitectură
registre întregi
FP -
registre
Note
x86-32 opt opt
x86-64 16 16
IBM System/360 16 patru
z/Arhitectură 16 16
Itanium 128 128
SPARC 31 32 Registrul 0 (global) rulează mereu
IBM Cell 4~16 1~4
IBM POWER 32 32
arhitectura puterii 32 32
Alfa 32 32
6502 3 0
W65C816S 5 0
PIC unu 0
AVR 32 0
ARM pe 32 de biți [4] 16 variat
ARM pe 64 de biți [5] 31 32
MIPS 31 32 Registrul 0 este întotdeauna zero
RISC-V 31 32 În plus, există registrul 0 care returnează întotdeauna zero
Elbrus 2000 256 aliniat cu

întreg

32 de registre din două cifre,

256 = 32 de registre globale + 224 de registre de stivă de proceduri [6]

arhitectura x86

IP ( English  Instruction Pointer ) - un registru care indică decalajul (adresa) instrucțiunilor din segmentul de cod (1234: 0100h segment / offset).

IP - 16 biți (partea inferioară a EIP)

EIP - analogic pe 32 de biți (partea inferioară a RIP)

RIP - analog pe 64 de biți

Registrele de segmente  sunt registre care indică segmente.

Toate registrele de segment sunt pe 16 biți.

CS ( segment de cod ) ,  DS ( segment de date ) , SS ( segment de stivă ) , ES ( segment suplimentar ) , FS, GS    

În modul real al procesorului, registrele de segment conțin adresa începutului segmentului de 64Kb, deplasată la dreapta cu 4 biți.

În modul protejat al procesorului, registrele de segmente conţin selectorul segmentului de memorie alocat de OS.

CS este un pointer către un segment de cod. Legarea CS:IP (CS:EIP/CS:RIP - în modul securizat/64 de biți) indică adresa de memorie a următoarei instrucțiuni.

În modul pe 64 de biți, registrele de segment CS, DS, ES și SS nu participă la formarea unei adrese liniare (continue), deoarece segmentarea nu este suportată în acest mod.

Registrele de date  sunt folosite pentru a stoca calcule intermediare.

RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, R8 - R15 - 64 de biți (registru AX)

EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, R8D - R15D - 32 de biți (AX extins)

AX ( acumulator ) ,  CX ( registru de numărare ) , DX ( registru de date ) , BX ( registru de bază ) , SP ( indicator de stivă ) , BP ( indicator de bază ) SI (, Index sursă ), DI ( index de destinație ), R8W - R15W - 16 biți        

AH, AL, CH, CL, DH, DL, BH, BL, SPL, BPL, SIL, DIL, R8B - R15B - 8 biți (jumătăți de registre de 16 biți)

de exemplu, AH - mare AX - jumătate mare de 8 biți

AL - AX scăzut - jumătate inferioară de 8 biți

RAX RCX RDX RBX
EAX ECX EDX EBX
TOPOR CX DX BX
AH AL CH CL D.H. DL BH BL


RSP RBP RSI CDI Rx
ESP EBP ESI EDI RxD
SP BP SI DI RxW
SPL BPL SIL DIL RxB

unde x este 8..15.
Registrele RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, Rx, RxD, RxW, RxB, SPL, BPL, SIL, DIL sunt disponibile numai în modul procesor pe 64 de biți.

Flags register FLAGS (16 biți) / EFLAGS (32 biți) / RFLAGS (64 biți) - conține starea curentă a procesorului.

Registrele de sistem GDTR, LDTR și IDTR au fost introduse în procesoare începând cu Intel286 și sunt concepute pentru a stoca adresele de bază ale tabelelor de descriptori  - cele mai importante componente ale arhitecturii sistemului atunci când se lucrează în mod protejat.

Registrul GDTR conține o adresă de bază de 32 de biți (24 de biți pentru Intel286) și o limită de tabel global de descriptori ( GDT ) de 16 biți.

Partea vizibilă a registrului LDTR conține doar selectorul de descriptori LDT ( local descriptor table ). Descriptorul LDT în sine este încărcat automat în partea ascunsă LDTR din tabelul de descriptor global.

Registrul IDTR conține o adresă de bază de 32 de biți (24 de biți pentru Intel286) și o limită de tabel de descriptori de întrerupere ( IDT ) de 16 biți. În modul real, poate fi folosit pentru a schimba locația tabelului vector de întrerupere.

Partea vizibilă a registrului TR conține selectorul Task State Segment Descriptor ( TSS ). Descriptorul TSS în sine este încărcat automat în partea ascunsă a TR din tabelul de descriptor global.

Un registru este o unitate funcțională care primește, stochează și transmite informații. Registrele constau dintr-un grup de declanșatori , de obicei D. După tipul de recepție și emitere a informațiilor, se disting 2 tipuri de registre:

Registrele de deplasare sunt un lanț de flip- flops conectat în serie . Modul principal de operare este deplasarea biților codului de la un declanșator la altul pentru fiecare impuls al semnalului de ceas.

După scop, registrele diferă prin:

Contor de comenzi

IP

IP ( Engleză  Instruction Pointer ) - un registru care conține adresa-offset al următoarei instrucțiuni care urmează să fie executată în raport cu segmentul de cod CS în procesoarele din familia x86 .

Registrul IP este asociat cu CS ca CS:IP, unde CS este segmentul de cod curent și IP este decalajul curent față de acel segment.

Registrul IP este un registru pointer pe 16 biți. Pe lângă acesta, acest tip de registre include SP ( English  Stack Pointer  - stack pointer) și BP ( English  Base Pointer  - pointer de bază).

Principiul de funcționare

De exemplu, CS conține valoarea , registrul IP stochează offset . 2CB5[0]H123H

Adresa următoarei instrucțiuni de executat este calculată prin adăugarea adresei din CS (Code Segment) la offset-ul din registrul IP:

2CB50H + 123H = 2CC73H

Astfel, adresa următoarei instrucțiuni de executat este 2CC73H.

Când instrucțiunea curentă este executată, procesorul schimbă automat valoarea din registrul IP, astfel încât perechea de registru CS:IP indică întotdeauna către următoarea instrucțiune care urmează să fie executată.

EIP

Începând cu procesorul 80386 , a fost introdusă o versiune pe 32 de biți a registrului pointerului - EIP ( Extended Instruction Pointer ) .  În acest caz, IP este capătul de jos al acestui registru (primii 16 biți). Principiul de funcționare a EIP este în general similar cu funcționarea registrului IP. Principala diferență este că în modul protejat, spre deosebire de modul real, registrul CS este un selector (selectorul nu indică segmentul în sine din memorie, ci descriptorul de segment din tabelul de descriptori).

RIP

Procesoarele pe 64 de biți folosesc propriul lor registru de indicator de instrucțiuni - RIP .

Partea inferioară a acestui registru este registrul EIP.

Bazat pe RIP, o nouă metodă de adresare relativă RIP a fost introdusă în procesoarele pe 64 de biți. Restul activității RIP este similară cu cea a registrului EIP.

Note

  1. Barbara J. Burian. O abordare simplă a programării în limbaj de asamblare S/370. — New York: Prentice-Hall, Inc., 1977.
  2. Pogorely S. D., Slobodyanyuk T. F. Software pentru sisteme cu microprocesoare. Director. — al 2-lea, revizuit și completat. - Kiev: Technika, 1989. - S. 7, 48-51. — 301 p. - (Manualul specialistului). — 50.000 de exemplare.  — ISBN 5-335-00169-0 .
  3. Intel 64 și IA-32 Architectures Software Developer's Manual. Volumul 1: Arhitectura de bază. 3.4 REGISTRE DE EXECUTARE A PROGRAMULUI DE BAZĂ Arhivat la 24 mai 2011 la Wayback Machine 
  4. Standard de apel de procedură pentru arhitectura ARM . ARM Holdings (16 octombrie 2009). Consultat la 24 aprilie 2012. Arhivat din original pe 28 aprilie 2013.
  5. Standard de apel de procedură pentru arhitectura ARM pe 64 de biți . ARM Holdings (25 noiembrie 2011). Consultat la 24 aprilie 2012. Arhivat din original pe 28 aprilie 2013.
  6. MCST. Introducere în arhitectura Elbrus  (rusă)  ? . Alt Linux (31 mai 2020). Preluat la 16 iulie 2020. Arhivat din original la 2 iunie 2020.

Link -uri