IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

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é register
  • BX - Bázový register
  • CX - 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.


 

Predchádzajúci článok
Assembler - Vytvorenie NASM projektu, registre a prerušenie
Všetky články v sekcii
Assembler
Preskočiť článok
(neodporúčame)
Assembler - ASCII tabuľka a spustenie v DOSBox
Č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