Jazyk zhromaždenia príkazu. Všeobecná charakteristika systému príkazov jazyka Assembler pre IBM-PC (základná sada príkazov, základné metódy adresovania operandov). Štruktúra programu Assembler. V disciplíne „Programovanie systému“

Assembler Commands (prednáška)

PLÁN PREDNÁŠKY

1. Hlavné skupiny operácií.

Pentium.

1. Základné skupiny operácií

Mikroprocesory vykonávajú sadu pokynov, ktoré implementujú nasledujúce základné skupiny operácií:

Špedičné operácie,

Aritmetické operácie,

Logické operácie,

Operácie na zmeny,

Operácie porovnávacích testov,

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 (mnemotechnické kódy), ktoré sa používajú na nastavenie príkazu pri programovaní v jazyku Assembly. Pre rôzne verzie Assemblera sa mnemotechnické kódy niektorých príkazov môžu líšiť. Napríklad pre príkaz na vyvolanie podprogramu sa použije mnemotechnický kódVOLAJTE alebo JSR ("Skoč do SubRoutine“). Mnemotechnické kódy väčšiny príkazov pre hlavné typy mikroprocesorov sa však zhodujú alebo mierne líšia, pretože ide o skratky zodpovedajúcich anglických slov, ktoré určujú vykonávanú operáciu. Zvážte mnemotechnické kódy príkazov prijatých pre procesoryPentium.

Preposielanie príkazov. Hlavným tímom tejto skupiny je tímMOV , ktorý poskytuje 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 hromadný prenos obsahu niekoľkých registrov z pamäte. Napríklad mikroprocesory rodiny 68xxx od spoločnosti Motorola vykonajte príkazPOHYB , poskytujúci prenos z jednej pamäťovej bunky do druhej a príkazMOVEM , ktorý zapisuje do pamäte alebo načíta z pamäte obsah danej sady registrov (až 16 registrov). VelenieXCHG uskutočňuje vzájomnú výmenu obsahu dvoch registrov procesora alebo registra a pamäťovej bunky.

Vstupné príkazy IN a výber VON prenášať údaje z registra procesora do externého zariadenia alebo prijímať údaje z externého zariadenia do registra. Tieto príkazy určujú číslo zariadenia rozhrania (I / O port), cez ktoré sa prenášajú údaje. Upozorňujeme, že veľa mikroprocesorov nemá špeciálne príkazy na prístup k externým zariadeniam. V takom prípade sa vstup a výstup údajov v systéme vykonáva pomocou príkazuMOV , v ktorom je nastavená adresa požadovaného zariadenia rozhrania. Externé zariadenie je teda adresované ako pamäťová bunka a určitá časť je vyhradená v adresnom priestore, v ktorom sú umiestnené adresy prepojovacích zariadení (portov) pripojených k systému.

Aritmetické príkazy. Hlavnými príkazmi v tejto skupine sú príkazy na sčítanie, odčítanie, násobenie a delenie, ktoré majú niekoľko možností. Príkazy na sčítanie PRIDAŤ a odčítanie SUB vykonávať príslušné operácie scposadnutý dvoma registrami, registrom a umiestnením pamäte, alebo pomocou okamžitého operandu. Príkazy AD C. , SB B sčítanie a odčítanie sa vykonáva s prihliadnutím na hodnotu atribútuC., ktorá sa nastaví, keď sa prenos vytvorí počas predchádzajúcej operácie. Tieto pokyny sa používajú na implementáciu postupného pridávania operandov, ktorých počet bitov presahuje kapacitu procesora. Velenie NEG zmení znak operandu a prevedie ho do kódu komplementu.

Operácie násobenia a delenia je možné vykonávať na podpísaných číslach (príkazyJa MUL, Ja DIV ) alebo nepodpísané (príkazy MUL, DIV Jeden z operandov je vždy alokovaný v registri, druhý môže byť v registri, umiestnení v pamäti alebo môže byť okamžitým operandom. Výsledok operácie sa nachádza v registri. Pri násobení (príkazyMUL , IMUL ), výsledkom je dvojciferný výsledok, pre ktorý sa používajú dva registre. Pri delení (príkazyDIV , IDIV ) ako dividenda sa používa dvojciferný operand umiestnený v dvoch registroch, vďaka čomu sa kvocient a zvyšok zapíšu do dvoch registrov.

Boolovské príkazy ... Takmer všetky mikroprocesory vykonávajú logické operácie AND, OR, Exclusive OR, ktoré sa vykonávajú na rovnakých bitoch operandov pomocou príkazov AND, OR, X ALEBO ... Operácie sa vykonávajú s obsahom dvoch registrov, registra a umiestnenia v pamäti, alebo pomocou okamžitého operandu. Velenie NIE invertuje hodnotu každého bitu operandu.

Príkazy Shift... Mikroprocesory uskutočňujú aritmetické, logické a cyklické posuny adresovaných operandov o jeden alebo viac bitov. Posunutý operand môže byť v registri alebo na pamäťovom mieste a počet bitov posunu je špecifikovaný pomocou okamžitého operandu obsiahnutého v inštrukcii alebo je určený obsahom špecifikovaného registra. Znak na prenášanie sa zvyčajne podieľa na realizácii zmenyC. v registri stavu (SRalebo EFLAGY), ktorý obsahuje posledný bit operandu, ktorý je presunutý z registra alebo z pamäťovej bunky.

Porovnajte a otestujte tímy ... Porovnanie operandov sa zvyčajne vykonáva pomocou príkazuCMP , ktorý odčíta operandy s nastavením charakteristických hodnôt N, Z, V, C v stavovom registri podľa výsledku. V takom prípade sa výsledok odčítania neuloží a hodnoty operandov sa nezmenia. Následná analýza získaných hodnôt funkcií umožňuje určiť relatívnu hodnotu (\u003e,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Niektoré mikroprocesory vykonávajú testovací príkaz TST , čo je variant jedného príkazu na porovnanie. Spustením tohto príkazu nastavíte N, Z podľa znamienka a hodnoty (rovnej alebo rovnej nule) adresovaného operandu.

Príkazy bitových operácií ... Tieto príkazy nastavujú hodnotu atribútuC. v stavovom registri podľa hodnoty testovaného bitubn v adresovanom operandovi. V niektorých mikroprocesoroch je podľa výsledku testovania bitu nastavené znamienkoZ... Skúšobné číslo bitun sa nastavuje buď obsahom registra uvedeného v príkaze, alebo okamžitým operandom.

Príkazy tejto skupiny implementujú rôzne možnosti zmeny testovaného bitu. BT udržuje hodnotu tohto bitu nezmenenú. B T S po teste nastaví hodnotu bn\u003d 1 a príkaz B T C. - hodnota bn\u003d 0 príkaz B T C. po otestovaní invertuje hodnotu bn bitu.

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;

- tímy pre organizovanie programových cyklov;

- prerušovacie príkazy;

- príkazy na zmenu funkcií.

Bezpodmienečný prenos kontroly sa vykonáva príkazomJMP ktorý sa načíta do počítadla programuPC nový obsah, čo je adresa nasledujúceho príkazu, ktorý sa má vykonať. Táto adresa je buď priamo zadaná v príkazeJMP (priame adresovanie) alebo vypočítané ako súčet aktuálneho obsahuPC a offset príkazu, čo je podpísané číslo (relatívne adresovanie). PretožePC obsahuje adresu nasledujúceho príkazu programu, potom posledná metóda nastaví posun adresy skoku od nasledujúcej adresy o zadaný počet bajtov. Pri pozitívnom posunutí sa vykoná prechod na nasledujúce príkazy programu, pri negatívnom posunutí - na predchádzajúce.

Volanie podprogramu sa uskutoční aj bezpodmienečným odovzdaním riadenia pomocou príkazuVOLAJTE (alebo JSR ). V takom prípade však pred načítaním doPC nový obsah, ktorý nastavuje adresu prvého príkazu podprogramu, je potrebné uložiť jeho aktuálnu hodnotu (adresu nasledujúceho príkazu), aby sa po vykonaní podprogramu zabezpečil návrat k hlavnému programu (alebo k predchádzajúcemu podprogramu pri vnorení podprogramov). Načítajú sa podmienené príkazy vetiev (vetvy programu)PC nový obsah, ak sú splnené určité podmienky, ktoré sú zvyčajne nastavené v súlade s aktuálnou hodnotou rôznych znamienok v registri stavu. Ak podmienka nie je splnená, vykoná sa ďalší programový príkaz.

Príkazy na správu funkcií poskytujú zápis - čítanie obsahu stavového registra, v ktorom sú uložené funkcie, ako aj zmenu hodnôt jednotlivých prvkov. Napríklad v procesoroch Pentium sú príkazy implementované LAHF a SAHF ktoré načítajú nízky bajt obsahujúci znaky zo stavového registra EFLAG na nízky bajt registra EAX a vyplnenie dolného bajtu EFLAGY z registra E AX.. Tímy CLC, STC vykonajte nastavenie hodnôt znaku prenosu CF \u003d 0, CF \u003d 1 a príkazu CMC spôsobí inverziu hodnoty tohto atribútu. Pretože funkcie určujú priebeh vykonávania programu počas podmienených skokov, na ovládanie programu sa zvyčajne používajú príkazy na zmenu funkcií.

Príkazy CPU ... Táto skupina obsahuje príkazy na zastavenie, žiadne operácie a množstvo príkazov, ktoré určujú prevádzkový režim procesora alebo jeho jednotlivých blokov. VelenieHLT ukončí vykonávanie programu a uvedie procesor do stavu zastavenia, z ktorého dôjde k ukončeniu, keď sa prijme signál prerušenia alebo reštartu (Resetovať). Velenie NOP (Príkaz "Prázdny"), ktorý nespôsobí vykonanie žiadnych operácií, sa používa na implementáciu oneskorení programu alebo na vyplnenie medzier vytvorených v programe.

Špeciálne príkazy CLI, STI vypnúť a povoliť službu požiadaviek na prerušenie. V procesorochPentium používa sa na to riadiaci bit (príznak)AK v registri EFLAGY.

Mnoho moderných mikroprocesorov vykonáva identifikačný príkaz, ktorý umožňuje používateľovi alebo inému zariadeniu získať informácie o type procesora použitého v danom systéme. V procesoroch Pentuim príkaz sa na to používa CPUID , keď sa vykonajú, potrebné údaje o procesore idú do registrov 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 špecifikovaných typov spracovávaných údajov sa môže množina spustiteľných príkazov výrazne rozširovať.

Niektoré procesory vykonávajú aritmetické operácie s binárnymi desatinnými číslami alebo vykonávajú špeciálne príkazy na opravu výsledku pri spracovaní týchto čísel. Zahŕňa mnoho výkonných procesorovFPU - jednotka na spracovanie číselc Plávajúca bodka.

Rad moderných procesorov implementuje skupinové spracovanie niekoľkých celých čísel alebo číselc Plávajúca bodka s jediným pokynomSIMD („Jedna inštrukcia - viac údajov ”) -„ Jeden príkaz - veľa údajov “. Simultánne vykonávanie operácií na niekoľkých operandoch výrazne zlepšuje výkon procesora pri práci s obrazovými a zvukovými dátami. Takéto operácie sa široko používajú na spracovanie obrazu, spracovanie zvukových signálov a ďalšie aplikácie. Na vykonávanie týchto operácií boli do procesorov zavedených špeciálne bloky, ktoré implementujú zodpovedajúce sady pokynov, ktoré sú v rôznych typoch procesorov (Pentium, Athlon) boli pomenovanéMMX (“ Milti- Rozšírenie médií ”) - Multimediálne rozšírenie,SSE („Streaming SIMD Extension“) - Streamovanie SIMD - rozšírenie, “3 DPredĺženie - 3D rozšírenie.

Charakteristická vlastnosť procesorov spoločnostiIntel , počnúc modelom 80286 sa poskytuje prioritné riadenie 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 prijatým prioritným prístupovým algoritmom.

Štruktúra inštrukcie v montážnom jazyku Programovanie na úrovni strojových inštrukcií je minimálna úroveň, na ktorej je možné počítačové programovanie. Sada pokynov pre stroj musí byť dostatočná na vykonanie požadovaných akcií vydaním pokynov pre hardvér stroja. Každá strojová inštrukcia sa skladá z dvoch častí: operačnej, ktorá definuje „čo má robiť“, a operandu, ktorý definuje spracované objekty, teda čo má robiť. Inštrukcia mikroprocesorového stroja napísaná v jazyku Assembly je jeden riadok v tejto podobe: návestie / inštrukcie operátora (ov) smernice; komentáre Štítok, príkaz / smernica a operand sú oddelené najmenej jednou medzerou alebo znakom tabulátora. Príkazy operandov sú oddelené čiarkami.

Štruktúra inštrukcie montážneho jazyka Inštrukcia montážneho jazyka hovorí prekladateľovi, aké kroky by mal mikroprocesor urobiť. Direktívy asemblera sú parametre zadané v texte programu, ktoré ovplyvňujú proces montáže alebo vlastnosti výstupného súboru. Operand určuje počiatočnú hodnotu údajov (v dátovom segmente) alebo prvky, na ktoré má príkaz reagovať (v segmente kódu). Inštrukcia môže mať jeden alebo dva operandy alebo žiadne operandy. Počet operandov je implicitne určený príkazovým kódom. Ak je potrebné v príkaze alebo smernici pokračovať na ďalšom riadku, použije sa znak spätnej lomky: „“. V predvolenom nastavení Assembler pri písaní príkazov a smerníc nerozlišuje medzi malými a malými písmenami. Príklady direktív a príkazov Count db 1; Názov, smernica, jeden operand mov eax, 0; Velenie, dvaja operandi

Identifikátory sú sekvencie platných znakov, ktoré sa používajú na označenie mien premenných a mien š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 je možné použiť bodku. Ako identifikátory nemožno použiť vyhradené názvy assemblerov (smernice, operátory, názvy príkazov). Prvý znak identifikátora musí byť písmeno alebo špeciálny znak. Maximálna dĺžka identifikátora je 255 znakov, ale prekladateľ akceptuje prvých 32 znakov, ostatné ignoruje. Všetky štítky, ktoré sú napísané v riadku, ktorý neobsahuje direktívu assemblera, musia končiť dvojbodkou „:“. Štítok, príkaz (smernica) a operand nemusia začínať na žiadnej konkrétnej pozícii v reťazci. Pre lepšiu čitateľnosť programu sa odporúča zapísať si ich do stĺpca.

Menovky Všetky menovky, ktoré sú napísané v riadku, ktorý neobsahuje direktívu assemblera, musia končiť dvojbodkou „:“. Štítok, príkaz (smernica) a operand nemusia začínať na žiadnej konkrétnej pozícii v reťazci. Pre lepšiu čitateľnosť programu sa odporúča zapísať si ich do stĺpca.

Komentáre Používanie komentárov v programe zvyšuje prehľadnosť, najmä keď nie je jasný zámer súboru inštrukcií. Komentáre začínajú na ľubovoľnom riadku zdrojového modulu bodkočiarkou (;). Všetky znaky vpravo od „; »Na koniec riadku je komentár. Komentár môže obsahovať akékoľvek tlačiteľné znaky vrátane medzery. Komentár môže obsahovať celý riadok alebo môže nasledovať príkaz v rovnakom riadku.

Štruktúra programu montážneho jazyka Program napísaný v montážnom jazyku môže pozostávať z niekoľkých častí, nazývaných moduly, v každej z ktorých je možné definovať jeden alebo viac údajových, zásobníkových a kódových segmentov. Akýkoľvek kompletný program v jazyku assembleru musí obsahovať jeden hlavný alebo hlavný modul, od ktorého sa začína jeho vykonávanie. Modul môže obsahovať programové segmenty, dátové segmenty a zásobník deklarované pomocou príslušných smerníc.

Pamäťové modely Pred deklarovaním segmentov musíte špecifikovať pamäťový model pomocou direktívy. Modifikátor MODEL memory_model, call_convention, OS_type, stack_parameter Základné pamäťové modely montážneho jazyka: Pamäťový model Adresovanie kódu Adresovanie dát Operačný systém Kód a vkladanie dát TINY NEAR MS-DOS Povolené MALÉ V BLÍZKOSTI MS-DOS, Windows Nie MEDIUM FAR NEAR MS-DOS, Windows Nie KOMPAKTNÉ V BLÍZKOSTI MS-DOS, Windows No LARGE FAR MS-DOS, Windows No HUGE FAR MS-DOS, Windows No NEAR Windows 2000, Windows XP, Windows Allowed FLAT NEAR NT,

Pamäťové modely Malý model pracuje iba v 16-bitových aplikáciách MS-DOS. V tomto modeli sú všetky údaje a kód umiestnené v jednom fyzickom segmente. V takom prípade veľkosť programového súboru nepresahuje 64 KB. Malý model podporuje jeden segment kódu a jeden segment údajov. Dáta a kód sú pri použití tohto modelu adresované tak skoro. Stredný model podporuje viac segmentov kódu a jeden dátový segment, pričom všetky odkazy v segmentoch kódu sú predvolene považované za ďaleko a odkazy v dátovom segmente sú blízko. Kompaktný model podporuje viac dátových segmentov, ktoré využívajú adresovanie vzdialených údajov, a jeden segment kódu, ktorý využíva blízke adresovanie. Veľký model podporuje viac segmentov kódu a viac segmentov údajov. V predvolenom nastavení sú všetky odkazy na kódy a údaje považované za vzdialené. Obrovský model je takmer ekvivalentný veľkému pamäťovému modelu.

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ú obsiahnuté v jednom 32-bitovom segmente. Pred smernicou vypracovať program pre plochý model. jeden vzor by mal byť umiestnený :. 386 ,. 486 ,. 586 alebo. 686. Voľba smernice pre výber procesora určuje množinu inštrukcií dostupných pri písaní programov. Písmeno p za smernicou o výbere procesora znamená chránený prevádzkový režim. Adresovanie údajov a kódov je blízko, pričom všetky adresy a smerníky sú 32-bitové.

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

Pamäťové modely. Modifikátor MODEL memory_model, call_convention, os_type, stack_parameter OS_type je predvolený OS_DOS a v súčasnosti je jedinou podporovanou hodnotou pre tento parameter. Stack_parameter je nastavený na: NEARSTACK (register SS je DS, oblasti údajov a zásobníkov sa nachádzajú v rovnakom fyzickom segmente) FARSTACK (register SS sa nerovná DS, oblasti údajov a zásobníkov sa nachádzajú v rôznych fyzických segmentoch). Predvolená hodnota je NEARSTACK.

Príklad programu „nič nerobenie“. 686 P. MODEL BYT, STDCALL. ÚDAJE. CODE START: RET END START RET - príkaz mikroprocesora. Zaisťuje správne ukončenie programu. Zvyšok programu súvisí s prácou prekladateľa. ... 686 P - Povolené príkazy chráneného režimu Pentium 6 (Pentium II). Táto smernica vyberie podporovanú sadu inštrukčných inštrukcií zadaním modelu procesora. ... MODEL FLAT, stdcall je plochý pamäťový model. Tento pamäťový model sa používa v operačný systém Windows. stdcall je použitá konvencia volania procedúr.

Príklad programu „nič nerobenie“. 686 P. MODEL BYT, STDCALL. ÚDAJE. ŠTART KÓDU: ZNOVU KONIEC ŠTART DATA je programový segment obsahujúci údaje. Tento program nepoužíva zásobník, takže segmentujte. STACK chýba. ... CODE je segment programu obsahujúci kód. START je štítok. END START - koniec programu a správa kompilátoru, že program musí byť spustený z označenia START. Každý program musí obsahovať značku END na označenie konca zdrojový kód programov. Všetky riadky, ktoré nasledujú za smernicou END, sú ignorované. Štítok uvedený za smernicou END informuje prekladateľa o názve hlavného modulu, z ktorého program začína. Ak program obsahuje jeden modul, štítok za smernicou END možno vynechať.

Prekladače Assembler Language Translator - prekladač je program alebo hardvér, ktorý prevádza program v jednom z programovacích jazykov na program v cieľovom jazyku nazývaný objektový kód. Okrem podpory mnemotechniky strojových pokynov má každý prekladateľ svoju vlastnú sadu smerníc a makro nástrojov, ktoré sú často s čímkoľvek nekompatibilné. Hlavné typy prekladačov v jazyku assembler: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - voľne distribuovaný viacpriechodový assembler od Tomasza Grishtara (poľsky), NASM (Netwide Assembler) - bezplatný assembler pre architektúru Intel x 86, vytvoril Simon Tatham v spolupráci s Julianom Hall a v súčasnosti ho vyvíja malý vývojový tím na serveri Source. Forge. sieť.

Src \u003d "https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt \u003d "(! LANG: Vysielanie programu do Microsoft Visual Studio 2005 1) Vytvorte projekt výberom File-\u003e New-\u003e Project a"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src \u003d "https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt \u003d "(! LANG: Vysielanie programu do Microsoft Visual Studio 2005 2) V strome projektu (Zobraziť-\u003e Prieskumník riešení) pridajte"> Трансляция программы в 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 možnosti kompilátora. Pravým tlačidlom myši kliknite na ponuku Vlastné pravidlá zostavenia ... v súbore projektu.

Naprogramujte preklad do programu Microsoft Visual Studio 2005 a v zobrazenom okne vyberte Microsoft Macro Assembler.

Preklad programu v Microsoft Visual Studio 2005 Skontrolujte kliknutím pravým tlačidlom myši v ahoj. asm stromu projektu ponuky Vlastnosti a nastavte Všeobecné-\u003e Nástroj: Microsoft Macro Assembler.

Src \u003d "https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt \u003d "(! LANG: Vysielanie programu do Microsoft Visual Studio 2005 6) Zkompilujte súbor výberom príkazov Zostaviť -\u003e Zostaviť ahoj. 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). Ich počet dosahuje 2000. Program pre Windows pozostáva vo veľkej miere z týchto hovorov. Všetky interakcie s externé zariadenia a prostriedky operačného systému sa vyskytujú spravidla prostredníctvom týchto funkcií. Operačný systém Windows používa model plochej pamäte. Adresa ľubovoľného pamäťového miesta bude určená obsahom jedného 32-bitového registra. Pre Windows existujú 3 typy programových štruktúr: dialógové (hlavné okno - dialógové okno), konzolová alebo bezokná štruktúra, klasická štruktúra (okno, drôtový model).

Volajte funkcie systému Windows API V súbore pomoci je akákoľvek funkcia API reprezentovaná ako typ function_name (FA 1, FA 2, FA 3) Type - typ návratovej hodnoty; ФАх - zoznam formálnych argumentov v poradí, v akom sa vyskytujú, napríklad int Správa. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Táto funkcia zobrazuje okno so správou a výstupné tlačidlo (alebo tlačidlá). Význam parametrov: h. Wnd - rukoväť k oknu, v ktorom sa objaví okno so správou, lp. Text - text, ktorý sa zobrazí v okne, lp. Titulok - text v titulku okna, u. Typ - typ okna, najmä môžete definovať počet výstupných tlačidiel.

Volanie funkcií rozhrania Windows API v správe. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Takmer všetky parametre funkcií 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 pripája k názvu funkcie na prechod na novšie verzie funkcií.

Volanie funkcií rozhrania Windows API v správe. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Ak používate MASM, musíte na koniec názvu pridať @N N - počet bajtov, ktoré zadané argumenty zaberajú v zásobníku. Pre funkcie Win 32 API možno toto číslo definovať ako počet argumentov n krát 4 (bajty v každom argumente): N \u003d 4 * n. Na vyvolanie funkcie použite príkaz CALL assembler. V takom prípade sú jej všetky argumenty funkcie odovzdané cez zásobník (príkaz PUSH). Smer odovzdávania argumentov: ZĽAVA DO VPRAVO - SPODNÉ Hore. Prvý argument, ktorý sa vloží do zásobníka, je u. Typ. Volanie zadanej funkcie bude vyzerať takto: CALL Message. Krabica. [chránené e-mailom]

Volanie funkcií rozhrania Windows API v správe. 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 „posun segmentu“, alebo, čo sa týka vysokej úrovne, „ukazovateľ“ na začiatok riadku. Direktíva EQU, podobne ako #define v jazyku C, definuje konštantu. Direktíva EXTERN hovorí prekladateľovi, že funkcia alebo identifikátor sú pre daný modul externé.

Príklad programu „Ahoj všetci!“ ... 686 P. MODEL BYT, 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. Krabica. [chránené e-mailom]: BLÍZKO. ŠTART KÓDU: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Správa. Krabica. [chránené e-mailom] ZNOVU KONIEC ŠTART

Direktíva INVOKE Prekladač jazyka MASM umožňuje tiež zjednodušenie volania funkcií pomocou makra - direktíva INVOKE: funkcia INVOKE, parameter1, parameter2, ... K volaniu funkcie nie je potrebné pridávať @ 16; parametre sa zapisujú presne v poradí, v akom sú uvedené v popise funkcie. parametre sa tlačia do zásobníka pomocou prekladača. ak chcete používať smernicu INVOKE, musíte mať popis prototypu funkcie používajúci smernicu PROTO v tvare: Správa. Krabica. PROTO: DWORD ,: DWORD Ak program používa mnoho funkcií Win 32 API, je vhodné použiť direktívu include C: masm 32includeuser 32. inc

Úvod.

Jazyk, v ktorom je napísaný pôvodný programsa volá vchodjazyk a jazyk, do ktorého je preložený na vykonanie procesorom, je víkendjazyk. Proces konverzie vstupného jazyka do výstupného jazyka sa nazýva vysielať.Pretože procesory sú schopné vykonávať programy v strojovom jazyku binárnych kódov, ktorý sa na programovanie nepoužíva, je nevyhnutný preklad všetkých zdrojových programov. Známe dve cestypreklady: kompilácia a tlmočenie.

Kedy kompiláciapôvodný program sa najskôr úplne preloží do ekvivalentného programu vo výstupnom jazyku s názvom objektprogram a potom vykonaný. Tento proces je implementovaný pomocou špeciálneho programy,zavolal kompilátor.Volá sa kompilátor, pre ktorý je vstupný jazyk symbolickým vyjadrením strojového (výstupného) jazyka binárnych kódov asembler.

Kedy tlmočeniekaždý riadok textu v zdrojovom programe je analyzovaný (interpretovaný) a okamžite sa vykoná príkaz v ňom uvedený. Implementáciou tejto metódy je poverený tlmočnícky program.Tlmočenie trvá dlho. Aby sa zvýšila jeho účinnosť, tlmočník namiesto spracovania každého riadku najskôr prevedie všetky tímreťazce znakov (

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

Nasledujúci jazyk zhromaždenia je implementovaný pomocou kompilácie.

Vlastnosti jazyka.

Hlavné vlastnosti assembleru:

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

) používa sa mnemotechnická pomôcka

Odčítanie (

násobenie (

Divízie (

a podobne. Symbolické názvy sa tiež používajú na adresovanie pamäťových miest. Pri programovaní v montážnom jazyku vám namiesto binárnych kódov a adries stačia poznať iba symbolické názvy, ktoré assembler prevedie do binárnych kódov;

každý výrok sa zhoduje jeden strojový príkaz(kód), to znamená, že existuje strojová korešpondencia medzi inštrukciami stroja a operátormi v programe montážneho jazyka;

● jazyk poskytuje prístup ku všetkým predmetoma tímy. Jazyky vysokej úrovne túto schopnosť nemajú. Napríklad montážny jazyk vám umožňuje skontrolovať registrový bit vlajok a jazyk na vysokej úrovni (napríklad

) túto schopnosť nemá. Upozorňujeme, že jazyky pre programovanie systému (napríklad C) sú často v medzipolohe. Z hľadiska prístupnosti sú bližšie k jazyku zhromaždenia, ale majú syntax jazyka na vysokej úrovni;

● montážny jazyk nie je univerzálny jazyk.Pre každú konkrétnu skupinu mikroprocesorov má svoj vlastný asembler. Jazyky vysokej úrovne nemajú túto nevýhodu.

Na rozdiel od jazykov vyššej úrovne je písanie a ladenie programu montážneho jazyka časovo náročné. Napriek tomu sa jazyk zhromaždenia dočkal široké využitiez dôvodu nasledujúcich okolností:

● program napísaný v montážnom jazyku je oveľa menší a funguje oveľa rýchlejšie ako program napísaný v jazyku vyššej úrovne. U niektorých aplikácií majú tieto ukazovatele prvoradú ú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ď .;

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

Vo väčšine programov je iba malé percento z celkového kódu zodpovedné za veľké percento času vykonania programu. 1% programu je zvyčajne zodpovedných za 50% času vykonania a 10% programu je zodpovedných za 90% času vykonania. 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 montážnom jazyku.

Program v montážnom jazyku je zoznam príkazov (príkazov, viet), z ktorých každý zaberá samostatný riadok a obsahuje štyri polia: pole štítku, pole operácie, pole operandu a pole komentára. Pre každé pole je samostatný stĺpec.

Pole štítku.

Pre pole štítku je pridelený stĺpec 1. Na štítku je symbolický názov alebo identifikátor, adresypamäť. Je to nevyhnutné, aby ste mohli:

● urobte podmienený alebo bezpodmienečný skok 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 názvu sa používajú (veľké) písmená anglickej abecedy a číslice. Pred menom musí byť písmeno a pred koncom oddeľovač dvojbodky. Na samostatný riadok je možné napísať štítok s dvojbodkou a na ďalší riadok v stĺpci 2 operačný kód, čo zjednodušuje prácu kompilátora. Absencia dvojbodky neumožňuje odlíšiť štítok od operačného kódu, ak sú umiestnené na samostatných riadkoch.

V niektorých verziách montážneho jazyka sú dvojbodky umiestnené iba za štítkami príkazov, nie však za štítkami údajov, a dĺžka štítku môže byť obmedzená na 6 alebo 8 znakov.

V poli štítku by nemali byť rovnaké názvy, pretože štítok je priradený k adresám príkazov. Ak počas vykonávania programu nie je potrebné volať príkaz alebo dáta z pamäte, potom pole štítku zostáva prázdne.

Pole operačného kódu.

Toto pole obsahuje mnemotechnický kód príkazu alebo pseudopríkazu (pozri nižšie). Mnemotechnický kód príkazov vyberajú jazykoví dizajnéri. V montážnom jazyku

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

) a na uloženie obsahu registra do pamäte - mnemotechnické pomôcky

). V montážnych jazykoch

pre obe operácie je možné použiť jeden názov, resp

Ak môže byť výber mnemotechnických názvov ľubovoľný, potom je potreba použitia dvoch strojových pokynov spôsobená architektúrou procesorov.

Mnemotechnická pomôcka registra závisí aj od verzie assemblera (tabuľka 5.2.1).

Pole operandu.

Nachádza sa tu Ďalšie informáciepotrebné na vykonanie operácie. V poli operandov pre inštrukcie skoku je označená adresa, na ktorú chcete skočiť, ako aj adresy a registre, ktoré sú operandmi strojovej inštrukcie. Ako príklad uvedieme operandy, ktoré možno použiť pre 8-bitové procesory

● číselné údaje,

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

Podľa toho sú binárne, osmičkové, hexadecimálne a desatinné číselné systémy (

nemusíte si to zapisovať). Ak je prvá číslica hexadecimálneho čísla A, B, C,

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

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

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

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

v binárnom systéme);

● identifikátory,

pre registračné páry lietadiel,

Prvé písmená B,

H; pre pár akumulátorov a register značiek -

; pre počítadlo príkazov -

; pre ukazovateľ zásobníka -

● štítky označujúce adresy operandov alebo ďalšie pokyny v podmienke

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

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

● výrazy,

ktoré sú skonštruované prepojením vyššie uvedených údajov pomocou aritmetických a logických operátorov. Upozorňujeme, že spôsob vyhradenia údajového priestoru závisí od jazykovej verzie. Vývojári montážneho jazyka pre jazyk

Definujte slovo) a neskôr zaviedli alternatívu.

ktorý bol od začiatku v jazyku pre procesory

V jazykovej verzii

používaný

Definujte konštantu).

Procesory spracúvajú operandy rôznych dĺžok. Na jeho definovanie vývojári asemblerov prijali rôzne rozhodnutia, napríklad:

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

); АХ - pre 16-bit (typ

a AH - pre 8-bitové (typ

● pre spracovateľov

ku každému operačnému kódu sa pridávajú prípony: prípona

Pre typ

; prípona „.B“ pre typ

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

) a slová v 64-bitovom registri, používajú sa operačné kódy

resp.

Pole pre komentáre.

Toto pole poskytuje vysvetlenie akcií programu. Komentáre nemajú vplyv na fungovanie programu a sú určené pre ľudí. Môže byť potrebné upraviť program, čo by bez týchto komentárov mohlo byť pre skúsených programátorov úplne nepochopiteľné. Komentár začína symbolom a slúži na vysvetlenie a zdokumentovanie programov. Počiatočný znak komentára môže byť:

● bodkočiarka (;) v jazykoch pre firemné procesory

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

Pred každým samostatným riadkom komentára je začiatočný znak.

Pseudopríkazy (smernice).

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

základnéinštrukcie, ktoré sú ekvivalentné so strojovým kódom procesora. Tieto príkazy vykonávajú všetko spracovanie poskytované programom;

pseudo príkazy,alebo smernice,určené na obsluhu procesu prekladu programu do jazyka kombinácie kódov. Ako príklad v tabuľke. 5.2.2 sú zobrazené niektoré pseudopríkazy zo vzorkovača striedavého prúdu

pre rodinu

.

Pri programovaní existujú situácie, keď sa podľa algoritmu musí ten istý reťazec príkazov opakovať mnohokrát. Z tejto situácie sa môžete dostať:

● napíšte požadovanú postupnosť príkazov, kedykoľvek sa vyskytnú. Tento prístup zväčšuje veľkosť programu;

● vytvorte túto postupnosť do postupu (podprogram) a v prípade potreby ju zavolajte. Tento výstup má svoje nevýhody: zakaždým, keď musíte vykonať špeciálny príkaz na volanie procedúry a príkaz na návrat, ktoré pomocou krátkej a často používanej postupnosti môžu výrazne znížiť rýchlosť programu.

Najjednoduchšie a efektívna metóda je potrebné použiť opakované opakovanie reťazca príkazov makro,o ktorých sa dá uvažovať ako o pseudopríkaze určenom na opätovné vysielanie skupiny príkazov, ktoré sa v programe často vyskytujú.

Makro alebo makro sa vyznačuje tromi aspektmi: makro-definíciou, makro-reverziou a makro-expanziou.

Makro definícia

Toto je označenie opakovane sa opakujúcej postupnosti programových príkazov, ktoré sa používa pre odkazy v texte programu.

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

Zoznam výrazov; Makro definícia

Vo vyššie uvedenej štruktúre definície makra možno rozlíšiť tri časti:

● názov

makro, ktoré obsahuje názov

Pseudovelenie

a súbor parametrov;

● označené bodkami telomakro;

● tím

zakončenia

makrá.

Sada parametrov definície makra obsahuje zoznam všetkých parametrov uvedených v poli operandu pre vybranú skupinu príkazov. Ak sú tieto parametre v programe zadané skôr, potom ich možno v záhlaví definície makra vynechať.

Ak chcete znova zostaviť vybranú skupinu príkazov, použite adresu pozostávajúcu z názvu

makrá a zoznam parametrov s inými hodnotami.

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

) makra, assembler ho nahradí telom makra.

Nazýva sa použitie makra ako operačného kódu makro obeh(s volaním makra) a jeho nahradenie telom makra je makro expanzia.

Ak je program reprezentovaný ako postupnosť znakov (písmená, číslice, medzery, interpunkcia a návrat na koniec textu, na ktorý chcete prejsť) nový riadok), potom makroexpanzia spočíva v nahradení niektorých reťazcov z tejto postupnosti inými reťazcami.

K rozšíreniu makra dochádza počas procesu montáže, nie počas vykonávania programu. Za spôsob manipulácie s reťazcami znakov je zodpovedný makrofinančné prostriedky.

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

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

● v druhom priechode je výsledný program spracovaný bez makier.

Parametrizované makrá.

Na prácu s opakovanými sekvenciami príkazov, ktorých parametre môžu mať rôzne hodnoty, sú k dispozícii nasledujúce definície makra:

● s skutočnéparametre, ktoré sú umiestnené v poli operandov makro volania;

● s formálneparametre. V procese rozširovania makra je každý formálny parameter, ktorý sa objaví v tele makra, nahradený zodpovedajúcim skutočným parametrom.

pomocou makier s parametrami.

Program 1 zobrazuje dve podobné postupnosti príkazov, ktoré sa líšia tým, že prvý z nich zamení 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 vo vnútri tela makra nahradený prvým skutočným parametrom (P,

) a P2 sa nahrádza druhým skutočným parametrom (

) z programu č. 1. V makrozóne

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é možnosti.

Zvážme niekoľko pokročilých funkcií jazyka

Ak sa makro obsahujúce príkaz podmieneného vetvenia a štítok, na ktorom sa vetva vytvára, volá dvakrát alebo viackrát, štítok sa duplikuje (problém duplicitných štítkov), čo spôsobí chybu. Preto je každému parametru (programátorovi) ako parametru priradený samostatný štítok. V jazyku

štítok je vyhlásený za miestny (

) a vďaka svojim pokročilým funkciám assembler automaticky generuje 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. Zvážte

AK WORDSIZE GT 16 M2 MAKRO

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

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

Ďalšou pokročilou funkciou je, že makrá môžu volať iné makrá vrátane seba - rekurzívnyhovor. V druhom prípade musí makro dostať sám o sebe parameter, ktorý sa pri každej expanzii mení, aby nezískal nekonečnú slučku, a skontrolovaťtento parameter a ukončenie rekurzie, keď parameter dosiahne určitú hodnotu.

O používaní makier v assembleri.

Pri použití makier musí byť assembler schopný vykonávať dve funkcie: zachovať makrodefiníciea predĺžiť volanie makra.

Uchovávanie makier.

Všetky názvy makier sú uložené v tabuľke. Za každým menom nasleduje ukazovateľ na príslušné makro, aby bolo možné ho v prípade potreby zavolať. Niektoré zostavovače majú samostatnú tabuľku pre názvy makier, iné majú všeobecnú tabuľku, v ktorej sú spolu s názvami makier aj všetky pokyny a smernice týkajúce sa stroja.

Pri stretnutí s makrom počas montáže vytvoril:

nový prvok tabuľkys názvom makra, počtom parametrov a ukazovateľom na inú tabuľku definícií makier, kde bude uložené telo makra;

● zoznam formálneparametre.

Potom sa telo makra načíta a uloží do tabuľky definícií makier, čo je iba reťazec symbolov. Formálne parametre nájdené v tele slučky sú označené špeciálnym symbolom.

Interné znázornenie makra

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

MOV EAX, MOV EBX, MOV MOV &

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

Rozšírenie makro hovorov.

Kedykoľvek sa počas montáže vyskytne makro, uloží sa do tabuľky makier. Keď sa makro volá, assembler dočasne pozastaví čítanie vstupu zo vstupného zariadenia a začne čítať uložené telo makra. Formálne parametre extrahované z tela makra sa nahradia skutočnými parametrami a poskytnú ich volanie. Znamienko & pred parametrami umožňuje assembleru ich rozpoznať.

Napriek tomu, že existuje veľa verzií assemblera, procesy montáže majú spoločné znaky a sú si v mnohom podobné. Ďalej je diskutovaná práca dvojpriechodového asemblera.

Dvojpriechodový asembler.

Program sa skladá z niekoľkých operátorov. Preto sa zdá, že pri zostavovaní môžete použiť nasledujúcu postupnosť akcií:

● preložiť do strojového jazyka;

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

● opakujte vyššie uvedené postupy, kým nebude preložený celý program.

Tento prístup však nie je efektívny. Príkladom je problém tzv spätné odkazy.Ak je prvým príkazom skok na príkaz P, ktorý sa nachádza na samom konci programu, potom ho assembler nemôže preložiť. Najskôr musí určiť adresu operátora P a na to musí prečítať celý program. Každé úplné prečítanie pôvodného programu sa volá ulička.Ukážme si, ako môžete vyriešiť problém prepojenia pomocou dvoch priechodov:

nasleduje prvá prihrávka zbieraťa uložte do tabuľky všetky definície symbolov (vrátane štítkov) a pri druhom prechode prečítajte a zostavte každého operátora. Táto metóda je pomerne jednoduchá, ale druhý prechod pôvodným programom vyžaduje ďalší čas strávený vstupno-výstupnými operáciami;

● pri prvom prechode, transformovaťprogram do intermediálnej formy a uložiť ho do tabuľky a druhý priechod vykonať nie podľa pôvodného programu, ale podľa tabuľky. Tento spôsob montáže šetrí čas, pretože pri druhom prechode sa nevykonávajú žiadne I / O.

Prvý prechod.

Prvý prechod terčom- zostaviť tabuľku symbolov. Ako je uvedené vyššie, ďalším cieľom prvého priechodu je zachovať všetky makrá a rozšíriť hovory tak, ako sa objavujú. Preto sa definícia symbolu aj rozšírenie makra vyskytujú naraz. Symbol môže byť buď štítok,alebo hodnota,ktorému je pomocou smernice priradený konkrétny názov:

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

Priradením hodnôt k symbolickým názvom v poli návestia inštrukcie zostavovateľ v podstate nastaví adresy, ktoré bude mať každá inštrukcia počas vykonávania programu. Za týmto účelom asembler počas procesu montáže šetrí počítadlo adresy príkazu(

) ako špeciálna premenná. Na začiatku prvého prechodu je hodnota špeciálnej premennej nastavená na 0 a zvyšuje sa po každom spracovanom príkaze o dĺžku tohto príkazu. Ako príklad v tabuľke. 5.2.3 zobrazuje fragment programu označujúci dĺžku príkazov a hodnoty počítadla. Pri prvom prechode sa vytvoria tabuľky symbolické názvy, smernicea operačné kódy,a ak je to potrebné doslovnestôl. Literál je konštanta, pre ktorú si assembler automaticky rezervuje pamäť. Okamžite si všimneme, že moderné procesory obsahujú pokyny s okamžitými adresami, takže ich príslušníci nepodporujú literály.

Tabuľka symbolických mien

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

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

● bity realokácie pamäte (ktoré ukazujú, či sa hodnota symbolu mení, ak je program načítaný na inú adresu, ako zamýšľal assembler);

● informácie o tom, či je možné k symbolu získať prístup aj mimo postupu.

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

Tabuľka smernice.

Táto tabuľka obsahuje zoznam všetkých smerníc alebo pseudopríkazov, ktoré sa vyskytujú pri zostavovaní programu.

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

Pre každý operačný kód poskytuje tabuľka samostatné stĺpce: označenie operačného kódu, operand 1, operand 2, hexadecimálna hodnota operačného kódu, dĺžka inštrukcie a typ inštrukcie (tabuľka 5.2.5). Prevádzkové kódy sú rozdelené do skupín v závislosti od počtu a typu operandov. Typ príkazu určuje číslo skupiny a určuje postup, ktorý sa volá pri spracovaní všetkých príkazov v tejto skupine.

Druhý priechod.

Cieľ druhého priechodu- vytvorenie objektového programu a v prípade potreby tlač protokolu o zostavení; výstup informácií potrebných na to, aby linker spojil postupy, ktoré boli zostavené v rôznom čase, do jedného spustiteľného súboru.

V druhom priechode (ako v prvom) sa riadky obsahujúce príkazy čítajú a spracúvajú jeden po druhom. Pôvodný operátor a výsledný výstup v hexadecimálnom systéme objektkód je možné vytlačiť alebo uložiť do vyrovnávacej pamäte pre neskoršiu tlač. Po vynulovaní počítadla adries príkazov sa vyvolá ďalší výpis.

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

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

● operačný kód je reprezentovaný neplatným menom (kvôli preklepu), nedodáva sa s dostatočným počtom operandov alebo má príliš veľa operandov;

● neexistuje operátor

Niektorí zostavovatelia môžu vyzdvihnúť nedefinovaný znak a nahradiť ho. Avšak vo väčšine prípadov, keď sa zistí vyhlásenie s chybou, asembler zobrazí chybové hlásenie na obrazovke a pokúsi sa pokračovať v procese montáže.

Články venované jazyku zhromaždenia.

Téma 2.5 Základy programovania procesorov

S pribúdajúcou dĺžkou programu je čoraz ťažšie zapamätať si kódy pre rôzne operácie. Určitú pomoc v tomto ohľade poskytujú mnemotechnické označenia.

Volá sa príkazový symbolický kódovací jazyk asembler.

Jazyk zhromaždenia Je jazyk, v ktorom každý príkaz zodpovedá presne jednej strojovej inštrukcii.

Zostavenie sa nazýva prevádzanie programu z montážneho jazyka, 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 zahrnutie knižničných programov a generovanie sekvencií symbolických príkazov zadaním konkrétnych parametrov v mikroinštrukcie. Tento program sa zvyčajne nachádza v ROM alebo sa zadáva do RAM z nejakého externého média.

Jazyk zhromaždenia má niekoľko funkcií, ktoré ho odlišujú od jazykov vysokej úrovne:

1. Toto je individuálna korešpondencia medzi vyhláseniami montážneho jazyka a pokynmi k stroju.

2. Programátor montážneho jazyka má prístup ku všetkým objektom a príkazom 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 inteligentnejšie používanie počítačov;

Vyvinúť racionálnejšie štruktúry algoritmov na riešenie aplikovaných problémov;

Schopnosť prezerať a opravovať spustiteľné programy s príponami .exe a.com kompilovanými z ľubovoľných jazykov vyššej úrovne v prípade straty pôvodných programov (vyvolaním zadaných programov do debuggeru programu DEBUG a ich prekompilovaním v assembleri);

Vypracovanie programov na riešenie najdôležitejší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 v dôsledku prekladu z jazykov vyššej úrovne)

Za implementáciu postupov zahrnutých v hlavnom programe vo forme samostatných fragmentov v prípade, že ich nemožno implementovať ani v použitom jazyku na vysokej úrovni, ani pomocou servisných postupov OS.

Program montážneho jazyka môže byť spustený iba na počítačoch tej istej rodiny, zatiaľ čo program napísaný v jazyku vyššej úrovne môže byť potenciálne spustený na rôznych počítačoch.

Abeceda montážneho jazyka je zložená z ASCII znakov.

Iba celé čísla. Rozlišovať:

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

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

Hexadecimálne čísla končiace písmenom N.

RAM, registre, prezentácia údajov

Pre určitú sériu poslancov sa používa individuálny programovací jazyk - montážny jazyk.

Montážny jazyk zaujíma medzipolohu medzi strojovými kódmi a jazykmi vysokej úrovne. Programovanie v tomto jazyku je jednoduchšie. Program v montážnom jazyku racionálnejšie využíva možnosti konkrétneho stroja (presnejšie MP) ako program v jazyku vyššej úrovne (ktorý je pre programátora ľahší ako assembler). Zvážte základné princípy programovania v strojovo orientovaných jazykoch na príklade assemblerového jazyka pre MP KR580VM80. Pri programovaní v jazyku sa používa bežná technika. Špecifické techniky nahrávania programov sú spojené s architektúrou a príkazovým systémom cieľového MT.

Programový model mikroprocesorového systému založeného na MP KR580VM80

Softvérový model MPS v súlade s obrázkom 1

Pamäť portov MP

S Z AC P C.

Obrázok 1

Z pohľadu programátora má MP KR580VM80 nasledujúce softvérovo prístupné registre.

A- 8-bitový registrový akumulátor. Je to hlavný register MP. Akákoľvek operácia vykonaná v ALU predpokladá umiestnenie jedného z operandov, ktoré sa majú spracovať v akumulátore. Výsledok operácie v ALU je tiež zvyčajne uložený v A.

B, C, D, E, H, L - 8-bitové registre na všeobecné účely (RON). Interná pamäť MP. Určené na ukladanie spracovaných informácií, ako aj výsledkov operácie. Pri spracovaní 16-bitových slov sa z registrov vytvárajú páry BC, DE, HL a dvojitý register sa nazýva prvé písmeno - B, D, H. V dvojici registrov je prvý register najvyšší. Registre H, L majú špeciálnu vlastnosť, ktorá sa používa ako na ukladanie údajov, tak na ukladanie 16-bitových adries buniek RAM.

FL- register vlajok (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ázka

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

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

Bit AC je ďalší prenos, určený na ukladanie hodnoty prenosu od spodného jadra výsledku.

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

Číslica S (znamienko) - 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 ukladanie adresy pamäťovej bunky, kde bol zapísaný posledný bajt zadaný do zásobníka.

RS - programové počítadlo (programové počítadlo), 16-bitový register, slúži na uloženie adresy nasledujúceho príkazu, ktorý sa má vykonať. Obsah počítadla príkazov sa automaticky zvýši o 1 ihneď po vzorkovaní nasledujúceho príkazového bajtu.

V oblasti počiatočnej pamäte je adresa 0000H - 07FF riadiaci program a demo programy. Toto je oblasť ROM.

0800 - 0АFF - oblasť adresy pre písanie študovaných programov. (RAM).

0В00 - 0ВВ0 - oblasť adresy pre záznam dát. (RAM).

0BB0 je počiatočná adresa zásobníka. (RAM).

Zásobník je špeciálne organizovaná oblasť RAM určená na dočasné ukladanie údajov alebo adries. Posledné číslo natlačené do stohu sa zobrazí ako prvé. Ukazovateľ zásobníka ukladá adresu poslednej bunky v zásobníku, do ktorej sa zapisujú informácie. Keď sa zavolá podprogram, spiatočná adresa hlavného programu sa automaticky uloží do zásobníka. Je pravidlom, že na začiatku každého podprogramu sa obsah všetkých registrov zapojených do jeho vykonávania uloží do zásobníka a na konci podprogramu sa obnoví zo zásobníka.

Formát údajov a štruktúra príkazov v jazyku zhromaždenia

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 postupnosti pamäťových buniek. MP môže adresovať 65536 bajtov pamäte, ktorá môže obsahovať 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ší je bit 7.

Príkaz je charakterizovaný svojim formátom, to znamená počtom pridelených bitov, ktoré sú rozdelené po bajtoch do konkrétnych funkčných polí.

Formát príkazu

Príkazy MP KR580VM80 majú formát jeden, dva alebo tri bajty. Viacbajtové príkazy musia byť umiestnené v susedných PL. Formát príkazu závisí od špecifík vykonávanej operácie.

Prvý bajt príkazu obsahuje mnemotechnický kód.

Definuje formát príkazu a akcie, ktoré musí MT vykonať nad údajmi počas jeho vykonávania, a spôsob adresovania a môže obsahovať aj informácie o vyhľadaní údajov.

Druhý a tretí bajt môžu obsahovať dáta, ktoré sa majú prevádzkovať, alebo adresy označujúce umiestnenie dát. Manipulované údaje sa nazývajú operandy.

Formát jednobajtového príkazu, ako je znázornené na obrázku 2

Obrázok 4

V pokynoch v montážnom jazyku má operačný kód krátku formu písania anglických slov - mnemotechnické označenie. Mnemotechnika (z gréckeho mnemotechnika - umenie memorovania) uľahčuje zapamätanie si príkazov podľa ich funkčného účelu.

Pred vykonaním je zdrojový program preložený pomocou prekladového programu, ktorý sa nazýva assembler, do jazyka kombinácie kódov - strojového jazyka, v tejto podobe je umiestnený v pamäti MP a potom použitý pri vykonávaní príkazu.


Metódy adresovania

Všetky kódy operandov (vstupné a výstupné) musia byť niekde umiestnené. Môžu byť umiestnené v interných registroch MP (najpohodlnejšia a najrýchlejšia možnosť). Môžu byť umiestnené v systémová pamäť (najbežnejšia možnosť). Nakoniec môžu byť umiestnené v I / O zariadeniach (najvzácnejší prípad). Umiestnenie operandov je určené príkazovým kódom. Existuje rôznymi metódami, pomocou ktorého môže príkazový kód určiť, kam vziať vstupný operand a kam umiestniť výstupný operand. Tieto metódy sa nazývajú metódy adresovania.

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

Okamžité;

Registrovaný;

Nepriame;

Stoh.

Okamžité adresovanie predpokladá, že operand (vstup) je v pamäti bezprostredne za kódom inštrukcie. Operand je zvyčajne konštanta, ktorú je potrebné niekam poslať, pridať k niečomu atď., Údaje sú obsiahnuté v druhom alebo v druhom a treťom bajte príkazu, s najmenej významným dátovým bajtom v druhom bajte príkazu a najvýznamnejším v treťom bajtové príkazy.

Rovno (je absolútne) adresovanie predpokladá, že operand (vstup alebo výstup) je umiestnený v pamäti na adrese, ktorej kód je vo vnútri programu bezprostredne za kódom inštrukcie. Používa sa v 3-bajtových príkazoch.

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

Nepriame (implicitné) adresovanie predpokladá, že vo vnútornom registri MP nie je samotný operand, ale jeho adresa v pamäti.

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

Systém velenia

Systém príkazov MP je kompletný zoznam elementárnych akcií, ktoré je MP schopný vykonať. MP riadený týmito príkazmi vykonáva jednoduché operácie, ako sú základné aritmetické a logické operácie, prenos dát, porovnanie dvoch hodnôt atď. Počet príkazov MP KR580VM80 je 78 (vrátane 244 úprav).

Rozlišujú sa tieto skupiny príkazov:

Prenos údajov;

Aritmetika;

Hlavolam;

Prechodné príkazy;

Príkazy I / O, riadenie a práca so zásobníkom.


Symboly a skratky použité v opise príkazov a programovaní

Symbol Zníženie
ADDR 16-bitová adresa
ÚDAJE 8-bitové dáta
ÚDAJE 16 16-bitové dáta
PRÍSTAV 8-bitová I / O adresa (I / O zariadenia)
BYTE 2 Druhý príkazový bajt
BYTE 3 Tretí príkazový bajt
R, R1, R2 Jeden z registrov: A, B, C, D, E, H, L
RP Jeden z registrových párov: B - nastaví pár BC; D - nastaví dvojicu DE; H - nastaví pár HL
RH Prvý register páru
RL Druhý register páru
Λ Logické násobenie
V. Logické doplnenie
Sčítanie mod dva
M Pamäťová bunka, ktorej adresa určuje obsah dvojice registrov HL, t. J. M \u003d (HL)

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

Každá strojová inštrukcia sa skladá z dvoch častí:

  • operačná sála - určenie „čo robiť“;
  • operand - definovanie spracovávaných objektov, „čo s čím“.

Strojová inštrukcia mikroprocesora, napísaná v montážnom jazyku, je jeden riadok v tejto syntaktickej podobe:

príkaz / príkazový štítok operand (s); komentáre

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

Štítok, príkaz / smernica a operandy (ak existujú) sú oddelené najmenej jednou medzerou alebo znakom tabulátora.

Ak je potrebné v príkaze alebo smernici pokračovať na ďalšom riadku, použije sa znak spätnej lomky: \\.

V predvolenom nastavení montážny jazyk pri písaní príkazov alebo smerníc nerozlišuje medzi veľkými a malými písmenami.

Príklady riadkov kódu:

Počet db 1 ; Názov, smernica, jeden operand
mov eax, 0 ; Príkaz, dva operandy
cbw; Velenie

Značky

Štítok v jazyku zhromaždenia môže obsahovať nasledujúce znaky:

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

Ako prvý znak štítku možno použiť bodku, ale niektorí prekladatelia tento znak neodporúčajú. Ako označenia nemožno použiť vyhradené názvy assemblerov (smernice, operátory, názvy príkazov).

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

Príkazy

Velenie povie prekladateľovi, aké kroky by mal mikroprocesor podniknúť. V dátovom segmente príkaz (alebo smernica) definuje pole, pracovnú oblasť alebo konštantu. V segmente kódu príkaz definuje akciu, napríklad prenos (mov) alebo doplnenie (pridanie).

Smernice

Zostavovač má niekoľko operátorov, ktoré vám umožňujú riadiť proces zostavovania a generovania výpisu. Títo operátori sa nazývajú smernice ... Konajú iba pri zostavovaní programu a na rozdiel od pokynov negenerujú strojové kódy.

Operandy

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

  • Žiadne operandy ret; Návrat
  • Jeden operand vrátane ecx; Zvýšenie ecx
  • Dva operandy pridajú eax, 12; Pridať 12 do eax

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

Operandy môžu byť

  • identifikátory;
  • reťazce znakov uzavreté v jednoduchých alebo dvojitých úvodzovkách;
  • celé čísla v binárnom, osmičkovom, desatinnom alebo hexadecimálnom formáte.
Identifikátory

Identifikátory - postupnosti 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 štítkov.

Pravidlá písania identifikátorov.

  • Identifikátor môže mať jeden alebo viac znakov.
  • Ako symboly je možné použiť písmená latinskej abecedy, číslice a niektoré špeciálne znaky: _,?, $, @.
  • Identifikátor nemôže začínať znakom číslice.
  • Identifikátor môže mať až 255 znakov.
  • Prekladateľ akceptuje prvých 32 znakov identifikátora a zvyšok ignoruje.
Pripomienky

Komentáre sú od spustiteľného riadku oddelené znakom a; ... V tomto prípade je všetko, čo je napísané za bodkočiarkou a po koniec riadku, komentár. Použitie komentárov v programe zvyšuje jeho prehľadnosť, najmä ak nie je jasný účel súboru inštrukcií. Komentár môže obsahovať akýkoľvek tlačiteľný znak vrátane medzery. Komentár môže obsahovať celý riadok alebo môže nasledovať príkaz v rovnakom riadku.

Štruktúra montážneho programu

Program napísaný v montážnom jazyku môže byť zložený z niekoľkých častí, tzv modulov ... Každý modul môže mať definovaný jeden alebo viac segmentov údajov, zásobníka a kódu. Akýkoľvek kompletný program v montážnom jazyku musí obsahovať jeden hlavný alebo hlavný modul, z ktorého sa má spustiť jeho vykonávanie. Modul môže obsahovať segmenty kódu, dátové segmenty a segmenty zásobníka deklarované pomocou príslušných smerníc. Pred deklarovaním segmentov musíte určiť pamäťový model pomocou smernice .MODEL.

Príklad programu montážneho jazyka „nič nerobenie“:

686P
.MODEL FLAT, STDCALL
.ÚDAJE
.KÓD
ŠTART:

RET
KONIEC ŠTART

Tento program obsahuje iba jednu inštrukciu mikroprocesora. Tento príkaz je RET. Zaisťuje správne ukončenie programu. Všeobecne sa tento príkaz používa na ukončenie procedúry.
Zvyšok programu súvisí s prácou prekladateľa.
.686P - Príkazy chráneného režimu Pentium 6 (Pentium II) sú povolené. Táto smernica vyberie podporovanú sadu inštrukčných inštrukcií zadaním modelu procesora. Písmeno P na konci smernice informuje prekladateľa, že procesor pracuje v chránenom režime.
.MODEL FLAT, stdcall je model plochej pamäte. Tento pamäťový model sa používa na operačnej sále systém Windows... stdcall
.DATA - programový segment obsahujúci údaje.
.CODE - blok programu obsahujúci kód.
START je štítok. V montážnom jazyku zohrávajú štítky veľkú úlohu, čo neplatí v moderných jazykoch na vysokej úrovni.
KONIEC ŠTART - koniec programu a správa prekladateľovi, že program musí byť spustený z označenia START.
Každý modul musí obsahovať END smernicu, ktorá označuje koniec zdrojového kódu programu. Všetky riadky, ktoré nasledujú za smernicou END, sú ignorované. Ak vynecháte smernicu END, vygeneruje sa chyba.
Štítok uvedený za smernicou END informuje prekladateľa o názve hlavného modulu, z ktorého sa spustí vykonávanie programu. Ak program obsahuje jeden modul, štítok za smernicou END možno vynechať.