Sunteți pe pagina 1din 14

ARHITECTURA

CALCULATOARELOR
SEMINARUL Nr. 9
1
Limbaje de Asamblare
Considerăm un calculator simplu, similar unui microcontroler.
Unitatea de bază de reprezentare a informaţiei este un byte sau octet (format din opt biţi).
Vom considera numere întregi reprezentate în sistem binar pe 4 octeţi în complement faţă de 2.
Calculatorul are instrucţiuni pentru următoarele operaţii :
◦ adunare şi scădere cu numere întregi,
◦ comparare a două numere întregi,
◦ operaţii de ramificare a execuţiei în diferite puncte din program.
Calculatorul considerat are un registru de 4 octeţi:
◦ registrul A (acumulator)
Registrul A este utilizat pentru efectuarea operaţiilor aritmetice. El conţine întotdeauna un
operand şi rezultatul.
2
Orice calculator are nişte indicatori de condiţie poziţionaţi la compararea a două
numere, un număr memorat într-un registru, iar celălalt în memorie. Indicatorii de condiţie
sunt reprezentaţi de doi biţi:
◦ unul numit Z care este poziţionat la 1 dacă numerele comparate sunt egale,
◦ Celălalt, numit S, care este poziţionat la 1 dacă numărul din registru este mai mic decât cel din
memorie.
Z S
operand1 = operand2 1 0
operand1 < operand2 0 1
operand1 > operand2 0 0

operand1 se află în registru şi operand2 se află în memorie.


Indicatorii de condiţie ai calculatorului formează cuvântul de stare al programului
(Program Status Word, PSW).
Calculatorul are un registru ce conţine adresa următoarei instrucţiuni de executat,
numit numărătorul de program (Program Counter).
3
Memoria calculatorului este un sir de octeţi, adresa primului octet fiind zero.
Formatul instrucţiunilor calculatorului este următorul :
OP adresa
unde OP este codul instrucţiunii de executat, iar adresa este cea a unui operand din memorie.
Instrucţiunile calculatorului sunt:
◦ instrucţiuni de încărcare:
LDA adresa
încarcă în registrul A valoarea de la adresa instrucţiunii.
◦ instrucţiuni de memorare:
STA adresa
memorează conţinutul registrului A la adresa specificată.

4
◦ instrucţiuni de calcul cu numere întregi :
ADD adresa
SUB adresa
Aceste instrucţiuni adună şi scad două numere, primul fiind în acumulator, iar al doilea la
adresa instrucţiunii.
◦ instrucţiuni de comparare:
CPA adresa
Această instrucţiune compară numărul dintr-un registru A cu cel de la adresa şi poziţionează
indicatorii de condiţie.
◦ instrucţiuni de salt:
JMP adresa
Această instrucţiune duce la execuţia instrucţiunii de la adresa.
5
◦ instrucţiunile următoare testează indicatorii de condiţie şi, în funcţie de valoarea
acestora, se trece la adresa din instrucţiune.

adresa salt dacă

◦ în final mai există instrucţiunea


STOP
Ea produce oprirea programului.

6
Un limbaj de asamblare utilizează etichete şi directive. O etichetă este un şir de
litere şi cifre ce începe cu o literă. Directivele limbajului de asamblare sunt:
◦ directiva END cu forma
END start
unde : start este o etichetă ce specifică punctul de începere a execuţiei programului.
◦ directiva DATA cu forma:
[eticheta] DATA M1, M2, …Mn
Ea generează numerele M1, M2, …, Mn pe 4 octeţi. Eticheta acestei directive este opţională.
Exemplu. Vom scrie un program care adună două numere întregi, 50 şi 23. În limbaj
pseudocod programul este
X = 50 ;
Y = 23 ;
Z=X+Y;
7
Programul în limbaj de asamblare este următorul :

X DATA 50
Y DATA 23
Z DATA 0
start LDA X
ADD Y
STA Z
STOP
END start

În acest program generăm la început cele două numere de adunat cu două directive
DATA şi rezervăm o zonă pentru rezultat cu o altă directivă DATA. Urmează apoi secvenţa
de instrucţiuni ce adună cele două numere şi memorează rezultatul.
8
Formatul instrucţiunilor calculatorului

În calculatorul pe care îl exemplificăm orice instrucţiune se compune din codul


operaţiei şi adresa operandului. Fiecare instrucţiune este tradusă de programul asamblor pe
4 octeţi.
Primul octet conţine codul operaţiei, iar următorii trei octeţi conţin adresa.
OP adresa
OP este codul operaţiei.
Asamblorul utilizează o variabilă numită contor de locaţii. Iniţial valoarea
contorului de locaţii este zero. Contorul de locaţii este incrementat de asamblor după fiecare
instrucţiune generată cu valoarea patru, iar după fiecare directivă DATA cu numărul de
octeţi generaţi, în cazul numerelor tot cu valoarea patru.
9
Codurile instrucţiunilor calculatorului sunt:
Instrucţiune Cod Instrucţiune Cod
LDA 1 JE 7
STA 2 JNE 8
ADD 3 JG 9
SUB 4 JGE 10
CPA 5 JL 11
JMP 6 JLE 12
STOP 13

La generarea programului asamblorul creează o tabelă cu etichetele din program şi


adresele lor (valorile contorului de locaţii).
X Y Z start
0 4 8 12

Adresa etichetei start în tabelă este 12 în zecimal (C în hexazecimal).


10
Textul generat de asamblor în cazul programului anterior este următorul:
Contorul de locaţii Memoria Programul în limbaj de asamblare
0 00 00 00 32 X DATA 50
4 00 00 00 17 Y DATA 23
8 00 00 00 00 Z DATA 0
C 01 00 00 00 start LDA X
10 03 00 00 04 ADD Y
14 02 00 00 08 STA Z
18 0D 00 00 00 STOP

În prima coloană avem valoarea contorului de locaţii în hexazecimal, care este adresa
la care se află generată instrucţiunea în memorie. În prima linie avem numărul 50 reprezentat
pe 4 octeţi. Valoarea lui în hexazecimal este 32. În linia a doua avem valoarea hexazecimală
a numărului 23. În linia treia este generată valoarea 0 pe patru octeţi. În linia a patra avem
generată instrucţiunea: start LDA X Eticheta X are valoarea 0 (vezi contorul de
locaţii). Codul instrucţiunii OP este 1. În linia a cincea avem instrucţiunea: ADD Y
Eticheta Y are valoarea 4, codul instrucţiunii OP este 3. 11
Exemplu. Fie două numere întregi a = 17 şi b = 13.
Se cere să se calculeze valoarea c = max(a, b).
Problema poate fi rezolvată cu programul pseudocod de mai jos:
a = 17;
b = 13;
c = a;
if(a < b)
c = b;
Programul în limbaj de asamblare este următorul:
a DATA 17
b DATA 13
c DATA 0
start LDA a
STA c
CPA b
JGE adr1
LDA b
STA c
adr1 STOP

12
Tabela cu adresele în zecimal ale etichetelor este următoarea:
a b c start adr1
0 4 8 12 36

Programul generat de asamblor este cel de mai jos.


Contorul de locaţii Memoria Programul în limbaj de asamblare
0 00 00 00 11 a DATA 17
4 00 00 00 0D b DATA 13
8 00 00 00 00 c DATA 0
C 01 00 00 00 start LDA a
10 02 00 00 08 STA c
14 05 00 00 04 CPA b
18 0C 00 00 24 JGE adr1
1C 01 00 00 04 LDA b
20 02 00 00 08 STA c
24 0D 00 00 00 adr1 STOP
Valorile contorului de locaţii sunt în hexazecimal. 13
Rezolvaţi:
Un alt program pseudocod pentru rezolvarea problemei este cel de mai jos.
a = 17;
b = 13;
if(a <= b)
c = b;
else
c = a;
Să se scrie programul în limbaj de asamblare.

14

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