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ť |