You are on page 1of 10

Počítače a jejich periférie – pc.

3 1

3 Základní prostředky pro strukturování programu


Jak již bylo řečeno, je velmi vhodné rozdělit sled instrukcí na část hlavního programu a
část podprogramů. Část hlavního programu by měla být co nejkratší a měla by pojmout pouze
základní větvení programu a volání podprogramů, čímž se realizuje hlavní strom vývojového
diagramu celého algoritmu. V podprogramech by měly být realizovány obsluhy tohoto
větvení, přičemž je možné, aby podprogram mohl volat další podprogram nebo podprogramy.
Jiné strukturování programu vede k velmi nepřehlednému a nečitelnému zdrojovému kódu, ve
kterém se velmi špatně orientuje. K základním prostředkům strukturování programu patří
podmíněné příkazy, cykly a volání podprogramů.

3.1 Podmíněné příkazy v jazyce symbolických instrukcí

Podmíněné příkazy jsou realizovány pomocí instrukce podmíněného skoku jcc. Zda ke
skoku dojde nebo ne se instrukce jcc rozhodne dle nastavených příznakových bitů. Pro
nastavení příznakových bitů se používají instrukce cmp, test nebo logické funkce. Pomocí
těchto instrukcí se definuje podmínka jako výsledek porovnání dvou operandů.

Podmíněný příkaz s jednou alternativou (if then):

cmp _ op1,op2 ; definice podmínky, srovnání op1 a op2


jcc _ návěští ; skok na návěští, pokud nebyla splněna
podmínka
instrukce _ op3[,op4] ; sled podmíněných instrukcí
instrukce _ op5[,op6]


návěští: _ instrukce _ op7[,op8] ; sled nepodmíněných instrukcí

Podmíněný příkaz se dvěmi alternativami (if then else):

cmp _ op1,op2 ; definice podmínky, srovnání op1 a op2


jcc _ návěští1 ; skok na návěští1, pokud nebyla splněna
podmínka
instrukce _ op3[,op4] ; sled instrukcí pro splněnou podmínku
instrukce _ op5[,op6]


jmp _ návěští2 ; nepodmíněný skok na návěští2
návěští1: _ instrukce _ op7[,op8] ; sled instrukcí pro nesplněnou podmínku
instrukce _ op9[,op10]


návěští2: _ instrukce _ op11[,op12] ; sled nepodmíněných instrukcí

Ing. Miroslav Balík. Ph.D.


2 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

Podmíněný příkaz s více alternativami (if elseif elseif … else):

cmp _ op1,op2 ; definice podmínky1, srovnání op1 a op2


jcc _ návěští1 ; skok na návěští1, pokud nebyla splněna
podmínka1
… ; sled instrukcí pro splněnou podmínku1

jmp _ návěští ; nepodmíněný skok na návěští
návěští1: _ cmp _ op1,op3 ; definice podmínky2, srovnání op1 a op3
jcc _ návěští2 ; skok na návěští2, pokud nebyla splněna
podmínka2
… ; sled instrukcí pro splněnou podmínku2

jmp _ návěští ; nepodmíněný skok na návěští
návěští2: _ cmp _ op1,op4 ; definice podmínky3, srovnání op1 a op4
jcc _ návěští3 ; skok na návěští3, pokud nebyla splněna
podmínka3
… ; sled instrukcí pro splněnou podmínku3

jmp _ návěští ; nepodmíněný skok na návěští
návěští3: _ … ; sled instrukcí pro nesplněnou žádnou
… z uvedených podmínek
návěští: _ … ; sled nepodmíněných instrukcí

3.2 Cykly (smyčky) v jazyce symbolických instrukcí

Stejně jako podmíněné příkazy jsou cykly založené na podmíněných skocích. Rozdíl je
v tom, že se neskáče jako u podmíněných příkazů na adresy vyšší, ale na adresy nižší.

Cyklus s podmínkou na konci:

návěští: _ instrukce _ op1[,op2] ; sled instrukcí v cyklu


instrukce _ op3[,op4]


cmp _ op5,op6 ; definice podmínky, srovnání op5 a op6
jcc _ návěští ; skok na návěští, pokud byla splněna
podmínka
instrukce _ op7[,op8] ; sled instrukcí mimo cyklus

Cyklus s podmínkou na začátku:

návěští1: _ cmp _ op1,op2 ; definice podmínky, srovnání op1 a op2


jcc _ návěští2 ; skok na návěští2, pokud nebyla splněna
podmínka
instrukce _ op1[,op2] ; sled instrukcí v cyklu

Ing. Miroslav Balík. Ph.D.


Počítače a jejich periférie – pc.3 3

instrukce _ op3[,op4]


jmp _ návěští1 ; nepodmíněný skok na návěští1
návěští2: _ instrukce _ op7[,op8] ; sled instrukcí mimo cyklus

Cyklus s počítadlem:

mov _ op1,op2 ; nastavení počítadla op1 na počet opakování


návěští: _ instrukce _ op3[,op4] ; sled instrukcí v cyklu
instrukce _ op5[,op6]


dec _ op1 ; snížení hodnoty počítadla o 1
cmp _ op1,0 ; testování počítadla op1 na 0
jne _ návěští ; skok na návěští, pokud v op1 není 0
instrukce _ op7[,op8] ; sled instrukcí mimo cyklus

Pokud to není nutné z jiných důvodů, doporučuje se používat nejjednodušší cyklus, což
je cyklus s podmínkou na konci. Pokud se používá cyklus s počítadlem pro řetězcové
instrukce, je vhodnější použít prefixovou instrukci rep. Součástí instrukčního souboru jsou
instrukce typu loop, které také umožňují realizaci cyklů různého typu s rozsahovými
omezeními (viz Sysman nebo instrukční soubor 8086).

Jednoduchá čekací smyčka


Např. pro testování zobrazení uživatelského rozhraní je vhodné si vytvořit v programu
jednoduchou čekací smyčku. Následující sled instrukcí definuje čekací smyčku, která neustále
testuje vstupní status standardního vstupu. Smyčka je ukončena až v okamžiku, kdy je
smáčknuta libovolná klávesa. Je použita služba DOS Fn 0Bh.

smycka: _ dosint _ 0bh ; návěští smyčka, volání služby DOS Fn 0Bh


pomocí makra dosint, viz dále
cmp _ al,00h ; testování al na 00h nastaví příznaky
je _ smycka ; pokud je al rovno 00h, nebyla smáčknuta klávesa,
skoč na návěští smycka, jinak pokračuj dál

3.3 Volání procedur (podprogramu) v jazyce symbolických instrukcí

Běžné volání procedur v jazyce symbolických instrukcí je velmi jednoduché. K tomuto


účelu slouží instrukce call s operandem adresy, která se specifikuje pomocí návěští procedury
(podprogramu).

Ing. Miroslav Balík. Ph.D.


4 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

4 Vytvoření uživatelského rozhraní programu


Následující kapitoly ukazují příklady vytváření uživatelského rozhraní, které umožňují
služby DOSu a služby obrazovky programům psaným v jazyce symbolických instrukcí
v reálném režimu procesorů x86. U většiny běžných programů tohoto typu je právě obsluha
standardního vstupu (klávesnice) a standardního výstupu (obrazovky) stěžejní částí celého
zdrojového kódu.

4.1 Definice textových řetězců v paměti

Jak již bylo uvedeno, k definici názvu adresy a typu operandu, který na této adrese
může být uložen, slouží direktiva dX (db, dw, dd, dq, dt). Pro definici adresy řetězce se
používá direktiva db, která definuje právě jeden byte v paměti. V tomto případě jméno
(identifikátor) řetězce, není jménem celého řetězce, ale pouze prvního znaku v řetězci.
Direktiva dX obecně umožňuje současnou definici více adres v paměti pro hodnoty stejného
typu, přičemž adresy počínaje druhou výše již nemají svoje jméno.
Následující příklady doporučuji vyzkoušet pomocí služby DOS Fn 09h. Služba
zobrazuje řetězec z adresy retez až po jeho konec, který je dán znakem “$”. Každé zobrazení
řetězce z níže uvedených definicí adresy retez bude mít na obrazovce stejný výsledek.

retez _ db _ “Ahoj!$” ; Definice celého řetězce najednou pomocí


všech znaků, nejednodušší řešení, problém
nebo „nejistý“ výsledek při použití znaků
mimo standardní ASCII (nejsou klávesnici).
retez _ db _ “A”,“h”,“o”,“j”,“!”,“$” ; Definice celého řetězce pomocí
samostatných znaků (pro ilustraci možností),
stejný problém jako při definici najednou
pomocí všech znaků.
retez _ db _ “A” ; Definice celého řetězce pomocí
db _ “h” samostatných znaků, každý následující znak
db _ “o” je uložen na další nepojmenovanou adresu
db _ “j” pomocí další direktivy db (pro ilustraci
db _ “!” možností), stejný problém jako při definici
db _ “$” najednou pomocí všech znaků, navíc
nejméně efektivní způsob definice.
retez _ db _ 41h,68h,6fh,6ah,21h,24h ; Definice řetězce pomocí ASCII kódu, zcela
jednoznačná definice, nevýhodou je
nečitelnost řetězce.

Jednotlivé způsoby definování je povoleno v rámci jedné direktivy db různě


kombinovat. Část řetězce může být definována jako znaky, další část může být definována
pomocí ASCII kódu. Jednotlivé definice výchozích hodnot operandů na jednom řádku se
vždy oddělují čárkou.

Ing. Miroslav Balík. Ph.D.


Počítače a jejich periférie – pc.3 5

4.2 Definice oken a rámečků uživatelského rozhraní

Při vytváření uživatelského rozhraní je nutné vytvářet různá okna a rámečky, které se
vytvářejí ze speciálních znaků k tomu určených, přičemž některé z nich se velmi často
opakují. Mezi tyto znaky se řadí zejména linky ohraničení okna, jejichž přehled je uveden
v následující tabulce:
Tabulka 4.1: Znaky pro vytváření jednoduchého a dvojitého rámečku

Symbol Dec. Hex. Symbol Dec. Hex.


┌ 218d DAh ╔ 201d C9h
├ 195d C3h ╠ 204d CCh
└ 192d C0h ╚ 200d C8h
┬ 194d C2h ╦ 203d CBh
┼ 197d C5h ╬ 206d CEh
┴ 193d C1h ╩ 202d CAh
┐ 191d BFh ╗ 187d BBh
┤ 180d B4h ╣ 185d B9h
┘ 217d D9h ╝ 188d BCh
─ 196d C4h ═ 205d CDh
│ 179d B3h ║ 186d BAh

Následující příklady doporučuji vyzkoušet např. pomocí služby DOS Fn 09h. Stejně
jako v předcházející kapitole, bude výsledek zobrazení všech tří možností definice adresy
retez stejný. Příklad zobrazuje horní část okna dvojitého rámečku.

retez _ db _ “╔═══╦══╗$” ; Definice celého


řetězce najednou
pomocí všech znaků
rámečku.
retez _ db _ 201d,205d,205d,205d,203d,205d,205d,187d,24h ; Definice řetězce
pomocí ASCI kódu,
každý znak
definován zvlášť,
hodnoty odděleny
čárkou
retez _ db _ 201d ; Definice řetězce
times _ 3 _ db _ 205d pomocí ASCI kódu
db _ 203d a direktivy times.
times _ 2 _ db _ 205d Čárkou lze oddělit
db _ 187d,24h pouze neopakující
se hodnoty

Ing. Miroslav Balík. Ph.D.


6 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

Pro překladač není nutné, aby se dekadické hodnoty označovaly písmenem d, je možné
tímto definice pomocí ASCII kódů ještě dále zkrátit. Nejkratší a nejvhodnější definice objektů
pro rámečky a okna je použití dekadického ASCII kódu spolu s direktivou times.
Tímto způsobem se v paměti nadefinuje rozhraní programu. Po spuštění programu je
jednou s prvních fází jeho vykonávání zobrazení vlastního uživatelského rozhraní. K tomu se
používají služby obrazovky a zobrazení rozhraní lze provést několika způsoby.

4.3 Barevný atribut v textovém módu

Obecně je barevný atribut 8-i bitové číslo, které umožňuje barevné zobrazení objektů
grafického/textového uživatelského rozhraní. Toto číslo má dvě části, horní nibble (horní 4
bity) a dolní nibble (dolní 4 bity). Horní nibble specifikuje barvu pozadí a dolní nibble
specifikuje barvu popředí. V případě zobrazení znaku např. “A” je barvou popředí barva
písmene a barvou pozadí je barva jeho podkladu.
K dispozici jsou kombinace 16-i barev popředí s 16-i barvami pozadí. Jednotlivé
významy barevného atributu v rámci nibblu jsou součástí následující tabulky:
Tabulka 4.2: Možné barvy v textovém módu 2 při běhu programu v okně.

Hodnota RGB Barva Hodnota RGB Barva


nibble nibble
0h rgb(0,0,0) 8h rgb (128,128,128)
1h rgb (0,0,128) 9h rgb (0,0,255)
2h rgb (0,128,0) Ah rgb (0,255,0)
3h rgb (0,128,128) Bh rgb (0,255,255)
4h rgb (128,0,0) Ch rgb (255,0,0)
5h rgb (128,0,128) Dh rgb (255,0,255)
6h rgb (128,128,0) Eh rgb (255,255,0)
7h rgb (192,192,192) Fh rgb (255,255,255)

Např. barevný atribut 1Eh představuje takovou kombinaci barev, kdy se zobrazí žlutý
znak na tmavě modrém pozadí. Např. barevný atribut 55h nastaví barvu popředí i barvu
pozadí na tmavě fialovou barvu, takže zobrazované znaky nebudou viditelné.
Dále platí, že některé kombinace (8h až Fh) barev pozadí se svým zobrazením liší při
běhu programu v okně a při běhu programu v režimu celé obrazovky. V režimu celé
obrazovky nemají správnou barvu odpovídající tabulce a objekty blikají. Podrobný popis viz
Sysman – práce s paletou.

Ing. Miroslav Balík. Ph.D.


Počítače a jejich periférie – pc.3 7

4.4 Uživatelské rozhraní v textovém módu

Uživatelské rozhraní vyžaduje cílenou práci s jednotlivými grafickými/textovými


objekty. Není tedy vhodné k zobrazení a práci s uživatelským rozhraním používat služby
DOSu, které umí zobrazovat pouze textové objekty jednoduchým a necíleným způsobem na
aktuální obrazovce. Pro tyto účely se používají téměř výhradně služby obrazovky.

Práce s uživatelským rozhraním v rámci programu má několik základních fází:


1. Nastavení požadovaného grafického/textového módu – tato fáze umožní
samotnou práci s uživatelským rozhraním, což se typicky děje na začátku celého
programu. K tomuto účelu se používá služba VID Fn 00h. V projektech budeme
používat mód 2 (80x25 textových bodů, 16/8 barev, EGA). Výsledem služby je
nastavení módu obrazovky, smazání obrazovky a nastavení výchozího barevného
atributu 0Fh (bílé popředí a černé pozadí).
2. Vykreslení uživatelského rozhraní – proces zobrazení řetězce nebo řetězců
uložených v paměti na obrazovku. Je možné použít službu VID Fn 09h pro
zobrazení znaku nebo znaků s barevným atributem a pak zejména službu VID Fn
13h pro zobrazení řetězce opět s barevným atributem. Uživatelské rozhraní je možné
vykreslit dvěma způsoby:
• V paměti se nadefinuje celé uživatelské rozhraní, takže jsou zde
nadefinovány všechny textové body rozhraní od začátku až dokonce.
K zobrazení pak postačuje jedno volání služby VID Fn 13h, které
zobrazí všechny textové body obrazovky jako jeden dlouhý řetězec.
Nevýhodou tohoto řešení je nesnadná rychlá změna vzhledu
uživatelského rozhraní a definice rozhraní zabírá největší možné
množství paměti.
• V paměti jsou nadefinovány pouze jedinečné části uživatelského
rozhraní. Tyto části rozhraní (obvykle jednotlivé řádky) jsou
programem vykresleny na požadovaná místa na obrazovce až je
postupně vykresleno celé uživatelské rozhraní. Výhodami tohoto
způsobu jsou menší nároky na obsazení paměti a možnost rychlé změny
vzhledu rozhraní bez zásadní změny obsahu paměti. Nevýhodou je
nutnost vykreslování pomocí programu s násobným voláním služby VID
Fn 13h. Je možné také používat službu VID Fn 09h pro opakující se
znaky rozhraní (typicky svislá nebo vodorovná linka rámečků).
3. Modifikace uživatelského rozhraní – možnosti smazání, posunutí nebo úplné
překreslení části nebo celého již zobrazeného uživatelského rozhraní jinými objekty.
• Smazat nebo posunout část rozhraní je velmi snadno možné pomocí
služeb VID Fn 06h a VID Fn 07h. Typicky se služby použijí buď pro
úplné smazání zvolené části rozhraní nebo k posunu zvolené části
rozhraní o definovaný počet řádků nahoru nebo dolů (např. pro rolování
textu).
• Úplné překreslení části rozhraní se provádí způsobem jako v bodu 2.
Nejnáročnější alternativou je práce s okny, které se zobrazují jen jako
dialog a po jejich ukončení je nutné obnovovat původní rozhraní, které
bylo pod dialogem. Pro tyto účely je nutné vytvořit funkce

Ing. Miroslav Balík. Ph.D.


8 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

(podprogramy) pro zálohování a obnovení původního uživatelského


rozhraní pod dialogem.
4. Ukončení práce v uživatelském rozhraní – před předáním řízení OS (ukončením
programu) je nutné vždy nastavit výchozí mód obrazovky. Jednak dojde ke smazání
všech objektu našeho uživatelského rozhraní a jsou nastaveny výchozí atributy
zobrazování.

4.5 Vytvoření uživatelského rozhraní v textovém módu 80x25

Tato kapitola popisuje způsob vytvoření uživatelského rozhraní programu pro


komunikaci mezi dvěma počítači PC pomocí sériového rozhraní RS232C. Rozhraní je
vytvořeno v textovém módu 2 (80x25 textových elementů, 16/8 barev, EGA). Na
následujícím obrázku je zobrazeno rozhraní tohoto programu.
0 79
h 0
r1

r0

r2 25
řádků

r0

r3
p 24

80 sloupců

Obrázek 4.1: Uživatelské rozhraní programu pro sériovou komunikaci


V textovém módu 2 je k dispozici 25 řádků a 80 sloupců textových elementů. Textovým
elementem se v tomto případě rozumí obdélník s těmito parametry:
• souřadnice – řádek a sloupec (dvě 8-i bitová čísla)
• ASCII kód zobrazeného znaku (8-i bitové číslo)
• barevný atribut (8-i bitové číslo)
Každý textový element je plně popsán pomocí 4 bytů. Celá obrazovka je tedy popsána
8000 byty (80x25x4B). U každého s těchto textových elementů je během vytvoření
uživatelského rozhraní nutné všechny tyto parametry nadefinovat.
Následující principy popisují způsob vytváření rozhraní, kdy jsou jedinečné části
rozhraní vykreslovány postupně po řádcích. V rozhraní existují specifické řádky, které lze
označit takto:
• h – hlavička, řádek 0, barevný atribut 0Fh
• r0 – opakující se řádek, řádek 2 až 11 a 13 až 22, barevný atribut 1Fh
• r1, r2, r3 – jedinečné řádky, řádek 1, 12, 23, barevný atribut 1Fh
• p – patička, řádek 24, barevný atribut 70h

Ing. Miroslav Balík. Ph.D.


Počítače a jejich periférie – pc.3 9

Další parametry jednotlivých řádků jsou stejné, každý řádek má délku 80 znaků a každý
řádek je vykreslován od nultého sloupce.
Každý z jedinečných řádků bude vykreslen zvláštní službou VID Fn 13h. Opakující se
řádky budou vykresleny postupným voláním služby VID Fn 13h v cyklu. Pro vykreslení
celého rozhraní je vhodné vytvořit podprogram, který se volá na začátku hlavní části
programu.

Definice jednotlivých řádků v paměti:

h _ db _ "Your Name, Version" ;hlavička


times _ 8 _ db _ 32
db _ "Serial Communication via RS232 Interface MNAV 2012"
r0 _ db _ 186 ;opakující se
times _ 78 _ db _ 32 řádek
db _ 186
r1 _ db _ 201 ;horní řádek
times _ 4 _ db _ 205
db _ " Sended data string: "
times _ 53 _ db _ 205
db _ 187
r2 _ db _ 204 ;střední
times _ 4 _ db _ 205 řádek
db _ " Received data string: "
times _ 51 _ db _ 205
db _ 185
r3 _ db _ 200 ;dolní řádek
times _ 78 _ db _ 205
db _ 188
p _ db _ " ESC-End " ;patička
times _ 55 _ db _ 219
db _ " COM1 1200bps "

4.6 Makra pro volání služeb

Pro volání služeb DOSu, služeb obrazovky a zejména pak služby VID Fn 13h je vhodné
vytvořit pomocné objekty – makra. Tyto umožní významným způsobem zkrátit zdrojový kód.
Použití makra však nezkracuje přeložený kód, tedy nemá vliv na konečnou velikost programu.
Pro další zkrácení zdrojového kódu je možné makra ukládat do zvláštního souboru a u
momentálního zdrojového kódu používat pouze include tohoto souboru.

Makro pro volání služby DOSu:


%macro _ dosint _ 1 ; název makra dosint, jeden vst. parametr
mov _ ah,%1 ; do ah předán první parametr
int _ 21h ; volání přerušení 21h
%endmacro

Ing. Miroslav Balík. Ph.D.


10 Fakulta elektrotechniky a komunikačních technologií VUT v Brně

Makro pro volání služby obrazovky:


%macro _ vidint _ 1 ; název makra vidint, jeden vst. parametr
mov _ ah,%1 ; do ah předán první parametr
int _ 10h ; volání přerušení 21h
%endmacro

Makro pro volání služby VID Fn 13h:


%macro _ line _ 5 ; název makra vidint, pět vst. param.:
;addr,row,column,length,color adresa, řádek, sloupec, délka, barevný
atribut
mov _ bh,0 ; na nultou obrazovku
mov _ al,0 ; vykreslení bez změny polohy kurzoru
mov _ bp,%1 ; do bp adresa počátku řetězce v paměti
mov _ dh,%2 ; do dh řádek počátku řetězce
mov _ dl,%3 ; do dl sloupec počátku řetězce
mov _ cx,%4 ; do cx délka zobrazení řetězce
mov _ bl,%5 ; s barevným atributem
vidint _ 13h ; zavolání služby VID Fn 13h
%endmacro

Ing. Miroslav Balík. Ph.D.

You might also like