Základné komponenty jazyka symbolických inštrukcií a štruktúry pokynov. Dátový formát a štruktúra príkazov v assembleri. V disciplíne "Programovanie systému"

Úvod.

Volá sa jazyk, v ktorom je napísaný zdrojový program vchod jazyk a jazyk, do ktorého je preložený na vykonanie procesorom v dňoch voľna jazyk. Proces prevodu vstupného jazyka na výstupný jazyk sa nazýva vysielať. Keďže procesory sú schopné vykonávať programy v binárnom strojovom jazyku, ktorý sa nepoužíva na programovanie, je potrebný preklad všetkých zdrojových programov. Známy dve cesty vysielania: zostavovanie a tlmočenie.

O kompilácia zdrojový program je najskôr kompletne preložený do ekvivalentného programu vo výstupnom jazyku, tzv objekt program a potom vykonaný. Tento proces sa realizuje pomocou špeciálneho programy, volal kompilátor. Kompilátor, pre ktorý je vstupný jazyk symbolickou formou reprezentácie strojového (výstupného) jazyka binárnych kódov, sa nazýva assembler.

O výklady Každý riadok textu v zdrojovom programe je analyzovaný (interpretovaný) a príkaz v ňom špecifikovaný je okamžite vykonaný. Implementácia tejto metódy je poverená tlmočnícky program. Výklad trvá dlho. Aby sa zvýšila jeho efektivita, tlmočník namiesto spracovania každého riadku najskôr prevedie všetky tím reťazce na znaky (

). Vygenerovaná sekvencia symbolov sa používa na vykonávanie funkcií priradených pôvodnému programu.

Jazyk assembleru, o ktorom sa hovorí nižšie, je implementovaný pomocou kompilácie.

Vlastnosti jazyka.

Hlavné vlastnosti assemblera:

● namiesto binárnych kódov jazyk používa symbolické názvy - mnemotechnické pomôcky. Napríklad pre príkaz sčítania (

) používajú sa mnemotechnické pomôcky

Odčítania (

násobenie (

divízie (

atď. Symbolické názvy sa používajú aj na adresovanie pamäťových buniek. Ak chcete programovať v jazyku symbolických inštancií, namiesto binárnych kódov a adries potrebujete poznať iba symbolické názvy, ktoré assembler preloží do binárnych kódov;

každý výrok zodpovedá jeden príkaz stroja(kód), t. j. existuje individuálna zhoda medzi príkazmi stroja a operátormi v programe v jazyku symbolov;

● jazyk poskytuje prístup na všetky predmety a tímov. Jazyky na vysokej úrovni túto schopnosť nemajú. Napríklad jazyk symbolov vám umožňuje kontrolovať bity registra príznakov a jazyk vysokej úrovne (napr.

) túto schopnosť nemá. Všimnite si, že systémové programovacie jazyky (napríklad C) často zaberajú strednú pozíciu. Z hľadiska dostupnosti sú bližšie k jazyku symbolických inštrukcií, ale majú syntax jazyka na vysokej úrovni;

● jazyk symbolických inštancií nie je univerzálny jazyk. Každá špecifická skupina mikroprocesorov má svoj vlastný assembler. Jazyky na vysokej úrovni túto nevýhodu nemajú.

Na rozdiel od jazykov na vysokej úrovni zaberie písanie a ladenie programu v jazyku symbolických inštancií veľa času. Napriek tomu sa jazyk montáže dočkal široké využitie v dôsledku nasledujúcich okolností:

● program napísaný v jazyku symbolických inštancií má výrazne menšiu veľkosť a beží oveľa rýchlejšie ako program napísaný v jazyku vysokej úrovne. Pre niektoré aplikácie hrajú tieto indikátory primárnu úlohu, napríklad mnohé systémové programy(vrátane kompilátorov), programy na kreditných kartách, mobilné telefóny, ovládače zariadení atď.;

● vyžadujú niektoré postupy plný prístup k hardvéru, čo je zvyčajne nemožné urobiť v jazyku na vysokej úrovni. Tento prípad zahŕňa prerušenia a obsluhy prerušení v operačných systémoch, ako aj radiče zariadení vo vstavaných systémoch v reálnom čase.

Vo väčšine programov je len malé percento z celkového kódu zodpovedné za veľké percento času spustenia programu. Typicky je 1% programu zodpovedné za 50% času vykonávania a 10% programu je zodpovedných za 90% času vykonávania. Preto sa na napísanie konkrétneho programu v reálnych podmienkach používa assembler aj jeden z jazykov na vysokej úrovni.

Formát operátora v jazyku symbolických inštrukcií.

Program v assembleri je zoznam príkazov (príkazov, viet), z ktorých každý zaberá samostatný riadok a obsahuje štyri polia: pole označenia, pole operácie, pole operandu a pole komentára. Každé pole má samostatný stĺpec.

Pole štítku.

Pole označenia je priradený stĺpec 1. Označenie je symbolický názov alebo identifikátor, adresy Pamäť. Je potrebné, aby ste mohli:

● vykonať podmienený alebo bezpodmienečný prechod na príkaz;

● získať prístup k miestu, kde sú uložené údaje.

Takéto vyhlásenia sú označené štítkom. Na označenie mena sa používajú (veľké) písmená anglickej abecedy a čísla. Meno musí mať na začiatku písmeno a na konci dvojbodku. Označenie dvojbodky môže byť napísané na samostatný riadok a operačný kód môže byť napísaný na ďalší riadok v stĺpci 2, čo zjednodušuje prácu kompilátora. Neprítomnosť dvojbodky neumožňuje rozlíšiť označenie od kódu operácie, ak sú umiestnené na samostatných riadkoch.

V niektorých verziách jazyka symbolických inštrukcií sú dvojbodky umiestnené iba za štítkami s pokynmi, nie za štítkami s údajmi a dĺžka štítku môže byť obmedzená na 6 alebo 8 znakov.

V poli označenia by nemali byť rovnaké názvy, pretože označenie je spojené s adresami príkazov. Ak počas vykonávania programu nie je potrebné volať príkaz alebo údaje z pamäte, pole označenia zostane prázdne.

Pole operačného kódu.

Toto pole obsahuje mnemotechnický kód pre príkaz alebo pseudopríkaz (pozri nižšie). Mnemotechnický kód príkazu vyberajú vývojári jazyka. V assembleri

mnemotechnická pomôcka sa vyberie na načítanie registra z pamäte

), a na uloženie obsahu registra do pamäte - mnemotechnická pomôcka

). V jazykoch symbolických inštancií

pre obe operácie môžete použiť rovnaký názov, resp

Ak môže byť výber mnemotechnických mien ľubovoľný, potom je potreba použiť dve strojové inštrukcie určená architektúrou procesora

Mnemotechnika registrov závisí aj od verzie assembleru (tabuľka 5.2.1).

Pole operandu.

Tu sa nachádza Ďalšie informácie, potrebné na vykonanie operácie. V poli operand pre príkazy skoku je uvedená adresa, na ktorú je potrebné skok vykonať, ako aj adresy a registre, ktoré sú operandmi pre príkaz stroja. Ako príklad uvádzame operandy, ktoré možno použiť pre 8-bitové procesory

● číselné údaje,

prezentované v rôznych číselných sústavách. Na označenie použitého číselného systému nasleduje za konštantou jedno z latinských písmen: B,

Preto binárne, osmičkové, hexadecimálne, desiatkové číselné sústavy (

Nemusíte to písať). Ak je prvá číslica hexadecimálneho čísla A, B, C,

Potom sa dopredu pridá nevýznamná 0 (nula);

● kódy interných registrov mikroprocesora a pamäťových buniek

M (zdroje alebo príjemcovia informácií) v tvare písmen A, B, C,

M alebo ich adresy v ľubovoľnom číselnom systéme (napríklad 10B - adresa registra

v dvojkovej sústave);

● identifikátory,

pre registračné dvojice lietadiel,

Prvé písmená sú B,

N; pre pár akumulátora a registra funkcií -

; pre počítadlo programov -

;pre ukazovateľ zásobníka -

● štítky označujúce adresy operandov alebo ďalších inštrukcií v podmienke

(ak je splnená podmienka) a bezpodmienečné prechody. Napríklad operand M1 v príkaze

znamená potrebu bezpodmienečného prechodu na príkaz, ktorého adresa v poli označenia je označená identifikátorom M1;

● výrazy,

ktoré sú konštruované prepojením údajov diskutovaných vyššie pomocou aritmetických a logických operátorov. Upozorňujeme, že spôsob rezervácie dátového priestoru závisí od jazykovej verzie. Vývojári assembleru pre

Definujte slovo) a neskôr zadáte Alternatívna možnosť.

ktorý bol od začiatku v jazyku pre spracovateľov

V jazykovej verzii

použité

Definujte konštantu).

Procesory spracovávajú operandy rôznych dĺžok. Aby to definovali, vývojári assembleru urobili rôzne rozhodnutia, napríklad:

Registre II rôznych dĺžok majú rôzne názvy: EAX - na umiestnenie 32-bitových operandov (typ

); AX - pre 16-bit (typ

a AN - pre 8-bit (typ

● pre procesory

Ku každému kódu operácie sa pridávajú prípony: prípona

Pre typ

; prípona „.B“ pre typ

rôzne operačné kódy sa používajú pre operandy rôznych dĺžok, napríklad na načítanie bajtu, polslova (

) a slová do 64-bitového registra pomocou operačných kódov

resp.

Pole komentárov.

Toto pole poskytuje vysvetlenia o akciách programu. Komentáre nemajú vplyv na fungovanie programu a sú určené pre ľudí. Môžu byť potrebné na úpravu programu, ktorý bez takýchto komentárov môže byť úplne nezrozumiteľný aj pre skúsených programátorov. Komentár začína symbolom a používa sa na vysvetlenie a dokumentáciu programov. Začiatočný znak komentára môže byť:

● bodkočiarka (;) v jazykoch pre spracovateľov spoločnosti

Výkričník(!) v jazykoch pre

Každému samostatnému riadku komentára predchádza znak na začiatku.

Pseudopríkazy (smernice).

V assembleri existujú dva hlavné typy príkazov:

základné inštrukcie, ktoré sú ekvivalentom strojového kódu procesora. Tieto príkazy vykonajú všetko spracovanie zamýšľané programom;

pseudopríkazy alebo smernice, navrhnutý tak, aby obsluhoval proces prekladu programu do jazyka kódovej kombinácie. Ako príklad v tabuľke. 5.2.2 ukazuje niektoré pseudopríkazy z assembleru

pre rodinu

.

Pri programovaní nastávajú situácie, keď sa podľa algoritmu musí rovnaký reťazec príkazov opakovať mnohokrát. Ak sa chcete dostať z tejto situácie, môžete:

● napíšte požadovanú postupnosť príkazov vždy, keď sa objaví. Tento prístup vedie k zvýšeniu objemu programu;

● usporiadať túto sekvenciu do procedúry (podprogramu) a v prípade potreby ju vyvolať. Tento výstup má svoje nevýhody: zakaždým, keď musíte vykonať príkaz volania špeciálnej procedúry a príkaz return, ktorý, ak je sekvencia krátka a často používaná, môže výrazne znížiť rýchlosť programu.

Najjednoduchšie a efektívna metóda opakované opakovanie reťazca príkazov pozostáva z použitia makro, ktorý môže byť reprezentovaný ako pseudopríkaz určený na opätovný preklad skupiny príkazov, ktoré sa často nachádzajú v programe.

Makro alebo makropríkaz charakterizujú tri aspekty: makrodefinícia, makroinverzia a makroextenzia.

Definícia makra

Ide o označenie pre opakovane sa opakujúci sled príkazov programu, ktorý sa používa pre odkazy v texte programu.

Definícia makra má nasledujúcu štruktúru:

Zoznam výrazov; Definícia makra

V danej štruktúre makrodefinície možno rozlíšiť tri časti:

● názov

makro vrátane názvu

Pseudopríkaz

a súbor parametrov;

● označené bodkami telo makro;

● tím

promócie

makro definície.

Sada parametrov definície makra obsahuje zoznam všetkých parametrov uvedených v poli operand pre vybranú skupinu inštrukcií. Ak boli tieto parametre uvedené skôr v programe, nie je potrebné ich uvádzať v hlavičke definície makra.

Na opätovné zostavenie vybranej skupiny príkazov sa používa výzva pozostávajúca z názvu

makro príkazy a zoznam parametrov s inými hodnotami.

Keď assembler počas procesu kompilácie narazí na definíciu makra, uloží ju do tabuľky definícií makier. Pri ďalších vystúpeniach v programe mena (

) makra, assembler ho nahradí telom makra.

Zavolá sa použitie názvu makra ako operačného kódu makro-zvrat(volanie makra) a jeho nahradenie telom makra - makro expanzia.

Ak je program reprezentovaný ako postupnosť znakov (písmená, čísla, medzery, interpunkčné znamienka a návraty vozíka na presun na nový riadok), potom rozšírenie makra pozostáva z nahradenia niektorých reťazcov z tejto postupnosti inými reťazcami.

Rozšírenie makra nastáva počas procesu zostavovania, nie počas vykonávania programu. Sú priradené metódy na manipuláciu s reťazcami znakov makro znamená.

Proces montáže sa vykonáva v dvoch prechodoch:

● Pri prvom prechode sa zachovajú všetky definície makier a rozšíria sa volania makier. V tomto prípade sa pôvodný program načíta a skonvertuje na program, v ktorom sa odstránia všetky definície makra a každé volanie makra sa nahradí telom makra;

● druhý prechod spracuje výsledný program bez makier.

Makrá s parametrami.

Na prácu s opakovanými sekvenciami príkazov, ktorých parametre môžu mať rôzne hodnoty, sú poskytnuté definície makier:

● s skutočné parametre, ktoré sú umiestnené v poli operandu volania makra;

● s formálne parametre. Počas expanzie makra je každý formálny parameter v tele makra nahradený zodpovedajúcim skutočným parametrom.

pomocou makier s parametrami.

Program 1 obsahuje dve podobné sekvencie príkazov, ktoré sa líšia tým, že prvý zamieňa P a

A druhý

Program 2 obsahuje makro s dvoma formálnymi parametrami P1 a P2. Počas rozšírenia makra je každý znak P1 v tele makra nahradený prvým skutočným parametrom (P,

) a symbol P2 je nahradený druhým skutočným parametrom (

) z programu č. 1. Vo volaní makra

program 2 je označený: P,

Prvý skutočný parameter,

Druhý skutočný parameter.

Program 1

Program 2

MOV EBX,Q MOV EAX, Pl

MOV Q, EAX MOV EBX, P2

MOV P, EBX MOV P2, EAX

Rozšírené schopnosti.

Pozrime sa na niektoré pokročilé jazykové funkcie

Ak sa makro obsahujúce príkaz podmieneného skoku a označenie, na ktoré sa má preskočiť, zavolá dvakrát alebo viackrát, označenie sa duplikuje (problém duplicitného označenia), čo spôsobí chybu. Každému volaniu je preto ako parameter priradený samostatný štítok (programátorom). V jazyku

označenie je deklarované ako miestne (

) a vďaka pokročilým schopnostiam assembler automaticky vygeneruje iný štítok pri každom rozšírení makra.

umožňuje definovať makrá v rámci iných makier. Táto pokročilá funkcia je veľmi užitočná v kombinácii s podmieneným prepojením programu. Uvažujme

AK VEĽKOSŤ GT 16 M2 MACRO

Makro M2 je možné definovať v oboch častiach výpisu

Definícia však závisí od toho, na ktorom procesore je program zostavený: 16-bitový alebo 32-bitový. Ak sa M1 nezavolá, makro M2 nebude definované vôbec.

Ďalšou pokročilou funkciou je, že makrá môžu volať iné makrá vrátane seba - rekurzívne hovor. V druhom prípade, aby sa zabránilo nekonečnej slučke, makro si musí odovzdať parameter, ktorý sa mení s každou expanziou, a tiež skontrolovať tento parameter a ukončiť rekurziu, keď parameter dosiahne určitú hodnotu.

O použití makro prostriedkov v assembleri.

Pri používaní makier musí byť assembler schopný vykonávať dve funkcie: uložiť definície makier A rozšíriť makrovýzvy.

Ukladanie definícií makier.

Všetky názvy makier sú uložené v tabuľke. Každý názov je sprevádzaný ukazovateľom na príslušné makro, aby ho bolo možné v prípade potreby zavolať. Niektoré assemblery majú samostatnú tabuľku pre názvy makier, iné majú všeobecnú tabuľku, v ktorej sú spolu s názvami makier umiestnené všetky strojové inštrukcie a direktívy.

Pri stretnutí s makro počas montáže je vytvorený:

nový prvok tabuľky s názvom makra, počtom parametrov a ukazovateľom na ďalšiu tabuľku definície makra, kde bude uložené telo makra;

● zoznam formálne parametre.

Telo makra, ktoré je jednoducho reťazcom znakov, sa potom načíta a uloží do tabuľky definícií makra. Formálne parametre vyskytujúce sa v tele slučky sú označené zvláštny charakter.

Interná reprezentácia makra

z vyššie uvedeného príkladu pre program 2 (s. 244) je:

MOV EAX, MOV EBX, MOV MOV a

kde sa bodkočiarka používa ako znak návratu vozíka a ampersand & sa používa ako znak formálneho parametra.

Rozšírenie volaní makier.

Kedykoľvek sa počas zostavovania vyskytne definícia makra, uloží sa do tabuľky makier. Keď sa volá makro, assembler dočasne zastaví čítanie vstupných údajov zo vstupného zariadenia a začne čítať uložené telo makra. Formálne parametre extrahované z tela makra sú nahradené skutočnými parametrami a poskytnuté volaním. Parametre ampersand & before umožňujú assembleru ich rozpoznať.

Napriek tomu, že existuje veľa verzií assembleru, procesy montáže majú spoločné črty a sú si v mnohom podobné. Činnosť dvojpriechodového assemblera je diskutovaná nižšie.

Dvojpriechodový assembler.

Program pozostáva z niekoľkých príkazov. Preto by sa zdalo, že pri montáži môžete použiť nasledujúcu postupnosť akcií:

● preložiť ho do strojového jazyka;

● preniesť výsledný strojový kód do súboru a zodpovedajúcu časť výpisu do iného súboru;

● opakujte uvedené postupy, kým sa nepreloží celý program.

Tento prístup však nie je účinný. Príkladom je problém tzv odkaz ďalej. Ak je prvý príkaz skokom na príkaz P, ktorý sa nachádza na samom konci programu, potom ho assembler nedokáže preložiť. Najprv musí určiť adresu operátora P a na to musí prečítať celý program. Zavolá sa každé úplné čítanie zdrojového programu priechod. Ukážme si, ako môžete vyriešiť problém s predbežným odkazom pomocou dvoch prechodov:

pri prvom prechode by ste mali zbierať a uložiť všetky definície symbolov (vrátane štítkov) do tabuľky a pri druhom prechode prečítať a zostaviť každý operátor. Táto metóda je relatívne jednoduchá, ale druhý prechod pôvodným programom vyžaduje dodatočný čas strávený vstupno-výstupnými operáciami;

● pri prvom prechode by ste mali konvertovať program do prechodnej formy a uložte ho do tabuľky a druhý prechod vykonajte nie podľa pôvodného programu, ale podľa tabuľky. Tento spôsob montáže šetrí čas, pretože druhý prechod nevykonáva I/O operácie.

Prvý prechod.

Gól z prvej prihrávky- zostaviť tabuľku symbolov. Ako je uvedené vyššie, ďalším cieľom prvého prechodu je zachovať všetky definície makier a rozšíriť volania tak, ako sa objavia. V dôsledku toho sa definícia symbolu aj rozšírenie makra vyskytujú v jednom priechode. Symbol môže byť buď štítok, alebo význam, ku ktorému je priradené konkrétne meno pomocou direktívy -you:

;Hodnota - veľkosť vyrovnávacej pamäte

Priradením významu symbolickým menám v poli označenia príkazu, assembler v podstate špecifikuje adresy, ktoré bude mať každý príkaz počas vykonávania programu. Na tento účel montážnik počas procesu montáže ukladá počítadlo adries inštrukcie(

) ako špeciálna premenná. Na začiatku prvého prechodu sa hodnota špeciálnej premennej nastaví na 0 a po každom spracovanom príkaze sa zvýši o dĺžku tohto príkazu. Ako príklad v tabuľke. 5.2.3 ukazuje fragment programu označujúci dĺžku príkazov a hodnoty počítadla. Pri prvom prechode sa vygenerujú tabuľky symbolické mená, smernice A operačné kódy, a ak je to potrebné doslovný tabuľky. Literál je konštanta, pre ktorú assembler automaticky rezervuje pamäť. Hneď si všimnime, že moderné procesory obsahujú inštrukcie s okamžitými adresami, takže ich assemblery nepodporujú literály.

Tabuľka názvov symbolov

obsahuje jeden prvok pre každý názov (tabuľka 5.2.4). Každý prvok tabuľky symbolických mien obsahuje samotný názov (alebo ukazovateľ naň), jeho číselnú hodnotu a niekedy aj niektoré ďalšie informácie, ktoré môžu zahŕňať:

● dĺžka dátového poľa spojeného so symbolom;

● bity prerozdelenia pamäte (ktoré označujú, či sa hodnota symbolu zmení, ak je program načítaný na inej adrese, ako zamýšľal assembler);

● informácie o tom, či je symbol prístupný mimo procedúry.

Symbolické mená sú štítky. Môžu byť špecifikované pomocou operátorov (napr.

Tabuľka smernice.

Táto tabuľka uvádza všetky direktívy alebo pseudopríkazy, ktoré sa vyskytujú pri zostavovaní programu.

Tabuľka prevádzkových kódov.

Pre každý kód operácie má tabuľka samostatné stĺpce: označenie kódu operácie, operand 1, operand 2, hexadecimálna hodnota kódu operácie, dĺžka príkazu a typ príkazu (tabuľka 5.2.5). Operačné kódy sú rozdelené do skupín v závislosti od počtu a typu operandov. Typ príkazu určuje číslo skupiny a špecifikuje procedúru, ktorá sa volá na spracovanie všetkých príkazov v tejto skupine.

Druhý prechod.

Gól druhej prihrávky- vytvorenie objektového programu a v prípade potreby tlač montážneho protokolu; výstupné informácie potrebné na to, aby linker prepojil procedúry, ktoré boli zostavené v rôznych časoch, do jedného spustiteľného súboru.

V druhom prechode (rovnako ako v prvom) sa riadky obsahujúce príkazy čítajú a spracovávajú jeden po druhom. Pôvodný operátor a z neho odvodený operátor výstupu v šestnástkovej sústave objekt Kód je možné vytlačiť alebo umiestniť do vyrovnávacej pamäte pre neskoršiu tlač. Po vynulovaní počítadla adries príkazu sa príkaz vyvolá ďalšie vyhlásenie.

Zdrojový program môže obsahovať chyby, napríklad:

daný symbol nie je definovaný alebo je definovaný viackrát;

● operačný kód je reprezentovaný neplatným názvom (v dôsledku preklepu), nemá dostatok operandov alebo má príliš veľa operandov;

● žiadny operátor

Niektoré assemblery dokážu rozpoznať nedefinovaný symbol a nahradiť ho. Vo väčšine prípadov, keď narazí na chybové vyhlásenie, assembler zobrazí na obrazovke chybové hlásenie a pokúsi sa pokračovať v procese zostavovania.

Články venované assembleru.

NÁRODNÁ UNIVERZITA UZBEKISTAN POMENOVANÁ PO MIRZO ULUGBEK

FAKULTA POČÍTAČOVEJ TECHNIKY

K téme: Sémantická analýza súboru EXE.

Dokončené:

Taškent 2003.

Predslov.

Jazyk zhromaždenia a štruktúra príkazov.

Štruktúra súboru EXE (sémantická analýza).

Štruktúra súboru COM.

Princíp pôsobenia a šírenia vírusu.

Disassembler.

programy.

Predslov

Profesia programátora je úžasná a jedinečná. V dnešnej dobe je nemožné si predstaviť vedu a život bez najnovších technológií. Všetko, čo súvisí s ľudskou činnosťou, sa nezaobíde počítačová technológia. A to prispieva k jeho vysokému rozvoju a dokonalosti. Hoci vývoj osobných počítačov nezačal nie tak dávno, počas tejto doby sa v softvérových produktoch urobili kolosálne kroky a tieto produkty budú ešte dlho široko používané. Oblasť počítačových znalostí prešla explóziou, rovnako ako zodpovedajúca technológia. Ak neberieme do úvahy komerčnú stránku, môžeme povedať, že v tejto oblasti profesionálnej činnosti nie sú žiadni cudzinci. Mnoho ľudí nevyvíja programy pre zisk alebo príjem, ale z vlastnej slobodnej vôle, z vášne. To by samozrejme nemalo mať vplyv na kvalitu programu a v tomto biznise takpovediac existuje konkurencia a dopyt po kvalitnom prevedení, stabilnej práci a splnení všetkých moderných požiadaviek. Tu stojí za povšimnutie aj výskyt mikroprocesorov v 60. rokoch, ktoré prišli nahradiť veľké množstvo lampových zostáv. Existuje niekoľko typov mikroprocesorov, ktoré sa navzájom veľmi líšia. Tieto mikroprocesory sa navzájom líšia bitovou hĺbkou a zabudovanými systémovými príkazmi. Najbežnejšie sú: Intel, IBM, Celeron, AMD atď. Všetky tieto procesory súvisia s pokročilou architektúrou procesorov Intel. Rozšírenie mikropočítačov spôsobilo prehodnotenie postojov k jazyku symbolických inštancií z dvoch hlavných dôvodov. Po prvé, programy napísané v jazyku symbolických inštancií vyžadujú podstatne menej pamäte a času vykonávania. Po druhé, znalosť jazyka symbolických adries a výsledného strojového kódu umožňuje porozumieť architektúre stroja, čo je pri práci v jazyku vysokej úrovne nepravdepodobné. Hoci väčšina softvérových profesionálov vyvíja v jazykoch vysokej úrovne, ako sú Pascal, C alebo Delphi, čo je jednoduchšie pri písaní programov, najvýkonnejšie a najúčinnejšie softvér napísané úplne alebo čiastočne v jazyku symbolických inštancií. Jazyky na vysokej úrovni boli navrhnuté tak, aby sa vyhli špeciálnym technické vlastnosti konkrétne počítače. A assembler je zasa navrhnutý pre špecifické špecifiká procesora. Preto, aby ste mohli napísať program v assembleri pre konkrétny počítač, musíte poznať jeho architektúru. V týchto dňoch pohľad na hlavné softvérový produkt je súbor EXE. Berúc do úvahy pozitívne stránky To znamená, že autor programu si môže byť istý jeho integritou. Ale často to tak ani zďaleka nie je. Je tam aj rozoberačka. Pomocou disassemblera môžete zistiť prerušenia a programové kódy. Pre človeka, ktorý sa dobre orientuje v assembleri, nebude ťažké prerobiť si celý program podľa svojho vkusu. Možno práve tu vzniká najneriešiteľnejší problém – vírus. Prečo ľudia píšu vírus? Niektorí sa pýtajú s prekvapením, niektorí s hnevom, no napriek tomu sa stále nájdu ľudia, ktorých táto úloha zaujíma nie z hľadiska spôsobenia škody, ale ako záujem o programovanie systému. Vírusy píšu rôzne dôvody. Niekomu sa páčia systémové volania, iní si zlepšujú znalosti o assembleri. Toto všetko sa pokúsim vysvetliť vo svojom práca v kurze. Hovorí to nielen o štruktúre súboru EXE, ale aj o jazyku symbolických inštrukcií.

^ Jazyk symbolických správ.

Je zaujímavé sledovať od čias objavenia sa prvých počítačov až po súčasnosť premenu predstáv programátorov o assembleri.

Kedysi bolo zostavovanie jazykom, bez ktorého by počítač nemohol robiť nič užitočné. Postupne sa situácia zmenila. Objavili sa pohodlnejšie prostriedky na komunikáciu s počítačom. Na rozdiel od iných jazykov však assembler nezomrel, navyše to v zásade nedokázal. prečo? Pri hľadaní odpovede sa pokúsme pochopiť, čo je jazyk symbolických inštancií vo všeobecnosti.

Stručne povedané, jazyk symbolických inštancií je symbolickým znázornením strojového jazyka. Všetky procesy v stroji na najnižšej hardvérovej úrovni sú riadené iba príkazmi strojového jazyka (inštrukciami). Z toho je zrejmé, že napriek zaužívanému názvu je jazyk symbolických inštrukcií pre každý typ počítača odlišný. To platí tiež vzhľad programy napísané v assembleri a myšlienky, ktorých je tento jazyk odrazom.

Bez znalosti asembleru je nemožné skutočne vyriešiť problémy súvisiace s hardvérom (alebo dokonca závislé od hardvéru, ako je zvýšenie rýchlosti programu).

Programátor alebo akýkoľvek iný používateľ môže použiť akékoľvek nástroje na vysokej úrovni, dokonca aj programy na vytváranie virtuálnych svetov, a možno ani netuší, že v skutočnosti počítač nevykonáva príkazy jazyka, v ktorom je jeho program napísaný, ale ich transformovanú reprezentáciu. v podobe nudných a otrepaných sekvencií príkazov z úplne iného jazyka – strojového jazyka. Teraz si predstavme, že takýto používateľ má neštandardný problém alebo niečo nefunguje. Jeho program musí napríklad pracovať s nejakým neobvyklým zariadením alebo vykonávať iné činnosti, ktoré si vyžadujú znalosť princípov fungovania počítačového hardvéru. Bez ohľadu na to, aký šikovný je programátor, bez ohľadu na to, aký dobrý je jazyk, v ktorom napísal svoj úžasný program, bez znalosti assembleru sa nezaobíde. A nie je náhoda, že takmer všetky kompilátory jazykov na vysokej úrovni obsahujú prostriedky na prepojenie svojich modulov s modulmi assembleru alebo podporujú prístup k programovacej úrovni zostavy.

Samozrejme, doba počítačových generalistov už pominula. Ako sa hovorí, nesmieš objať nesmiernosť. Ale je tu niečo spoločné, akýsi základ, na ktorom je postavené každé seriózne počítačové vzdelávanie. Ide o poznatky o princípoch fungovania počítača, jeho architektúre a jazyku symbolických inštrukcií ako odraz a stelesnenie týchto poznatkov.

Typický moderný počítač (založený na i486 alebo Pentiu) pozostáva z nasledujúcich komponentov (obrázok 1).

Ryža. 1. Počítač a periférií

Ryža. 2. Bloková schéma osobný počítač

Z obrázku (obrázok 1) je zrejmé, že počítač je tvorený niekoľkými fyzickými zariadeniami, z ktorých každé je pripojené k jednej jednotke, nazývanej systémová jednotka. Ak uvažujeme logicky, je jasné, že plní úlohu akéhosi koordinačného zariadenia. Pozrime sa do systémovej jednotky (netreba sa pokúšať dostať do monitora - nie je tam nič zaujímavé a okrem toho je to nebezpečné): otvorte puzdro a pozrite si nejaké dosky, bloky, spojovacie vodiče. Aby sme pochopili ich funkčný účel, pozrime sa na blokovú schému typického počítača (obr. 2). Nenárokuje si absolútnu presnosť a má len ukázať účel, prepojenie a typické zloženie prvkov moderného osobného počítača.

Poďme diskutovať o diagrame na obr. 2 v trochu netradičnom štýle.
Je bežné, že človek pri stretnutí s niečím novým hľadá nejaké asociácie, ktoré mu môžu pomôcť pochopiť nepoznané. Aké asociácie vyvoláva počítač? Napríklad počítač si často spájam so samotným človekom. prečo?

Keď človek vytvoril počítač, niekde hlboko v sebe si myslel, že vytvára niečo podobné ako on. Počítač má orgány na prijímanie informácií z vonkajšieho sveta – klávesnicu, myš a magnetické disky. Na obr. 2 sú tieto orgány umiestnené napravo od systémových zberníc. Počítač má orgány, ktoré „strávia“ prijaté informácie - to sú CPU a RAM. A nakoniec, počítač má rečové orgány, ktoré produkujú výsledky spracovania. Toto sú tiež niektoré zariadenia na pravej strane.

Moderné počítače, samozrejme, má od človeka ďaleko. Možno ich prirovnať k tvorom, ktoré interagujú s vonkajším svetom na úrovni veľkého, ale obmedzeného súboru nepodmienených reflexov.
Tento súbor reflexov tvorí systém strojových príkazov. Bez ohľadu na to, na akej vysokej úrovni komunikujete s počítačom, v konečnom dôsledku ide o nudnú a monotónnu sekvenciu strojových príkazov.
Každý príkaz stroja je akýmsi stimulom na vybudenie jedného alebo druhého nepodmieneného reflexu. Reakcia na tento podnet je vždy jednoznačná a „napevno“ naprogramovaná v mikropríkazovom bloku vo forme mikroprogramu. Tento mikroprogram implementuje akcie na implementáciu príkazu stroja, ale na úrovni signálov dodávaných určitým logika počítač, čím riadi rôzne podsystémy počítača. Ide o takzvaný princíp mikroprogramového riadenia.

Pokračujeme v analógii s človekom a poznamenávame: na to, aby počítač správne žral, bolo vynájdených mnoho operačných systémov, kompilátorov pre stovky programovacích jazykov atď.. Ale všetky sú v skutočnosti len tanierom jedlo (programy) sa dodáva podľa určitých pravidiel.žalúdok (počítač). Iba žalúdok počítača miluje diétu, monotónne jedlo – dajte mu štruktúrované informácie, v podobe prísne organizovaných sekvencií núl a jednotiek, ktorých kombinácie tvoria strojový jazyk.

Počítač teda, hoci navonok polyglot, rozumie len jednému jazyku – jazyku strojových inštrukcií. Samozrejme, na komunikáciu a prácu s počítačom nie je potrebné poznať tento jazyk, ale takmer každý profesionálny programátor skôr či neskôr čelí potrebe ho študovať. Našťastie sa programátor nemusí snažiť pochopiť význam rôznych kombinácií binárnych čísel, pretože už v 50-tych rokoch začali programátori používať na programovanie symbolický analóg strojového jazyka, ktorý sa nazýval assembler. Tento jazyk presne odráža všetky vlastnosti strojového jazyka. To je dôvod, prečo je jazyk symbolických inštrukcií na rozdiel od jazykov na vysokej úrovni pre každý typ počítača odlišný.

Zo všetkého vyššie uvedeného môžeme konštatovať, že keďže je assembler pre počítač „natívny“, najefektívnejší program možno napísať iba v ňom (za predpokladu, že ho napíše kvalifikovaný programátor). Je tu jedno malé „ale“: ide o proces veľmi náročný na prácu, ktorý si vyžaduje veľa pozornosti a praktických skúseností. Preto v skutočnosti píšu hlavne programy v assembleri, ktorý by mal poskytovať efektívnu prácu s hardvérom. Niekedy sú časti programu, ktoré sú kritické z hľadiska času vykonávania alebo spotreby pamäte, napísané v assembleri. Následne sú formalizované vo forme podprogramov a kombinované s kódom v jazyku vysokej úrovne.

Začať sa učiť jazyk symbolických inštancií akéhokoľvek počítača má zmysel až po zistení, ktorá časť počítača zostáva viditeľná a prístupná pre programovanie v tomto jazyku. Toto je takzvaný počítačový programový model, ktorého súčasťou je mikroprocesorový programový model, ktorý obsahuje 32 registrov, v tej či onej miere, dostupných na použitie programátorom.

Tieto registre možno rozdeliť do dvoch veľkých skupín:

^ 16 registrov užívateľov;

16 systémových registrov.

Programy v assembleri využívajú registre veľmi intenzívne. Väčšina registrov má špecifický funkčný účel.

Ako už názov napovedá, užívateľské registre sa nazývajú užívateľské registre, pretože ich programátor môže použiť pri písaní svojich programov. Tieto registre zahŕňajú (obr. 3):

Osem 32-bitových registrov, ktoré môžu programátori použiť na ukladanie údajov a adries (nazývané aj všeobecné registre (GPR)):

šesť segmentových registrov: cs, ds, ss, es, fs, gs;

stavové a riadiace registre:

Vlajky registrujú vlajky/vlajky;

Register ukazovateľa príkazu eip/ip.

Ryža. 3. Užívateľské registre mikroprocesorov i486 a Pentium

Prečo sú mnohé z týchto registrov zobrazené s lomkami? Nie, nejde o rozdielne registre – sú to časti jedného veľkého 32-bitového registra. Môžu byť použité v programe ako samostatné objekty. Bolo to urobené s cieľom zabezpečiť funkčnosť programov napísaných pre mladšie 16-bitové modely mikroprocesorov Intel, počnúc i8086. Mikroprocesory i486 a Pentium majú väčšinou 32-bitové registre. Ich počet, s výnimkou segmentových registrov, je rovnaký ako u i8086, no rozmer je väčší, čo sa odráža aj na ich označeniach – majú
predpona e (rozšírená).

^ Univerzálne registre
Všetky registre v tejto skupine umožňujú prístup do ich „dolných“ častí (pozri obr. 3). Pri pohľade na tento obrázok si všimnite, že iba spodné 16- a 8-bitové časti týchto registrov môžu byť použité na samoadresovanie. Horných 16 bitov týchto registrov nie je dostupných ako nezávislé objekty. Bolo to urobené, ako sme uviedli vyššie, kvôli kompatibilite s mladšími 16-bitovými modelmi mikroprocesorov Intel.

Uveďme si registre patriace do skupiny všeobecných registrov. Keďže tieto registre sú fyzicky umiestnené v mikroprocesore vo vnútri aritmetickej logickej jednotky (ALU), nazývajú sa aj registre ALU:

eax/ax/ah/al (Register akumulátora) - batéria.
Používa sa na ukladanie prechodných údajov. Niektoré príkazy vyžadujú použitie tohto registra;

ebx/bx/bh/bl (Základný register) - základný register.
Používa sa na uloženie základnej adresy nejakého objektu do pamäte;

ecx/cx/ch/cl (Register Count) - register počítadla.
Používa sa v tímoch, ktoré vykonávajú niektoré opakujúce sa akcie. Jeho použitie je často implicitné a skryté v algoritme príslušného príkazu.
Napríklad príkaz na organizáciu slučky, okrem prenosu riadenia na príkaz umiestnený na určitej adrese, analyzuje a znižuje hodnotu registra ecx/cx o jednu;

edx/dx/dh/dl (Dátový register) - register údajov.
Rovnako ako register eax/ax/ah/al ukladá prechodné dáta. V niektorých príkazoch je jeho použitie povinné; Pri niektorých príkazoch sa to deje implicitne.

Nasledujúce dva registre sa používajú na podporu takzvaných reťazových operácií, to znamená operácií, ktoré sekvenčne spracovávajú reťazce prvkov, z ktorých každý môže mať dĺžku 32, 16 alebo 8 bitov:

esi/si (Source Index register) - zdrojový index.
Tento register v reťazených operáciách obsahuje aktuálnu adresu prvku v zdrojovom reťazci;

edi/di (Register Destination Index) - index príjemcu (príjemcu).
Tento register v reťazených operáciách obsahuje aktuálnu adresu v cieľovom reťazci.

V architektúre mikroprocesora je na hardvérovej a softvérovej úrovni podporovaná dátová štruktúra, ako je zásobník. Na prácu so zásobníkom existujú špeciálne príkazy v inštrukčnom systéme mikroprocesora a v softvérovom modeli mikroprocesora sú na to špeciálne registre:

esp/sp (Stack Pointer register) - register ukazovateľa zásobníka.
Obsahuje ukazovateľ na vrch zásobníka v aktuálnom segmente zásobníka.

ebp/bp (Base Pointer register) - zásobník základného ukazovateľa rámca.
Navrhnuté na organizovanie náhodného prístupu k údajom v zásobníku.

Zásobník je oblasť programu na dočasné ukladanie ľubovoľných údajov. Dáta je samozrejme možné ukladať aj do dátového segmentu, no v tomto prípade musí byť pre každý dočasne uložený údaj vytvorená samostatná pomenovaná pamäťová bunka, čím sa zväčší veľkosť programu a počet použitých mien. Pohodlie zásobníka spočíva v tom, že jeho oblasť je opakovane použiteľná a ukladanie údajov do zásobníka a ich získavanie odtiaľ sa vykonáva pomocou efektívnych príkazov push a pop bez uvedenia akýchkoľvek mien.
Zásobník sa tradične používa napríklad na uloženie obsahu registrov používaných programom pred volaním podprogramu, ktorý zase použije registre procesora „na svoje účely“. Po návrate podprogramu sa pôvodný obsah registrov vysunie zo zásobníka. Ďalšou bežnou technikou je odovzdanie parametrov, ktoré vyžaduje, do podprogramu cez zásobník. Podprogram, ktorý vie, v akom poradí sú parametre umiestnené v zásobníku, ich môže odtiaľ prevziať a použiť počas svojho vykonávania. Výrazná vlastnosť Zásobník je jedinečné poradie, v ktorom sa získavajú údaje v ňom obsiahnuté: v každom danom čase je na zásobníku dostupný iba horný prvok, t.j. prvok, ktorý bol naposledy zasunutý do stohu. Vytiahnutím horného prvku zo zásobníka sa sprístupní ďalší prvok. Prvky zásobníka sú umiestnené v pamäťovej oblasti pridelenej pre zásobník, začínajúc od spodnej časti zásobníka (t.j. od jeho maximálnej adresy) na postupne klesajúcich adresách. Adresa najvyššieho prístupného prvku je uložená v registri ukazovateľa zásobníka SP. Ako každá iná oblasť programovej pamäte, zásobník musí byť súčasťou nejakého segmentu alebo tvoriť samostatný segment. V každom prípade je adresa segmentu tohto segmentu umiestnená v registri zásobníka segmentov SS. Dvojica registrov SS:SP teda opisuje adresu prístupnej bunky zásobníka: SS ukladá adresu segmentu zásobníka a SP ukladá offset posledných dát uložených v zásobníku (obr. 4, a). Všimnite si, že v počiatočnom stave ukazovateľ zásobníka SP ukazuje na bunku, ktorá leží pod spodkom zásobníka a nie je v ňom zahrnutá.

Obr 4. Organizácia zásobníka: a - počiatočný stav, b - po načítaní jedného prvku (v tomto príklade obsah registra AX), c - po načítaní druhého prvku (obsah registra DS), d - po vyložení jedného prvku. prvok, e - po vyložení dvoch prvkov a návrate do pôvodného stavu.

Nakladanie do zásobníka sa vykonáva špeciálnym príkazom pre prácu so zásobníkom (push). Táto inštrukcia najprv zníži obsah ukazovateľa zásobníka o 2 a potom umiestni operand na adresu v SP. Ak chceme napríklad dočasne uložiť obsah registra AX na zásobník, mali by sme spustiť príkaz

Stoh prejde do stavu znázorneného na obr. 1,10, b. Je vidieť, že ukazovateľ zásobníka je posunutý o dva bajty nahor (smerom k nižším adresám) a operand špecifikovaný v príkaze push je zapísaný na túto adresu. Nasledujúci príkaz na načítanie zásobníka je napr.

uvedie zásobník do stavu znázorneného na obr. 1,10, c. Zásobník teraz uloží dva prvky a prístupný bude len ten horný, na ktorý ukazuje ukazovateľ zásobníka SP. Ak po určitom čase potrebujeme obnoviť pôvodný obsah registrov uložených v zásobníku, musíme vykonať príkazy pop (push), aby sme sa uvoľnili zo zásobníka:

pop DS
pop AX

Aký veľký by mal byť zásobník? Záleží na tom, ako intenzívne sa v programe používa. Ak napríklad plánujete v zásobníku uložiť pole s veľkosťou 10 000 bajtov, zásobník musí mať aspoň túto veľkosť. Treba mať na pamäti, že v niektorých prípadoch systém automaticky používa zásobník, najmä pri vykonávaní príkazu na prerušenie int 21h. Pomocou tohto príkazu procesor najskôr vloží návratovú adresu do zásobníka a potom DOS vloží do zásobníka obsah registrov a ďalšie informácie súvisiace s prerušeným programom. Preto, aj keď program vôbec nepoužíva zásobník, musí byť stále prítomný v programe a musí mať veľkosť aspoň niekoľko desiatok slov. V našom prvom príklade sme do zásobníka pridelili 128 slov, čo je určite dosť.

^ Štruktúra programu assembler

Program v assembleri je súbor blokov pamäte nazývaných pamäťové segmenty. Program môže pozostávať z jedného alebo viacerých takýchto blokových segmentov. Každý segment obsahuje zbierku jazykových viet, z ktorých každá zaberá samostatný riadok programového kódu.

Existujú štyri typy príkazov assemblera:

príkazy alebo inštrukcie, ktoré sú symbolickými analógmi strojových príkazov. Počas procesu prekladu sú inštrukcie assemblera konvertované na zodpovedajúce príkazy inštrukčnej sady mikroprocesora;

makropríkazy - vety programového textu naformátované určitým spôsobom, nahradené počas vysielania inými vetami;

direktívy, čo sú inštrukcie pre prekladateľa assembleru na vykonanie určitých akcií. Smernice nemajú náprotivky v strojovej reprezentácii;

riadky komentárov obsahujúce akékoľvek znaky vrátane písmen ruskej abecedy. Komentáre prekladateľ ignoruje.

^ Syntax zostavy

Vety tvoriace program môžu byť syntaktické konštrukty zodpovedajúce príkazu, makru, direktíve alebo komentáru. Aby ich prekladateľ assembleru rozpoznal, musia byť vytvorené podľa určitých syntaktických pravidiel. Na tento účel je najlepšie použiť formálny popis syntaxe jazyka, ako sú gramatické pravidlá. Najbežnejšími spôsobmi, ako opísať programovací jazyk týmto spôsobom, sú syntaktické diagramy a rozšírené formuláre Backus-Naur. Pre praktické využitie syntaktické diagramy sú pohodlnejšie. Napríklad syntax príkazov v assembleri možno opísať pomocou diagramov syntaxe zobrazených na nasledujúcich obrázkoch.

Ryža. 5. Formát montážnej vety

Ryža. 6. Formát smernice

Ryža. 7. Formát príkazov a makier

Na týchto obrázkoch:

názov štítku - identifikátor, ktorého hodnota je adresa prvého bajtu vety v zdrojovom kóde programu, ktorý označuje;

názov - identifikátor, ktorý odlišuje túto smernicu od iných smerníc rovnakého mena. V dôsledku spracovania konkrétnej smernice assemblerom môžu byť tomuto názvu priradené určité charakteristiky;

operačný kód (OPC) a direktíva sú mnemotechnické symboly pre zodpovedajúcu strojovú inštrukciu, makro inštrukciu alebo direktívu prekladača;

operandy sú časti príkazu, makra alebo príkazu assembleru, ktoré označujú objekty, na ktorých sa vykonávajú akcie. Operandy jazyka symbolizácií sú opísané výrazmi s číselnými a textovými konštantami, štítkami a identifikátormi premenných pomocou znakov operátora a niektorých vyhradených slov.

^ Ako používať syntaktické diagramy? Je to veľmi jednoduché: všetko, čo musíte urobiť, je nájsť a potom sledovať cestu od vstupu diagramu (vľavo) k jeho výstupu (vpravo). Ak takáto cesta existuje, potom je veta alebo konštrukcia syntakticky správna. Ak takáto cesta neexistuje, kompilátor túto konštrukciu neprijme. Pri práci so syntaktickými diagramami dávajte pozor na smer prechodu označený šípkami, pretože medzi cestami môžu byť niektoré, ktoré možno sledovať sprava doľava. Syntaktické diagramy v podstate odrážajú logiku činnosti prekladača pri analýze vstupných viet programu.

Prijateľné znaky pri písaní textu programu sú:

Všetky písmená: A-Z, a-z. V tomto prípade sa veľké a malé písmená považujú za ekvivalentné;

Čísla od 0 do 9;

Znaky ?, @, $, _, &;

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

Vety v assembleri sa tvoria z lexém, ktoré sú syntakticky neoddeliteľnými postupnosťami platných jazykových symbolov, ktoré dávajú prekladateľovi zmysel.

Lexémy sú:

identifikátory sú sekvencie platných znakov, ktoré sa používajú na označenie objektov programu, ako sú kódy operácií, názvy premenných a názvy štítkov. Pravidlo pre zápis identifikátorov je nasledovné: identifikátor môže pozostávať z jedného alebo viacerých znakov. Ako symboly môžete použiť písmená latinskej abecedy, čísla a niektoré špeciálne znaky - _, ?, $, @. Identifikátor nemôže začínať číslicou. Dĺžka identifikátora môže byť až 255 znakov, aj keď prekladateľ akceptuje iba prvých 32 a ostatné ignoruje. Pomocou voľby môžete upraviť dĺžku možných identifikátorov príkazový riadok mv. Okrem toho je možné prikázať prekladateľovi, aby rozlišoval medzi veľkými a malými písmenami alebo aby ich rozdiel ignoroval (čo sa robí štandardne).

^Príkazy assembleru.

Príkazy Assemblera odhaľujú schopnosť preniesť vaše požiadavky do počítača, mechanizmus na prenos riadenia v programe (cykly a prechody) na logické porovnávanie a organizáciu programu. Programovateľné úlohy sú však zriedka také jednoduché. Väčšina programov obsahuje sériu slučiek, v ktorých sa niekoľko príkazov opakuje, kým sa nedosiahne určitá požiadavka, a rôzne kontroly, ktoré určujú, ktorá z viacerých akcií sa má vykonať. Niektoré inštrukcie môžu preniesť riadenie zmenou normálnej postupnosti krokov priamou úpravou hodnoty posunu v ukazovateli inštrukcie. Ako už bolo spomenuté, existujú rôzne príkazy pre rôzne procesory, ale my sa pozrieme na niekoľko príkazov pre procesory 80186, 80286 a 80386.

Na opísanie stavu príznakov po vykonaní určitého príkazu použijeme výber z tabuľky odrážajúcej štruktúru registra príznakov:

Spodný riadok tejto tabuľky zobrazuje hodnoty príznakov po vykonaní príkazu. Používajú sa nasledujúce zápisy:

1 - po vykonaní príkazu sa nastaví príznak (rovná sa 1);

0 - po vykonaní príkazu sa príznak resetuje (rovná sa 0);

r - hodnota príznaku závisí od výsledku príkazu;

Po vykonaní príkazu nie je príznak definovaný;

medzera - po vykonaní príkazu sa príznak nezmení;

Na reprezentáciu operandov v syntaktických diagramoch sa používa nasledujúci zápis:

r8, r16, r32 - operand v jednom z registrov veľkosti bajtu, slovo alebo dvojité slovo;

m8, m16, m32, m48 - veľkosť operandu pamäte bajt, slovo, dvojité slovo alebo 48 bitov;

i8, i16, i32 - okamžitá veľkosť operandu byte, slovo alebo dvojité slovo;

a8, a16, a32 - relatívna adresa (offset) v kódovom segmente.

Príkazy (v abecednom poradí):

*Tieto príkazy sú podrobne popísané.

PRIDAŤ
(DOPLNENIE)

Doplnenie

^ Schéma príkazov:

pridať cieľ, zdroj

Účel: pridanie dvoch zdrojových a cieľových operandov veľkosti bajt, slovo alebo dvojité slovo.

Pracovný algoritmus:

pridajte zdrojový a cieľový operand;

zapíšte výsledok sčítania do prijímača;

nastaviť vlajky.

Stav príznakov po vykonaní príkazu:

Aplikácia:
Príkaz add sa používa na pridanie dvoch celočíselných operandov. Výsledok sčítania sa umiestni na adresu prvého operandu. Ak výsledok sčítania presiahne hranice operandu prijímača (nastane pretečenie), potom by sa táto situácia mala vziať do úvahy analýzou príznaku cf a následným možným použitím príkazu adc. Pridajme napríklad hodnoty v registri ax a pamäťovej oblasti ch. Pri pridávaní počítajte s možnosťou preliatia.

Registrácia plus register alebo pamäť:

|000000dw|modregr/rm|

Register AX (AL) plus okamžitá hodnota:

|0000010w|--údaje--|údaje, ak w=1|

Registrácia alebo pamäť plus okamžitá hodnota:

|100000sw|mod000r/m|--údaje--|údaje, ak BW=01|

ZAVOLAJTE
(VOLAŤ)

Volanie procedúry alebo úlohy

^ Schéma príkazov:

Účel:

prenesenie riadenia do blízkej alebo vzdialenej procedúry s uložením adresy návratového bodu do zásobníka;

prepínanie úloh.

Pracovný algoritmus:
určený typom operandu:

Blízko štítku - obsah ukazovateľa príkazu eip/ip sa vloží do zásobníka a do rovnakého registra sa nahrá nová hodnota adresy zodpovedajúca štítku;

Vzdialený štítok - obsah príkazového ukazovateľa eip/ip a cs sa vloží do zásobníka. Potom sa do rovnakých registrov načítajú nové hodnoty adresy zodpovedajúce vzdialenému označeniu;

R16, 32 alebo m16, 32 - definujú register alebo pamäťovú bunku obsahujúcu posuny v aktuálnom segmente inštrukcie, na ktorý sa prenáša riadenie. Pri prenose riadenia sa obsah ukazovateľa príkazu eip/ip presunie do zásobníka;

Pamäťový ukazovateľ - definuje pamäťové miesto obsahujúce 4 alebo 6 bajtový ukazovateľ na volanú procedúru. Štruktúra takéhoto ukazovateľa je 2+2 alebo 2+4 bajty. Interpretácia takéhoto ukazovateľa závisí od prevádzkového režimu mikroprocesora:

^ Stav príznakov po vykonaní príkazu (okrem prepínania úloh):

vykonanie príkazu neovplyvní príznaky

Pri prepnutí úlohy sa hodnoty príznakov zmenia podľa informácií o registri príznakov v segmente stavu TSS úlohy, na ktorú sa prepína.
Aplikácia:
Príkaz call umožňuje organizovať flexibilný a viacvariantný prenos riadenia na podprogram pri zachovaní adresy bodu návratu.

Kód objektu (štyri formáty):

Priame oslovovanie v segmente:

|11101000|disp-low|diep-high|

Nepriame adresovanie v segmente:

|11111111|mod010r/m|

Nepriame adresovanie medzi segmentmi:

|11111111|mod011r/m|

Priame adresovanie medzi segmentmi:

|10011010|offset-nízky|offset-vysoký|seg-nízky|seg-vysoký|

CMP
(Porovnať operandy)

Porovnanie operandov

^ Schéma príkazov:

cmp operand1,operand2

Účel: porovnanie dvoch operandov.

Pracovný algoritmus:

vykonať odčítanie(operand1-operand2);

v závislosti od výsledku nastavte príznaky, nemeňte operand1 a operand2 (teda nepamätajte si výsledok).

Aplikácia:
Tento príkaz používa sa na porovnanie dvoch operandov odčítaním bez zmeny operandov. Na základe výsledkov príkazu sa nastavia príznaky. Príkaz cmp sa používa s príkazmi podmieneného skoku a príkazom setcc pre nastavenie byte by value.

Kód objektu (tri formáty):

Registrácia alebo pamäť s registrom:

|001110dw|modregr/m|

Okamžitá hodnota s registrom AX (AL):

|0011110w|--údaje--|údaje, ak w=1|

Okamžitá hodnota s registrom alebo pamäťou:

|100000sw|mod111r/m|--data--|data if sw=0|

DEC
(DECrementujte operand o 1)

Zníženie operandu o jeden

^ Schéma príkazov:

dec operand

Účel: Znížte hodnotu operandu v pamäti alebo registri o 1.

Pracovný algoritmus:
príkaz odpočíta 1 od operandu. Stav príznakov po vykonaní príkazu:

Aplikácia:
Inštrukcia dec sa používa na zníženie hodnoty bajtu, slova, dvojitého slova v pamäti alebo registri o jeden. Upozorňujeme však, že príkaz neovplyvňuje príznak cf.

Registrácia: |01001reg|

^ Register alebo pamäť: |1111111w|mod001r/m|

DIV
(rozdeliť nepodpísané)

Nepodpísané rozdelenie

Náčrt tímu:

rozdeľovač div

Účel: Vykonajte operáciu delenia medzi dvoma binárnymi hodnotami bez znamienka.

^ Operačný algoritmus:
Príkaz vyžaduje dva operandy – delenec a deliteľ. Delenec je zadaný implicitne a jeho veľkosť závisí od veľkosti deliteľa, ktorý je zadaný v príkaze:

ak má deliteľ veľkosť bajtu, potom sa dividenda musí nachádzať v registri sekery. Po operácii sa kvocient umiestni do al a zvyšok do ah;

ak je deliteľ slovo vo veľkosti, potom sa dividenda musí nachádzať v registrovom páre dx:ax, pričom časť dividendy s najnižším rádom musí byť umiestnená v ax. Po operácii sa kvocient umiestni do ax a zvyšok do dx;

ak má deliteľ veľkosť dvojitého slova, potom sa dividenda musí nachádzať v páre registra edx:eax, pričom časť dividendy s najnižším rádom sa musí nachádzať v eax. Po operácii sa kvocient umiestni do eax a zvyšok do edx.

^ Stav príznakov po vykonaní príkazu:

Aplikácia:
Príkaz vykoná celočíselné delenie operandov, výsledkom čoho je delenie ako podiel a zvyšok delenia. Pri vykonávaní operácie delenia môže nastať výnimka: 0 - chyba delenia. Táto situácia nastáva v jednom z dvoch prípadov: deliteľ je 0 alebo je podiel príliš veľký na to, aby sa zmestil do registra eax/ax/al.

Kód objektu:

|1111011w|mod110r/m|

INT
(Prerušiť)

Volanie rutiny služby prerušenia

^ Schéma príkazov:

int číslo_prerušenia

Účel: zavolajte obslužnú rutinu prerušenia s číslom prerušenia určeným operandom príkazu.

^ Operačný algoritmus:

posuňte vlajky/príznaky registra príznakov a návratovú adresu do zásobníka. Pri zápise návratovej adresy sa najskôr zapíše obsah segmentového registra cs, potom obsah príkazového ukazovateľa eip/ip;

resetovať príznaky if a tf na nulu;

preniesť riadenie na program obsluhy prerušení so zadaným číslom. Mechanizmus prenosu riadenia závisí od prevádzkového režimu mikroprocesora.

^ Stav príznakov po vykonaní príkazu:

Aplikácia:
Ako môžete vidieť zo syntaxe, existujú dve formy tohto príkazu:

int 3 - má svoj vlastný individuálny operačný kód 0cch a zaberá jeden bajt. Táto okolnosť umožňuje veľmi pohodlné použitie v rôznych softvérových debuggeroch na nastavenie bodov prerušenia nahradením prvého bajtu akéhokoľvek príkazu. Mikroprocesor, ktorý v slede príkazov narazí na príkaz s operačným kódom 0cch, vyvolá program spracovania prerušenia s vektorom číslo 3, ktorý slúži na komunikáciu so softvérovým debuggerom.

Druhá forma príkazu zaberá dva bajty, má operačný kód 0cdh a umožňuje iniciovať volanie obslužnej rutiny prerušenia s číslom vektora v rozsahu 0–255. Vlastnosti prenosu riadenia, ako bolo uvedené, závisia od prevádzkového režimu mikroprocesora.

Kód objektu (dva formáty):

Registrácia: |01000reg|

^ Register alebo pamäť: |1111111w|mod000r/m|

J.C.C.
JCXZ/JECXZ
(Skočiť, ak je to podmienka)

(Skočiť, ak CX=nula/skočiť, ak ECX=nula)

Skok, ak je splnená podmienka

Skok, ak je CX/ECX nula

^ Schéma príkazov:

štítok jcc
štítok jcxz
štítok jecxz

Účel: prechod v rámci aktuálneho segmentu príkazov v závislosti od určitej podmienky.

^ Príkazový algoritmus (okrem jcxz/jecxz):
Kontrola stavu príznakov v závislosti od operačného kódu (odzrkadľuje kontrolovaný stav):

ak je testovaná podmienka pravdivá, prejdite na bunku označenú operandom;

ak je kontrolovaná podmienka nepravdivá, potom preneste riadenie na ďalší príkaz.

Algoritmus pre príkaz jcxz/jecxz:
Kontrola podmienky, že obsah registra ecx/cx sa rovná nule:

ak sa stav kontroluje

Štruktúra príkazov v assembleri Programovanie na úrovni strojových príkazov je minimálna úroveň, na ktorej je možné programovanie počítačom. Riadiaci systém stroja musí byť dostatočný na vykonanie požadovaných činností vydávaním pokynov do strojového zariadenia. Každá strojová inštrukcia pozostáva z dvoch častí: operačnej, ktorá určuje „čo robiť“ a operandu, ktorý určuje objekty spracovania, teda „čo robiť“. Strojová inštrukcia mikroprocesora, napísaná v jazyku symbolických inštrukcií, je jeden riadok, ktorý má nasledujúcu formu: návestný príkaz/direktívny operand(y); komentáre Návestie, príkaz/direktíva a operand sú oddelené aspoň jednou medzerou alebo tabulátorom. Operandy príkazu sú oddelené čiarkami.

Štruktúra príkazu assembleru Príkaz assembleru hovorí prekladateľovi, akú činnosť má mikroprocesor vykonať. Direktívy zostavy sú parametre špecifikované v texte programu, ktoré ovplyvňujú proces zostavovania alebo vlastnosti výstupného súboru. Operand určuje počiatočnú hodnotu údajov (v segmente údajov) alebo prvkov, na ktorých sa vykoná akcia príkazu (v segmente kódu). Inštrukcia môže mať jeden alebo dva operandy alebo žiadne operandy. Počet operandov je implicitne určený kódom inštrukcie. Ak príkaz alebo príkaz musí pokračovať na ďalšom riadku, použije sa znak spätnej lomky: "" . V predvolenom nastavení assembler nerozlišuje veľké a malé písmená pri písaní príkazov a direktív. Príklady príkazov a príkazov Počet db 1 ; Meno, smernica, jeden operand mov eax, 0 ; Príkaz, dva operandy

Identifikátory sú sekvencie platných znakov, ktoré sa používajú na označenie názvov premenných a názvov štítkov. Identifikátor môže pozostávať z jedného alebo viacerých z nasledujúcich znakov: všetky písmená latinskej abecedy; čísla od 0 do 9; špeciálne znaky: _, @, $, ? . Ako prvý znak štítku možno použiť bodku. Vyhradené názvy assembleru (smernice, operátory, názvy príkazov) nemožno použiť ako identifikátory. Prvý znak identifikátora musí byť písmeno alebo špeciálny znak. Maximálna dĺžka Identifikátor má 255 znakov, ale prekladateľ akceptuje prvých 32 a ostatné ignoruje. Všetky štítky, ktoré sú napísané na riadku, ktorý neobsahuje direktívu assembleru, musia končiť dvojbodkou „:“. Návestie, príkaz (smernica) a operand nemusia začínať na žiadnej konkrétnej pozícii v riadku. Odporúča sa ich zapisovať do stĺpca pre väčšiu čitateľnosť programu.

Štítky Všetky štítky, ktoré sú napísané na riadku, ktorý neobsahuje direktívu assembleru, musia končiť dvojbodkou ":". Návestie, príkaz (smernica) a operand nemusia začínať na žiadnej konkrétnej pozícii v riadku. Odporúča sa ich zapisovať do stĺpca pre väčšiu čitateľnosť programu.

Komentáre Používanie komentárov v programe zlepšuje jeho prehľadnosť, najmä ak nie je jasný účel súboru príkazov. Komentáre začínajú na ľubovoľnom riadku v zdrojovom module bodkočiarkou (;). Všetky znaky napravo od "; “ na koniec riadku sú komentáre. Komentár môže obsahovať ľubovoľné tlačiteľné znaky vrátane medzier. Komentár môže zahŕňať celý riadok alebo môže nasledovať po príkaze na rovnakom riadku.

Štruktúra programu v assembleri Program napísaný v assembleri sa môže skladať z niekoľkých častí nazývaných moduly, z ktorých každá môže definovať jeden alebo viac dátových, zásobníkových a kódových segmentov. Každý kompletný program v jazyku symbolických inštancií musí obsahovať jeden hlavný alebo hlavný modul, od ktorého začína jeho vykonávanie. Modul môže obsahovať programové segmenty, dátové a zásobníkové segmenty deklarované pomocou vhodných direktív.

Pamäťové modely Pred deklarovaním segmentov musíte špecifikovať pamäťový model pomocou direktívy. Modifikátor MODEL memory_model, calling_convention, OS_type, stack_parameter Základné pamäťové modely assembleru: Pamäťový model Adresovanie kódu Adresovanie dát operačný systém Vkladanie kódu a údajov DROBNÉ PRI MS-DOS Prijateľné MALÉ BLÍZKO MS-DOS, Windows Nie STREDNÁ ĎALEKO BLÍZKO MS-DOS, Windows Nie KOMPAKTNÉ BLÍZKO MS-DOS, Windows Nie VEĽKÝ ĎALEKO MS-DOS, Windows Nie VEĽKÝ ĎALEKO MS-DOS, Windows Nie BLÍZKO Windows 2000, Windows XP, Windows prijateľný FLAT BLÍZKO NT,

Pamäťové modely Malý model funguje iba v 16-bitových aplikáciách MS-DOS. V tomto modeli sú všetky údaje a kód umiestnené na jednom fyzickom segmente. Veľkosť programového súboru v tomto prípade nepresahuje 64 KB. Malý model podporuje jeden segment kódu a jeden segment údajov. Údaje a kód sú pri použití tohto modelu adresované čo najbližšie. Model média podporuje viacero segmentov kódu a jeden segment údajov, pričom všetky referencie v segmentoch kódu sú štandardne považované za vzdialené a referencie v segmente údajov sa považujú za blízke. Kompaktný model podporuje niekoľko dátových segmentov, ktoré používajú vzdialené adresovanie dát (ďaleko), a jeden kódový segment, ktorý používa blízke adresovanie (blízke). Veľký model podporuje viacero segmentov kódu a viacero segmentov údajov. V predvolenom nastavení sa všetky odkazy na kód a údaje považujú za ďaleko. Obrovský model je takmer ekvivalentný modelu s veľkou pamäťou.

Pamäťové modely Plochý model predpokladá nesegmentovanú konfiguráciu programu a používa sa iba v 32-bitových operačných systémoch. Tento model je podobný malému modelu v tom, že údaje a kód sú umiestnené v jednom segmente, ale je 32-bitový. Vypracovať program pre plochý model pred smernicou. vzorový byt by mal umiestniť jednu zo smerníc: . 386, . 486, . 586 resp. 686. Voľba direktívy výberu procesora určuje množinu inštrukcií dostupných pri písaní programov. Písmeno p za príkazom na výber procesora znamená chránený prevádzkový režim. Adresovanie údajov a kódu je blízko, pričom všetky adresy a ukazovatele sú 32-bitové.

Pamäťové modely. Modifikátor MODEL memory_model, calling_convention, OS_type, stack_parameter Parameter modifikátora sa používa na definovanie typov segmentov a môže nadobudnúť nasledujúce hodnoty: use 16 (segmenty zvoleného modelu sa používajú ako 16-bitové) use 32 (segmenty zvoleného modelu sa používajú ako 32-bitový). Parameter calling_convention sa používa na určenie spôsobu odovzdávania parametrov pri volaní procedúry z iných jazykov vrátane jazykov na vysokej úrovni (C++, Pascal). Parameter môže nadobúdať nasledujúce hodnoty: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

Pamäťové modely. Modifikátor MODEL memory_model, calling_convention, OS_type, stack_parameter Parameter OS_type je štandardne OS_DOS a ďalej tento moment toto je jediná podporovaná hodnota pre tento parameter. Parameter stack_parameter je nastavený na: NEARSTACK (register SS sa rovná DS, oblasti údajov a zásobníka sa nachádzajú v rovnakom fyzickom segmente) FARSTACK (register SS sa nerovná DS, oblasti údajov a zásobníka sa nachádzajú v rôznych fyzických segmentoch). Predvolená hodnota je NEARSTACK.

Príklad programu, ktorý nič nerobí. 686 P. VZOR BYTU, STDCALL. ÚDAJE. CODE START: RET END START RET - príkaz mikroprocesora. Zabezpečuje správne ukončenie programu. Zvyšok programu sa týka prevádzky prekladača. . 686 P - Príkazy chráneného režimu Pentium 6 (Pentium II) sú povolené. Táto direktíva vyberá podporovanú množinu inštrukcií assemblera s uvedením modelu procesora. . MODEL FLAT, stdcall - plochý pamäťový model. Tento model pamäte sa používa v operačnom systéme Windows. stdcall - použitá konvencia volania procedúr.

Príklad programu, ktorý nič nerobí. 686 P. VZOR BYTU, STDCALL. ÚDAJE. ZAČIATOK KÓDU: ZNOVU KONIEC ZAČIATOK. DATA je segment programu obsahujúci údaje. Tento program nepoužíva zásobník, teda segment. Chýba STACK. . CODE je segment programu obsahujúci kód. ŠTART - štítok. KONIEC ŠTART - koniec programu a správa pre kompilátor, že vykonávanie programu by sa malo začať štítkom ŠTART. Každý program musí obsahovať direktívu END na označenie konca zdrojový kód programy. Všetky riadky, ktoré nasledujú po direktíve END, sú ignorované Návestie zadané za direktívou END prekladateľovi povie názov hlavného modulu, od ktorého sa začína vykonávanie programu. Ak program obsahuje jeden modul, označenie za direktívou END možno vynechať.

Prekladače assembleru Prekladač – program resp technické prostriedky, ktorý konvertuje program reprezentovaný v jednom z programovacích jazykov na program v cieľovom jazyku, nazývanom objektový kód. Okrem podpory mnemotechnických pomôcok strojových inštrukcií má každý prekladateľ vlastnú sadu direktív a makro nástrojov, často nekompatibilných s čímkoľvek iným. Hlavné typy prekladačov jazyka assembleru: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - voľne distribuovaný multi-pass assembler napísaný Tomaszom Gryshtarom (poľský), NASM (Netwide Assembler) - bezplatný assembler pre architektúru Intel x 86, ktorý vytvorili Simon Tatham s Julianom Hallom a v súčasnosti ho vyvíja malý tím vývojárov v Source. Forge. net.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="Preklad programu v Microsoft Visual Studio 2005 1) Vytvorte projekt výberom položky Súbor->Nový- > Ponuka projektu A"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="Preklad programu v Microsoft Visual Studio 2005 2) V strome projektu (View->Solution Explorer) pridať"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Preklad programu do Microsoft Visual Studio 2005 3) Vyberte typ súboru Code C++, ale zadajte názov s príponou. asm:

Preklad programu do Microsoft Visual Studio 2005 5) Nastavte parametre kompilátora. Kliknite pravým tlačidlom myši na ponuku Custom Build Rules v súbore projektu...

Preložte program do Microsoft Visual Studio 2005 a v zobrazenom okne vyberte Microsoft Macro Assembler.

Preklad programu v Microsoft Visual Studio 2005 Skontrolujte pomocou pravého tlačidla v súbore ahoj. strom projektu asm v ponuke Vlastnosti a nainštalujte Všeobecné->Nástroj: Microsoft Macro Assembler.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="Preklad programu v Microsoft Visual Studio 2005 6) Kompilujte súbor výberom Build->Build hello. prj."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Programovanie v OS Windows Programovanie v OS Windows je založené na použití funkcií API (Application Program Interface, t.j. rozhranie softvérovej aplikácie). Ich počet dosahuje 2000. Z takýchto volaní sa vo veľkej miere skladá program Windows. Všetky interakcie s externých zariadení a prostriedky operačného systému sa spravidla vyskytujú prostredníctvom takýchto funkcií. operačná sála systém Windows používa model s plochou pamäťou. Adresa ktorejkoľvek pamäťovej bunky bude určená obsahom jedného 32-bitového registra. Pre Windows existujú 3 typy programových štruktúr: dialógové (hlavné okno je dialógové), konzolová alebo bezokenná štruktúra, klasická štruktúra (okenná, rámová).

Zavolajte Funkcie systému Windows API V súbore pomocníka je každá funkcia API prezentovaná ako typ názov_funkcie (FA 1, FA 2, FA 3) Typ – typ návratovej hodnoty; FAX – zoznam formálnych argumentov v poradí, v akom sa zobrazujú, napríklad int Message. Box(HWND h. Wnd, LPCTSTR lp. text, LPCTSTR lp. titulok, UINT u. typ); Táto funkcia zobrazí okno so správou a tlačidlom ukončenia (alebo tlačidlami). Význam parametrov: h. Wnd je deskriptor okna, v ktorom sa zobrazí okno správy, lp. Text – text, ktorý sa zobrazí v okne, lp. Titulok - text v záhlaví okna, u. Typ - typ okna, konkrétne môžete určiť počet výstupných tlačidiel.

Volanie funkcií Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. text, LPCTSTR lp. titulok, UINT u. typ); Takmer všetky parametre funkcie API sú v skutočnosti 32-bitové celé čísla: HWND je 32-bitové celé číslo, LPCTSTR je 32-bitový ukazovateľ na reťazec, UINT je 32-bitové celé číslo. Prípona "A" sa často pridáva k názvu funkcie, aby sa presunula na novšie verzie funkcie.

Volanie funkcií Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. text, LPCTSTR lp. titulok, UINT u. typ); Pri použití MASM musíte na koniec názvu pridať @N N - počet bajtov, ktoré zaberajú odovzdané argumenty v zásobníku. Pre funkcie Win 32 API môže byť toto číslo definované ako počet argumentov n vynásobený 4 (bajty v každom argumente): N=4*n. Na zavolanie funkcie použite inštrukciu CALL v assembleri. V tomto prípade sú mu všetky argumenty funkcie odovzdané cez zásobník (príkaz PUSH). Smer odovzdávania argumentov: ZĽAVA DOPRAVA – ZDOLU NAHOR. Argument u sa vloží do zásobníka ako prvý. Typ. Volanie zadanej funkcie bude vyzerať takto: CALL Message. Box. A@16

Volanie funkcií Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. text, LPCTSTR lp. titulok, UINT u. typ); Výsledkom vykonania akejkoľvek funkcie API je zvyčajne celé číslo, ktoré sa vráti v registri EAX. Direktíva OFFSET predstavuje "odsadenie v segmente" alebo, preložené do jazykových výrazov na vysokej úrovni, "ukazovateľ" na začiatok riadku. Smernica EQU, podobne ako #define v SI, definuje konštantu. Direktíva EXTERN hovorí prekladateľovi, že funkcia alebo identifikátor je pre tento modul externý.

Príklad programu „Ahoj všetci!“ . 686 P. VZOR BYTU, STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 DB "Môj prvý program", 0 STR 2 DB "Ahoj všetci!", 0 HW DD ? EXTERNÁ správa. Box. A@16: BLÍZKO. CODE START: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Hlásenie. Box. A@16 RET KONIEC ZAČIATOK

Direktíva INVOKE Prekladač jazyka MASM umožňuje zjednodušiť volania funkcií aj pomocou nástroja makier - direktívy INVOKE: funkcia INVOKE, parameter1, parameter2, ... K volaniu funkcie nie je potrebné pridávať @16; parametre sú zapísané presne v poradí, v akom sú uvedené v popise funkcie. Pomocou makra pomocou prekladača sa parametre umiestňujú do zásobníka. Ak chcete použiť direktívu INVOKE, musíte mať popis prototypu funkcie pomocou direktívy PROTO v tvare: Správa. Box. A PROTO: DWORD, : DWORD Ak program používa veľa funkcií Win 32 API, je vhodné použiť direktívu include C: masm 32includeuser 32. inc

Téma 2.5 Základy programovania procesorov

S narastajúcou dĺžkou programu je čoraz ťažšie zapamätať si kódy rôznych operácií. Určitú pomoc v tomto smere poskytujú mnemotechnické pomôcky.

Symbolický príkazový kódovací jazyk sa nazýva assembler.

Montážny jazyk je jazyk, v ktorom každý výrok zodpovedá presne jednému strojovému príkazu.

zhromaždenie nazývaná konverzia programu z jazyka symbolických inštrukcií, t. j. príprava programu v strojovom jazyku nahradením symbolických názvov operácií strojovými kódmi a symbolických adries absolútnymi alebo relatívnymi číslami, ako aj začlenenie knižničných programov a generovanie sekvencií symbolických inštrukcií špecifikovaním konkrétnych parametre v mikrotímoch. Tento program sa zvyčajne nachádza v pamäti ROM alebo je vložený do pamäte RAM z nejakého externého média.

Assembler má niekoľko funkcií, ktoré ho odlišujú od jazykov na vysokej úrovni:

1. Toto je individuálna zhoda medzi príkazmi v jazyku symbolických inštrukcií a strojovými pokynmi.

2. Programátor v jazyku symbolických inštrukcií má prístup ku všetkým objektom a inštrukciám prítomným na cieľovom počítači.

Pochopenie základov programovania v strojovo orientovaných jazykoch je užitočné pre:



Lepšie pochopenie architektúry PC a kompetentnejšie používanie počítačov;

Rozvíjať racionálnejšie štruktúry algoritmov pre programy na riešenie aplikovaných problémov;

Schopnosť prezerať a opravovať spustiteľné programy s príponou .exe a .com, skompilované z ľubovoľných jazykov na vysokej úrovni, v prípade straty zdrojových programov (zavolaním špecifikovaných programov v debuggere programu DEBUG a dekompiláciou ich zobrazenia v zostave Jazyk);

Kompilácia programov na riešenie najkritickejších problémov (program napísaný v strojovo orientovanom jazyku je zvyčajne efektívnejší - kratší a rýchlejší o 30-60 percent programov získaných prekladom z jazykov na vysokej úrovni)

Implementovať postupy zahrnuté v hlavnom programe vo forme samostatných fragmentov v prípade, že ich nemožno implementovať v použitom vysokoúrovňovom jazyku alebo pomocou servisných postupov OS.

Program v jazyku symbolických inštancií môže bežať iba na jednej rodine počítačov, zatiaľ čo program napísaný v jazyku vysokej úrovne môže potenciálne bežať na rôznych počítačoch.

Abeceda jazyka symbolických adries pozostáva zo znakov ASCII.

Čísla sú iba celé čísla. Existujú:

Binárne čísla končia písmenom B;

Desatinné čísla končiace písmenom D;

Hexadecimálne čísla končia písmenom H.

RAM, registre, prezentácia údajov

Pre určitú sériu MP sa používa individuálny programovací jazyk – assembler.

Jazyk symbolických inštrukcií zaujíma strednú pozíciu medzi strojovými kódmi a jazykmi na vysokej úrovni. Programovanie v tomto jazyku je jednoduchšie. Program v jazyku symbolických inštancií efektívnejšie využíva možnosti konkrétneho stroja (presnejšie MP) ako program vo vysokoúrovňovom jazyku (ktorý je pre programátora jednoduchší ako assembler). Pozrime sa na základné princípy programovania v strojovo orientovaných jazykoch pomocou príkladu assembleru pre MP KR580VM80. Na programovanie v jazyku sa používa všeobecná metodika. Špecifické technické techniky na nahrávanie programov sú spojené s vlastnosťami architektúry a príkazového systému cieľového MP.

Softvérový model mikroprocesorový systém založený na MP KR580VM80

Softvérový model MPS podľa obrázku 1

Pamäť MP portov

S Z A.C. P C

Obrázok 1

Z pohľadu programátora má MP KR580VM80 nasledovné programovo dostupné registre.

A– 8-bitový register akumulátora. Je to hlavný register poslancov. Akákoľvek operácia vykonaná v ALU zahŕňa umiestnenie jedného z operandov, ktoré sa majú spracovať, do akumulátora. Výsledok operácie v ALU je tiež zvyčajne uložený v A.

B, C, D, E, H, L– 8-bitové všeobecné registre (GPR). Vnútorná pamäť MP. Navrhnuté na ukladanie spracovaných informácií, ako aj výsledkov operácie. Pri spracovaní 16-bitových slov tvoria registre dvojice BC, DE, HL a dvojitý register sa nazýva prvé písmeno - B, D, H. V registrovom páre je najvyšší prvý register. Registre H a L majú špeciálnu vlastnosť, slúžiacu ako na ukladanie dát, tak aj na ukladanie 16-bitových adries buniek RAM.

FL– register príznakov (register znakov) 8-bitový register, v ktorom je uložených päť znakov výsledku vykonania aritmetických a logických operácií v MP. Formát FL podľa obrázku

Bit C (CY - carry) - prenos, nastavený na 1, ak pri vykonávaní aritmetických operácií došlo k prenosu z vyššieho rádu bajtu.

Bit P (parita) – parita, nastavená na 1, ak je počet jednotiek v bitoch výsledku párny.

Číslica AC je dodatočný prenos určený na uloženie hodnoty prenosu z tetrádu nízkeho rádu výsledku.

Bit Z (nula) – nastavte na 1, ak je výsledok operácie 0.

Bit S (znamienko) – je nastavený na 1, ak je výsledok negatívny, a na 0, ak je výsledok pozitívny.

SP– ukazovateľ zásobníka, 16-bitový register, určený na uloženie adresy pamäťovej bunky, kde bol zapísaný posledný bajt vložený do zásobníka.

RS– programové počítadlo (programové počítadlo), 16-bitový register, určený na uloženie adresy nasledujúcej inštrukcie, ktorá sa má vykonať. Obsah programového počítadla sa automaticky zvýši o 1 ihneď po načítaní ďalšieho bajtu inštrukcie.

V počiatočnej pamäťovej oblasti adresy 0000H – 07FF je riadiaci program a demonštračné programy. Toto je oblasť ROM.

0800 – 0AFF - adresná oblasť pre záznam študovaných programov. (RAM).

0В00 – 0ВВ0 - oblasť adresy pre zápis údajov. (RAM).

0ВВ0 – počiatočná adresa zásobníka. (RAM).

Zásobník je špeciálne organizovaná oblasť pamäte RAM určená na dočasné ukladanie údajov alebo adries. Posledné číslo zapísané do zásobníka sa zobrazí ako prvé. Ukazovateľ zásobníka ukladá adresu poslednej bunky zásobníka, do ktorej sú zapísané informácie. Keď sa zavolá podprogram, návratová adresa do hlavného programu sa automaticky uloží do zásobníka. Spravidla sa na začiatku každého podprogramu obsah všetkých registrov, ktoré sa podieľajú na jeho vykonávaní, uloží do zásobníka a na konci podprogramu sa zo zásobníka obnoví.

Formát údajov a príkazová štruktúra jazyka symbolických inštrukcií

Pamäť MP KR580VM80 je pole 8-bitových slov nazývaných bajty.Každý bajt má svoju vlastnú 16-bitovú adresu, ktorá určuje jeho pozíciu v poradí pamäťových buniek. MP môže adresovať 65536 bajtov pamäte, ktorá môže byť obsiahnutá v ROM aj RAM.

Formát údajov

Dáta sú uložené v pamäti ako 8-bitové slová:

D7 D6 D5 D4 D3 D2 D1 D0

Najmenej významný bit je bit 0, najvýznamnejší bit je bit 7.

Príkaz je charakterizovaný svojim formátom, t. j. počtom bitov, ktoré sú mu pridelené a ktoré sú po byte rozdelené do určitých funkčných polí.

Formát príkazu

Príkazy MP KR580VM80 majú jedno-, dvoj- alebo trojbajtový formát. Viacbajtové príkazy musia byť umiestnené v susedných jazykoch. Formát príkazu závisí od špecifík vykonávanej operácie.

Prvý bajt príkazu obsahuje operačný kód napísaný v mnemotechnickej forme.

Určuje formát príkazu a úkony, ktoré musí MP vykonať s údajmi počas jeho vykonávania, a spôsob adresovania a môže obsahovať aj informácie o umiestnení údajov.

Druhý a tretí bajt môžu obsahovať údaje, na ktorých sa vykonávajú operácie, alebo adresy označujúce umiestnenie údajov. Údaje, na ktorých sa vykonávajú akcie, sa nazývajú operandy.

Jednobajtový formát príkazu podľa obrázku 2

Obrázok 4

V príkazoch v assembleri má operačný kód skrátenú formu písania anglických slov – mnemotechnický zápis. Mnemotechnika (z gréckeho mnemotechnická pomôcka - umenie zapamätať si) uľahčuje zapamätanie príkazov podľa ich funkčného účelu.

Pred spustením sa zdrojový program preloží pomocou prekladacieho programu s názvom assembler do jazyka kombinácií kódu - strojového jazyka, v tejto podobe sa uloží do pamäte MP a následne sa použije pri vykonávaní príkazu.


Metódy adresovania

Všetky kódy operandov (vstup a výstup) musia byť niekde umiestnené. Môžu byť umiestnené vo vnútorných registroch MP (najpohodlnejšie a rýchla možnosť). Môžu byť umiestnené v systémová pamäť(najbežnejšia možnosť). Nakoniec môžu byť umiestnené v I/O zariadeniach (najzriedkavejší prípad). Umiestnenie operandov je určené kódom inštrukcie. Existovať rôzne metódy, pomocou ktorého môže kód inštrukcie určiť, kde sa má vziať vstupný operand a kam umiestniť výstupný operand. Tieto metódy sa nazývajú adresovacie metódy.

Pre MP KR580VM80 existujú nasledujúce spôsoby adresovania:

Priamy;

Registrovať;

nepriame;

Skladaný.

Priamy adresovanie predpokladá, že (vstupný) operand sa nachádza v pamäti bezprostredne za kódom inštrukcie. Operand je väčšinou konštanta, ktorú treba niekam poslať, k niečomu pridať a pod., dáta sú obsiahnuté v druhom alebo druhom a treťom byte príkazu, pričom dolný bajt dát sa nachádza v druhom byte príkazu. a vysoký bajt v treťom príkazovom byte.

Rovno (aka absolútne) adresovanie predpokladá, že operand (vstup alebo výstup) sa nachádza v pamäti na adrese, ktorej kód sa nachádza vo vnútri programu hneď za kódom inštrukcie. Používa sa v trojbajtových príkazoch.

Registrovať adresovanie predpokladá, že operand (vstup alebo výstup) je v internom registri MP. Používa sa v jednobajtových príkazoch

Nepriame (implicitné) adresovanie predpokladá, že interný register MP neobsahuje samotný operand, ale jeho adresu v pamäti.

Stoh adresovanie predpokladá, že príkaz neobsahuje adresu. Adresovanie pamäťových buniek pomocou obsahu 16-bitového registra SP (ukazovateľ zásobníka).

Príkazový systém

Systém príkazov MP je úplný zoznam základných akcií, ktoré je MP schopný vykonávať. MP riadený týmito príkazmi vykonáva jednoduché úkony, ako sú elementárne aritmetické a logické operácie, prenos dát, porovnanie dvoch hodnôt a pod. Počet príkazov MP KR580VM80 je 78 (s prihliadnutím na modifikácie 244).

Rozlišujú sa tieto skupiny príkazov:

Prenos dát;

Aritmetika;

Hlavolam;

skokové príkazy;

Vstupné/výstupné, riadiace a zásobníkové príkazy.


Symboly a skratky používané pri popise príkazov a zostavovaní programov

Symbol Zníženie
ADDR 16-bitová adresa
ÚDAJE 8-bitové dáta
ÚDAJE 16 16-bitové dáta
PORT 8-bitová adresa I/O zariadenia
BYTE 2 Druhý bajt príkazu
BYTE 3 Tretí bajt príkazu
R, R1, R2 Jeden z registrov: A, B, C, D, E, H, L
R.P. Jeden z párov registrov: B - určuje pár BC; D - určuje pár DE; H – určuje dvojicu HL
RH Prvý register dvojice
R.L. Druhý register dvojice
Λ Logické násobenie
V Logický dodatok
Prídavok modulo dva
M Pamäťová bunka, ktorej adresa určuje obsah páru registrov HL, t.j. M = (HL)



Hore