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í.

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 - Assembler

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.


 

Predchádzajúci článok
Assembler - Prvý program - Hello world!
Všetky články v sekcii
Assembler
Preskočiť článok
(neodporúčame)
Assembler - Dátové typy a premenné
Článok pre vás napísal Jakub Verner
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v x86 Assembleru.
Aktivity