Príkazy Assembler referenčná kniha intel 8086. Programovanie v assembleri pre začiatočníkov a ďalšie

Prvé mikroprocesory boli 4-bitové zariadenia. To znamená, že mohli naraz spracovať iba štyri bity informácií. Na spracovanie viac ako štyroch bitov museli vykonať niekoľko sekvenčných operácií. To samozrejme spomalilo prácu.

Prvým priemyselným 8-bitovým mikroprocesorom (súčasne spracovávajúcim 8 bitov informácií) bol mikroprocesor 8008, ktorý spoločnosť Intel vydala v roku 1972. Je považovaný za najlepší 8-bitový mikroprocesor prvej generácie. Vo svojej architektúre je tento mikroprocesor podobný kalkulačke; má akumulátor, šesť všeobecných registrov, ukazovateľ zásobníka (špeciálny register adries pracovnej bunky), osem registrov adries a špeciálne inštrukcie pre vstup a výstup dát. V roku 1973 Intel vydal druhú generáciu verzie mikroprocesora 8008 s názvom 8080.

V porovnaní s mikroprocesorom 8008 dokázal mikroprocesor 8080 adresovať viac pamäte, mal rozšírené I/O možnosti, mal ďalšie inštrukcie a bol rýchlejší. Hoci myšlienky architektúry mikroprocesorov 8008 preniesol Intel do značnej miery na mikroprocesor 8080, jeho vnútorná organizácia sa zlepšila natoľko, že mikroprocesor 8080 sa stal de facto štandardom pre mikroprocesory druhej generácie; a keď príde reč na mikroprocesory, prvá vec, ktorá mnohým ľuďom napadne, je mikroprocesor 8080.

Pokrok v technológii umožnil Intelu v roku 1976 vydať vylepšenú verziu mikroprocesora 8080 s názvom 8085. Od mikroprocesora 8080 sa líšil dizajnom skrine, mal reset do počiatočného stavu (na inicializáciu mikroprocesora), vektor prerušenia (na obsluhu periférnych zariadení), sériový vstupný port - výstup (na pripojenie tlačiarní a iných periférnych zariadení). Okrem toho potreboval iba jeden zdroj +5V (mikroprocesor 8080 potreboval dva zdroje).

V čase, keď bol uvedený na trh mikroprocesor 8085, čelil Intel vážnej konkurencii na trhu 8-bitových mikroprocesorov. Úspech sa začal tešiť mikroprocesor Z80 od Zilog Corporation, vylepšenie mikroprocesora 8080, ako aj mikroprocesory 6800 od Motoroly a 6502 od MOS Technology (dnes Commodore), ktoré sa od 8080 výrazne odlišovali svojou architektúrou. A namiesto toho, aby pokračoval v boji na preplnenom trhu s 8-bitovými mikroprocesormi, urobil Intel kvantový skok vpred a v roku 1978 vydal 16-bitový mikroprocesor 8086, ktorý dokázal spracovať dáta 10-krát rýchlejšie ako mikroprocesor 8080.

Mikroprocesor 8086 je softvérovo kompatibilný s mikroprocesorom 8080 na úrovni jazyka symbolických adries. To znamená, že s malými úpravami je možné programy napísané pre mikroprocesor 8080 opätovne preložiť a spustiť na mikroprocesore 8086. Táto kompatibilita je zabezpečená tým, že registre a inštrukčná sada mikroprocesora 8080 sú podmnožinami registrov a inštrukcií mikroprocesora 8086 To umožnilo Intelu využiť rozsiahle skúsenosti mikroprocesora 8080 a získať výhodu v zložitejších aplikáciách.

Keďže mnohí dizajnéri stále uprednostňovali používanie lacnejších 8-bitových pomocných a periférnych čipov vo svojich 16-bitových systémoch, Intel vydal verziu mikroprocesora 8086, ktorý mal vo vnútri rovnaké zariadenie, ale na vonkajšej strane 8-bitovú dátovú zbernicu. Táto verzia (mikroprocesor 8088) je identická s 8086, ale trvá dlhšie, kým sa prenesú 16-bitové dáta, čo sa dosiahne pomocou dvoch po sebe idúcich 8-bitových prenosov. V aplikáciách, ktoré primárne spracúvajú 8-bitové hodnoty, však 8088 funguje v rámci 10 % výkonu 8086.

Môžete teda predpokladať, že váš osobný počítač IBM má 16-bitový mikroprocesor. (A preto môžete použiť početnú literatúru o mikroprocesore 8086.) Ukončime tento úvod a prejdime k diskusii o schopnostiach mikroprocesora 8088.

Aby sme mohli písať programy v assembleri, potrebujeme vedieť, aké procesorové registre existujú a ako sa dajú použiť. Všetky procesory x86 (aj viacjadrové, veľké a zložité) sú vzdialenými potomkami starodávneho Intel 8086 a sú kompatibilné s jeho architektúrou. To znamená, že programy napísané v assembleri 8086 budú fungovať na všetkých moderných x86 procesoroch.

Všetky interné registre procesora Intel 8086 sú 16-bitové:

Celkovo procesor obsahuje 12 softvérovo prístupných registrov, ako aj register príznakov (FLAGS) a ukazovateľ inštrukcie (IP).

Univerzálne registre (RON) AX, BX, CX a DX sa používajú na ukladanie údajov a vykonávanie rôznych aritmetických a logických operácií. Každý z týchto registrov je navyše rozdelený na 2 časti po 8 bitoch, s ktorými je možné pracovať ako s 8 bitovými registrami (AH, AL, BH, BL, CH, CL, DH, DL). Spodné časti registrov majú v názve písmeno L (od slov Nízka), a staršie sú H (od slov Vysoká). Niektoré inštrukcie implicitne používajú určitý register, napríklad CX môže fungovať ako počítadlo slučiek.

Indexové registre sú určené na ukladanie indexov pri práci s poliami. SI ( Index zdroja) obsahuje zdrojový index a DI ( Index destinácie) je cieľový index, hoci môžu byť použité aj ako univerzálne registre.

Registre ukazovateľov BP a SP sa používajú na prácu so zásobníkom. BP ( Základný ukazovateľ) vám umožňuje pracovať s premennými v zásobníku. Dá sa použiť aj na iné účely. SP ( Ukazovateľ zásobníka) ukazuje na vrch zásobníka. Používajú ho príkazy, ktoré pracujú so zásobníkom. (O stohu budem podrobne hovoriť v samostatnej časti školenia)

Segmentové registre CS ( Segment kódu), DS ( Segment údajov), SS ( Segment zásobníka) a ES ( Rozšírený segment) sú navrhnuté tak, aby poskytovali adresovanie segmentov. Kód je v segmente kódu, údaje sú v segmente údajov, zásobník je v segmente zásobníka a existuje ďalší segment údajov. Reálna fyzická adresa sa získa posunutím obsahu segmentového registra o 4 bity doľava a pridaním offsetu (relatívnej adresy v rámci segmentu). Adresovanie segmentov je podrobnejšie opísané v časti 31.

Program COM sa vždy nachádza v jedinom segmente, ktorý je súčasne segmentom kódu, údajov a zásobníka. Keď spustíte program COM, registre segmentov budú obsahovať rovnaké hodnoty.

Index príkazov IP ( Ukazovateľ pokynov) obsahuje adresu príkazu (v segmente kódu). Jeho obsah nemôžete priamo meniť, ale procesor to robí sám. Pri vykonávaní bežných príkazov sa hodnota IP zväčší o veľkosť vykonávaného príkazu. K dispozícii sú aj inštrukcie riadiaceho prenosu, ktoré menia hodnotu IP na vykonanie prechodov v rámci programu.

Register vlajok FLAGS obsahuje samostatné bity: kontrolné príznaky a príznaky výsledkov. Kontrolné príznaky menia prevádzkový režim procesora:

  • D ( Smer) - smerová vlajka. Riadi smer spracovania dátových liniek: DF=0 - od nízkej po vysokú adresu, DF=1 - od vysokej po nízku adresu (pre špeciálne reťazcové príkazy).
  • ja ( Prerušiť) - príznak prerušenia. Ak je hodnota tohto bitu 1, potom sú prerušenia povolené, inak sú vypnuté.
  • T ( Pasca) - sledovacia vlajka. Používa ho debugger na spustenie programu krok za krokom.

Atribúty výsledkov sa nastavujú po vykonaní aritmetických a logických príkazov:

  • S( Podpísať) - znamienko výsledku, rovné znamienko bitu výsledku operácie. Ak sa rovná 1, potom je výsledok negatívny.
  • Z ( nula) - príznak nulového výsledku. ZF=1, ak je výsledok nula.
  • P( Parita) - znak rovnomernosti výsledku.
  • C ( Prenášať) - niesť vlajku. CF=1, ak pri sčítaní/odčítaní dôjde k prenosu/požičaniu od najvyššej číslice. Počas posunov ukladá hodnotu bitu, ktorý sa presúva.
  • A ( Pomocný) - dodatočná nosná vlajka. Používa sa v operáciách so zabalenými binárnymi desatinnými číslami.
  • O( Pretečenie) - príznak pretečenia. CF=1, ak je výsledok mimo prijateľného rozsahu hodnôt.

Nerobte si starosti, ak sa vám niečo zdá nejasné. Z ďalšieho vysvetlenia bude jasné, čo je čo a ako to všetko použiť :)


Emu8086 je platený program. Môžete ho však použiť na skúšobnú dobu 30 dní zadarmo.

Takže ste si stiahli a nainštalovali program Emu8086 na váš počítač. Spustíme ho a vytvoríme nový súbor cez menu FILE – NEW – COM TEMPLATE (File – New – COM File Template). V editore zdrojového kódu potom uvidíme nasledovné:

Ryža. 1.1. Vytvorenie nového súboru v Emu8086.

Tu je potrebné poznamenať, že programy vytvorené pomocou assemblerov pre počítače so systémom Windows sú dvoch typov: COM a EXE. Na rozdiely medzi týmito súbormi sa pozrieme neskôr, ale zatiaľ vám stačí vedieť, že po prvýkrát vytvoríme spustiteľné súbory s príponou COM, keďže sú jednoduchšie.

Po vytvorení súboru v Emu8086 pomocou metódy popísanej vyššie sa v editore zdrojového kódu zobrazí riadok „pridať svoj kód počuť“ - „pridať svoj kód sem“ (obr. 1.1). Tento riadok vymažeme a na jeho miesto vložíme nasledujúci text:

MOV AH, 02h MOV DL, 41h INT 21h INT 20h Úplné znenie programu teda bude vyzerať takto: ORG 100h MOV AH, 02h MOV DL, 41h INT 21h INT 20h RET Okrem toho sú v hornej časti aj komentáre (na obr. 1.1 – ide o zelený text). Komentár v jazyku assembler začína symbolom; (bodkočiarka) a pokračuje až do konca riadku. Ak neviete, čo sú komentáre a prečo sú potrebné, pozrite si knihu Ako sa stať programátorom. Ako som už povedal, tu nebudeme vysvetľovať základy programovania, keďže kniha, ktorú práve čítate, je určená pre ľudí, ktorí poznajú základy programovania.

Všimnite si tiež, že na veľkosti písmen v jazyku symbolických inštancií nezáleží. Môžete napísať RET, ret alebo Ret - bude to rovnaký príkaz.

Tento súbor môžete uložiť niekde na disk. Ale nemusíte to uložiť. Na spustenie programu stlačte tlačidlo EMULOVAŤ (so zeleným trojuholníkom) alebo kláves F5. Otvoria sa dve okná: okno emulátora a okno zdrojového kódu (obr. 1.2).

Ryža. 1.2. Okno emulátora Emu8086.

Okno emulátora zobrazuje registre a obsahuje ovládacie tlačidlá programu. Zdrojové okno zobrazuje zdrojový kód vášho programu so zvýraznením riadku, ktorý sa práve vykonáva. To všetko je veľmi výhodné pre štúdium a ladenie programov. Ale toto zatiaľ nepotrebujeme.

V okne emulátora môžete spustiť svoj program na vykonanie ako celok (tlačidlo RUN) alebo v režime krok za krokom (tlačidlo SINGLE STEP). Režim krok za krokom je vhodný na ladenie. Teraz spustíme program na spustenie pomocou tlačidla RUN. Potom (ak ste v texte programu neurobili žiadne chyby) sa zobrazí hlásenie o ukončení programu (obr. 1.3). Tu ste informovaní, že program preniesol kontrolu na operačný systém, to znamená, že program bol úspešne dokončený. V tomto okne kliknite na OK a nakoniec uvidíte výsledok vášho prvého programu v jazyku symbolických inštancií (obr. 1.4).

Ryža. 1.3. Správa o dokončení programu.

Ryža. 1.4. Váš prvý program je dokončený.

Ako sme už povedali, náš prvý program zobrazuje na obrazovke anglické písmeno „A“. Výsledok splnil naše očakávania – na obrazovke sa zobrazilo písmeno „A“.

Tu stojí za zmienku, že Emu8086 je EMULÁTOR, to znamená, že emuluje činnosť počítača s procesorom 8086. Preto vo vyššie opísanom príklade program nevykonáva operačný systém, ale emulátor. Emu8086 môže tiež vytvárať skutočné programy, ktoré je možné nezávisle spustiť na počítači. Ale popis práce s Emu8086 nie je zahrnutý v našich plánoch. Prečítajte si pomocníka a experimentujte – všetko vám vyjde.

V našom prípade nezáleží na tom, ako je program spustený - emulátorom alebo operačným systémom. Hlavná vec je pochopiť problematiku vytvárania programov v jazyku symbolických inštancií. Preto podrobne analyzujme náš jednoduchý program.

#make_COM#– 1. riadok. Tento príkaz je špecifický pre Emu8086. Používa sa na určenie typu vytváraného súboru. V našom prípade ide o súbor s koncovkou .COM.

ORG 100 hod– 2. riadok. Tento príkaz nastaví počítadlo programu na 100h, pretože keď je súbor COM načítaný do pamäte, DOS pridelí prvých 256 bajtov (desatinné 256 sa rovná hex 100) dátovému bloku PSP. Kód programu sa nachádza až za týmto blokom. Všetky programy, ktoré sú skompilované do súborov typu COM, musia začínať touto direktívou.

MOV AH, 2h– 3. riadok. Inštrukcia (alebo príkaz) MOV umiestni hodnotu druhého operandu do prvého operandu. To znamená, že hodnota 02h je umiestnená v registri AN. Prečo sa to robí? 02h je funkcia DOS, ktorá zobrazuje znak na obrazovke. Píšeme program pre DOS, takže používame príkazy tohto operačného systému (OS). A túto funkciu (alebo skôr jej číslo) zapíšeme do registra AH, pretože prerušenie 21h používa tento register.

MOV DL, 41h– 4. riadok. Kód znaku "A" sa zadá do registra DL. ASCII kód ​​pre znak "A" je 41h.

INT 21h– 5. riadok. Ide o rovnaké prerušenie 21h – príkaz, ktorý volá systémovú funkciu DOS špecifikovanú v registri AH (v našom príklade ide o funkciu 02h). Príkaz INT 21h je hlavným prostriedkom interakcie medzi programami a OS.

INT 20h– 6. riadok. Toto je prerušenie, ktoré hovorí operačnému systému, aby ukončil program a preniesol riadenie do konzolovej aplikácie. To znamená, že pri použití INT 20h v našom príklade sa riadenie prenesie do programu Emu8086. A ak už bol program skompilovaný a spustený z OS, tak nás príkaz INT 20h vráti do OS (napríklad do DOSu). V zásade by sa v prípade Emu8086 dal tento príkaz preskočiť, keďže rovnakú funkciu vykonáva aj príkaz RET, ktorý sa do zdrojového textu vloží automaticky pri vytváraní nového súboru pomocou šablóny (ako sme to urobili predtým). Ale rozhodol som sa použiť INT 20h aj tu kvôli kompatibilite s inými assemblerom.

Pre tých, ktorí z týchto vysvetliviek nepochopia všetko, odporúčam prečítať si knihu Ako sa stať programátorom, ako aj nasledujúce kapitoly.

MONTÁŽNY JAZYKMIKROPROCESOR 8088

Assembler je strojový jazyk napísaný v symbolickej forme. Zatiaľ čo adresy a inštrukcie v strojovom jazyku sú čísla, jazyk montáže umožňuje adresám pamäte priraďovať jedinečné názvy písmen. Takže Keďže aktuátory mikroprocesorov 8086 a 8088 sú identické, ukazuje sa, že jazyk symbolov 8088 je tiež identický s jazykom symbolov 8086 a je súčasťou jazyka symbolizácií mikroprocesorov 80186 a 80286, čo sú vylepšené modifikácie CPU 8086.

Program napísaný v assembleri 8088 možno preložiť (preložiť) do strojového jazyka pomocou programu tzv assembler. Assembler opísaný v tejto knihe je Microsoft makro assembler používaný v osobnom počítači IBM s diskovým operačným systémom PC-DOS.

Existujú aj iné verzie assemblerov, ktoré sú prijateľné pre rodinu mikroprocesorov 8086/8088, ako napríklad assembler IASM-86 vyvinutý spoločnosťou Intel Corporation, ktorý (zahŕňa štandardné mnemotechnické inštrukcie vrátane aritmetických pokynov pre čísla s pohyblivou rádovou čiarkou v procesore 8087. Aj keď sú dostupné rozdiely medzi týmito assemblermi, ich štruktúry a formáty príkazov jazykov sú do značnej miery kompatibilné.

Prečo je potrebný assembler?

Je veľmi nepohodlné, zdĺhavé a niekedy aj ťažké písať programy priamo v strojovom jazyku. V tomto prípade musí programátor vykonať veľa starostlivých a rutinných operácií: sledovať rozmiestnenie buniek v pamäti mikropočítača pre zaznamenávanie príkazov alebo údajov programu, aby sa tieto adresy potom dali špecifikovať alebo určiť v programe; zapamätať si skutočné strojové inštrukcie reprezentované v binárnom alebo hexadecimálnom kóde a súvisiace metódy mikroadresovania


procesor; všetky údaje v programe musia byť prevedené do binárneho kódu, aby mohli byť zahrnuté do programu strojového jazyka. Je zrejmé, že v dôsledku takejto práce je možné urobiť veľa chýb.

Assembler je spôsob symbolického písania programov v strojovom jazyku. Napríklad kód strojovej inštrukcie ZS02 (hexadecimálny) možno zapísať v symbolickej forme v jazyku symbolických inštrukcií ako CMP AL,02 (táto inštrukcia porovnáva obsah registra AL s hexadecimálnym číslom 02). Tak sú možné rutinné konverzie strojových kódov a programových údajov uvedených vyššie. preniesť čo najviac do programu assembler. Preto je hlavným účelom assembleru preložiť programy napísané v jazyku symbolických inštancií do strojového jazyka (strojové kódy).

Assembler sleduje používané miesta v pamäti, takže inštrukcie v programe odkazujú na tieto adresy symbolicky pomocou názvov a označení, ktoré nahrádzajú skutočné hodnoty. Napríklad strojový kód v hexadecimálnom zápise C606001201 možno zapísať v jazyku symbolických inštrukcií ako MOV BYTE-COUNT,01, kde BYTE-COUNT je symbolický názov adresy pamäte 1200H.

Assembler umožňuje symbolickú reprezentáciu konštánt a programových dát a vykoná ich všetky potrebné prevody do zodpovedajúcich binárnych kódov, vypočíta správny počet bajtov alebo slov, ktoré je potrebné uložiť, a zostaví tabuľku názvov alebo označení a ich zodpovedajúcich adries.

V assembleri môže programátor napísať procedúru (podprogram) ako nezávislý a úplne samostatný modul. Assembler generuje informácie potrebné na to, aby po načítaní modulu procedurálneho objektu do pamäte mikroprocesora mohol byť kombinovaný s inými modulmi obsiahnutými v samostatných programových knižniciach.

Zmena programov napísaných v assembleri je oveľa jednoduchšia ako zmena programov napísaných priamo v strojovom jazyku. Napríklad sa môže zmeniť vkladanie príkazov




umiestnenie adries operandov alebo dát programu do pamäte za bod vloženia. Ak je teda program napísaný v strojovom kóde, programátor musí zmeniť adresy všetkých operandov a programových údajov umiestnených za zadaným príkazom. Ide o veľmi zdĺhavý a časovo náročný postup, nehovoriac o tom, že je náchylný na chyby. Ak sa vkladanie vykonáva v programe napísanom v jazyku symbolických inštancií, potom sa prečíslovanie všetkých adries operandov v pamäti vykoná automaticky v súlade s novou štruktúrou a umiestnením údajov v upravenom programe.

Assembler môže vytvoriť zoznam zdrojového programu (text), ktorý obsahuje pôvodné inštrukcie v jazyku assembleru, pridružený strojový jazyk a dátové kódy, diagnostické výsledky a/alebo chybové hlásenia, ktoré sa generujú počas procesu prekladu. Mnoho softvérových chýb je preto možné odhaliť vopred vo fáze prekladu. Výpis programu obsahuje symboly, názvy alebo štítky, ktoré sú symbolickými reprezentáciami konštánt alebo údajov programu. Samotný výpis je pohodlný nástroj na analýzu a opravu chýb, ktoré sa môžu objaviť počas ladenia programu.

Formát programu

Každý jednotlivý takzvaný príkaz v jazyku symbolických adries je zvyčajne preložený do jednej strojovej inštrukcie. Vo väčšine assemblerov má každý príkaz štyri jedinečne definované polia, ktoré popisujú rôzne atribúty prekladanej inštrukcie. Týmito poliami sú pole označenia, pole operácie, pole operandov a pole komentára. Každé pole môže mať premenlivú dĺžku a musí byť oddelené od svojich susedov jednou alebo viacerými medzerami.

Prvé pole sa používa na zadanie názvu alebo symbolu pamäťového miesta obsahujúceho príkaz, konštantu alebo údaje. Adresa tejto bunky je obsiahnutá v

Zabudovaný assembler (ďalej len assembler) umožňuje programovať na úrovni jednotlivých strojových inštrukcií. Toto je hlavný rozdiel medzi assemblerom a Pascalom a všetky jeho výhody a nevýhody sú sústredené v tomto rozdiele. Výhodou je, že pri programovaní v jazyku symbolických inštrukcií programátor zvyčajne volí postupnosť strojových inštrukcií tak, aby požadované výpočty realizoval maximálnou rýchlosťou s minimálnou spotrebou pamäte, pričom aj taký veľmi pokročilý kompilátor, akým je kompilátor Turbo Pascal, nevyhnutne zavádza tzv. kód má určitú redundanciu, čo znižuje rýchlosť výpočtu a zvyšuje náklady na pamäť. Na druhej strane programovanie na úrovni strojových inštrukcií je mimoriadne problematická úloha a nedá sa v rýchlosti vývoja programu porovnávať s programovaním v Pascale – to je hlavná nevýhoda assembleru.

Ak chcete používať nástroje assembleru, musíte jasne rozumieť detailom architektúry mikroprocesora Intel 80x86. Táto rodina zahŕňa mikroprocesory:

8086 - 16-bitový mikroprocesor používaný v IBM PC/XT;

8088 je analógom 8086, líši sa od neho iba interakciou s pamäťou: 8086 si môže vymieňať bajty aj 16-bitové slová s pamäťou, zatiaľ čo 8088 si môže vymieňať iba bajty;

80286 - vylepšená verzia 8086 používaná v IBM AT PC; môže pracovať v dvoch režimoch: v reálnom režime, ktorý úplne emuluje činnosť MP 8086, av chránenom režime, v ktorom je schopný adresovať pamäť až do 16 MB (v reálnom režime - až 1 MB);

80386 - 32-bitový variant 80286; schopný adresovať až 4 GB;

80486 - kombinácia 80386/80387, t.j. má vnútorný podsystém na vykonávanie operácií s pohyblivou rádovou čiarkou;

80586 (Pentium) - má množstvo vylepšení, ktoré mu poskytujú 2...3-násobný nárast výkonu v porovnaní s 80486, vrátane schopnosti spracovávať 64-bitové čísla.

Mikroprocesory tejto rodiny zvyšujú svoje schopnosti v uvedenom poradí, ale sú prísne kompatibilné od mladších modelov po staršie: všetko, čo dokáže 8086/8088, je implementované Pentiom, ale nie naopak. Architektúra (vnútorná štruktúra, spôsoby adresovania a príkazový systém) MP 8086/8088 je popísaná nižšie.



12.1.1. Registre

MP 8086/8088 má 14 registrov. Funkčne sú rozdelené do skupín:

· všeobecné registre (AX, BX, CX, DX); sú určené na ukladanie operandov a vykonávanie základných inštrukcií; ktorýkoľvek z nich je možné použiť ako sadu dvoch nezávislých 8-bitových registrov: horný bajt registra (AN, VN, CH, DH) a nízky bajt (AL, BL, CL, DL); napríklad AX pozostáva z AN a AL;

· segmentové registre (CS, DS, SS, ES); používa sa na označenie segmentu pri adresovaní pamäte;

· registre ukazovateľov (SP, BP, IP); používa sa na označenie posunu pri adresovaní pamäte;

· indexové registre (SI, DI); používa sa na indexové adresovanie;

· register vlajok; slúži na ukladanie údajov o stave procesora.

V rámci tej istej funkčnej skupiny sa registre používajú rôznymi spôsobmi. Špecifiká používania registrov sú popísané nižšie.

Zaregistrujte AX. Je to hlavná sčítačka. Používa sa vo všetkých aritmetických operáciách (sčítanie, násobenie atď.). Len s pomocou AX a jeho polovičných registrov AHIAL je možná výmena dát s I/O portami.

VX register. Používa sa ako sčítačka v aritmetických operáciách a tiež ako základný register pre indexové adresovanie.

Zaregistrujte sa CX. Používa sa hlavne ako počítadlo pri vykonávaní operácií opakovania a posunu. Dokáže sa zúčastniť aj aritmetických operácií.

DX register. Používa sa ako dátový register pri I/O operáciách a tiež ako sčítačka pri spracovaní dlhých celých čísel (32-bit).

registra CS. Obsahuje číslo pamäťového segmentu (kódového segmentu), v ktorom sa nachádza aktuálna strojová inštrukcia. Na získanie úplnej adresy nasledujúceho príkazu sa jeho obsah posunie doľava o 4 bity a pridá sa do registra ukazovateľa IP. Obsah CS sa automaticky mení v príkazoch skoku na veľkú vzdialenosť (medzisegmentu) a volania procedúr.

IP register. Určuje posun vzhľadom na začiatok segmentu kódu CS nasledujúcej spustiteľnej strojovej inštrukcie. Obsah IP adresy sa automaticky upraví počas vykonávania inštrukcie, aby sa zabezpečilo, že inštrukcie budú načítané z pamäte v správnom poradí.

registra DS. Obsahuje číslo pamäťového segmentu (údajového segmentu), v ktorom sa údaje (konštanty a premenné) nachádzajú. Všetky globálne premenné a typové konštanty programu Turbo Pascal sú vždy umiestnené v jednom segmente adresovanom týmto registrom.

register SS. Obsahuje číslo segmentu zásobníka. Zásobník je časť automaticky adresovateľnej pamäte navrhnutá na dočasné ukladanie operandov. TurboPascal pomocou zásobníka organizuje výmenu dát medzi programom a procedúrami, navyše doň umiestňuje všetky lokálne premenné (teda premenné deklarované vo vnútri procedúry). Pamäť zásobníka sa používa podľa pravidla posledný dovnútra, prvý von: posledný vložený operand v zásobníku bude prvý, ktorý sa z neho vyberie.

registra SP. Ukazuje na vrch zásobníka, t.j. spolu s registrom 55 adresuje pamäťovú bunku, kde bude operand umiestnený alebo odkiaľ bude získaný. Obsah tohto registra sa automaticky zníži po vložení ďalšieho operandu do zásobníka a zvýši sa po vybratí operandu zo zásobníka.

VR register. Takzvaný základný ukazovateľ. Uľahčuje vytváranie a používanie lokálneho zásobníka (t. j. zásobníka na použitie v rámci procedúry).

ES register. Voliteľný segmentový register ES sa používa na výmenu údajov medzi segmentmi a niektoré operácie s reťazcami.

SI register. Určuje adresu zdroja informácií pri indexovaní adresovania údajov (napríklad pri spracovaní polí). Zvyčajne sa používa v spojení s registrom DS.

DI register. Spárovaný s registrom 5 £ určuje prijímač informácií pre medzisegmentovú výmenu dát.

Register vlajok. Jednotlivé číslice (bity) tohto registra majú nasledujúci účel.

Noste vlajku CF. Obsahuje 1, ak bola jednotka prenášaná počas sčítania alebo bola jednotka požičaná počas odčítania. Používa sa aj v cyklických a porovnávacích operáciách.

príznak parity PF. Obsahuje 1, ak výsledkom operácie je číslo s párnym počtom platných číslic, t.j. doplní výsledok o nepárne číslo – používa sa pri výmenných operáciách na kontrolu dát.

Externá nosná vlajka AF. Riadi prenos z 3. dátového bitu. Užitočné pre operácie so zbalenými desatinnými číslami.

ZF nulová vlajka. Rovná sa 1, ak je výsledok operácie nula, a rovná sa 0 v opačnom prípade.

Vlajka znaku SF. Rovná sa 1, ak je výsledkom operácie záporné číslo (s jednotkou najvýznamnejšou číslicou).

Príznak sledovania TF. Rovná sa 1, ak sa program vykonáva v krokoch, pričom riadenie sa prenáša po každom vykonanom príkaze cez prerušenie s vektorom 1.

príznak prerušenia IF. Obsahuje 1, ak má mikroprocesor povolené spracovávať prerušenia.

Smerová vlajka DF. Riadi smer prenosu údajov: ak obsahuje 0, potom po každej operácii indexu sa obsah registrov indexov zvýši o 1, inak sa zníži o 1.

Príznak pretečenia OF. Nastavte na jeden, ak výsledkom operácie je číslo, ktoré je mimo bitovej mriežky mikroprocesora.

12.1.2. Adresovanie

V architektúre MP 8086/8088 je adresa ľubovoľného bajtu špecifikovaná dvoma 16-bitovými slovami - segmentom a ofsetom. Pri vytváraní 20-bitovej plnej adresy potrebnej na adresovanie v rámci 1 MB sa segment posunie doľava o 4 bity (vynásobené 16) a pridá sa s posunom. Keďže 16-bitová offsetová kapacita je 65536 hodnôt, v rámci jedného segmentu je možné adresovať až 64 KB.

Architektúra MP umožňuje použitie siedmich rôznych spôsobov adresovania.

Registrovať

Načíta operand z registra alebo ho umiestni do registra. Príklady:

mov akh, bх (Odstránené z BX a umiestnené do AX)

pridať cx,ax (Obsah AX sa pridá do CX)

tlačiť ex (Vytlačte obsah CX na stoh)

Priamy

Operand (8- alebo 16-bitová konštanta) je obsiahnutý priamo v tele inštrukcie. Príklady:

mov sekera, 100 (Načítať hodnotu 100 do AX)

pridať sekeru,5 (Pridajte 5 k obsahu AX)

mov cx,$FFFF (Umiestnite hodnotu 65535 do CX)

Rovno

Offset operandu je špecifikovaný v tele programu a pridaný do registra DS; Napríklad:

X:Word; In: Byte;

mov ah, X (Pošleme hodnotu premennej X registra AX)

pridajte ah, B (K obsahu registra AN pridáme hodnotu premennej B)

mov X,ax (Obsah registra AX prenesieme do pamäťovej oblasti premennej X)

Nepriamy register

Výkonná adresa operandu (presnejšie jeho offset) je obsiahnutá v jednom z registrov ВХ, BP, SI alebo DI. Na označenie nepriameho adresovania musí byť tento register uvedený v hranatých zátvorkách, napríklad:

mov ax, (Obsah 16-bitového slova uloženého v pamäti na adrese DS:BX sa odošle do registra AX);

Každý z registrov BX...DI štandardne pracuje s vlastným segmentovým registrom:

DS:BX, SS:BP, DS:SI, ES:DI

Explicitná indikácia segmentového registra je povolená, ak sa líši od predvoleného, ​​napríklad:

Adresovanie podľa databázy

Základný register BX (alebo BP) obsahuje bázu (adresu začiatku nejakého pamäťového fragmentu), vzhľadom na ktorú assembler vypočíta offset, napríklad:

mov ax,[bx]+10 (Načítať do AX 10. bajt od začiatku pamäte na adrese DS-.BX);

Indexové adresovanie

Jeden z indexových registrov SI alebo DI udáva polohu prvku vzhľadom na začiatok nejakej pamäťovej oblasti. Nech je napríklad AOB názov poľa hodnôt typu Byte. Potom môžete použiť nasledujúce fragmenty:

mov si,15 (Umiestnite konštantu 15 v SI)

mov ah, AOB (Pošleme 16. bajt od začiatku poľa do AN)

mov AOB,ah (Pošleme to, čo sme dostali, úplne prvému prvku poľa)

Adresovanie podľa databázy s indexovaním

Variant indexového adresovania pre prípad, keď je oblasť indexovanej pamäte špecifikovaná jej základňou. Napríklad:

Tento typ adresovania je užitočný pri spracovaní dvojrozmerných polí. Ak je napríklad AOB pole 10x10 bajtov formulára

AOB: pole Byte;

potom na prístup k prvku AOB môžete použiť nasledujúci fragment

mov bx,20 (Základ riadka 2)

movsi,2 (číslo tretieho prvku)

mov sekera, AOB (Prístup k prvku)

12.1.3. Príkazový systém

Nižšie uvedené tabuľky poskytujú mnemotechnickú pomôcku pre všetky platné pokyny pre 8086/8088 MP. Pre jednoduchosť používania sú všetky príkazy rozdelené do 6 funkčných skupín - dátové prenosy, aritmetické, bitové, reťazcové, riadiace prenosy, prerušenia. V rámci každej skupiny sú tímy spojené do podskupín na základe spoločných doplnkových charakteristík.

Podrobná analýza všetkých príkazov MP 8086/8088 by zabrala príliš veľa miesta, takže vo vysvetleniach nasledujúcich za tabuľkami sa berú do úvahy iba najpopulárnejšie príkazy. Komplexný popis všetkých príkazov nájdete v,.

Príkazy na prenos údajov

Mnemotechnické pomôcky Formátovať Vysvetlenie
Príkazy na všeobecné použitie
MOV MOV umývadlo, zdroj Forwardová hodnota
TAM PUSH zdroj Umiestnite na stoh
POP POP prijímač Vyskočiť zo zásobníka
XCHG XCHG drez, zdroj Výmena hodnôt
XLAT XLAT stôl Načítajte bajt z tabuľky do AL
I/O príkazy
IN IN batéria, port Čítať z portu
VON OUT port, batéria Napíšte do portu
Príkazy na presmerovanie adresy
LEA Register LEA 16, pamäť 16 Načítať výkonnú adresu
LDS Register LDS 16, pamäť 32 Nahrajte celú adresu do DS:register16
LES Register LES 16, pamäť 32 Nahrajte celú adresu do ES:register16
Príkazy na preposielanie
LAHF LAHF Nahrajte vlajky do NA
SAHF SAHF Nastaviť vlajky z NA
PUSHF PUSHF Umiestnite vlajky na stoh
POPF POPF Pop vlajky zo zásobníka

Jeden z najčastejšie používaných príkazov, MOV, vám umožňuje bezpečne preniesť bajt alebo slovo z registra do registra, z pamäte do registra alebo z registra do pamäte. Typ prenášaných dát (bajt alebo slovo) je určený registrom zapojeným do prenosu. Nasledujú príklady použitia príkazu:

mov ah, Stôl (Preposlanie slova z pamäte do AX)

mov Table, ach (Poslanie bajtu z AN do pamäte)

mov ds,ax (Preposlať do segmentu údajov)

mov es:,ax (Poslanie slova do pamäte: Základné adresovanie s nahradením segmentu)

mov ch,-17 (Konštanta dopredu na registráciu)

mov Table, $FF (Odoslať konštantu do pamäte)

MOV nemožno použiť na odoslanie:

z pamäte do pamäte, napríklad namiesto

by sa malo použiť

· konštanta alebo premenná v DS napríklad nemôže byť

· jeden segmentový register k druhému, napríklad, je to nemožné

· do registra CS; hodnota tohto registra (kódového segmentu) sa automaticky zmení pri vykonávaní príkazov CALL a JMP na veľké vzdialenosti; okrem toho sa načíta zo zásobníka pri vykonaní inštrukcie RETF (exit far procedure).

Inštrukcie zásobníka PUSH a POP sa široko používajú na dočasné ukladanie registrov a údajov, ako aj na výmenu hodnôt medzi registrami. Každý z nich pracuje so slovom, t.j. Do zásobníka nemôžete vložiť ani vložiť jeden bajt. Keď sa vykoná PUSH, obsah ukazovateľa SP sa najprv zníži o 2 a potom sa operand umiestni na adresu SS: SP. Pri vyskakovaní zo zásobníka sa najprv načíta pamäť na adrese SS:SP a potom sa SP zvýši o 2. Takže keď je plný, horná časť ukazovateľa zásobníka SP sa posunie na nízke adresy a keď sa uvoľní, na vysoké adresy . Pri práci so zásobníkom by ste si mali pamätať na špecifiká používania zásobníkovej pamäte („last in, first out“), ako aj na to, že táto pamäť je intenzívne využívaná pri volaní procedúr, t.j. stav zásobníka v čase ukončenia procedúry musí byť striktne konzistentný s ďalšou činnosťou programu. Prvá podmienka určuje poradie, v ktorom sú dáta zo zásobníka vyberané – musí to byť opačné poradie, v akom boli dáta vložené do zásobníka. Druhá podmienka vlastne znamená, že po výstupe z procedúry musí ukazovateľ SP obsahovať rovnaký posun ako pri vstupe. Inými slovami, postup by nemal „zabudnúť“ ani slovo navyše v zásobníku alebo vziať z neho viac, ako je potrebné.

Inštrukcia LEA load address načíta adresu (offset) požadovaného pamäťového miesta do registra. Dá sa to dosiahnuť aj použitím rezervovaného slova OFFSET pred názvom premennej. Napríklad:

hybná sekera, OFFSET X (Načítať posun X do AX)

lea sekera, X (rovnaká akcia)

Rozdiel je v tom, že príkaz LEA umožňuje použitie indexového adresovania, čo je výhodné najmä pri hromadnom odosielaní dát.

Ďalšie dve inštrukcie načítania adresy, LDS a LES, načítajú prvé 16-bitové slovo zo zdroja do cieľového registra a potom ďalšie slovo do registra DS alebo ES, t.j. sú navrhnuté tak, aby načítali celú adresu operandu (segment a offset).

Aritmetické príkazy

Mnemotechnické pomôcky Formátovať Komentár
Príkazy na sčítanie
PRIDAŤ PRIDAŤ prijímač, zdroj Zložiť
ADC ADC prijímač, zdroj Zložiť, pridať prenášanie
AAA AAA Upravte pridanie pre tabuľku ASCII
DAA DAA Správne sčítanie čísel BCD
INC Prijímač INC Zvýšte o jednu
Príkazy na odčítanie
SUB SUB prijímač, zdroj Odčítať
SBB SBB prijímač, zdroj Odpočítať s pôžičkou
A.A.S. A.A.S. Upravte odčítanie pre tabuľku ASCII
DAS DAS Upravte odčítanie pre čísla BCD
DEC DEC prijímač Znížiť o jednu
N.E.G. NEG prijímač Obrátené znamenie
stavebné a inštalačné práce SMR prijímač, zdroj Porovnaj
Návod na násobenie
MUL zdroj MUL Násobte bez znamienka
IMUL Zdroj IMUL Vynásobte znamienkom
AAM AAM Upravte násobenie pre tabuľku ASCII
Divízne príkazy
DIV Zdroj DIV Deliť bez znamienka
IDIV Zdroj IDIV Rozdeľte znakom
AAD AAD Upravte rozdelenie pre tabuľku ASCII
Podpíšte príkazy rozšírenia
CBW CBW Previesť bajt na slovo
CWD CWD Previesť slovo na dvojité slovo

Pri používaní aritmetických príkazov nezabudnite, že MP dokáže spracovať čísla so znamienkom, čísla bez znamienka a čísla BCD. Čísla bez znamienka používajú na vyjadrenie hodnoty všetky bity. tie. sú ekvivalentné typom Byte a Word, zatiaľ čo čísla so znamienkom na najvýznamnejšej pozícii uchovávajú znamienko čísla a sú ekvivalentné typom ShortInt a Integer. Čísla BCD používajú 4 bity na každé desatinné miesto a môžu byť zabalené alebo rozbalené. V prvom prípade jeden bajt ukladá 2 desatinné číslice (najvýznamnejší je v najvýznamnejšom nibble), v druhom - iba jeden (najvýznamnejší nibble sa nepoužíva). Základné aritmetické príkazy MP (ADD, SUB, MUL, DIV) nezohľadňujú binárno-desiatkový tvar čísel, preto sú príkazy na opravu výsledkov zahrnuté v architektúre MP.

Bitové inštrukcie

Mnemotechnické pomôcky Formátovať Komentár
Logické príkazy
A A umývadlo, zdroj Vykonať AND
ALEBO ALEBO umývadlo, zdroj Vykonať OR
XOR XOR prijímač, zdroj Vykonajte XOR
NIE NIE prijímač Vykonať NIE
TEST TEST prijímač, zdroj Skontrolujte
Príkazy Shift
SAL/SHL SAL prijímač, počítadlo Presuňte sa doľava
SAR/SHR SAR prijímač, počítadlo Pohnúť sa vpravo
ROL ROL prijímač, počítadlo Pohybujte sa cyklicky doľava.
ROR ROR prijímač, počítadlo Pohybujte sa cyklicky doprava
RCL RCL prijímač, počítadlo Presuňte sa doľava s prenášaním
RCR RCR prijímač, počítadlo Presuňte sa doprava s obalom

Bitové inštrukcie sa používajú pri výpočte logických výrazov, ako aj v prípadoch, keď je potrebné meniť jednotlivé bity operandu. Logické inštrukcie AND, OR, XOR a NOT sú ekvivalentné zodpovedajúcim operáciám Turbo Pascalu, keď operandy sú celočíselné výrazy. Príkaz TEST vykoná celočíselnú operáciu bitového súčtu AND, ale nemení hodnoty operandov, ale iba nastavuje príznaky v súlade s hodnotou výsledku porovnania: resetuje CF a OF, zmení PF, ZF, SF a nezmení AF (príznak ZF bude nastavený na 1 v prípade, že oba operandy obsahujú jeden v aspoň jednom zodpovedajúcom bite). Príkazy posunu SHL/SHR sú ekvivalentné operáciám Turbo Pascal s rovnakým názvom a líšia sa od príkazov cyklického posunu ROLIROR tým, že významné bity posunuté počas ich vykonávania sa stratia, zatiaľ čo počas cyklického posunu sa tieto bity objavia „na druhej strane“. “. Napríklad, ak spustíte fragment

mov al,1 (Nahrajte jednotku do AL)

shr al,1 (posun doprava, o 1 číslicu)

register AL bude obsahovať 0 (pravý posunutý bude umiestnený v CF), pričom po nahradení inštrukcie SHR príkazom ROR bude obsahovať hodnotu $80=128 (posunutý bude umiestnený do najvýznamnejšieho bitu registra ).

Všimnite si, že počítadlo v pokynoch na posun môže byť 1 alebo počet posunov špecifikovaný v registri CL.

Ovládanie príkazov prenosu

Mnemotechnické pomôcky Formátovať Komentár
Bezpodmienečné skoky
ZAVOLAJTE CALL meno Zadajte postup
RET RET [počet parametrov] Návrat z procedúry
SKOČIŤ Názov JUMP Choď
Podmienené skoky
JA/JNBE JA close_mark Prejsť, ak je vyššie (po porovnaní operandov bez znamienka)
JAE/JNB JAE close_mark Skok, ak je väčší alebo rovný
JB/JBAE/JC JB close_mark Preskočte, ak je uvedené nižšie
JBE/JNA JBE close_label Skočte, ak je nižšie alebo rovnaké
JCXZ JCXZ close_mark Choďte, ak CX=0
JE/JZ JE close_mark Choďte, ak ste rovní
JG/JNLE JG close_mark Skok, ak je väčší (po porovnaní operandov so znamienkom)
JGE/JNL LGE close_label Skok, ak je väčší alebo rovný
JL/JNGE JL close_mark Ak je menej, preskočte
JLE/JNG JLE close_label Skok, ak je menší alebo rovný
J.N.C. JNC close_label Choďte, ak nie je prevod
JNE/JNZ JNE close_label Choďte, ak nie ste rovní
JNO JNO close_label Ak nedochádza k pretečeniu, skočte
JNP/JPO JNP close_label Skok, ak je nepárny
JO JO close_mark Choď, ak prestúpiš
JP/JPE JP close_mark Choďte, ak dokonca
JS JS close_label Choďte, ak je negatívny
Cyklické ovládacie príkazy
LOOP LOOP close_label Opakujte cyklus
LOOPE/LOOPZ LOOPE close_label Opakujte, kým sa nezrovná
LOOPNE/LOOPNZ LOOPNE close_label Opakujte, kým sa nezrovná

Príkazy nepodmieneného skoku CALL, RET, JMP môžu používať vzdialený alebo blízky pamäťový model, zatiaľ čo príkazy podmieneného skoku môžu používať iba malý (v rozsahu -128...+127 bajtov). S modelom vzdialenej pamäte (nastaveným voľbou Options/Compiler/Force far calls v prostredí Turbo Pascal alebo direktívou kompilátora (F+)) sa vykonáva vnútrosegmentový aj medzisegmentový riadiaci prenos, pričom blízky - iba intrasegmentový.

Inštrukcia CALL funguje nasledovne. Najprv sa na zásobník umiestni adresa inštrukcie nasledujúcej po CALL (spätná adresa), potom sa adresa vstupného bodu procedúry umiestni do registra IP (alebo do dvojice CS:IP), takže ihneď po inštrukcii CALL vykoná sa prvý príkaz procedúry. Obidve adresy (vstupné a návratové body) budú 16-bitové offsety pre vnútrosegmentový hovor alebo 32-bitové úplné adresy pre medzisegmentový hovor. Všetky procedúry (funkcie) Pascalu preložené v režime (F+) alebo obsahujúce rezervované slovo FAR v hlavičke musia byť volané ako vzdialené. Aby ste to dosiahli, po inštrukcii CALL musí nasledovať model pamäte:

Postup MyProc; Ďaleko;

zavolajte FAR MyProc (Volám vzdialenú procedúru)

Všetky rutiny knižnice (to znamená tie, ktoré sú deklarované v častiach rozhrania modulov) sa musia volať rovnakým spôsobom. Pri vzdialenom volaní sa obsah segmentu CS kódu vloží do zásobníka ako prvý, potom nasleduje spätný posun.

Pri opúšťaní vzdialenej procedúry inštrukcia RET vytiahne obe 16-bitové slová zo zásobníka a umiestni prvé do IP a druhé do CS a pri opustení blízkej vytiahne iba offset zo zásobníka a umiestni ho do IP. .

Inštrukcie podmieneného vetvenia sú schopné preniesť riadenie na štítok umiestnený v rámci najbližších plus alebo mínus 128 bajtov od samotnej inštrukcie. Ak potrebujete preniesť riadenie na štítok umiestnený ďalej v rovnakom segmente alebo na štítok v inom segmente, bezpodmienečná inštrukcia JMP alebo CAL sa umiestni bezprostredne po príkaze podmieneného prenosu, napríklad:

strach, 0 (Kontrola AH)

jne@NotZero (AX=0?)

jmp je nula (Áno - prejdite na vzdialenú značku)

....... (Nie - pokračujeme v práci)

V tabuľke sa výraz „nad/dole“ používa vo vzťahu k porovnávaniu operandov bez znamienka a výraz „viac ako/menej“ sa používa na porovnávanie operandov so znamienkom.

Keďže podmienené skoky implementujú vetvenie programu na základe kontroly príznakov, zvyčajne im bezprostredne predchádzajú príkazy, ktoré tieto príznaky menia, najčastejšie porovnávací príkaz CMP. Nižšie sú uvedené kombinácie CMP - conditional_jump pre rôzne vzťahy medzi destináciou a zdrojom (prvý a druhý operand) inštrukcie CMP:

Napríklad:

pp ah, 5 (AX>5?)

ja @AboveS (Áno, viac - poďme ďalej)

strana bx, - 3 (VH<=-3 ?}

jle @LessM3 (Áno, menšie alebo rovné)

Príkazy LOOP/LOOPE/LOOPNE sa používajú na organizáciu slučiek. Všetky používajú obsah registra CX ako počítadlo opakovaní. Inštrukcia LOOP zníži CX o jednu a prenesie riadenie na značku začiatku slučky, ak je obsah tohto registra nenulový. Inštrukcie LOOPE/LOOPNE tiež znižujú počítadlo CX, ale prenášajú riadenie na začiatok slučky za kombinovanej podmienky, že príznak ZF je nastavený (alebo resetovaný) a počítadlo CX sa nerovná nule.

Tu je návod, ako napríklad nájdete nulový bajt v poli AOB:

AOB: pole Byte;

mov ex,It)00 (Iniciujeme počítadlo CX)

lea bx, AOB (Umiestnite adresu AOB do BX)

dec bx (Príprava cyklu)

(Tu je začiatok recenzného cyklu)

@@Test: inc bx (Adresa ďalšieho bajtu)

cmp BYTE PTR ,0 (Kontrola bajtu)

loopne ©Test (Zatvorte slučku)

jnz ©NotZero (Ak sa nenájde nulový bajt)

....... (Našiel sa nulový bajt)

Reťazcové príkazy

Mnemotechnické pomôcky Formátovať
Páčil sa vám článok? Zdielať s priateľmi: