Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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 - Základy assembleru

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.


 

Předchozí článek
Assembler - První program - Hello world!
Všechny články v sekci
Základy assembleru
Přeskočit článek
(nedoporučujeme)
Assembler - Datové typy a proměnné
Článek pro vás napsal Jakub Verner
Avatar
Uživatelské hodnocení:
15 hlasů
Autor se věnuje programování v x86 Assembleru.
Aktivity