250 likes | 396 Views
Programare in limbaj de asamblare. Tehnici avansate de scriere a programelor. Pseodo-operatori. Expresii aritmetico-logice trebuie sa se evalueze in procesul de compilare contin constante si variabile de compilare (ex: $) Operatori aritmetici operatori unari: +, -
E N D
Programare in limbaj de asamblare Tehnici avansate de scriere a programelor
Pseodo-operatori • Expresii aritmetico-logice • trebuie sa se evalueze in procesul de compilare • contin constante si variabile de compilare (ex: $) • Operatori aritmetici • operatori unari: +, - • <operator> <expresie> • operatori binari ,*, /, MOD, [] • <expresie> <operator> <expresie> • ex: unu + doi, var[operator_index]
Pseodo-operatori • Operatori logici: • AND, OR, NOT, SHR, SHL, XOR • <expresie> <operator> <expresie> • Operatori relationali: (true=0ffh, false=0h)) • EQ, NE, LE, GT, GE • <expresie> <operator> <expresie> • Exemple: mov ax, tablou+(index SHL 2) mov al, stare AND 00001111B text db “acesta este un text” l_text equ $-text ; $ - contorul de locatii
Fortare de tip (coercion) • sintaxa: <tip> ptr <expresie> • exemple de utilizare: octet_LO db 55h octet_HI db 66h dublu dd 0 mov ax, word ptr octet_LO ; ax<=6655h mov word ptr dublu, bx mov ax, ds mov word ptr dublu, ax ; dublu<= ds:bx mov word ptr [si], 5 ; nu se poate determina tipul datei
Operatori de tip • SEG, OFFSET • pt. determinarea adresei de segment si a adresei relative • exemple: sir db 33h, 44h, 55h, 66h mov ax, seg var mov ds, ax mov si, offset var mov al, [si] • SIZE, SIZEOF • determina nr. de octeti ai unei variabile tablou • LENGTH, LENGTHOF • determina nr. de elemente dintr-un tablou
Operatori de tip • LOW, LOWWORD • octetul/cuvantul inferior • HIGH, HIGHWORD • octetul/cuvantul superior • SHORT • jmp short <expresie> • forteaza un depasament de salt de un octet (+-128)
Asamblare conditionata • Directiva IF- ENDIF • pt. generarea de variante diferite • sintaxa: if <expresie> <secventa de instructiuni> else ; este optional <secventa de instructiuni> endif • daca <expresie> este diferita de 0 se asambleaza prima secventa, altfel a doua
Asamblare conditionata Exemplu: ; se genereaza cod diferit pt. 8086 sau 80386 Processor = 80386 ; . if Processor eq 80386 shl ax, 4 else ;procesor 8086 mov cl, 4 shl ax, cl endif
Asamblare conditionata • IFDEF, IFNDEF • sintaxa: ifdef <simbol> <secventa de instructiuni sau directive> endif • exemplu: DEBUG = 0 ............ ifdef DEBUG <secventa de depanare> endif
Macrouri • forme prescurtate de scriere a unor secvente de program care se repeta • sintaxa: <nume_macro> macro [<par1> [<par2> ...]] <secventa de instructiuni> endm • exemplu: mm_mov macro Dest, Source mm_mov x, y mov ax, Source mov Dest, ax endm
Macrouri: - la fiecare apel se copiaza secventa de instructiuni - nu sunt necesare instructiuni de apel (CALL) si de revenire din rutina (RET) - nu se foloseste stiva - trnsferul de parametri - prin copierea numelui Proceduri: - o singura copie pt. mai multe apeluri - se folosesc instructiuni de apel si de revenire - se utilizeaza stiva la apel si la revenire - transferul de parametri se face prin registrii sau stiva Macrouri v.s. Proceduri
Problema etichetelor in macrouri • la copierea repetata etichetele se duplica • solutie: etichete “locale” • Directiva LOCAL <nume_macro> macro [<par1> [<par2> ...]] local <et1> [<et2> ..]] .................. <et1>: .................... <et2>: endm
Avantajele si dezavantajele utilizarii macrourilor • Avantaje: • pot fi create “instructiuni” noi • poate duce la o programare mai eficienta • executie mai eficienta in comparatie cu apelurile de proceduri • Dezavantaje: • pot ascunde operatii care afecteaza continutul registrilor • utilizarea extensiva a macrourilor ingreuneaza intelegerea si mentenanta programului
Administrarea programelor mari • Directiva INCLUDE • sintaxa: include <nume_fisier_asm> • Directivele PUBLIC, EXTERN, EXTRN • sintaxa: public <nume1>[,<nume2> ..]] extern <nume1>:<tip>[, <nume1>:<tip> ....]]
Probleme de optimizare • Cand si ce se optimizeaza • regula 90/10 - 90% din timp se executa 10% din cod • consecinta - daca se elimina 90% din codul rar folosit imbunatatirea este de 10% • ce se doreste? • timp redus sau memorie redusa • cum se masoara timpul ocupat al procesorului pt. fiecare modul - “profiler” • cand este bine sa se optimizeze: • de la inceput: • se optimizeaza si partea nesemnificativa • programul se scrie greu si se intelege si mai greu • la sfarsit: • prea tirziu
Optimizarea este necesara ? • Contra-argumente: • viteza mare a procesoarelor, a memoriilor a magistralelor • spatii de memorie foarte mari • Cand este necesara optimizarea: • prelucrari de informatii multimedia • prelucrari de semnale • sisteme de control in timp-real, sisteme reactive
Trei tipuri de optimizare • Alt algoritm, mai bun • optimizare de nivel inalt • gasirea unui algoritm cu grad mai mic de complexitate O(n2) =>O(nlg(n)) • Algoritm implementat mai bine • optimizare de nivel mediu • Minimizarea numarului de cicluri • optimizare de nivel scazut
Tehnici de optimizare • reducerea numarului de bucle imbricate • reducerea timpului de executie al buclei interioare • utilizarea poantorilor in adresarea elementelor unor structuri de date • parcurgerea structurilor de date prin incrementarea si decrementarea poantorilor in locul calcularii adresei emenentului • ex: tab[i][j] adr_elementij = adresa(tab)+i*lung_rand +j • utilizarea registrelor interneale procesorului in operatiile curente
Exemplu de optimizare • Problema: filtrarea unei imagini de 100 de ori, rezolutie 256*256 pixeli • Variante: • program Pascal - 45s • program C - 29s • asamblare (V1) - 6s • s-au folosit deplasamente precalculate in locul calculului de adresa prin indecsi • asamblare (V2) - 4s • s-au folosit registre interne in locul variabilelor de memorie
Exemplu de optimizare • Variante (continuare): • asamblare (V3) 2,5s • s-a evitat recopierea imaginii intermediare in matricea initiala • asamblare (V4) 2,4s • s-a redus dimensiunea variabilelor de la intreg la caracter pt. a beneficia de mem. cache • asamblare (V5) 2,2s • s-a schimbat algoritmul de filtrare, s-au lutat in calcul numai 4 vecini ai pixelului in loc de 8 (rezultatul este diferit)
Apelul procedurilor scrise in asamblare din limbaje de nivel inalt • Cand se justifica: • la accesul direct al unor resurse fizice (ex: interfete de I/E, memoria video, etc.) • pentru cresterea eficientei unor secvente critice • functiile de acces la resurse au fost scrise (deja) in asamblare • Dificultati: • alta filozofie de scriere a programelor (ex: registre in loc de variabile, date simpe in locul celor structurate) • transferul parametrilor de apel si a rezultatelor
Apelul procedurilor scrise in asamblare din limbaje de nivel inalt • Reguli: • procedura scrisa in LA se va declara “far” si “public” • numele si tipul procedurii se va declara in LNI cu mentiunea EXTERN • parametrii de apel se transmit prin stiva: • ordinea de scriere pe stiva coincide cu ordinea din lista de parametri • primul parametru este cel mai adanc in stiva (se afla la o adresa mai mare) • ultima data inregistrata pe stiva este un dublucuvant care reprezinta adresa de revenire din rutina
Reguli: • valoarea returnata dupa apel se transmite dupa cum urmeaza: • pt. un octet - in registrul AL • pt. doi octeti - in registrul AX • pt. patru octeti - in registrele DX (partea mai semnificativa) si AX(partea mai putin semnificativa • in cele mai multe LNI transmiterea parametrilor se face prin valoare • dupa revenirea din procedura indicatorul de stiva SP trebuie refacut la valoarea de dinaintea apelului • variabilele utilizate in comun (variabilele globale) vor fi declarate cu “PUBLIC” si respectiv EXTERN
Program PASCAL ......... var i:int; j:word; var_com:int; function test(par:word):int:external; $L test.obj {include fisierul Test.obj} ..................... i=test(j); Exemplu:
.MODEL LARGE DATA SEGMENT PUBLIC ‘DATA’ EXTERN VAR_COM:FAR ............ DATA ENDS CODE SEGMENT PUBLIC ‘CODE’ ASSUME CS:CODE PUBLIC TEST TEST PROC FAR PUSH BP MOV BP,SP MOV AX, [BP+6] ; citeste par ............. MOV BX, SEG VAR_COM MOV DS, BX MOV SI, OFFSET VAR_COM MOV AX, [SI] .......... MOV AX, REZ ; val. functiei POP BP RET 2 ; descarcare par. de ;pe stiva CODE ENDS END Exemplu (programul in asamblare)