2. diel - Assembler - Vytvorenie NASM projektu, registre a prerušenie
V minulej lekcii, Úvod do programovania v Assemblera , sme si povedali čo to Assembler vlastne je, prečo sa ho učiť, a dokonca si aj ukázali ako vyzerá.
Dnes sa pozrieme na to, aký zvoliť software pre vývoj v ASM, založíme svoj prvý ASM projekt a povieme si čo sú to registre a prerušenia.
Software pre programovanie v ASM
Pre vývoj v ASM budeme ako pre vývoj v každom jazyku potrebovať editor kódu a prekladač. Síce nepotrebujeme prekladač vo význame prekladača programovacieho jazyka do binárky, ale stále musíme náš ASM kód nejako previesť na spustiteľnú binárku. Vieme, že píšeme inštrukcie slovami, čísla v desiatkovej sústave a tomu by počítač ešte stále nerozumel.
Editor
Vlastne je na každom z nás, aký editor kódu zvolíme, pretože súbory
budeme vždy ukladať vo forme textu, ale namiesto prípony .txt
použijeme príponu .asm
. Ja osobne dávam prednosť PSPadu,
pretože je to priamo vývojársky editor. Pre začiatok môžeme použiť ale
aj obyčajný textový editor (Poznámkový blok).
Kompilátor
Vo výsledku nechceme súbor vo forme textu, ale binárny súbor. Takéto najznámejšie kompilátory ASM do binárneho kódu sú:
- NASM - Netwide Assembler - Populárna multiplatformový ASM používajúci syntax Intel.
- FASM - Flat Assembler - Ďalšie veľmi dobrý multiplatformový prekladač ASM, je o niečo novší ako NASM.
- MASM - Microsoft Macro Assembler - Veľmi populárna Assembler, ale ako asi tušíte, je viazaný na Windows / MS-DOS a nemá otvorenú licenciu.
- GNU Assembler (GAS) - Východisková prekladač pre GCC (kompiler céčka a teda celého Linuxu), používa staršie štandard AT & T, nie Intel.
- Taśma - Možno pamätáte staršie prekladač od firmy Borland. Bol vyvíjaný v rokoch 1989-1996. Turbo Assembler podporuje len tvorbu 16 a 32-bitových programov. V určitom režime možno taśma použiť ako MASM.
NASM
My budeme používať NASM, voľba je čisto osobné a v budúcnosti si môžete vyskúšať aj ďalšie kompilery. NASM si stiahnite na https://www.nasm.us/
NASM za nás teda vlastne prevedie slová do strojového kódu. Stiahnutie a inštaláciu iste zvládnete. Pre preklad našich programov môžeme použiť príkazový riadok (CMD). Ešte efektívnejšie ale bude napísať si pomocný súbor vo skriptovacom jazyku Batch. V kurze budeme prekladať pre Windows, na Linuxe si určite zvládnete vytvoriť analogický Bash skript.
Vytvorenie prvého ASM projektu
Najprv si niekde vytvoríme novú zložku Assembler/
pre všetky
naše projekty. Tu urobíme podpriečinok Tools/
. Do zložky
Tools/
vložíme stiahnutý NASM a vrátime sa o zložku
späť.
Tam vytvoríme zložku HelloWorld/
, čo je projekt, ktorý teraz
budeme programovať. Vnútri HelloWorld/
vytvoríme ešte dve
posledné zložky. Najprv Source/
a potom Bin/
.
Zostavenie
Teraz otvoríme editor a vložíme do neho tento kód v Batch:
echo off title Assembling... cls echo Assembling Hello, World!... ..\Tools\nasm.exe -fbin -o Bin\hlwrld.com Source\hlwrld.asm echo. pause exit
Súbor uložíme ako Sestavit.bat
v priečinku
HelloWorld/
. Takto nebudeme musieť pre každú kompiláciu
opakovane písať do príkazového riadku, ale len otvoríme súbor.
Možno ste si všimli skráteného názvu hlwrld
.
To je preto, že tento program budeme spúšťať v 16-bitovom emulátora, kde
je názov súboru obmedzený na 8 znakov.
Registre a prerušenie
Pre programovanie v ASM je nutné používať registre a prerušenia. Poďme si ich vysvetliť.
Registre
Už minule sme si spomenuli, že registre sú rýchla pamäť priamo v procesore a budeme s nimi pracovať veľmi často. Sú to vlastne také predpripravené premenné, priamo vypálené v kremíkové doštičke procesore, ktorých je samozrejme obmedzený počet.
Tieto premenné sa používajú na kľúčových miestach našich programov, odovzdávame cez ne napr. Argumenty funkciám, ukladáme tam počítadlo cyklov a podobne. Keby bolo kvôli týmto operáciám potreba posielať dáta do pamäte RAM, bol by program zbytočne pomalý. Rovnako, ako pamäť RAM uľavuje pevnému disku z výkonnostných dôvodov, registre a cache v procesore uľavujú pamäti RAM.
Registre Intel 8086
Dlho mali registre 32 bitov, dnes sú aj väčšie. Rôzne registre majú rôzne označenia a účel. U prvého Intel procesora z rodiny x86, 8086, boli všetky registre 16bitové a boli rozdelené do nasledujúcich kategórií:
- Univerzálne registre (General purpose Registers)
- Indexové (Index Registers)
- Stavové a kontrolné (Status and Control Registers)
- Segmentové (Segment Registers)
Počas kurzu si ich podrobne vysvetlíme. Vidíme, že nevyhnutnou podmienkou k programovaniu v ASM teda nie je len znalosť ASM, ale aj znalosť architektúry x86.
Tieto registre ďalej existujú aj v súčasných PC, len samozrejme pribudli ďalšie modernejšie štandardy, príkladom môže byť technológie MMX Pentia a ďalšie.
Prerušenie
Registre sú teda vlastne premenné v procesore. A na čo potrebujeme prerušenie? Pri vykonávaní programu sa musí tiež obsluhovať určité hardvérové a softvérové udalosti. Za hardvérové udalosti môžeme považovať napríklad stlačenie klávesy alebo pohyb myšou. Za softvérovej napríklad ovládanie klávesnice a myši. Pri takomto prerušení dochádza k prerušeniu práve vykonávanej úlohy, ku ktorej sa procesor neskôr vráti. Od toho teda názov prerušenia, anglicky interrupt.
Mechanizmus prerušenie je nasledovné:
- Radič prerušenia dostane žiadosť o prerušenie
- Mikroprocesor prijme signál o prerušení
- Radič prerušenia vyšle na dátovú zbernicu inštrukciu
INT
+ číslo - Prebehne obsluha prerušenia
- Procesor sa vracia k pôvodnej úlohe s obnovenými registrami
Inštrukcie INT
má jediný parameter. Tento
parameter je číslo v rozsahu 0
až
255
. Podľa čísla sa vykonáva určitá hardvérová
prerušenia. Dôležitou informácií ale je, že nie všetky tieto
čísla sú obsadené hardvérovými prerušeniami, ale aj službami, ktorými
sú práve už spomínaná softvérová prerušenia. Ako príklad si
môžeme opäť uviesť známe prerušenia INT 21H
, ktoré nájdeme
v operačnom systéme MS-DOS alebo INT 80H
, ktoré
nájdeme v Linuxe. Niektoré softvérová prerušenia, ktorá
budeme používať, nám ponúka priamo BIOS (napr.
Video-prerušenie INT 10H
). To použijeme k výpisu znakov na
obrazovku.
A čo robí v prerušenia písmeno H
? Prerušenie
typicky zadávame ako číslo v šestnástkovej (Hexadacemální) sústave.
INT 10H
je teda prerušenie číslo 16.
Z pohľadu vyšších programovacích jazykov sú prerušenia ekvivalentom rozhrania, s ktorými môžeme z našich programov pracovať, podobne ako napríklad knižnice.
Pretože sa budeme zaoberať aj písaním vlastného operačného systému,
nebudeme používať prerušenia, ktorá ponúka iné operačné systémy
(napríklad MS-DOS - INT 21H
a Linux - INT 0x80
). To
ale neznamená, že sa im úplne vyhneme. Neskôr si ukážeme, ako napísať
aplikáciu pre MS-DOS a Windows, aby sme pochopili, ako je tomu u už
existujúcich operačných systémov.
Postupne sa dostaneme aj k tvorbe vlastných prerušenia, ale tým vás zatiaľ desiť nebudem:)
Týchto kódov budeme využívať pri stláčaní znakov pomocou prerušenia BIOSu.
V budúcej lekcii, Assembler - Prvý program - Hello world! , naprogramujeme svoju prvú aplikáciu v Assemblera, Vyhlasujúca text Hello world! do videopamäte.