Documente Academic
Documente Profesional
Documente Cultură
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.
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 execuţie
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.
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ă.
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
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.
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 :
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.