Sunteți pe pagina 1din 20

Instrucţiuni specifice limbajelor de asamblare

Unitatea de învățare nr. 12

INSTRUCŢIUNI SPECIFICE LIMBAJELOR DE ASAMBLARE: PROCEDEE DE


TRANSFER CU MEMORIA, DEPLASĂRI ŞI ROTAŢII

Cuprins Pagina

Obiectivele unității de învățare nr. 12 2


12.1 Limbaje de programare 2

12.2 Programarea în limbaj de asamblare – generalități 4

12.3 Noțiuni de bază ale limbajului de asamblare – regiștrii 5

12.4 Setul de instrucțiuni 6

Lucrare de verificare – unitatea de învățare nr. 12 16

Răspunsuri și comentarii la întrebările din testele de autoevaluare 17

Recapitulare 18

Bibliografie – unitatea de învățare nr. 12 20

1
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

OBIECTIVELE unității de învățare nr. 12

Principalele obiective ale Unității de învățare nr. 12 sunt:

 Identificarea diferitelor niveluri (sau generații) de limbaj, cum ar fi


limbaj mașină, limbaj de asamblare, limbaje de nivel înalt.

 Cunoașterea instrucțiunilor uzuale în limbaj de asamblare.

12.1. Limbaje de programare

Un program într-un sistem de calcul include:


- un set de instrucțiuni necesare calculatorului pentru a rezolva o anumită problemă;
- datele și adresele de memorie necesare microprocesorului pentru a îndeplini taskurile prevăzute
de instrucțiuni.
La orice prelucrare de date, programul de calcul trebuie să identifice sursa datelor,
destinația rezultatelor și operațiile care trebuie realizate. Astfel, pentru execuția oricărei
instrucțiuni, un procesor urmează următoarele etape:
- UCP preia o instrucțiune din memorie;
- traduce instrucțiunea prelucrată într-o serie de comenzi pe calculator;
- execută comenzile – operațiile indicate de instrucțiuni;
- accesează memoria și scrie rezultatul în regiștrii.
Un program scris într-un limbaj de nivel înalt trebuie ”tradus” de către compilator în cod
mașină pentru a putea fi executat de către UCP. În esență, fiecare program se reduce la secvențe
de biți (cifre binare) – limbajul mașină. Limbajul mașină/cod mașină sau cod obiect este singurul
limbaj pe care calculatorul este capabil să-l înțeleagă în mod direct, fiecare instrucţiune în cod
maşină fiind o combinaţie de 4 biţi. Totuși, scrierea programelor în cod mașină este dificil de
gestionat, deoarece:
- programele sunt dificil de scris, de înțeles și de depanat;
- programele nu descriu prelucrările ce urmează a fi executate într-o formă care să fie ușor de
înțeles;
- programele sunt lungi și dificil de scris;
- orice eroare care se strecoară este dificil de localizat și de corectat.

2
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

- nu sunt portabile: nu se pot executa pe alte tipuri de calculatoare decât pe cel pentru care au fost
elaborate.
Limbajul mașină este cel mai mic nivel de reprezentare a unui program. Limbajele de
programare pot fi în general împărțite în două categorii: ”Low-Level” –nivel inferior și ”High-
level”- limbaje de nivel înalt:

limbaj de asamblare
”Low-Level”
limbaj mașină

Fortran, Pascal, C++, etc. - limbaje procedurale


Limbaje orientate pe problemă ”High-level”
Limbaje naturale

► Limbajul de asamblare – limbaj simbolic este un limbaj de nivel inferior, utilizat de


calculatoare, microprocesoare, microcontrollere și alte dispozitive programabile. Este situat pe
nivelul imediat superior față de limbajul mașină. Cu toate că este mai standardizat decât limbajul
mașină, limbajul de asamblare este totuși dependent de calculator.
Fiecărei instrucțiuni din limbaj de asamblare îi corespunde direct un singur cod
executabil. Softul care convertește un program (scris în limbaj de asamblare) în cod mașină se
numește asamblor. Limbajele de asamblare sunt utilizat în mod curent pentru manipularea
hardware directă, pentru accesul la anumite instrucțiuni ale procesorului, sau pentru a gestiona
problemele de performanță.
► O etapă ulterioară în evoluţia limbajelor de programare o reprezintă limbajele de nivel
înalt – limbaje ce suportă portabilitatea codului. Ele sunt ușor de învățat și de utilizat și sunt
eficiente pentru gestionarea sarcinilor complexe. Aceste limbaje permit programatorilor să scrie
instrucțiuni simple ce conțin notații matematice și cuvinte care au înțeles în limba engleză. Prin
compilare, programul sursă, scris într-un limbaj de nivel înalt, este translatat în program obiect,
iar ulterior, în etapa de linkeditare – editare de legături, programul obiect este completat cu
module preluate din bibliotecile sistemului de operare.
► Limbajele procedurale sunt concepute pentru a exprima logica, procedura de calcul a unei
probleme. Sunt flexibile și pot rezolva o mare diversitate de probleme, dar implică un număr
mare de instrucțiuni procedurale și sunt destinate programatorilor specializați. Sunt independente
de sistemul de calcul și sunt ușor de înțeles și de modificat.
3
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

► Limbajele orientate pe problemă deservesc anumite domenii de activitate. Sunt concepute


pentru a rezolva probleme specifice sau pentru a dezvolta anumite aplicații; definesc scopul, fără
a da detalii asupra modului – procedurile pas cu pas în care acesta se atinge.
Există mai multe tipuri de astfel de instrumente pentru dezvoltarea de aplicații: aplicații
software pe calculatoare personale, limbaje de interogare și generatoare de rapoarte, limbaje care
oferă suport decizional și planificare financiară, etc. Pot fi utilizate atât de programatori
specializați, dar și de alți useri; nu necesită multe instrucțiuni, sunt ușor de înțeles și de depanat.
► Limbajele naturale propun utilizarea limbajului uman în programarea calculatoarelor;
permit computerului să devină "mai inteligent" simulând procesul de învățare pe baza
informațiilor anterioare – interacționează cu o bază de cunoștințe despre un anumit subiect. În
acest sens sunt denumite limbaje bazate pe cunoaștere. Sunt integrate cu aplicaţiile de inteligenţă
artificială pentru a permite comunicarea umană directă.

12.2. Programarea în limbaj de asamblare – generalități

Unitatea Centrală de Prelucrare (UCP) este caracterizată prin instrucţiunile maşină pe


care le execută. Acest set de instrucțiuni este o listă de comenzi ce pot fi executate direct de către
UCP:
- transmit UCP unde să localizeze datele;
- când sunt citite datele;
- cum se prelucrează datele.
Setul complet de instrucțiuni, împreună cu modul de adresare - algoritmul de calcul al
adresei operanzilor formează arhitectura setului de instrucțiuni a unui procesor. Pentru a descrie
această arhitectură, trebuie descris în primul rând modul în care instrucțiunile și datele sunt
stocate în memorie și modul în care acestea sunt accesate pentru prelucrare.

Operații cu memoria
Instrucțiunile programului și datele operate sunt depozitate sunt depozitate în memorie.
Pentru a executa o instrucțiune, circuitele de control ale procesorului trebuie să realizeze un
transfer al cuvântului de informație/cuvintelor ce conțin instrucțiunea, din memorie în procesor.
De asemenea, operanzii și rezultatele trebuie transferate între memorie și procesor. Astfel, cele
două operații de bază ce implică memoria sunt: Read/citire și Write/scriere:

4
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

► Read (Load/Fetch): operație ce transferă o copie a conținutului unei anumite locații de


memorie, către procesor; conținutul memoriei rămâne nemodificat. Pentru a iniția o operație de
citire, procesorul trimite adresa locației dorite către memorie și solicită să fie citit conținutul său.
► Write (Store): operație ce transferă un element de informație de la procesor la o anumită
locație de memorie, suprascriind vechiul conținut al acestei locații. Pentru a iniția o operațiune
de scriere, procesorul trimite adresa locației dorite la memorie, împreună cu datele care urmează
să fie scrise în acea locație.

12.3. Noțiuni de bază ale limbajului de asamblare – regiștrii

Așa cum s-a descris în Unitatea 4, procesorul conține un anumit număr de regiștrii; aceste
registre sunt fie sursa, fie destinația unui transfer către sau din memorie. De fapt, toate operațiile
aritmetice, logice sau de acces la memorie se fac prin intermediul regiștrilor.
Intel a clasificat regiștrii microprocesorului 8086 în trei categorii: regiștrii de uz general,
regiștrii de segment și index, regiștrii speciali și flagurile microprocesorului.

Regiștrii de uz general: cu toate că acești regiștrii sunt "de uz general", fiecare are
propriul scop special:
► Registrul AX (pe 16 biți) respectiv EAX (pe 32 de biți) - ”accumulator” - registrul
acumulator: este registrul cel mai utilizat în execuția operațiilor aritmetice, logice și de deplasare
a datelor, dar și pentru transferul de date de la/către porturile I/O.
► Registrul BX (pe 16 biți) respectiv EBX (pe 32 de biți) - ”base”: registrul utilizat pentru
adresarea indirectă a memoriei.
► Registrul CX (pe 16 biți) respectiv ECX (pe 32 de biți) - ”count”: registrul cu rol de
contor.
► Registrul DX (pe 16 biți) respectiv EDX (pe 32 de biți) - ”data”: registrul utilizat în
operațiile de înmulțire/împărțire și în cazul transferurilor de date.

Obs: cei mai puţin semnificativi 8 biţi ai regiştrilor AX, BX, CX, DX formează respectiv
regiştrii AL, BL, CL, DL (litera L provine de la Low), iar cei mai semnificativi 8 biţi ai aceloraşi
regiştri formează regiştrii AH, BH, CH, DH (litera H provine de la High).

5
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

► Regiștrii SI și DI - ”Source Index” și ”Destination Index”: pot fi utilizați ca pointeri


pentru accesarea indirectă a memoriei; de asemenea, pot fi utilizați cu instrucțiunile pentru
prelucrarea șirurilor de caractere.
► Registrul BP - ”Base Pointer”: utilizat pentru a accesa parametrii și variabilele locale într-
o procedură
► Registrul SP - ”Stack Pointer” - pointerul de stivă: indică poziția curentă de la vârful
stivei (segmentul de stivă) - porțiune din memorie unde datele pot fi depozitate și accesate
conform principiului Last In-First Out. Stiva este folosită la un apel de procedură sau la
revenirea dintr-un apel de procedură.
Reșiștrii SI, DI, BP, SP sunt numai pe 16 biți.

Regiștrii de segment: folosiți în accesările de memorie și transferuri de date


► CS-registru de segment de cod (code segment)
► DS-registru de segment de date (data segment),
► SS-registru de segment de stivă (stack segment),
► ES-registru de segment de date suplimentar (extra segment).

Regiștrii speciali:
► Registrul IP - ”Instruction Pointer” - conține adresa instrucțiunii următoare ce va fi
executată de către procesor.
► Registrul indicatorilor de stare - ”Flags” - determină starea curentă a procesorului și
conține informații despre rezultatele ultimelor instrucțiuni executate.

12.4. Setul de instrucțiuni

- instrucțiuni de transfer date între memorie și regiștrii procesorului: LOAD/STORE


instrucțiuni de transfer de uz general
instrucțiuni de transfer cu stiva
instrucțiuni de transfer specifice adreselor
- instrucțiuni aritmetice
- instrucțiuni logice și la nivel de bit
- instrucțiuni de control program – instrucțiuni de ramificare
- instrucțiuni pentru controlul procesorului

6
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

Instrucțiunile de prelucrare a datelor (aritmetice - adunare, scădere, înmulțire, logice -


operații booleene, relaționale - comparație a două valori sau instrucțiunile de transfer) permit
efectuarea operațiilor aritmetice și logice asupra valorilor datelor în registre – sunt singurele
instrucțiuni care modifică de valorile datelor.

Instrucţiuni de transfer cu scop general: MOV


Instrucțiunea ”mov” transferă un octet, cuvânt, sau dublucuvânt de la operandul sursă la
operandul destinație, fără să modifice conținutul original al sursei; instrucțiunea suprascrie
valoarea precedentă existentă în destinație:

mov <destinatie> , <sursa>

Exemple:
mov <reg> , <reg>
mov <mem> , <reg>
mov <reg> , <mem>
mov <mem> , <valoare imediată>
mov <reg> , <valoare imediată>

Destinația poate fi un registru sau o adresă de memorie. Sursa poate fi un registru, o


locație de memorie sau o valoare imediată - constantă valorică. Sursa și destinația nu pot fi
ambele locații de memorie și ambii operanzi ai instrucțiunii trebuie să fie ambele de aceeași
dimensiune. Există și alte limitări în aplicarea acestei instrucțiuni, de exemplu registrul segment
(reg_seg) CS nu poate fi destinaţie şi nici nu se pot transfera date direct între două registre
segment.

Instrucţiuni de interschimbare a datelor: XCHG


Instrucțiunea ”xchg” schimba între ele continutul celor doi operanzi.
Pentru familia de microprocesoare 80x86 instrucțiunea poate fi de forma:

xchg <reg> , <mem>


xchg <reg> , <reg>
xchg <ax> , <reg16>

7
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

xchg <eax> , <reg32>

Există limitări în aplicarea acestei instrucțiuni: ambii operanzi ai instrucțiunii trebuie să


fie de aceeași dimensiune (număr de biți), registrele de segment nu pot apărea ca operanzi și
faptul că cel puţin un operand trebuie să fie un registru general.

Instrucțiuni de transfer cu stiva: PUSH și POP

Instrucţiunea PUSH (Push Data) - Salvează date în stivă

Forma generală: push <sursa>

Instrucțiunea ”push” decrementează cu doi registrul SP (Stack Pointer) care este


indicatorul vârfului stivei şi apoi transferă un cuvânt din operandul sursă în noul vârf al stivei,
astfel încât registrul SP să indice poziţia curentă a vârfului de stivă.

Exemplu:
push BX
are ca efect: decrementează SP cu 2, salvează BX în stivă.

Instrucţiunea POP (Pop Data) - Reface date din stivă

Forma generală: pop <destinație>

Extrage cuvântul aflat în vârful stivei (adresat de SP) și îl depune în operandul destinaţie;
apoi incrementează registrul pointer de stivă (SP) cu doi pentru a pointa la noul vârf al stivei.

Exemplu:
pop DX
are ca efect: copiază cuvântul aflat în vârful stivei (adresat de SP) în DX; apoi
incrementează registrul pointer de stivă (SP) cu doi.

8
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

Instrucţiuni de transfer specifice adreselor: LEA, LDS, LES

Instrucțiunea ”lea” (Load Effective Address) încarcă adresa efectivă a operandului sursă
(a locației de memorie specificate) în registrul de uz general (pe 16 sau pe 32 de biți) specificat:

lea <reg> , <mem>

Pentru familia de microprocesoare 80x86 instrucțiunea poate fi de forma:


lea <reg16> , <mem>
lea <reg32> , <mem>

Obs: Registrul destinaţie nu poate fi un registru segment.

Instrucţiunile LDS (Load Data Segment) şi LES (Load Extra Segment)


Forma generală este: lds <reg>, <adresă>
les <reg>, <adresă>

Instrucțiunea ”lds” are ca efect: se încarcă în registrele DS şi <reg> adresa aflată în memorie la
adresa <adresă>;
Instrucțiunea ”les” are ca efect: se încarcă în registrele DS şi <reg> adresa aflată în memorie la
adresa <adresă>;

Instrucțiuni aritmetice: ADD, SUB, INC, DEC, MUL, IMUL, DIV, IDIV, CMP
Instrucțiunea ADD (Addition)

Forma generală: add <destinatie> , <sursa>


Instrucțiunea ”add” are ca efect: adună la operandul destinație valoarea operandului sursa;

Obs: ambii operanzi pot fi registre, dar cel mult un operand poate fi o locație de memorie; sursa
poate fi şi un operand imediat.

Exemple:
add mem , imm are ca efect: adaugă valoarea imediată la memorie

9
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

add reg , mem are ca efect: adună mem cu reg și depune în reg
add mem , reg are ca efect: adună conținutul registrului reg la memorie
add reg , imm are ca efect: adună valoarea imediată cu valoarea din reg și depune în reg
add reg , reg are ca efect: adună conținutul sursei (al doilea registru) cu conținutul destinației
(primul registru), iar rezultatul îl depune în destinație

Instrucţiunea SUB (Substract)

Forma generală: sub <destinatie> , <sursa>


Instrucțiunea ”sub” are ca efect: scade din operandul destinație valoarea operandului sursa;
Observațiile sunt identice cu cele de la instrucțiunea ”add”.

Exemple:
sub mem , imm
sub reg , mem
sub mem , reg
sub reg , imm
sub reg , reg

Instrucţiunile INC și DEC incrementează (adună 1 la) și respective decrementează (scad 1) dintr-
o variabilă memorie sau registru.

Forma generală:
inc <reg> dec <reg>
inc <mem> dec <mem>

Instrucţiunea MUL (Multiply - Înmulţeşte fără semn)

Forma generală: mul <sursa>

mul <reg> mul <mem>

10
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

Convenția este ca primul operand să fie în registrul acumulator (AL pentru reprezentări 8 biți,
AX pentru 16 biți, EAX pentru 32 de biți). De aceea primul operand nu se mai specifică.
Rezultatul suprascrie conținutul registrului acumulator

Instrucţiunea IMUL (Integer Multiply - Înmulţeşte cu semn) se utilizează atunci când valoarea
înmulțită are semn. Are trei formate de reprezentare:

imul <operand_1>
imul <operand_1> , <operand_2>,
imul <operand_1> , <operand_2>, <val_imediata>,

În formatul cu doi operanzi are loc înmulțirea celor doi operanzi, rezultatul fiind depus în primul
operand.
În formatul cu trei operanzi are loc înmulțirea ultimilor doi operanzi, rezultatul fiind depus în
primul operand.

Instrucțiunile DIV și IDIV – efectuează împărțirrea pe întregi fără semn, respectiv cu semn.
Forma generală: div <operand>

Dacă operandul este pe 8 biți, atunci instrucțiunea împarte o valoare fără semn din registrul AX
la operand, cu câtul returnat în AL și restul (modulo) în AH.
Dacă operandul este pe 16 biți, atunci instrucțiunea împarte valoarea pe 32 de biți din DX:AX,
cu câtul returnat în AX și restul în DX.
Dacă operandul este pe 32 biți, atunci instrucțiunea împarte valoarea pe 64 de biți din
EDX:EAX, cu câtul returnat în EAX și restul în EDX.

Instrucţiunea IDIV (Integer Division - Împarte cu semn) – este asemănătoare cu instrucțiunea


DIV, numai că operanzii sunt numere cu semn.

Instrucțiunea CMP (Compare) – compară cei doi operanzi prin scăderea acestora.
Această instrucțiune este utilizată împreună cu instrucțiunea de salt condiționat pentru luarea
deciziilor. Instrucțiunea scade un operand din celălalt pentru a compara dacă operanzii sunt egali
sau nu, neafectând nici operandul sursă, nici operandul destinație.

11
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

Forma generală: cmp <destinatie> , <sursa>

Exemple:
cmp <reg> , <reg>
cmp <reg> , <mem>
cmp <mem> , <reg>
cmp <reg> , < val_imediata >
cmp <mem> , < val_imediata >

Instrucțiuni logice și la nivel de bit


Uneori este necesar nu doar să se compare conținutul variabilelor sau regiștrilor, ci să se verifice
biții individuali într-o locație de memorie sau dintr-un registru. Aceste tipuri de operații sunt
cunoscute ca operațiuni pe biți.

Instrucțiunile logice efectuează operațiile logice standard la nivel de bit. Acţionează bit cu bit,
deci se aplică funcţia logică respectivă tuturor biţilor sau perechilor de biţi corespunzători
operanzilor, iar rezultatul fiind depus în destinație.

Instrucţiunile logice sunt următoarele:


and <destinatie> , <sursa>
or <destinatie> , <sursa>
xor <destinatie> , <sursa>
not <destinatie>

ƒ ƒ AND: A &= B ƒ OR: A |= B ƒ XOR: A ^= B ƒ NOT: A =~A

O altă instrucțiune logică este instrucțiunea TEST:


test <destinatie> , <sursa>

Această instrucțiune este asemănătoare cu instrucțiunea AND, dar rezultatul nu este stocat în
destinație (similar cu instrucțiunea CMP.)

12
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

Instrucţiuni de deplasare şi de rotaţie: SHL, SHR, SAL, SAR, ROR, ROL


Există aplicații în care este necesar ca biții unui operand să fie deplasați la dreapta sau la stânga
cu un anumit număr de poziții binare. Modul de realizare al deplasărilor este în funcție de
operand: număr cu semn sau, la modul general, informație codificată binar. Pentru un număr se
utilizează deplasarea aritmetică, ce păstrează semnul numărului. Deplasarea aritmetică presupune
că bitul cel mai din stânga dintr-un registru sau locație de memorie este un bit de semn.

Formatul general al unei instrucțiuni de deplasare este:


shl <destinatie> , <contor> //deplasare logică la stânga
sal <destinatie> , <contor> //deplasare aritmetică la stânga
shr <destinatie> , <contor> //deplasare logică la dreapta
sar <destinatie> , <contor> //deplasare aritmetică la dreapta

Astfel, conținutul operandului destinație va fi deplasat la stânga sau la dreapta cu un număr de


poziții binare precizat în contor. Contorul poate fi specificat ca o constantă (valoare imediată)
sau prin registrul CL.

Exemple de instrucțiuni de deplasare:


shl reg , CL shr reg , CL
shl reg , val_imediata shr reg , val_imediata
shl mem , CL shr mem , CL
shl mem , val_imediata shr mem , val_imediata

Instrucțiunile SHL/SAL
Prin deplasare la stânga, biții operandului vor fi translatați, iar în urma translatării, în partea
dreaptă a operandului se introduc biți zero. Bitul MSB – cel mai semnificativ (care iese din
operand) este înscris în indicatorul de transport CF:
MSB 1 0

CF ---
--
__
Obs: __
1) Instrucțiunile SHL și SAL execută practic aceeași operație și reprezintă aceeași instrucțiune.

13
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

2) Deoarece deplasarea la stânga a unei valori cu o poziție este echivalentă cu înmulțirea acelei
valori cu 2, prin deplasare la stânga se va obține o multiplicare cu puteri ale lui 2.
De exemplu:
shl AX , 1 ⇔ AX *2
shl AX , 3 ⇔ AX *8
shl AX , 8 ⇔ AX *256

Instrucțiunile SHR/SAR
Prin deplasare la dreapta, biții operandului vor fi translatați, iar în urma translatării, în partea
stângă a operandului se introduc biți zero. Bitul LSB – cel mai puțin semnificativ este copiat în
indicatorul de transport CF.

Obs: Prin deplasare la dreapta se realizează o împărțire (fără semn în cazul SHR și cu semn în
cazul SAR) cu puteri ale lui 2, corespunzător număruli de biți cu care se face deplasarea la
dreapta.

Instrucțiunile de rotație ROR (Rotate Right) și ROL (Rotate Left)


În operațiile de deplasare, biţii deplasaţi în afara operandului sunt pierduţi, cu excepția ultimului
bit deplsat, care este reținut în indicatorul de transport, CF. Pentru a păstra toți biții, se utilizează
instrucțiunile de rotație, astfel încât biții deplasați sunt rotiţi înapoi către celălalt capăt al
operandului.
Există două versiuni ale instrucțiunilor de rotație: cu implicarea indicatorului de transport (CF) în
procesul de rotație (RCR, RCL) sau fără (ROR, ROL).

Formatul general al unei instrucțiuni de rotație este:


rol <destinatie> , <contor> // rotaţie a biţilor operandului către stânga. bitul MSB trece din
operand în bitul LSB
ror <destinatie> , <contor> // rotaţie a biţilor operandului către dreapta. Bitul LSB trece în bitul
MSB
rcl <destinatie> , <contor> // rotaţie a biţilor operandului către stânga prin intermediul CF. Bitul
MSB trece din operand în CF, apoi se deplasează toţi biţii din operand cu o poziţie la stânga iar
CF original trece în bitul LSB din operand.

14
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

rcr <destinatie> , <contor> // rotaţie a biţilor operandului către dreapta prin intermediul CF.
Astfel, bitul din CF este scris înapoi în bitul MSB al operandului.

Test de autoevaluare 1

1. Cel mai mic nivel de reprezentare a unui program este:

a) limbajul natural
b) limbajul maşină
c) limbajul de programare
d) limbajul procedural

2. Limbajul mașină este compus numai din

a) cuvinte cheie
b) numere hexazecimale
c) adrese de memorie
d) cifre binare 0 și 1

3. Care sunt regiștrii de uz general?

4. Care este rolul registrului IP?

5. Care din instrucţiunile următoare sunt corecte?

mov ax , bx
mov ds , ax
mov dl , al
mov ds, es
mov cs , 23H

6. Se Care este efectul instrucțiunilor de mai jos?

15
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

mov ax , 40h
mov es , ax

7. Care este efectul secvenței de mai jos?

mov ax , N
add ax , M
mov P , ax

Lucrare de verificare la Unitatea de învățare nr. 12

1. Limbajul ................. este conceput pentru a exprima logica folosită în loc


de a efectua doar calcule.

a) mașină
b) procedural
c) de asamblare
d) de nivel scăzut

2. Limbajele procedurale trebuie traduse în limbaj mașină folosind un:

a) compilator
b) asamblor
c) generator de aplicații

3. Limbajul C++ este considerat a fi:

a) limbaj mașină
b) limbaj de asamblare
c) limbaj procedural
d) limbaj natural
16
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii

xy  ( x  y ) 2
Instrucţiuni specifice limbajelor de asamblare

4. Stabiliți valoarea de adevăr a afirmațiilor:

a) Atunci când un program este translatat în cod mașină, compilatorul va


detecta erorile logice
b) C++ este un exemplu de limbaj mașină
c) Pascal, COBOL, FORTRAN sau C++ sunt exemple de limbaje procedurale
care utilizează compilatoare
d) Limbajul mașină constă în cifre hexazecimale

Răspunsuri și comentarii la întrebările din testele de autoevaluare

1. b)

2. d)

3. Registrul AX (pe 16 biți) respectiv EAX (pe 32 de biți) - ”accumulator” -


registrul acumulator
► Registrul BX (pe 16 biți) respectiv EBX (pe 32 de biți) - ”base”: registrul
utilizat pentru adresarea indirectă a memoriei.
► Registrul CX (pe 16 biți) respectiv ECX (pe 32 de biți) - ”count”: registrul
cu rol de contor.
► Registrul DX (pe 16 biți) respectiv EDX (pe 32 de biți) - ”data”: registrul
utilizat în operațiile de înmulțire/împărțire și în cazul transferurilor de date.
► Regiștrii SI și DI - ”Source Index” și ”Destination Index”: pot fi utilizați ca
pointeri pentru accesarea indirectă a memoriei; de asemenea, pot fi utilizați cu
instrucțiunile pentru prelucrarea șirurilor de caractere.
► Registrul BP - ”Base Pointer”: utilizat pentru a accesa parametrii și
variabilele locale într-o procedură
► Registrul SP - ”Stack Pointer” - pointerul de stivă: indică poziția curentă
de la vârful stivei (segmentul de stivă)

17
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

4. Registrul IP - ”Instruction Pointer” - conține adresa instrucțiunii următoare ce


va fi executată de către procesor.

5.
mov ax , bx //corectă
mov ds , ax //corectă
mov dl , al //corectă
mov ds, es //incorectă
mov cs , 23H //incorectă

6. Secvența încarcă registrul es cu valoarea 40h

7. P← N + M

Recapitulare

Un program într-un sistem de calcul include:


- un set de instrucțiuni necesare calculatorului pentru a rezolva o anumită
problemă;
- datele și adresele de memorie necesare microprocesorului pentru a îndeplini
taskurile prevăzute de instrucțiuni.
Pentru execuția oricărei instrucțiuni, un procesor urmează următoarele
etape:
- UCP preia o instrucțiune din memorie;
- traduce instrucțiunea prelucrată într-o serie de comenzi pe calculator;
- execută comenzile – operațiile indicate de instrucțiuni;
- accesează memoria și scrie rezultatul în regiștrii.
Un program scris într-un limbaj de nivel înalt trebuie ”tradus” de către
compilator în cod mașină - secvențe de biți (cifre binare) pentru a putea fi
executat de către UCP.
Limbajele de programare pot fi în general împărțite în două categorii:

18
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

”Low-Level” –nivel inferior (limbaj mașină, limbaj de asamblare) și ”High-


level”- limbaje de nivel înalt (limbaje procedurale, limbaje orientate pe
problemă, limbaje naturale).
Unitatea Centrală de Prelucrare (UCP) este caracterizată prin
instrucţiunile maşină pe care le execută. Acest set de instrucțiuni este o listă de
comenzi ce pot fi executate direct de către UCP:
- transmit UCP unde să localizeze datele;
- când sunt citite datele;
- cum se prelucrează datele.
Setul complet de instrucțiuni, împreună cu modul de adresare -
algoritmul de calcul al adresei operanzilor formează arhitectura setului de
instrucțiuni a unui procesor.
Pentru a executa o instrucțiune, circuitele de control ale procesorului
trebuie să realizeze un transfer al cuvântului de informație/cuvintelor ce conțin
instrucțiunea, din memorie în procesor. De asemenea, operanzii și rezultatele
trebuie transferate între memorie și procesor. Astfel, cele două operații de bază
ce implică memoria sunt: Read/citire și Write/scriere.
Toate operațiile aritmetice, logice sau de acces la memorie se fac prin
intermediul regiștrilor. Intel a clasificat regiștrii microprocesorului 8086 în trei
categorii: regiștrii de uz general, regiștrii de segment și index, regiștrii speciali
și flagurile microprocesorului.
Setul de instrucțiuni cuprinde:
- instrucțiuni de transfer date între memorie și regiștrii procesorului:
LOAD/STORE
instrucțiuni de transfer de uz general
instrucțiuni de transfer cu stiva
instrucțiuni de transfer specifice adreselor
- instrucțiuni aritmetice
- instrucțiuni logice și la nivel de bit
- instrucțiuni de control program – instrucțiuni de ramificare
- instrucțiuni pentru controlul procesorului

19
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare

Bibliografie:

1. Streib, J.T. ”Guide to Assembly Language - A Concise Introduction” , Ed.


Springer, 2011.
2. Rose, C. ”Assembly Language Succintly”, Ed. Syncfusion Inc., 2013.
3. Hamacher, C., Zaky, S., Vranesic, Z. ”Computer Organization”, Ed. Tata
McGraw-Hill Education, 2011.
4. Hyde, R. ”The Art Of Assembly L Anguage”, Ed. No Starch Press, Inc., 2010.

20
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii

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