Componentele de bază ale limbajului de asamblare și structura de instrucție. Comenzi în limbaj de asamblare (Prelegere). La disciplina „Programare sistem”

Informații generale despre limbajul de asamblare

Limbajul de asamblare simbolic poate elimina în mare măsură dezavantajele programării în limbaj mașină.

Principalul său avantaj este că în limbajul de asamblare toate elementele programului sunt prezentate în formă simbolică. Conversia numelor de comenzi simbolice în lor coduri binareîi sunt încredinţate program special- asamblator, care eliberează programatorul de munca intensivă în muncă și elimină erorile inevitabile.

Numele simbolice introduse la programarea în limbaj de asamblare reflectă de obicei semantica programului, iar abrevierea comenzilor reflectă funcția lor principală. De exemplu: PARAM - parametru, TABLE - tabel, MASK - masca, ADD - adunare, SUB - scadere etc. etc. Astfel de nume sunt ușor de reținut pentru un programator.

Pentru programarea în limbaj de asamblare este necesar să aveți instrumente complexe decât pentru programarea în limbaj mașină: aveți nevoie de sisteme informatice bazate pe un microcomputer sau PC cu un set dispozitive periferice(tastatură alfanumerică, afișare de caractere, unitate cu float și dispozitiv de imprimare), precum și sisteme rezidente sau de programare încrucișată pentru tipurile necesare de microprocesoare. Limbajul de asamblare vă permite să scrieți și să depanați eficient programe mult mai complexe decât limbajul mașină (până la 1 - 4 KB).

Limbajele de asamblare sunt orientate către mașină, adică depind de limbajul mașinii și structura microprocesorului corespunzător, deoarece în ele fiecărei instrucțiuni de microprocesor i se atribuie un nume simbolic specific.

Limbajele de asamblare oferă o creștere semnificativă a productivității programatorului în comparație cu limbajele de mașină și, în același timp, păstrează capacitatea de a utiliza toate resursele hardware disponibile de software ale microprocesorului. Acest lucru le permite programatorilor calificați să scrie programe care rulează în mai puțin timp și ocupă mai puțină memorie decât programele scrise într-un limbaj de nivel înalt.

În acest sens, aproape toate programele pentru controlul dispozitivelor de intrare/ieșire (driver) sunt scrise în limbaj de asamblare, în ciuda prezenței unei game destul de mari de limbaje de nivel înalt.

Folosind limbajul de asamblare, programatorul poate seta următorii parametri:

mnemonice (nume simbolic) ale fiecărei comenzi în limbajul mașinii cu microprocesor;

un format standard pentru liniile unui program scris în limbaj de asamblare;

format pentru indicare în diverse moduri variante de adresare și comandă;

format pentru specificarea constantelor și constantelor caracterelor tipul întreg V diverse sisteme calcul;

pseudo-comenzi care controlează procesul de asamblare (traducere) a unui program.

În limbajul de asamblare, un program este scris linie cu linie, adică este alocată o linie pentru fiecare comandă.

Pentru microcalculatoarele construite pe baza celor mai comune tipuri de microprocesoare, pot exista mai multe variante de limbaj de asamblare, dar de obicei una este utilizată pe scară largă în practică - acesta este așa-numitul limbaj de asamblare standard

Programarea la nivelul de instruire al mașinii este nivelul minim la care pot fi scrise programe. Sistemul de instrucțiuni al mașinii trebuie să fie suficient pentru a implementa acțiunile cerute prin emiterea de instrucțiuni către hardware-ul computerului.

Fiecare comandă a mașinii constă din două părți:

· sala de operație - stabilirea „ce trebuie făcut”;

· operand - definirea obiectelor de procesare, „ce să faci cu”.

Comanda mașinii cu microprocesor, scrisă în limbaj de asamblare, este o linie cu următoarea formă sintactică:

etichetă comanda/operanzii directivă ;comentarii

În acest caz, câmpul necesar din linie este o comandă sau o directivă.

Eticheta, comanda/directiva și operanzii (dacă există) sunt separați de cel puțin un spațiu sau un caracter tabulator.

Dacă o comandă sau o directivă trebuie continuată rândul următor, atunci se folosește caracterul backslash: \.

În mod implicit, limbajul de asamblare nu face distincție între litere mari și mici atunci când scrieți comenzi sau directive.

Adresare directă: Adresa efectivă este determinată direct de câmpul offset al instrucțiunii de mașină, care poate avea o dimensiune de 8, 16 sau 32 de biți.

mov eax, sum ; eax = suma

Asamblatorul înlocuiește sum cu adresa corespunzătoare stocată în segmentul de date (adresat implicit de registrul ds) și plasează valoarea stocată la sum în registrul eax.

Adresarea indirectă la rândul său are următoarele tipuri:

· adresare indirectă de bază (registru);

· adresare indirectă de bază (registru) cu offset;

· adresare indirectă la index;

· adresarea indirectă a indexului de bază.

Adresare indirectă de bază (registru). Cu această adresare, adresa efectivă a operandului poate fi în oricare dintre registre scop general, cu excepția sp/esp și bp/ebp (acestea sunt registre specifice pentru lucrul cu segmentul de stivă). Sintactic într-o comandă, acest mod de adresare este exprimat prin includerea numelui registrului între paranteze drepte.

mov eax, ; eax = *esi; *valoarea esi la adresa esi

Programarea la nivelul de instruire al mașinii este nivelul minim la care pot fi scrise programe. Sistemul de instrucțiuni al mașinii trebuie să fie suficient pentru a implementa acțiunile cerute prin emiterea de instrucțiuni către hardware-ul computerului.

Fiecare comandă a mașinii constă din două părți:

  • operațional - stabilirea „ce trebuie făcut”;
  • operand - definirea obiectelor de procesare, „ce să faci cu”.

Comanda mașinii cu microprocesor, scrisă în limbaj de asamblare, este o linie cu următoarea formă sintactică:

etichetă de comandă/directivă operand(i); comentarii

În acest caz, câmpul necesar din linie este o comandă sau o directivă.

Eticheta, comanda/directiva și operanzii (dacă există) sunt separați de cel puțin un spațiu sau un caracter tabulator.

Dacă o comandă sau o directivă trebuie continuată pe linia următoare, se folosește caracterul backslash: \.

În mod implicit, limbajul de asamblare nu face distincție între litere mari și mici atunci când scrieți comenzi sau directive.

Exemple de linii de cod:

Numărați db 1 ;Nume, directivă, un operand
muta eax,0 ;Comandă, doi operanzi
cbw ; Echipă

Etichete

Eticheta în limbaj de asamblare poate conține următoarele simboluri:

  • toate literele alfabetului latin;
  • numere de la 0 la 9;
  • caractere speciale: _, @, $, ?.

Un punct poate fi folosit ca prim caracter al unei etichete, dar unii compilatori nu recomandă utilizarea acestui caracter. Numele de asamblare rezervate (directive, operatori, nume de comenzi) nu pot fi folosite ca etichete.

Primul caracter din etichetă trebuie să fie o literă sau un caracter special (dar nu un număr). Lungimea maximă a etichetei este de 31 de caractere. Toate etichetele care sunt scrise pe o linie care nu conține o directivă de asamblare trebuie să se încheie cu două puncte: .

Echipe

Echipă spune traducătorului ce acțiune ar trebui să efectueze microprocesorul. Într-un segment de date, o comandă (sau o directivă) definește un câmp, un spațiu de lucru sau o constantă. Într-un segment de cod, o comandă specifică o acțiune, cum ar fi mutarea (mutarea) sau adăugarea (adăugarea).

Directive

Asamblatorul are o serie de operatori care vă permit să controlați procesul de asamblare și listare. Acești operatori sunt chemați directive . Ele acționează numai în timpul procesului de asamblare a programului și, spre deosebire de comenzi, nu generează cod de mașină.

Operanzi

Operand – un obiect pe care este executată o comandă de mașină sau o instrucțiune a limbajului de programare.
O instrucțiune poate avea unul sau doi operanzi sau deloc operanzi. Numărul de operanzi este implicit specificat de codul instrucțiunii.
Exemple:

  • Fără operanzi ret ;Return
  • Un operand inc ecx ;Mărire ecx
  • Doi operanzi adaugă eax,12 ;Adăugați 12 la eax

Eticheta, comanda (directiva) și operandul nu trebuie să înceapă de la o anumită poziție din linie. Cu toate acestea, este recomandat să le scrieți într-o coloană pentru a face programul mai ușor de citit.

Operanzii pot fi

  • identificatori;
  • șiruri de caractere cuprinse între ghilimele simple sau duble;
  • numere întregi în sisteme de numere binar, octal, zecimal sau hexazecimal.
Identificatori

Identificatori – secvențe de caractere valide utilizate pentru a desemna obiecte de program, cum ar fi coduri de operare, nume de variabile și nume de etichete.

Reguli pentru înregistrarea identificatorilor.

  • Identificatorul poate consta din unul sau mai multe caractere.
  • Ca simboluri puteți folosi litere din alfabetul latin, cifre și câteva caractere speciale: _, ?, $, @.
  • Un identificator nu poate începe cu un caracter cifră.
  • Lungimea identificatorului poate fi de până la 255 de caractere.
  • Traducătorul acceptă primele 32 de caractere ale identificatorului și ignoră restul.
Comentarii

Comentariile sunt separate de linia executabilă printr-un caracter; . În acest caz, tot ce este scris după punct și virgulă și până la sfârșitul rândului este un comentariu. Utilizarea comentariilor într-un program îmbunătățește claritatea acestuia, mai ales acolo unde scopul unui set de comenzi este neclar. Comentariul poate conține orice caracter imprimabil, inclusiv spații. Un comentariu se poate întinde pe întreaga linie sau poate urma o comandă pe aceeași linie.

Structura programului de asamblare

Un program scris în limbaj de asamblare poate consta din mai multe părți numite module . Fiecare modul poate avea unul sau mai multe segmente de date, stivă și cod definite. Orice program complet de asamblare trebuie să includă un modul principal sau principal de la care începe execuția lui. Un modul poate conține segmente de cod, segmente de date și segmente de stivă, declarate folosind directive corespunzătoare. Înainte de a declara segmente, trebuie să specificați modelul de memorie folosind directiva .MODEL.

Un exemplu de program „nu face nimic” în limbaj de asamblare:

686P
.MODEL PLAT, STDCALL
.DATE
.COD
ÎNCEPUT:

RET
sfârșitul început

Acest program conține o singură comandă de microprocesor. Această comandă este RET. Se asigură că programul se încheie corect. În general, această comandă este folosită pentru a ieși dintr-o procedură.
Restul programului se referă la funcționarea traducătorului.
.686P - Comenzile în mod protejat Pentium 6 (Pentium II) sunt permise. Această directivă selectează setul acceptat de instrucțiuni pentru asamblare, indicând modelul procesorului. Litera P indicată la sfârșitul directivei informează traducătorul că procesorul funcționează în mod protejat.
.MODEL FLAT, stdcall - model de memorie plat. Acest model de memorie este utilizat în sala de operație sistem Windows. stdcall
.DATA este un segment de program care conține date.
.CODE este un bloc de program care conține cod.
START - etichetă. În asamblare, etichetele joacă un rol important, ceea ce nu se poate spune despre limbajele moderne de nivel înalt.
END START - sfârșitul programului și un mesaj către traducător că execuția programului ar trebui să înceapă cu eticheta START.
Fiecare modul trebuie să conțină o directivă END pentru a marca sfârșitul cod sursă programe. Toate liniile care urmează directiva END sunt ignorate. Dacă omiteți directiva END, este generată o eroare.
Eticheta specificată după directiva END îi spune traducătorului numele modulului principal de la care începe execuția programului. Dacă programul conține un singur modul, eticheta de după directiva END poate fi omisă.

Comenzi în limbaj de asamblare (Prelegere)

PLANUL DE PRELEGERE

1. Principalele grupe de operațiuni.

Pentium.

1. Principalele grupe de operațiuni

Microprocesoarele execută un set de comenzi care implementează următoarele grupuri principale de operații:

Operațiuni de expediere

operatii aritmetice,

Operații logice

Operații în schimburi

Operatii de comparare si testare

Operații cu biți

Operațiuni de gestionare a programelor;

Operațiuni de control al procesorului.

2. Codurile mnemonice ale comenzilor procesorului Pentium

La descrierea comenzilor se folosesc de obicei denumirile lor mnemonice (coduri mnemonice), care sunt folosite pentru a specifica comanda la programare în limbaj Asamblare. Pentru diferite versiuni de Assembler, codurile mnemonice ale unor comenzi pot diferi. De exemplu, pentru comanda de a apela o subrutină, se folosește codul mnemonicAPEL sau JSR („Săriți la Subrutină"). Cu toate acestea, codurile mnemonice pentru majoritatea comenzilor pentru principalele tipuri de microprocesoare sunt aceleași sau diferă ușor, deoarece sunt abrevieri ale cuvintelor engleze corespunzătoare care definesc operația care se efectuează. Să ne uităm la codurile mnemonice de comandă adoptate pentru procesoare Pentium.

Redirecționarea comenzilor. Echipa principală a acestui grup este echipaMOV , care asigură transferul de date între două registre sau între un registru și o celulă de memorie. Unele microprocesoare implementează transferuri între două celule de memorie, precum și transferuri în bloc ale conținutului mai multor registre din memorie. De exemplu, microprocesoarele din familia 68 Motorola xxx executa comandaMIŞCARE , oferind transfer de la o celulă de memorie la alta și comandaMOVEM , care scrie în memorie sau încarcă din memorie conținutul unui set specificat de registre (până la 16 registre). EchipăXCHG schimbă reciproc conținutul a două registre de procesor sau un registru și o celulă de memorie.

Comenzi de intrare ÎN și ieșire OUT implementează trimiterea de date de la un registru al procesorului către un dispozitiv extern sau primirea datelor de la un dispozitiv extern către un registru. Aceste comenzi specifică numărul dispozitivului de interfață (port de intrare/ieșire) prin care sunt transferate datele. Rețineți că multe microprocesoare nu au instrucțiuni speciale pentru accesare dispozitive externe. În acest caz, intrarea și ieșirea datelor în sistem se realizează cu ajutorul comenziiMOV , care specifică adresa dispozitivului de interfață necesar. Astfel, dispozitivul extern este adresat ca o celulă de memorie, iar o secțiune specifică este alocată în spațiul de adrese în care se află adresele dispozitivelor de interfață (porturilor) conectate la sistem.

Comenzi pentru operații aritmetice. Principalele comenzi din acest grup sunt adunarea, scăderea, înmulțirea și împărțirea, care au o serie de opțiuni. Comenzi de adăugare ADĂUGA și scăderea SUB efectua operatiile corespunzatoare cucposedat de două registre, un registru și o locație de memorie, sau folosind un operand imediat. Echipe AD C , S.B. B efectuați adunarea și scăderea ținând cont de valoarea atributuluiC, setat la formarea unui transfer în timpul executării operațiunii anterioare. Folosind aceste comenzi, este implementată adăugarea secvențială a operanzilor, al căror număr de biți depășește capacitatea procesorului. Echipă N.E.G. schimbă semnul operandului, transformându-l în complement a doi.

Operațiile de înmulțire și împărțire pot fi efectuate pe numere semnate (comenzieu MUL, eu DIV ) sau nesemnate (comenzi MUL, DIV Unul dintre operanzi este întotdeauna situat într-un registru, al doilea poate fi într-un registru, o celulă de memorie sau poate fi un operand imediat. Rezultatul operațiunii se află în registru. La înmulțire (comenziMUL , IMUL ) rezultatul este biți dublu, pentru care se folosesc două registre. La împărțire (comenziDIV , IDIV ) ca dividend se folosește un operand dublu biți, plasat în două registre, iar ca rezultat, câtul și restul sunt scrise în două registre.

Comenzi de operare logică . Aproape toate microprocesoarele efectuează operații logice ȘI, SAU, SAU exclusiv, care sunt efectuate pe aceiași biți ai operanzilor folosind comenzi ȘI, SAU, X SAU . Operațiile sunt efectuate pe conținutul a două registre, un registru și o locație de memorie, sau folosind un operand imediat. Echipă NU inversează valoarea fiecărui bit al operandului.

Comenzi Shift. Microprocesoarele efectuează deplasări aritmetice, logice și ciclice ale operanzilor adresați cu unul sau mai mulți biți. Operandul de mutat poate fi într-un registru sau într-o locație de memorie, iar numărul de biți de deplasare este specificat de operandul imediat conținut în instrucțiune sau determinat de conținutul registrului specificat. Semnul de transfer este de obicei implicat în implementarea schimbuluiCîn registrul de stare (S.R. sau steaguri), care conține ultimul bit al operandului eliminat din registru sau celula de memorie.

Comenzi de comparare și testare . Compararea operanzilor se face de obicei folosind comandaCMP , care scade operanzi și setează valorile caracteristicilor N, Z, V, Cîn registrul de stare conform rezultatului obţinut. În acest caz, rezultatul scăderii nu este salvat, iar valorile operanzilor nu se modifică. Analiza ulterioară a valorilor caracteristicilor obținute ne permite să stabilim valoare relativă (>, <, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Unele microprocesoare execută comanda de testare TST , care este o versiune cu un singur operand a instrucțiunii de comparare. Când această comandă este executată, semnele sunt setate N, Z conform semnului și valorii (egale sau non-nule) operandului adresat.

Instrucțiuni de operare a biților . Aceste comenzi stabilesc valoarea atributuluiCîn registrul de stare în conformitate cu valoarea bitului testatbn în operandul adresat. În unele microprocesoare, pe baza rezultatului testării biților, atributul este setatZ. Numărul de biți de testareneste specificat fie de conținutul registrului specificat în comandă, fie de operandul imediat.

Comenzile acestui grup implementează diferite opțiuni pentru modificarea bitului testat BT păstrează neschimbată valoarea acestui bit.Comandă B T S post-testul stabilește valoarea bn=1 și comanda B T C - sens bn=0.Echipă B T C inversează valoarea bitului bn după ce îl testează.

Operațiuni de gestionare a programelor. Pentru a controla programul, se utilizează un număr mare de comenzi, printre care se numără:

- comenzi de transfer de control necondiționat;

- comenzi de sărituri condiționate;

- echipe pentru organizarea ciclurilor de programe;

- comenzi de întrerupere;

- comenzi pentru schimbarea atributelor.

Transferul necondiționat al controlului se realizează prin comandăJMP , care se încarcă în contorul de programePCconținut nou care este adresa următoarei comenzi care urmează să fie executată. Această adresă este fie direct specificată în comandăJMP (adresare directă) sau calculată ca sumă a conținutului curentPCși offset-ul specificat în comandă, care este un număr semnat (adresare relativă). DeoarecePCconține adresa următoarei comenzi de program, cea din urmă metodă specifică adresa de salt, decalată față de următoarea adresă cu un număr specificat de octeți. Cu un offset pozitiv, trecerea la comenzile ulterioare ale programului, cu un offset negativ - la cele anterioare.

O subrutină este de asemenea apelată prin transferul necondiționat al controlului folosind comandaAPEL (sau JSR ). Cu toate acestea, în acest caz, înainte de încărcare înPC continut nou care specifica adresa primei comenzi a subrutinei, este necesara salvarea valorii sale curente (adresa comenzii urmatoare) pentru a asigura revenirea la programul principal dupa executarea subrutinei (sau la precedenta subrutine la imbricarea subrutinelor). Comenzile de salt condiționate (ramuri de program) se încarcă înPCconținut nou dacă sunt îndeplinite anumite condiții, care sunt de obicei stabilite în funcție de valoarea curentă a diferitelor atribute din registrul de stare. Dacă condiția nu este îndeplinită, atunci următoarea comandă de program este executată.

Comenzile de control al caracteristicilor oferă scriere - citirea conținutului registrului de stare în care sunt stocate caracteristicile, precum și modificarea valorilor caracteristicilor individuale. De exemplu, procesoarele Pentium implementează comenzile LAHF Şi SAHF , care încarcă octetul mic, care conține semnele, din registrul de stare EFLAG la octetul mic al registrului EAXși umplerea octetului scăzut steaguri din registru E AX.. Echipe CLC, STC efectuați setarea valorilor semnului de transfer CF=0, CF=1 și a comenzii CMC determină inversarea valorii acestui atribut. Deoarece atributele determină fluxul de execuție a programului în timpul tranzițiilor condiționate, comenzile de modificare a atributelor sunt de obicei folosite pentru a controla programul.

Comenzi de control al procesorului . Acest grup include comenzi de oprire, comenzi fără operare și un număr de comenzi care determină modul de funcționare al procesorului sau blocurile sale individuale. EchipăHLT oprește execuția programului și pune procesorul într-o stare de oprire, care este ieșită atunci când este primit un semnal de întrerupere sau de repornire ( Resetare). Echipă NOP Comanda („goală”), care nu determină efectuarea de operațiuni, este utilizată pentru a implementa întârzierile programului sau pentru a umple golurile formate în program.

Echipe speciale CLI, STI interzice și permite deservirea cererilor de întrerupere. În procesoare Pentium pentru aceasta este folosit un bit de control (steagul).DACĂîn registru steaguri.

Multe microprocesoare moderne emit o comandă de identificare care permite utilizatorului sau altor dispozitive să obțină informații despre tipul de procesor utilizat într-un sistem dat. În procesoare Pentuim comanda pentru aceasta este CPUID , timp în care datele necesare despre procesor intră în registre EAXEBXECXEDXși apoi poate fi citit de utilizator sau de sistemul de operare.

În funcție de modurile de operare implementate de procesor și de tipurile specificate de date care sunt prelucrate, setul de comenzi executate poate fi extins semnificativ.

Unele procesoare efectuează operații aritmetice cu numere binare-zecimale sau execută instrucțiuni speciale pentru a corecta rezultatul la procesarea unor astfel de numere. Multe procesoare de înaltă performanță includ FPU - unitate de procesare a numerelor c „virgula flotantă”.

O serie de procesoare moderne implementează procesarea în grup a mai multor numere întregi sau numere c „virgula flotantă” folosind o singură comandă conform principiului SIMD („Instrucțiune unică – Date multiple” ”) - „O comandă – O mulțime de date.” Execuția simultană a operațiunilor pe operanzi multipli îmbunătățește semnificativ performanța procesorului atunci când lucrați cu date video și audio. Astfel de operațiuni sunt utilizate pe scară largă pentru procesarea imaginilor, semnalelor audio și alte aplicații. Pentru a efectua aceste operațiuni, în procesoare au fost introduse blocuri speciale care implementează seturile corespunzătoare de instrucțiuni, care în diferite tipuri de procesoare ( Pentium, Athlon) a primit numeleMMX (“ Milti- Extensie media ”) – Extensie multimedia,SSE(“Streaming SIMD Extension”) – Streaming SIMD - extensie, “3 DExtensie– Expansiune tridimensională.

O trăsătură caracteristică a procesoarelor companiei Intel , începând cu modelul 80286, este controlul prioritar la accesarea memoriei, care este furnizat atunci când procesorul funcționează în modul adrese virtuale protejate - „ Modul protejat ” (mod protejat). Pentru implementarea acestui mod, se folosesc grupuri speciale de comenzi, care servesc la organizarea protecției memoriei în conformitate cu algoritmul de acces prioritar adoptat.

Lucrări de curs

La disciplina „Programare sistem”

Subiectul nr. 4: „Rezolvarea problemelor de procedură”

Opțiunea 2

UNIVERSITATEA DE STAT SIBERIAN DE EST

TEHNOLOGIE ȘI MANAGEMENT

____________________________________________________________________

COLEGIUL DE TEHNOLOGIE

EXERCITA

pentru munca de curs

Disciplina:
Tema: Rezolvarea problemelor privind procedurile
Interpreți: Arina Aleksandrovna Glavinskaya
Șef: Dambaeva Sesegma Viktorovna
Rezumatul lucrării: studiul subrutinelor în limbaj de asamblare,
rezolvarea problemelor folosind subrutine
1. Partea teoretică: Informații de bază despre limbajul asamblare (set
comenzi etc.), Organizarea subrutinelor, Metode de trecere a parametrilor
în subrutine
2. Parte practică: Dezvoltați două subrutine, dintre care una transformă orice literă dată într-o literă mare (inclusiv pentru literele rusești), iar cealaltă transformă o literă într-o literă mică.
convertește orice literă dată în majuscule, iar cealaltă convertește o anumită literă în minuscule.
Convertește o literă în minuscule.
Termenele proiectului conform programului:
1. Partea teoretică - 30% până în săptămâna 7.
2. Partea practică - 70% până în săptămâna 11.
3. Protecție - 100% până în săptămâna 14.
Cerințe de proiectare:
1. Calculul și nota explicativă a proiectului de curs trebuie depuse în
copii electronice și hârtie.
2. Volumul raportului trebuie să fie de cel puțin 20 de pagini dactilografiate, cu excepția anexelor.
3. RPP este întocmit în conformitate cu GOST 7.32-91 și semnat de manager.

director de munca __________________

interpret __________________

Data emiterii " 26 " septembrie 2017 G.


Introducere. 2

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

1.1.1 Set de comenzi. 4

1.2 Organizarea subrutinelor în limbaj asamblare. 4

1.3 Metode de trecere a parametrilor în subrutine. 6

1.3.1 Trecerea parametrilor prin registre.. 6

1.3.2 Transmiterea parametrilor prin stivă. 7

2 SECȚIUNEA PRACTICĂ... 9

2.1 Enunțarea problemei. 9

2.2 Descrierea soluției problemei. 9

2.3 Testarea programului... 7

Concluzie. 8

Referințe.. 9


Introducere

Limbajul de asamblare este notoriu dificil de programat. După cum știți, există multe limbi diferite acum nivel înalt, care vă permit să cheltuiți mult mai puțin efort atunci când scrieți programe. În mod firesc, se pune întrebarea când un programator poate avea nevoie să folosească assembler atunci când scrie programe. În prezent, putem evidenția 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 dependente de mașină, ele controlează, de obicei, diverse dispozitive de calculator (astfel de programe se numesc drivere); Aceste programe de sistem folosesc instrucțiuni speciale ale mașinii care nu trebuie utilizate în mod obișnuit (sau, după cum se spune, aplicat) programe. Aceste comenzi sunt imposibil sau foarte greu de definit într-un limbaj de nivel înalt.

A doua zonă de aplicare a Assembler este legată de optimizarea execuției programului. Foarte des, programele de traducător (compilatoare) din limbi de nivel înalt produc un program de limbaj mașină foarte ineficient. Acest lucru se aplică de obicei programelor de calcul în care de cele mai multe ori se execută o secțiune foarte mică (aproximativ 3-5%) a programului (bucla principală). Pentru a rezolva această problemă, pot fi folosite așa-numitele sisteme de programare multilingve, care permit să fie scrise părți din program în diferite limbi. De obicei, partea principală a programului este scrisă într-un limbaj de programare de nivel înalt (Fortran, Pascal, C etc.), iar secțiunile programului critice în timp sunt scrise în Assembly. Viteza întregului program poate crește semnificativ. Adesea, aceasta este singura modalitate de a face ca programul să producă rezultate într-un timp acceptabil.

Scopul acestui curs este de a obține abilități practice de programare în limbaj de asamblare.

Obiectivele postului:

1. Studierea informațiilor de bază despre limbajul Assembly (structura și componentele unui program Assembly, formatul de comandă, organizarea subrutinelor etc.);

2. Studiați tipurile de operații pe biți, formatul și logica de funcționare a instrucțiunilor logice Assembler;

3. Rezolvarea unei probleme individuale privind utilizarea subrutinelor în limbajul asamblare;

4.. Formulează o concluzie despre munca depusă.

1 SECȚIUNEA TEORETICĂ

Bazele limbajului de asamblare

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

Comenzile din limbajul de asamblare corespund una la una comenzilor procesorului și, de fapt, reprezintă o formă simbolică convenabilă de înregistrare (cod mnemonic) a comenzilor și a argumentelor acestora. Limbajul de asamblare oferă, de asemenea, abstracții de programare de bază: legarea părților programului și a datelor prin etichete și directive denumite simbolic.

Directivele de asamblare vă permit să includeți blocuri de date (descrise explicit sau citite dintr-un fișier) într-un program; repetați un anumit fragment de un anumit număr de ori; compilați fragmentul în funcție de condiție; setați adresa de execuție a unui fragment, modificați valorile etichetelor în timpul procesului de compilare; utilizați definiții macro cu parametri etc.

Avantaje și dezavantaje

· cantitate minimă de cod redundant (folosirea mai puține comenzi și accesări la memorie). Rezultatul este o viteză mai mare și o dimensiune mai mică a programului;

· cantități mari de cod, un număr mare de sarcini mici suplimentare;

· lizibilitate slabă a codului, dificultate de suport (depanare, adăugare de caracteristici);

· dificultatea implementării paradigmelor de programare și a oricăror alte convenții oarecum complexe, complexitatea dezvoltării în comun;

· mai puține biblioteci disponibile, compatibilitatea lor scăzută;

· acces direct la hardware: porturi de intrare/ieșire, registre speciale de procesor;

· „potrivire” maximă pentru platforma dorită (utilizarea instrucțiunilor speciale, caracteristicile tehnice ale hardware-ului);

· neportabilitatea către alte platforme (cu excepția celor compatibile cu binar).

Pe lângă instrucțiuni, un program poate conține directive: comenzi care nu sunt traduse direct în instrucțiuni de mașină, dar controlează funcționarea compilatorului. Setul și sintaxa lor variază semnificativ și depind nu de platforma hardware, ci de compilatorul utilizat (generând dialecte ale limbilor în cadrul aceleiași familii de arhitecturi). Setul de directive include:

· definirea datelor (constantelor și variabilelor);

· managementul organizării programului în memorie și parametrii fișierului de ieșire;

· setarea modului de operare al compilatorului;

· tot felul de abstracții (adică elemente ale limbajelor de nivel înalt) - de la proiectarea procedurilor și funcțiilor (pentru a simplifica implementarea paradigmei de programare procedurală) până la constructe și bucle condiționate (pentru paradigma de programare structurată);

· macrocomenzi.

Set de comenzi

Comenzile tipice din limbajul de asamblare sunt:

· Comenzi de transfer de date (mov, etc.)

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

Operații logice și pe biți (sau, și, xor, shr etc.)

· Comenzi de control al execuției programului (jmp, loop, ret, etc.)

· Comenzi de întrerupere (denumite uneori comenzi de control): int

· Comenzi I/O către porturi (in, out)

Microcontrolerele și microcalculatoarele sunt, de asemenea, caracterizate de comenzi care efectuează verificări și tranziții în funcție de condiții, de exemplu:

· jne - sari daca nu este egal;

· jge - jump dacă este mai mare sau egal cu .

Comenzile pot fi distinse după scop (exemple de coduri de operare mnemonice ale comenzilor de asamblare IBM PC sunt date în paranteze):

l efectuarea de operații aritmetice (ADD și ADC - adunare și adunare cu purtare, SUB și SBB - scădere și scădere cu împrumut, MUL și IMUL - înmulțire fără semn și semn, DIV și IDIV - împărțire fără semn și semn, CMP - comparații etc.);

l efectuarea de operații logice (OR, AND, NOT, XOR, TEST etc.);

l transfer de date (MOV - înainte, XCHG - schimb, IN - intra în microprocesor, OUT - ieșire de la microprocesor etc.);

l transfer de control (ramuri de program: JMP - salt neconditionat, CALL - apel procedura, RET - intoarcere din procedura, J* - salt conditionat, LOOP - control bucla etc.);

l procesarea șirurilor de caractere (MOVS - transferuri, CMPS - comparații, LODS - încărcări, SCAS - scanări. Aceste comenzi sunt de obicei folosite cu prefixul (modificatorul de repetiție) REP;

l întreruperi de program (INT - întreruperi software, INTO - întrerupere condiționată la depășire, IRET - întoarcere de la întrerupere);

l control microprocesor (ST* și CL* - setarea și resetarea steagurilor, HLT - oprire, WAIT - așteptare, NOP - inactiv etc.).

O listă completă a comenzilor de asamblare poate fi găsită în lucrări.

Comenzi de transfer de date

l MOV dst, src - transfer de date (mutare - trimite de la src la dst).

Transferuri: un octet (dacă src și dst sunt în format octet) sau un cuvânt (dacă src și dst sunt în format cuvânt) între registre sau între un registru și memorie și scrie o valoare directă într-un registru sau memorie.

Operanzii dst și src trebuie să aibă același format - octet sau cuvânt.

Src poate fi de următorul tip: r (registru) - registru, m (memorie) - memorie, i (impedanță) - valoare imediată. Dst poate fi de tipul r, m. Nu puteți folosi următorii operanzi într-o singură comandă: rsegm împreună cu i; doi operanzi de tip m şi doi operanzi de tip rsegm). Operandul i poate fi, de asemenea, o expresie simplă:

mov AX, (152 + 101B) / 15

Evaluarea expresiei se efectuează numai în timpul traducerii. Nu schimbă steaguri.

l PUSH src - împingerea unui cuvânt în stivă (push - împinge prin; împingeți pe stiva din src). Plasează conținutul src - orice registru de 16 biți (inclusiv registrul de segment) sau două celule de memorie care conțin un cuvânt de 16 biți - în partea de sus a stivei. Steagurile nu se schimbă;

l POP dst - scoateți un cuvânt din stivă (pop - pop; numărați din stivă la dst). Îndepărtează un cuvânt din partea de sus a stivei și îl plasează în dst - orice registru de 16 biți (inclusiv registrul de segment) sau în două celule de memorie. Steagurile nu se schimbă.