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