Lekce 6 - Assembler - ASCII tabulka a spuštění v DOSBox
V minulé lekci, Assembler - První program - Hello world!, jsme rozprogramovali svou první aplikaci v Assembleru, vypisující text Hello world! do videopaměti.
Dnes dokončíme popis našeho Hello world! programu a také se jej naučíme spustit.
ASCII tabulka
Protože v kódu pracujeme s textovým řetězcem, měli bychom si
představit ASCII tabulku. Pravděpodobně jste o ní již minimálně slyšeli.
Zejména v éře operačního systému MS-DOS prakticky nebyla jiná možnost,
jak zaznamenávat text. Jednotlivé znaky byly uloženy jako čísla typu
byte
, tedy s rozsahem hodnot od 0
do 255
.
V systému byla uložena tzv. ASCII tabulka, která měla 256 znaků a každému
ASCII kódu (číselnému kódu) přiřazovala jeden znak.
ASCII tabulka byla rozdělena na prvních 128 znaků tvořící
základní tabulku a pak na extended část se znaky s kódy
128
-255
.
Asi je vám jasné, proč tento způsob nepřetrval dodnes. Do tabulky se
jednoduše nevešly všechny znaky všech národních abeced. Nyní se
používá Unicode (UTF-8) kódování, což je vlastně nástavba nad ASCII. V
ASM ale samozřejmě podporu Unicode nemáme Mezi výhodu ASCII tabulky patří,
že znaky jsou uloženy v tabulce za sebou, podle abecedy. Např. na pozici
97
nalezneme 'a'
, na 98
'b'
a podobně. Podobně je to s čísly, diakritické znaky tam jsou bohužel jen
nějak rozházeny.
Základní ASCII tabulka
Pojďme se podívat, jak základní ASCII tabulka vypadá:
|\__/,| (`\ _.|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 | I | 89 | Y |
74 | J | 90 | Z |
75 | K | 91 | [ |
76 | L | 92 | \ |
77 | M | 93 | ] |
78 | N | 94 | ^ |
79 | O | 95 | _ |
Konec
Vrhněme se na popis poslední části programu - Konec, která vrátí kontrolu operačnímu systému:
hlwrld_message db "Hello, World!", 0 Return: ret
Direktiva DB
(Define Byte)
Před poslední částí a funkcí je ještě proměnná. Jde o proměnnou,
kterou nahráváme do registru SI
. Proměnná má název
hlwrld_message
, jde o bytový řetězec a jeho
hodnota je "Hello, World!"
.
Možná se ptáte, co ta nula na konci? Ukončuje nám řetězec. To je podobné jako v jazyce C. Až se bude s řetězcem pracovat, musíme nějak poznat, za kterým znakem už další není. Nula je tedy "stopka". Pokud bychom na ni zapomněli, vypsali bychom další data, co následují v dalším segmentu paměti, což by byly typicky nějaké nesmyslné znaky.
Popravdě to není nula, ale tzv. nulový znak s ASCII kódem 0
.
Podobně můžeme do řetězce vložit např. i sekvenci znaků s ASCII kódy
10
a 13
(kód klávesy Enter), což vyvolá
odřádkování:
hlwrld db "Hello, World!", 10, 13, 0
Že tyto kódy opravdu odřádkují si můžete ověřit v ASCII tabulce.
Po výpisu textu by se kurzor přesunul na začátek dalšího řádku, což
se v prvním případě nestane. Ale i znaky, jako je třeba A
,
B
, C
,... můžeme nahradit číselnými kódy, viz.
ASCII tabulka.
Kompilace
Nezbývá než spustit náš skript Sestavit.bat
, čímž nám
vznikne soubor hlwrld.com
.
Jak jej ale spustíme, když používáme 16bitovou direktivu, která není od Windows Vista již podporovaná? My použijeme emulátor DOSBox. Stejně tak si ale můžete do virtuálky nainstalovat starší Windows nebo DOS, případně do operačního systému co podporuje 16bitové aplikace nabootovat.
DOSBox
DOSBox stáhneme na https://www.dosbox.com/. Aplikaci si spustíte v jakémkoli operačním systému.
Spuštění přetažením
Nejjednodušší způsob dostání našeho souboru hlwrld.com
do
DOSBoxu je přetažení tohoto souboru myší na ikonu DOSBoxu, např. na
ploše. Měli byste dospět k následujícímu výstupu:
DOSBox
Hello, World!
Příkaz mount
Pokud máte s tímto způsobem spuštění problémy, můžete program do
DOSBboxu přenést manuálně pomocí příkazu mount x y
, kde
x
je písmeno nového disku v DOSBox a y
cesta ke
složce ve vašem PC, která se stane novým diskem. Např. na Linuxu bychom
namountovali plochu jako 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 výše spustí soubor za podmínky, že je hlwrld.com
umístěn na ploše.
Čekání na klávesu
Pokud náš program spouštíte v prostředí, kde se hned vypne, můžete si do něj přidat ještě čekání na klávesu. Pokud nepředpokládáte jednořádkový kód, tak nepředpokládáte správně Tuto úpravu si popíšeme až příště. ASM kód s ní bude vypadat 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 případě problémů můžete napsat do komentářů.
V příští lekci, Assembler - Datové typy a proměnné, si řekneme o datových typech, které se používají při programování v Assembleru, a o práci s řetězci.