Contacte

Comenzile asamblorului. Informații de bază despre limba de asamblare. Prin disciplină "program de programare a sistemului în limba 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 datelor.
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 operare, 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ă

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 extinde forme de naur Bakusa. 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țional;

­ 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 decretare;

­ 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.

Structuri în limba de asamblare

Am considerat că matricea de mai sus sunt o combinație a aceluiași tip de elemente. Dar adesea în aplicații este necesar să se ia în considerare un set de date de tip diferite ca un singur tip.

Acest lucru este foarte relevant, de exemplu, pentru programele de baze de date, unde este necesar să se lege un set de date de la un alt tip cu un obiect.

De exemplu, am revizuit anterior listarea 4, în care lucrarea a fost efectuată cu o serie de elemente cu trei coadă. Fiecare element, la rândul său, a fost două elemente de diferite tipuri: un câmp contor de un singur octet și un câmp dublu-gunoi, care ar putea avea alte informații necesare pentru depozitare și prelucrare. Dacă cititorul este familiarizat cu unul dintre limbile la nivel înalt, atunci el știe că un astfel de obiect este descris de obicei folosind un tip de date speciale - structuri.

Pentru a spori ușurința utilizării limbajului de asamblare, a introdus, de asemenea, acest tip de date.

A-PRIORY structura - Acesta este un tip de date format dintr-un număr fix de elemente de diferite tipuri.

Pentru a utiliza structurile din program, trebuie să efectuați trei acțiuni:

    A stabilit structura șablonului .

    În sens, acest lucru înseamnă definiția unui nou tip de date, care poate fi utilizat pentru a determina variabilele de acest tip.

    A determina instanță a structurii .

    Această etapă implică inițializarea unei variabile specifice în avans a unei structuri (folosind o șablon).

    Organiza apel la elementele de structură .

Este foarte important să înțelegeți încă de la început, care este diferența dintre descriere Structuri în program și ale acestuia definiție.

Descrie Structura programului înseamnă numai pentru a specifica schema sau modelul său; Memoria nu iese în evidență.

Acest model poate fi considerat doar ca informații pentru traducător despre localizarea câmpurilor și valoarea implicită a acestora.

A determina Structura înseamnă a specifica traducătorul pentru a evidenția memoria și a atribui un nume simbolic acestei zone.

Puteți descrie structura din program o singură dată și puteți determina - de orice număr de ori.

Descriere Structura șablonului

Descrierea șablonului de structură are următoarea sintaxă:

struc._name.

se termină numele structurii

Aici reprezintă secvența directivelor privind descrierea datelor db, dw, dd, dq și dt..

Operanzii lor determină dimensiunea câmpurilor și, dacă este necesar, valorile inițiale. Aceste valori vor fi inițializate de câmpurile corespunzătoare atunci când se determină structura.

După cum am observat deja când descriem șablonul, memoria nu este alocată, deoarece este doar informații pentru traducător.

Locație Șablonul din program poate fi permisal, dar după logica funcționării traducătorului cu o singură trecere, acesta trebuie poziționat înainte de locația în care variabila este determinată cu tipul acestei structuri. Aceasta este, atunci când descrieți în segmentul de date al unei variabile cu un tip de structură, șablonul său trebuie plasat la începutul segmentului de date sau în fața acestuia.

Luați în considerare lucrul cu structuri cu privire la exemplul de modelare a bazei de date privind angajații unor departamente.

Pentru simplitate, pentru a scăpa de problemele de transformare a informațiilor la intrare, suntem de acord că toate domeniile sunt simbolice.

Definim structura înregistrării acestei baze de date cu următorul șablon:

Definirea datelor cu tipul de structură

Pentru a utiliza structura descrisă utilizând un șablon din program, este necesar să se determine variabila cu tipul acestei structuri. Aceasta utilizează următorul proiect de sintaxă:

[Nume variabile] Numele structurii

    numele variabilei - Identificatorul variabilei acestui tip structural.

    Sarcina numelui variabil este opțională. Dacă nu o specificați, zona de memorie în cantitatea de lungimi ale tuturor elementelor structurii va fi pur și simplu alocată.

    lista valorilor - o listă de valori inițiale ale elementelor structurii separate prin virgule închise în paranteze unghiulare.

    Sarcina lui este, de asemenea, opțională.

    Dacă lista nu este listată pe deplin, atunci toate câmpurile structurii pentru această variabilă sunt inițializate de valorile din șablon, dacă acestea sunt specificate.

    Este permisă inițializarea câmpurilor individuale, dar în acest caz câmpurile pierdute ar trebui să fie separate prin virgule. Câmpurile pierdute vor fi inițializate cu valorile din șablonul de structură. Dacă, atunci când determinați o variabilă nouă cu tipul acestei structuri, suntem de acord cu toate valorile câmpurilor din șablonul său (adică setul implicit), atunci trebuie doar să scrieți paranteze de colț.

    De exemplu: victor Worker..

De exemplu, definim mai multe variabile cu tipul descris mai sus.

Metode de lucru cu structura

Ideea introducerii unui tip structural la orice limbă de programare constă în combinarea diferitelor variabile de tip într-un singur obiect.

În limba trebuie să existe un mijloc de accesare a acestor variabile într-o anumită instanță a structurii. Pentru a se referi la echipa pe câmpul unei structuri, este utilizat un operator special - simbol ". "(punct). Se utilizează în următorul design sintactic:

    adresa_morce- identificatorul unei variabile de tip sau expresie structurală în paranteze în conformitate cu regulile sintactice specificate mai jos (figura 1);

    numele PLA_TRAVE. - Numele câmpului din șablonul de structură.

    Acest lucru, de fapt, adresează, mai degrabă, decalajul câmpului de la începutul structurii.

Astfel, operatorul " . "(punct) calculează expresia

Smochin. cinci. Sintaxa expresiei adresei în operatorul care manipulează structura structurii

Vom demonstra pe exemplul structurii pe care le definim muncitor. Unele tehnici de lucru cu structuri.

De exemplu, eliminați în tOPOR. Valorile câmpului cu vârsta. Deoarece vârsta unei persoane capabile este puțin probabil să aibă mai mult de 99 de ani, apoi după plasarea conținutului acestui domeniu simbolic în registru tOPOR. Va fi convenabil să se convertească la o reprezentare binară de către echipă aAD..

Aveți grijă deoarece din cauza principiului stocării datelor "Junior Byte pentru adresă mai mică" Numărul mai vechi de vârstă va fi plasat în al., și cel mai tânăr - în aH..

Pentru a vă ajusta este suficient pentru a utiliza comanda xchg al, ah:

mOV AX, cuvântul PTR Sottr1.age; în AL Vârsta SOTR1

Și puteți și așa:

Lucrările ulterioare cu gama de structuri se efectuează în același mod ca și cu o matrice unidimensională. Există câteva întrebări aici:

Ce să fie cu dimensiunea și cum să organizați indexarea elementelor matricei?

Similar cu alte identificatori definiți în program, traducătorul atribuie numele tipului de structură și numele variabilei cu tipul de structură de atribut tip. Valoarea acestui atribut este dimensiunea octeților implicați în domeniile acestei structuri. Puteți elimina această valoare utilizând operatorul tip.

După ce dimensiunea structurii structurii a devenit cunoscută, indexarea în gama de structuri nu reprezintă o complexitate specială.

De exemplu:

Cum se copiază câmpul de la o structură la câmpul corespunzător al unei alte structuri? Sau cum să efectuați copierea întregii structuri? Să facem o copie de copiere nam. al treilea angajat în domeniu nam. Al cincilea angajat:

mAS_SOTR Worker 10 DUP ()

mOV BX, OFFSET MAS_SOTR

mOV SI (Worker de tip) * 2; Si \u003d 77 * 2

mOV di, (lucrător de tip) * 4; Si \u003d 77 * 4

Mi se pare că meserii programatorului mai devreme sau mai târziu face o persoană să arate ca o gospodină bună. El, ca ea, este în mod constant în căutare, unde să salveze ceva, să taie și să faci un prânz minunat de la un minim de produse. Și dacă reușește, atunci satisfacția morală nu este mai mică decât ea și poate mai mult decât de la prânzul minunat de la gospodină. Gradul acestei satisfacții, mi se pare că depinde de gradul de iubire pentru profesia dvs.

Pe de altă parte, succesul în dezvoltarea de software și hardware relaxe sunt oarecum relaxate și o situație similară cu un proverb binecunoscut despre zbura și un elefant este destul de des observat - pentru rezolvarea unor mici sarcini, mijloacele grele sunt implicate, Eficacitatea cărora, în cazul general, este semnificativă doar implementarea unor proiecte relativ mari.

Prezența în limba următoarelor două tipuri de date se datorează probabil dorinței "hostessului", utilizând eficient zona de lucru a tabelului (RAM) în timpul pregătirii produselor alimentare sau a produselor (date ale programului) .

Echipe de asamblare (prelegere)

Planifică prelegeri

1. Grupuri de bază de operațiuni.

Pentium.

1. Grupuri de bază de operațiuni

Microprocesoarele efectuează un set de echipe care sunt identificate ca partiții de grup de alarmă:

Operațiuni,

Operatori aritmetici

Operații logice

OperațiuneaSwig.

Operațiuni,

Operațiuni de biți

Operațiuni ale programului;

Operațiuni ale procesorului.

2. Module de comandă procesoare Pentium.

Când descrieți comenzile, denumirile lor mnemonice (Mnokodes) sunt utilizate în mod obișnuit, care servesc la sarcina comenzii la programare în limba de asamblare. Pentru diferite versiuni ale asamblorului, unele comenzi pot diferi. De exemplu, pentru comanda de apel a subrutinei utilizează MnemokodeApel sau JSR. ("Sari la Subrutină"). Cu toate acestea, contoarele majorității echipelor pentru tipurile de bază de microprocesoare coincid sau diferă ușor, deoarece acestea sunt abrevieri ale cuvintelor engleze respective care determină operațiunea efectuată. Luați în considerare neconcordanțele comenzilor adoptate pentru procesoarePentium.

Comenzi de expediere. Comanda principală a acestui grup este echipaMov. care oferă transfer de date între două registre sau între registru și celula de memorie. În unele microprocesoare, transportul este implementat între două celule de memorie, precum și transportul de grup a conținutului mai multor registru al memoriei. De exemplu, microprocesoarele familiei 68compania XXX Motorola. Efectuați o comandăMișcare. oferind redirecționarea de la o celulă de memorie la alta și comandăMișcă. care este înregistrată în memorie sau descărcare din memoria de conținut a setului specificat de registre (până la 16 registre). EchipăXchg. Distribuirea reciprocă a conținutului a două registre sau registre de înregistrare și a celulelor de memorie.

Introduceți echipele ÎN. și ieșire Out. Implementați transferul de date din registrul procesorului la dispozitivul extern sau primirea datelor de pe dispozitivul extern în registru. În aceste comenzi, numărul dispozitivului de interfață (portul I / O) este setat prin care datele sunt transmise. Rețineți că multe microprocesoare nu au comenzi speciale pentru a face apel la dispozitivele externe. În acest caz, intrarea și ieșirea datelor din sistem se efectuează utilizând comandaMov. care stabilește adresa dispozitivului de interfață dorit. Astfel, dispozitivul extern este adresat ca celule de memorie și în spațiul de adrese există o anumită partiție în care sunt localizate adresele dispozitivelor de interfață conectate la sistem (porturi).

Comenzi ale operațiunilor aritmetice. Principalul principal din acest grup sunt echipe de adiție, scădere, multiplicare și diviziune, care sunt inteligente. Echipe de adăugare Adăuga. și scăderea Sub. efectuați operațiunile corespunzătoare cuc.obsedați două registre, înregistrări și celule de memorie sau folosind un operand direct. Echipele ANUNȚ C. , Sb. B. Adăugați și scăderea, luând în considerare valoarea caracteristicaC.instalat în formarea transferului în timpul executării operațiunii anterioare. Folosind aceste comenzi, se implementează adăugarea secvențială a operanilor, numărul de descărcări depășește descărcarea procesorului. Echipă Neg. Modifică semnul operand, traducere într-un cod suplimentar.

Operațiile de multiplicare și divizare pot fi efectuate peste numerele cu un semn (echipeI. Mulțumesc I. Div ) sau o instanță (comenzi Mul, Div. ). IdeaReDevexevegistra, al doilea poate fi în registru, celula de memorie sau poate fi operand direct. Rezultatul operației este situat în registru. Când multiplicarea (comenziMulțumesc. , Imul ) Se dovedește rezultatul unui bit dublu, pentru plasarea a căror două registre sunt utilizate. Când se împarte (echipeleDiv , Idiv. ) Operandul de evacuare cu două ori este utilizat ca divizie, plasat în două registre și, ca rezultat, un reziduu privat și reziduu este înregistrat în două registre.

Comenzi ale operațiunilor logice . Aproape toate microprocesoarele produc operațiuni logice sau eliminării sau, care sunt efectuate pe aceleași nume ale operanilor care utilizează comenzi Și, X. Sau. . Operațiunile sunt efectuate pe conținutul a două registre, înregistrări și celule de memorie sau utilizând operandul imediat. Echipă Nu. Inversează valoarea fiecărei descărcări de operand.

Shift echipele. Microprocesoarele sunt efectuate schimbări aritmetice, logice și ciclice ale operanilor adresați la una sau mai multe cifre. Schimbarea operandului poate fi în registru sau celula de memorie, iar numărul de descărcări de deplasare este setat utilizând un operand direct conținut în comandă sau este determinat de conținutul unui registru specificat. În implementarea schimbării participă, de obicei, un semn de transferC. În registrul de stat (Sr.sau Eflags.), în cazul în care există o ultimă descărcare de descărcare de operare, extinsă din registru sau din celula de memorie.

Compară și testați echipele . Compararea operandului este de obicei realizată utilizând comanda.CMP. care îndeplinește scăderea operanilor cu setarea semnelor N, Z, V, C În registrul de stat în conformitate cu rezultatul obținut. În acest caz, rezultatul scăderii nu este salvat, iar valorile operanților nu se schimbă. Analiza ulterioară a valorilor obținute ale semnelor vă permite să determinați valoarea relativă (\u003e,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Unele microprocesoare efectuează comanda de testare TST. care este o versiune cu o singură mână a comenzii de comparație. Când efectuați semne manuale de comandă N, Z. În conformitate cu semnul și semnificația (egală sau nu egală cu zero) a operandului adresabil.

Comenzi de operațiuni de biți . Aceste comenzi produc setarea valorii personajuluiC. În registrul de stat, în conformitate cu valoarea bitului testatbn. în operand adresabil. În unele microprocesoare, pe baza testului bitului, se face o setare de atribute.Z.. Numărul de biți testatn. Setați conținutul specificat în comanda de registru sau operand direct.

Comenzile acestui grup implementează opțiuni diferite pentru a se actualiza. Bt. Salvează valoarea acestui pic neschimbată. Comanda B. T. S. carte poștală stabilește valoarea bn.\u003d 1, și echipa B. T. C. - valoare bn.\u003d 0. Și B. T. C. inversează valoarea BN BN după ce a testat-o.

Operațiuni de gestionare a programului. Pentru a gestiona programul, se utilizează un număr mare de comenzi, dintre care puteți aloca:

- comenzi de control necondiționate;

- echipele de tranziție convenționale;

- comenzi ale ciclurilor de program;

- comenzi de întrerupere;

- comenzi schimbă semnele.

Controlul necondiționat este făcut de o echipăJMP. Ce descărcări la contorul de programePC. Conținut nou, care este adresarea următoarei comenzi fiind executată. Această adresă este fie indicată direct în comandăJMP. (adresarea directă) sau calculată ca sumă a conținutului curentPC. Și a întrebat în echipa de bias, care este un număr cu un semn (adresarea relativă). La fel dePC. Conține adresa următoarei comandă a programului, ultima metodă specifică adresa de tranziție, deplasată în raport cu următoarea adresă la un număr specific de octeți. Cu o compensare pozitivă, se efectuează o tranziție la comenzile de program ulterioare, cu o deplasare negativă - la cea anterioară.

Apelarea subrutinei este de asemenea realizată de gestionarea necondiționată utilizând comandaApel (sau JSR. ). Cu toate acestea, în acest caz, înainte de încărcarePC. Noul conținut care specifică adresa primei comenzi de comandă, trebuie să salvați valoarea curentă (adresa următoarei comenzii) pentru a vă asigura că după executarea subrutinei, acesta este returnat la programul principal (sau la subrutina anterioară la atașarea subrutinelor) . Comenzi de tranziție condiționată (ramuri de program) produc încărcarea înPC. Noul conținut, dacă sunt efectuate anumite condiții, care sunt de obicei setate în conformitate cu valoarea curentă a diferitelor caracteristici din registrul de stare. Dacă starea nu este implementată, se execută următorul program de program.

Comenzile de gestionare sunt furnizate pentru a scrie - Citiți conținutul registrului de stare în care sunt stocate semnele, precum și schimbarea valorilor caracteristicilor individuale. De exemplu, în procesoarele Pentium, comenzile sunt implementate. Lahf. și Sahf. care rulează încărcarea octetului mai tânăr, unde semnele sunt conținute din registrul de stat Eflag. În registrul de octeți de juniori EAX. și umpleți octetul mai tânăr Eflags. din registru E A.X... echipe CLC, STC. Realizați setarea semnelor de transfer cf \u003d 0, cf \u003d 1 și echipa Cmc. Cauze inversarea valorii acestei caracteristici. Deoarece semnele definesc progresul executării programului atunci când tranzițiile condiționate, comenzile de schimbare a semnelor sunt utilizate în mod obișnuit pentru a gestiona programul.

Comenzi ale procesorului . Acest grup include comenzi de defalcare, lipsa operațiunilor și o serie de comenzi care determină modul de funcționare a procesorului sau blocurile sale individuale. EchipăHLT. oprește executarea programului și transferă procesorul în starea de oprire, de la care apare semnalele de întrerupere sau de repornire (Resetare). Echipă Nop. (Comanda "goală"), care nu provoacă nicio operațiune, servește la punerea în aplicare a întârzierilor software sau a completării autorizațiilor formate în program.

Echipe speciale CLI, STI. Interzice și permite serviciul de solicitare de întrerupere. În procesoarePentium. Acest lucru utilizează un bit de control (pavilion)Dacă În registru Eflags..

Multe microprocesoare moderne efectuează comanda de identificare care permite utilizatorului sau a altor dispozitive să obțină informații despre tipul de procesor utilizat în acest sistem. În procesoare Pentuim. Pentru asta servește ca o echipă CPUID. Când se execută datele necesare ale procesorului în registre EAX,EBX,ECX,EDX. Și poate fi apoi citit de către utilizator sau de sistemul de operare.

În funcție de modurile de operare implementate de procesor și de tipurile specificate de date, setul de comenzi executate se poate extinde semnificativ.

Unii procesatori produc operațiuni aritmetice cu numere zecimale binare sau efectuează rezultate speciale ale comenzilor de corecție a rezultatelor în procesarea unor astfel de numere. Multe procesoare de înaltă performanță includFPU. - Unitatea de procesare a număruluic. "Punctul de plutire."

Într-un număr de procesoare moderne, este implementată procesarea mai multor numere întregi sau numerec. "Punct plutitor" cu ajutorul unui principiuSIMD ("Instanță unică - date multiple ") -" O singură comandă este o varietate de date. " Executarea simultană a operațiunilor pe mai multe operande crește semnificativ performanța procesorului atunci când lucrează cu date video și audio. Astfel de operațiuni sunt utilizate pe scară largă pentru a procesa imagini, semnale sonore și alte aplicații. Pentru a efectua aceste operațiuni, blocuri speciale care implementează seturile corespunzătoare de comenzi care sunt introduse în procesoare care sunt în diferite tipuri de procesoare (Pentium, Athlon.) Numele primitMMX. (“ Milti.- Extensie media. ") - Extinderea multimedia,SSE. ("Extensia Simd Simd") - Streaming Simd - expansiune, “3 D.Extensie - Extinderea tridimensională.

Caracteristică caracteristică a procesoarelor companieiIntel. Pornind de la modelul 80286, este controlul prioritar la accesarea memoriei, care este furnizată atunci când procesorul este în exploatarea adreselor virtuale securizate - "Mod protejat. "(Mod protejat). Pentru a implementa acest mod, se utilizează grupuri de comandă speciale care servesc la organizarea protecției memoriei în conformitate cu algoritmul prioritar adoptat.

Structura de comandă în limba de asamblare. Programarea la nivelul comenzilor mașinilor este nivelul minim pe care este posibilă programarea calculatorului. Sistemul de comenzi de mașină ar trebui să fie suficient pentru a pune în aplicare acțiunile necesare, emiterea de instrucțiuni ale mașinii. Fiecare comandă a mașinii este alcătuită din două părți: o operare, definind "ce să facă" și operantul, definind obiecte de procesare, adică ceva "peste ce să facă". Comanda de mașină a microprocesorului, înregistrată în limba de asamblare, este o linie având următoarea formă: comandantul etichetei / operand director (director); Etichetarea comentariilor, comanda / directiva și operand sunt separate de cel puțin un simbol al unui spațiu sau tab. Operandile echipei sunt separate prin virgule.

Structura comenzii în limba de asamblare Comanda de asamblare indică un traducător, care trebuie să efectueze un microprocesor. Directivele Assembler sunt parametrii specificați în textul programului care afectează procesul de asamblare sau proprietățile fișierului de ieșire. Operandul determină valoarea inițială a datelor (în segmentul de date) sau elementele pe care se efectuează comanda (în segmentul de cod). Comanda poate avea unul sau două operanzi sau nu au operanzi. Numărul de operanzi este implicit stabilit de codul de comandă. Dacă comanda sau directiva trebuie să continue pe linia următoare, simbolul "Slash invers" este utilizat: "". În mod implicit, asamblorul nu distinge majuscule și litere mici în scrisorii și directivele de scris. Exemple de directivă și de contorizarea comenzilor DB 1; Denumire, directivă, un MOV EAX, 0 operand; Echipa, doi operanzi

Identificatori - Secvență de caractere admise utilizate pentru a desemna nume variabile și nume de etichete. Identificatorul poate consta din unul sau mai multe dintre următoarele simboluri: toate literele alfabetului latin; numere de la 0 la 9; Specialist: _, @, $,? . Ca primul simbol, eticheta poate fi utilizată. Identificatorii nu pot utiliza numele de asamblare rezervate (directive, operatori, nume de comandă). Primul caracter al identificatorului ar trebui să fie scrisoarea sau specialistul. Lungimea maximă a identificatorului de 255 de caractere, dar traducătorul percepe primele 32, restul ignoră. Toate etichetele care sunt înregistrate într-un șir care nu conțin Directiva Assembler trebuie să se încheie cu colonul ":". Eticheta, comanda (directiva) și operandul nu ar trebui să înceapă neapărat cu nici o poziție specială în șir. Se recomandă înregistrarea acestora în coloană pentru o mai mare ydeteabilitate a programului.

Etichete toate etichetele care sunt scrise într-un rând care nu conțin Directiva Assembler trebuie să se încheie cu colonul ":". Eticheta, comanda (directiva) și operandul nu ar trebui să înceapă neapărat cu nici o poziție specială în șir. Se recomandă înregistrarea acestora în coloană pentru o mai mare ydeteabilitate a programului.

Comentariile care utilizează comentariile din program îmbunătățește claritatea sa, în special în cazul în care atribuirea setului de comandă este de neînțeles. Comentariile încep pe orice linie a modulului sursă din "punctul cu un simbol de virgulă" (;). Toate personajele din dreapta "; "La sfârșitul liniei, sunt un comentariu. Comentariul poate conține caractere tipărite, inclusiv "spațiul". Comentariul poate ocupa întregul șir sau urmați comanda pe aceeași linie.

Structura programului În limba de asamblare Programul scris în limba de asamblare poate consta din mai multe părți, numite module, în fiecare dintre care se pot defini unul sau mai multe segmente de date, stivă și cod. Orice program finalizat în limba de asamblare ar trebui să includă una principală sau cea principală, modulul de la care începe execuția sa. Modulul poate conține segmente software, segmente de date și stive, a declarat utilizând directivele corespunzătoare.

Modele de memorie Înainte de a declara segmente, trebuie să specificați un model de memorie utilizând directiva. Modificator MODIFIER_PAMYTI, CONTRARE_O_SOB, TYPE_OS, Parameter_stell Limba de bază de bază Model: model de memorie Adresarea codului Sistem de operare Codul de operare Codul de alternare Codul și datele Lângă MS-DOS Vizibilă Aproape de MS-DOS, Windows Nici un mediu aproape de MS-Dos, Windows nr Compact în apropiere de MS-DOS, Windows Nr. MS-DOS, Windows Fără imensă MS-DOS, Windows NO lângă Windows 2000, Windows XP, Windows Platoul admisibil lângă NT,

Modele de memorie Modelul mic funcționează numai în aplicații MS-DOS de 16 cifre. În acest model, toate datele și codul sunt situate într-un segment fizic. Dimensiunea fișierului de program în acest caz nu depășește 64 kb. Modelul mic suportă un segment de cod și un segment de date. Datele și codul atunci când utilizați acest model sunt adresate ca aproape (mijlocul). Modelul mediu suportă mai multe segmente de cod de program și un segment de date, în timp ce toate referințele din segmentele de coduri de program implicite sunt considerate lungi (departe), iar legăturile din segmentul de date sunt aproape (aproape). Modelul compact suportă mai multe segmente de date care utilizează abordarea datelor cu rază lungă de acțiune (departe) și un segment de cod cu adresele vecine (aproape). Modelul mare suportă mai multe segmente de cod și mai multe segmente de date. În mod implicit, toate referințele la cod și date sunt considerate lungi (departe). Modelul imens este aproape echivalent cu modelul de memorie mare.

Modele de memorie Modelul plat presupune neconfigurarea programului și este utilizat numai în sisteme de operare de 32 de cifre. Acest model este similar cu modelul mic în sensul că datele și codul sunt postate într-un segment, doar 32 de cifre. Dezvoltarea unui program pentru modelul plat în fața directivei. Modelul plat trebuie plasat una dintre directive :. 386 ,. 486 ,. 586 sau. 686. Alegerea unei directive privind selecția procesorului definește un set de comenzi disponibile la scrierea programelor. Litera P după directiva privind selectarea procesorului înseamnă modul de funcționare protejat. Datele și codurile de adresare a codului sunt învecinate (aproape), în timp ce toate adresele și indicatorii sunt de 32 de cifre.

Model de memorie. Modificatorul Modificator MODIFIER_PAMYTI, TYPE_O_OBLI, TYPE_OS, modificatorul parametrilor parametr_tec utilizat pentru a determina tipurile de segmente și poate lua valori: Utilizare 16 (segmentele modelului selectat sunt utilizate ca 16 biți) (segmentele modelului selectat sunt utilizate ca 32 de milioane ). Parametrul Acord_no_name este utilizat pentru a determina metoda de transmitere a parametrilor la apelarea unei proceduri din alte limbi, inclusiv limbi de nivel înalt (C ++, Pascal). Parametrul poate lua următoarele valori: C, Basic, Fortran, Pascal, Syscall, Stdcall.

Model de memorie. Modificator Modificator MODIFIER_PAMYTI, Acord_O_OBLI, TYPE_OS, Parameter_name Parametru Type_OS este egal cu OS_DOS în mod implicit și, în momentul respectiv, aceasta este singura valoare acceptată a acestui parametru. Parametrul Parameter_set este setat la: Nearstack (Registrul SS este DS, zona de date și stiva sunt plasate în același segment fizic) Farstack (registrul SS nu este egal cu DS, zona de date și stiva sunt plasate în segmente fizice diferite). Implicit este nearstack.

Un exemplu de program de "nimic". 686 P. Model plat, Stdcall. Date. Cod Start: Ret End Start Ret - Microprocessor Echipa. Acesta oferă capătul drept al programului. Restul programului se referă la funcționarea traducătorului. . 686 p - comenzi protejate (Pentium II) sunt permise. Prezenta directivă selectează un set acceptat de comenzi de asamblare, indicând modelul procesorului. . Model plat, Stdcall - model plat de memorie. Acest model de memorie este utilizat în sistemul de operare Windows. STDCall - provocări de procedură utilizate.

Un exemplu de program de "nimic". 686 P. Model plat, Stdcall. Date. Codul Start: Ret End Start. Datele sunt un segment de program care conține date. Acest program nu utilizează stiva, astfel încât segmentul. Stiva lipsește. . Codul este un cod de program care conține cod. Pornirea este o etichetă. End Start este sfârșitul programului și mesajul către compilator că este necesar să începeți să rulați programul de la eticheta de pornire. Fiecare program ar trebui să conțină o directivă de sfârșit care marchează sfârșitul codului sursă al programului. Toate liniile care urmează directivei finale sunt ignorate de eticheta specificată după directiva privind sfârșitul, indicând numele modulului principal din care începe programul. Dacă programul conține un modul, eticheta după directiva final nu poate fi indicată.

Curturile de limbă de asamblare - un program sau mijloace tehnice care efectuează transformarea programului prezentată într-una din limbile de programare în programul de limbă țintă numit codul obiect. Pe lângă susținerea mnemonicii echipelor de mașini, fiecare traducător are propriul set de directive și macroze, adesea cu nimic compatibil. Principalele tipuri de limbi ale limbii de asamblare: Masma (Microsoft Assembler), TASM (Borland Turbo Assembler), FIMM (Assembler Flat) - Asamblarea de multifursare distribuită în mod liber, scrisă de Tomash Hrystar (poloneză), NASM (Netwide Assembler) - Asamblarea gratuită pentru arhitectura Intel X 86 a fost creată de Simon Tham împreună cu Sala Julian și dezvoltă în prezent o mică echipă de dezvoltatori pe sursă. Forja. NET.

Src \u003d "https://present5.com/prezentare/-29367016_6361097/image-15.jpg" ALT \u003d "(! Lang: Programul Living în Microsoft Visual Studio 2005 1) Creați un proiect selectând fișierul -\u003e Meniu nou\u003e Proiect și"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src \u003d "https://present5.com/presentare/-29367016_63610977/image-16.jpg" Alt \u003d "(! Lang: Programul Living în Microsoft Visual Studio 2005 2) în arborele de proiect (Vizualizare-\u003e Solution Explorer)"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Transmiterea programului în Microsoft Visual Studio 2005 3) Selectați tipul de fișier C ++, dar specificați numele cu extensia. ASM:

Transmiterea unui program în Microsoft Visual Studio 2005 5) Setați setările compilatorului. Selectați pe butonul din dreapta din meniul de reguli de construire personalizate ...

Au fost transmise un program în Microsoft Visual Studio 2005 și în SELECT Microsoft Macro Assembler.

Transmiterea unui program în Microsoft Visual Studio 2005 pentru a verifica butonul din dreapta în fișierul Hello. Proprietățile meniului de proiect ASM și instalarea General-\u003e Instrumentul: Microsoft Macro Assembler.

Src \u003d "https://present5.com/presentare/-29367016_6361097/image-22.jpg" Alt \u003d "(! Lang: difuzarea unui program în Microsoft Visual Studio 2005 6) Completați fișierul selectând Build-\u003e Build Bună ziua. PRJ."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Programarea în programul de operare OS Windows OC Windows se bazează pe utilizarea caracteristicilor API (interfața programului de aplicație, adică interfața aplicației software). Cantitatea lor ajunge la 2000. Programul Windows constă în mare măsură din astfel de apeluri. Toate interacțiunile cu dispozitivele externe și resursele sistemului de operare are loc, de regulă, prin astfel de funcții. Sistemul de operare Windows utilizează un model de memorie plat. Adresa oricărei celule de memorie va fi determinată de conținutul unui registru cu 32 de biblioteci. Posibile 3 tipuri de structuri de programe pentru ferestre: dialog (fereastră principală - dialog), consola sau structură provocată, structură clasică (fereastră, cadru).

Apelați funcțiile Windows API în fișierul de ajutor. Orice caracteristică API este prezentată ca tip de tip de tip (FA 1, F 2, FA 3) Tipul de valoare de returnare; FAK - o listă de argumente formale în ordine, de exemplu, int mesaj. Caseta (Hwnd H. WND, LPCTStr Lp. Text, LPCTStr Lp. Caption, UINT U. TIP); Această caracteristică afișează o fereastră cu un mesaj și un buton (sau butoane) de ieșire. Semnificația parametrilor: h. WND este o fereastră de fereastră în care un mesaj de fereastră, va apărea LP. Text - text care va apărea în fereastră, LP. Caption - Text în fereastra de titlu, u. Tip - Tipul ferestrei, În particular, puteți defini numărul de butoane de ieșire.

Apelarea funcțiilor Windows API Int mesaj. Caseta (Hwnd H. WND, LPCTStr Lp. Text, LPCTStr Lp. Caption, UINT U. TIP); Aproape toți parametrii funcțiilor API sunt în realitate 32-numere întregi: HWND - 32 biți Integer, LPCTSTR - Pointer de 32 de biți la șir, UINT - 32-32 - Integer. Este suficient "A" este adesea adăugată la numele funcțiilor pentru a merge la o versiune mai nouă de funcții.

Apelarea funcțiilor Windows API Int mesaj. Caseta (Hwnd H. WND, LPCTStr Lp. Text, LPCTStr Lp. Caption, UINT U. TIP); Când se utilizează Masma, este necesar la sfârșitul numelui pentru a adăuga @n N - numărul de octeți, care ocupă argumentele transmise în stack. Pentru a câștiga funcții API 32, acest număr poate fi definit ca numărul de argumente n înmulțit cu 4 (octeți în fiecare argument): n \u003d 4 * n. Pentru a apela funcția, utilizați comanda de asamblare a apelurilor. În acest caz, toate argumentele de funcții sunt transmise prin intermediul stack-ului (comenzi de împingere). Direcția transferului de argument: stânga la dreapta - partea de jos în sus. Primul va fi plasat pe teancul de argument U. Tip. Apelarea funcției specificate va arăta astfel: mesajul de apel. Cutie. [E-mail protejat]

Apelarea funcțiilor Windows API Int mesaj. Caseta (Hwnd H. WND, LPCTStr Lp. Text, LPCTStr Lp. Caption, UINT U. TIP); Rezultatul executării oricărei funcții API este, de regulă, un număr întreg care revine la Registrul EAX. Directiva offset este o "schimbare în segment", sau, traducerea în conceptul de limbi de nivel înalt, "indicatorul" începutului rândului. Directiva ECH este similară cu #define în limba SI definește o constantă. Directiva externă indică traducătorul că funcția sau identificatorul este externă în ceea ce privește acest modul.

Exemplu de program "Bună ziua tuturor!" . 686 P. Model plat, Stdcall. Stack 4096. DATA MB_OK ECH 0 STR 1 DB "Primul meu program", 0 Str 2 DB "Bună ziua tuturor!", 0 HW DD? Mesaj extern. Cutie. [E-mail protejat]: Aproape. Cod Start: Apăsați MB_OK Push Departe Str 1 Apăsați Str. Str. Apastra HW Mesaj de apel. Cutie. [E-mail protejat] Ret End Start.

Directiva INVOKE Traducătorul lingvistic de masă vă permite să simplificați apelul pentru funcții utilizând funcția de directivă fără macro-free - invocată, parametrul1, parametrul2, ... Nu este nevoie să adăugați @ 16 la apelul funcției; Parametrii sunt înregistrați exact în ordinea în care este descrisă funcția descrisă. Macrificiile de traducător Parametrii sunt plasați pe stivă. Pentru a utiliza Directiva INVOKE, trebuie să aveți o descriere a funcției prototip utilizând Directiva Proto în formularul: mesaj. Cutie. Un proto: DWORD,: DWORD Dacă programul utilizează o varietate de funcții de câștig 32 de API, este recomandabil să utilizați C: Masma 32inCluduser 32. Inc.



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