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

6) Ovládání portů v assembleru

Jednou z věcí, kterou byste mohli hojně využívat při psaní programů v Assembleru bude přímý přístup k portům. Občas psáno I/O portům (Input / Output), neboli vstupně výstupní porty. Co to vlastně je? No, dejme tomu, že někdo stiskne na klávesnici nějaké to tlačítko. Jak se počítač dozví, že bylo stisknuto? Jednoduše, klávesnice zjistí, co kdo stisknul za tlačítko, a poté na příslušný port odešle data. Stejně funguje i myš, nebo jakékoliv jiné zařízení, jež posílá data počítači.

Samozřejmě tento princip funguje i obráceně. Pokud například na sériový port připojíme zařízení a bude mu chtít pomocí softwaru počítače zadávat příkazy, tak na příslušný sériový port vyšleme data, která přístroj zaznamená a zpracuje. Typickým příkladem může být tiskárna.

Takže, jak přijímat, či získávat informace z portů? Na to jsou instrukce IN, a OUT.

  • Instrukce IN (Input Data)

    Tato instrukce přečte hodnotu Byte, Word, nebo DWORD ze zadaného portu. Pokud, je číslo portu z intervalu 0…255, pak jej můžeme zadat, pokud je hodnota vyšší, musíme ji umístit do registru DX.
    Syntaxe:
    IN < kam >, < číslo portu >
    Příklady:
    IN Al, 70H -> do Al Byte z portu 70H
    IN Ax, 70H -> do Al Word z portu 70H
    IN Al, DX -> do Al byte z portu DX

  • Instrukce OUT (Output Data)

    Opak instrukce IN - na zadaný port pošle hodnotu velikosti Byte, Word, DWORD. Opět, pokud je číslo portu mimo interval 0..255, tak je nutné předem uložit hodnotu do registru DX.
    Syntaxe:
    OUT < číslo portu >, < co >
    Příklady:
    OUT 70H, Al -> na port 70H pošli Byte
    OUT 70H, Ax -> na port 70H pošli Word
    OUT DX, Ax -> na port DX pošli Word


    Pokud chcete vědět více o I/O portech, doporučuji se podívat do ATHELPu, nebo SYSMANa, kde je vypsána kompletní sbírka portů.

    Nutno dodat, že přímý přístup k portům funguje jen pod Win9x. NT, XP apod. vám tuto instrukci nedovolí provést.

    Abychom si trochu názorněji ukázaly smysl portů, zkusíme rozblikat světélka na klávesnici. K tomu ale potřebujeme znát pár věcí, jako například, na jaký port máme co poslat.

    Podíváme-li se do ATHELPu, na I/O porty, nalezneme na adresách:

    060H-06FH - AT klávesnice

    Port 60H je určen pro zápis dat v kompatibilním módu se staršími modely. Jestliže vám tedy nebude periferie reagovat na port 64H, zkuste port 60H. ; - Aha, takže port 60H
    Port 64H je určen pro zápis příkazů i dat a pro čtení stavu periferie… ; - nebo 64H
    Nutno říci, že to občas s portem 64H nefunguje, takže doporučuji 60H.

    A dále:

    0EDH Zapnutí LED 'lock key'.
    Vyšli 0EDH a pak datový byte:
    
     7 6 5 4 3 2 1 0 
     0 0 0 0 0 C N S

    Kde:    C: CapsLock (hodnota 1-svítí, 0-zhasne)
            N: NumLock (hodnota 1-svítí, 0-zhasne)
            S: ScrollLock (hodnota 1-svítí, 0-zhasne)
    
    
    To je vše, co potřebujeme vědět. Teď zkuste napsat program, který rozsvítí všechny LED diody na klávesnici. Pokud s tím máte problémy, vzorový příklad je v souboru
    LED.asm.

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