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 odovz
dá 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:
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 CODEV 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.