BLACK FRIDAY! Slevy až 80 % jsou všude. Tak je nepropásni a přejdi do rostoucího IT oboru!
The real BF 2020

Lekce 5 - Assembler - První program - Hello world!

V minulé lekci, Assembler - Vytvoření NASM projektu, registry a přerušení, jsme si založili NASM projekt a řekli si co jsou to registry a přerušení.

Máme připravený projekt a jsme vyzbrojení povědomím o registrech a přerušeních. Pojďme tedy programovat v ASM!

Náš první program - Hello world

Naprogramujeme si klasický Hello world program. Již v úvodní lekci jsme si vlastně ukázali jeho zdrojový kód, ale zde si jej i rozebereme tak, jak se sluší a patří.

Do editoru si vložíme následující 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

Soubor uložíme jako hlwrld.asm do složky HelloWorld/Source/. Program samozřejmě vypíše na obrazovku Hello world. Nyní si ho rozebereme.

Struktura programu

Celý kód se skládá ze 4 základních částí:

  • začátek programu,
  • zavolání funkce,
  • deklarace funkce a
  • konec programu.

Začátek programu

Vysvětleme si první řádky, tedy:

; Náš první program - Hello, World!

[BITS 16]

org 100h

Komentář ;

Asi již tušíte, že první řádek je komentář. Ty píšeme za středníky a překladač si jich nevšímá.

[BITS 16]

Jako další máme direktivu [BITS 16], čímž říkáme, že píšeme program pro šestnáctibitový procesor. Takové programy mají tu výhodu, že jsou poměrně jednoduché, ale také nevýhodu, že je nemůžeme spustit na nových Windows. Někde se ale začít musí :)

Direktiva ORG (ORiGin)

Možná si pamatujete jednoduché programy s příponou .com z éry MS-DOS. Poslední řádek je další direktiva překladače, která určuje kde přeložený ASM program v paměti začíná. ORG 100H je prefix pro tzv. COM programy (COMmand). To jsou programy skládající se pouze z jednoho segmentu o maximální velikosti 64KB, což nám svou jednoduchostí pro začátek vyhovuje. 100H je adresa v paměti, kde bude program začínat (command segment prefix). Před touto adresou jsou načteny ještě další informace o programu, např. na 80H bychom nalezli příkaz, kterým se program spustil a podobně.

Zavolání funkce

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Nejprve se podíváme na zavolání funkce, tedy pasáž:

mov si, hlwrld_message
call PrintString
jmp Return

Při volání funkcí často předáváme nějaké vstupní parametry. My chceme vypsat zprávu "Hello world", takže jako parametr nastavíme tuto zprávu. Tu přesuneme do registru SI, přes který ji budeme schopní vypisovací funkci předat. Jak to uděláme?

Instrukce MOV (Move)

Pomocí MOV přesouváme data v registrech nebo paměti RAM, čili čteme nebo zapisujeme. Je to vlastně analogie přiřazení do proměnné v RAM z vyšších programovacích jazyků, tam se ovšem s registry přímo nepracuje. První parametr instrukce je kam ukládáme, druhý je odkud čteme. Parametry oddělujeme čárkami. Zde přiřazujeme řetězec z proměnné hlwrld_message definované níže do registru SI, který si popíšeme jako další.

Registr SI (Source Index)

Registr SI je obecně registr určený pro kopírování řetězců. Zde slouží jako úložný prostor mezi částí, kde funkci voláme, a funkcí samotnou. My si do něj ukládáme zprávu "Hello world", kterou si definujeme až níže.

Instrukce CALL

Funkci potom zavoláme pomocí instrukce CALL. Zde není co řešit.

Instrukce JMP (JuMP)

Nakonec následuje JMP, což je tzv. nepodmíněný skok. Nepodmíněný proto, že program odtud prostě vždy přeskočí na řádku, kde je definované dané návěstí (v tomto případě na řádku Return:). V ASM budeme takto skákat často.

Funkce

Podíváme se na další část programu, která deklaruje samotnou funkci pro 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ávěstí :

Vidíme, že funkce se definuje stejně jako návěstí, tedy s dvojtečkou : na konci.

Instrukce LODSB - (LOaD String Byte at address into AX)

První instrukcí ve funkci je již zmíněná instrukce LODSB. Ta slouží k přesunutí obsahu z registru SI, kde máme náš řetězec k vytisknutí, do registru AX. Tam totiž můžeme s obsahem již pracovat jako s jednotlivými znaky. Další instrukcí je OR s registry AL.

Registry AX, BX, CX, DX

Pojďme se u registrů AX na chvíli zastavit a trochu si tuto část osvětlit. Pro své programy máme k dispozici 4 univerzální (anglicky general-purpose) registry. To je první typ registrů, který jsme si minule uvedli. Jsou to:

  • AX - Akumulační registr
  • BX - Bázový registr
  • CX - Počítadlový registr (Counter register)
  • DX - Datový registr

Se všemi těmito registry můžeme pracovat jako s 16bitovými nebo dvěma osmibitovými (písmeno X označuje, zda pracujeme s High nebo Low hodnotou registru - AX je tedy buď AH nebo AL).

Pokud si ale chceme práci ulehčit a vyhnout se psaní:

mov al, 0ffh
mov ah, 0ffh

Můžeme použít zápis:

mov ax, 0ffffh

Instrukce OR

Jak asi tušíte, instrukce OR představuje bitový součet. Zde díky této instrukci zjistíme, zda jsou v registru AX ještě nějaké znaky, které můžeme načíst. Takto budeme skákat nepodmíněným skokem na začátek funkce, dokud neprojedeme celý řetězec.

Parametry instrukce jsou 2 sčítaná čísla.

Instrukce JZ

Pokud znaky dojdou, další instrukce JZ, podmíněný skok (pokud je navrácená hodnota True), nás přesune na určenou pozici - Konkrétně na návěstí .Done. Tuto instrukci můžeme potkat i jako JE.

Tisknutí znaku do videopaměti

Třetí a čtvrtou instrukcí je nám již známá MOV, která se vztahuje k přerušení INT 10H. V tomto případě dávají tyto tři řádky dohromady žádost o vytisknutí znaku:

mov ah, 0eh
mov bx, 7h
int 10h

Opakování čtení znaků

Potom následuje JMP", nepodmíněný skok, který nás přesune na začátek funkce PrintString, aby se načetl další znak z vloženého textu. Tímto jsme vlastně nahradili cyklus pro procházení všech znaků.

Instrukce RET (RETurn)

Poslední částí funkce je návěstí .Done a instrukce RET, která nás přesune zpátky na místo, odkud jsme funkci zavolali.

Pokračovat budeme zas příště.

V příští lekci, Assembler - ASCII tabulka a spuštění v DOSBox, si vysvětlíme ASCII tabulku, dokončíme popis Hello world! programu a konečně si jej i spustíme jako .com soubor v emulátoru DOSBox.


 

Předchozí článek
Assembler - Vytvoření NASM projektu, registry a přerušení
Všechny články v sekci
Základy assembleru
Článek pro vás napsal Jakub Verner
Avatar
Jak se ti líbí článek?
3 hlasů
Autor se věnuje programování v Assembleru a v C#. Rád se zlepšuje, rozšiřuje si znalosti a věří, že když člověk chce, dokáže cokoliv.
Aktivity (7)

 

 

Komentáře

Avatar
Petr Laštovička
Super redaktor
Avatar
Petr Laštovička:13. dubna 10:52

Instrukci lodsb v dnešní době už nikdo nepoužívá a v procesorech je spíše pouze kvůli kompatibilitě se zastaralými aplikacemi. Myslím, že by taková instrukce měla být zmíněna až v poslední lekci pro velmi pokročilé programátory. Je zbytečné s tím hned na úvod zatěžovat začínající programátory.
Registry AX, BX, CX, DX se používaly před 30 lety. V současných aplikacích jsou 32-bitové EAX, EBX..., nebo 64-bitové RAX, RBX,..., R8 až R15. Chápu, že tento výukový kurz je tak trochu retro, ale mohlo by alespoň v poznámce pod čarou být napsáno, jak vypadá asembler v současných aplikacích.

 
Odpovědět
13. dubna 10:52
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jakub Verner
Redaktor
Avatar
Odpovídá na Petr Laštovička
Jakub Verner:13. dubna 11:22

Ahoj, děkuji za komentář. Ano, tento kurz je spíše retro, ale hned v dalším díle bych se chtěl zmínit o moderním programování. Obecně tento kurz je zaměřený spíše na 16bitové aplikace atd. Chápu, že dnes se využívá spíše moderní Assembler, ale já osobně se věnuji programování OS... Takže znám Assembler z této stránky.

 
Odpovědět
13. dubna 11:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.