Obsah    Kapitoly: 12345678,  |  X.1X.2X.3X.4,  |  Y1 Y2 

5) Vzhůru k dalšímu programu

To jednodušší máme za sebou a můžeme se pokusit napsat nějaký další program. Bohužel prozatím nevíte ani zdaleka vše, co byste měli takže jdeme na to:


  • Nepodmíněné skoky - Instrukce JMP (Jump)

    Tato instrukce provede skok na návěští, které je za ní uvedeno. Že jsem ještě nenapsal, co je to návěští? Tak se podívejte na vám již dobře známý kód. Jsou v něm uvedeny dvě návěští.

    A SEGMENT ; Název segmentu ASSUME CS:A,DS:A ; Nastavení registrů na začátek onoho segmentu ORG 100H ; A nakonec, kde budeme začínat .386 ;============================================== Start: Mov Dx, Offset Text Mov Ah,09H ; Číslo fce DOSu pro výpis na obrazovku Int 21H Int 20H ; Konec programu ;============================================== Text DB '!!Hello World!!$' ; Definice proměnných ;============================================== A ENDS ; Konec segmentu END START ; Konec programu

    Jsou to "Start:: a "Konec:". Návěští je něco jako "ukazovátko" na místo v programu. Může být uvedeno i se znakem "@" před svým názvem. Každé návěští musí být ukončeno dvojtečkou a může po něm následovat instrukce. Například takto:

    @Cyklus: Mov AX,1234H

    Instrukce JMP provede skok právě na toto návěští. Jakýkoli kód mezi instrukcí a návěštím se samozřejmě nebere v úvahu.
    Syntaxe:
    JMP < návěští >
    Příklady:
    JMP Cyklus -> Skočí na místo s návěštím Cyklus
      JMP @Cyklus -> Skočí na místo s návěštím Cyklus 

    Například, kdybych napsal na úplný začátek předešlého kódu hned za návěští "Start:" příkaz

    JMP Konec

    tak by program neprovedl vůbec nic, protože by ihned skončil na instrukci, která jej ukončí (Int 20H)

  • Podmíněné skoky - Instrukce Jxx (Jump if xx)

    Jedná se o několik instrukcí, které provedou skok na dané návěští, pokud je splněna nějaká podmínka. Všeobecně se dá tato instrukce přeložit Jump jestli něco. (To něco je tak trochu zakódované v zbylých písmenech - bohužel anglicky) Podmínka je určena nastavením příznaků. Všehovšudy máme tyto instrukce:
    Instrukce
    Podmínka
    Význam
    Ja / Jnbe
     Jae / Jnb / Jnc 
    Jb / Jc / Jnae
    Jbe / Jna
    Je / Jz
    Jg / Jnle
    Jge / Jnl
    Jl / Jnge
    Jle / Jng
    Jne / Jnz
    Jno
    Jnp / Jpo
    Jns
    Jo
    Jp / Jpe
    Js
    Jcxz
    CF=0 a ZF=0
    CF=0
    CF=1
    CF=1 a ZF=1
    ZF=1
     (SF<>OF)+ZF = 0 
    SF=OF
    SF<>OF
     (SF<>OF)+ZF > 0 
    ZF=0
    OF=0
    PF=0
    SF=0
    OF=1
    PF=1
    SF=1
    CX=0
    Je-li první číslo větší (above) než druhé - po bezznaménkové aritmetice
     Je-li první číslo větší (above) nebo rovno (equal) druhému - po bezznaménkové aritmetice 
    Je-li první číslo menší (bellow) než druhé - po bezznaménkové aritmetice
     Je-li první číslo pod (bellow) nebo rovno (equal) druhému - po bezznaménkové aritmetice 
    Je rovno (equal)
    Je větší (greater)- bere se v úvahu znaménko
    Je větší (greater) nebo rovno (equal) - bere se v úvahu znaménko
    Je menší (lower) - bere se v úvahu znaménko
    Je menší (lower) nebo rovno (equal) bere se v úvahu znaménko
    Není rovno (not equal)
    Není přetečení (not overflow)
    Není parita (not parity) - lichá parita
    Není záporné (not sign flag) - 0 a víc
    Je přetečení (overflow)
    Je parita (parity)
    Je záporné (sign flag)
    CX je 0 (CX = zero)
    Tak to by snad stačilo. Nesnáším tabulky a slovo "equal". Nevím proč se s tím takto vypisuji. Stejně budete používat jen pár z těchto instrukcí.

  • Instrukce CMP (Compare)

    Pouhopouhé porovnání obou argumentů instrukce.
    Syntaxe:
    CMP < argument 1 >, < argument 2 >
    Příklady:
    CMP AX, BX


    Porovnání se provede tak, že se od argumentu 1 odečte argument 2. Výsledek se nikam neuloží, pouze se podle výsledku nastaví příznaky. Obvykle se hned po tomto příznaku používají podmíněné skoky, abychom mohli dál větvit program. Je to takový předchůdce IF, THEN a ELSE.
    Příklad:

    Cmp Ax, Bx Jg Vice ; Něco ve stylu If Ax>Bx Then sk0oč na Vice; Je Rovno ; If Ax=Bx Then skoč na Rovno;

    Nyní víte zase trochu více. Už jste schopni napsat program, který by zvládl následující: Vyčkat na stisk klávesy 'a', 'b', nebo 'c' a podle ní vypsat hlášku stylu: 'Stisknul jsi za a)', 'Stisknul jsi za b)', … , nebo v případě, že uživatel stisknul nějakou jinou klávesu skočit na začátek programu a znovu jej požádat o stisk.

  • Instrukce Call (Call)

    Tato instrukce si uloží addresu následující instrukce a poté skočí na návěští, které je k ní přiřazeno.
    Syntaxe:
    CALL < návěští >
    Příklady:
    CALL VypisZnak -> skočí na návěští VypisZnak


    Instrukce ve skutečnosti provede následující:

    Push CS Push IP Jmp < návěští >

    pozn.: Insrukce Push je popsána v kapitole
    07 - Práce se zásobníkem.

  • Instrukce Ret (return)

    Tato instrukce vrátí řízení programu na instrukci následující hned za poslední instrukci CALL.
    Syntaxe:
    RET < parametr > -> parametr není povinný
    Příklady:
    RET -> skočí za instrukci CALL


    Instrukce ve skutečnosti provede následující:

    Pop IP Pop CS Add SP, < parametr > ;pokud je ovšem parametr zadán

    pozn.: Insrukce POP je popsána v kapitole
    07 - Práce se zásobníkem.

    Teď, když už jste dokonale seznámeni s tím, co instrukce dělá, možná by nebylo na škodu zjistit, k čemu je vlastně dobrá. Používá se jako jakýsi ekvivalent příkazu Procedure. Pokud například v programu několikrát vypisujete stejný text, můžete si pomoci touto instrukcí tak, že vždy zavoláte jakousi procedurku, která vypíše daný text. Příklad snad promluví za vše:

    ; Demonstrace funkcí CALL a RET ; ============================= A SEGMENT ASSUME CS:A,DS:A ORG 100H .386 ; ============================= Start: Call NapisAhoj Call NapisAhoj Konec: Int 20H ; ============================= NapisAHOJ: Mov Ah,09H Mov Dx,offset AHOJ Int 21H Ret ; ============================= AHOJ DB 10,13, ' AHOJ', 10,13,'$' A ENDS END START

    Zdrojový kód programu je v souboru FceCall.asm.

    Předchozí kapitola Nahoru Následující kapitola