Contacte

Programare: Limba de asamblare. Elementele de bază ale limbajului de asamblare. Formatul de date și structura echipei Asamblarea limbii de asamblare

Pe destinație, puteți selecta comenzi (în paranteze sunt exemple de coduri mnemonice de operații ale operațiunilor de asamblare tip PC de tip IBM PC):

l Efectuarea de operații aritmetice (Adăugare și ADC - Adăugare și adăugare cu transferul, sub-și SBB - Reducerea și scăderea cu împrumut, Mul și IMUL - Multiplicare fără semn și cu semn, Div și IDIV - Divizia fără semn și cu semn, CMP - comparații etc.);

am efectuând operațiuni logice (sau, și, nu, xor, testare etc.);

l Transport (MOV - Pentru a trimite, XCHG - Exchange, in - intrați în microprocesor, ieșire din microprocesor etc.);

l Transmisie de control (ramuri de program: JMP - tranziție necondiționată, apel - procedură de apel, returnați de la procedură, J * - Tranziție condiționată, Control ciclu de buclă etc.);

l Procesarea liniei de caractere (movs - transport maritim, CMPS - comparație, loduri - descărcări, SCAS - Scanare. Aceste comenzi sunt de obicei utilizate cu replicația prefixului (repetiție).

l Întreruperea programului (întreruperea programului, întreruperea condiționată atunci când depășirea, Iret - întoarcerea de la întrerupere);

l Controlul microprocesorului (ST * și CL * - Steaguri de instalare și de resetare, HLT - oprire, așteptare - așteptări, nop-ralanti etc.).

Cu o listă completă de comenzi de asamblare, vă puteți familiariza în lucrări.

Comenzi de transfer de date

l Mov DST, SRC - Expediere de date (Move - Trimiteți de la SRC la DST).

Trimite: un octet (dacă SRC și DST au un format octet) sau un cuvânt (dacă SRC și DST au un format cuvânt) între registru sau între înregistrare și memorie, și înregistrează, de asemenea, valoare directă în registru sau în memorie.

Operanzii DST și SRC trebuie să aibă același format - octeți sau cuvânt.

Src poate fi tip: R (Înregistrare) - Înregistrare, m (memorie) - memorie, i (impedanță) - valoare directă. DST poate fi tip r, m. Este imposibil să se folosească operanii într-o singură comandă: RSEGM împreună cu I; Două operand de tip M și două operanzi de tip ISSGM). Operand Pot fi o expresie simplă:

mOV AX, (152 + 101B) / 15

Calculul expresiei se efectuează numai atunci când difuzează. Steagurile nu se schimbă.

l Push Src - Word Covering Stack (împingere - ciupit Înregistrați pe stiva de İSRC). Acesta plasează conținutul SRC în partea superioară a stivei - orice registru pe 16 biți (inclusiv segment) sau două celule de memorie care conține un cuvânt de 16 biți. Steagurile nu se schimbă;

l Pop DST - Extragerea cuvintelor din stivă (Pop - împingere; contorizați din stivă în DST). Îndepărtează cuvântul din partea superioară a stivei și pune-l în DST - orice registru pe 16 biți (inclusiv segment) sau în două celule de memorie. Steagurile nu se schimbă.

Subiect 1.4 Asamblare mnemonică. Structura și formatele comenzilor. Tipuri de adrese. Sistemul de echipă microprocesor

Plan:

1 limbaj de asamblare. Noțiuni de bază

2 Simbolurile simbolurilor limbii de asamblare

3 tipuri de operatori de asamblare

4 directive de asamblare

5 Sistem de comandă a procesorului

1 J.zyk Assembler. Noțiuni de bază

Limba de asamblare - Aceasta este o prezentare simbolică a limbii mașinii. Toate procesele din mașină la cel mai mic nivel hardware sunt acționate numai de comenzi (instrucțiuni) ale limbii mașinii. Este clar că, în ciuda numelui general, limba de asamblare pentru fiecare tip de calculator.

Programul de asamblare este o combinație de blocuri de memorie, numită segmente de memorie.Programul poate consta din unul sau mai multe segmente de bloc. Fiecare segment conține un set de sugestii lingvistice, fiecare dintre ele ocupă o linie separată a codului programului.

Ofertele de asamblare sunt patru tipuri:

1) comenzi sau instrucțiuni, Prezentarea analogilor simbolici ai comenzilor mașinilor. În procesul de difuzare, instrucțiunile de asamblare sunt transformate în comenzile corespunzătoare ale sistemului de comandă microprocesor;

2) macrocomanduri -decorate într-un anumit mod de propuneri de text ale programului, înlocuite în timpul emisiunii de alte propuneri;

3) directiveo indicație a traducătorului de asamblare pentru a efectua anumite acțiuni. Directivele nu au analogi în reprezentarea mașinii;

4) rânduri de comentariu. conținând orice caractere, inclusiv literele alfabetului rus. Comentariile sunt ignorate de traducător.

­ Structura programului pe asamblare. Sintaxă asambloroasă.

Propunerile care alcătuiesc programul pot fi un design sintactic, o echipă corespunzătoare, macrokomand, directivă sau un comentariu. Pentru ca traducătorul de asamblare să le recunoască, acestea trebuie să fie formate de anumite reguli sintactice. Pentru aceasta, este mai bine să utilizați o descriere formală a sintaxei limbii ca regulile gramaticii. Cele mai comune modalități de o asemenea descriere a limbajului de programare - diagrame sintactice și extensii formularele Bakusa Naura. Pentru utilizarea practică mai convenabilă diagrame sintactice.De exemplu, sintaxa sugestiilor de asamblare poate fi descrisă utilizând diagrame sintactice prezentate în figurile 10, 11, 12.

Figura 10 - Formatul ofertei de asamblare


­ Figura 11 - directive în format

­ Figura 12 - Formatul echipei și macrocomenzele

La aceste desene:

­ etichete de nume - identificatorul, valoarea cărora este adresa primului octet al acestei propuneri a textului sursă al programului, pe care îl denotă;

­ nume - Identificatorul care distinge această directivă din alte directive ale acelorași nume. Ca urmare a asamblorului de prelucrare, o directivă specifică poate fi atribuită anumitor caracteristici;

­ codul de operare (CPA) și directiva - Acestea sunt denumiri mnemonice ale echipei de mașini relevante, macrocomenzilor sau directivelor traducătorului;

­ operand - Părți ale echipei, comandanți macro sau directive de asamblare care denotă obiecte pe care se fac acțiuni. Operanzii de asamblare sunt descriși de expresiuni cu constante numerice și de text, mărci și identificatori de variabile folosind operații și unele cuvinte rezervate.

Diagrame sintactice Ajutor găsiți și apoi treceți prin modul de autentificare a diagramei (stânga) la ieșirea (dreapta). Dacă există această cale, propunerea sau designul este corect din punct de vedere sintactic. Dacă nu există o astfel de cale, înseamnă că compilatorul nu va accepta acest design.

­ 2 simboluri de limbă de asamblare

Simboluri admise Când scrieți texte text sunt:

1) toate literele latine: A-Z., A-Z.. În acest caz, literele de capital și litere mici sunt considerate echivalente;

2) numere de la 0 inainte de 9 ;

3) semne ? , @ , $ , _ , & ;

4) Diviziuni , . () < > { } + / * % ! " " ? = # ^ .

Ofertele de asamblare sunt formate din lexemreprezentând secvențele inseparabile sintactic ale simbolurilor admise ale limbii care au sens la traducător.

Lexemes. sunteți:

1) identificatori - Secvențele de caractere admise utilizate pentru a desemna astfel de obiecte, cum ar fi codurile de operare, numele variabilelor și numele etichetei. Regula de înregistrare a identificatorului este după cum urmează: Identificatorul poate consta din unul sau mai multe caractere;

2) lanțuri de simboluri - secvențe de simboluri închise în ghilimele unice sau duble;

3) Întreaga bulgăre a unuia dintre următoarele sisteme de suprataxă : binar, zecimal, hexazecimal. Identificarea numerelor la înregistrarea acestora în programele de asamblare se face în conformitate cu anumite reguli:

4) Numerele zecimale nu necesită caractere suplimentare pentru a identifica caractere suplimentare, de exemplu 25 sau 139. Pentru a identifica în textul sursă al programului numere binare Este necesar după înregistrarea zerourilor și a unităților incluse în compoziția lor, pune latină " b.", De exemplu 10010101 b..

5) numerele hexazecimale au mai multe convenții la înregistrarea lor:

În primul rând, ele constau din numere 0...9 , literele mici și majuscule ale alfabetului latin a., B., c., D., E., F. sau A., B., C., D., E., F..

În al doilea rând, traducătorul poate avea dificultăți cu recunoașterea numerelor hexazecimale datorită faptului că acestea pot consta din unele numere 0 ... 9 (de exemplu, 190845), începând cu litera alfabetului latin (de exemplu, eF15). Pentru a "explica" traducătorul că această lexeme nu este un număr zecimal sau un identificator, programatorul trebuie să aloce în mod special un număr hexazecimal. Pentru a face acest lucru, la sfârșitul secvenței de numere hexazecimale, care alcătuiesc un număr hexazecimal, scrieți litera latină " h.". Aceasta este o condiție prealabilă. Dacă numărul hexazecimal începe cu litera, zero zero este înregistrată în fața lui: 0 eF15. h.

Aproape fiecare propunere conține o descriere a obiectului pe care sau cu care se efectuează o anumită acțiune. Aceste obiecte sunt numite operanda.. Ele pot fi identificate astfel: operanzi. Acestea sunt obiecte (unele valori, registre sau celule de memorie) la care operează instrucțiunile sau directivele sau aceste obiecte care definesc sau specifică funcționarea instrucțiunilor sau directivelor.

Este posibil să se efectueze următoarea clasificare a operanilor:

­ operand constant sau direct;

­ adresa operandiilor;

­ operanzi transferați;

adresa de adrese;

­ Înregistrați operand;

­ operand de bază și index;

­ operanzi structurali;

Intrări.

Operand sunt componente elementare din care se formează o parte a comenzii mașinii, denotând obiecte pe care se efectuează operația. Într-un caz mai general, operanzii pot include ca parte a educației mai complexe, numite expresii.

Expresii există combinații de operanzi și operatori considerate ca un întreg. Rezultatul calculării expresiei poate fi adresa unei anumite celule de memorie sau a unei valori constante (absolute).

­ 3 tipuri de operatori de asamblare

Listăm tipurile posibile operatori de asamblare și reguli sintactice pentru formarea expresiilor de asamblare:

­ operatori aritmetici;

­ operatori de schimbare;

­ operatori de comparare;

­ operatori logici;

­ operatorul index;

­ operatorul de redefinire de tip;

­ redefinirea operatorului a segmentului;

­ numirea tipului de structură a operatorului;

­ operatorul de obținere a componentei segmentului a adresei expresiei;

­ operator pentru a obține o deplasare a expresiei.

1 Directive de asamblare

­ Directivele de asamblare sunt:

1) directive de segmentare. În timpul discuției anterioare, am găsit toate regulile de bază pentru înregistrarea echipelor și a operanilor în programul de asamblare. Întrebarea a rămas problema modului de a crea o secvență de comenzi corecte, astfel încât traducătorul să le poată procesa, iar microprocesorul trebuie să fie executat.

Când luați în considerare arhitectura microprocesorului, am aflat că are șase registre de segmente, prin care se poate lucra simultan:

­ cu un segment de cod;

­ cu un segment de stivă;

­ cu un segment de date;

­ cu trei segmente suplimentare de date.

Un segment fizic este o zonă de memorie, ocupată de comenzi și (sau) de date, ale căror adrese sunt calculate în raport cu valoarea din registrul de segment corespunzător. Descrierea sintactică a segmentului de pe asamblare este un design prezentat în Figura 13:


­ Figura 13 - Descrierea sintaxei segmentului pe asamblare

Este important de menționat că scopul funcțional al segmentului este oarecum mai larg decât ruperea simplă a programului pe blocuri de cod, date și stivă. Segmentarea face parte dintr-un mecanism mai general asociat cu conceptul de programare modulară. Aceasta implică unificarea designului modurilor de obiecte create de compilator, inclusiv din diferite limbi de programare. Acest lucru vă permite să combinați programele scrise în diferite limbi. Este de implementare a diferitelor opțiuni pentru o astfel de asociație, iar operanții din segmentul se intenționează.

2) Listarea directivelor de management. Listarea directivelor de gestionare sunt împărțite în următoarele grupuri:

­ directivele generale de gestionare a listei;

­ directivele de ieșire în listarea fișierelor incluse;

­ directivele de blocare a ansamblului condiționat;

­ directivele de ieșire în listarea macrocomandului;

­ listarea informațiilor privind listarea referințelor încrucișate;

­ listarea directivelor privind schimbarea formatelor.

2 Sistem de comandă al procesorului

Sistemul de comandă a procesorului este prezentat în Figura 14.

Luați în considerare principalele grupuri de echipe.

­ Figura 14 - Clasificarea comenzilor de asamblare

Echipele sunt:

1 comenzi de transfer de date. Aceste comenzi ocupă un loc foarte important în sistemul de comenzi ale oricărui procesor. Acestea îndeplinesc următoarele funcții majore:

­ economisind în memoria conținutului registrelor procesorului intern;

­ copierea conținutului dintr-o zonă de memorie la alta;

­ scrierea la dispozitive I / O și citiți de la dispozitive I / O.

În unele procesoare, toate aceste funcții sunt efectuate de o singură echipă.Mov. (pentru transporturile octeților -Movb. ) dar cu diverse metode de abordare a operanilor.

În alte procesoare, în plus față de echipăMov. Există mai multe comenzi pentru a efectua funcții enumerate. De asemenea, comenzile de transfer de date includ comenzi de partajare a informațiilor (desemnarea lor se bazează pe un cuvântschimb valutar ). Este posibil să existe un schimb de informații între registrele interne, între două jumătăți a unui registru (Swap. ) sau între registru și celula de memorie.

2 echipe aritmetice. Echipele aritmetice consideră codurile de operand ca coduri zecimale binare sau binare numerice. Aceste comenzi pot fi împărțite în cinci grupe principale:

­ semicoloni fixe (adăugare, scădere, multiplicare, diviziune);

­ puncte de vedere plutitor (adăugare, scădere, multiplicare, diviziune);

­ comenzi de curățare;

­ comenzi de creștere și decrement;

­ comparați comanda.

3 punct și virgulă fixă \u200b\u200bOperați comenzi lucrează cu coduri în registrele procesorului sau în memorie ca coduri binare convenționale. Comunicarea comuniunii (punctul) Comenzi de operațiuni utilizează formatul reprezentării numerelor cu ordinea și Mantissa (de obicei, aceste numere ocupă două celule de memorie consecutive). În procesoare puternice moderne, un set de punct de vedere plutitor nu se limitează la patru aritme și conține multe alte comenzi complexe, de exemplu, calcularea funcțiilor trigonometrice, a funcțiilor logaritmice, precum și a funcțiilor complexe necesare atunci când se procesează sunetul și imaginile.

4 Comenzi de curățare sunt proiectate pentru a scrie un cod zero într-un registru sau celule de memorie. Aceste comenzi pot fi înlocuite cu comenzi de livrare a codului zero, dar comenzile speciale de curățare sunt de obicei mai rapide decât comenzile de expediere.

5 echipe de incrementare (crescând pe unitate) și reducere

(Reducerea pe unitate) sunt, de asemenea, foarte confortabile. Acestea pot fi, în principiu, să înlocuiască comenzile de sumare cu o unitate sau o scădere a unei unități, dar creșterea și decrementarea sunt mai rapide decât sumarea și scăderea. Aceste comenzi necesită un operand de intrare, atât operand de ieșire.

6 Comanda de comparare este concepută pentru a compara două operanzi de intrare. În esență, calculează diferența dintre aceste două operanzi, dar operandul de ieșire nu se formează, ci doar modifică biții din registrul de stat a procesorului în funcție de rezultatul acestei scăderi. Următoarea comandă la comanda Comparație (de obicei aceasta este o comandă de tranziție) va analiza biții din registrul de stare a procesorului și va efectua acțiuni în funcție de valorile lor. Unii procesatori oferă comenzi de comparare a lanțului de două secvențe de operanzi în memorie.

7 comenzi logice. Comenzile logice sunt efectuate pe operații Operands Logical (Bitwise), adică consideră că codurile operandului nu sunt ca un singur număr, ci ca un set de biți individuali. Ele diferă de echipele aritmetice. Comenzile logice efectuează următoarele operații de bază:

­ logice și, logice sau, adăugarea modulului 2 (cu excepția sau);

­ schimbări logice, aritmetice și ciclice;

­ verificați biții și operanzii;

­ instalarea și curățarea biților (steaguri) a unui registru de stare a procesorului (PSW).

Comenzile de operare logică vă permit să calculați cu braț funcțiile logice de bază de la două operande de intrare. În plus, operația și este utilizată pentru curățarea forțată a biților specificați (ca unul dintre operanzi, se utilizează codul de mască, în care descărcările care necesită curățare sunt setate la zero). Funcționarea sau aplicarea instalării forțate a biților specificați (ca unul dintre operanzi, se utilizează codul de mască în care descărcările care necesită instalare pe unitate sunt egale cu una). Operarea "Excelenging sau" este utilizată pentru a inversa biții specificați (ca fiind unul dintre operanzi, se utilizează codul de mască, în care biții care fac obiectul inversiunilor sunt setate pe unitate). Comenzile necesită două operande de intrare și formează un operand de ieșire.

8 Comenzi de schimb vă permit să amestecați codul operand în partea dreaptă (spre descărcările mai tinere) sau la stânga (în direcția descărcărilor superioare). Tipul de schimbare (logical, aritmetic sau ciclic) determină care va fi noua valoare a bitului mai vechi (când trecerea spre dreapta) sau bitul mai mic (în timpul trecerii la stânga) și determină, de asemenea, dacă cea mai veche valoare a Bitul mai vechi (când trecerea spre stânga) este salvat undeva sau mai mic (când treceți la dreapta). Schimbările ciclice vă permit să mutați biții codului de operand într-un cerc (în sensul acelor de ceasornic când schimbarea este dreapta sau în sens invers acelor de ceasornic când trecerea la stânga). În același timp, inelul de schimbare poate intra sau nu introduce pavilionul de transfer. În pic patul de transmisie (dacă este utilizat), valoarea bitului mai vechi este înregistrată în timpul trecerii ciclice la stânga și la bit mai mic în timpul trecerii ciclice spre dreapta. În consecință, valoarea paviliului de transfer va corespunde celei mai scăzute descărcări în timpul deplasării ciclice la stânga și în descărcarea senior în timpul trecerii ciclice spre dreapta.

9 comenzi de tranziții. Echipele de plângeri sunt concepute pentru a organiza tot felul de cicluri, ramuri, apeluri la subrutine etc., adică încalcă progresul serial. Aceste comenzi sunt înregistrate în registrul de comandă un nou înțeles și astfel apelați trecerea procesorului nu la următoarea comandă, ci la orice altă comandă în memoria programelor. Unele comenzi de tranziții oferă o întoarcere în continuare înapoi la punctul de la care a fost făcută tranziția, alții nu prevăd acest lucru. Dacă se furnizează restituirea, atunci parametrii procesorului curent sunt stocați în stivă. Dacă restituirea nu este furnizată, atunci parametrii procesorului curent nu sunt salvați.

Comparați comenzile fără restituire sunt împărțite în două grupuri:

­ tranziții necondiționate;

­ echipe comune de trecere.

În denumirile acestor comenzi sunt folosite cuvinteSucursala (ramificare) și săriți (salt).

Comenzile tranzițiilor necondiționate determină trecerea la o nouă adresă, indiferent de orice. Acestea pot apela tranziția la valoarea specificată de deplasare (înainte sau înapoi) sau la adresa de memorie specificată. Valoarea deplasării sau valoarea de adresă nouă este indicată ca o operand de intrare.

Comenzi de tranziție condiționată Pentru că tranziția nu este întotdeauna, ci numai atunci când efectuați condițiile specificate. Ca astfel de condiții, valorile de pavilion în registrul de stat de procesor acționează de obicei.PSW. ). Adică, condiția de tranziție este rezultatul funcționării anterioare care schimbă valorile steagurilor. Condițiile totale de tranziție pot fi de la 4 la 16. Câteva exemple de echipe de tranziție condiționate:

­ tranziție, dacă zero;

­ tranziție, dacă nu zero;

­ tranziție dacă există o depășire;

­ tranziție dacă nu există o depășire;

­ tranziție dacă este mai zero;

­ tranziție, dacă este mai mică sau egală cu zero.

Dacă starea de tranziție este executată, acesta este descărcat în noul registru de comandă Value. Dacă condiția de tranziție nu este executată, contorul de comandă este pur și simplu în creștere, iar procesorul selectează și efectuează următoarea comandă în ordine.

Mai ales pentru verificarea condițiilor de tranziție, comanda de comparare (SMR) este aplicată anterior comenzii de tranziție condiționată (sau chiar mai multe echipe convenționale de tranziție). Dar steagurile pot fi instalate și orice altă comandă, cum ar fi o comandă de transfer de date, orice comandă aritmetică sau logică. Trebuie remarcat faptul că comenzile de tranziție de pavilion nu schimbă faptul că face posibilă punerea mai multor comenzi de tranziție una după alta.

Un loc special în rândul echipelor de tranziție este ocupat de comenzi de întrerupere. Aceste comenzi ca operand de intrare necesită un număr de întrerupere (adresa vectorială).

Ieșire:

Limba de asamblare este o prezentare simbolică a limbii mașinii. Limba de asamblare pentru fiecare tip de calculator. Programul de asamblare este un set de blocuri de memorie numite segmente de memorie. Fiecare segment conține un set de sugestii lingvistice, fiecare dintre ele ocupă o linie separată a codului programului. Sugestiile asamblorului sunt patru tipuri: echipe sau instrucțiuni, macrocomenzi, directive, linii de comentarii.

Toate literele latine sunt permise atunci când scrieți textul programelor: A-Z., A-Z.. În acest caz, literele de capital și litere mici sunt considerate echivalente; Cifrele dint 0 inainte de 9 ; semne. ? , @ , $ , _ , & ; divizoare , . () < > { } + / * % ! " " ? = # ^ .

Următoarele tipuri de operatori de asamblare și reguli sintactice pentru formarea expresiilor de asamblare sunt utilizate. Operatori aritmetici, declarații de schimbare, operatori de comparare, operatori logici, operator de index, operator de redefinire de tip, operator de redefinire a segmentului, operator de denumire de tip structură, operator de obținere a unei componente de segment a unei adrese de expresie, un operator de deplasare a expresiei.

Sistemul de comandă este împărțit în 8 grupuri majore.

­ Întrebări de control:

1 Ce este un limbaj de asamblare?

2 Ce caractere pot fi folosite pentru a înregistra comenzi pe asamblare?

3 Care sunt etichetele și numirea lor?

4 Calculați structura comenzilor de asamblare.

5 Listează 4 tipuri de sugestii de asamblare.

Universitatea Națională din Uzbekistan numită după Mirzo Ulugbek

Facultatea de Tehnologie Computer

Pe subiect: analiza semantică a fișierului exe.

Efectuat:

Tașkent 2003.

Prefaţă.

Limba de asamblare și structura echipei.

Structura exterioară (analiză semantică).

Structura fișierului COM.

Principiul acțiunii și răspândirii virusului.

Dezasamblare.

Programe.

Prefaţă

Profesia programatorului este uimitoare și unică. În zilele noastre, știința și viața nu pot fi depuse fără cea mai nouă tehnologie. Tot ceea ce este asociat cu activitatea umană nu face fără computere tehnologie. Și aceasta contribuie la dezvoltarea și perfecțiunea ridicată. Dezvoltarea computerelor personale nu începe cu mult timp în urmă, dar în acest timp au existat pași colosali pe produsele software și pentru o lungă perioadă de timp aceste produse vor fi utilizate pe scară largă. Zona asociată cunoștințelor computere a suferit o explozie, precum și tehnologia corespunzătoare. Dacă nu luați o parte comercială, atunci putem spune că nu există activități profesionale în acest domeniu de activitate profesională. Mulți dezvoltă programe nu de dragul beneficiilor sau câștigurilor, ci în conformitate cu voința lor, prin pasiune. Desigur, acest lucru nu ar trebui să afecteze calitatea programului, iar în această chestiune, astfel încât să spunem "afaceri" există o competiție și o cerere de calitate a executării, în muncă stabilă și îndeplinește toate cerințele modernității. Aici merită remarcat, de asemenea, apariția microprocesoarelor în anii '60, care a venit să înlocuiască numărul mare de lămpi. Există câteva soiuri de microprocesoare care sunt foarte diferite unul de celălalt. Aceste microprocesoare sunt diferite de celelalte echipe de descărcare și de sistem încorporate. Cele mai frecvente cum ar fi: Intel, IBM, Celeron, AMD etc. Toate aceste procesoare sunt legate de arhitectura dezvoltată a procesatorilor Intel. Răspândirea microcomputerelor a fost motivul revizuirii atitudinii față de limba de asamblare pentru două motive principale. În primul rând, programele scrise în limba de asamblare necesită un timp de memorie și execuție semnificativ mai puțin. În al doilea rând, cunoașterea limbii de asamblare și a codului mașinii rezultate oferă o înțelegere a arhitecturii mașinii, care este puțin probabil să fie furnizată atunci când lucrați într-un limbaj de nivel înalt. Deși majoritatea specialiștilor software se dezvoltă în limbi de nivel înalt, cum ar fi Pascal, C sau Delphi, care este mai ușor atunci când scrieți programe, cel mai puternic și eficient software este scris complet sau parțial în limba de asamblare. Limbile de nivel înalt au fost concepute pentru a evita caracteristicile tehnice speciale ale computerelor specifice. Și limba de asamblare, la rândul său, este concepută pentru specificul specific al procesorului. În consecință, pentru a scrie un program în limba de asamblare pentru un anumit computer, ar trebui să cunoașteți arhitectura sa. În prezent, tipul de software principal este fișierul exe. Având în vedere aspectele pozitive ale acestui lucru, autorul programului poate fi încrezător în integritatea sa. Dar adesea uneori nu este așa. Există, de asemenea, un dezasamblator. Cu ajutorul unui dezasamblare, puteți învăța întreruperile și codurile programului. O persoană care a dezasamblat în asamblare nu va fi dificil de a remake întregul program la gustul său. Poate că, prin urmare, cea mai nerezolvată problemă - virusul. De ce oamenii scriu un virus? Unii adresați această întrebare cu surpriză, unii cu furioși, dar totuși oamenii continuă să existe, care sunt interesați de această sarcină nu din punctul de vedere al cauzei unui prejudiciu, ci ca interes pentru programarea sistemică. Strângeți scrie din diverse motive. Unul ca provocările sistemului, alții își îmbunătățesc cunoștințele în asamblare. Voi încerca să stau la toate astea în munca mea. De asemenea, a spus nu numai despre structura fișierului exe, ci și despre limba de asamblare.

^ Limba de asamblare.

Este interesant de urmărit, pornind de la momentul apariției primelor computere și terminând cu ziua de astăzi, pentru transformarea ideilor despre limba de asamblare de la programatori.

Odată ce asamblorul era limba, fără cunoștință despre care era imposibil să faci un computer să facă ceva util. Treptat, situația sa schimbat. Mai convenabile mijloace de comunicare cu un computer au apărut. Dar, spre deosebire de alte limbi, asamblorul nu a murit, așa că nu a putut face acest lucru în principiu. De ce? În căutarea răspunsului, vom încerca să înțelegem ce fel de limbaj de asamblare este în general.

Dacă scurt, limba de asamblare este o prezentare simbolică a limbii mașinii. Toate procesele din mașină la cel mai mic nivel hardware sunt acționate numai de comenzi (instrucțiuni) ale limbii mașinii. Este clar că, în ciuda numelui general, limba de asamblare pentru fiecare tip de calculator. Acest lucru se aplică aspectului programelor scrise în asamblare și idei, reflectarea acestei limbi.

Pentru a rezolva cu adevărat problemele asociate echipamentului (sau chiar, în plus, în funcție de echipament, cum ar fi, de exemplu, îmbunătățirea vitezei programului), este imposibilă fără cunoașterea asamblorului.

Un programator sau un alt utilizator poate folosi orice instrumente la nivel înalt, până la programele de construire a lumilor virtuale și, probabil, nici măcar suspectează că computerul nu îndeplinește comenzile de limbă pe care este scris programul său și prezentarea lor transformată sub formă de secvențe de comunicare plictisitoare și triste de o mașină complet diferită. Și acum ne vom imagina că un astfel de utilizator are o problemă non-standard sau pur și simplu nu a deținut nimic. De exemplu, programul său ar trebui să funcționeze cu un dispozitiv neobișnuit sau să efectueze alte acțiuni care necesită cunoștințe despre principiile echipamentelor informatice. Indiferent cât de inteligent este un programator, indiferent cât de bun limbajul în care și-a scris programul minunat, fără să știe asamblorul, nu putea face. Și nu este întâmplător ca aproape toți compilatoarele de limbi de nivel înalt să conțină mijloacele de comunicare a modulelor cu module pe asamblare sau să sprijine accesul la nivelul de programare asamblor.

Desigur, timpul calculator universal a trecut deja. După cum se spune că este imposibil să se susțină imensa. Dar există ceva în comun, un fel de fundație pe care se construiește orice educație de calculatoare gravă. Această cunoaștere a principiilor calculatorului, a arhitecturii sale și a limbajului de asamblare ca reflecție și realizare a acestor cunoștințe.

Un computer tipic modern (bazat pe i486 sau Pentium) constă din următoarele componente (figura 1).

Smochin. 1. Aparate de calculator și periferice

Smochin. 2. Schema structurală a unui computer personal

Din figura (figura 1) se poate observa că computerul este alcătuit din mai multe dispozitive fizice, fiecare dintre acestea fiind conectat la un bloc numit sistem. Dacă discutați logic, este clar că aceasta joacă rolul unui anumit dispozitiv de coordonare. Să privim în interiorul unității de sistem (nu este nevoie să încercați să pătrundeți în interiorul monitorului - nu este nimic interesant, pe lângă faptul că este periculos): Deschideți carcasa și vedeți câteva plăci, blocuri, fire de conectare. Pentru a înțelege scopul lor funcțional, să ne uităm la schema structurală a unui computer tipic (figura 2). Nu pretinde o precizie necondiționată și are scopul de a arăta scopul, relația și compoziția tipică a elementelor computerului personal modern.

Să discutăm schema din fig. 2 în mai multe stil neconvențional.
Este tipic, întâlnirea cu ceva nou, căutați unele asociații care îl pot ajuta să știe necunoscutul. Ce asociații sunt un computer? Am, de exemplu, calculatorul este adesea asociat cu persoana însuși. De ce?

Omul care creează un computer undeva în profunzimea ei înșiși că va crea ceva ca el însuși. Computerul are percepția informațiilor din lumea exterioară - este o tastatură, un mouse, dispozitive de stocare pe discuri magnetice. În fig. 2 Aceste organe sunt situate în partea dreaptă a anvelopelor sistemului. Computerul are organele "digestive" Informațiile primite sunt un procesor central și RAM. Și în cele din urmă, calculatorul are organe de vorbire care depășesc rezultatele procesării. Acestea sunt, de asemenea, unele dintre dispozitivele din dreapta.

Calculatoare moderne, desigur, departe de o persoană. Acestea pot fi comparate cu creaturile care interacționează cu lumea exterioară la nivelul unui set mare, dar limitat de reflexe necondiționate.
Acest set de reflexe formează un sistem de comenzi de mașini. Pe orice nivel înalt nu comunicați cu computerul, în cele din urmă totul se reduce la secvența plictisitoare și monotonă a comenzilor mașinilor.
Fiecare echipă a mașinii este un fel de iritant pentru a excita unul sau alt reflex necondiționat. Reacția la acest stimul este întotdeauna lipsită de ambiguitate și "cusută" în blocul de microcomand sub forma unui firmware. Acest firmware implementează acțiuni pentru implementarea comenzii mașinii, dar deja la nivelul semnalului depus la anumite circuite logice ale computerului, conducând astfel diverse subsisteme informatice. Acesta este așa-numitul principiu de gestionare a firmware-ului.

Continuând analogia cu o persoană, observăm: Pentru ca computerul să mănânce corect, sunt inventate multe sisteme de operare, compilatoare de sute de limbi de programare etc., dar toate acestea sunt, de fapt, doar un fel de mâncare, pe care alimente (Programe) este livrat de normele clare (computer). Numai stomacul calculatorului iubește alimentele dietetice, monotone - dă-i informații structurate, sub formă de secvențe strict organizate de zerouri și unități ale căror combinații și alcătuiesc limba mașinii.

Astfel, extern, fiind un poliglot, calculatorul înțelege doar o singură limbă - limba comenzilor mașinii. Desigur, pentru a comunica și a lucra cu un computer, nu este necesar să cunoaștem această limbă, ci aproape orice programator profesionist mai devreme sau mai târziu se confruntă cu nevoia de a studia. Din fericire, programatorul nu trebuie să încerce să înțeleagă valoarea diferitelor combinații de numere binare, deoarece în anii '50, programatorii au început să utilizeze analogul simbolic al limbajului mașinii pentru programare, numit limba de asamblare. Această limbă reflectă cu exactitate toate caracteristicile limbajului motorului. De aceea, în contrast cu limbile la nivel înalt, limba de asamblare pentru fiecare tip de calculator este a ta.

Din toate cele de mai sus, putem concluziona că, din moment ce limba de asamblare a computerului "nativ", atunci cel mai eficient program poate fi scris numai pe acesta (cu condiția ca acesta să scrie un programator calificat). Există un mic "dar": este foarte laborios, necesitând o mare atenție și experiență practică în acest proces. Prin urmare, de fapt, asamblerul este scris în programul principal care ar trebui să asigure o muncă eficientă cu hardware-ul. Uneori, asamblatorul este scris de timpul de execuție sau de memorie de cheltuieli. Ulterior, ele sunt întocmite sub formă de subrutine și sunt combinate cu codul în limba la nivel înalt.

Pentru a studia limba de asamblare a oricărui computer are sens să înceapă numai după ce a aflat care parte din computer este lăsată vizibilă și accesibilă programării în această limbă. Acesta este așa-numitul model de software de calculator, parte din care este un model software microprocesor care conține 32 de registre într-un fel sau altul disponibil pentru utilizare de către programator.

Aceste registre pot fi împărțite în două grupuri mari:

^ 16 registre de utilizatori;

16 registre de sistem.

În programele din limba de asamblare, registrele sunt utilizate foarte intens. Cele mai multe registre au un scop funcțional definitiv.

După cum urmează numele, registrele de utilizatori sunt numite deoarece programatierul le poate folosi atunci când își scrie programele. Aceste registre includ (figura 3):

Opt registre pe 32 de biți care pot fi utilizate de programatori pentru stocarea datelor și adreselor (ele sunt numite și registrele de uz general (RON)):

Șase segmente registre: CS, DS, SS, ES, FS, GS;

starea și registrele de management:

Eflags / steaguri Registrul steagurilor;

EIP / IP indicator pointer înregistrat.

Smochin. 3. Registrele de utilizatori ale microprocesoarelor I486 și Pentium

De ce multe dintre aceste registre sunt prezentate cu o caracteristică de separare înclinată? Nu, acestea nu sunt diferite registre sunt părți ale unui mare registru pe 32 de biți. Ele pot fi utilizate în program ca obiecte individuale. Acest lucru se face pentru a asigura performanța programelor scrise pentru modelele mai tinere 16 biți ale microprocesoarelor Intel, începând cu I8086. I486 și microprocesoarele Pentium au în cea mai mare parte registre pe 32 de biți. Numărul lor, cu excepția registrelor de segmente, la fel ca în i8086, dar dimensiunea este mai mare, care se reflectă în denumirile lor - au
prefixul E (extins).

^ Registrele generale
Toate registrele acestui grup vă permit să contactați părțile noastre "mai tinere" (vezi figura 3). Având în vedere acest desen, observați că este posibil să se folosească pentru auto-abordarea doar părțile mai tinere 16 și 8 biți ale acestor registre. Cele mai vechi 16 biți ale acestor registre ca obiecte independente nu sunt disponibile. Acest lucru se face așa cum am observat mai sus, pentru compatibilitatea cu modelele mai tinere 16 biți de microprocesoare Intel.

Listăm registrele aparținând grupului de registre generale. Deoarece aceste registre sunt situate fizic într-un microprocesor în interiorul unui dispozitiv aritmetic și logic (allu), ele sunt numite și registre ale Allu:

eAX / AX / AH / AL (Registrul acumulatorului) - Baterie.
Este folosit pentru a stoca date intermediare. În unele echipe, este necesară utilizarea acestui registru;

eBX / BX / BH / BL (Registrul de bază) - Registrul de bază.
Se utilizează pentru a stoca adresa de bază a unui obiect în memorie;

eCX / CX / CH / CI (număr de registru) este un contor de înregistrare.
Utilizate în comenzi care produc unele acțiuni repetabile. Utilizarea sa este adesea implicit și ascunsă în algoritmul echipei relevante.
De exemplu, organizația ciclului de buclă, în plus față de transmiterea managementului de comandă, localizată la o anumită adresă, analizează și reduce valoarea registrului ECX / CX;

eDX / DX / DH / DL (Registrul datelor) - Registrul de date.
La fel ca și registrul EAX / AX / AH / AL, stochează date intermediare. În unele echipe, utilizarea sa este obligatorie; Pentru unele comenzi, acest lucru este implicit.

Următoarele două registre sunt utilizate pentru a susține așa-numitele operațiuni în lanț, adică operațiuni care produc prelucrarea secvențială a lanțurilor de elemente, fiecare dintre acestea poate avea o lungime de 32, 16 sau 8 biți:

eSI / SI (Registrul Indexului sursă) - Indicele sursă.
Acest registru în operațiunile cu lanț conține adresa curentă a elementului din lanțul sursă;

eDI / DI (Index Index) - Indicele receptorului (destinatar).
Acest registru din operațiunile cu lanț conține adresa curentă din lanțul receptorului.

În arhitectura microprocesorului, o astfel de structură de date este acceptată pe nivelul software-ului și hardware ca stivă. Pentru a lucra cu un stack în sistemul de comandă a microprocesorului, există comenzi speciale, iar în modelul de software microprocesor există registre speciale:

eSP / SP (Stack Pointer Register) - Registrul pointerului Stack.
Conține vârful stivei în segmentul curent de stivă.

eBP / BP (Registrul pointerului de bază) - Înregistrați indicatorul de bază al cadrului de bază.
Concepute pentru a organiza accesul arbitrar la datele din interiorul stack-ului.

Stack-ul se numește zona programului pentru depozitarea temporară a datelor arbitrare. Desigur, datele pot fi, de asemenea, salvate în segmentul de date, dar în acest caz este necesar să începeți o celulă separată de memorie numită în acest timp, ceea ce mărește dimensiunea programului și numărul de nume utilizate. Comoditatea de stivă este că zona sa este utilizată în mod repetat și salvându-i de acolo folosind comenzi eficiente de împingere și pop fără a specifica niciun nume.
Stack-ul este folosit în mod tradițional, de exemplu, pentru a salva conținutul registrelor utilizate de program, înainte de a apela subrutina, care, la rândul său, va folosi registrele procesorului "în scopurile lor personale". Conținutul inițial al registrelor este proiectat de la stivă după întoarcerea de la subrutină. O altă primire comună este transferul subprogramului parametrilor cerute de acesta prin stivă. Subrutina, știind, în ce ordine sunt plasate pe teancul parametrilor, le poate alege de acolo și le poate folosi atunci când o interpretează. O caracteristică distinctivă a stivei este ordinea particulară a eșantionului din datele conținute în acesta: numai elementul superior este disponibil în orice moment, adică. Elementul încărcat în stack ultima dată. Descărcarea de la stiva elementului superior face ca elementul să fie disponibil. Elementele de stivă sunt situate în zona de memorie alocată sub stivă, pornind de la partea inferioară a stackului (adică, de la adresa maximă) pe adresele în mod constant în scădere. Adresa elementului superior, disponibilă este stocată în Registrul indicatorului ST SP Stack. Ca orice altă zonă a memoriei programului, stiva trebuie să intre într-un anumit segment sau să formeze un segment separat. În orice caz, adresa segmentului din acest segment este plasată în registrul segmentului SS STACK. Astfel, o pereche de registre SS: SP descrie adresa unei celule de stivuire la prețuri accesibile: adresa segmentului de stivă este stocată în SS, iar în SP - deplasarea acesteia din urmă stocată în stack-ul acestui lucru (figura 4, a ). Rețineți că în starea inițială, indicatorul ST SPAC indică o celulă sub fundul stack-ului și nu este inclusă în acesta.

Figura 4. Organizația de stivă: a - starea inițială, b - după încărcarea unui element (în acest exemplu - conținutul înregistrării ah), în - după încărcarea celui de-al doilea element (conținutul registrului DS), G - după descărcarea Un element, d - după descărcarea a două elemente și întoarcerea la starea inițială.

Încărcarea stivei este efectuată de o comandă specială de lucru cu stiva de împingere (push). Această comandă reduce mai întâi conținutul indicatorului de stivă la 2 și apoi plasează operandul la adresa din sp. Dacă, de exemplu, dorim să salvăm temporar conținutul înregistrării ah pe stivă, trebuie să executați comanda

Stackul merge la starea prezentată în fig. 1.10, b. Se poate observa că indicatorul de stivă este mutat la două octeți în sus (spre adrese mai mici) și această adresă înregistrează comanda de împingere a operandului. Următoarea comandă de descărcare pe stivă, de exemplu,

va fi stack-ul din statul prezentat în fig. 1.10, c. Stack-ul va stoca acum două elemente, iar numai cea superioară va fi accesibilă, ceea ce indică indicatorul SP Stack. Dacă, după un timp, am avut nevoie pentru a restabili conținutul original salvat în stiva de registre, trebuie să executăm comenzi de descărcare de la stackul pop (împingere):

pop Ds.
pop topor.

Ce dimensiune ar trebui să fie stiva? Depinde de cât de intens este utilizat în program. Dacă, de exemplu, este planificată să stocați o serie de 10.000 de octeți în stack, atunci stiva ar trebui să fie nu mai mică decât această dimensiune. În același timp, ar trebui să se țină cont de faptul că, în unele cazuri, stiva este utilizată automat de sistem, în special atunci când se execută comanda de întrerupere a int 21h. Conform acestei comenzi, procesorul plasează mai întâi adresa de întoarcere pe stivă, iar DOS trimite același conținut de înregistrare acolo și alte informații referitoare la programul întrerupt. Prin urmare, chiar dacă programul nu utilizează deloc teancul, acesta ar trebui să fie prezent în program și nu mai are mai puțin de câteva zeci de cuvinte. În primul exemplu, am luat sub stiva de 128 de cuvinte, care este suficient de mare.

^ Structura programului pe asamblare

Programul de asamblare este un set de blocuri de memorie numite segmente de memorie. Programul poate consta din unul sau mai multe segmente de bloc. Fiecare segment conține un set de sugestii lingvistice, fiecare dintre ele ocupă o linie separată a codului programului.

Ofertele de asamblare sunt patru tipuri:

comenzi sau instrucțiuni care sunt analogi simbolici ai comenzilor mașinii. În procesul de difuzare, instrucțiunile de asamblare sunt transformate în comenzile corespunzătoare ale sistemului de comandă microprocesor;

macrocomandale - propunerea clară a propunerilor de text ale programului care sunt înlocuite în timpul emisiunii de alte propuneri;

directive care sunt o indicație a unui traducător de asamblare pentru efectuarea anumitor acțiuni. Directivele nu au analogi în reprezentarea mașinii;

rânduri de comentarii care conțin orice caractere, inclusiv literele alfabetului rus. Comentariile sunt ignorate de traducător.

^ Sintaxa de asamblare

Propunerile care alcătuiesc programul pot fi un design sintactic, o echipă corespunzătoare, macrokomand, directivă sau un comentariu. Pentru ca traducătorul de asamblare să le recunoască, ele trebuie să fie formate de anumite reguli sintactice. Pentru aceasta, este mai bine să utilizați o descriere formală a sintaxei limbii ca regulile gramaticii. Cele mai comune modalități de o asemenea descriere a limbajului de programare sunt diagrame sintactice și forme extinse ale Bakusa NAUR. Pentru utilizare practică, diagramele sintactice sunt mai convenabile. De exemplu, sintaxa sugestiilor de asamblare poate fi descrisă utilizând diagrame sintactice prezentate în următoarele figuri.

Smochin. 5. Formatul ofertei de asamblare

Smochin. 6. Formatul directivei.

Smochin. 7. Formatul de comandă și macrocomenzile

La aceste desene:

numele etichetei este identificatorul, a cărei valoare este adresa primului octet al propunerii textului sursă al programului, pe care îl denotă;

numele este un identificator care distinge această directivă din alte directive cu același nume. Ca urmare a asamblorului de prelucrare, o directivă specifică poate fi atribuită anumitor caracteristici;

codul de operare (CPC) și directiva este denumirea mnemonică a echipei de mașini relevante, a macrocomenzilor sau a directivelor traducătorului;

operand - părți ale echipei, comandanți macro sau directive de asamblare care denotă obiecte pe care se fac acțiuni. Operanzii de asamblare sunt descriși de expresiuni cu constante numerice și de text, mărci și identificatori de variabile folosind operații și unele cuvinte rezervate.

^ Cum să utilizați diagrame sintactice? Este foarte simplu: pentru că trebuie doar să găsiți și apoi treceți prin modul de autentificare a diagramei (stânga) la ieșirea (dreapta). Dacă această cale există, oferta sau designul este corect din punct de vedere sintactic. Dacă nu există o astfel de cale, înseamnă că compilatorul nu va accepta acest design. Când lucrați cu diagrame sintactice, acordăm atenție direcției bypass-ului, indicată de săgeți, deoarece printre căile pot fi cele pentru care puteți merge la stânga spre dreapta. În esență, diagramele sintactice reflectă logica traducătorului atunci când propunerile de intrare ale programului izolează.

Simboluri admise Când scrieți texte text sunt:

Toate literele latine: A-Z, A-Z. În acest caz, literele de capital și litere mici sunt considerate echivalente;

Numere de la 0 la 9;

Semne?, @, $, _, &;

Dividers ,. ()< > { } + / * % ! " " ? \ = # ^.

Sugestiile de asamblare sunt formate din Lexeme, care sunt secvențe inseparabile din punct de vedere sintactic de simboluri admise ale limbii care au sens la traducător.

Lexes sunt:

identificatori - Secvențe de caractere admise utilizate pentru a se referi la astfel de obiecte, cum ar fi codurile de funcționare, numele variabilelor și numele etichetei. Regula de înregistrare a identificatorului este după cum urmează: Identificatorul poate consta din unul sau mai multe caractere. Ca personaje, puteți folosi literele alfabetului latin, numerele și unele semne speciale - _, $, @. Identificatorul nu poate porni simbolul cifrei. Lungimea identificatorului poate fi de până la 255 de caractere, deși traducătorul percepe numai primele 32, iar restul ignoră. Puteți regla durata identificatorilor posibile utilizând opțiunea Prompt Command MV. În plus, există o oportunitate de a specifica traducătorul să facă distincția între majuscule și litere mici sau ignorarea diferenței (care se face implicit).

^ Comenzi de asamblare.

Comenzile de asamblare dezvăluie capacitatea de a-și transfera cerințele la computer, mecanismul de management din program (cicluri și tranziții) pentru comparații logice și organizarea software-ului. Cu toate acestea, sarcinile programabile sunt rareori atât de ușor. Majoritatea programelor conțin o serie de cicluri în care se repetă mai multe comenzi până la o anumită cerință de realizare și diverse controale care determină care dintre mai multe acțiuni ar trebui efectuate. Unele comenzi pot transmite controlul prin schimbarea secvenței normale de pași modificați direct valoarea offset în indicatorul de comandă. După cum am menționat mai devreme, există diverse echipe pentru diferite procesoare, vom lua în considerare o serie de comenzi pentru procesoare 80186, 80286 și 80386.

Pentru a descrie statutul de steaguri după efectuarea unei echipe, vom folosi eșantionul din tabelul care reflectă structura Flag EFLAGS:

La linia de jos a acestui tabel, valorile steagurilor sunt date după executarea comenzii. În același timp, se utilizează următoarea notație:

1 - După executarea comenzii, pavilionul este setat (egal cu 1);

0 - După executarea comenzii, steagul este resetat (egal cu 0);

r - valoarea steagului depinde de rezultatul activității echipei;

După executarea comenzii, steagul nu este definit;

spațiu - după executarea comenzii, steagul nu se schimbă;

Pentru a reprezenta operanii în diagrame sintactice, se utilizează următoarea notație:

r8, R16, R32 - Operand într-unul din registrele mărimii octetului, cuvântul sau dublul cuvântului;

m8, M16, M32, M48 - operand în dimensiunea octetului de memorie, cuvântul, dublu cuvânt sau 48 de biți;

i8, i16, i32 - Dimensiune directă a operandului octet, cuvânt sau dublu cuvânt;

a8, A16, A32 - Adresa relativă (offset) în segmentul de cod.

Echipe (ordine alfabetică):

* Aceste comenzi sunt descrise în detaliu.

Adăuga.
(Plus)

Plus

^ Diagrama echipei:

adăugați receptor, sursă

Scop: adăugarea a două surse de operanzi și receptor octet, cuvânt sau cuvânt dublu.

Algoritmul de lucru:

fold sursa de operanzi si receptorul;

Înregistrați rezultatul adăugării la receptor;

instalați steagurile.

Starea pavilionului după executarea comenzii:

Aplicație:
Comanda Adăugare este utilizată pentru a adăuga două operande întregi. Rezultatul adăugării este plasat la adresa primului operand. Dacă rezultatul adăugării este peste granița receptorului operand (depășire), luați în considerare această situație analizând pavilionul CF și aplicarea ulterioară posibilă a comenzii ADC. De exemplu, valori laici în registrul axelor și zona de memorie CH. Când adăugați, ar trebui să luați în considerare posibilitatea de depășire.

Înregistrați-vă plus înregistrarea sau memoria:

| 000000DW | MODREGR / RM |

Registrul AX (AL) plus valoarea directă:

| 0000010W | --Data-- | Date, dacă w \u003d 1 |

Înregistrați sau memorie plus valoarea directă:

| 100000SW | MOD000R / M | --Data-- | Date, dacă BW \u003d 01 |

Apel
(Apel)

Procedura de apel sau sarcină

^ Diagrama echipei:

Scop:

transferul controlului unei proceduri apropiate sau pe termen lung cu memorarea în stiva de adresă a punctului de returnare;

schimbarea sarcinilor.

Algoritmul de lucru:
determinată de tipul de operand:

Eticheta Messenger - conținutul indicatorului de comandă EIP / IP este introdus în stack și noua valoare de adresă este încărcată în același registru, adresa corespunzătoare etichetei;

Eticheta etichetă - Conținutul indicatorului de comandă EIP / IP și CS este introdus în stivă. Apoi, aceleași registre sunt încărcate cu noi valori ale adreselor corespunzătoare etichetei lungi;

R16, 32 sau M16, 32 - Determinați registrul sau celula de memorie care conține compensări în segmentul de comandă curent unde este transmis controlul. La controlul controlului, este introdus conținutul indicatorului de comandă EIP / IP;

Pointerul de memorie - Definește o celulă de memorie care conține un indicator de 4 sau 6 octeți la procedura apelată. Structura unui astfel de pointer 2 + 2 sau 2 + 4 octeți. Interpretarea unui astfel de indicator depinde de modul de funcționare a microprocesorului:

^ Flag Statla după executarea comenzii (cu excepția sarcinii de comutare):

executarea echipei nu afectează steagurile

Când schimbați sarcina, valorile pavilionului sunt modificate în conformitate cu informațiile înregistrate EFLAGS din segmentul de stare TSS al sarcinii la care comutarea.
Aplicație:
Comanda de apel vă permite să organizați un control flexibil și multivariat la subrutina, salvând adresa de întoarcere.

Despre D (patru formate):

Adresarea directă în segment:

| 11101000 | DISC-LOW | DIEP-HIGH |

Adresarea indirectă în segment:

| 1111111 | MOD010R / M |

Adresarea indirectă între segmente:

| 1111111 | MOD011R / m |

Adresarea directă între segmente:

| 10011010 | Offset-Low | Offset-High | Seg-Low | Seg-High |

CMP.
(Comparați operanzii)

Compararea operanilor

^ Diagrama echipei:

cMP Operand1, Operand2

Scop: Compararea a două operanzi.

Algoritmul de lucru:

efectuați scăderea (operand1 operand2);

În funcție de rezultat, instalați steaguri, operand1 și operand2 să nu se schimbe (adică rezultatul nu este memorat).

Aplicație:
Această comandă este utilizată pentru a compara cele două operanzi prin scăderea, în timp ce operanzii nu se schimbă. Conform rezultatelor comenzii, sunt instalate steaguri. Comanda CMP se aplică comenzilor de tranziție condiționată și comenzii de instalare a byte de valoarea SETCC.

Despre k o d (trei formate):

Înregistrați-vă sau înregistrați memoria:

| 001110DW | MODREGR / M |

Valoare directă cu AX (AL):

| 0011110W | --Data-- | Date, dacă w \u003d 1 |

Valoarea directă cu registrul sau memoria:

| 100000SW | MOD111R / M | --Data-- | Date, dacă SW \u003d 0 |

Dec
(Decrementarea operandului de 1)

Reducerea operandului pe unitate

^ Diagrama echipei:

dec operand.

Scop: Reducerea valorii operandului în memorie sau înregistrată cu 1.

Algoritmul de lucru:
comanda deduce 1 de la operand. Starea pavilionului după executarea comenzii:

Aplicație:
Comanda Dec este utilizată pentru a reduce valoarea octeților, a cuvintelor, a cuvintelor duble în memorie sau registru pe unitate. În același timp, observați că comanda nu afectează steagul CF.

Înregistrați-vă: | 01001ROG |

^ Înregistrare sau memorie: | 111111W | MOD001R / M |

Div
(Împărțiți nesemnați)

Decizie nesalabile

Diagrama echipei:

divizor divid

Scop: Efectuați operarea de a împărți două valori binare nesemnate.

^ Algoritmul de lucru:
Pentru comanda, este necesar să se specifice două operanzi - diviziune și divizoare. Dividendul este definit implicit, iar dimensiunea sa depinde de dimensiunea divizorului, care este specificată în comandă:

dacă un divizor în octeți, atunci dividendul trebuie să fie amplasat în registrul AX. După operație, privat este plasat în Al, și reziduul în ah;

dacă divizorul este dimensiunea cuvântului, atunci dividendul trebuie să fie amplasat în perechea de registre DX: AX, iar cea mai tânără parte a dividendului este în topor. După operație, privat este plasat în topor și reziduul în DX;

dacă un divizor dual-cuvânt, divizibilul trebuie să fie amplasat în perechea de registru EDX: EAX, iar cea mai tânără parte a diviziunii este în EAX. După operație, privat este plasat în EAX, iar reziduul este în EDX.

^ Flag Statla După executarea comenzii:

Aplicație:
Echipa efectuează o diviziune întregă a operanților odată cu eliberarea rezultatului de împărțire sub formă de privat și reziduu din diviziune. La efectuarea unei operațiuni de divizare, poate apărea o situație excepțională: 0 - Eroare de divizare. Această situație apare într-unul din cele două cazuri: divizorul este 0 sau privat prea mare pentru plasarea sa în registrul EAX / AX / AL.

Oh k k de d:

| 1111011W | MOD110R / M |

Int.
ÎNTRERUPE)

Apelați subprogramul serviciului de întrerupere

^ Diagrama echipei:

int numere_name.

Scop: Apelați o subrutină de serviciu de întrerupere cu un număr de întrerupere specificat de operand de comandă.

^ Algoritmul de lucru:

scrieți pe eFlags / steaguri steaguri și adresă de retur. La recuperarea adresei de retur, conținutul registrului segmentului CS este înregistrat pentru prima dată, apoi conținutul indicatorului de comandă EIP / IP;

resetați dacă și TF în steaguri zero;

transferați controlul la programul de procesare a întreruperii cu numărul specificat. Mecanismul de control depinde de modul de funcționare al microprocesorului.

^ Flag Statla După executarea comenzii:

Aplicație:
După cum se poate vedea din sintaxă, există două forme ale acestei comenzi:

int 3 - are propriul cod individual al operației de 0cch și ia un octet. Această circumstanță o face foarte convenabilă pentru utilizarea în diverse debugri de software pentru a instala puncte de întrerupere prin înlocuirea primului octet al oricărei comenzi. Microprocesorul, întâlnit în comanda secvenței de comandă cu codul de funcționare de 0CCH, determină un program de procesare a întreruperii cu un vector numărul 3, care servește la comunicarea cu depanatorul programului.

A doua formă a comenzii ocupă doi octeți, are un cod de funcționare 0CDH și vă permite să inițieți o solicitare a rutinei de procesare a întreruperii cu un număr vectorial în intervalul 0-255. Caracteristicile gestionării managementului, după cum sa menționat, depind de modul de funcționare al microprocesorului.

Despre (două formate):

Înregistrați-vă: | 01000reg |

^ Înregistrați-vă sau memoria: | 111111W | MOD000R / M |

JCC.
Jcxz / jecxz.
(Salt dacă starea)

(Salt dacă cx \u003d zero / salt dacă ecx \u003d zero)

Tranziția dacă o condiție este îndeplinită

Tranziția dacă CX / ECX este zero

^ Diagrama echipei:

tag-ul JCC.
eticheta jcxz.
tag-ul Jecxz.

Scop: Tranziția în cadrul segmentului de comandă curent în funcție de o anumită condiție.

^ Algoritmul comandant (cu excepția JCXZ / JECXZ):
Verificarea stării steagurilor în funcție de codul operației (reflectă starea verificabilă):

dacă condiția de testare este cu adevărat adevărată, atunci procedați la celula desemnată de operand;

dacă starea validă este falsă, apoi transferați următoarea comandă.

JCXZ / Jecxz algoritmul echipei de lucru:
Verificați condițiile de egalitate zero conținutul registrului ECX / CX:

dacă starea verificabilă

Munca de curs

Sub Programarea sistemului de disciplină "

Subiect №4: "Rezolvarea sarcinilor pentru proceduri"

Opțiunea 2.

East Siberian State University

Tehnologie și management

____________________________________________________________________

Colegiul Tehnologic

SARCINA

pentru cursuri

Disciplina:
Subiect: Rezolvarea sarcinilor pentru proceduri
Artist: Glavinskaya Arina Aleksandrovna
Lider: Dambaevaseegma Viktorovna
Rezumatul muncii: Studiul subprogramilor în limba de asamblare,
Rezolvarea sarcinilor folosind subrutine
1. Partea teoretică: Informații de bază despre limba de asamblare (set
Echipe etc.), Organizare de subprograme, metode de transmitere a drogurilor
în subrutine
2. Partea practică: Elaborarea a două subprograme, dintre care unul convertește orice scrisoare dată titlului (inclusiv literele ruse), iar celălalt convertește scrisoarea către linie.
Convertește orice literă dată la titlu, iar celălalt convertește litera către linie.
Convertește litera la linie.
Termeni de execuție a proiectului la program:
1. Partea teoretică este de 30% cu 7 săptămâni.
2. Partea practică - 70% cu 11 săptămâni.
3. Protecție - 100% până la 14 săptămâni.
Cerințe pentru înregistrare:
1. Calculul și nota explicativă a proiectului de schimb ar trebui prezentată în
copii electronice și solide.
2. Raportul raportului trebuie să fie cel puțin 20 de pagini scrise fără aplicații contabile.
3. RPZ este emis în conformitate cu GOST 7.32-91 și semnat de manager.

Administrator __________________

Artist __________________

Data emiterii " 26 " septembrie 2017 G.


Introducere 2.

1.1 Informații de bază despre limba de asamblare. 3.

1.1.1 Set de comenzi. patru.

1.2 Organizarea subrutinelor în limba de asamblare. patru.

1.3 Metode de transferare a parametrilor în subrutine. 6.

1.3.1 Transferul parametrilor prin intermediul registrelor .. 6

1.3.2 Transferarea parametrilor prin stivă. 7.

2 secțiunea practică .. 9

2.1 Setarea problemei. nouă

2.2 Descrierea problemei problemei. nouă

2.3 Testarea programului. 7

Concluzie. opt

Referințe .. 9.


Introducere

Este bine cunoscut faptul că este dificil să se programeze pe asamblare. După cum știți, există multe limbi diferite. nivel inaltcare vă permit să cheltuiți mult mai puțin efort atunci când scrieți programe. Bineînțeles, se pune întrebarea atunci când programulmanul ar putea fi necesar să utilizeze asamblorul atunci când scrie programe. În prezent, puteți specifica două domenii în care utilizarea limbajului de asamblare este justificată și adesea necesară.

În primul rând, acestea sunt așa-numitele programe de sistem dependent de mașină, de obicei gestionează diverse dispozitive de calculator (astfel de programe sunt numite drivere). Aceste programe de sistem utilizează comenzi speciale de mașini care nu trebuie să se aplice în mod obișnuit (sau după cum se spune aplicat) Programe. Aceste comenzi sunt imposibile sau foarte dificil de stabilit în limba de nivel înalt.

A doua zonă de aplicare a asamblorului este asociată cu optimizarea executării programului. Foarte des, traducătorii de programe (compilatoare) cu limbi de nivel înalt oferă un program foarte ineficient în mașină. Acest lucru se referă, de obicei, la un program computațional, în care cea mai mare parte este efectuată foarte mică (aproximativ 3-5%) a programului (ciclul principal). Pentru a rezolva această problemă, pot fi utilizate așa-numitele sisteme de programare multilingve care vă permit să înregistrați părți ale programului în diferite limbi. În mod obișnuit, partea principală a programului este înregistrată în limba de programare la nivel înalt (Fartran, Pascal, C, etc.), iar timpul de execuție critică al programului este pe asamblare. Viteza întregului program poate crește semnificativ. Adesea, aceasta este singura modalitate de a face programul să ducă rezultatul pentru un timp acceptabil.

Scopul acestei lucrări de curs este de a obține abilități practice pentru a lucra programarea în limba de asamblare.

Sarcini de lucru:

1. Pentru a studia informațiile de bază despre limba de asamblare (structura și componentele programului de asamblare, formatul echipei, organizarea subrutinelor etc.);

2. Examinați tipurile de operațiuni de biți, formatul și logica funcționării comenzilor de asamblare logică;

3. Rezolvați sarcina individuală de aplicare a subrotinelor la asamblare;

4 Formulați concluzia despre munca făcută.

1 secțiune teoretică

Informații de bază despre asamblare

Asamblerul este un limbaj de programare la nivel scăzut, care este un format pentru înregistrarea comenzilor mașinii, convenabil pentru percepția umană.

Comenzile lingvistice de asamblare sunt una într-una care corespund echipelor de procesoare și, de fapt, sunt o formă simbolică convenabilă de înregistrare (Mnemokode) de comenzi și argumentele lor. De asemenea, limba de asamblare oferă abstracții software de bază: legarea părților programului și a datelor după etichete cu nume simbolice și directivă.

Directivele Assembler vă permit să includeți blocuri de date în program (descrise în mod explicit sau citiți din fișier); repetați un anumit fragment al numărului specificat de ori; compilați un fragment cu condiție; Setați adresa de execuție a fragmentului, modificați valorile etichetelor în timpul procesului de compilare; Utilizați definițiile macro cu parametrii și altele.

Avantaje și dezavantaje

· Cantitatea minimă de cod redundant (utilizarea unui număr mai mic de comenzi și referințe la memorie). Ca rezultat, viteza mare și dimensiunea programului mai mic;

· Volumele de coduri mari, un număr mare de sarcini minore suplimentare;

· Codul de lizibilitate slabă, dificultatea de sprijin (depanarea, adăugarea de caracteristici);

· Dificultatea implementării paradigmelor de programare și a oricăror alte convenții complexe, complexitatea dezvoltării comune;

· Cantități mai mici de biblioteci disponibile, compatibilitatea lor mică;

· Acces imediat la echipamente: porturi I / O, registre de procesoare speciale;

· Maximum "Fit" pentru platforma dorită (utilizarea instrucțiunilor speciale, caracteristicile tehnice ale "fierului");

· Infecții la alte platforme (cu excepția compatibile binare).

În plus față de instrucțiuni, programul poate conține directive: comenzi care nu sunt trimise direct la instrucțiunile mașinilor și managerii compilatorului. Setul și sintaxa vor diferi în mod semnificativ și depinde de nu de platforma hardware, ci de la compilatorul utilizat (generând dialecte de limbi într-o singură familie de arhitecturi). Ca un set, pot fi alocate directive:

· Determinarea datelor (constante și variabile);

· Gestionarea programului programului în memorie și parametrii fișierului de ieșire;

· Setarea modului compilatorului;

· Tot felul de abstractizare (adică elemente ale limbilor la nivel înalt) - din procedurile și funcțiile de înregistrare (pentru a simplifica punerea în aplicare a paradigmei programării procedurale) la structurile și ciclurile condiționate (pentru structura programării structurale);

· Macrocomenzi.

Set de comenzi

Comenzile tipice ale limbajului de asamblare sunt:

· Comenzi de transfer de date (MOV etc.)

· Echipele aritmetice (adăugați, sub, imul etc.)

· Operații logice și loturi (sau, și, xor, sh, etc.)

· Echipe de gestionare a executării programului (JMP, buclă, ret etc.)

· Întrerupeți comenzi de apel (uneori se referă la comenzile de control): int

· Comenzi I / O în porturi (în, afară)

Pentru microcontrolere și microcomputerele sunt, de asemenea, caracterizate prin verificarea și tranziția comenzilor, de exemplu:

· JNE - Du-te dacă nu este egal;

· JGE - Du-te, dacă este mai mult sau egal.

Pentru ca aparatul să efectueze echipele unei persoane la nivel hardware, este necesar să se precizeze o anumită secvență de acțiuni în limba "Nolikov și unități". Asistentul în această afacere va fi un asamblator. Acesta este un utilitar care funcționează cu transferul de comenzi la limba mașinii. Cu toate acestea, scrierea programului este un proces foarte consumator și complex. Această limbă nu intenționează să creeze plămâni și acțiuni simple. În prezent, orice limbă de programare utilizată (Assembler Works Fine) vă permite să scrieți sarcini speciale eficiente care afectează puternic funcționarea hardware-ului. Scopul principal este de a crea un microcomand și coduri mici. Această limbă oferă mai multe oportunități decât, de exemplu, Pascal sau C.

Scurtă descriere a limbilor de asamblare

Toate limbile de programare sunt împărțite de la niveluri: scăzute și ridicate. Orice din sistemul sintactic al "familiei" asamblorului este diferit de faptul că acesta se unește simultan a unor avantaje ale celor mai frecvente și mai moderne limbi. Cu alții, rudele lor și faptul că sistemul informatic poate fi utilizat pe deplin.

O caracteristică distinctivă a compilatorului este simplitatea utilizării. Acesta diferă de cei care lucrează numai cu niveluri ridicate. Dacă luați în considerare orice astfel de limbaj de programare, asamblarea funcționează de două ori mai rapidă și mai bună. Pentru a scrie un program de lumină în el, prea mult timp nu va avea nevoie.

Pe scurt despre structura limbii

Dacă vorbim în general despre lucrarea și structura funcționării limbii, puteți spune cu siguranță că comenzile sale corespund pe deplin echipelor de procesoare. Adică, asamblarea folosește Mnemokodes, cea mai convenabilă persoană de înregistrare.

Spre deosebire de alte limbi de programare, asamblarea utilizează anumite etichete pentru a înregistra celulele de memorie în loc de adrese. Ele sunt traduse în așa-numitele directive. Acestea sunt adrese relative care nu afectează funcționarea procesorului (care nu sunt traduse în limba mașinii) și este necesar să recunoască mediul de programare în sine.

Pentru fiecare linie a procesorului, există propria sa situație corectă va fi orice proces, inclusiv tradus

Limba de asamblare are mai multe sintaxe care vor fi discutate în articol.

Plusurile limbajului

Cea mai importantă și mai convenabilă adaptare a limbajului de asamblare va fi aceea că este posibil să se scrie un program pentru un procesor care va fi foarte compact. Dacă codul se dovedește a fi uriaș, atunci unele procese redirecționează la RAM. În același timp, ei fac totul rapid și fără eșecuri, cu excepția cazului în care, desigur, ei controlează un programator calificat.

Drivere, sisteme de operare, BIOS, compilatoare, interpreți etc. - Acesta este întregul program din limba de asamblare.

Când utilizați un dezasamblare, care face o traducere de la mașină într-una, este posibil să înțelegeți cu ușurință modul în care funcționează unul sau altă sarcină de sistem, chiar dacă nu există nicio explicație. Cu toate acestea, acest lucru este posibil numai dacă programele sunt luminoase. Din păcate, în codurile netriviale, este destul de greu de înțeles.

Contra Limbi

Din păcate, programatorii Novice (și adesea profesioniști) sunt dificil de dezasamblat limba. Asamblorul necesită o descriere detaliată a comenzii necesare. Datorită faptului că trebuie să utilizați comenzile mașinii, probabilitatea unor acțiuni eronate și complexitatea executării este în creștere.

Pentru a scrie chiar și cel mai simplu program, programatorul trebuie să fie calificat, iar nivelul său de cunoștințe este suficient de mare. Specialistul mediu, din păcate, scrie adesea coduri proaste.

Dacă platforma pentru care este creat programul este actualizat, atunci toate comenzile trebuie copiate manual - aceasta necesită limba în sine. Asamblatorul nu acceptă funcția de reglare automată a funcționării proceselor și înlocuirea oricăror elemente.

Echipe de limbă

După cum sa menționat deja mai sus, fiecare procesor are propriul set de comenzi. Cele mai simple elemente care sunt recunoscute de orice tip sunt următoarele coduri:


Utilizarea directivelor

Programarea microcontrolerelor în limba (asamblarea acest lucru permite și perfect se confruntă cu funcționarea) a celui mai mic nivel în majoritatea cazurilor se termină cu succes. Cel mai bine este să utilizați procesoare cu o resursă limitată. Pentru tehnicile pe 32 de biți, această limbă este bine potrivită. Adesea în codurile puteți vedea directive. Ce este asta? Și pentru ce este folosit?

Pentru a începe, este necesar să se sublinieze faptul că directivele nu sunt transferate în limba mașinii. Acestea reglează performanța compilatorului. Spre deosebire de comenzi, acești parametri, având diferite funcții, diferă nu datorită diferitelor procesoare, ci în detrimentul unui alt traducător. Printre directivele principale pot fi alocate după cum urmează:


Originea numelui

Datorită numelui limbii - "Assembler"? Vorbim despre traducător și compilator, care produce și criptarea datelor. De la asamblorul englez nu înseamnă nimic altceva decât un colector. Programul nu a fost colectat manual, a fost utilizată o structură automată. În plus, în prezent, utilizatorii și specialiștii au șters diferența dintre termenii. Adesea limbile de programare a apelurilor de asamblare, deși este doar un utilitar.

Datorită numelui general de colectare acceptat, unii au o soluție eronată că există un singur limbaj de nivel scăzut (sau norme standard pentru acesta). Pentru ca programatierul să înțeleagă ce este o structură, este necesar să se specifice, pentru care se utilizează una sau altă limbă de asamblare.

Macrofs

Limbile de asamblare care sunt create relativ recent au macroze. Acestea facilitează atât ortografia cât și execuția programului. Datorită prezenței lor, traducătorul execută uneori codul scris. Când creați o alegere condiționată, puteți scrie un bloc imens de echipe și este mai ușor să utilizați macrocomenzii. Ei vor schimba rapid între acțiuni, dacă starea sau neîndeplinirea este îndeplinită.

Când utilizați directive macro-limbă, programatorul primește macrocomenzi de asamblare. Uneori poate fi utilizat pe scară largă și, uneori, caracteristicile sale funcționale sunt reduse la o singură comandă. Prezența lor în cod facilitează lucrul cu ea, o face mai ușor de înțeles și mai vizuală. Cu toate acestea, ar trebui să fie atentă să fie atenți - în unele cazuri, dimpotrivă, agravează situația.



Ți-a plăcut articolul? Împărtășește-l