3. diel - Assembler - Prvý program - Hello world!
V minulej lekcii, Assembler - Vytvorenie NASM projektu, registre a prerušenie , sme si založili NASM projekt a povedali si čo sú to registre a prerušenia.
Máme pripravený projekt a sme vyzbrojenie povedomím o registroch a prerušeniach. Poďme teda programovať v ASM!
Náš prvý program - Hello world
Naprogramujeme si klasický Hello world program. Už v úvodnej lekcii sme si vlastne ukázali jeho zdrojový kód, ale tu si ho aj rozoberieme tak, ako sa sluší a patrí.
Do editora si vložíme nasledujúci kód v ASM:
; Náš první program - Hello, World! [BITS 16] org 100h mov si, hlwrld_message call PrintString jmp Return PrintString: lodsb or al, al jz short .Done mov ah, 0eh mov bx, 7h int 10h jmp PrintString .Done: ret hlwrld_message db "Hello, World!", 0 Return: ret
Súbor uložíme ako hlwrld.asm
do zložky
HelloWorld/Source/
. Program samozrejme vypíše na obrazovku Hello
world. Teraz si ho rozoberieme.
Štruktúra programu
Celý kód sa skladá zo 4 základných častí:
- začiatok programu,
- zavolanie funkcie,
- deklarácie funkcie a
- koniec programu.
Začiatok programu
Vysvetlime si prvé riadky, teda:
; Náš první program - Hello, World! [BITS 16] org 100h
Komentár ;
Asi už tušíte, že prvý riadok je komentár. Tie píšeme za bodkočiarkami a prekladač si ich nevšíma.
[BITS 16]
Ako ďalšie máme direktívu [BITS 16]
, čím hovoríme, že
píšeme program pre šestnásťbitový procesor. Takéto programy majú tú
výhodu, že sú pomerne jednoduché, ale tiež nevýhodu, že ich nemôžeme
spustiť na nových Windows. Niekde sa ale začať musí:)
Direktíva ORG
(Origin)
Možno si pamätáte jednoduché programy s príponou .com
z
éry MS-DOS. Posledný riadok je ďalší direktíva prekladača, ktorá určuje
kde preložený ASM program v pamäti začína. ORG 100H
je prefix
pre tzv. COM
programy (Command). To sú programy skladajúce sa len
z jedného segmentu o maximálnej veľkosti 64KB, čo nám svojou
jednoduchosťou pre začiatok vyhovuje. 100H
je adresa v pamäti,
kde bude program začínať (command segment prefix). Pred touto adresou sú
načítané ešte ďalšie informácie o programe, napr. Na 80H
by
sme našli príkaz, ktorým sa program spustil a podobne.
Zavolanie funkcie
Najprv sa pozrieme na zavolanie funkcie, teda pasáž:
mov si, hlwrld_message call PrintString jmp Return
Pri volaní funkcií často odovzdávame nejaké vstupné
parametre. My chceme vypísať správu
"Hello world"
, takže ako parameter nastavíme túto správu. Tú
presunieme do registra SI
, cez ktorý ju budeme schopní
vypisovací funkciu odovzdať. Ako to urobíme?
Inštrukcia MOV
(Move)
Pomocou MOV
presúvame dáta v registroch alebo pamäti RAM,
čiže čítame alebo zapisujeme. Je to vlastne analógia priradenie do
premennej v RAM z vyšších programovacích jazykov, tam sa však s registrami
priamo nepracuje. Prvý parameter inštrukcia je kam ukladáme, druhý je
odkiaľ čítame. Parametre oddeľujeme čiarkami. Tu priraďujeme reťazec z
premennej hlwrld_message
definovanej nižšie do registra
SI
, ktorý si popíšeme ako ďalší.
Register SI
(Source Index)
Register SI
je všeobecne register určený pre kopírovanie
reťazcov. Tu slúži ako úložný priestor medzi časťou, kde funkciu
voláme, a funkcií samotnú. My si do neho ukladáme správu
"Hello world"
, ktorú si definujeme až nižšie.
Inštrukcie CALL
Funkciu potom zavoláme pomocou inštrukcie CALL
. Tu nie je čo
riešiť.
Inštrukcia JMP
(Jump)
Nakoniec nasleduje JMP
, čo je tzv. Nepodmienečný
skok. Nepodmienený preto, že program odtiaľ jednoducho vždy
preskočí na riadku, kde je definované danej návestí (v tomto prípade na
riadku Return:
). V ASM budeme takto skákať často.
Funkcie
Pozrieme sa na ďalšiu časť programu, ktorá deklaruje samotnú funkciu pre výpis textu na obrazovku:
PrintString: lodsb or al, al jz short .Done mov ah, 0eh mov bx, 7h int 10h jmp PrintString .Done: ret
Návestí :
Vidíme, že funkcie sa definuje rovnako ako návestí, teda s dvojbodkou
:
na konci.
Inštrukcie
LODSB
- (load String Byte at address into AX)
Prvá inštrukcií vo funkcii je už spomínaná inštrukcie
LODSB
. Tá slúži na presunutie obsahu z registra SI
,
kde máme náš reťazec na vytlačenie, do registra AX
. Tam totiž
môžeme s obsahom už pracovať ako s jednotlivými znakmi. Ďalšia
inštrukcií je OR
s registrami AL
.
Registre AX
, BX
,
CX
, DX
Poďme sa u registrov AX
na chvíľu zastaviť a trochu si túto
časť osvetliť. Pre svoje programy máme k dispozícii 4 univerzálne
(anglicky general-purpose) registre. To je prvý typ registrov, ktorý sme si
minule uviedli. Sú to:
AX
- Akumulačné registerBX
- Bázový registerCX
- Počítadlový register (Counter register)DX
- Dátový register
So všetkými týmito registre môžeme pracovať ako s 16-bitovou alebo
dvoma osembitovým (písmeno X
označuje, či pracujeme s High
alebo Low hodnotou registra - AX
je teda buď AH
alebo
AL
).
Ak si ale chceme prácu uľahčiť a vyhnúť sa písanie:
mov al, 0ffh mov ah, 0ffh
Môžeme použiť zápis:
mov ax, 0ffffh
Inštrukcie OR
Ako asi tušíte, inštrukcie OR
predstavuje bitový
súčet. Tu vďaka tejto inštrukciu zistíme, či sú v registri
AX
ešte nejaké znaky, ktoré môžeme načítať. Takto budeme
skákať nepodmieneným skokom na začiatok funkcie, kým neprejdete celý
reťazec.
Parametre inštrukcie sú 2 Sčítanie čísla.
Inštrukcie JZ
Ak znaky dôjdu, ďalšie inštrukcie JZ
, podmienený
skok (ak je navrátená hodnota True
), nás presunie na
určenú pozíciu - Konkrétne na návestie .Done
. Túto
inštrukciu môžeme stretnúť aj ako JE
.
Tlač znaku do videopamäte
Tretiu a štvrtú inštrukcií je nám už známa MOV
, ktorá sa
vzťahuje k prerušeniu INT 10H
. V tomto prípade dávajú tieto
tri riadky dohromady žiadosť o vytlačenie znaku:
mov ah, 0eh mov bx, 7h int 10h
Opakovania čítanie znakov
Potom nasleduje JMP
", nepodmienečný skok,
ktorý nás presunie na začiatok funkcie PrintString
, aby sa
načítal ďalší znak z vloženého textu. Týmto sme vlastne nahradili cyklus
pre prechádzanie všetkých znakov.
Inštrukcia RET
(return)
Poslednou časťou funkcia je návestí .Done
a inštrukcie
RET
, ktorá nás presunie späť na miesto, odkiaľ sme funkciu
zavolali.
Pokračovať budeme zas nabudúce.
V budúcej lekcii, Assembler - ASCII tabuľka a spustenie v DOSBox , si vysvetlíme ASCII tabuľku, dokončíme popis Hello world! programu a konečne si ho aj spustíme ako .Com súbor v emulátora DosBox.