|
Politica de confidentialitate |
|
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
exemplu de program ce calculeaza maximul intr-un sir de numere intregi, cu semn, reprezentate pa cate un octet | ||||||
|
||||||
i8c12cv NOTA: contine un exemplu de program ce calculeaza maximul intr-un sir de numere intregi, cu semn, reprezentate pa cate un octet ! 1. INTRODUCERE 1.1 AVANTAJELE PROGRAMARII IN ASM Exista, intr-adevar, o tendinta justificata de indepartare de limbajul de asamblare,
dar nu de renuntare la el, intrucat multe medii integrate de dezvolare de programe
(IDE — Integrated Development Enviroments) si compilatoare de limbaje
de nivel inalt (C, Pascal, Basic, Fortran, etc.) prezinta facilitati de inserare
de linii scrise direct in limbaj de asamblare.
Cu toate acestea, exista si numeroase componente ale sistemului de operare si ale altor aplicatii, care sunt considerate critice si performante, iar acestea au fost si mai sunt realizate in limbaj de asamblare, deoarece aceste secvente trebuie sa consume cat mai putin timp si, eventual, cat mai putina memorie. Aceasta performanta este realizata prin utilizarea cat mai eficienta a instructiunilor si a structurii procesorului. In concluzie, la ora actuala programele sunt hibride: ele contin linii scrise in limbaje de nivel inalt, dar pot contine si linii in limbaj de asamblare. Pentru a rezolva astfel de situatii, implementarile limbajelor de nivel inalt accepta introducerea in textul sursa de linii scrise in limbaj de asamblare sau legarea intr-un singur modul a unor module obiect provenite de la compilarea unor texte sursa, scrise in diverse limbaje de programare. Modulele care presupun algoritmi complicati sau structuri de date complexe sunt scrise in limbaje de nivel inalt, iar cele care sunt critice din puctul de vedere al timpului de executie si al resurselor ocupate sunt scrise in limbaj de asamblare. In plus, exista anumite resurse ale calculatorului la care accesul nu este realizabil din limbajele de nivel inalt. Un alt motiv pentru care se recomanda si experienta programarii in limbaj de
asamblare este acela ca un specialist in informatica trebuie sa cunoasca mecanisele
fine ale procesorului pntru a le folosi in diferite aplicatii. Limbajul de asamblare (ASM) permite intelegerea la nivel de amanunt a ceea ce se intampla in realitate intr-un calculator. Codul generat in ASM se executa foarte rapid.si permite accesul la hardware, acces care nu este disponibil in limbajele de nivel inalt. Unitatea de baza a informatiei memorate in calculator este bitul. Un bit reprezinta o cifra binara, deci poate avea valorile 0 sau 1. Modelul hardware corespunzator este acela de bistabil. Un bistabil este, deci un circuit electronic cu doua stari stabile, configurate 0 sau 1 , capabil sa memoreze un bit de informatie. Un grup de bistabili formeaza un registru. De exemplu, 8 bistabili formeaza un registru de 8 biti. Iformatia care se poate memora intr-un asemenea registru poate fi codificata binar, de la valoarea 0000.0000, pana la valoarea 1111.1111. Numarul combinatiilor care pot fi memorate este 256 ( ). Aceste combinatii se numesc octeti sau bytes (daca n=8), respectiv cuvinte (daca n=16, 32, etc.). Memoria unui calculator este vazuta ca o succesiune de octeti. Fiecare octet are asociata o adresa de memorie. Pentru a adresa memoria, e nevoie de un registru de adrese a carui lungime determina dimensiunea maxima a memoriei. Zonele de memorie vor fi reprezentate grafic pe verticala, ca succesiuni de octeti sau cuvinte, de la adrese mici catre adrese mari. 1.2 TIPURI DE DATE UTILIZATE IN LIMBAJ DE ASAMBLARE Tipurile de date sunt:Ø Byte (1 octet) -; ocupa un octet si poate fi reprezentat atat
in memoria interna cat si intr-un registru de 8 biti al procesorului. Interpretarile
tipului byte pot fi: Ø Double Word (4 octeti) -; ocupa 4 octeti si poate fi reprezentat
atat in memoria interna cat si intr-opereche de registre de 16 biti ale procesorului
sau intr-un registru de 32 biti. Interpretarile tipului dword pot fi: Ø Quand Word (8 octeti) - ocupa 8 octeti si poate fi reprezentat atat
in memoria interna cat si intr-o pereche de registre de 32 biti. Interpretarile tipului qword pot fi: # numar real in precizie extinsa. Directiva pentru definirea datelor de acest tip este dt (define ten bytes). 2. FORMATUL PROGRAMELOR EXECUTABILE Sistemul de operare MS-DOS permite doua formate de memorare a programelor, pe suport extern, pentru programele executabile, si anume formatele .EXE si .COM.In cazul formatului .EXE fisierul contine programul intr-un format realocabil, precum si un antet care contine informatii necesare pentru realocare. Formatul .COM, caracterizat prin faptul ca programul -; inclusiv datele si stiva -; nu ocupa mai mult de un segment, contine o imagine memorie a programului. 2.1 FORMATUL .COM Acest program trebuie sa inceapa cu directiva ORG 100H, deoarece toate registrele sunt pozitionate pe adresa de inceput a prefixului de program (PSP); adresa de start a programului este la aceasta adresa, si eticheta acesteia este precizata in directiva END. Datele pot fi plasate oriunde in segment, dar, de obicei, se plaseaza la inceput. Stiva este initializata, automat, la sfarsitul segmentului ocupat de program. Programul se poate incheia cu instructiunea INT 20H sau RET. 2.2 FORMATUL .EXE Fisierul ce contine un astfel de program este cu cel putin 768 octeti mai mare decat programul executabil; insa, la incarcarea in memorie pentru executie, el va ocupa acelasi spatiu. Registrele DS si ES sunt initializate cu adresa de segment corespunzatoare inceputului de prefix de program; CS este initializat la inceputul programului, deci dupa prefix, si deci va fi cu 10H mai mare decat acestea. Registrele segment DS, ES si SS, precum si registrul SP, trebuiesc initializate de utilizator, conform programului. Incheierea unui program .EXE se face prin executia unei instructiuni RET, in context FAR; aceasta va realiza un salt la prima instructiune din prefixul programului, adica se va executa inaintea instructiunii INT 20H. 3. INSTRUCTIUNI DE TRANSFER AL CONTROLULUI DE PROGRAM Secventa de executie a instructiunilor dintr-un program este determinata de continutul registrului de segment de cod (CS) si de pointerul de instructiuni (IP). Instructiunile de transfer al controlului programului opereaza asupra lui IP si CS. La aparitia unui astfel de transfer, coada de instructiuni nu mai contine instructiunea urmatoare si EU va transmite noua adresa la BU, care va obtine instructiunea urmatoare direct din memorie, utilizand noile valori pentru CS:IP; instructiunea va fi transferata catre IU si UE pentru executie si BU, apoi incepe reumplerea cozii de la noua locatie.Exista patru tipuri de instructiuni de transfer al controlului: o instructiuni de transfer neconditionat; o instructiuni de transfer conditionat; o instructiuni de ciclare; o instructiuni de intrerupere. 3.1 INSTRUCTIUNI DE TRANSFER CONDITIONATForma generala a instructiunii este: Jcond <tinta> Deoarece asdresa de salt este determinata prin adunarea deplasamantului relativ al tintei la pointerul IP actualizat, toate salturile conditionate sunt auto-relative. Deplasamentul poate fi octet la 286 (la tipul SHORT), cuvant sau cuvant dublu la 386, si este considerat numar cu semn. In cazul cand se doreste un salt conditionat pe o distanta mai mare de 128 octeti, la 286, sau un salt conditionat (pentru conditia negata, de exemplu JE, pentru JNE), in intervalul a-128,+127i, iar, imediat dupa instructiunea de salt conditionat, o instructiune de salt neconditionat pe distanta dorita. Instructiunile de salt conditionat se utilizeaza dupa o instructiune aritmetica sau logica, care modifica indicatorii conform rezultatului. De cele mai multe ori, ele se utilizeaza dupa o instructiune de comparare: cmp (d),(s).
Instructiunile de salt conditionat sunt listate in tabela urmatoare: Instructiunile listate ca perechi reprezinta aceleasi instructiuni; asamblorul furnizeaza mnemonici alternative pentru o mai mare claritate in cadrul programului. Aceste mnemonici pot fi determinate relativ usor deoarece ele utilizeaza anumite litere cu o semnificatie predefinita astfel: A -; provine de la Above, adica mai mare (deasupra); G -; Greater, deci mai mare, si L -; Less, deci mai mic. Primele doua (A si B) se refera la relatia dintre doua valori fara semn, in timp ce ultimele doua (G si L) se refera la relatia dintre doua valori cu semn. Ultima instructiune J(E)CXZ (salt daca ECX sau CX=0) se utilizeaza de obicei la inceputul unei bucle software, penru a sari peste ciclul respectiv, in cazul in care inca de la inceput (E)CX=0, altfel ciclul respectiv (cu instructiunea LOOP) s-ar efectua de 64 K ori (sau la 386/486 de 4 G ori). Pentru aceasta instructiune, deplasamentul nu poate fi precizat decat pe 8 biti atat pentru 286, cat si pentru 386; deci si in cazul lui 386/486 saltul realizat de aceasta instructiune este de tip SHORT. Instructiunea de comparare a doua valori pozitioneaza, bineinteles, toti indicatorii,
dar in functie de interpretarea data de utilizator celor doua valori, sunt semnificativi
numai anumiti indicatori, in functie de tipul numerelor: *** Sa se gaseasca maximul intr-un sir de numere intregi, cu semn, reprezentate pe cate un octet: .model small ; precizeaza un model de memorie |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite |
|