Sunteți pe pagina 1din 11

7.5.

Problema hazardului de control


Hazardul de control se referă la situaţia în care o anumită instrucţiune,
cum ar fi o instrucţiune de salt, modifică fluxul execuţiei programului.

7.5.1. Instrucţiuni de salt


In orice limbaj de programare, salturile determină modificarea ordinii
secvenţiale de execuţie a instrucţiunilor. In general, în jur de 20 - 30% din totalul
instrucţiunilor dintr-un program sunt salturi. Pentru acest motiv, instrucţiunile de
salt executate de un sistem pipeline pot reduce în mod semnificativ rata de
prelucrare. Ori de câte ori este executat un salt, trebuie să se încarce o nouă
adresă în contorul de program, ceea ce poate invalida toate instrucţiunile a
căror execuţie a început sau cele care au fost preîncărcate într-un buffer.
Această golire a etajelor pipeline la fiecare salt reduce performanţele sistemului.
De notat că un salt condiţionat, care nu este executat permite continuarea
execuţiei secvenţiale a instrucţiunilor, deci această problemă apare numai în
cazul în care saltul este executat.
In general, instrucţiunile de salt se pot clasifica în trei categorii:
1) Salturi necondiţionate;
2) Salturi condiţionale;
3) Bucle.
Un salt necondiţionat modifică întotdeauna ordinea secvenţială de
execuţie şi, în loc de a incrementa contorul de program, încarcă adresa
destinaţiei saltului în acesta.
Un salt condiţionat încarcă adresa destinaţiei în contorul de program
numai dacă o anumită condiţie, bazată pe starea unor indicatori de condiţii, este
îndeplinită. In caz contrar, contorul de program este incrementat ca de obicei.
Cu alte cuvinte un salt condiţionat selectează o cale a instrucţiunilor pe baza
unei condiţii. In cazul în care condiţia este îndeplinită, această cale începe de la
adresa destinaţiei saltului şi este numită cale destinaţie. In caz contrar, această
cale începe de la următoarea instrucţiune şi este numită cale secvenţială.
O instrucţiune de buclare determină de obicei saltul la începutul buclei,
care este executată de un anumit număr de ori, fix sau variabil.
Dintre aceste tipuri de salturi, salturile condiţionate sunt cel mai dificil de
gestionat. Ca un exemplu, considerăm următoarea secvenţă de instrucţiuni:

i1
i2 (salt condiţionat la ik )
i3
:
ik (destinaţie)
ik +1

Figura 7.11 prezintă execuţia acestei secvenţe de instrucţiuni într-un


sistem pipeline atunci când se selectează calea destinaţie. In această figură, c
indică penalizarea datorită saltului, reprezentând numărul de cicluri pierdute
atunci când este selectată calea destinaţie.
C

Cicluri → 1 2 3 4 5 6 7 8 9 10 11
i1 IF ID OF EX WB
i2 IF ID OF EX WB
i3 IF ID OF EX
i4 IF ID OF
i5 IF ID
ik IF ID OF EX WB
ik+1 IF ID OF EX WB

Fig. 7.11

Prin calcul se poate determină că întâlnirea unor instrucţiuni de salt poate


reduce viteza de execuţie a unui program cu până la 72% din viteza maximă.
Pentru a se reduce efectul salturilor asupra performanţelor unui procesor, au
fost propuse diferite tehnici. Cele mai cunoscute tehnici sunt predicţia salturilor,
întârzierea salturilor şi preîncărcarea multiplă. Aceste tehnici sunt prezentate în
continuare.

7.5.2. Predicţia salturilor


In cazul acestei metode se realizează o predicţie a rezultatului unei decizii
legate de execuţia saltului. Pe baza acestei predicţii, se alege pentru execuţie
calea secvenţială sau calea destinaţie. Deşi prin alegerea căii respective se
reduce adesea penalizarea datorită saltului, penalizarea poate creşte în cazul
unei predicţii eronate.
Există două tipuri de predicţii: predicţii statice şi predicţii dinamice.
- In cazul unei predicţii statice, se decide înaintea execuţiei programului
preîncărcarea instrucţiunilor dintr-una din cele două căi. De exemplu, o tehnică
simplă este aceea de a presupune că saltul trebuie executat întotdeauna. Prin
această tehnică, la întâlnirea unei instrucţiuni de salt se încarcă în contorul de
program adresa de destinaţie a saltului. O altă tehnică este de a alege o
anumită cale (secvenţială sau destinaţie) pentru anumite tipuri de salturi şi
cealaltă cale pentru celelalte tipurilor. In cazul în care alegerea este eronată,
sistemul pipeline este golit şi se încarcă instrucţiunile corespunzătoare căii
corecte.
- In cazul predicţiei dinamice, în timpul execuţiei programului procesorul ia
o decizie bazată pe informaţiile despre salturile executate anterior. Metoda cea
mai simplă este predicţia dinamică utilizând un bit de control p, asignat fiecărei
instrucţiuni de salt. Dacă, la prima execuţie, se realizează saltul p va avea
valoarea 1. In caz contrar p=0. La următoarea întâlnire a acestei instrucţiuni se
urmează calea anterioară. Dacă predicţia a fost eronată se schimbă valoarea
bitului de control p astfel încât, la următoarea execuţie, se va urma cealaltă cale.
O metodă mai eficientă constă în a se asocia un contor de n biţi fiecărei
instrucţiuni de salt. Această metodă este numită metoda de predicţie bazată pe
un contor (counter based branch prediction). In cazul acestei metode, după ce o
instrucţiune de salt a fost executată pentru prima dată, contorul C al acesteia
este setat la o valoare de prag T (10 pentru exemplul din fig. 7.12) dacă a fost
selectată calea destinaţie sau la valoarea T-1 (01 pentru exemplul din fig. 7.12)
dacă a fost selectată calea secvenţială. In continuare, de fiecare dată când
instrucţiunea de salt trebuie executată, dacă C ≥ T , este selectată calea
destinaţie; în caz contrar, este selectată calea secvenţială. Valoarea contorului
C este actualizată după execuţia saltului. In cazul în care calea corectă este
calea destinaţie, contorul este incrementat cu 1; în caz contrar, contorul este
decrementat cu 1.
Dacă C ajunge !a valoarea maximă 2 n − 1 , contorul nu mai este
incrementat, chiar dacă a fost selectată calea destinaţie şi predicţia a fost
corectă. In mod similar, contorul nu este decrementat la o valoare mai mică de
0.
In practică, pentru n şi T se alege adesea valoarea 2. Studiile au arătat că
metodele de predicţie cu 2 biţi sunt aproape la fel de eficiente ca şi metodele
care utilizează un număr mai mare de biţi. Figura 7.12 prezintă stările posibile în
cazul metodei de predicţie cu 2 biţi.
Predicţie corectă

Predicţie Predicţie corectă


cale destinaţie Predicţie
10 cale destinaţie
Predicţie eronată 11

Predicţie Predicţie
eronată corectă

Predicţie corectă
Predicţie Predicţie
cale secvenţială cale secvenţială
01 Predicţie eronată 00

Predicţie corectă
Fig. 7.12

Este convenabil să se memoreze statisticile salturilor într-o tabelă numită


tabelă de istorie a salturilor (branch history table), împreună cu adresa
instrucţiunii de salt şi adresa destinaţiei saltului. Pentru accesul rapid,
majoritatea procesoarelor plasează tabela de istorie a salturilor într-o memorie
cache de dimensiuni reduse, numită buffer al destinaţiei salturilor (BTB - Branch
Target Buffer). De obicei, fiecare intrare a acestei memorii cache păstrează
adresa unei instrucţiuni de salt, adresa destinaţiei saltului şi statisticile de
predicţie.
Metodele de predicţie statice necesită de obicei mai puţine circuite, dar pot
determina creşterea complexităţii compilatorului. Spre deosebire de acestea,
metodele de predicţie dinamice determină creşterea complexităţii circuitelor, dar
necesită operaţii mai simple în timpul compilării. In general, prin utilizarea
predicţiei dinamice se pot obţine rezultate mai bune. Predicţia dinamică asigură,
de asemenea, un grad mai ridicat de compatibilitate a codului obiect, deoarece
deciziile sunt luate după compilare.
Pentru a determina efectul predicţiei salturilor asupra performanţelor, este
necesară reevaluarea numărului mediu al ciclurilor de ceas pentru execuţia unei
instrucţiuni. Există două cazuri posibile: calea anticipată este corectă sau
incorectă.
In cazul în care calea este anticipată corect sunt posibile următoarele
două situaţii:
- dacă a fost aleasă calea destinaţie penalizare datorată saltului este d
(figura 7.13a);
- dacă a fost aleasă calea secvenţială penalizarea este 0.
In cazul în care calea este anticipată incorect penalizarea este c atât
pentru calea destinaţie cât şi pentru calea secvenţială (figura 7.13b).
De notat că în figura 7.13a, adresa căii destinaţie este obţinută după faza
de decodificarea instrucţiunii de salt i2.
d

Cicluri → 1 2 3 4 5 6 7 8 9 10 11
i1 IF ID OF EX WB
i2 IF ID OF EX WB
i3 IF
i4
i5
ik IF ID OF EX WB
ik+1 IF ID OF EX WB
a
c

Cicluri → 1 2 3 4 5 6 7 8 9 10 11
i1 IF ID OF EX WB
i2 IF ID OF EX WB
i3 IF ID OF EX
i4 IF ID OF
i5 IF ID
ik IF ID OF EX WB
ik+1 IF ID OF EX WB
b
Fig. 7.13
In acest caz în care se utilizează predicţia salturilor sistemul pipeline
funcţionează la 78% din viteza sa maximă.

7.5.3. Întârzierea salturilor


Întârzierea salturilor (delayed branching) elimină sau reduce în mod
semnificativ efectul penalizării datorită salturilor. In cazul acestei metode se
încarcă şi se execută un anumit număr de instrucţiuni după instrucţiunea de salt,
indiferent de calea care va fi selectată pentru salt. De exemplu, un procesor cu
o întârziere a salturilor egală cu k execută următoarele k instrucţiuni secvenţiale
iar apoi, fie continuă pe aceeaşi cale, fie începe execuţia instrucţiunilor de la
adresa destinaţiei saltului. De câte ori este posibil, compilatorul încearcă să
plaseze după instrucţiunea de salt k instrucţiuni care sunt independente de
instrucţiunea de salt. Dacă nu există suficiente instrucţiuni de acest tip,
compilatorul va insera instrucţiuni NOP. Ca un exemplu, considerăm
următoarea secvenţă:
i1 : LOAD R1, A
i2 : LOAD R2, B
i3 : BRZ R2, i7 ; salt la i7 dacă R2 = 0
i4 : LOAD R3, C
i5 : ADD R4, R2, R3 ; R4 = B + C
i6 : MUL R5, R1, R2 ; R5 = A * B
i7 : ADD R4, R1, R2 ; R4 = A + B
Presupunând k=2, compilatorul modifică această secvenţă prin mutarea
instrucţiunii i1 şi inserarea unei instrucţiuni NOP după instrucţiunea de salt i3 .
Secvenţa modificată este următoarea:
i2 : LOAD R2, B
i3 : BRZ R2, i7
i1 : LOAD R1, A
NOP
i4 : LOAD R3, C
i5 : ADD R4, R2, R3
i6 : MUL R5, R1, R2
i7 : ADD R4, R1, R2
După cum se observă din secvenţa modificată, instrucţiunea i1 este
executată indiferent de rezultatul evaluării saltului. Pentru a înţelege efectul de
reducere a penalizării prin utilizarea întârzierii salturilor ne vom referi la figura
7.13(b). In cazul în care nu se utilizează metoda întârzierii salturilor, atunci când
predicţia sugerează ca probabilă calea secvenţială, se începe execuţie
instrucţiunilor care urmează după instrucţiunea de salt. Dacă, după execuţia
instrucţiunii de salt de constată că predicţia a fost eronată, sistemul pipeline se
goleşte pentru a începe execuţia instrucţiunilor de pe calea de destinaţie. In
acest caz cele trei perioade de ceas în care se încerca execuţia instrucţiunilor
de pe calea secvenţială au fost irosite. Dacă pe cale secvenţială sunt introduse
instrucţiuni care sunt independente de instrucţiunea de salt, în cazul considerat,
se continuă cu execuţia acestora şi abia după finalizarea acelor instrucţiuni, se
trece la execuţia instrucţiunilor de pe calea destinaţie. In acest mod nu a fost
pierdut nici un ciclu de ceas.

7.5.4. Preîncărcarea multiplă (multiple prefetching)


In acest caz, procesorul extrage instrucţiuni din ambele căi posibile. După
ce s-a luat decizia despre execuţia saltului, calea nedorită este abandonată.
Prin extragerea prealabilă a instrucţiunilor din ambele căi posibile, se evită
penalizarea datorită extragerii instrucţiunilor în cazul unei predicţii incorecte.
Pentru extragerea instrucţiunilor din ambele căi, se utilizează două buffere.
La execuţia normală, primul buffer este încărcat cu instrucţiuni aflate pe calea
secvenţială iar cel de al doilea buffer cu instrucţiuni de pe calea destinaţie. Dacă
saltul este executat, conţinutul primului buffer este invalidat şi este utilizat
conţinutul celui de-al doilea buffer.
Această metodă de extragere dublă asigură un flux constant de instrucţiuni
şi date pentru sistemul pipeline şi reduce întârzierile datorate golirii şi
reîncărcării sistemului pipeline.
In concluzie, fiecare din tehnicile prezentate anterior reduce diminuarea
ratei de transfer a sistemului pipeline. Alegerea uneia din aceste tehnici pentru
un sistem particular depinde de factori ca cerinţele ratei de transfer şi restricţiile
de cost. In practică, datorită acestor factori, într-un procesor se implementează
de obicei o combinaţie a acestor tehnici.

7.6. Îmbunătăţirea ratei de transfer a sistemelor pipeline


Rata de transfer a unui sistem pipeline este definită ca fiind numărul
taskurilor de intrare pe care le poate prelucra acesta în unitatea de timp.
O posibilitate de creştere a ratei de transfer a unui sistem pipeline de
instrucţiuni este de a se utiliza paralelismul la nivelul instrucţiunilor (instruction-
level parallelism - ILP). Acest procedeu constă dintr-un set de tehnici ale
procesorului şi compilatorului care îmbunătăţesc performanţa prin executarea
operaţiilor independente în paralel. Sistemele bazate pe paralelismul la nivelul
instrucţiunilor preiau un program convenţional într-un limbaj de nivel înalt scris
pentru procesoare secvenţiale şi utilizează tehnici statice (ale compilatorului) şi
dinamice (implementate în cursul execuţiei) pentru a exploata în mod automat
paralelismul implicit al programului.
Metodele obişnuite pentru a exploata paralelismul la nivelul instrucţiunilor
sunt prelucrarea superscalară, prelucrarea superpipeline şi cuvintele foarte lungi
de instrucţiuni (Very Long lnstruction Word — VLIW). O metodă mai nouă este
numită EPIC (Explicitly Parallel lnstruction Computing). Fiecare din aceste
metode încearcă iniţierea mai multor instrucţiuni în acelaşi ciclu de ceas.
7.6.1. Prelucrarea superscalară
Metoda de prelucrare superscalară constă în execuţia concurentă a mai
multor operaţii în unităţi separate de prelucrare. Această metodă realizează
multiplicarea execuţiei instrucţiunilor într-un ciclu de ceas prin lansarea mai
multor instrucţiuni către diferite unităţi funcţionale. Un procesor superscalar
conţine unităţi multiple de execuţie, fiecare din acestea fiind de obicei de tip
pipeline, Un astfel de procesor este constituit dintr-un set de sisteme pipeline de
instrucţiuni, fiecare dintre acestea lucrând independent. Unitatea de control a
unui procesor superscalar este proiectată pentru a încărca şi a decodifica mai
multe instrucţiuni în mod concurent. Aceasta poate lansa sau expedia până la k
instrucţiuni simultan către diferitele unităţi de execuţie, unde k poate avea o
valoare egală cu şase sau, utilizând tehnologia actuală, mai mare. Necesitatea
de a prelucra mai multe instrucţiuni simultan fără conflicte complică mult
proiectarea unităţii de control. Figura 7.14 prezintă într-o formă ideală
diferenţele din punct de vedere al posibilităţilor de prelucrare ale instrucţiunilor
între trei organizări UCP: un procesor secvenţial (care nu este de tip pipeline),
un procesor de tip pipeline şi un procesor superscalar, fiecare dintre acestea
executând acelaşi şir de instrucţiuni I1 , I 2 , I 3 ,... . Presupunând că fiecare
instrucţiune necesită un număr total de cinci cicluri, putem observa că un singur
sistem pipeline k=1 cu cinci etaje oferă o creştere a vitezei de 5 ori, în timp ce
un sistem superscalar cu două instrucţiuni lansate simultan (k=2) oferă o
creştere potenţială a vitezei de 10 ori. La începutul ciclului 15, procesorul
secvenţial a terminat numai două instrucţiuni, în timp ce procesorul de tip
pipeline şi cel superscalar au terminat 10, respectiv 20 de instrucţiuni. Mai mult,
procesorul superscalar a început prelucrarea instrucţiunilor I 21 la I 30 .
După cum se ilustrează în figura 7.14, prezenţa a k unităţi de execuţie de
tip pipeline cu m etaje permite unui UCP superscalar să atingă factori de
creştere a vitezei care se apropie de k x m, comparativ cu un UCP care nu
dispune de paralelism la nivelul instrucţiunilor. Ocuparea a k sisteme pipeline
necesită ca UCP să încarce cel puţin k instrucţiuni în fiecare ciclu de ceas.
Volumul ridicat al traficului de instrucţiuni de la memoria de program la UCP
necesită ca sistemul să dispună de o memorie cache rapidă şi de dimensiuni
mari, adesea sub forma unei memorii cache de instrucţiuni (I-cache) pentru
păstrarea programului, completată cu o memorie cache de date (D-cache)
pentru păstrarea operanzilor. Pentru extragerea instrucţiunilor, există de obicei
un buffer sau o coadă de instrucţiuni în cadrul UCP, care păstrează
instrucţiunile preîncărcate şi parţial decodificate. Unitatea de control expediază
instrucţiunile din bufferul de instrucţiuni către diferitele unităţi de execuţie.
Unitatea de control a unui procesor superscalar este responsabilă pentru
determinarea momentului în care poate fi executată fiecare instrucţiune şi
pentru asigurarea accesului la resursele pe care instrucţiunea le necesită, cum
sunt operanzi din memorie, unităţi de execuţie şi registre UCP. Pentru aceasta,
unitatea de control trebuie să ţină cont de următorii factori:
• Tipul instrucţiunii: De exemplu, o instrucţiune de adunare în virgulă
mobilă trebuie expediată la o unitate de execuţie în virgulă mobilă şi nu la o
unitate în virgulă fixă.
• Disponibilitatea unităţii de execuţie: O instrucţiune poate fi expediată la
o unitate de execuţie de tip pipeline numai dacă nu vor rezulta coliziuni.

Fig. 7.14

• Dependenţe de date: Pentru a evita conflictele la utilizarea registrelor,


trebuie satisfăcute restricţii privind dependenţele de date între operanzii
instrucţiunilor active.
• Dependenţe de control: Pentru a menţine performanţe ridicate, sunt
necesare tehnici pentru a reduce impactul instrucţiunilor de salt asupra eficienţei
sistemelor pipeline.
• Ordinea instrucţiunilor: Instrucţiunile trebuie să genereze rezultatele în
ordinea specificată de programul care se execută. Rezultatele pot fi însă
calculate intern într-o ordine diferită pentru a îmbunătăţi performanţele UCP.
Pentru păstrarea ordinii de execuţie a instrucţiunilor între care există
dependenţe şi pentru a asigura obţinerea unor rezultate valide, un procesor
superscalar trebuie să utilizeze un mecanism de control, care poate fi bazat pe
metoda tabelei de rezultate. In practică, majoritatea procesoarelor se bazează
pe tehnica superscalară şi utilizează metoda tabelei de rezultate.
Pentru a rezolva problema salturilor întârziate se utilizează diferite metode
arhitecturale, cum sunt memorii cache (sau buffere) pentru destinaţia saltului şi
execuţia speculativă. Execuţia speculativă implică predicţia direcţiei unui salt
dependent de date şi execuţia instrucţiunilor corespunzătoare. Cu seturi multiple
de registre virtuale şi utilizând metoda tabelei de rezultate, un procesor poate
urmări ambele căi ale unui salt şi poate alege şirul corect de instrucţiuni.

7.6.2. Prelucrarea superpipeline


Metoda superpipeline asigură performanţe ridicate prin suprapunerea
execuţiei unui număr mai mare de instrucţiuni într-un singur sistem pipeline de
instrucţiuni. Un procesor superpipeline conţine de obicei un sistem pipeline de
instrucţiuni cu un număr mai mare de etaje decât un sistem pipeline obişnuit. Cu
alte cuvinte, procesul de execuţie al unei instrucţiuni este divizat în etape cu
complexitate mai redusă. Prin creşterea numărului de etaje ale sistemului
pipeline de instrucţiuni este posibilă creşterea frecvenţei ceasului, deoarece
această frecvenţă depinde de întârzierea introdusă de etajul cel mai lent.
Metoda superpipeline are anumite avantaje. O singură unitate funcţională
necesită un spaţiu mai redus şi circuite mai simple comparativ cu structurile
bazate pe prelucrarea superscalară. Spaţiul suplimentar care rămâne disponibil
permite implementarea unor circuite speciale pentru obţinerea unor viteze mai
ridicate, memorii cache de dimensiuni mai mari şi căi de date cu un număr mai
mare de linii.
Majoritatea procesoarelor actuale utilizează metoda superpipeline. De
exemplu, sistemul pipeline al familiei de procesoare cu arhitectura Intel actuală
constă din 20 etaje, faţă de 5 la procesorul Intel Pentium şi 6 la procesorul Intel
Pentium cu extensiile MMX. Aceasta permite familiei de procesoare cu
arhitectura Intel actuală să ajungă la o frecvenţă cu aproximativ 50% mai
ridicată faţă de procesorul Pentium cu aceeaşi tehnologie de fabricaţie.
Să considerăm un procesor care divizează extragerea instrucţiunilor şi
accesul la memoria cache de date pentru a crea un sistem pipeline cu opt etaje.
Operaţiile executate în fiecare etaj al sistemului pipeline permit un ciclu de ceas
cu o frecvenţă dublă. Cele opt etaje ale sistemului pipeline sunt ilustrate în
figura 7.15.
Fig. 7.15.

Faze corespunzătoare celor opt etaje ale sistemului pipeline sunt descrise
mai jos.
1. IF (Instruction Fetch, First Half): Sistemul de comandă selectează o
adresă de instrucţiune şi începe extragerea acestei instrucţiuni din memoria
cache de instrucţiuni. In aceeaşi fază, bufferul de translatare (TLB) pentru
instrucţiuni, începe translatarea adresei virtuale într-o adresă fizică.
2. IS (Instruction Fetch, Second Half): Extragerea instrucţiunii din memoria
cache de instrucţiuni şi translatarea adresei virtuale într-o adresă fizică sunt
terminate.
3. RF (Register Fetch): Instrucţiunea este decodificată şi marcajul
memoriei cache de instrucţiuni este comparat cu numărul cadrului de pagină
obţinut din bufferul de translatare pentru instrucţiuni. Operanzii necesari sunt
încărcaţi din setul de registre.
4. EX (Instruction Execution): UAL execută operaţia aritmetică sau logică
pentru instrucţiunile care operează cu registrele. Pentru instrucţiunile de
încărcare şi memorare, UAL calculează adresa virtuală a datelor. Pentru
instrucţiunile de salt, UAL determină dacă condiţia de salt este adevărată şi
calculează adresa virtuală a destinaţiei saltului.
5. DF (Data Fetch, First Half): Pentru instrucţiunile de încărcare şi
memorare, începe extragerea datelor din memoria cache de date şi translatarea
adresei virtuale într-o adresă fizică. Pentru instrucţiunile de salt, începe
translatarea adresei şi actualizarea TLB. Pentru instrucţiunile care
operează cu registrele, nu se execută nici o operaţie în timpul fazelor DF, DS şi
TC.
6. DS (Data Fetch, Second Half): Pentru instrucţiunile de încărcare şi
memorare, extragerea datelor din memoria cache de date şi translatarea
adresei virtuale într-o adresă fizică sunt terminate. Pentru instrucţiunile de salt,
translatarea adresei şi actualizarea TLB sunt terminate.
7. TC (Tag Check): Pentru instrucţiunile de încărcare şi memorare,
memoria cache execută testarea marcajului. Adresa fizică din TLB este
comparată cu marcajul memoriei cache pentru a determina dacă există un
succes sau un eşec la accesul memoriei cache.
8. WB (Write Back): Pentru instrucţiunile care operează cu registrele,
rezultatul instrucţiunii este scris în setul de registre. Pentru instrucţiunile de salt,
nu se execută nici o operaţie în timpul acestei faze.

S-ar putea să vă placă și