Hlavné zložky jazyka symbolických adries a štruktúra príkazov. Programovanie: Assembler. Základy assembleru. Definovanie údajov pomocou typu štruktúry

  • 03.03.2020

Štruktúra inštrukcie v jazyku symbolických inštrukcií Programovanie na úrovni strojovej inštrukcie je minimálna úroveň, na ktorej je možné počítačové programovanie. Súprava strojových inštrukcií musí byť dostatočná na vykonanie požadovaných činností vydávaním pokynov pre hardvér stroja. Každá strojová inštrukcia pozostáva z dvoch častí: operačnej, ktorá definuje „čo robiť“ a operandu, ktorý definuje objekty spracovania, teda čo treba urobiť. Inštrukcia mikroprocesorového stroja napísaná v jazyku symbolických inštrukcií je jeden riadok v nasledujúcom tvare: operand (s) označenia inštrukcie / direktívy; komentáre Návestie, príkaz / direktíva a operand sú oddelené aspoň jednou medzerou alebo tabulátorom. Operandy príkazov sú oddelené čiarkami.

Štruktúra inštrukcie v jazyku symbolických inštrukcií Inštrukcia v jazyku symbolických inštrukcií hovorí prekladateľovi, akú akciu by mal mikroprocesor vykonať. Direktívy assemblera sú parametre špecifikované v texte programu, ktoré ovplyvňujú proces zostavovania alebo vlastnosti výstupného súboru. Operand definuje počiatočnú hodnotu údajov (v segmente údajov) alebo prvkov, na ktoré má príkaz pôsobiť (v segmente kódu). Inštrukcia môže mať jeden alebo dva operandy alebo žiadne operandy. Počet operandov je implicitne určený kódom príkazu. 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 veľké a malé písmená pri písaní príkazov a direktív. Príklady direktívy a príkazu Počet db 1; Názov, 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á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 assembleru, musia končiť dvojbodkou „:“. Označenie, 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 zapisovať si ich do stĺpca.

Štítky Všetky štítky, ktoré sú napísané v 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. Pre lepšiu čitateľnosť programu sa odporúča zapisovať si ich do stĺpca.

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

Štruktúra programu v assembleri Program napísaný v assembleri môže pozostávať z niekoľkých častí, nazývaných moduly, v každej z nich možno definovať jeden alebo viacero 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ť programové segmenty, dátové segmenty a zásobník, deklarované pomocou príslušných direktív.

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 assembleru: Pamäťový model Adresovanie kódu Adresovanie dát Operačný systém Kód a prekladanie dát TINY BLÍZKO MS-DOS Povolené MALÉ BLÍZKO MS-DOS, Windows Nie STREDNE ĎALEKO BLÍZKO MS-DOS, Windows Žiadny KOMPAKT 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 povolený PLOCHÝ BLÍZKO NT,

Pamäťové modely Malý model funguje iba v 16-bitových aplikáciách MS-DOS. V tomto modeli sú všetky údaje a kód umiestnené v jednom fyzickom segmente. V tomto prípade veľkosť súboru programu nepresahuje 64 KB. Malý model podporuje jeden segment kódu a jeden segment údajov. Údaje a kód sú pri použití tohto modelu adresované čo najbližšie. Stredný model podporuje viacero segmentov kódu a jeden údajový segment, pričom všetky odkazy v segmentoch kódu sa štandardne považujú za vzdialené (ďaleko) a odkazy v segmente údajov za blízke (blízko). Kompaktný model podporuje viacero dátových segmentov pomocou vzdialeného adresovania dát a jedného blízkeho dátového segmentu. 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 sú obsiahnuté v jednom 32-bitovom segmente. Vypracovať program pre plochý model pred smernicou. vzor bytu jedna zo smerníc by mala byť umiestnená:. 386,. 486,. 586 resp. 686. Voľba direktívy výberu procesora určuje množinu inštrukcií dostupných pri písaní programov. Písmeno p za príkazom na výber procesora označuje 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, call_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 call_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, call_convention, os_type, stack_parameter OS_type je predvolená hodnota OS_DOS av súčasnosti je jedinou podporovanou hodnotou pre tento parameter. Stack_parameter je nastavený na: NEARSTACK (register SS je DS, oblasti dát 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 prácou prekladateľ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 je model s plochou pamäťou. Tento model pamäte sa používa v operačnom systéme Windows. stdcall je používaná konvencia volania procedúr.

Príklad programu „nič nerobiť“. 686 P. VZOR BYTU, STDCALL. ÚDAJE. ZAČIATOK KÓDU: ZNOVU KONIEC ZAČIATOK. DATA je segment programu obsahujúci údaje. Tento program nepoužíva zásobník, takže. Chýba STACK. ... CODE - časť programu obsahujúca kód. ŠTART je označenie. KONIEC ŠTART - koniec programu a správa pre kompilátor, že program sa má spustiť z označenia ŠTART. Každý program musí obsahovať direktívu END, ktorá označuje koniec zdrojového kódu programu. Všetky riadky za direktívou END sú ignorované Návestie zadané za direktívou END povie prekladateľovi názov hlavného modulu, z ktorého sa program spúšťa. Ak program obsahuje jeden modul, označenie za direktívou END možno vynechať.

Prekladače assembleru Prekladač je program alebo technický prostriedok, ktorý konvertuje program 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ý prekladač vlastnú sadu direktív a makro nástrojov, ktoré sú často s čímkoľvek nekompatibilné. Hlavné typy prekladačov jazyka assembleru: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - bezplatný viacprechodový assembler napísaný Tomaszom Grishtarom (poľský), NASM (Netwide Assembler) - bezplatný assembler pre architektúru Intel x 86, bol vytvorený Simonom Tathamom v spolupráci s Julianom Hallom a v súčasnosti je vyvíjaný malým vývojovým tímom na Source. Forge. net.

Src = "https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt = "(! JAZYK: Vysielanie programu do Microsoft Visual Studio 2005 1) Vytvorte projekt výberom položky Súbor-> Nový-> Projekt 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 = "(! JAZYK: Vysielanie programu do Microsoft Visual Studio 2005 2) V strome projektu (Zobraziť-> Prieskumník riešení) pridať"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

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

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

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

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

Src = "https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt = "(! JAZYK: Vysielanie programu do 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). Ich počet dosahuje 2000. Program pre Windows pozostáva z veľkej časti z takýchto hovorov. Všetka interakcia s externými zariadeniami a zdrojmi operačného systému sa spravidla uskutočňuje prostredníctvom takýchto funkcií. Operačný systém Windows používa model s plochou pamäťou. 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 bezokenná štruktúra, klasická štruktúra (okno, drôtový model).

Volanie funkcií 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; ФАх – zoznam formálnych argumentov v poradí, v akom sa objavujú, napríklad int Message. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. titulok, UINT u. Typ); Táto funkcia zobrazí okno so správou a tlačidlom (alebo tlačidlami) na ukončenie. Význam parametrov: h. Wnd - prejdite do okna, 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í Windows API do správy. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. titulok, UINT u. Typ); Takmer všetky parametre funkcií API sú vlastne 32-bitové celé čísla: HWND je 32-bitové celé číslo, LPCTSTR je 32-bitový ukazovateľ na reťazec, UINT je 32-bitové celé číslo. Prípona „A“ sa často pridáva k názvu funkcie, aby ste sa presunuli na novšie verzie funkcie.

Volanie funkcií Windows API do správy. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. titulok, UINT u. Typ); Keď používate 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 príkaz CALL assembleru. V tomto prípade sú všetky argumenty funkcie odovzdané cez zásobník (príkaz PUSH). Smer odovzdávania argumentov: ZĽAVA DOPRAVA – DOLE NAHOR. Prvý argument, ktorý sa má vložiť do zásobníka, je u. Typ. Volanie zadanej funkcie bude vyzerať takto: CALL Message. Box. [e-mail chránený]

Volanie funkcií Windows API do správy. Box (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. titulok, UINT u. Typ); Výsledkom vykonania akejkoľvek funkcie API je spravidla celé číslo, ktoré sa vráti v registri EAX. Direktíva OFFSET je "odsadenie segmentu" alebo, povedané jazykom na vysokej úrovni, "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 je pre daný 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. [e-mail chránený]: BLÍZKO. CODE START: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Hlásenie. Box. [e-mail chránený] RET END START

Direktíva INVOKE Prekladač jazyka MASM tiež umožňuje zjednodušiť volanie funkcií pomocou nástroja na makro - direktíva INVOKE: funkcia INVOKE, parameter1, parameter2, ... V tomto prípade nie je potrebné pridávať @ 16 volanie funkcie; parametre sú zapísané presne v poradí, v akom sú uvedené v popise funkcie. parametre sa tlačia do zásobníka pomocou prekladača. 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 Ak program používa veľa funkcií Win 32 API, je vhodné použiť direktívu include C: masm 32includeuser 32. inc

Programovanie na úrovni strojových pokynov 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ávanie 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ť".

Inštrukcia mikroprocesorového stroja napísaná v jazyku symbolických inštrukcií je jeden riadok s nasledujúcou syntaktickou formou:

označenie príkazu / príkazu operand(y); komentáre

V tomto prípade je požadované pole v riadku príkaz alebo príkaz.

Označenie, príkaz/direktíva 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 pri písaní príkazov alebo direktív.

Príklady riadkov kódu:

Počet db 1 Názov, príkaz, jeden operand
ťah eax, 0 Príkaz, dva operandy
cbw; Príkaz

Tagy

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

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

Bodku možno použiť ako prvý znak štítku, ale niektorí kompilátori neodporúčajú používať tento znak. Vyhradené názvy assembleru (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 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 assembleru, musia končiť dvojbodkou:.

Príkazy

Príkaz hovorí prekladateľovi, akú akciu má mikroprocesor vykonať. V dátovom segmente príkaz (alebo direktíva) definuje pole, pracovnú oblasť alebo konštantu. V segmente kódu inštrukcia definuje akciu, ako je prenos (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ú len v procese zostavovania programu a na rozdiel od inštrukcií 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 žiadne operandy. Počet operandov je implicitne určený kódom príkazu.
Príklady:

  • Žiadne ret operandy; Návrat
  • Jeden operand inc ecx; Zvýšenie ecx
  • Dva operandy pridávajú eax, 12, pridávajú 12 k eax

Označenie, 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 zapisovať si ich do stĺpca.

Operandy môžu byť

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

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

Pravidlá zápisu identifikátorov.

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

Komentáre sú od spustiteľného riadku oddelené a; ... V tomto prípade všetko napísané za bodkočiarkou a až do konca riadku je komentár. Používanie komentárov v programe zlepšuje prehľadnosť, najmä ak nie je jasný zámer inštrukčnej sady. Komentár môže obsahovať ľubovoľné tlačiteľné znaky vrátane medzier. Komentár môže zahŕňať celý riadok alebo môže nasledovať po príkaze na rovnakom riadku.

Štruktúra programu montáže

Program napísaný v assembleri sa môže skladať z niekoľkých častí, tzv modulov ... Každý modul môže mať definovaný jeden alebo viacero dátových, zásobníkových a kódových segmentov. Každý kompletný program zostavy musí obsahovať jeden hlavný alebo hlavný modul, z ktorého sa spustí jeho vykonávanie. Modul môže obsahovať segmenty kódu, segmenty údajov a segmenty zásobníka, deklarované pomocou príslušných direktív. Pred deklarovaním segmentov musíte špecifikovať pamäťový model pomocou direktívy .MODEL.

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

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

RET
KONIEC ŠTART

Tento program obsahuje iba jeden príkaz 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 prácou prekladateľ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 informuje prekladateľa, že procesor pracuje v chránenom režime.
.MODEL FLAT, stdcall je model s plochou pamäťou. Tento model pamäte sa používa v operačnom systéme Windows. stdcall
.DATA - segment programu obsahujúci dáta.
.CODE - blok programu obsahujúci kód.
ŠTART je označenie. V jazyku symbolických inštancií hrajú štítky veľkú úlohu, čo nie je prípad moderných jazykov na vysokej úrovni.
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é. Ak vynecháte direktívu END, vygeneruje sa chyba.
Návestie zadané za direktívou END hovorí prekladateľovi názov hlavného modulu, z ktorého sa program spúšťa. Ak program obsahuje jeden modul, označenie za direktívou END možno vynechať.

Všeobecné informácie o jazyku symbolických inštrukcií

Symbolický asembler umožňuje do značnej miery eliminovať nevýhody strojového programovania.

Jeho hlavnou výhodou je, že v jazyku symbolických inštancií sú všetky prvky programu reprezentované v symbolickej forme. Transformácia symbolických názvov príkazov na ich binárne kódy je priradená špeciálnemu programu - assembleru, ktorý programátora odbremení od namáhavej práce a eliminuje nevyhnutné chyby.

Symbolické názvy zadané počas programovania v jazyku symbolických inštancií zvyčajne odrážajú sémantiku programu a skratky príkazov - ich hlavnú funkciu. Napríklad: PARAM - parameter, TABLE - tabuľka, MASK - maska, ADD - sčítanie, SUB - odčítanie atď. n. Takéto mená si programátor ľahko zapamätá.

Na programovanie v jazyku symbolických inštancií potrebujete zložité nástroje ako pri programovaní v strojovom jazyku: potrebujete výpočtové systémy založené na mikropočítači alebo PC so sadou periférnych zariadení (alfanumerická klávesnica, znakový displej, disketová mechanika a tlačové zariadenie), ako aj rezidentné alebo medzisystémové programovanie pre požadované typy mikroprocesorov. Assembler umožňuje efektívne písať a ladiť oveľa zložitejšie programy ako strojový jazyk (do 1 - 4 KB).

Jazyky symbolov sú strojovo orientované, to znamená, že sú závislé od strojového jazyka a štruktúry príslušného mikroprocesora, pretože v nich má každá inštrukcia mikroprocesora priradený určitý symbolický názov.

Jazyky symbolov poskytujú výrazné zvýšenie produktivity programátorov v porovnaní so strojovými jazykmi a zároveň zachovávajú schopnosť využívať všetky dostupné softvérové ​​hardvérové ​​prostriedky mikroprocesora. To umožňuje skúseným programátorom písať programy, ktoré sa vykonávajú v kratšom čase a zaberajú menej pamäte ako programy napísané vo vysokoúrovňovom jazyku.

V tomto ohľade sú takmer všetky programy na ovládanie vstupných / výstupných zariadení (ovládačov) napísané v jazyku symbolických inštancií, a to aj napriek prítomnosti pomerne rozsiahlej nomenklatúry jazykov na vysokej úrovni.

Pomocou assembleru môže programátor nastaviť nasledujúce parametre:

mnemotechnická pomôcka (symbolický názov) každej inštrukcie v strojovom jazyku mikroprocesora;

štandardný formát pre riadky programu assembler;

formát na špecifikovanie rôznych metód adresovania a možností príkazov;

formát na špecifikovanie znakových konštánt a konštánt celočíselného typu v rôznych číselných sústavách;

pseudopríkazy, ktoré riadia proces zostavovania (prekladania) programu.

V jazyku symbolických inštrukcií je program napísaný riadok po riadku, to znamená, že pre každú inštrukciu je priradený jeden riadok.

Pre mikropočítače, postavené na základe najbežnejších typov mikroprocesorov, môže existovať niekoľko variantov jazyka symbolických inštrukcií, zvyčajne však existuje len jedna praktická distribúcia - ide o takzvaný štandardný jazyk symbolov.

Programovanie na úrovni strojových pokynov 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ávanie 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ť".

Inštrukcia mikroprocesorového stroja napísaná v jazyku symbolických inštrukcií je jeden riadok s nasledujúcou syntaktickou formou:

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

V tomto prípade je požadované pole v riadku príkaz alebo príkaz.

Označenie, príkaz/direktíva 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 pri písaní príkazov alebo direktív.

Priame adresovanie: Efektívna adresa je určená priamo poľom posunu strojovej inštrukcie, ktoré môže mať veľkosť 8, 16 alebo 32 bitov.

mov eax, súčet; eax = súčet

Assembler nahradí sum zodpovedajúcou adresou uloženou v dátovom segmente (štandardne je adresovaná registrom ds) a hodnota uložená na sumovej adrese sa umiestni do registra eax.

Nepriame adresovanie má zase tieto typy:

· Nepriame adresovanie bázy (registra);

· Nepriame adresovanie bázy (registra) s ofsetom;

· Nepriame indexované adresovanie;

· Nepriame adresovanie základného indexu.

Nepriame adresovanie bázy (registra). Pri tomto adresovaní môže byť efektívna adresa operandu v ktoromkoľvek zo všeobecných registrov, okrem sp / esp a bp / ebp (to sú špecifické registre na prácu so segmentom zásobníka). Syntakticky je v príkaze tento režim adresovania vyjadrený uzavretím názvu registra do hranatých zátvoriek.

mov eax,; eax = * esi; * Hodnota esi v esi

Úvod.

Jazyk, v ktorom je pôvodný program napísaný, sa nazýva tzv vchod jazyk a jazyk, do ktorého je preložený na vykonanie procesorom-ROM je víkend Jazyk. Proces konverzie vstupného jazyka na výstupný jazyk sa nazýva vysielať. Keďže procesory sú schopné vykonávať programy v strojovom jazyku binárnych kódov, ktorý sa nepoužíva na programovanie, je potrebný preklad všetkých zdrojových programov. Známy dve cesty preklady: zostavovanie a tlmočenie.

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

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

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

Jazyk symbolických adries diskutovaný nižšie je implementovaný pomocou kompilácie.

Vlastnosti jazyka.

Hlavné vlastnosti assemblera sú:

● namiesto binárnych kódov jazyk používa 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 (

Na adresovanie pamäťových buniek sa používajú aj symbolické názvy. Na programovanie v assembleri vám namiesto binárnych kódov a adries stačí poznať symbolické názvy, ktoré assembler preloží do binárnych kódov;

každý výrok sa zhoduje jeden príkaz stroja(kód), to znamená, že existuje vzájomná zhoda medzi strojovými inštrukciami a operátormi v programe v jazyku symbolických inštrukcií;

● jazyk poskytuje prístup na všetky predmety a tímov. Jazyky na vysokej úrovni túto schopnosť nemajú. Napríklad jazyk symbolických inštrukcií vám umožňuje kontrolovať bit vlajok a jazyk na vysokej úrovni (napr.

) túto schopnosť nemá. Všimnite si, že jazyky pre systémové programovanie (napríklad C) často zaberajú strednú pozíciu. Z hľadiska prístupnosti sú bližšie k jazyku symbolických inštrukcií, ale majú syntax vysokoúrovňového jazyka;

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

Na rozdiel od jazykov na vysokej úrovni je písanie a ladenie programu v assembleri časovo náročné. Napriek tomu sa jazyk montáže dostal široké využitie v dôsledku nasledujúcich okolností:

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

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

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

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

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

Pole štítku.

Pre pole štítka je priradený stĺpec 1. Štítok je symbolický názov alebo identifikátor, adresy Pamäť. Je potrebné, aby bolo možné:

● vykonať podmienený alebo nepodmienený skok na príkaz;

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

Takéto vyhlásenia sú označené. Na označenie názvu sa používajú (veľké) písmená anglickej abecedy a čísla. Pred názvom musí byť písmeno a na konci oddeľovač dvojbodka. Označenie s dvojbodkou je možné napísať na samostatný riadok a na ďalší riadok v stĺpci 2 je možné napísať operačný kód, čo zjednodušuje prácu kompilátora. Neprítomnosť dvojbodky neumožňuje rozlíšiť označenie od operačného kódu, ak sú umiestnené na samostatných riadkoch.

V niektorých verziách jazyka symbolických inštancií sa dvojbodky umiestňujú len za menovky príkazov, ale nie za menovky údajov a dĺžka menovky môže byť obmedzená na 6 alebo 8 znakov.

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

Pole operačného kódu.

Toto pole obsahuje mnemotechnický kód príkazu alebo pseudopríkazu (pozri nižšie). Mnemotechnický kód príkazov vyberajú dizajnéri jazyka. V jazyku symbolických inštancií

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

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

). V jazykoch symbolických inštancií

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

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

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

Pole operandu.

Ďalšie informácie potrebné na dokončenie operácie sa nachádzajú tu. V poli operandov pre inštrukcie skoku je uvedená adresa, kam chcete skočiť, ako aj adresy a registre, čo sú operandy pre strojovú inštrukciu. Ako príklad uvedieme operandy, ktoré je možné použiť pre 8-bitové procesory.

● číselné údaje,

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

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

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

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

● kódy vnútorných registrov mikroprocesora a pamäťových buniek

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

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

v dvojkovej sústave);

● identifikátory,

pre registračné dvojice lietadiel,

prvé písmená 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 inštrukcie v podmienke

(ak je splnená podmienka) 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 návestia je označená identifikátorom M1;

● výrazy,

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

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

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

V jazykovej verzii

používaný

Definujte konštantu).

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

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

); АХ - pre 16-bit (typ

a AH - pre 8-bit (typ

● pre procesory

ku každému operačného 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 sa používajú operačné kódy

resp.

Pole komentárov.

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

● bodkočiarka (;) v jazykoch pre podnikových spracovateľov

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

Každému jednotlivému riadku komentára predchádza počiatočný znak.

Pseudopríkazy (smernice).

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

základné inštrukcie, ktoré sú ekvivalentom strojového kódu procesora. Tieto príkazy vykonávajú celé spracovanie, ktoré poskytuje program;

pseudo príkazy, alebo smernice, navrhnuté na obsluhu procesu prekladu programu do jazyka kombinácií kódov. Ako príklad v tabuľke. 5.2.2 sú dané nejaké pseudopríkazy z ac-samplera

pre rodinu

.

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

● napíšte požadovanú sekvenciu príkazov vždy, keď sa s ňou stretnete. Tento prístup zväčšuje veľkosť programu;

● sformujte túto sekvenciu do procedúry (podprogramu) a v prípade potreby ju zavolajte. Tento výstup má svoje nevýhody: zakaždým musíte vykonať príkaz volania špeciálnej procedúry a príkaz návratu, čo pri krátkej a často používanej sekvencii môže výrazne znížiť rýchlosť programu.

Najjednoduchší a najefektívnejší spôsob, ako viackrát zopakovať reťazec príkazov, je použiť makro, ktorý možno považovať za pseudopríkaz určený na opätovné vysielanie skupiny príkazov, ktoré sa často vyskytujú v programe.

Makro alebo makro charakterizujú tri aspekty: makrodefinícia, makroreverzia a makroexpanzia.

Definícia makra

Ide o označenie opakovane sa opakujúceho sledu príkazov programu, používaného pre odkazy v texte programu.

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

Zoznam výrazov; Definícia makra

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

● názov

makro, ktoré obsahuje názov

Pseudopríkaz

a súbor parametrov;

● označené bodkami telo makro;

● tím

koncovky

makrá.

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

Na opätovné zostavenie vybranej skupiny príkazov použite adresu pozostávajúcu z názvu

makrá a zoznam parametrov s inými hodnotami.

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

) makra, assembler ho nahradí telom makra.

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

Ak je program prezentovaný ako postupnosť znakov (písmená, čísla, medzery, interpunkcia a návrat vozíka pre nový riadok), potom rozšírenie makra spočíva v nahradení niektorých reťazcov z tejto postupnosti inými reťazcami.

Rozšírenie makra nastáva počas procesu zostavovania, nie počas vykonávania programu. Spôsob manipulácie so znakovými reťazcami je zodpovedný makrofondy.

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

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

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

Parametrizované makrá.

Na prácu s opakujúcimi sa sekvenciami príkazov, ktorých parametre môžu nadobúdať rôzne hodnoty, sú k dispozícii nasledujúce definície makier:

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

● s formálne parametre. 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é sekvencie príkazov, ktoré sa líšia tým, že prvý z nich zamieňa P a

A druhý

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

) a P2 je nahradený 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é schopnosti.

Pozrime sa na niektoré pokročilé funkcie jazyka

Ak je makro obsahujúce príkaz podmienenej vetvy a označenie, na ktoré sa vetva vytvára, zavolané dvakrát alebo viackrát, označenie bude duplikované (problém duplicitných označení), čo spôsobí chybu. Preto je každému volaniu pridelené samostatné označenie (programátorom) ako parameter. V jazyku

označenie je deklarované ako miestne (

) a vďaka pokročilým funkciám assembler automaticky vygeneruje iný štítok pri každom rozbalení 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 MACRO

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

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

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

O použití makier v assembleri.

Pri používaní makier musí byť assembler schopný vykonávať dve funkcie: zachovať makrodefinície a rozšíriť volania makier.

Zachovanie makier.

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

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

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

● zoznam formálne parametre.

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

Interná reprezentácia makra

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

MOV EAX, MOV EBX, MOV MOV a

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

Rozšírenie volaní makier.

Vždy, keď sa počas zostavovania vyskytne makro, uloží sa do tabuľky makier. Keď je makro zavolané, 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 sú nahradené skutočnými parametrami a poskytnuté volaním. Ampersant & pred parametrami umožňuje, aby ich vzorkovač rozpoznal.

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

Dvojpriechodový assembler.

Program pozostáva z množstva operátorov. Preto by sa zdalo, že pri montáži 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;

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

Tento prístup však nie je účinný. Príkladom je problém tzv dopredné odkazy. Ak je prvý príkaz skokom na príkaz P umiestnený na samom konci programu, potom ho assembler nedokáže preložiť. Najprv musí určiť adresu operátora P a na to je potrebné prečítať celý program. Každé úplné prečítanie pôvodného programu sa nazýva ulička. Ukážeme vám, ako môžete vyriešiť problém s priamym odkazom pomocou dvoch prechodov:

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

● pri prvom prechode, transformovať naprogramujte do prechodného tvaru a uložte ho do tabuľky a vykonajte druhý prechod nie podľa pôvodného programu, ale podľa tabuľky. Tento spôsob montáže šetrí čas, keďže pri druhom prechode sa nevykonávajú žiadne I/O.

Prvý prechod.

Cieľ prvého prechodu- zostaviť tabuľku symbolov. Ako je uvedené vyššie, ďalším cieľom prvého prechodu je zachovať všetky makrá a rozšíriť volania tak, ako sa objavia. V dôsledku toho sa definícia symbolu aj rozšírenie makra uskutočňujú v jednom prechode. Symbol môže byť buď štítok, alebo význam, ktorému je priradený konkrétny názov pomocou smernice:

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

Priradením hodnôt k symbolickým názvom v poli označenia inštrukcie, assembler v podstate nastaví adresy, ktoré bude mať každá inštrukcia počas vykonávania programu. Na tento účel šetrí zostavovateľ počas procesu montáže počítadlo adries príkazov(

) 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 tvoria stoly symbolické mená, smernice a operačné kódy, a ak je to potrebné doslovný tabuľky. Literál je konštanta, pre ktorú assembler automaticky rezervuje pamäť. Okamžite si všimneme, že moderné procesory obsahujú inštrukcie s okamžitými adresami, takže ich assemblery nepodporujú literály.

Tabuľka symbolických mien

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

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

● bity prerozdelenia pamäte (ktoré ukazujú, či sa hodnota symbolu zmení, ak sa program načíta na inú adresu, ako zamýšľal assembler);

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

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

Tabuľka smernice.

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

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

Pre každý operačný kód sú v tabuľke uvedené 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). Operačné kódy sú rozdelené do skupín v závislosti od počtu a typu operandov. Typ príkazu určuje číslo skupiny a špecifikuje procedúru, ktorá sa volá na spracovanie všetkých príkazov v tejto skupine.

Druhý prechod.

Druhý prechodový cieľ- vytvorenie objektového programu a tlač, ak je to potrebné, montážneho protokolu; výstup informácií potrebných na to, aby linker prepojil procedúry, ktoré boli zostavené v rôznych časoch, do jedného spustiteľného súboru.

V druhom prechode (rovnako ako v prvom) sa riadky obsahujúce príkazy čítajú a spracovávajú jeden po druhom. Pôvodný operátor a odvodený od neho vo výstupe hexadecimálnej sústavy objekt kód je možné vytlačiť alebo uložiť do vyrovnávacej pamäte pre neskoršiu tlač. Po vynulovaní počítadla adresy príkazu sa vyvolá ďalší príkaz.

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

daný symbol je nedefinovaný alebo definovaný viac ako raz;

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

● neexistuje žiadny operátor

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

Články venované assembleru.

1. Architektúra PC ………………………………………………………………… 5

    1.1. Registre.

    1.1.1 Všeobecné registre.

1.1.2. Segmentové registre

1.1.3 Register vlajok

1.2. Organizácia pamäte.

1.3. Prezentácia údajov.

1.3.1 Typy údajov

1.3.2 Reprezentácia znakov a reťazcov

2. Operátori programu assembler …………………………………………

    1. Príkazy jazyka symbolických inštrukcií

2.2. Režimy adresovania a formáty strojových pokynov

3. Pseudooperátory ………………………………………………………….

3.1 Smernice na definíciu údajov

3.2 Štruktúra programu v assembleri

3.2.1 Segmenty programu. Prevziať smernicu

3.2.3 Smernica o zjednodušenej segmentácii

4. Zostavenie a prepojenie programu ………………………….

5. Príkazy na odosielanie údajov ………………………………………………….

    5.1 Všeobecné príkazy

    5.2 Príkazy pre prácu so zásobníkom

5.3 I/O príkazy

5.4 Príkazy na presmerovanie adresy

5.5 Príkazy na preposielanie príznakov

6. Aritmetické príkazy ………………………………………………….

    6.1 Aritmetické operácie na binárnych celých číslach

6.1.1 Sčítanie a odčítanie

6.1.2 Príkazy na zvýšenie a zníženie prijímača o jeden

6.2 Násobenie a delenie

6.3 Zmena znamienka

7. Logické operácie ………………………………………………….

8. Posuny a cyklické posuny …………………………………………

9. Operácie s reťazcami ………………………………………………….

10. Logika a organizácia programov ………………………………………

10.1 Bezpodmienečné skoky

10.2 Podmienené skoky

10.4 Rutiny v jazyku symbolických inštancií

10.5 INT Prerušenia

10.6 Systémový softvér

10.6.1.1 Čítanie klávesnice.

10.6.1.2 Zobrazovanie znakov na obrazovke

10.6.1.3 Ukončiť programy.

10.6.2.1 Výber režimov zobrazenia

11. Disková pamäť ………………………………………………………… ..

11.2 Tabuľka prideľovania súborov

11.3 Disk I/O

11.3.1 Zápis súboru na disk

11.3.1.1 Údaje vo formáte ASCIIZ

11.3.1.2 Číslo spisu

11.3.1.3 Vytvoriť súbor na disku

11.3.2 Čítanie súboru na disku

Úvod

Assembler je symbolická reprezentácia strojového jazyka. Všetky procesy v osobnom počítači (PC) na najnižšej hardvérovej úrovni sú riadené iba príkazmi strojového jazyka (inštrukciami). Je nemožné skutočne vyriešiť problémy súvisiace s hardvérom (alebo dokonca aj problémy súvisiace s hardvérom, ako je zlepšenie výkonu programu) bez znalosti assembleru.

Assembler je pohodlná forma príkazov priamo pre komponenty PC a vyžaduje znalosť vlastností a možností integrovaného obvodu obsahujúceho tieto komponenty, konkrétne mikroprocesora PC. Assembler teda priamo súvisí s vnútornou organizáciou PC. A nie je náhoda, že takmer všetky kompilátory jazykov na vysokej úrovni podporujú prístup k programovacej úrovni jazyka symbolických adries.

Prvkom prípravy profesionálneho programátora je nevyhnutne štúdium assemblera. Je to preto, že programovanie v jazyku symbolických inštancií vyžaduje znalosť architektúry PC, čo vám umožňuje vytvárať efektívnejšie programy v iných jazykoch a kombinovať ich s programami v jazyku symbolických inštancií.

Príručka sa zaoberá problematikou programovania v assembleri pre počítače na báze mikroprocesorov od Intelu.

Tento tutoriál je určený všetkým, ktorí sa zaujímajú o architektúru procesorov a základy programovania v jazyku symbolických inštrukcií, predovšetkým vývojárom softvéru.

    architektúra PC.

Počítačová architektúra je abstraktná reprezentácia počítača, ktorá odráža jeho štruktúru, obvody a logickú organizáciu.

Všetky moderné počítače majú niektoré spoločné a individuálne vlastnosti architektúry. Jednotlivé vlastnosti sú vlastné len konkrétnemu počítačovému modelu.

Pojem počítačová architektúra zahŕňa:

    bloková schéma počítača;

    prostriedky a spôsoby prístupu k prvkom počítačovej blokovej schémy;

    nastavenie a dostupnosť registrov;

    organizácia a metódy oslovovania;

    spôsob prezentácie a formát počítačových údajov;

    súbor inštrukcií pre počítač;

    formáty strojových inštrukcií;

    manipuláciu s prerušením.

Hlavné prvky počítačového hardvéru: systémová jednotka, klávesnica, zobrazovacie zariadenia, diskové jednotky, tlačové zariadenia (tlačiareň) a rôzne komunikačné zariadenia. Systémová jednotka pozostáva zo základnej dosky, napájacieho zdroja a rozširujúcich slotov pre ďalšie karty. Systémová doska obsahuje mikroprocesor, pamäť iba na čítanie (ROM), pamäť s náhodným prístupom (RAM) a koprocesor.

      Registre.

Vo vnútri mikroprocesora sú informácie obsiahnuté v skupine 32 registrov (16 užívateľských registrov, 16 systémových registrov), ktoré sú do určitej miery dostupné pre použitie programátorom. Keďže návod je venovaný programovaniu pre mikroprocesor 8088-i486, je najlogickejšie začať túto tému diskusiou o interných registroch mikroprocesora, ktoré má používateľ k dispozícii.

Užívateľské registre používa programátor na písanie programov. Tieto registre zahŕňajú:

    osem 32-bitových registrov (univerzálne registre) EAX / AX / AH / AL, EBX / BX / BH / BL, ECX / CX / CH / CL, EDX / DX / DLH / DL, EBP / BP, ESI / SI, EDI / DI, ESP / SP;

    šesť 16-bitových segmentových registrov: CS, DS, SS, ES, FS, GS;

    stavové a riadiace registre: register príznakov EFLAGS / FLAGS a register ukazovateľa inštrukcií EIP / IP.

Lomka označuje časti jedného 32-bitového registra. Predpona E (Extended) označuje použitie 32-bitového registra. Na prácu s bajtmi sa používajú registre s predponami L (low) a H (high), napríklad AL, CH - označujúce nízke a vysoké bajty 16-bitových častí registrov.

        Univerzálne registre.

EAX / AX / AH / AL (Register akumulátora) - batérie... Používa sa pri násobení a delení, pri I/O operáciách a pri niektorých operáciách s reťazcami.

EBX / BX / BH / BL - základný register(základný register), často používaný pri adresovaní údajov v pamäti.

ECX / CX / CH / CL - počítadlo(počítačový register), používaný ako počítadlo opakovania slučky.

EDX / DX / DH / DL - registra údajov(údajový register), ktorý sa používa na ukladanie medziľahlých údajov. Pre niektoré príkazy je to povinné.

Všetky registre v tejto skupine umožňujú prístup do svojich „dolných“ častí. Iba spodné 16- a 8-bitové časti týchto registrov môžu byť použité na samoadresovanie. Horných 16 bitov týchto registrov nie je dostupných ako nezávislé objekty.

Na podporu príkazov na spracovanie riadkov, ktoré umožňujú sekvenčné spracovanie reťazcov prvkov s dĺžkou 32, 16 alebo 8 bitov, sa používajú nasledovné:

ESI / SI (zdrojový indexový register) - index zdroj... Obsahuje adresu aktuálneho zdrojového prvku.

EDI / DI (registračný register) - index prijímač(príjemca). Obsahuje aktuálnu adresu v reťazci prijímača.

V architektúre mikroprocesora je na úrovni hardvéru a softvéru podporovaná dátová štruktúra - zásobník. Na prácu so zásobníkom existujú špeciálne príkazy a špeciálne registre. Treba poznamenať, že zásobník sa napĺňa smerom k menším adresám.

ESP / SP (zásobník ukazovateľov register) - Registrovať ukazovateľ stoh... Obsahuje ukazovateľ na vrchol zásobníka v aktuálnom segmente zásobníka.

EBP / BP (základný register bodu) - zásobník základného ukazovateľa register... Navrhnuté na organizáciu náhodného prístupu k údajom vo vnútri zásobníka.

1.1.2. Segmentové registre

V softvérovom modeli mikroprocesora je ich šesť segmentové registre: CS, SS, DS, ES, GS, FS. Ich existencia je spôsobená špecifikami organizácie a využívania pamäte RAM mikroprocesormi Intel. Hardvér mikroprocesora podporuje štrukturálnu organizáciu programu pozostávajúceho z segmentov. Registre segmentov sa používajú na označenie aktuálne dostupných segmentov. Mikroprocesor podporuje nasledujúce typy segmentov:

    Segment kódu. Obsahuje príkazy programu. Na prístup k tomuto segmentu použite register CS (register segmentov kódu) - register kódov segmentov... Obsahuje adresu segmentu strojovej inštrukcie, ku ktorému má mikroprocesor prístup.

    Segment údajov. Obsahuje dáta spracované programom. Na prístup k tomuto segmentu použite register DS (register dátových segmentov) - segmentový dátový register ktorý ukladá adresu dátového segmentu aktuálneho programu.

    Segment zásobníka. Tento segment predstavuje oblasť pamäte nazývanú zásobník. Mikroprocesor organizuje zásobník podľa princípu - kto prv príde, ten prv odíde. Register SS (stack segment register) sa používa na prístup k zásobníku - zásobníkový segmentový register obsahujúci adresu segmentu zásobníka.

    Ďalší segment údajov. Spracované dáta môžu byť v troch dodatočných dátových segmentoch. V predvolenom nastavení sa predpokladá, že údaje sú v segmente údajov. Pri použití dodatočných dátových segmentov sa ich adresy musia špecifikovať explicitne pomocou špeciálnych predpôn nahradenia segmentov v príkaze. Adresy dodatočných dátových segmentov musia byť obsiahnuté v registroch ES, GS, FS (register dátových segmentov rozšírenia).

        Riadiace a stavové registre

Mikroprocesor obsahuje niekoľko registrov, ktoré obsahujú informácie o stave ako samotného mikroprocesora, tak aj programu, ktorého príkazy sa práve nahrávajú do pipeline. to:

Register príkazového ukazovateľa EIP / IP;

    registrovať vlajky EFLAGS / FLAGS.

Pomocou týchto registrov môžete získať informácie o výsledkoch vykonávania príkazov a ovplyvniť stav samotného mikroprocesora.

EIP / IP (register inštrukčných ukazovateľov) - ukazovateľ tímov... Register EIP/IP je široký 32 alebo 16 bitov a obsahuje posun ďalšej inštrukcie, ktorá sa má vykonať, vzhľadom na obsah registra segmentu CS v aktuálnom segmente inštrukcie. Tento register nie je priamo prístupný, ale mení sa skokovými príkazmi.

VLAJKY / VLAJKY (register vlajok) - Registrovať vlajky... Bitová hĺbka 32/16 bit. Jednotlivé bity tohto registra majú špecifický funkčný účel a nazývajú sa príznakmi. Príznak je bit, ktorý má hodnotu 1 („príznak je nastavený“), ak je splnená určitá podmienka, a v opačnom prípade má hodnotu 0 („príznak je vymazaný“). Spodná časť tohto registra je úplne analogická s registrom FLAGS pre i8086.

1.1.3 Register vlajok

Register príznakov je 32-bitový a má názov EFLAGS (obrázok 1). Jednotlivé bity registra majú špecifický funkčný účel a nazývajú sa príznakmi. Každému z nich je priradený špecifický názov (ZF, CF atď.). Spodných 16 bitov EFLAGS predstavuje 16-bitový register FLAGS používaný pri vykonávaní programov napísaných pre mikroprocesory i086 a i286.

Obr. 1 Register vlajok

Niektoré príznaky sa bežne označujú ako príznaky stavu; automaticky sa menia pri vykonávaní príkazov a opravujú určité vlastnosti ich výsledku (napríklad či sa rovná nule). Ostatné vlajky sa nazývajú štátne vlajky; menia sa od programu a ovplyvňujú ďalšie správanie procesora (napríklad prerušenia blokov).

Príznaky stavu:

CF (nosenie vlajky) - niesť vlajku... Nadobudne hodnotu 1, ak sa pri pridávaní celých čísel objavila jednotka delenia slov, ktorá sa „nevošla“ do bitovej mriežky, alebo ak pri odčítaní čísel bez znamienka bolo prvé z nich menšie ako druhé. V príkazoch posunu je bit, ktorý presahuje bitovú mriežku, nastavený v CF. CF tiež zachytáva vlastnosti príkazu násobenia.

OF (príznak pretečenia) - vlajka pretečenia... Nastaví sa na 1, ak sa pri sčítaní alebo odčítaní celých čísel so znamienkom získa výsledok, ktorý je v absolútnej hodnote väčší ako prípustná hodnota (mantisa pretiekla a „zaliezla“ do znamienkového bitu).

ZF (nulový príznak) - nulová vlajka... Nastaví sa na 1, ak sa výsledok príkazu rovná 0.

SF (príznak znamenia) - vlajka znamenie... Nastaví sa na 1, ak má operácia so znamienkom za následok negatívny výsledok.

PF (paritný príznak) - vlajka parita... Rovná sa 1, ak výsledok nasledujúceho príkazu obsahuje párny počet binárnych jednotiek. Zvyčajne sa berie do úvahy iba počas I/O operácií.

AF (pomocná vlajka na prenášanie) - extra niesť vlajku... Opravuje zvláštnosti vykonávania operácií s binárno-desiatkovými číslami.

Stavové príznaky:

DF (príznak smeru) - smerová vlajka... Nastavuje smer zobrazenia riadkov v reťazcových príkazoch: s DF = 0 sa riadky skenujú "dopredu" (od začiatku do konca), s DF = 1 - v opačnom smere.

IOPL (úroveň privilégií vstupu/výstupu) - Úroveň privilégií I/O. Používa sa v chránenom režime mikroprocesora na riadenie prístupu k I/O príkazom v závislosti od privilégií úlohy.

NT (vnorená úloha) - príznak vnorenia úloh. Používa sa v chránenom režime mikroprocesora na zaznamenanie skutočnosti, že jedna úloha je vnorená do inej.

Systémový príznak:

IF (príznak PRERUŠENIA) - príznak prerušenia... Keď IF = 0, procesor prestane reagovať na prichádzajúce prerušenia, keď IF = 1, zámok prerušenia sa uvoľní.

TF (vlajka pasce) - stopový príznak... Ak TF = 1, po vykonaní každej inštrukcie procesor vykoná prerušenie (s číslom 1), ktoré je možné použiť pri ladení programu na jej sledovanie.

RF (príznak obnovenia) - vlajka obnovenia... Používa sa pri spracovaní prerušení z registrov ladenia.

VM (virtuálny režim 8086) - virtuálna vlajka 8086. 1-procesor pracuje vo virtuálnom režime 8086.0- procesor pracuje v reálnom alebo chránenom režime.

AC (kontrola zarovnania) - príznak kontroly zarovnania. Navrhnuté na umožnenie kontroly zarovnania pri prístupe do pamäte.

      Organizácia pamäte.

Volá sa fyzická pamäť, ku ktorej má mikroprocesor prístup RAM ( alebo pamäť s náhodným prístupom - RAM). RAM je reťazec bajtov, ktoré majú svoju jedinečnú adresu (jej číslo), tzv fyzické. Rozsah hodnôt fyzických adries je od 0 do 4 GB. Mechanizmus správy pamäte je úplne založený na hardvéri.

Mikroprocesor podporuje niekoľko modelov využitia pamäte RAM v hardvéri:

    segmentovaný model... V tomto modeli je pamäť pre programy rozdelená na súvislé pamäťové oblasti (segmenty) a samotný program môže pristupovať len k údajom, ktoré sú v týchto segmentoch;

    model stránky... V tomto prípade sa RAM považuje za súbor blokov s pevnou veľkosťou 4 KB. Hlavná aplikácia tohto modelu je spojená s organizáciou virtuálnej pamäte, ktorá programom umožňuje využívať pamäťový priestor väčší ako je množstvo fyzickej pamäte. Pre mikroprocesor Pentium môže byť možná virtuálna pamäť až 4 TB.

Použitie a implementácia týchto modelov závisí od prevádzkového režimu mikroprocesora:

    Režim reálnej adresy (reálny režim). Režim je podobný činnosti procesora i8086. Je to nevyhnutné pre fungovanie programov vyvinutých pre staršie modely procesorov.

    Chránený režim. V chránenom režime je možné multitaskingové spracovanie informácií, ochrana pamäte pomocou štvorúrovňového mechanizmu privilégií a jej stránkovanie.

    Virtuálny režim 8086. V tomto režime je možné spustiť niekoľko programov pre i8086. V tomto prípade je možná prevádzka programov v reálnom režime.

Segmentácia je adresovací mechanizmus, ktorý umožňuje existenciu viacerých nezávislých adresných priestorov. Segment je nezávislý, hardvérovo podporovaný blok pamäte.

Každý program môže vo všeobecnom prípade pozostávať z ľubovoľného počtu segmentov, ale má priamy prístup k trom hlavným: kód, dáta a zásobník – a jeden až tri ďalšie dátové segmenty. Operačný systém umiestňuje segmenty programu do pamäte RAM na konkrétne fyzické adresy a potom umiestňuje hodnoty týchto adries do príslušných registrov. V rámci segmentu program pristupuje k adresám vzhľadom na začiatok segmentu lineárne, to znamená, že začína od adresy 0 a končí adresou rovnajúcou sa veľkosti segmentu. Relatívna adresa resp zaujatosť, ktorý mikroprocesor používa na prístup k údajom v rámci segmentu sa nazýva efektívne.

Vytvorenie fyzickej adresy v reálnom režime

V reálnom režime je rozsah zmeny fyzickej adresy od 0 do 1 MB. Maximálna veľkosť segmentu je 64 kB. Pri odvolávaní sa na konkrétne fyzická adresa RAM je určená adresou začiatku segmentu a posunom v rámci segmentu. Začiatočná adresa segmentu sa prevezme z príslušného registra segmentov. V tomto prípade segmentový register obsahuje iba horných 16 bitov fyzickej adresy začiatku segmentu. Chýbajúce spodné štyri bity 20-bitovej adresy sa získajú posunutím hodnoty segmentového registra doľava o 4 bity. Operácia zmeny sa vykonáva hardvérovo. Výsledná 20-bitová hodnota je skutočná fyzická adresa zodpovedajúca začiatku segmentu. To jest fyzická adresa je špecifikovaný ako pár „segment: offset“, kde „segment“ je prvých 16 bitov počiatočnej adresy segmentu pamäte, do ktorého bunka patrí, a „offset“ je 16-bitová adresa tejto bunky, počítaná od začiatok tohto segmentu pamäte (hodnota 16 * segment + offset udáva absolútnu adresu bunky). Ak je napríklad v registri CS uložená hodnota 1234h, potom pár adries 1234h:507h definuje absolútnu adresu rovnajúcu sa 16 * 1234h + 507h = 12340h + 507h = 12847h. Takýto pár je napísaný vo forme dvojitého slova a (ako v prípade čísel) v „obrátenej“ forme: prvé slovo obsahuje posun a druhé - segment a každé z týchto slov je uvedené v "obrátená" forma. Napríklad dvojica 1234h:5678h sa zapíše takto: | 78 | 56 | 34 | 12 |.

Tento mechanizmus na vytvorenie fyzickej adresy vám umožňuje premiestniť softvér, to znamená, že nezávisí od konkrétnych adries jeho načítania v RAM.