4. diel - Assembler - ASCII tabuľka a spustenie v DOSBox
V minulej lekcii, Assembler - Prvý program - Hello world! , sme rozprogramovali svoju prvú aplikáciu v Assemblera, Vyhlasujúca text Hello world! do videopamäte.
Dnes dokončíme opis nášho Hello world! programu a tiež sa ho naučíme spustiť.
Ascii tabuľka
Pretože v kóde pracujeme s textovým reťazcom, mali by sme si predstaviť
ASCII tabuľku. Pravdepodobne ste o nej už minimálne počuli. Najmä v ére
operačného systému MS-DOS prakticky nebola iná možnosť, ako zaznamenávať
text. Jednotlivé znaky boli uložené ako čísla typu byte
, teda
s rozsahom hodnôt od 0
do 255
. V systéme bola
uložená tzv. ASCII tabuľka, ktorá mala 256 znakov a každému ASCII kódu
(číselnému kódu) priradzovala jeden znak.
ASCII tabuľka bola rozdelená na prvých 128 znakov tvoriaci
základné tabuľku a potom na extended časť sa znaky s kódmi
128
- 255
.
Asi je vám jasné, prečo tento spôsob nebol platný dodnes. Do tabuľky sa
jednoducho nevošli všetky znaky všetkých národných abecied. Teraz sa
používa Unicode (UTF-8) kódovanie, čo je vlastne nadstavba nad ASCII. V ASM
ale samozrejme podporu Unicode nemáme:) Medzi výhodu ASCII tabuľky patrí,
že znaky sú uložené v tabuľke za sebou, podľa abecedy. Napr. na pozícii
97
nájdeme 'a'
, na 98
'b'
a
podobne. Podobne je to s číslami, diakritické znaky tam sú bohužiaľ len
nejako rozhádzané.
Základné ASCII tabuľka
Poďme sa pozrieť, ako základné ASCII tabuľka vyzerá:
|\__/,| (`\ _.|o o |_ ) ) -(((---(((--------
kód | znak | kód | znak |
---|---|---|---|
64 | @ | 80 | P |
65 | A | 81 | Q |
66 | B | 82 | R |
67 | C | 83 | S |
68 | D | 84 | T |
69 | E | 85 | U |
70 | F | 86 | V |
71 | G | 87 | W |
72 | H | 88 | X |
73 | Aj | 89 | Y |
74 | J | 90 | Z |
75 | K | 91 | [ |
76 | L | 92 | \ |
77 | M | 93 | ] |
78 | N | 94 | ^ |
79 | O | 95 | _ |
Koniec
Vrhnite sa na opis poslednej časti programu - Koniec, ktorá vráti kontrolu operačnému systému:
hlwrld_message db "Hello, World!", 0 Return: ret
Direktíva DB
(Define Byte)
Pred poslednou časťou a funkciou je ešte premenná. Ide o premennú,
ktorú nahrávame do registra SI
. Premenná má názov
hlwrld_message
, ide o bytový reťazec a jeho
hodnota je "Hello, World!"
.
Možno sa pýtate, čo tá nula na konci? Ukončuje nám reťazec. To je podobné ako v jazyku C. Až sa bude s reťazcom pracovať, musíme nejako spoznať, za ktorým znakom už ďalší nie je. Nula je teda "stopka". Ak by sme na ňu zabudli, vypísali by sme ďalšie dáta, čo nasledujú v ďalšom segmente pamäte, čo by boli typicky nejaké nezmyselné znaky.
Popravde to nie je nula, ale tzv. Nulový znak s ASCII kódom 0
.
Podobne môžeme do reťazca vložiť napr. Aj sekvenciu znakov s ASCII kódmi
10
a 13
(kód klávesu Enter), čo vyvolá
odriadkovanie:
hlwrld db "Hello, World!", 10, 13, 0
Že tieto kódy naozaj odřádkují si môžete overiť v ASCII tabuľke.
Po výpisu textu by sa kurzor presunul na začiatok ďalšieho riadku, čo sa
v prvom prípade nestane. Ale aj znaky, ako je potrebné A
,
B
, C
, ... môžeme nahradiť číselnými kódmi,
viď. ASCII tabuľka.
Kompilácie
Nezostáva než spustiť náš skript Sestavit.bat
, čím nám
vznikne súbor hlwrld.com
.
Ako ho ale spustíme, keď používame 16 bitovú direktívu, ktorá nie je od Windows Vista už podporovaná? My použijeme emulátor DOSBox. Rovnako tak si ale môžete do virtuálky nainštalovať staršiu Windows alebo DOS, prípadne do operačného systému čo podporuje 16-bitové aplikácie nabootovať.
DOSBox
DOSBox stiahneme na https://www.dosbox.com/. Aplikáciu si spustíte v akomkoľvek operačnom systéme.
Spustenie pretiahnutím
Najjednoduchší spôsob dostaniu nášho súboru hlwrld.com
do
DOSBox je pretiahnutia tohto súboru myšou na ikonu DOSBox, napr. Na ploche.
Mali by ste dospieť k nasledujúcemu výstupu:
DOSBox
Hello, World!
Príkaz mount
Ak máte s týmto spôsobom spustenie problémy, môžete program do DOSBboxu
preniesť manuálne pomocou príkazu mount xy
, kde x
je písmeno nového disku v DOSBox a y
cesta k priečinku vo vašom
PC, ktorá sa stane novým diskom. Napr. na Linuxe by sme namountovali plochu
ako disk C:\
takto:
DOSBox
Z:\>mount c /home/jakub/Desktop
Drive C is mounted as local directory /home/jakub/Desktop/
Z:\>c:
C:\>hlwrld.com
Hello, World!
C:\>
Postup vyššie spustí súbor za podmienky, že je hlwrld.com
umiestnený na ploche.
Čakanie na kláves
Ak náš program spúšťate v prostredí, kde sa hneď vypne, môžete si do neho pridať ešte čakanie na kláves. Ak nepredpokladáte jednoriadkový kód, tak nepredpokladáte správne:) Túto úpravu si popíšeme až nabudúce. ASM kód s ňou bude vyzerať takto:
; Náš první program - Hello, World! [BITS 16] org 100h mov si, hlwrld_message call PrintString call WaitForKey jmp Return PrintString: lodsb or al, al jz short .Done mov ah, 0eh mov bx, 7h int 10h jmp PrintString .Done: ret ; Funkce WaitForKey WaitForKey: mov ah, 11h int 16h jnz .KeyPressed hlt jmp WaitForKey .KeyPressed: mov ah, 10h int 16h ret hlwrld_message db "Hello, World!", 0 Return: ret
A máme hotovo! V prípade problémov môžete napísať do komentárov.
V budúcej lekcii, Assembler - Dátové typy a premenné , si povieme o dátových typoch, ktoré sa používajú pri programovaní v Assemblera, ao prácu s reťazcami.