Sunteți pe pagina 1din 15

Universitatea SPIRU HARET

Arhitectura Sistemelor de Calcul


Laborator 5

Microprocesoare Intel X86

Structura internă
Microprocesorul I8086 cuprinde două unităţi funcţionale, care lucrează asincron
şi independent una faţă de alta:
- unitatea de execuţie (EU, Execution Unit), cu rol în executarea instrucţiunilor;
- unitatea de interfaţă cu magistrala (BIU, Bus Interface Unit), cu rol de a aduce
instrucţiunile din memorie şi de a transfera operanzii între EU şi exteriorul
microprocesorului.

BIU realizează interfaţarea µp cu exteriorul printr-o magistrală de adrese de 20


linii, din care: primele 16 sunt multiplexate cu magistrala de date, iar ultimele 4 sunt
multiplexate cu informaţiile de stare şi o magistrală de comenzi.
Deoarece lucrează independent de EU, cuplarea celor două unităţi se face printr-
o memorie tampon, de tip FIFO, de capacitate 6 octeţi, numită coadă (şir) de
instrucţiuni. În coadă, BIU va introduce instrucţiuni citite în avans, pe 2 octeţi de la
adrese succesive. EU va citi instrucţiunile din această coadă.
Dacă în FIFO sunt cel puţin 2 octeţi neocupaţi şi dacă EU nu solicită BIU pentru
efectuarea unei operaţii cu exteriorul, BIU va executa un ciclu de aducere în avans a unei
instrucţiuni din memorie (2 octeţi odată). Dacă primul octet din cuvântul citit se găseşte
la adresă impară, BIU va citi cuvântul în două cicluri maşină.
Dacă FIFO este goală, primul cuvânt citit de BIU este introdus în capul cozii
pentru a putea fi preluat imediat de către EU.

Dacă în timpul execuţiei unei instrucţiuni, EU necesită transferul unui operand


cu exteriorul microprocesorului, EU comunică spre BIU tipul de ciclu ce trebuie executat
şi adresa efectivă (AE) pe 16 biţi a operandului. BIU calculează adresa fizică a
operandului (pe 20 biţi), generează semnalele de comandă pentru transferul operandului
şi mijloceşte transferul între EU şi exterior. Dacă cererea de transfer din partea EU apare
în timp ce BIU execută un ciclu de aducere anticipată a unei instrucţiuni, BIU încheie
ciclul început şi apoi execută transferul.

Alocarea MP
Alocarea MP se realizează prin segmentare în segmente de lungime maximă 64
ko. Dar faţă de segmentarea obişnuită, (în care segmentele puteau avea orice adresă de
bază), AB a segmentelor, în cazul alocării MP de către I8086 trebuie să fie multiplu de
16. Aceasta deoarece adresa de segment conţine doar 16 biţi, iar spaţiul adreselor fizice
are 20 biţi.
Tabela de segmente este conţinută în registrele µp şi este formată din cele 4
registre
de
segment.

În orice moment doar 4 segmente pot fi adresate direct, deci dim L = 4•64 ko =
256 ko,
dim P = 1Mo. Selecţia segmentului şi calculul adresei fizice se realizează implicit (nu se
specifică explicit într-un câmp de instrucţiune) pe baza unor reguli prestabilite.
Calculul adresei fizice se realizează în UA (unitatea aritmetică) din BIU, în
felul următor:
- conţinutul registrului de segment folosit se deplasează la stânga cu 4 poziţii, punând 0
în poziţiile rămase libere (se realizează o înmulţire cu 16);
- se adună apoi conţinutul cu deplasamentului (offset-ul) pe 16 biţi.
Exemplu de calcul al adresei fizice a unei instrucţiuni:
CS = 1240H; IP = 6732H; ⇒ Adresa fizica, AF = 12400H + 6732H = 18B32H

Obs: • Reprezentarea adresei fizice se face scriind valorile celor două registre folosite la
calculul ei, despărţite de „:”. Primul se scrie registrul de segment folosit, iar al
doilea, offset-ul. Pentru exemplul anterior adresa fizică 18B32H se scrie 1240 :
6732;
• Prin segmentare, o locaţie fizică de memorie poate fi conţinută în mai multe
segmente (dar adresa fizică este unică, modurile de reprezentare a ei sunt mai
multe). De exemplu adresa fizică 18B32H se poate scrie: 1240 : 6732 sau 1000 :
8B32 sau 1800 : B32, etc.
• Pentru compatibilitate, acest mod de calcul al adresei fizice fost preluat şi la µp
ulterioare.

Unitatea de interfaţă cu magistrala (BIU)


BIU conţine 5 registre de 16 biţi: 4 registre de segment şi un registru indicator
de adresă.
Cele 4 registre de segment sunt:
• CS (Code Segment), conţine adresa de început a segmentului de cod (unde se află
codurile instrucţiunilor);
• DS (Data Segment), conţine adresa de început a segmentului pentru date;
• SS (Stack Segment), conţine adresa de început a segmentului stivă;
• ES (Extra data Segment), conţine adresa de început a unui segment de date
suplimentar.
Registrul IP (Instruction Pointer), indică offset-ul adresei instrucţiunii următoare
celei care se execută (offset în cadrul CS). Pentru registrul de segment de date, offset-ul
este un registru pe 16 biţi din EU.

Unitatea de execuţie

EU decodifică şi execută instrucţiunile pe care le extrage succesiv din coada de


instrucţiuni a BIU. Dacă şirul de instrucţiuni este gol, EU aşteaptă aducerea lor de către
BIU. În cazul unei instrucţiuni de salt, EU comunică lui BIU noua adresă.
EU este alcătuită din două blocuri:
- un bloc de comandă care decodifică instrucţiunile şi controlează execuţia lor; este
de tip CROM (Controler cu ROM) care are memorate în ROM microprogramele fiecărei
instrucţiuni din setul de instrucţiuni al µp. Odată instrucţiunea decodificată, CROM
execută microprogramul corespunzător ;
- un bloc de execuţie a operaţiilor aritmetice şi logice, de tip RALU (Register
Arithmetic Logic Unit). Conţine o unitate aritmetico-logică ALU şi o memorie de tip
registru cu 8 registre pe 16 biţi. După fiecare operaţie, ALU poziţionează un set de
indicatori care sunt memoraţi într-un registru separat de indicatori.
Cele opt registre ale EU se împart în două grupe:
- registre de date, 4 la număr; sunt registrele generale de lucru ale µp ;
- registre pentru accesul în interiorul unui segment de date, 4 la număr ; generează
offset-ul pentru calculul adresei fizice.

1) Registrele de date sunt:


- AX, registrul acumulator;
- BX, registrul de bază;
- CX, registrul contor;
- DX, registrul de date.
Fiecare poate fi apelat ca un registru pe 16 biţi, dar poate fi apelat şi ca o pereche
de registre de 8 biţi, fiecare registru putând fi apelat separat (separarea este totală; de
exemplu un carry ce poate apare la o adunare cu AL nu se transmite automat la AH).
Ideal ar fi ca cele 4 registre de uz general să fie complet interschimbabile. Acest
lucru nu se realizează la I8086, registrele având şi funcţiuni specifice:
- AX : înmulţire, împărţire, I/O pe cuvânt;
- AH : înmulţire, împărţire pe octet;
- AL : înmulţire, împărţire, I/O pe octet, aritmetică zecimală;
- BX : translatarea offset-ului adresei fizice (în lucrul cu datele);
- CX : contor pentru operaţii cu şiruri, bucle;
- CL : contor pentru deplasări şi rotaţii;
- DX : înmulţire, împărţire, I/O indirectă.

2) Registrele de offset pentru accesul în interiorul unui segment de date sunt de 2


tipuri:

a) Registre indicator, conţin offset-ul adresei la care se află un operand în cadrul


segmentului de stivă.
• SP (Stack Pointer), indică offset-ul adresei la care se află vârful stivei, în raport cu
registrul SS;
• BP (Base Pointer), indică offset-ul adresei la care se găseşte un operand în segmentul
de stiva, pentru o adresă fizică se foloseşte în raport cu registrul SS.
b) Registre index, conţin offset-ul adresei la care se află un operand în cadrul
segmentelor DS şi ES. Se folosesc în general în operaţii cu şiruri:
• SI, conţine offset-ul adresei operandului sursă;
• DI, conţine offset-ul adresei operandului destinaţie.

Obs: • Cele 4 registre de offset se pot apela doar pe 16 biţi;


• Registrul de offset pentru CS este IP, în BIU.

Registrul de stare (registrul de indicatori) este un registru pe 16 biţi în care sunt


trecuţi indicatorii de stare ai µp. Din cei 9 biţi folosiţi, 6 sunt indicatori de condiţii şi sunt
poziţionaţi de UAL după fiecare operaţie aritmetico-logică, iar 3 sunt folosiţi ca
indicatori de control.

a) Indicatorii de condiţii se poziţionează în urma unor operaţii, şi pot fi testaţi şi se pot


lua decizii în funcţie de conţinutul lor:
• CF (Carry Flag), este indicator de transport (se activează când apare un transport sau
un împrumut din/în rangul cel mai semnificativ);
• PF (Parity Flag), este indicator de paritate (se activează când rezultatul unei operaţii
aritmetice sau logice are un număr par de unităţi);
• AF (Auxiliary carry Flag), este indicator de transport auxiliar (se activează când
apare un transport sau un împrumut în operaţiile aritmetice zecimale (BCD) între
digiţii aceluiaşi octet (de la rangul 3 la 4 sau de la 4 la 3));
• ZF (Zero Flag), este indicator de zero (se activează dacă rezultatul unei operaţii
aritmetice sau logice este zero);
• SF (Sign Flag), este indicator de semn (conţine bitul cel mai semnificativ al
rezultatului: 1=rezultat negativ, 0=rezultat pozitiv);
• OF (Overflow Flag), este indicator de depăşire (se activează când apare depăşirea
capacităţii registrelor ca urmare a unei operaţii aritmetice cu operanzi cu semn; OF=1
când apare un transport în rangul de semn).

b) Indicatorii de control :
• TF (Trap Flag), este indicator al modului pas cu pas. Fixat pe 1, µp va genera o
întrerupere după executarea fiecărei instrucţiuni, astfel încât un program poate fi verificat
pas cu pas, prin examinarea registrelor;
• IF (Interrupt Flag), este indicator pentru întreruperi. Fixat pe 1, µp acceptă cererile de
întrerupere mascabilă, INTR;
• DF (Direction Flag), este indicator pentru direcţie (se foloseşte la operaţii cu şiruri);
DF =1, instrucţiunea incrementează adresa operandului din şir după fiecare transfer, iar
dacă DF = 0, instrucţiunea decrementează adresa.

Obs: Există instrucţiuni pentru poziţionarea indicatorilor DF, IF , TF, şi CF, dar indirect
se pot poziţiona toţi indicatorii.

Setul de instrucţiuni
Cuprinde toate instrucţiunile pe care le poate executa µp.
Din punct de vedere funcţional, se împart în mai multe grupe:
- instrucţiuni de transfer, ce arată modurile de transfer ale operanzilor între µp şi
exteriorul său, sau în µp, între două registre ;
- instrucţiuni de prelucrare, ce cuprind instrucţiuni aritmetice, logice, de deplasare şi
rotaţii ;
- instrucţiuni de salt şi apel la subrutină;
- instrucţiuni de control.

a) Instrucţiuni pentru transferul informaţiei între registre sau între registre şi


memorie:
# MOV D,S : (MOVe) transferă conţinutul sursei S la destinaţia D. Se pot efectua
transferuri între două registre, între registre şi memorie, dar nu se pot
transfera memorie-memorie; transferul se poate efectua pe octet sau cuvânt,
precizare făcută prin registrul implicat. Exemple: MOV AL, 02CH; MOV
AX, DX; MOV CX,[1250H].
# PUSH S : depunere în stivă a cuvântului sursă; S este registru pe 16 biţi, sau două
locaţii succesive de memorie;
# POP D : extragerea unui cuvânt din stivă şi depunerea lui la destinaţie : registru pe 16
biţi sau 2 locaţii succesive de memorie;
# POP F : extragerea din stivă şi încărcarea în registrul indicator;
b) Instrucţiuni aritmetice :
Operanzii fără semn pot fi reprezentaţi pe octet [0, 255] sau pe cuvânt [0,65535].
Operanzii cu semn pot fi reprezentaţi pe octet [-128, 127] sau pe cuvânt [-32768, 32767]
şi sunt reprezentaţi în complement faţă de 2.
Instrucţiuni de adunare:
# ADD D,S : D ← D + S , operanzi pe 8 sau 16 biţi; D, S nu pot fi simultan operanzi din
memorie;
# ADC D, S : (Add with Carry) D ← D + S + CF ;
# INC D : (Increment) D ← D + 1 , D poate fi pe 8 sau 16 biţi, sau operand din memorie;
# AAA : (ASCII Adjust for Addition) corectează rezultatul obţinut prin adunarea a doi
octeţi BCD neîmpachetat. Dacă operanzii se dau în cod ASCII, rezultatul va
fi în cod BCD neîmpachetat;
# DAS : (Decimal Adjust for Addition) corectează rezultatul obţinut prin adunarea a doi
octeţi BCD împachetaţi;
Instrucţiuni de scădere:
# SUB D,S : (Substract) D ← D − S , operanzi pe 8 sau 16 biţi;
# SBB D,S : (Substact with Borrow) D ← D − S − CF ;
# DEC D : (Decrement) D ← D − 1 ;
# NEG D : (Negate) D ← complemnt fata de 2 : D ← D + 1 ;
# DAS : (Decimal Adjust for Substraction) corectează rezultatul obţinut prin scăderea a
doi operanzi BCD împachetaţi;
Instrucţiuni de înmulţire:
# MUL S : (Multiply) înmulţeşte acumulatorul cu sursa S.
Dacă operanzii sunt pe 8 biţi AX ← AL ∗ S
Dacă operanzii sunt pe 16 biţi DX, AX ← AX ∗ S ;
# IMUL S : (Integer Multiply) înmulţeşte acumulatorul cu sursa S, operanzii sunt luaţi cu
semn;
# AAM : (ASCII Adjust for Multiply) corectează rezultatul obţinut prin înmulţirea a doi
operanzi în cod BCD neîmpachetat;
Instrucţiuni de împărţire
# DIV S : (Divide) împarte acumulatorul cu S, operanzii sunt consideraţi fără semn;
Dacă operanzii sunt pe 8 biţi AX/S, AL= cât, AH=rest;
Dacă operanzii sunt pe 16 biţi (DX,AX)/S, AX= cât, DX=rest;
Dacă câtul depăşeşte capacitatea registrelor, FFH sau FFFFH, apre o
întrerupere OF;
# IDIV S : (Integer Divide) împarte acumulatorul la S, operanzii sunt consideraţi cu
semn, depăşirea este considerată 7FH, 7FFFH;
# AAD : (ASCII Adjust for Division) modifică deîmpărţitul înaintea efectuării operaţiei
de împărţire a doi operanzi BCD neîmpachetaţi, şi câtul şi restul vor rezulta
BCD neîmpachetat;
c) Instrucţiuni logice, de deplasare şi rotire :
Sunt grupate împreună deoarece lucrează la nivel de bit.
Instrucţiuni logice
# AND D,S : (And) operanzii pot fi pe 8 sau 16 biţi; D ← D ∧ S ;
# OR D,S : D ← D ∨ S ;
# XOR D,S : (eXclusive OR) D ← D ⊕ S ;
# NOT D : D ← D ;
Instrucţiuni de deplasare
Deplasările se pot face la stânga sau la dreapta, pentru registre sau memorie, pe
8 sau 16 biţi. Numărul de ranguri de deplasare se poate specifica direct (1 rang), sau
indirect (CL ranguri);
# SHR D, 1 sau CL : (Shift Logical Right) în poziţiile libere se trece 0, bitul cel mai
puţin semnificativ trece în CF;
# SAR D, 1 sau CL : (Shit Arithmetical Right) în poziţiile libere se trece rangul de semn;

Instrucţiuni de rotire
# ROL D, 1 sau CL : (ROtate Left) cel mai semnificativ bit trece în CF;
# ROR D, 1 sau CL : (ROtate Right) cel mai puţin semnificativ bit trece în CF;
# RCL D, 1 sau CL : (Rotate Left through Carry) msb → CF → lsb ;
# RCR D, 1 sau CL : (Rotate Right through Carry) lsb → CF → msb ;
d) Instrucţiuni de salt :
Salt necondiţionat
# JMP OP;
Salt condiţionat
# JCC OP;
# JC : salt condiţionat cu CF;
# JNC : salt condiţionat cu CF ;
# JZ/JE : salt condiţionat cu ZF;
# JNZ/JNE : salt condiţionat cu ZF ;
# JO : salt condiţionat cu OF;
# JNO : salt condiţionat cu OF ;
e) Instrucţiuni de lucru cu subrutinele :
# CALL OP : dacă OP este pe 16 biţi se apelează un intrasegment (IP → (SP)), dacă OP
este dublu cuvânt se apelează intersegment (CS → stivă, apoi IP → stivă)
# RET sau RET OP : (RETurn) revenire din subrutină prin refacerea din stivă a IP şi CS
sau doar a IP; OP este un deplasament pe 16 biţi ce se adună la SP;
f) Instrucţiuni de intrare-ieşire :
Asigură transferul de date între AX şi un port pe 8 sau 16 biţi.
# IN AL sau AX, ADR : ADR = 8biţi AL ← (ADR); AX ← (ADR);
# AUT ADR, AL sau AX ;
g) Instrucţiuni pentru întreruperi :
# INT nn : întrerupere internă de tip nn;
# INTO : determină generarea întreruperii interne de tip 4 dacă OF=1 la împărţiri;
# IRET : revenire din întrerupere prin restaurarea registrelor de indicatori, IP şi CS (din
stivă);
h) Instrucţiuni pentru iteraţii (bucle) :
# LOOP OP se comportă ca un salt condiţionat; OP = 8biţi cu semn; CX ≠ 0.
i) Instrucţiuni de control
# CLC : (CLear Carry) CF ← 0 ;
# CMC : (CoMplement Carry) CF ← CF ;
# STC : (SeT Carry) CF ← 1;
# CLI : (CLear Interrupt) dezactivează întreruperile mascabile;
# STI : (SeT Interrupt) activează întreruperile mascabile;
# HLT : (HaLT) intră în halt din care iese la RESET, NMI sau INT;
# LOCK : (LOCK bus) activează linia LOCK pentru instrucţiunea următoare;
# ESC CD, OP : (ESCape) permite ca un procesor extern să preia de la microprocesor un
cod de operaţie şi eventual un operand din memorie; COD = cod de operaţie
pe 6 biţi, şi intră în codul maşină al instrucţiunii. Dacă OP = registru,
microprocesorul nu efectuează nici o operaţie; dacă OP = locaţie de memorie,
microprocesorul execută un ciclu de citire, dar data va fi preluată de
procesorul extern;
# NOP : (No OPeration).

Tipuri de adresare
Setul de instrucţiuni a microprocesorului I 8086 cuprinde 94 de instrucţiuni de
bază, fiecare având mai multe forme în funcţie de tipul operanzilor şi de modul de
adresare utilizat.
Microprocesorul poate lucra cu 6 tipuri de operanzi: bit, octet, dublu-octet , sau
cuvânt, BCD împachetat, BCD neîmpachetat şi cod ASCII. Microprocesorul poate
utiliza 8 moduri de adresare diferită, moduri prin care se indică felul în care un
microprocesor obţine un operand.
Cele 8 moduri de adresare sunt:
1. Adresare de registru;
2. Adresare imediată;
3. Adresare directă;
4. Adresare indirectă prin registru;
5. Adresare bazată;
6. Adresare indexată;
7. Adresare bazată şi indexată;
8. Adresare implicită.

Obs: Pentru detalierea modurilor de adresare se folosesc notaţiile:


• AE (adresa efectivă) reprezintă offsetul, deplasamentul la care se găseşte un
operand în memorie în raport cu AB a segmentului în care se găseşte operandul;
• AF (adresa fizică) reprezintă adresa din spaţiul de adrese fizice la care se găseşte
operandul în memorie. AF este calculată de EU pe 16 biţi şi orice eventual carry
care apare în calculul este ignorat, AF rămânând astfel în acelaşi segment.

1. Adresarea de registru
Operandul se află în unul din registrele µp, pe 8 sau 16 biţi şi este specificat în
cadrul instrucţiunii. Instrucţiunea este rapidă, nemaifiind necesar un ciclu de acces la
memorie.
Exemplu: MOV BL, DH : copie octetul din registrul DH în registrul BL; ADD AX, BX.

2. Adresarea imediată
Operandul este indicat pe 1 sau 2 octeţi în cadrul instrucţiunii. Instrucţiunea este
rapidă pentru că operandul se află deja în coada de instrucţiuni a µp.
Exemplu: MOV AX, 3FF0H; AND AL, 47H.

3. Adresarea directă
Adresa efectivă a operandului (care se găseşte în memorie) este indicată în
câmpul instrucţiunii. AF se calculează cu registrul DS, operandul aflându-se în segmentul
de date (DS).
AF = DS•16+AE
Exemplu: MOV BX, [3FF0H]
DS = 2000H 
 ⇒ AF = DS ∗16 + AE = 20000H + 3FF0H = 23FF0H
AF = 3FF0H 
Obs: Instrucţiunile de I/O ce folosesc adresare directă conţin AE doar pe 8 biţi
Exemplu: IN AL, 20H – transferă în registrul AL ceea ce găseşte la portul cu adresa 20H

4. Adresarea indirectă prin registru


Adresa efectivă a operandului este variabilă şi este conţinută în unul din
registrele de bază (BP sau BX) sau în unul din registrele index (SI sau DI). AF se
calculează tot cu registrul DS:
AF = DS•16+BP sau BX sau SI sau DI
Exemplu: MOV [BX], AX : transferă conţinutul registrului AX în memorie în segmentul
de date, DS, la adresa efectivă dată de BX.
BX = 1000H 

AX = 2000H  ⇒ AF = 30000H + 1000H = 31000H
DS = 3000H 
Obs: • Spre deosebire de adresarea directă, AE poate fi modificată în timpul executării
programului.
• Instrucţiunile de I/O folosesc adresarea indirectă prin registrul DX.
Exemplu: IN AL, AX.

5. Adresarea bazată
Foloseşte registrele de bază BX şi BP şi este utilă când operandul se află într-o
tabelă de operanzi, iar tabela poate avea diferite adrese de bază. Pentru calculul adresei
efective se adună conţinutul registrului BX sau BP cu un deplasament d furnizat în cadrul
instrucţiunii.
Dacă se foloseşte registrul BX, operandul se găseşte în segmentul de date DS,
iar la calculul AF se va utiliza registrul DS.
Dacă se foloseşte registrul BP, operandul se găseşte în segmentul de stivă, iar la
calculul AF se va utiliza registrul SS.
Obs: deplasamentul d poate fi pe unul sau doi octeţi, furnizat în cadrul instrucţiunii, iar la
calcularea AE se ignoră eventualul carry.
AE = BX sau BP + d
 AF = DS ⋅ 16 + BX + d

 AF = SS ⋅ 16 + BP + d
Exemplu: MOV AX, [BX + A000H] ; DS = 1000H; BX = 7200H;
⇒ AE = BX+d = 7200H+A000H = 1200H
⇒ AF = DS•16 + AE = 11200H

6. Adresarea indexată
Se foloseşte când se lucrează cu şiruri şi utilizează registrele index SI şi DI.
Pentru calculul AE se adună conţinutul unuia dintre registrele SI şi DI cu un deplasament
d , specificat în instrucţiune.
AE = SI sau DI +d
AF = DS•16+(SI sau DI) + d
Prin acest mod de adresare, SI sau DI indică offset-ul adresei de început
a şirului şi d indică deplasamentul în interiorul şirului. Instrucţiunea este
flexibilă pentru că prin simpla modificare a conţinutului registrului SI sau DI se
poate apela fie un alt şir, fie se poate deplasa acest şir în interiorul segmentului.

Exemplu: ADD AX, [SI + 1234H] : adună conţinutul registrului AX (operand pe


16 biţi) cu un operand pe 16 biţi aflat în memorie, în segmentul DS, la AE = SI + 1234H,
iar rezultatul îl depune în AX, iar eventualul carry în CY.
CY AX ← AX+OP16
AF = DS•16 + AE ⇒ OP16L ← (AF)
OP16H ← (AF + 1)
AE = SI + 1234H 
 AE = 200H + 1234H = 1434H OP16 L ← (2434H)
DS = 100H ⇒ ⇒
 AF = 100H16H + 1432H = 2434H OP16 H ← (2435H)
SI = 200H 
7. Adresarea bazată şi indexată
Este o combinaţie a ultimelor două moduri de adresare, fiind utilă când se
doreşte accesul la un operand ce se află într-un şir ce se află într-o tabelă de şiruri, tabelă
ce poate avea mai multe adrese de început. AE se calculează adunând un deplasament d
specificat în instrucţiune la conţinutul unuia dintre registrele index (SI, DI) şi la
conţinutul unuia dintre registrele de bază (BX, BP). Se pot apela segmente diferite
(segmentul de date sau de stivă, DS, SS) după cum se alege registrul de bază BX sau BP.
La calculul AE se ignoră eventualul carry ce poate să apară.
AE1 = BX + (SI sau DI)+d
AE2 = BP + (SI sau DI)+d
AF1 = DS•16+BX + (SI sau DI) + d
AF2 = SS•16+BP + (SI sau DI) + d
Exemplu: MOV [BX + SI + 789AH], DX : transferă conţinutul lui DX în memorie în DS
la
AE = BX + SI + 789AH
BX = 7000H 
 ⇒ AE = 7000H + 3000H + 789AH = 1 ← 189AH ⇒ AE = 189AH
SI = 3000H 
AF = 10000H + 1 + AE = 1189AH

8. Adresarea implicită
Este utilizată de instrucţiuni ce prelucrează şiruri şi foloseşte în mod
predeterminat conţinutul anumitor registre, astfel:
- şirul sursă se presupune în segmentul DS, a cărui AB se calculează cu registrul DS, iar
AE este indicată de registrul sursă SI;
- şirul destinaţie se presupune implicit în segmentul Extra Data Segment (ES) a cărui AB
se calculează cu registrul ES, iar AE este dată implicit de registrul DI.
Şi în acest caz rezultă două segmente de lucru ; unul ce conţine şirul sursă şi
unul care conţine şirul destinaţie. Adresele fizice se vor calcula şi ele separat pentru cele
două segmente.
AFS = DS•16 + SI
AFD = ES•16 + DI
Exemplu: Instrucţiunea MOV, SB transferă un octet din şirul sursă de la AE dată de SI, în
şirul destinaţie, la AE dată de DI. După transferul octetului, registrele SI şi DI sunt
actualizate, incrementate/decrementate cu 1 funcţie de indicatorul de direcţie (DF) din
registrul de indicatori. Pentru exemplul numeric se presupune că actualizarea SI, DI se
face prin incrementare.
DS = 100H 
ES = 200H  AFS = DS *16 + SI = 1300H
⇒
SI = 300H  AFD = ES *16 + DI = 2400H
DI = 400H 
adică la adresa AFD se va transfera ceea ce se găseşte la AFS şi apoi se incrementează
cu 1 AFS şi AFD.
Sistemul de întreruperi al I8086
Este acelaşi pentru toate µp din familia Intel când lucrează în modul de lucru
real.
Prin întreruperi, un µp comunică cu exteriorul său într-un dialog tip slave-
master. Unitatea slave iniţiază dialogul prin lansarea unei cereri spre unitatea master (µp)
pentru a fi servită. Această cerere poate să apară asincron cu activitatea unităţii master.
Dacă unitatea master o acceptă, determină întreruperea temporară a activităţii unităţii
master. Această cerere se numeşte cerere de întrerupere. Unitatea master răspunde la o
cerere de întrerupere abandonând momentan execuţia propriului program şi transferând
controlul unui program de tratare a cererii de întrerupere prin efectuarea următorilor paşi:
1) identifică sursa care a generat cererea de întrerupere;
2) obţine adresa de început a subrutinei de tratare a întreruperii;
3) salvează în stivă informaţiile de stare şi numărătorul de instrucţiuni;
4) se încarcă numărătorul de instrucţiuni cu adresa subrutinei de tratare a întreruperii
şi se începe executarea ei. La sfârşit se execută o instrucţiune specifică de
restaurare din stivă a informaţiilor salvate.
Pasul 1) se poate face:
a) de către unitatea master prin interogarea tuturor unităţilor slave cu care lucrează, iar în
cazul în care mai multe unităţi slave au generat întreruperi, unitatea master stabileşte şi
ordinea în care acestea vor fi tratate (necesită timp lung de interogare);
b) de către unitatea slave care a generat întreruperea, astfel:
- dacă unitatea master acceptă cererea de întrerupere, ea va trimite un răspuns generic de
acceptare a acestei cereri, ce ajunge simultan la toate unităţile slave. Practic unitatea
master execută un ciclu maşină de acceptare a cererii de întrerupere. Acest ciclu este
identificat prin semnale de ieşire specifice (INTA);
- unitatea slave care a generat întreruperea va trimite pe magistrala de date, în timpul
ciclului maşină respectiv, o informaţie de identificare;
- dacă mai multe unităţi slave pot genera simultan întreruperi, trebuie să existe un
dispozitiv hardware care să determine unitatea slave mai prioritară, ce a generat
întreruperea, şi să-i permită doar acesteia să transmită unităţii master informaţia de
identificare.
Implementarea propriuzisă se poate face cu un „controler de întreruperi” sau
conectând unităţile slave într-un lanţ de priorităţi imbricate, numit „daisy chain”
Adresa de început a subrutinei de tratare a întreruperii poate fi obţinută de
unitatea master în două moduri, după cum interpretează informaţia primită de la unitatea
slave:
- unitatea master primeşte de la unitatea slave codul unei instrucţiuni de salt la subrutina
de tratare a întreruperii, adresa de salt fiind codificată sau transmisă implicit în câmpul
instrucţiune;
Obs: Dacă adresa este transmisă explicit şi instrucţiunea are mai mulţi octeţi, şi unitatea
master va executa mai multe cicluri maşină până citeşte toată instrucţiunea.
- Informaţia primită de unitatea slave este interpretată ca un vector cu ajutorul căruia, prin
intermediul unei tabele de vectori, unitatea master obţine adresa de început a subrutinei
de tratare a întreruperii. În acest caz, întreruperile se numesc „întreruperi vectorizate” şi
toate µp Intel lucrează cu ele.
În cazul µp I8086, întreruperile pot fi generate fie datorită unor cauze externe
µp, fie datorită unor cauze interne. Deci microprocesorul are două tipuri de întreruperi:
externe şi interne.

Obs: • Întreruperile interne sunt generate prin program şi nu necesită identificarea unităţii
slave care a generat întreruperea.
• µp Intel pot trata 256 de întreruperi diferite, notate 0,…, 255 sau 00H,…, FFH.
Adresa de început a subrutinei de tratare a întreruperii se obţine din tabela
vectorilor de întrerupere. Aceasta are dimensiunea de 1ko, având rezervaţi câte 4o pentru
fiecare vector de întrerupere. Deci fiecare vector de întrerupere ocupă 4 locaţii de
memorie consecutive, care în ordinea crescătoare a adreselor conţin informaţii pentru
următoarele registre :

Exemplu : În TVI, pentru un anumit vector de întrerupere, se găsesc următoarele


informaţii:
44H
31H Aflaţi adresa fizică de început a subrutinei de tratare a întreruperii respective.
23H IP = 2300H, 
00H  ⇒ AF = CS ∗16 + IP = 46610H
CS = 4431H 

Tabela vectorilor de întrerupere este împărţită în trei domenii distincte:


1) o zonă dedicată, folosită în mod automat de către µp la apariţia unor întreruperi
predefinite, ce conţine primii 5 vectori de întrerupere (0,…, 4);
2) o zonă rezervată sistemului de operare sau necesară păstrării compatibilităţii cu
produsele Intel, ce conţine întreruperile 5,…, 31;
3) o zonă utilizator ce conţine întreruperile 32,…, 255.

Obs: • Pentru I8086 şi pentru celelalte µp în modul de lucru real, tabela vectorilor de
întrerupere este plasată întotdeauna începând cu adresa 0.
• Tabela vectorilor de întrerupere este setată de către sistemul de operare.
Întreruperile rămase libere pot fi completate ulterior de către diverse programe
utilizator.
• În interiorul tabelei vectorilor de întreruperi, adresa de început corespunzătoare
unui anumit vector se obţine prin înmulţirea cu 4 a numărului vectorului respectiv.
Exemplu: Determinaţi adresele ocupate de vectorul 09H în TVI, ştiind că aceasta este
plasată începând cu adresa 0.
nr. vector = 09H ⇒ adresa de început este 09H•4 = 24H
⇒ adresele ocupate sunt 24H, 25H, 26H, 27H.

Întreruperile externe sunt iniţiate prin cele două intrări ale µp:
- INTR, pentru întreruperi mascabile;
- NMI, pentru întreruperi nemascabile.
O cerere de întrerupere pe linia NMI generează o întrerupere nemascabilă, care
este predefinită de vectorul de întrerupere 02H. Când µp primeşte din exterior o cerere pe
NMI, execută automat accesul la vectorul de întrerupere 02H de unde citeşte adresa de
început a subrutinei de tratare a întreruperii nemascabile.
Obs: • Pentru că este predefinită, µp nu trebuie să identifice sursa care a generat
întreruperea, şi de aceea nu va executa în exterior cicluri maşină de acceptare a
întreruperii.
• De obicei pe această întrerupere sunt plasate evenimente prioritare: întreruperea
alimentării sistemului sau eroarea de paritate la memorie.

Pe INTR se generează o întrerupere mascabilă prin program, în funcţie de


valoarea indicatorului IF din registrul de indicatori: IF = 0 ⇒ întreruperile nu sunt tratate;
IF = 1 ⇒ cererile de întrerupere vor fi tratate de µp.
Există instrucţiuni de setare-resetare a sistemului de întreruperi mascabile:
CLI ⇒ IF = 0;
STI ⇒ IF = 1.
Pentru IF = 1, µp execută două cicluri maşină de acceptare a cererii de
întrerupere, în cel de-al doilea ciclu preluând pe magistrala de date, pe 8 biţi, un număr
între 0 şi 255 ce va reprezenta numărul vectorului din TVI (tabele vectorilor de
întreruperi).
Obs: • Cererea de întrerupere este testată la sfârşitul fiecărei instrucţiuni

• În timpul tratării unei întreruperi mascabile se dezactivează întreruperile


mascabile ulterioare, făcându-se automat IF = 0, după ce s-au salvat în stivă
registrele de indicatori. Revalidarea întreruperilor mascabile se poate face de către
utilizator prin program.
• Subrutinele de tratare a întreruperilor trebuie să se termine cu instrucţiunea IRET,
ce realizează revenirea în programul anterior prin citirea din stivă a registrului de
indicatori şi a registrelor CS şi IP care astfel se restaurează cu valorile avute înainte
de tratarea întreruperii.

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