Documente Academic
Documente Profesional
Documente Cultură
Cuprins Pagina
Recapitulare 18
1
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare
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ă
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
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 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.
6
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare
Exemple:
mov <reg> , <reg>
mov <mem> , <reg>
mov <reg> , <mem>
mov <mem> , <valoare imediată>
mov <reg> , <valoare imediată>
7
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare
Exemplu:
push BX
are ca efect: decrementează SP cu 2, salvează BX în stivă.
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ț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:
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)
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
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>
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 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
Exemple:
cmp <reg> , <reg>
cmp <reg> , <mem>
cmp <mem> , <reg>
cmp <reg> , < val_imediata >
cmp <mem> , < val_imediata >
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.
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ț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.
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
a) limbajul natural
b) limbajul maşină
c) limbajul de programare
d) limbajul procedural
a) cuvinte cheie
b) numere hexazecimale
c) adrese de memorie
d) cifre binare 0 și 1
mov ax , bx
mov ds , ax
mov dl , al
mov ds, es
mov cs , 23H
15
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare
mov ax , 40h
mov es , ax
mov ax , N
add ax , M
mov P , ax
a) mașină
b) procedural
c) de asamblare
d) de nivel scăzut
a) compilator
b) asamblor
c) generator de aplicații
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
1. b)
2. d)
17
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare
5.
mov ax , bx //corectă
mov ds , ax //corectă
mov dl , al //corectă
mov ds, es //incorectă
mov cs , 23H //incorectă
7. P← N + M
Recapitulare
18
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare
19
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii
Instrucţiuni specifice limbajelor de asamblare
Bibliografie:
20
Programarea calculatoarelor și limbaje de programare – Curs şi aplicaţii