Sunteți pe pagina 1din 8

Laborator nr.

10

Prezentare generala a microprocesorului 8086. Registre. Moduri de adresare.


Asignare implicita a registrelor segment. Instructiuni

Microprocesorul I8086:

- realizat in tehnologie N-MOS;


- impachetat in capsula cu 40 pini;
- functioneaza la o frecventa de 5..8 MHz
- transfer de date pe 8 sau 16 biti;
- adreseaza direct o memorie maxima de 1Mo.

Registre accesibile utilizatorului:

- registre generale pe 16 biti: AX,BX,CX,DX,SP,BP,SI,DI.


- registre utilizabile pe 8 biti (octet): AH,AL,BH,BL,CH,CL,DH,DL.
- registre segment: CS,DS,ES,SS.
- registru de flag-uri, FR (indicatorii de conditii).

unde:
CF - carry flag, reprezinta indicatorul de transport, devine 1 daca operatia a
produs un transport de iesire din cel mai semnificativ bit al rezultatului. Acest
transport semnifica imprumut in cazul operatiei de scadere.
AF - auxiliary carry, reprezinta indicatorul de transport auxiliar, devine 1 daca
operatia a produs un transport de la bitul al 4-lea (D3) la bitul al 5-lea al rezultatului.
PF - parity flag, reprezinta indicatorul de paritate, devine 1 in urma operatiilor
logice daca rezultatul este par;
OF - overflow, reprezinta indicatorul de depasire, OF=1 indica depasirea,
adica alterarea bitului de semn;
DF - direction flag, indicatorul de directie, semnifica incrementarea/
decrementarea registrelor SI/DI in cazul instructiunilor iterative;
IF - interrupt flag, activeaza/dezactiveaza intreruperile externe;
TF - trap flag, permite executia instructiunilor pas cu pas;
SF - sign flag, indicator de semn, devine 1 daca bitul cel mai semnificativ al
rezultatului este 1;
ZF - zero flag, devine 1 daca rezultatul operatiei anterioare este nul.

Registrele generale sint utilizate ca surse si/sau destinatie pentru operanzi.


Sint prezentate in continuare citeva exemple de utilizare implicita a registrelor I8086:

AX - operatii aritmetice si operatii de I/O pe 16 biti;


BX - conversii cod si registru de baza de adresare;
CX - contor ciclu pentru operatii pe siruri de caractere si bucle;
CL - contor pentru intructiuni deplasare;
DX - registru de adresare indirecta, utilizat si in operatiile de inmultie/
impartire pe 16 biti ;
SI - registru index sursa in operatii cu siruri de caractere;
DI - registru index destinatie operatii cu siruri de caractere;
CS - adrese de baza ale segmentelor pentru codurile instructiunilor;
DS - adrese de baza ale segmentelor pentru operanzi;
ES - adrese de baza ale segmentelor pentru operanzi (extra-segment de date);
SS - adresa de baza pentru segmentul de stiva;

Moduri de adresare a informatiilor din memori unui sistem de calcul:

Operatiile cu doi operanzi admit urmatoarele tipuri de perechi de operanzi:


- registru-registru;
- registru-memorie;
- registru-operand imediat;
- memorie-operand imediat;

Operanzii in memorie pot fi adresati astfel:

- direct, cu o adresa relativa in segment de 16 biti;


- indirect, printr-un registru de baza (BX,BP), optional cu o deplasare
de 8 sau 16 biti;

- indirect, printr-un registru de index (SI,DI), optional cu o


deplasare de 8 sau 16 biti; (vezi imaginea anterioară);

- indirect, prin suma continutului registrului de baza, cu cel al


registrului index, optional cu o deplasare de 8 sau 16 biti.

Relatia generala de calcul a adresei offset (deplasament - D) devine:


D = [BX/BP] + [SI/DI] + [D8/D16] , unde:

- BX, BP, SI, DI reprezinta valorile continute in registrele


respective, interpretate ca numere binare cu 16 biti, fara semn;
- "/" semnifica alegerea unuia dintre cele doua elemente;
- D8/D16 - operanzi numerici de deplasare, pe 8 respectiv 16 biti.
In cazul deplasarilor pe 8 biti, acestea sint considerate ca numere cu
semn si se face extensia semnului pina la 16 biti, dupa care se executa
calculul adresei efective.
Observatii:

1. D reprezinta adresa relativa (offset) in cadrul unui segment, adresa fizica (AF)
fiind:
A = s * 16 + D ,
unde:
s reprezinta continutul registrului segment implicat in instructiune (s*16
similar cu deplasarea la stinga cu o cifra hexa !!).
2. Oricare din cei trei termeni poate lipsi.
3. Registrul segment utilizat implicit depinde de tipul operatiei si de
registrul utilizat ca adresa de baza sau index:
____________________________________________________________
| | | |
| Adresa efectiva (EA) | RS implicit | Alte RS utilizabile |
|______________________|_____________|______________________|
| | | |
| D | DS | CS,SS,ES |
| BX + SI + D | | |
| BX + DI + D | | |
|______________________|_____________|______________________|
| | | |
| BP + SI + D | SS | CS,DS,ES |
| BP + DI + D | | |
|______________________|_____________|______________________|
| | | |
| SI + D | DS | |
| DI + D | | |
|______________________|_____________|______________________|
| | | |
| BP + D | SS | CS,DS,ES |
|______________________|_____________|______________________|
| | | |
| BX + D | DS | CS,DS,ES |
|______________________|_____________|______________________|

De ex:
MOV AX,8[BX][SI] va determina incarcarea in reg. AX a unui cuvint de la
adresa BX+SI+8 relativa la DS
MOV CX,[BP+5][SI] va determina incarcarea in reg. CX a unui cuvint de la
adresa BP+SI+5 relativa la SS

Utilizarea altui segment decit cel implicit va fi indicat printr-un prefix, astfel:
MOV BX,ES:758 care incarca in registrul BX cuvintul de la adresa ES:758.
Citeva instructiuni simple

1. Transfer de date

MOV OP1, OP2 =============> OP2 ----> OP1


In urma instructiunii, OP2 se copie in OP1 care se pierde, in timp ce OP2
ramine neschimbat. Indicatorii de conditii nu se modifica.
OP2 poate fi operand imediat, registru, sau locatie de memorie
OP1 poate fi registru, sau locatie de memorie
Restrictii:
- OP1 si OP2 nu pot fi simultan locatii de memorie
- nu este permisa combinatia: OP2 - operand imediat, iar OP1 - registru
segment

2. Adunarea si scaderea, cu sau fara transport

ADD OP1, OP2 ==========> OP1+OP2 -----> OP1


SUB OP1, OP2 ==========> OP1-OP2 -----> OP1
ADC OP1, OP2 ==========> OP1+OP2+CY --> OP1
SBB OP1, OP2 ==========> OP1-OP2-CY --> OP1
In urma acestor instructiuni, OP1 va primi rezultatul operatiei, in timp ce OP2 va
ramine neschimbat. Ultimele 2 instructiuni antreneaza si flag-ul de transport in cadrul
operatiei (este evident ca daca CY=0, ultimele 2 instructiuni se comporta ca si
primele 2). Indicatorii de conditie se modifica potrivit rezultatului operatiei.
Observatiile de la MOV cu privire la OP1 si OP2 ramin valabile (registrele
segment nu pot figura ca operanzi sursa sau destinatie)
Ex: ADD AX,[BP][SI+100H] realizeaza adunarea continutului lui AX cu
continutul locatiei de memorie de la adresa [BP+SI+100H] relativa la
segmentul adresat de SS, iar rezultatul vine in AX
3. Incrementarea si decrementarea

INC OP1 ============> OP1 + 1 ---> OP1


DEC OP1 ============> OP1 - 1 ---> OP1

In urma acestor instructiuni, la OP1 se aduna, respectiv se scade unitatea, iar


rezultatul ramine in OP1. OP1 poate fi registru (mai putin registrele segment) sau
locatie de memorie.
Ex: INC 50H[BX][DI] realizeaza incrementarea continutului loatiei de
memorie de la adresa [BX+DI+50H] relativa la segmentul adresat de DS.
DEC SP - realizeaza decrementarea continutului registrului SP care adreseaza
virful stivei (Atentie: stiva este pe cuvint, deci operatia va pune virful stivei in
mijlocul unui cuvint util, eventual salvat in stiva, rezultatul fiind imprevizibil in acest
caz !!)
4. Operatii cu stiva

Stiva este o zona de date in memoria interna si care este accesata in mod LIFO
("last in first out"), adica operanzii se depun incepind cu un capat si sint scosi pe la
celalalt capat. Permite o modalitate eleganta de salvare a registrilor in memorie,
restaurarea lor facindu-se in ordinea inversa salvarii. Stiva este intotfeauna rezidenta
in segmentul de stiva, iar registrul SP (care contine adresa virfului stivei) este folosit
implicit ca reg.de offset in lucrul cu stiva.

PUSH OP1 =======> OP1 ---> SS:[--SP]


POP OP1 ========> [SP++] ----> OP1

Instructiunea PUSH determina decrementarea cu 2 a virfului stivei (adresare


cu predecrementare) si salvarea in stiva a lui OP1 (registru (mai putin CS), sau
operand imediat, sau locatie de memorie).
Instructiunea POP determina preluarea cuvintului din virful stivei in OP1 si
apoi incrementarea cu 2 a virfului stivei (adresare cu postincrementare). OP1 poate fi
registru sau locatie de memorie

CALL adresa =======> IP ---> SS:[SP--], adresa --> IP


RET =======> SS:[SP++] ---> IP

Instrutiunea CALL permite apelul unei subrutine aflate la <adresa>, care se


incarca in registrul IP (de aici continua executia), insa in prealabil salveaza in stiva
adresa de revenire, adica adr. urmatoarei instr. (care, evident se afla in IP ; practic se
realizeaza un fel de PUSH IP)
Instructiunea RET permite reintoarcerea din subrutina la adresa aflata in acel
moment in virful stivei (deci, daca in subrutina se strica virful stivei nu se va reveni
chiar la adresa de dupa CALL !!!)
Un instrument util in vizualizarea zonelor de segment si a registrelor interne
procesorului este utilitarul Turbo Debugger al firmei Borland (il puteti gasi in
directorul c:\borlandc\bin\td.exe).
Mai multe informatii referitoare la modul de utilizare al acestui program se
gasesc in anexa Td.txt din directorul ISSC.

Aplicatii:

1. Microprocesorul 8086 contine in DS, A010h . Se intentioneaza adresarea


locatiei de la adresa absoluta AA000h . Ce deplasament trebuie adaugat
continutului lui DS ?
2. Registrul CS contine 500Fh. Un program in limbaj masina incepe la adresa
0100Bh in cadrul segmentului de cod. Care este adresa absoluta a primei instructiuni
din program ?
3. Am urmatoarea secventa de instructiuni (initial am AX=20BCH,
BX=CDEFH):
PUSH AX
PUSH BX
INC BX
DEC AX
POP AX
POP BX
Ce valori se vor obtine in registrele AX si BX in urma executiei instructiunilor
?
4. Am secventa de instructiuni (se presupun AX=102CH, BX=2D21H,
CX=1342H):
PUSH AX
PUSH BX
PUSH CX
DEC SP
POP AX
POP BX
INC SP
POP CX
Ce valori se vor obtine in registrele AX si BX in urma executiei instructiunilor
?
5. De unde va continua programul urmator dupa instructiunea RET ?
MOV AX,0D4CH
MOV BX,0CE4H
PUSH AX
CALL SUB
.
SUB: PUSH BX
INC SP
POP BX
PUSH AX
RET

Indicatii "pretioase": ultimele 3 puncte vor fi rezolvate pe hirtie si verificate


executind instructiunile (introduse in prealabil cu cda. A) pas cu pas in DEBUG si
urmarind continutul registrilor. In cazul rezolvarii pe hirtie se va reprezenta dupa caz
stiva pe octet (instr. INC SP si DEC SP adauga/scad 1 la valoarea SP deci voi
reprezenta octet cu octet) sau pe cuvint urmarind pozitia virfului stivei (adica SP-ul).

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