Praktické príklady

Ako prvý si ukážeme učebnicový príklad pre výpis textu na obrazovku. Program bude typu: *.COM. Všimnite si akú štruktúru (šablónu) mám tento typ programu. Vašou úlohou teraz bude opísať tento program a uložiť ho do súboru napr. prog1.asm. Tým, ktorým sa nechce program opisovať ponúkam DOWNLOAD PROG1.ZIP (999 BYTES).

.MODEL TINY

 

.CODE

 

ORG 100H

 

START:

JMP SETTING

TEXT

DB 'HELLO, WORLD ! $'

SETTING:

MOV AH,09H

 

MOV DX,OFFSET TEXT

 

INT 21H

 

INT 20H

 

END START

Najprv si povieme ako program pracuje. Na začiatku definujeme model a code segment. Ďalej nasleduje direktíva ORG 100H. Direktíva spôsobí posunutie štartovacej adresy programu o 256 bajtov. Pre programy typu *.COM je nevyhnutná. Pokračujeme definovaním návestia START a inštrukciou skoku JMP.

Táto inštrukcia je potrebná na preskočenie dát, ktoré za ňou nasledujú (tento variant sa veľmi často používa). Všimnite si, že dáta sme definovali v kódovom segmente. Pretože prekladaču to nevadí, nevadí to ani nám. Dostávame sa na návestie SETTING, tu začína náš program. Služba, ktorú som použil slúži na vypísanie textového reťazca na obrazovku. Jej číslo je 9 (pozri register AH). Službe tiež musíme nejako odovzdať adresu nášho textu v pamäti. Táto adresa sa odovzdá v registroch DS:DX (segment:offset). Operátorom OFFSET získame offsetovú adresu symbolu. Symbol môže byť návestie, meno dát atď. Reťazec môže obsahovať ľubovolné znaky, okrem znaku '$' (dolar). Tento znak slúži na ukončenie reťazca, ktorý chceme zobraziť. Inak povedané služba vypisuje na obrazovku znaky až kým nenarazí na znak dolar. Takže nastavili sme registre a môžeme pokojne zavolať prerušenie INT 21H. Text sa zobrazí na obrazovku. Teraz musíme program ukončiť tak, aby sa naspäť vrátil do Dosu. Na to použijeme prerušenie INT 20H. Toto prerušenie sa používa na ukončovanie programov typu *.COM. Podmienkou pre použitie tejto služby je, aby segmentový register CS bol nastavený tak, že začiatok segmentu je totožný so začiatkom PSP1 (Program segment prefix). Toto je splnené iba pri programoch typu *.COM. Túto službu nie je možné použiť pre programy typu *.EXE. A sme na konci programu, ešte ukončíme kódový segment direktívou END START. A je to.

Ak ste sa dostali až sem, máte už program určite napísaný. Alebo nie? Teraz si vysvetlíme ako program preložiť do strojového kódu. Na preklad budete potrebovať prekladač turbo assembleru (verziu aspoň 3.0 a vyššie).

Program preložíte takto:
TASM meno_suboru (napr.: TASM.exe prog1.asm). Po úspešnom preklade sa vám na obrazovke zobrazia nasledovné údaje a vytvorí sa súbor s tým istým menom, ale s príponou *.OBJ.

Turbo Assembler Version 3.1 Copyright (c) 1988, 1992 Borland International
Assembling file: prog1.asm
Error messages: None
Warning messages: None
Passes: 1
Remaining memory: 389k

Takže máme vytvorený súbor s príponou *.OBJ. Ako ste si iste všimli nie je možné tento súbor spustiť. Aby sme mohli súbor spustiť musíme ho "upraviť" linkerom. TLINK meno_súboru /t (napr.: TLINK.exe prog1.obj /t). Parameter /t je potrebný, pretože výsledný program bude typu *.COM. V prípade, že program je typu *.EXE tento parameter sa neuvádza. Ak bola štruktúra programu správna zobrazí sa nasledovná správa.

Turbo Link Version 3.01 Copyright (c) 1987, 1990 Borland International

V opačnom prípade sa linkovanie zastaví a zobrazí sa chybové hlásenie. Po zlinkovaní programu sa okrem spustiteľného *.COM, prípadne *.EXE vytvorí aj súbor s príponou *.MAP. Súbor obsahuje tieto informácie.

Start Stop Length Name Class

0000H 011DH 011EH _TEXT CODE
011EH 011EH 0000H _DATA DATA

V kapitole Základné pojmy som sa zmienil o tom, že programy v assembleri zaberajú na disku, prípadne v pamäti málo miesta. Program, ktorý ste si mali možnosť vyskúšať som naprogramoval v jazyku Pascal, v jazyku C a v assembleri. Z grafu je vidieť aký veľký program vznikne ak použijeme vyššie programovacie jazyky.

 

Ešte si ukážeme ten istý program, ibaže bude mať šablónu pre program typu *.EXE. Program preložíte takto: TASM.EXE prog2.asm a TLINK.EXE prog2.obj. Opäť DOWNLOAD PROG2.ZIP (1,14 KB).

.MODEL SMALL

 

.STACK 100H

 

.DATA

 

TEXT

DB 'HELLO, WORLD ! $'

.CODE

 

START:

MOV AX,@DATA

 

MOV DS,AX

 

MOV AH,09H

 

MOV DX,OFFSET TEXT

 

INT 21H

 

MOV AX,4C00H

 

INT 21H

 

END START

Program sa odlišuje od toho predchádzajúceho hlavne v tom, že už musíme definovať zásobník, a v ukončení programu. Segmentový register DS naplníme adresou nášho textu, ktorú získame pomocou konštanty @DATA2. V tomto prípade program ukončíme tak, že register (AH=4CH) bude obsahovať číslo služby, register (AL=00H) bude obsahovať kód chyby (00 - OK). A opäť zavoláme prerušenie INT 21H. Služba 4CH slúži na ukončenie programu typu *.EXE.


1 PSP (Program segment prefix) - Ide o dátovú štruktúru MS-DOSu, dlhú 256 bajtov, ktorá je umiestnená pred program pri jeho spúšťaní. Obsahuje kópiu príkazového riadku a ďalšie informácie DOSu o procese (tabuľku kanálov otvorených súborov, počet znakov v príkazovom riadku, adresu obsluhy kritickej chyby a pod.) To je dôvod, prečo programy typu *.COM musia začínať od adresy 100H (viď direktíva ORG 100H).

2 @DATA - je to preddefinovaná konštanta, ktorá obsahuje segmentovú adresu dát programu.