+---------------------------+
|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ň