Štruktúra inštrukcie jazyka symbolických inštrukcií obsahuje. Štruktúra príkazov v programovaní v assembleri na úrovni. Formát údajov jazyka assembleru a štruktúra príkazov

Príkazy v jazyku symbolických inštrukcií (prednáška)

PLÁN PREDNÁŠOK

1. Hlavné skupiny operácií.

Pentium.

1. Hlavné skupiny operácií

Mikroprocesory vykonávajú sadu inštrukcií, ktoré implementujú nasledujúce hlavné skupiny operácií:

špedičné operácie,

aritmetické operácie,

logické operácie,

zmenové operácie,

porovnávacie a testovacie operácie,

bitové operácie,

Operácie riadenia programu;

Operácie riadenia procesora.

2. Mnemokódy príkazov procesora Pentium

Pri popise príkazov sa zvyčajne používajú ich mnemotechnické označenia (mnemokódy), ktoré slúžia na špecifikáciu príkazu pri programovaní v jazyku Assembly. Pre rôzne verzie Assemblera sa môžu mnemotechnické kódy niektorých príkazov líšiť. Napríklad pre príkaz na volanie podprogramu sa používa mnemotechnický kódZAVOLAJTE alebo JSR ("Skoč do podprogram“). Mnemotechnické kódy väčšiny príkazov pre hlavné typy mikroprocesorov sú však rovnaké alebo sa mierne líšia, pretože ide o skratky zodpovedajúcich anglických slov, ktoré definujú vykonávanú operáciu. Zvážte mnemotechnické pomôcky príkazov prijaté pre procesory Pentium.

Príkazy dopredu. Hlavným príkazom tejto skupiny je príkazMOV , ktorý zabezpečuje prenos dát medzi dvoma registrami alebo medzi registrom a pamäťovou bunkou. Niektoré mikroprocesory realizujú prenos medzi dvoma pamäťovými bunkami, ako aj skupinový prenos obsahu niekoľkých registrov z pamäte. Napríklad mikroprocesory rodiny 68 Motorola xxx vykonať príkazMOVE , ktorý zabezpečuje prenos z jednej pamäťovej bunky do druhej, a príkazMOVEM , ktorý zapisuje do pamäte alebo načítava z pamäte obsah danej množiny registrov (až 16 registrov). TímXCHG vykonáva vzájomnú výmenu obsahu dvoch registrov procesora alebo registra a pamäťovej bunky.

Vstupné príkazy IN a výstup VON realizovať prenos údajov z registra procesora do externého zariadenia alebo príjem údajov z externého zariadenia do registra. Tieto príkazy určujú číslo zariadenia rozhrania (I/O port), cez ktoré sa prenášajú údaje. Všimnite si, že mnohé mikroprocesory nemajú špeciálne príkazy na prístup k externým zariadeniam. V tomto prípade sa vstup a výstup údajov v systéme vykonáva pomocou príkazuMOV , ktorý špecifikuje adresu požadovaného zariadenia rozhrania. Externé zariadenie je teda adresované ako pamäťová bunka a v adresnom priestore je pridelená špecifická sekcia, v ktorej sa nachádzajú adresy zariadení rozhrania (portov) pripojených k systému.

Príkazy pre aritmetické operácie. Hlavnými príkazmi v tejto skupine sú sčítanie, odčítanie, násobenie a delenie, ktoré majú množstvo možností. Príkazy na sčítanie PRIDAŤ a odčítanie SUB vykonávať príslušné operácie scvlastniť dva registre, register a pamäťové miesto, alebo používať okamžitý operand. Tímy AD C , SB B vykonať sčítanie a odčítanie s prihliadnutím na hodnotu atribútuC, nastavený počas vytvárania prevodu v procese vykonávania predchádzajúcej operácie. Pomocou týchto príkazov sa realizuje postupné pridávanie operandov, ktorých počet číslic presahuje kapacitu procesora. Tím NEG zmení znamienko operandu a prevedie ho na dvojkový doplnok.

Operácie násobenia a delenia je možné vykonávať na číslach so znamienkom (príkazyja MUL, ja DIV ) alebo nepodpísané (príkazy MUL, DIV ). Výsledok operácie sa nachádza v registri. Pri násobení (príkazyMUL , IMUL ) má za následok dvojciferný výsledok, ktorý na prispôsobenie používa dva registre. Pri delení (príkazyDIV , IDIV ) ako dividenda sa použije dvojciferný operand umiestnený v dvoch registroch a výsledkom je, že kvocient a zvyšok sa zapíšu do dvoch registrov.

Logické príkazy . Takmer všetky mikroprocesory vykonávajú logické operácie AND, OR, Exclusive OR, ktoré sa vykonávajú na bitoch operandov s rovnakým názvom pomocou príkazov A, ALEBO, X ALEBO . Operácie sa vykonávajú s obsahom dvoch registrov, registra a pamäťového miesta, alebo pomocou okamžitého operandu. Tím NIE Invertuje hodnotu každého bitu operandu.

Príkazy Shift. Mikroprocesory vykonávajú aritmetické, logické a cyklické posuny adresovaných operandov o jeden alebo viac bitov. Operand, ktorý sa má posúvať, môže byť v registri alebo pamäťovom mieste a počet bitov posunu je špecifikovaný pomocou bezprostredného operandu obsiahnutého v inštrukcii alebo určený obsahom špecifikovaného registra. Na realizácii posunu sa zvyčajne podieľa prestupové návestidloCv registri stavu (SR alebo EFLAGS), ktorý obsahuje posledný bit operandu, ktorý je vytiahnutý z registra alebo pamäťového miesta.

Porovnávacie a testovacie príkazy . Porovnanie operandov sa zvyčajne vykonáva s inštrukciouCMP , ktorý vykonáva odčítanie operandov s nastavením hodnôt vlastností N, Z, V, C v stavovom registri podľa výsledku. V tomto prípade sa výsledok odčítania neuloží a hodnoty operandov sa nezmenia. Následná analýza získaných charakteristických hodnôt umožňuje určiť relatívnu hodnotu (>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Niektoré mikroprocesory vykonávajú testovací príkaz TST , čo je variant s jedným operandom porovnávacej inštrukcie. Po vykonaní tohto príkazu sa nastavia znaky N, Z podľa znamienka a hodnoty (rovná sa alebo nenula) adresovaného operandu.

Pokyny na bitovú prevádzku . Tieto príkazy nastavujú hodnotu atribútuCv stavovom registri podľa hodnoty testovaného bitumld v adresovanom operande. V niektorých mikroprocesoroch je podľa výsledku testovania trochu nastavené znamienkoZ. Číslo testovacieho bitunsa nastavuje buď obsahom registra špecifikovaného v príkaze, alebo okamžitým operandom.

Príkazy tejto skupiny implementujú rôzne možnosti zmeny testovaného bitu BT ponechá hodnotu tohto bitu nezmenenú.Príkaz B T S po testovaní nastaví hodnotu mld=1 a príkaz B T C - význam mld=0.Príkaz B T C po otestovaní prevráti hodnotu bitu bn.

Operácie riadenia programu. Na ovládanie programu sa používa veľké množstvo príkazov, medzi ktoré patria:

- bezpodmienečné príkazy na prenos riadenia;

- príkazy podmieneného skoku;

- príkazy na organizovanie programových cyklov;

- príkazy na prerušenie;

- príkazy na zmenu funkcie.

Bezpodmienečné odovzdanie riadenia vykonáva príkazŽMP , ktorý sa načíta do počítadla programovPCnový obsah, ktorý je adresou ďalšieho príkazu, ktorý sa má vykonať. Táto adresa je buď priamo špecifikovaná v príkazeŽMP (priama adresa), alebo vypočítané ako súčet aktuálneho obsahuPCa ofset špecifikovaný v príkaze, čo je číslo so znamienkom (relatívne adresovanie). PretožePCobsahuje adresu nasledujúceho príkazu programu, potom posledná metóda nastaví adresu prechodu, posunutú vzhľadom na nasledujúcu adresu o daný počet bajtov. Ak je offset kladný, vykoná sa prechod na ďalšie príkazy programu, ak je offset záporný, na predchádzajúce.

Podprogram sa volá aj bezpodmienečným odovzdaním riadenia pomocou príkazuZAVOLAJTE (alebo JSR ). V tomto prípade však pred načítaním doPC nový obsah, ktorý špecifikuje adresu prvej inštrukcie podprogramu, je potrebné uložiť jej aktuálnu hodnotu (adresu nasledujúcej inštrukcie), aby sa zabezpečil návrat do hlavného programu po vykonaní podprogramu (alebo do predchádzajúci podprogram pri vkladaní podprogramov). Načítajú sa inštrukcie podmieneného skoku (vetvy programu).PCnový obsah pri splnení určitých podmienok, ktoré sa zvyčajne nastavujú podľa aktuálnej hodnoty rôznych atribútov v stavovom registri. Ak podmienka nie je splnená, vykoná sa ďalší príkaz programu.

Príkazy správy vlastností zabezpečujú zápis – čítanie obsahu stavového registra, v ktorom sú uložené vlastnosti, ako aj zmenu hodnôt jednotlivých vlastností. Napríklad procesory Pentium implementujú príkazy LAHF A SAHF , ktoré načítajú spodný bajt, ktorý obsahuje znamienka, zo stavového registra EFLAG na nízky bajt registra EAX a vyplnenie nízkeho bajtu EFLAGS z registra E AX.. Príkazy CLC, STC nastavte hodnoty príznaku prenosu CF=0, CF=1 a príkazu CMC spôsobí, že hodnota tejto funkcie bude invertovaná. Keďže vlastnosti určujú tok vykonávania programu počas podmienených skokov, na ovládanie programu sa zvyčajne používajú pokyny na zmenu vlastnosti.

Riadiace príkazy procesora . Do tejto skupiny patria príkazy stop, žiadna operácia a množstvo príkazov, ktoré určujú režim činnosti procesora alebo jeho jednotlivých blokov. TímHLT ukončí vykonávanie programu a uvedie procesor do stavu zastavenia, z ktorého opustenie nastane po prijatí signálov prerušenia alebo reštartu ( resetovať). Tím NOP Inštrukcia („prázdna“), ktorá nespôsobuje vykonanie žiadnych operácií, sa používa na implementáciu oneskorenia programu alebo vyplnenie medzier vytvorených v programe.

Špeciálne tímy CLI, STI zakázať a povoliť službu žiadostí o prerušenie. V procesoroch Pentium slúži na to riadiaci bit (príznak).AK v registri EFLAGS.

Mnoho moderných mikroprocesorov vydáva identifikačný príkaz, ktorý umožňuje používateľovi alebo iným zariadeniam získať informácie o type procesora použitého v danom systéme. V procesoroch Pentuim na to slúži príkaz CPUID , počas ktorej sa do registrov dostávajú potrebné údaje o spracovateľovi EAX,ebx,ECX,EDX a potom ich môže prečítať používateľ alebo operačný systém.

V závislosti od prevádzkových režimov implementovaných procesorom a zadaných typov spracovávaných dát je možné sadu spustiteľných príkazov výrazne rozšíriť.

Niektoré procesory pri spracovaní takýchto čísel vykonávajú aritmetické operácie BCD alebo špeciálne inštrukcie na opravu výsledkov. Mnoho vysokovýkonných procesorov obsahuje FPU - jednotka na spracovanie čísel c „plávajúca rádová čiarka“.

V mnohých moderných procesoroch je implementované skupinové spracovanie niekoľkých celých čísel alebo čísel. c „plávajúca desatinná čiarka“ jediným príkazom podľa princípu SIMD („Jedna inštrukcia – viacero dát “) - „Jeden príkaz – Veľa údajov“. Súčasné vykonávanie operácií na viacerých operandoch výrazne zvyšuje výkon procesora pri práci s obrazovými a zvukovými údajmi. Takéto operácie sú široko používané pri spracovaní obrazu, spracovaní audio signálu a iných aplikáciách. Na vykonávanie týchto operácií sa do procesorov zavádzajú špeciálne bloky, ktoré implementujú zodpovedajúce sady inštrukcií, ktoré v rôznych typoch procesorov ( Pentium, Athlon) dostal menoMMX (“ Milti- Rozšírenie médií “) – multimediálne rozšírenie,SSE(„Rozšírenie pre streamovanie SIMD“) – Streamovanie SIMD - predĺženie, “3 DRozšírenie- 3D rozšírenie.

Charakteristickým znakom procesorov spoločnosti Intel , počnúc modelom 80286, je prioritou pri prístupe k pamäti, ktorá sa poskytuje, keď procesor pracuje v režime chránenej virtuálnej adresy - “ Chránený režim “ (chránený režim). Na implementáciu tohto režimu sa používajú špeciálne skupiny príkazov, ktoré slúžia na organizáciu ochrany pamäte v súlade s akceptovaným algoritmom prioritného prístupu.

Štruktúra inštrukcie v jazyku symbolických inštrukcií Programovanie na úrovni strojových inštrukcií je minimálna úroveň, na ktorej je možné počítačové programovanie. Systém strojových inštrukcií by mal byť dostatočný na implementáciu požadovaných činností vydávaním inštrukcií hardvéru stroja. Každá strojová inštrukcia pozostáva z dvoch častí: prevádzkovej časti, ktorá definuje „čo robiť“ a operandu, ktorý definuje objekty spracovania, teda „čo robiť“. Strojová inštrukcia mikroprocesora, napísaná v jazyku symbolických inštrukcií, je jednoriadková a má nasledujúcu formu: návestná inštrukcia/direktívny operand(y) ; komentáre Návestie, príkaz/direktíva a operand sú oddelené aspoň jednou medzerou alebo tabulátorom. Inštrukčné operandy sú oddelené čiarkami.

Štruktúra inštrukcie v jazyku symbolických inštrukcií Inštrukcia v jazyku symbolických inštrukcií hovorí kompilátoru, 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 špecifikuje počiatočnú hodnotu dát (v dátovom segmente) alebo prvkov, na ktoré má inštrukcia pôsobiť (v kódovom segmente). 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, potom sa použije znak spätnej lomky: "" . V predvolenom nastavení assembler nerozlišuje medzi veľkými a malými písmenami v príkazoch a príkazoch. Príklady smerníc 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 255 znakov, ale prekladateľ akceptuje prvých 32, ostatné ignoruje. Všetky štítky, ktoré sú napísané na riadku, ktorý neobsahuje direktívu assembleru, musia končiť dvojbodkou „:“. Označenie, príkaz (smernica) a operand nemusia začínať na žiadnej konkrétnej pozícii v reťazci. 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 ":". Označenie, príkaz (smernica) a operand nemusia začínať na žiadnej konkrétnej pozícii v reťazci. Odporúča sa ich zapisovať do stĺpca pre väčšiu čitateľnosť programu.

Komentáre Použitie komentárov v programe zlepšuje jeho prehľadnosť, najmä ak nie je jasný účel súboru pokynov. Komentáre začínajú na ľubovoľnom riadku zdrojového modulu 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 „medzery“. Komentár môže zaberať celý riadok alebo nasledovať príkaz na rovnakom riadku.

Štruktúra programu v assembleri Program 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 údajov, zásobníka a segmentov kódu. Každý úplný 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ť program, dáta a segmenty zásobníka deklarované príslušnými direktívami.

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é modely pamäte v assembleri: Pamäťový model Adresovanie kódu Adresovanie dát Operačný systém Kód a prekladanie dát TINY BLÍZKO MS-DOS Platné MALÉ BLÍZKO MS-DOS, Windows Nie STREDNÁ ĎALEKO BLÍZKO MS-DOS, Windows Nie KOMPAKTNÝ BLÍZKO ĎALEKO MS-DOS, Windows Žiadny VEĽKÝ ĎALEKÝ MS-DOS, Windows Žiadny VEĽKÝ ĎALEKÝ MS-DOS, Windows nie BLÍZKO Windows 2000, Windows XP, Windows Platný BYT BLÍZKO NT,

Pamäťové modely Malý model funguje iba v 16-bitových aplikáciách MS-DOS. V tomto modeli sa všetky údaje a kód nachádzajú v 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 pri použití tohto modelu sú adresované ako blízko (blízko). Stredný model podporuje viacero segmentov kódu a jeden segment údajov, pričom všetky odkazy v segmentoch kódu sa štandardne považujú za vzdialené (ďaleko) a prepojenia v segmente údajov sa považujú za blízke (blízko). Kompaktný model podporuje viacero dátových segmentov, ktoré používajú vzdialené adresovanie dát (ďaleko) a jeden kódový segment, ktorý používa blízke adresovanie dát (blízko). 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ú programovú konfiguráciu 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 sa nachádzajú v rovnakom 32-bitovom segmente. 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 príkazov dostupných pri písaní programov. Písmeno p za príkazom na výber procesora znamená chránený režim prevádzky. 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 av súčasnosti je jedinou podporovanou hodnotou pre tento parameter. Parameter stack_param 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 „nič nerobiť“. 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 súvisí s fungovaním prekladača. . 686 P - Príkazy chráneného režimu Pentium 6 (Pentium II) sú povolené. Táto direktíva vyberá podporovanú inštrukčnú sadu assemblera špecifikovaním modelu procesora. . MODEL FLAT, stdcall - plochý pamäťový model. Tento model pamäte sa používa na operačnej sále systém Windows. stdcall je konvencia volania procedúr, ktorá sa má použiť.

Príklad programu „nič nerobiť“. 686 P. VZOR BYTU, STDCALL. ÚDAJE. ZAČIATOK KÓDU: ZNOVU KONIEC ZAČIATOK . DATA - programový segment obsahujúci dáta. Tento program nepoužíva zásobník, takže segment. Chýba STACK. . CODE - segment programu obsahujúci kód. ŠTART - štítok. KONIEC ŠTART - koniec programu a správa pre kompilátor, že program treba spustiť z označenia ŠTART. Každý program musí obsahovať direktívu END označujúcu koniec zdrojový kód programy. Všetky riadky, ktoré nasledujú po direktíve END, sú ignorované Návestie za direktívou END hovorí kompilátoru názov hlavného modulu, od ktorého začína vykonávanie programu. Ak program obsahuje jeden modul, označenie za direktívou END možno vynechať.

Prekladače jazyka symbolizácií Prekladač je program alebo hardvér, ktorý konvertuje program prezentovaný v jednom z programovacích jazykov na program v cieľovom jazyku, ktorý sa nazýva objektový kód. Okrem podpory mnemotechnických pomôcok strojových inštrukcií má každý prekladateľ vlastnú sadu príkazov a makier, často nekompatibilných s čímkoľvek iným. Hlavné typy prekladačov jazyka symbolických inštancií sú: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - voľne distribuovaný viacpriechodový assembler napísaný Tomaszom Gryshtarom (Poľský), NASM (Netwide Assembler) - a bezplatný assembler pre architektúru Intel x 86 bol vytvorený Simonom Tathamom s Julianom Hallom a v súčasnosti ho vyvíja malý vývojový tím 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ý->Projekt menu 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) pridajte"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

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

Preklad programu v Microsoft Visual Studio 2005 5) Nastavte možnosti kompilátora. Vyberte na pravom tlačidle v ponuke súboru projektu Custom Build Rules…

Preklad programu v Microsoft Visual Studio 2005 av zobrazenom okne vyberte Microsoft Macro Assembler.

Preklad programu v Microsoft Visual Studio 2005 Skontrolujte pravým tlačidlom v súbore ahoj. asm stromu projektu z ponuky Vlastnosti a nastavte 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. Program pre Windows z veľkej časti pozostáva z takýchto volaní. Všetky interakcie s externých zariadení a prostriedky operačného systému sa spravidla vyskytujú prostredníctvom takýchto funkcií. Operačný systém Windows používa model s plochou pamäťou. Adresa ľubovoľného miesta v pamäti 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é okno), konzolová alebo bezokenná štruktúra, klasická štruktúra (okno, rám).

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

Volanie funkcií Windows API do správy. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); 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ľ reťazca, UINT je 32-bitové celé číslo. Prípona „A“ sa často pridáva k názvu funkcií, aby ste prešli na novšie verzie funkcií.

Volanie funkcií Windows API do správy. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); 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 krát 4 (bajty v každom argumente): N=4*n. Na volanie funkcie sa používa inštrukcia CALL assembleru. V tomto prípade sú všetky argumenty funkcie odovzdané cez zásobník (príkaz PUSH). Smer odovzdávania argumentu: ZĽAVA DOPRAVA – ZDOLU NAHOR. Argument u bude vložený do zásobníka ako prvý. typu. Volanie zadanej funkcie bude vyzerať takto: CALL Message. box. A@16

Volanie funkcií Windows API do správy. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Výsledkom vykonania akejkoľvek funkcie API je zvyčajne celé číslo, ktoré sa vráti v registri EAX. Direktíva OFFSET je "odsadenie segmentu" alebo, v jazykoch na vysokej úrovni, "ukazovateľ" na začiatok reťazca. Direktíva EQU, podobne ako #define v C, definuje konštantu. Direktíva EXTERN hovorí kompilátoru, že funkcia alebo identifikátor je pre 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 tiež umožňuje zjednodušiť volanie funkcie pomocou nástroja makra - 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. makrá prekladača vkladajú parametre do zásobníka. na použitie direktívy INVOKE musíte mať popis prototypu funkcie pomocou direktívy PROTO v tvare: Správa. box. A PROTO: DWORD, : DWORD

Štruktúry v jazyku symbolických inštrukcií

Polia, ktoré sme uvažovali vyššie, sú kolekciou prvkov rovnakého typu. Ale často v aplikáciách je potrebné zvážiť určitý súbor údajov iný typ ako nejaký jediný typ.

To je veľmi aktuálne napríklad pri databázových programoch, kde je potrebné k jednému objektu priradiť kolekciu dát rôznych typov.

Napríklad predtým sme sa pozreli na výpis 4, ktorý pracoval s poľom trojbajtových prvkov. Každý prvok boli zase dva prvky rôznych typov: jednobajtové pole počítadla a dvojbajtové pole, ktoré mohlo niesť nejaké ďalšie informácie potrebné na ukladanie a spracovanie. Ak je čitateľ oboznámený s jedným z jazykov na vysokej úrovni, potom vie, že takýto objekt je zvyčajne opísaný pomocou špeciálneho typu údajov - štruktúry.

Aby sa zlepšila použiteľnosť assembleru, bol do neho zavedený aj tento dátový typ.

A-priorstvo štruktúru je dátový typ pozostávajúci z pevného počtu prvkov rôznych typov.

Ak chcete použiť štruktúry v programe, musíte urobiť tri veci:

    Opýtať sa šablóna štruktúry .

    V podstate to znamená definovanie nového dátového typu, pomocou ktorého možno neskôr definovať premenné tohto typu.

    Definujte inštancia štruktúry .

    Táto fáza zahŕňa inicializáciu špecifickej premennej s preddefinovanou (pomocou šablóny) štruktúrou.

    Organizovať prístup k členom štruktúry .

Je veľmi dôležité, aby ste od samého začiatku pochopili, aký je medzi nimi rozdiel popisštruktúr v programe a jeho definícia.

popísať štruktúra v programe znamená len naznačiť jeho schému alebo vzor; pamäť nie je pridelená.

Túto šablónu možno považovať len za informáciu pre prekladateľa o umiestnení polí a ich predvolenej hodnote.

Definujte Štruktúra znamená dať prekladateľovi pokyn, aby pridelil pamäť a priradil symbolické meno tejto pamäťovej oblasti.

Štruktúru v programe môžete opísať iba raz a definovať ju ľubovoľný počet krát.

Popis šablóny štruktúry

Deklarácia šablóny štruktúry má nasledujúcu syntax:

názov_štruktúry STRUC

názov_štruktúry ENDS

Tu je postupnosť príkazov na popis údajov db, dw, dd, dq A dt.

Ich operandy určujú veľkosť polí a voliteľne počiatočné hodnoty. Tieto hodnoty pravdepodobne inicializujú zodpovedajúce polia, keď je definovaná štruktúra.

Ako sme už poznamenali pri popise šablóny, nie je pridelená žiadna pamäť, pretože je to len informácia pre prekladateľa.

Polohašablóna v programe môže byť ľubovoľná, ale podľa logiky jednopriechodového prekladača sa musí nachádzať pred miestom, kde je definovaná premenná s typom tejto štruktúry. To znamená, že pri popise premennej s typom nejakej štruktúry v dátovom segmente musí byť jej šablóna umiestnená na začiatku dátového segmentu alebo pred ním.

Zvážte prácu so štruktúrami na príklade modelovania databázy zamestnancov určitého oddelenia.

Pre jednoduchosť, aby sme sa vyhli problémom s konverziou informácií počas zadávania, súhlasíme s tým, že všetky polia sú symbolické.

Definujme štruktúru záznamov tejto databázy s nasledujúcim vzorom:

Definovanie údajov pomocou typu štruktúry

Pre použitie štruktúry popísanej pomocou šablóny v programe je potrebné definovať premennú s typom tejto štruktúry. Používa sa na to nasledujúca syntax:

[názov premennej] názov_štruktúry

    názov premennej- variabilný identifikátor daného konštrukčného typu.

    Zadanie názvu premennej je voliteľné. Ak nie je zadaný, oblasť pamäte s veľkosťou súčtu dĺžok všetkých konštrukčné prvky.

    zoznam hodnôt- čiarkami oddelený zoznam počiatočných hodnôt prvkov štruktúry uzavretých v lomených zátvorkách.

    Jeho úloha je tiež voliteľná.

    Ak je zoznam neúplný, všetky polia štruktúry pre danú premennú sa inicializujú hodnotami zo šablóny, ak nejaké existujú.

    Je povolené inicializovať jednotlivé polia, ale v tomto prípade musia byť chýbajúce polia oddelené čiarkami. Chýbajúce polia budú inicializované hodnotami zo šablóny struct. Ak pri definovaní novej premennej s typom tejto štruktúry súhlasíme so všetkými hodnotami polí v jej šablóne (teda predvolene nastavenými), stačí napísať lomené zátvorky.

    Napr.: víťazný pracovník.

Napríklad definujme niekoľko premenných s typom štruktúry opísanej vyššie.

Štruktúrne metódy

Myšlienkou zavedenia štrukturálneho typu do akéhokoľvek programovacieho jazyka je spojiť premenné rôznych typov do jedného objektu.

Jazyk musí poskytovať prostriedky na prístup k týmto premenným v rámci konkrétnej inštancie štruktúry. Aby bolo možné v príkaze odkazovať na pole nejakej štruktúry, používa sa špeciálny operátor - symbol". " (bodka). Používa sa v nasledujúcej syntaxi:

    adresa_výraz- identifikátor premennej nejakého štruktúrneho typu alebo výraz v zátvorkách v súlade s nižšie uvedenými syntaktickými pravidlami (obr. 1);

    názov_poľa štruktúry- názov poľa zo šablóny štruktúry.

    Toto je v skutočnosti tiež adresa, alebo skôr posun poľa od začiatku štruktúry.

Takže operátor" . “ (bodka) vyhodnocuje výraz

Ryža. 5. Syntax výrazu adresy v operátorovi prístupu k poli štruktúry

Ukážme si na príklade nami definovanú štruktúru pracovník niektoré techniky práce so štruktúrami.

Napríklad extrahovať do sekera hodnoty poľa s vekom. Keďže je nepravdepodobné, že vek práceneschopnej osoby bude vyšší ako 99 rokov, po umiestnení obsahu tohto znakového poľa do registra sekera bude vhodné previesť ho na binárnu reprezentáciu pomocou príkazu aad.

Buďte opatrní, pretože kvôli princípu ukladania údajov „nízky bajt na nízkej adrese“ bude umiestnená najvyššia číslica veku al, a najmladší v Ach.

Ak to chcete opraviť, stačí použiť príkaz xchg al, ach:

mov sekera,slovo ptr sotr1.vek ;v al veku sotr1

a je to možné takto:

Ďalšia práca s poľom štruktúr sa vykonáva rovnakým spôsobom ako s jednorozmerným poľom. Tu vyvstáva niekoľko otázok:

Ako sa vysporiadať s veľkosťou a ako zorganizovať indexovanie prvkov poľa?

Rovnako ako ostatné identifikátory definované v programe, prekladač priraďuje názov typu štruktúry a názov premennej s typom štruktúry atribút typu. Hodnota tohto atribútu je veľkosť v bajtoch, ktoré zaberajú polia tejto štruktúry. Túto hodnotu môžete extrahovať pomocou operátora typu.

Akonáhle je veľkosť inštancie štruktúry známa, organizovanie indexovania v poli štruktúr nie je obzvlášť ťažké.

Napr.:

Ako skopírovať pole z jednej štruktúry do zodpovedajúceho poľa inej štruktúry? Alebo ako skopírovať celú štruktúru? Skopírujeme pole nám tretí zamestnanec v odbore nám piaty zamestnanec:

mas_sotr worker 10 dup()

mov bx,offset mas_sotr

mov si,(typ robotník)*2 ;si=77*2

mov di,(typ robotník)*4 ;si=77*4

Zdá sa mi, že remeslo programátora z človeka skôr či neskôr spraví dobrú gazdinku. On, rovnako ako ona, neustále hľadá, kde by niečo ušetril, ukrojil a urobil skvelú večeru z minima jedla. A ak sa to podarí, morálne zadosťučinenie nie je o nič menšie a možno viac ako z úžasnej večere u domácej pani. Miera tohto uspokojenia, zdá sa mi, závisí od miery lásky k svojmu povolaniu.

Na druhej strane, pokrok vo vývoji softvéru a hardvéru programátora do istej miery uvoľňuje a dosť často nastáva situácia podobná známemu prísloviu o muche a slonovi - na vyriešenie nejakého drobného problému sa používajú ťažké nástroje. ktorých efektivita je vo všeobecnosti významná len pri realizácii relatívne veľkých projektov.

Prítomnosť nasledujúcich dvoch typov údajov v jazyku je pravdepodobne spôsobená túžbou „hostesky“ čo najefektívnejšie využívať pracovnú plochu stola (RAM) pri príprave jedla alebo na umiestňovanie produktov (údaje programu ).

Podľa účelu možno rozlíšiť príkazy (príklady mnemotechnických operačných kódov príkazov zostavovateľa PC, ako je IBM PC, sú uvedené v zátvorkách):

Vykonávam aritmetické operácie (ADD a ADC - sčítanie a sčítanie s prenosom, SUB a SBB - odčítanie a odčítanie s pôžičkou, MUL a IMUL - násobenia bez znamienka a so znamienkom, DIV a IDIV - delenie bez znamienka a so znamienkom, CMP - porovnania atď.) ;

l vykonávanie logických operácií (OR, AND, NOT, XOR, TEST atď.);

l prenos dát (MOV - odoslať, XCHG - výmena, IN - vstup do mikroprocesora, OUT - stiahnutie z mikroprocesora atď.);

l prenos riadenia (vetvy programu: JMP - nepodmienená vetva, CALL - volanie procedúry, RET - návrat z procedúry, J* - podmienená vetva, LOOP - riadenie slučky atď.);

l spracovanie reťazcov znakov (MOVS - prenosy, CMPS - porovnania, LODS - sťahovanie, SCAS - skenovanie. Tieto príkazy sa zvyčajne používajú s predponou (modifikátorom opakovania) REP;

l programové prerušenia (INT - softvérové ​​prerušenia, INTO - podmienené prerušenia pri pretečení, IRET - návrat z prerušenia);

l mikroprocesorové ovládanie (ST* a CL* - nastavenie a vymazanie príznakov, HLT - stop, WAIT - pohotovostný režim, NOP - nečinnosť atď.).

S úplný zoznam príkazy assembleru nájdete v prac.

Príkazy na prenos údajov

l MOV dst, src - prenos dát (presun - presun z src do dst).

Prenosy: jeden bajt (ak sú src a dst v bytovom formáte) alebo jedno slovo (ak sú src a dst vo formáte slova) medzi registrami alebo medzi registrom a pamäťou a zapíše okamžitú hodnotu do registra alebo pamäte.

Operandy dst a src musia mať rovnaký formát – bajt alebo slovo.

Src môže byť typu: r (register) - register, m (pamäť) - pamäť, i (impedancia) - okamžitá hodnota. Dst môže byť typu r, m. Operandy nemožno použiť v jednom príkaze: rsegm spolu s i; dva operandy typu m a dva operandy typu rsegm). Operand i môže byť aj jednoduchý výraz:

mov AX, (152 + 101B) / 15

Vyhodnotenie výrazov sa vykonáva iba počas prekladu. Vlajky sa nemenia.

l PUSH src - vloženie slova do zásobníka (push - pretlačiť; push to stack from src). Vloží obsah src na vrch zásobníka – akýkoľvek 16-bitový register (vrátane segmentu) alebo dve pamäťové miesta obsahujúce 16-bitové slovo. Vlajky sa nemenia;

l POP dst - extrahovanie slova zo zásobníka (pop - pop; počítanie zo zásobníka v dst). Odstráni slovo z hornej časti zásobníka a umiestni ho do dst - akéhokoľvek 16-bitového registra (vrátane segmentu) alebo dvoch pamäťových miest. Vlajky sa nemenia.

Programovanie na úrovni strojových inštrukcií je minimálna úroveň, na ktorej je programovanie možné. Systém strojových inštrukcií musí byť dostatočný na vykonanie požadovaných akcií vydávaním inštrukcií hardvéru počítača.

Každá strojová inštrukcia pozostáva z dvoch častí:

  • operačná sála – určenie „čo robiť“;
  • operand - definovanie objektov spracovania, „čo robiť“.

Strojová inštrukcia mikroprocesora napísaná v jazyku symbolických inštrukcií je jednoriadková s nasledujúcou syntaktickou formou:

label príkaz/direktíva operand(y) ;komentáre

V tomto prípade je povinným poľom v riadku príkaz alebo príkaz.

Označenie, príkaz/smernica a operandy (ak existujú) sú oddelené aspoň jednou medzerou alebo tabulátorom.

Ak príkaz alebo príkaz musí pokračovať na ďalšom riadku, potom sa použije znak spätnej lomky: \.

V predvolenom nastavení jazyk assembleru nerozlišuje medzi veľkými a malými písmenami v príkazoch alebo príkazoch.

Príklad riadkov kódu:

Countdb 1 ;Názov, príkaz, jeden operand
mov eax,0 ;Príkaz, dva operandy
cbw ; Tím

Tagy

Označenie v jazyku symbolických inštancií môže obsahovať nasledujúce symboly:

  • všetky písmená latinskej abecedy;
  • čísla od 0 do 9;
  • špeciálne znaky: _, @, $, ?.

Bodka môže byť použitá ako prvý znak označenia, ale niektoré kompilátory tento znak odrádzajú. Názvy rezervovaných jazykov zostavy (smernice, operátory, názvy príkazov) nemožno použiť ako štítky.

Prvý znak v označení musí byť písmeno alebo špeciálny znak (nie číslo). Maximálna dĺžka štítku je 31 znakov. Všetky štítky, ktoré sú napísané na riadku, ktorý neobsahuje direktívu assembleru, musia končiť dvojbodkou: .

Tímy

Tím hovorí prekladateľovi, akú činnosť má mikroprocesor vykonať. V dátovom segmente príkaz (alebo direktíva) definuje pole, pracovný priestor alebo konštantu. V segmente kódu inštrukcia definuje akciu, ako je pohyb (mov) alebo pridanie (add).

smernice

Assembler má množstvo operátorov, ktoré vám umožňujú riadiť proces zostavovania a generovania výpisu. Títo operátori sú tzv smernice . Konajú iba v procese zostavovania programu a na rozdiel od inštrukcií negenerujú strojové kódy.

operandy

Operand – objekt, na ktorom sa vykonáva príkaz stroja alebo operátor programovacieho jazyka.
Inštrukcia môže mať jeden alebo dva operandy alebo vôbec žiadne operandy. Počet operandov je implicitne určený kódom inštrukcie.
Príklady:

  • Žiadne operandy ret ;Návrat
  • Jeden operand inc ecx ;Prírastok ecx
  • Dva operandy pridajú eax,12 ;Pridajú 12 k eax

Označenie, príkaz (smernica) a operand nemusia začínať na žiadnej konkrétnej pozícii v reťazci. Pre väčšiu čitateľnosť programu sa ich však odporúča zapisovať do stĺpca.

Operandy môžu byť

  • identifikátory;
  • reťazce znakov v jednoduchých alebo dvojitých úvodzovkách;
  • celé čísla v dvojkovej, osmičkovej, desiatkovej alebo šestnástkovej sústave.
Identifikátory

Identifikátory – sekvencie platných znakov používaných na označenie programových objektov, ako sú operačné kódy, názvy premenných a názvy návestí.

Pravidlá zápisu identifikátorov.

  • Identifikátor môže byť jeden alebo viac znakov.
  • Ako znaky môžete použiť písmená latinskej abecedy, čísla a niektoré špeciálne znaky: _, ?, $, @.
  • Identifikátor nemôže začínať číslicou.
  • ID môže mať dĺžku až 255 znakov.
  • Prekladateľ akceptuje prvých 32 znakov identifikátora a ostatné ignoruje.
Komentáre

Komentáre sú oddelené od spustiteľného riadku znakom; . V tomto prípade všetko, čo je napísané za bodkočiarkou a až do konca riadku, je komentár. Použitie komentárov v programe zlepšuje jeho prehľadnosť, najmä ak nie je jasný účel súboru pokynov. Komentár môže obsahovať ľubovoľné tlačiteľné znaky vrátane medzier. Komentár môže zaberať celý riadok alebo nasledovať príkaz na rovnakom riadku.

Štruktúra montážneho programu

Program napísaný v assembleri sa môže skladať z niekoľkých častí, tzv modulov . Každý modul môže definovať jeden alebo viac dátových, zásobníkových a kódových segmentov. Každý úplný 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ť kód, dáta a segmenty zásobníka deklarované príslušnými direktívami. Pred deklarovaním segmentov musíte špecifikovať pamäťový model pomocou direktívy .MODEL.

Príklad programu „nerobiť nič“ v jazyku symbolických inštancií:

686P
.MODEL BYT, STDCALL
.DÁTA
.KÓD
ŠTART:

RET
KONIEC ŠTART

Tento program obsahuje iba jednu inštrukciu mikroprocesora. Tento príkaz je RET. Zabezpečuje správne ukončenie programu. Vo všeobecnosti sa tento príkaz používa na ukončenie procedúry.
Zvyšok programu súvisí s fungovaním prekladača.
.686P - Príkazy chráneného režimu Pentium 6 (Pentium II) sú povolené. Táto direktíva vyberá podporovanú inštrukčnú sadu assemblera špecifikovaním modelu procesora. Písmeno P na konci smernice hovorí prekladateľovi, že procesor beží v chránenom režime.
.MODEL FLAT, stdcall je model s plochou pamäťou. Tento pamäťový model sa používa v operačný systém Windows. stdcall
.DATA je segment programu obsahujúci dáta.
.CODE je programový blok obsahujúci kód.
ŠTART je označenie. V assembleri hrajú štítky veľkú úlohu, čo sa o moderných jazykoch na vysokej úrovni povedať nedá.
KONIEC ŠTART - koniec programu a správa pre prekladateľa, že program treba spustiť z označenia ŠTART.
Každý modul musí obsahovať direktívu END, ktorá označuje koniec zdrojového kódu programu. Všetky riadky, ktoré nasledujú direktívu END, sú ignorované. Vynechanie direktívy END generuje chybu.
Návestie za direktívou END hovorí kompilátoru názov hlavného modulu, od ktorého začína vykonávanie programu. Ak program obsahuje jeden modul, označenie za direktívou END možno vynechať.




Hore