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 4 - Assembler - Vytvoření NASM projektu, registry a přerušení

V minulé lekci, Hello world v ASM ve Windows, jsme si vytvořili první jednoduchý program.

Dnes se podíváme na to, jaký zvolit software pro vývoj v ASM, založíme svůj první ASM projekt a řekneme si co jsou to registry a přerušení.

Software pro programování v ASM

Pro vývoj v ASM budeme jako pro vývoj v každém jazyce potřebovat editor kódu a překladač. Sice nepotřebujeme překladač ve významu překladače programovacího jazyka do binárky, ale stále musíme náš ASM kód nějak převést na spustitelnou binárku. Víme, že píšeme instrukce slovy, čísla v desítkové soustavě a tomu by počítač ještě stále nerozuměl.

Editor

Vlastně je na každém z nás, jaký editor kódu zvolíme, protože soubory budeme vždy ukládat ve formě textu, ale namísto přípony .txt použijeme příponu .asm. Já osobně dávám přednost PSPadu, jelikož je to přímo vývojářský editor. Pro začátek můžeme použít ale i obyčejný textový editor (Poznámkový blok).

Kompilátor

Ve výsledku nechceme soubor ve formě textu, ale binární soubor. Takové nejznámější kompilátory ASM do binárního kódu jsou:

  • NASM - Netwide Assembler - Populární multiplatformní ASM používající syntaxi Intel.
  • FASM - Flat Assembler - Další velmi dobrý multiplatformní překladač ASM, je o něco novější než NASM.
  • MASM - Microsoft Macro Assembler - Velmi populární Assembler, ale jak asi tušíte, je vázán na Windows/MS-DOS a nemá otevřenou licenci.
  • GNU Assembler (GAS) - Výchozí překladač pro GCC (kompiler céčka a tedy celého Linuxu), používá starší standard AT&T, ne Intel.
  • TASM - Možná pamatujete starší překladač od firmy Borland. Byl vyvíjen v letech 1989-1996. Turbo Assembler podporuje jen tvorbu 16 a 32bitových programů. V určitém režimu lze TASM použít jako MASM.

NASM

My budeme používat NASM, volba je čistě osobní a v budoucnu si můžete vyzkoušet i další kompilery. NASM si stáhněte na https://www.nasm.us/

NASM za nás tedy vlastně převede slova do strojového kódu. Stažení a instalaci jistě zvládnete. Pro překlad našich programů můžeme použít příkazový řádek (CMD). Ještě efektivnější ale bude napsat si pomocný soubor ve skriptovacím jazyce Batch. V kurzu budeme překládat pro Windows, na Linuxu si určitě zvládnete vytvořit analogický Bash skript.

Vytvoření prvního ASM projektu

Nejprve si někde vytvoříme novou složku Assembler/ pro všechny naše projekty. Zde uděláme podsložku Tools/. Do složky Tools/ vložíme stažený NASM a vrátíme se o složku zpět.

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

Tam vytvoříme složku HelloWorld/, což je projekt, který nyní budeme programovat. Uvnitř HelloWorld/ vytvoříme ještě dvě poslední složky. Nejprve Source/ a poté Bin/.

Sestavení

Nyní otevřeme editor a vložíme do něj 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

Soubor uložíme jako Sestavit.bat ve složce HelloWorld/. Takto nebudeme muset pro každou kompilaci opakovaně psát do příkazového řádku, ale jen otevřeme soubor.

Možná jste si všimli zkráceného názvu hlwrld. To je proto, že tento program budeme spouštět v 16-bitovém emulátoru, kde je název souboru omezený na 8 znaků.

Registry a přerušení

Pro programování v ASM je nutné používat registry a přerušení. Pojďme si je vysvětlit.

Registry

Již minule jsme si zmínili, že registry jsou rychlá paměť přímo v procesoru a budeme s nimi pracovat velmi často. Jsou to vlastně takové předpřipravené proměnné, přímo vypálené v křemíkové destičce procesoru, kterých je samozřejmě omezený počet.

Počítačový procesor

Tyto proměnné se používají na klíčových místech našich programů, předáváme přes ně např. argumenty funkcím, ukládáme tam počítadlo cyklů a podobně. Kdyby bylo kvůli těmto operacím potřeba posílat data do paměti RAM, byl by program zbytečně pomalý. Stejně, jako paměť RAM ulevuje pevnému disku z výkonnostních důvodů, registry a cache v procesoru ulevují paměti RAM.

Registry Intel 8086

Dlouho měly registry 32 bitů, dnes jsou i větší. Různé registry mají různá označení a účel. U prvního Intel procesoru z rodiny x86, 8086, byly všechny registry 16bitové a byly rozdělené do následujících kategorií:

  • Univerzální registry (General purpose registers)
  • Indexové (Index registers)
  • Stavové a kontrolní (Status and Control registers)
  • Segmentové (Segment registers)

Během kurzu si je podrobně vysvětlíme. Vidíme, že nutnou podmínkou k programování v ASM tedy není jen znalost ASM, ale i znalost architektury x86.

Tyto registry dále existují i v současných PC, jen samozřejmě přibyly další modernější standardy, příkladem může být technologie MMX Pentií a další.

Přerušení

Registry jsou tedy vlastně proměnné v procesoru. A na co potřebujeme přerušení? Při vykonávání programu se musí také obsluhovat určité hardwarové a softwarové události. Za hardwarové události můžeme považovat například stisk klávesy nebo pohyb myší. Za softwarové například ovládání klávesnice a myši. Při takovém přerušení dochází k přerušení právě prováděné úlohy, ke které se procesor později vrátí. Od toho tedy název přerušení, anglicky interrupt.

Mechanismus přerušení je následující:

  1. Řadič přerušení dostane žádost o přerušení
  2. Mikroprocesor přijme signál o přerušení
  3. Řadič přerušení vyšle na datovou sběrnici instrukci INT + číslo
  4. Proběhne obsluha přerušení
  5. Procesor se vrací k původní úloze s obnovenými registry

Instrukce INTjediný parametr. Tento parametr je číslo v rozsahu 0255. Podle čísla se provádí určitá hardwarová přerušení. Důležitou informací ale je, že ne všechna tato čísla jsou obsazena hardwarovými přerušeními, ale i službami, kterými jsou právě již zmíněná softwarová přerušení. Jako příklad si můžeme opět uvést známé přerušení INT 21H, které nalezneme v operačním systému MS-DOS nebo INT 80H, které nalezneme v Linuxu. Některá softwarová přerušení, která budeme používat, nám nabízí přímo BIOS (např. video-přerušení INT 10H). To použijeme k výpisu znaků na obrazovku.

A co dělá v přerušení písmeno H? Přerušení typicky zadáváme jako číslo v šestnáctkové (Hexadacemální) soustavě. INT 10H je tedy přerušení číslo 16.

Z pohledu vyšších programovacích jazyků jsou přerušení ekvivalentem rozhraní, s kterými můžeme z našich programů pracovat, podobně jako třeba knihovny.

Protože se budeme zabývat i psaním vlastního operačního systému, nebudeme používat přerušení, která nabízí jiné operační systémy (například MS-DOS - INT 21H a Linux - INT 0x80). To ale neznamená, že se jim úplně vyhneme. Později si ukážeme, jak napsat aplikaci pro MS-DOS a Windows, abychom pochopili, jak je tomu u již existujících operačních systémů.

Postupně se dostaneme i k tvorbě vlastních přerušení, ale tím vás zatím děsit nebudu :)

Těchto kódů budeme využívat při tisknutí znaků pomocí přerušení BIOSu.

V příští lekci, Assembler - První program - Hello world!, naprogramujeme svou první aplikaci v Assembleru, vypisující text Hello world! do videopaměti.


 

Předchozí článek
Hello world v ASM ve Windows
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?
4 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 (4)

 

 

Komentáře

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.

Zatím nikdo nevložil komentář - buď první!