CURRICULA

Structura externa a instructiunilor ASM

[eticheta:] cod operatie
[eticheta:] cod operatie registru
[eticheta:] cod operatie reg_sursa, red_destinatie
[eticheta:] cod operatie registru, deplasare
[eticheta:] cod operatie registru, deplasare[reg_index]
[eticheta:] cod operatie registru, deplasare[reg_baza]
[eticheta:] cod operatie registru, deplasare[reg_index][reg_baza]
[eticheta:] cod operatie registru, const_imediata
[eticheta:] cod operatie deplasare[reg_index][reg_baza], registru
[eticheta:] cod operatie deplasare[reg_index], registru
[eticheta:] cod operatie deplasare[reg_baza], registru
[eticheta:] cod operatie deplasare, registru
[eticheta:] cod operatie deplasare[reg_index][reg_baza], const_imediata
[eticheta:] cod operatie deplasare[reg_index], const_imediata
[eticheta:] cod operatie deplasare[reg_baza], const_imediata
[eticheta:] cod operatie deplasare, const_imediata
Moduri de adresare
- adresarea prin registru presupune ca toti operanzii sa fie registri, ceea ce conduce la cresterea vitezei de calcul; trebuie realizat un echilibru deoarece numarul registrilor este limitat; in optimizarea programelor exista chiar problema alocarii optime a registrilor in vederea minimizarii numarului de cicluri masina;
- adresarea registru imediat reprezinta un mod de lucru usor de folosit mai atunci cand se efectueaza initializari sau calcule cu constante; programele devin foarte clare si procesul de mentenanta este rapid; initializarea cu zero a registrilor in acest fel trebuie inlocuita cu instructiunea XOR reg,reg;
- adresarea directa presupune definirea operandului utilizand identificatorul cu care a fost definit; nu apar elemente intermediare asa cum sunt registri index sau registri de baza; este deplasarea pe care o da contorul de locatii atunci cand a fost definit operandul referit prin nume; referirea se efectueaza si prin constituirea unor expresii care dau pozitia relativa a operandului in raport cu alti operanzi; se folosesc operatorii de adunare sau de scadere; pentru evaluarea expresiei:
f=a+b+c+d+e
alocarea de memorie inseamna puneri in corespondenta a cuvintelor cu variabilele a,b,c,d,e,f sau cu expresii calculate in raport cu reperul a obtinand a+0,a+2,a+4,a+6,a+8,a+10, in raport ci operandul d obtinand d-6,d-4,d-2,d-0,d+2,d+4 si in raport cu operandul f obtinand f-10,f-8,f-6,f-4,f-2,f-0;
se obtin secventele de instructiuni in care apar operanzii prin identificatori sau in raport de operandul a;
-adresarea indirecta prin registri presupune incarcarea in registri BX sau BP sau SI sau DI a adreselor operanzilor si referirea lor folosind operatorii [reg] care inseamna cu continutul zonei de memorie de la adresa memorata in registrul reg;
pentru evaluarea expresiei
e:=a+b+c+d
dinamica registrilorSI, DI, BX, BP si AX evidentiaza modul in care se initializeaza si mai ales modul in care sunt referiti operanzii prin intermediul registrilor de baza si a registrilor index;
- adresarea bazata presupune utilizarea unuia dintre registri de baza BX sau BP alaturi de o deplasare in expresia de referire;
dinamica registrilor [BX] si [BP] impreuna cu o deplasare permite referirea flexibila aoperanzilor fara a schimba textul sursa;
programatorul trebuie sa initializeze registrul de baza cu ZERO daca efectueaza traversarea unei structuri omogene de la stanga spre dreapta si sa asigure trecerea de la o componenta la alta a structurii prin incrementarea registrului de baza;
daca deplasarea se face de la dreapta spre stanga, programatorul va incarca in registrul de baza o deplasare care sa refere ultima componenta din structura omogena si pentru a asigura traversarea structurii va decrementa registrul de baza;
pentru evaluarea expresiei:
f=a+b+c+d+e
folosind adresare bazata se definesc operanzii
si rand pe rand, registrul de baza bx este incrementat cu 2 pentru a-i referi indirect;
- adresarea indexata presupune folosirea unuia dintre registri index SI sau DI in expresii de forma deplasare[SI] sau deplasare[DI], in una din patru varietati;adresa operandului se calculeaza adunand la deplasare continutul registrului index; pentru calculul sumei elementelor a doua masive unidimensionale
unul fiind traversat de la primul spre ultimul element, iar celalalt fiind traversat de la ultimul spre primul element, presupun initializarea registrilor cu adresele acelor elemente;
traversarea de la stanga la dreapta se asigura prin incrementarea registrului SI, iar traversarea de la dreapta spre stanga se asigura prin decrementarea registrului DI;
dinamica registrilor si referirea operanzilor dau masura flexibilitatii pe care adresarea indexata o ofera in cazul lucrului cu structuri de date omogene;
- adresarea indirecta presupune licarcarea adresei unui operand intr-un registru si referirea acestui operand intr-o expresie de forma [registru];
pentru evaluarea expresiei:
f=a+b+c+d+e
se foloseste registrul SI pentru referirea indirecta, operanzii definiti distinct apar asemeni unei structuri omogene in procesul de referire folosind o structura repetitiva;
- adresarea bazata si indexata necesita un registru index si un registru de baza; referirile indirecte-indexate sunt de forma [BX][SI] sau [BP][DI];semnificatia pe care o are executia unei instructiuni bazate indexate este strict legata de citirea corecta a semnificatiei fiecarei componente din expresia de referire si din interpretarea corecta a semnificatiei
pentru evaluarea expresiei:
f=a+b+c+d+e
registrul de baza BX este folosit pentru a referi operandul a, iar registrul SI este utilizat pentru a referi impreuna cu continutul registrului BX ceilalti operanzi
- bazata, indexata si cu deplasare
- imediata
- registru
- adresare siruri presupune lucru cu doua zone de memorie de aceeasi lungime; o zona de memorie este SURSA iar cealalta este DESTINATIE; lungimea LUNGIME a zonelor de memorie este memorata in registrul CX si programatorul realizeaza aceasta prin instructiunea:
MOV CX,LUNGIME
adresa operandului sursa este incarcata in registrul SI cu instructiunea:
LEA SI,SURSA
sau cu instructiunea:
MOV SI,offset SURSA
adresa operandului destinatie este incarcata in registrul DI cu instructiunea:
LEA DI,DESTINATIE
sau cu instructiunea:
MOV DI,offset DESTINATIE
- traversarea de la stanga la dreapta se efectueaza daca indicatorul de conditie DF==0
- traversarea de la dreapta la stanga se efectueaza daca indicatorul de conditie DF==1
instructiunea MOVSB, de copiere a unui sir SURSA in zona de memorie DESTINATIE are o dinamica in care se regasesc toate stadiile de evolutie ale registrilor SI si DI care sunt incrementati cu 1 in timp ce registrul CX este gecrementat tot cu 1;
- adresare porturi.

Structura interna a instructiunilor ASM



Adresele registrilor sunt:

Adresa Registri 16 biti Registri 8 biti
000 AXAL
001 CXCL
010 DXDL
011 BXBL
100 SXAH
101 BPCH
110 SIDH
111 DIBH


Expresiile de adresare sunt:

Expresia Mod de adresare r/m
depl[BX][SI] Adresare bazata indexata000
depl[BX][DI] Adresare bazata indexata001
depl[BP][SI] Adresare bazata indexata010
depl[BP][DI] Adresare bazata indexata011
depl[SI] Adresare indexata100
depl[DI] Adresare indexata101
depl[BP] Adresare bazata110
depl[BX] Adresare bazata111


Structura interna a instructiunii definita pe un bait este:

Bitii Continut Semnificatie
7 - 2 cod operatieoperatie elementara
1 ddirectia rezultatului
d=0 operand destinatie registru
d=1 operand destinatie in memorie
0 wtipul operandului
w=0 operand pe bait
w-1 operand pe cuvant


Structura interna a instructiunii definita pe 2 baiti este:

Bitii Continut Semnificatie
7 - 2 cod operatieoperatie elementara
1 ddirectia rezultatului
d=0 operand destinatie registru
d=1 operand destinatie in memorie
0 wtipul operandului
w=0 operand pe bait
w-1 operand pe cuvant
7-6 mod
00
01
10
11
existenta campului deplasare in instructiune
5-3 regAdresa registrului utilizat
2-0 r/mDefineste tipul expresiei de adresare


Structura interna a instructiunii definita pe 3 baiti este:

Bitii Continut Semnificatie


Structura interna a instructiunii definita pe 4 baiti este:

Bitii Continut Semnificatie


Structura interna a instructiunii definita pe 5 baiti este:

Bitii Continut Semnificatie


Structura interna a instructiunii definita pe 6 baiti este:

Baitii Bitii Continut Semnificatie
Baitul 5 7 - 2 cod operatieoperatie elementara
Baitul 5 1 ddirectia rezultatului
d=0 operand destinatie registru
d=1 operand destinatie in memorie
Baitul 5 0 wtipul operandului
w=0 operand pe bait
w-1 operand pe cuvant
Baitul 4 7-6 mod
00
01
10
11
existenta campului deplasare in instructiune
Baitul 4 5-3 regAdresa registrului utilizat
Baitul 4 2-0 r/mDefineste tipul expresiei de adresare
Baitul3 7-0 Deplasare Deplasare 1
Baitul 2 7-0 Deplasare Deplasare 2
Baitul1 7-0 Constanta Constanta imediata 1
Baitul 0 7-0 Constanta Constanta imediata 2


Bitii Continut Semnificatie


Clasificarea instructiunilor


Instrictiuni cu operanzi impliciti.
Instructiunile Registrii impliciti
AAA,AAD,AAM,AAS AL, AH
CBW, CBD AL, AX, AX:DX
DAA, DAS AL
IN, OUT AL, AX
MUL, IMUL, DIV, IDIV AL, AX, AX:DX
LAHF, SAHF AH
LES ES
LDS DS
SHL, SHR, ROR, ROL CX
MOVSB, MOVSW, CMPSB, CMPSW CX, SI, DI
XLAT AL, BX

Structuri de control


structura liniara

structura alternativa

structura alternativa imbricata

structura alternativa imbricata, varianta imbunatatita

structura alternativa program

structura repetitiva

structura evaluarea expresiei

**********************************************************
Alocarea memoriei pentru variabile elementare

Dinamica registrilor

Dinamica memoriei

Alocarea memoriei

Alocarea memoriei pentru masive

Punerea in corespondenta a elementelor masivului cu memoria

Pentru un masiv bidimensional definit si initializat la definire, punerea in corespondenta a elementelor masivului cu memoria

evidentiaza locul fiecarui element.
Pentru in corespondenta a elementelor masivului definit si initializat partial cu memoria

evidentiaza partile care nu trebuie referite.
Definirea articolului

Punerea in corespondenta a membrilor din articol cu memoria

Referirea membrilor articolului

*************************************************************

Proceduri


Executia unui program care apeleaza proceduri presupune: depunerea pe stiva
(PSTIV) a parametrilor, efectuarea salctului catre procedura, executia prelucrarilor din procedura, efectuarea revenirii in programul apelator, la instructiunea ce urmeaza instructiunii CALL.

Inainte de a apela o procedura prin instructiunea CALL programatorul trebuie sa efectueze depunerea pe stiva
a adresei parametrilor care se prelucreaza de catre instructiunile procedurii.

La intrarea in procedura trebuiesalvat registrul BP pe stiva.
Se copiaza registrul SP in registrul BP pentru a referi cu deplasari fixate adresele parametrilor efectivi in procedura.

Inainte de revenirea in programul apelator se producerestaurarea registrului BP pentru a fi folosit in continuare.

Instructiunea RETurn de revenire din procedura in programul apelator presupune preluarea de pe stiva in registrul IP care determina salt spre executia instructiunii ce urmeaza apelului prin CALL.

**************************************************************

Macrodefinitii ASM

Macrodefinitiile sunt constructii realizate pentru a efectua o prelucrare bine definita.
Structura unei macrodefinitii include:
- nume astfel ales incat sa fie sugestiv si pogramatorul sa-l poata identifica si retine cu usurinta
- lista de parametri, pe care programatorul trebuie sa o structureze asa fel incat datele de intrare si rezultatele sa fie grupate
- secventa de instructiuni PUSH pentru salvarea de registri
- secventa de instructiuni pentru prelucrari
- instructiuni POP de restaurare a registrilor.
Macrodefinitiile pentru salvare si restaurare se construiesc astfel incat sa se asigure disciplina FIFO de lucru pe stiva.
Pentru initializarea cu zero a registrilor programatorul va utiliza instructiuni eficiente, evitand instructiunile cu incarcare de constante in modul imediat.
In acelasi fel se va proceda si in cazul in care se efectueaza initializarea registrilor cu continutul unei variabile val.
Pentru evaluarea expresiei:
e:=a+b
se utilizeaza o macrodefinitie in care operanzii sunt definiti pe un bait bait dar se scrie si macrodefinitia in care operanzii sunt definiti cu DW.
Interschimbul de continut pentru variabile definite pe un cuvant presupune lucrul cu registri AX si BX, in timp ce macrodefinitia care efectueaza interschimbul variabilelor definite pe dublu cuvant utilizeaza registri AX, BX, CX si DX.
Pentru adunarea a dpua numere presupune luarea in considerare indicatorului de conditie CF prin intermediul instructiunii ADC.
Diagrama pentru alegerea minimului dintre trei numere a,b,c are un text sursa in care apar doua etichete e1 si e2 definite in directiva LABEL. Mecanismele pentru gestionarea etichetelor la macroexpandare evita aparitia etichetelor multiplu definite.
Aceasta macrodefinitie se utilizeaza in evaluarea unei expresii in care numarul de termeni este variabil, folosind artificii adecvate.
La fel si macrodefinitia pentru adunarea a trei numere, este utilizata in evaluarea de expresii cu numar mai mare de termeni, prin preluarea de subtotaluri sau prin includerea de termeni nuli.
Macrodefinitiile includ si prelucrari mult mai complexe, ca in cazul insumarii elementelor unui sir sau in cazul constituirii elementelor uni vector avand la baza elementele a doi vectori, z[i]:=x[i]+y[i] sau a gasirii elementului minim dintr-un sir sau in cazul numararii elementelor pozitive, a elementelor nule si a elementelor negative dintr-un sir.
Se efectueaza transmiterea parametrilor prin registri, astfel:
SI - contine adresa primului element din sir (LEA SI,x)
CX - numarul de elemente din sir (MOV CX,n)
BX - numar elemente pozitive
DX - numar elemente nule
DI numar elemente negative.
Registri SI, CX se initializeaza inainte de macroapel.
Apar riscuri daca aceste initializari sunt incorecte.
Macrodefinitiile includ in corpul lor macroapeluri, fiind astfel denumite macroinstructiuni imbricate.
Pentru adunarea a 4 numere este construita macroinstructiunea imbricata ce contine trei macroapeluri a unei macrodefinitii care aduna doua numere.
daca exista macrodefinitii diferite pentru initializarea cu zero a registrilor de lucru init_reg si, respectiv,init_r a registrilor de index, macroinstructiunea initall prin cele doua macroapeluri are rolul de a reuni efectele celor doua macrodefinitii mai simple.
******************************************************************

Structuri de programe ASM

******************************************************************

Lucru cu fisiere in ASM

In cazul lucrului cu fisiere, programatorul ASM lucreaza cu:
- numele fisierului dat sub forma unui sir de caractere
- un numar asociat fisierului, handler furnizat de functia de crearea fisierului
- o zona de memorie in care se afla informatia ce trebuie scrisa
- o zona de memorie care se incarca cu informatia transferata din fisier
- un set de coduri care dau informatii asupra modului in care s-au derulat prelucrarile
- functii
- operatii pe fisiere
- registri impusi pentru transferul de parametri catre functii.
Pentru a realiza principalele operatii cu fisiere trebuie respectate cerintele din tabelul de mai jos:

AL - se initializeaza cu 00H pentru a determina atributele
CL - atributele determinate
(0-read only,1-write only,2-update)
AL - se initializeaza cu 01H pentru a initializa atributele
CL - atributele de initializare
(0-read only,1-write only,2-update)
OPERATIA
pe
FISIER
FUNCTIA
APELATA
COD
OPERATIE
SEMNIFICATIE REGISTRI
Creare
fisier
INT 21H 3CHDX - adresa zonei de memorie pentru calea fisierului
CX - atribite fisier
AH - contine codul operatiei, adica, 3CH
Deschidere
fisier
INT 21H 3DHDX - adresa zonei de memorie pentru calea fisierului
AL - tip acces
0 - read only
1 - write only
2 - update
AH - contine codul operatiei, adica, 30H
Inchidere
fisier
INT 21H 3EHBX - numar logic
AH - contine codul operatiei, adica, 30H
Citire din
fisier
INT 21H 3FHBX - numar logic
DX - adresa zonei de memorie unde se stocheaza informatia citita
CX - numarul maxim de baiti care se citesc
AH - contine codul operatiei, adica, 3FH
Scriere in
fisier
INT 21H 40HBX - numar logic
DX - adresa zonei de memorie de unde se preia informatia pentru a fi scrisa
CX - numarul maxim de baiti care se scriu
AH - contine codul operatiei, adica, 40H
Inchidere
fisier
INT 21H 41HBX - numar logic
DX - adresa zonei de memorie care defineste calea
AH - contine codul operatiei, adica, 41H
Detrminare
atribute
fisier
INT 21H 43H DX - adresa zonei de memorie care defineste calea
AH - contine codul operatiei, adica, 43H
Initializare
atribute
fisier
INT 21H 43H DX - adresa zonei de memorie care defineste calea
AH - contine codul operatiei, adica, 43H
*****************************************************************

Lucru cu siruri de caractere

******************************************************************

Lucrul cu siruri de caractere trebuie analkizat distinct, dupa cum se lucreaza cu siruri de baiti sau cu siruri de caractere.
Operatiile se efectueaza bait cu bait sau cuvant cu cuvant.
Operatiile pe siruri de caractere se caracterizeaza prin utilizarea de zone de memorie de lungime egala.
Pentru a intelege corect rostul operatiilor cu siruri de caractere, trebuie spus ca ele utilizeaza o serie de registri care au tot timpul aceeasi semnificatie.
Programatorul trebuie sa aiba grija ca sa incarce in fiecare registru exact ceea ce necesita executia corecta a fiecarei instructiuni.
Registrul CX contine lungimea zonelor de memorie.
Registri SI si DI contin adresele zonelor de memorie.
Registrul AL sau registrul AX se utilizeaza ca registru tampon.
Pentru initializarea registrilor se folosesc instructiuni MOV si LEA.
Lucru ca zonele de memorie inseamna in primul rand sens de traversare care este dat de valoarea indicatorului de conditie DF.
Daca DF este initializat cu zero prin instructiunea CLD traversarea se efectueaza de la stanga la greapta si registri SI si DI sunt incrementati cu 1 daca se lucreaza pe bait (w==0) iar daca w==1 se lucreaza pe cuvant si incrementarea este cu ratia 2 pentru cei doua registri.
Din contra, daca indicatorul DF este setat pe 1 cu instructiuneaSTD registri SI si DI sunt decrementati cu 1 daca w==0 si , respectiv, cu 2 daca w==1.
Pentru copierea bait cu bait a unei zone de memorie SURSA intr-o alta zona de memorie DESTINATIA, este utilizata instructiunea MOVSB, iar pentru a asigura directia detraversare de la stanga la dreapta este necesara initializarea indicatorului de conditie DF cu zero prin instructiunea CLD.
In cazul in care, printr-o initializare corespunzatoare
a registrilor SI si DI cu adresele ultimilor lor baiti, prin setarea cu 1 a indicatorului DF data de instructiunea STD se va obtine o copiere corecta a zonei de memorie SURSA in zona de memorie DESTINATIA.
Daca programatorul uita sa faca o initializare corecta si incarca in registri SI si DI adresele de inceput ale zonelor de memorie, iar traversarea este de la dreapta spre stanga, evident rezultatul este eronat, distrugandu-se operanzi vecini acestor zone.
Pentru incarcarea corecta a dresei ultimului bait exista variante numeroase, important fiind faptul ca efortul de programare si de mentenanta sa fie cat mai redus.
Daca se compara programele care utilizeaza instructiunea MOVSB cu cele care nu o utilizeaza, se vad avantajele celor dintai, prin prisma lungimii ca numar de instructiuni.
Daca se doreste intercalarea de prelucrari intre incarcarea in registrul AL sau in registrul AX si copierea din registru in zona de memorie referita pri DI, trebuie folosite doua instructiuni si anume LODSB si STOSB.
Compararea bait cu bait a doua zone de memorie este posibila cu ajutorul instructiunii CMPSB.
Deosebirile de utilizare a instructiunii CMPSB in compararea a doua siruri sunt clare.
Copararea baitilor dintr-un sir cu continutul registrului AL este realizata de instructiuneaSCASB, iar utilizarea ei in numararea aparitiilor caracterului = intr-un sir este benefica.
In limbajul de asamblare sunt definite in mod similar instructiuni pentru lucru cu siruri de cuvinte.
Pentru copierea cuvant cu cuvant a elementelor dintr-un sir de cuvinte se utilizeaza instructiunea MOVSW.
Pentru incarcarea rend pe rand, in registrul AX a cuvintelor dintr-un sir de cuvinte se utlizeaza instructiunea LODSW.
Pentru memorarea rend pe rand, din registrul AX a cuvintelor intr-un sir de cuvinte se utlizeaza instructiunea STOSW.
Pentru compararea rend pe rand, a cuvintelor dintr-un sir de cuvinte sursa cu cuvintele dintr-un sir de cuvinte destinatie,se utlizeaza instructiunea CMPSW.
Pentru a simplifica includerea in structuri repetitive a instructiunilor de lucru cu siruri de caractere este utilizata instructiunea REP sau variantele care testeaza in forma directa indicatorul de conditie ZF si registrul CX si in forma cu negatie, permitand scrieri mult mai compacte.
Pentru eliminarea blancurilor consecutive se utilizeaza SCASB.
Pentru copierea caracterului + intr-un sir se utilizeaza REP STOSB.
Pentru copierea intr-un sir de baiti numit sir2 numai a literelor mari dintr-un alt sir numit sir1 sunt necesare instructiunile LODSB pentru traversarea integrala a sirului numit sir1 cu incrementarea intr-un anumit ritm a registrului SI, iar pentru preluarea din registrul AL a caracterelor LITERE MARI in zona de memorie sir2 folosind registrul DI care are un cu totul alt ritm de incrementare.
Instructiunile de lucru cu siruri de caractere se utilizeaza pentru a scrie macroinstructiuni performante foarte utile ataunci cand se efectueaza:
- cautarea unui cuvant intr-un text
- normalizarea unui text prin eliminarea unor caractere sau prin inlocuirea lor dupa o regula data
- validarea continutului unui camp daca este alfabetic, numeric sau daca are o structura data
- verificarea daca un sir poate fi identificator corect
- stabilirea lungimii unui camp
- calculul indicatorului de similaritate
- efectuarea de traduceri dintr-o limba in alta limba
- analiza semantica
- calculul de distante intre categorii de cuvinte
- prelucrarea de cuvinte
- construirea de mesaje pe baza de reguli.
*****************************************************************

Optimizarea programelor ASM

Optimizarea unui program inseamna imbunatatirea unui program.
Se definesc criteriile de optim:
- minimizarea numarului de cicluri masina
- maximizarea dimensiunilor problemei de rezolvat
- maximizarea generalitatii problemei de rezolvat
- eliminarea riscurilor de eroare la executie
- maximizarea preciziei rezultatelor
- minimizarea duratei medii a tranzactiilor
- minimizarea costului de realizare
- maximizarea calitatii programului
- minimizarea complexitatii programului
- maximizarea fiabilitatii programului.
Pentru programele scrise in limbaje de asamblare se urmareste in primul rand minimizarea duratei de executie.
permite evitarea repetarii unor instructiuni ce corespund subexpresiilor care se regasesc de mai multe ori intr-o expresie.
Se defineste o variabila ce contine rezultatul intermediar si ori de cate ori subexpresia apare este inlocuita cu rezultatul inrtermediar.
Expresia:
E:=(A*A+B*B+C*C+D*D)*(A*A+B*B+C*C+D*D-1)+(A*A+B*B+C*C-D)/(A*A+B*B-C)
se rezolva in doua moduri:
- scriind instructiuni asembler exact asa cum este construita expresia
- calculand:
rez1:=A*A+B*B
rez2:=rez1+C*C
rez3:=rez1+D*D
E:=rez3*(rez3-1)+(rez2-D)/(rez1-C)
Comparand cele doua variante rezulta:
Operator Numar operatori
varianta 1
Numar operatori
varianta 2
= 1 1
* 14 5
+ 9 4
- 3 3
/ 1 1
() 3 3
Utilizarea eficienta a registrilorconduce la reducerea numaruluide cicluri masina, intrucat instructiunile M-R sau R-M sunt dezavantajoase in raport cu instructiunile R-R.
daca programul transpune exact enuntul problemei de insumare a valorilor in modul a elementelor ce corespund a doua masive unidimensionale, rezulta varianta neoptimizata insotita de o serie de dezavantaje.
Utilizarea mai judicioasa a registrilor de stocare a informatiilor, o sistematizare a lucrului cu un singur registru index SI, pentru referirea celor doua masive, conduc la obtinerea unei variante de program imbunatatita, ce prezinta o serie de avantaje.
Mai mult, daca se face o combinare de criterii de optim, in sensul urmaririi unei utilizari mai bune a registrilor simultan cu alegerea unui mod de adresare adecvat, se obtine o noua varianta ameliorata in raport cu varianta imbunatatita care apeleaza o secventa pentru calculul sumei, inclusa in acelasi segment, procedeul de ameliorare putand continua.
Alegerea unui mod de adresare eficient conduce la scaderea numarului de linii sursa si la reducerea numarului de cicluri masina.
Eliminarea invariantilor adica a instructiunilor care se repeta fara a produce modificari diferite asupra unei variabile conduce la realizarea initializarii numai o singura data a variabilei.
Cand intr-o structura repetitiva se initializeaza nejustificat o variabila elementara prin a:=0 sau v:=x[i], stiind ca variabila va avea o valoare ce corespunde ultimului element din masiv, aceste atribuiri trebuie eliminate din structura repetitiva, iar volumul de prelucrari se reduce semnificativ.

Regruparea ciclurilor este posibila daca nu exista dependente intre rezultatele fiecarui ciclu si daca numarul de repetari nu difera de la o structura repetitiva la alta.
Daca se pune problema construirii sirului x[i]:=i, i=0,1,2,3,....,n-1 si a sirului y[i]:=n-i, i:=0.1.2.3....,n-1, se elaboreaza doua variante de program. si anume:
- varianta 1 care consta in realizarea a doua structuri repetitive independente care au un volum de operatii V1=24+54*n cicluri masina;
- varianta 2 care construieste un singur cilu pentru generarea celor doi vectori reunind numai partea de prelucrare si care conduce la un volum de prelucrari V2=12_27*n cicluri masina.
Comparand cele doua secvente de program rezulta ca varianta cu regrupare intr-o singura secventa repetitiva este avantajoasa.
Injumatatirea repetarilor conduce la reducerea numarului de cicluri masina.
Daca se aduna doua matrice cu 2*m linii, se vor calcula in secventa C++ urmatoare:
for(j=0; j for(i=0;i {
c[i][j]=a[i][j]+b[i][j];
c[m+i][j]=a[m+i][j]+b[m+i][j];
}
Secventele repetitive se deruleaza cu 9 cicluri masina pe ramura DA a repetarii si cu 5 cicluri masina pe ramura NU a testului daca registrul CX!=0.
Cu cat sunt mai multe structuri repetitive scrise separat una de cealalta, se vor utiliza reluari care necesita cele 9 cicluri masina.
Programatorii analizeaza fiecare instructiune si cauta sa le utilizeze eficient preferand modului de lucru imediat dar explicit, adresarea R-R cu initializare din apropape in aproape, numarul de cicluri masina reducandu-se.
Folosind instructiunile XOR si MOV adecvat, se reduce numarul de cicluri masina.
Se observa, ca uneori intre instructiunile INC si ADDnumarul de cicluri masina nu difera, iar inlocuirea instructiunii ADD cu instructiunea INC se va efectua numai daca numarul de cicluri masina este mai redus.
In cazul instructiunilor de salt conditionat, numarul ciclurilor masina pentru ramura DA este egal cu 8, iar pentru ramura NU este egal cu 4 si de aceea este important sa se constreuiasca expresia conditionala incat secventa S2 sa execute de un numar cat mai mare de ori.
Eliminarea codului mort consta in neincluderea in program a secventelor care nu se executa niciodata.
daca expresia conditionala este o constanta si in structura alternativa ramura NU nu se executa niciodata, in loc sa se scrie un program in care apar secventele S1, S2 si S3, se va scrie programul in care codul mort - secventa S3 - dispare.
In cazul evaluarii exprtesiei e:=f(x), intrucat expresia conditionala 8>2 este tot timpul adevarata codul mort este reprezentat de atribuirea e:=-1, iar simplificarea secventei este semnificativa.
Alegerea modului de adresare adecvat detrmina obtinerea unei structuri de program convenabila ca lungime si complexitate.
Pentru evaluarea unei expresii simple se observa ca modul de adresare directa este mai convenabil decat adresarea dindexata sau decat adresarea bazata indexata.
In cazul structurilor omogene precum masive unidimensionale, masive bidimensionale sau masive cu mai multe dimensiuni, adresarea directa este ineficienta datorita faptului ca lungimea textului sursa depinde de numarul elementelor prelucrate, in timp ce adresarea indexata face ca secventa de program sa nu depinda de numarul de elemente prelucrate.
Incorporarea procedurilor ca simple secvente are ca efect eliminarea salturilor generate de instructiunile CALL si RET.
O astfel de abordare este justificata daca numarul de repetari este foarte mare, iar includerea secventei de instructiuni de prelucrare din procedura nu mareste nejustificat programul principal.
In cazul in care programul apelator se afloa intr-un segment si procedura se afla in alt segment, includerea procedurii are ca efect adresare intrasegment cu efecte pozitive asupra numarului de cicluri masina.
Lucrul cu vectori de pointeri spre proceduri are ca efect regucerea lungimii textului sursa.
O secventa lunga de apeluri de proceduri este redusa semnificativ daca se defineste un vector de pointeri spre proceduri vproc si apelul procedurilor se efectueaza prin adresare indirecta intr-o structura repetitiva.
*****************************************************************

Programare orientata pe obiecte in ASM

******************************************************************

*****************************************************************

Analiza comparata ASM - C++

******************************************************************

ENTITATE ASM C++
Alfabet DA DA
Senzitivitate NU DA
Cuvinte cheie DA DA
Reguli construire identificatori DA DA
Reguli construire etichete DA DA
Etichetele sunt urmate de doua puncte DA DA
Pointer DA DA
Articole STRUC STRUCT
Subprograme DA DA
Apel CALL tip nume()
Revenire in apelator RET return()
Structura repetitiva standard LOOP for()
Variabile globale DA DA
Adresare directa DA DA
Adresare indexata DA DA
Adresare indirecta [] *nume
Incrementare INC ++
Decrementare DEC --
Inmultire MUL *
Impartire DIV /
Adunare ADD +
Scadere SUB -
Structura de control liniara DA DA
Structura de control repetitiva DA DA
Structura de control alternativa DA DA
Structura de control alternativa multipla DA DA
Macrodefinitii DA DA
Constante simbolice DA DA
Definire masiv unidimensional nume tip const DUP(lista valori) tip nume[const]
Definire masiv biidimensional nume tip const1 DUP(const2 DUP(lista valori)) tip nume[const1][const2]
Variabila pointer nume tip nume_var tip *nume
Constanta zecimala sir de cifre ale bazei 10 sir de cifre ale bazei 10
Constanta binara sir de cifre ale bazei 2 urmate de litera B sir de cifre ale bazei 2 urmate de litera B
Constanta hexazecimala sir de cifre ale bazei 16 precedate de 0 si urmate de H sir de cifre ale bazei 16 precedate de 0 si urmate de H
Constanta octala sir de cifre ale bazei 8 precedate de 0 si urmate de O sir de cifre ale bazei 8 precedate de 0 si urmate de O
Constanta caracter un caracter ASCII inclus intre apostrofuri un caracter ASCII inclus intre apostrofuri
Instructiuni aritmetice DA DA
Instructiuni pe siruri de baiti DA DA
Instructiuni de deplasare DA DA
Instructiuni de comparare DA DA
Instructiuni de atribuire DA DA
Instructiuni logice pe siruri de biti DA DA
Apeluri de intreruperi DA DA
Referire registri prin nume AX, BX,CX,DX,SI,DI prin tipul de data definit
Lucru cu fisiere cu ajutorul intreruperilor cu functii de biblioteca
Aplicatii de grafica cu ajutorul intreruperilor cu functii de biblioteca
Instructiune vida NOP ;
Punctul ca operator de referire membru intr-o variabila de tip structura DA DA
Delimitator sfarsit de bloc ENDP, END, ENDM, ENDS }
Delimitator de inceput de bloc PROC, MACRO STRUC {, nume(), struct{
Instructiunea IF() CMP urmata de Jxx if(cond) instr_1;else instr_2;
Instructiune repetitiva conditionata anterior relizata cu o instructiune CMP etichetata, un salt conditionat, o secventa de repetat, un salt neconditionat spre instructiunea de comparare while()
Instructiune repetitiva conditionata posterior relizata cu o instructiune etichetata, o secventa de repetat, o instructiune CMP si un salt conditionat inapoi spre instructiunea etichetata do {...}while()
Instructiune alternativa multipla relizata cu o succesiune de instructiuni CMP si salturi conditionate switch()


assembly languages

main