+---------------------------+ |Assembler pro blbé, díl 1.5| +---------------------------+ Tady je vysvětlení programu z minulého dílu: .MODEL SMALL Podle toho, jak velký bude váš program, řekněte kopileru jaký má použít paměťový model. Používáme model SMALL. To znamená, že budu používat po jednom segmentu pro kód a pro data. .CODE Takto je označen začátek CS. DOS při spuštění programu nastaví CS, aby ukazoval zde. .386 Budou se používat instrukce pro procesor 386 a výše. Je to tam kvůli instrukci MOVSD. Tuto instrukci nižší procesory neumí. Pokud nezadáte tuto direktivu, předpokládá kompilátor, že se překládá pro 8086 a na řádku s instrukcí MOVSD oznámí, že procesor, který je nyní zvolen tuto instrukci neumí. Obrazovka dw 0B800h ;adresa bloku v pameti Kusanec dw 1000 ;Kolik 4bajtu budu presouvat Kus2 dw 2000 ;Kolikrat budu sunout Toto je definice paměťových proměnných. Vyrábím tři proměnné. Obrazovka, Kusanec a Kus2. Zároveň jim přiřazuji místo v paměti a počáteční hodnotu. DW znamená Define Word, proměnné je vyhrazen jeden word, tedy dva bajty. Do těchto dvou bajtů se uloží hodnota uvedená za dw. START: Místo odkud ma začít vykonávání programu, se označuje takto. Teď trochu předběhnu. Nejdříve si vysvětleme jak funguje instrukce MOVSD. Tato instrukce přesouvá v paměti jeden Double Word, tedy čtyři bajty. Přesouvá se z adresy určené DS:SI na adresu v ES:DI. Jako pomůcka pro zapamatování je tu SI - Source Index (zdrojový index) a DI - Destination Index (cílový index). Po přesunu tato instrukce posune oba ukazatele dále právě o čtyři bajty. Opakovaním této instrukce můžete tedy přesouvat souvislý úsek paměti. Opakování zajišťuje instrukce REP. Ta provede instrukci uvedenou jako argument, sníží CX o jedničku, je-li CX 0, opakuje celý postup, provede, sníží, atd.. Takže danou instrukci provede tolikrát, kolik je zadáno v registru CX. Kromě MOVSD, existuje i MOVSB - přesouvá jeden bajt, a MOVSW - přesouvá Word, neboli dva bajty. Tyto instrukce posouvají ukazatele o jeden, nebo dva bajty. Zbytek programu slouží pouze pro naplnění registru správnými hodnotami. Program má postupně odrolovat celou textovou obrazovku po jednom znaku. Textová obrazovka obsahuje 80x25 znaků. To je celkem 2000 znaků. Znaky jsou uloženy jako ASCII hodnoty ve videopaměti v segmentu 0B800h. Za ASCII hodnotou každého znaku následuje jeden bajt, který obsahuje informace o barvě daného znaku. Pro každý znak vychází tedy dva bajty. Znaků je 2000. Tedy půjde o 4000 bajtů. Posun musíme provádět o dva bajty. Pokud bychom posouvali o bajt, posunuli bychom ASCII na barvu a barvu na ASCII. mov cx, [cs:Kus2] Jak jsme si řekli MOVSD přesouvá CXkrát, takže do CX si dáme počet znaků na obrazovce, abychom odscrolovali právě všechny znaky. mov ds, [cs:Obrazovka] mov es, [cs:Obrazovka] Přesouváme z 0B800:0002 na 0B800:0000, tyto dvě hodnoty musíme nacpat do ES:DI a DS:SI. Zde plním DS a ES, oba stejně hodnotou 0B800h. Smycka: Takto se označuje návěští, tedy místo, na které se budu v programu odkazovat. Třeba sem budu skákat odjinud. push cx Registr CX uložím do zásobníku, protože budu jeho hodnotu měnit. mov si, 2 ;DS:SI odkud presouvam mov di, 0 ;ES:DI kam presouvam Toto jsou ona dvě posunutí ve zdrojové a cílové adrese. Teď už mám v DS:SI = 0B800:0002 a v ES:DI = 0B800:0000. mov cx, [cs:Kusanec] Uvnitř hlavní smyčky, která zajišťuje, že proběhne 2000krát scroll, je ještě druhá, která zajišťuje, že každý scroll se skládá z 1000 přesunů čtyř bajtů. Teď tedy zahajuji tuto vnitřní smyčku. Proto jsem si před chvílí uložil CX na zásobník abych nepřišel o počítadlo z vnější smyčky. Až skončí vnitřní smyčka, vytáhnu si počítadlo ze zásobníku abych mohl odpočítat vnější smyčku. rep movsd A už to frčí. 1000 přesunů čtyř bajtů paměť-pamět. pop cx Vytahuju počítadlo pro vnější smyčku ze zásobníku. loop Smycka příkaz LOOP funguje podobně jako REP. Sníží CX o jedničku a pokud není CX=0, skočí na zadané navěští. mov ax, 4c00h int 21h Tyto dvě instrukce jsou standardní konec, každého EXE. Budou součástí každého vašeho programu. END START Konec části START. Uffff!!! Pokud se se mnou budete chtít spojit máte dvě možnosti: FIDO a internet. Moje fidonetí adresa je 2:421/59. A internetí je: SysOp@pizi.fido.cz Jó a taky mám vlastní WWW stránku, kde jsou všechny tyhle texty, které píšu i do VÝHNĚ. www.geocities.com\SiliconValley\Park\8209 Čaute příště PIŽI výheň