Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu. Zároveň využij narozeninovou akci až 80 % zdarma při nákupu e-learningu - Více informací.
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í.
Python week + discount 80

1. diel - Úvod do programovania v Assemblera

Vitajte u kurzu, v ktorom sa spolu ponoríme až do hĺbok, kam sa vôbec ako programátori môžeme dostať. Obídeme programovací jazyk aj kompiler a zistíme, ako funguje samotný stroj. Budeme posielať priamo inštrukcie procesora, pochopíme architektúru x86, BIOS, ako sa adresuje pamäť a zavádza operačný systém. Táto problematika súvisí aj s reverse-engineering, crackováním softvéru a samozrejme hackingom. Naučí vás používať nástroje ako disassembler, cheat enginy a lepšie pracovať s debuggery.

hacking

Kurz zahájme slávnu citácií:

Nechcem learn to hack, hack to learn!

Predpoklady

Kurz predpokladá znalosť aspoň základov fungovania počítača po hardvérovej stránke a skúsenosť s ľubovoľným vysokoúrovňovým programovacím jazykom (napr. C alebo Java).

Prečo sa dnes učiť Assembler?

Vždy ma zaujímalo, ako veci v základe fungujú a namiesto toho, aby som používal niečo, čo už existuje, som si radšej urobil niečo svoje. Napríklad máme doma rádio. A ja, namiesto toho, aby som ho používal, začal som sa stavbou vlastného AM rádia. A alebo väčšina z nás používa operačný systém Windows ... No a čo som asi urobil ... Áno, začal som pracovať na vlastnom operačnom systéme v Assemblera.

Čo sa tu budeme učiť je samozrejme veľmi špeciálna a úzke zameranie. Komerčne dnes tieto znalosti uplatníte vo sfére kyberbezpečnosti alebo pri programovaní pre niektoré nízkej odozvy embedded zariadenia, prípadne pre high-performance programovanie. A alebo keď sa budete chcieť pokúsiť donútiť robiť nejakú cudziu aplikáciu to, čo od nej chcete, prípadne si naprogramovať zavádzač operačného systému. To samozrejme nie je tak ľahké, ale niekde sa začať musí:)

Aby sme pochopili ako vôbec ASM funguje, pozrime sa v skratke na históriu programovacích jazykov.

Vývoj programovacích jazykov

1. generácie jazykov - Strojový kód

Procesor počítača vie vykonávať len obmedzené množstvo jednoduchých inštrukcií, ktoré sú uložené ako sekvencie bitov, sú to teda čísla. Tá sa mu zvyčajne zadávajú v hexadecimálne (šestnástkovej) sústave. Inštrukcie sú tak elementárne, že umožňujú iba napr. Prácu s registrami procesora (to je pamäť v CPU) alebo skoky. Nemožno napr. Jednoducho sčítať dve čísla, musíme sa na čísla pozerať ako na adresy v pamäti a také sčítaní čísel zaberie niekoľko inštrukcií. Program sčítající dve čísla by vyzeral napr. Takto:

2104
1105
3106
7001
0053
FFFE
0000

Inštrukcie sa procesora predloží v binárnej podobe. Takýto kód je samozrejme extrémne nečitateľný a závisí na inštrukčnú sade daného CPU. Každý počítačový program musí byť nakoniec do tohto jazyka preložený, aby mohol byť na procesore počítača spustený.

strojový kód

2. generácia jazykov - Assembler

Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

Assembler čiže JSA (jazyk symbolických inštrukcií) sa objavil niekedy v polovici 20. storočia. Konkrétne sa jednalo o jazyk druhej generácie. Od jazykov prvej generácie sa líšil tým, že namiesto toho, aby sme si museli pamätať číselné kódy inštrukcií, sme mohli písať ich slovné kódy (napríklad: MOV, CMP, ADD).

Vďaka Assemblera bolo písanie programov jednoduchšie a prehľadnejšie, než keby sme ich písali v číslach. Ďalšou výhodou bolo, že adresy v programe sa nemuseli meniť prepisovaním celého programu ako tomu bolo u prvej generácie. Čo sa týka kódu samotného, nemuseli sa opäť napr. Zložito vypočítavať adresy skokov. Kód teda začal byť vôbec ľudsky čitateľný, aj keď nie je o nič jednoduchšie, než pôvodný strojový kód.

Rovnaký program by v ASM vyzeral takto:

ORG 100
LDA A
ADD B
STA C
HLT
DEC 83
DEC –2
DEC 0
END

Vidíme, že je to trochu ľudskejší, ale stále nezainteresovaní ľudia vôbec netušia, ako program funguje.

3. generácie jazykov

Jazyky v tretej generácii konečne ponúka užívateľovi určitú abstrakciu nad tým, ako program vidí počítač, zameriavajú sa na to, ako program vidí človek. Sú označované ako tzv. Vyššej programovacie jazyky (anglicky High Level Languages, niekedy skrátene HLL). Naše čísla sú vnímaná už ako premenné, zdrojový kód pripomína matematický zápis.

Jedným z prvých vysokoúrovňových programovacích jazykov bol jazyk C. Aj keď ho predbehol Fortran alebo Pascal, tak to bol práve jazyk C, ktorý dobyl svet. Opäť ten istý programy by v jazyku C vyzeral takto:

int main(void)
{
    int a, b, c;
    a = 83;
    b = -2;
    c = a + b;
    return 0;
}

V kontraste súčasných objektovo orientovaných moderných jazykov je jazyk C často označovaný ako jazyk nízkoúrovňový. Ako to teda je? Od príchodu jazyka C skrátka ubehlo už niekoľko dekád a záleží s čím ho porovnávame. V našom kontexte s ASM je nazývaný vysokoúrovňovým, v kontexte napr. S jazykom C # .NET je naopak nízkoúrovňový.

Všetci asi tušíme, čo program robí, spočíta čísla 83 a -2 a výsledok uloží do premennej c. U všetkých jazykov tretej generácie je samozrejme výhodou vysoká čitateľnosť.

Preklad vyšších jazykov do assembleri

Tieto jazyky teda majú svoj zdrojový kód v jazyku, ktorému ľudia dobre rozumie. Zdrojový kód sa samozrejme musí preložiť do binárneho kódu, aby ho bolo možné na procesore spustiť. Tento preklad zaisťuje prekladač (kompiler), ktorý preloží naraz celý program do assembleri.

Kompiler

Ak budeme vedieť, ako vyzerajú v ASM rutiny napr. C prekladača, budeme schopní pochopiť, ako tieto programy fungujú alebo ich dokonca modifikovať, bez toho aby sme od nich mali zdrojový kód. Jedná sa ale samozrejme o veľmi komplexnú problematiku, pretože sebemenší funkcie vyústi vo veľké množstvo ASM inštrukcií a kompiler vo výslednej podobe ešte vykonáva početné optimalizácie. Poďme im venovať aspoň krátky odsek.

Optimalizácia prekladače

Keď by sme písali v čistom ASM, veľmi pravdepodobne bude náš program pomalší ako ten istý program skompilovaný napr. Z jazyka C. Ako je to možné? Kompiler totiž kód upraví tak, aby bol veľmi rýchly a to často za cenu, že je pre človeka potom zle čitateľný. Určite ste všetci niekedy použili cyklus. Ten má nejakú riadiacu premennú, podmienku a skrátka réžii navyše. Preto sa môže niekedy optimizer rozhodnúť, že bude lepšie cyklus nepřeložit, ale namiesto toho kód len niekoľkokrát zopakovať za sebou. Ak vás problematika zaujíma, odporúčam krásny článok Prekladača pod pokrievkou - optimalizácia.

Špecifiká programovanie v Assemblera

A ako teda také programovanie bez prekladača vyzerá?

Všeobecne v Assemblera (ASM) neexistujú vopred vytvorené funkcie - Nenájdeme tu žiadne PrintString(), ClearScreen(), ani SetCursorPosition(). Všetko si musíme vytvoriť sami. Ak nám beží v mašine nejaká nadstavba (napr. Operačný systém), môžeme samozrejme volať z ASM jeho API, ale tým už nepracujeme len čisto s inštrukčnou sadou a prerušeniami BIOSu.

Ešte by som rád na úvod na niečo upozornil! Je možné, že poznáte prerušenie INT 21H (k prerušením sa v kurze čoskoro dostaneme). Toto prerušenie je dostupné iba v operačnom systéme MS-DOS, čo znamená, že ho (ani ostatné) nebudeme používať. My si vystačíme s prerušeniami, ktorá ponúka BIOS.

Ukážka kódu

Na záver úvodného dielu si ukážeme a popíšeme zdrojový kód metódy PrintString pre výpis textu len pomocou rutín BIOSu. Metódu budeme používať nabudúce, kde si ju tiež vysvetlíme. Tu sa na ňu môžete pozrieť len preto, aby ste vedeli, ako programovanie v ASM vyzerá a do čoho sa to vlastne púšťame.

Metóda PrintString:

PrintString:    ; Začátek metody pro vypisování zprávy
lodsb           ; Přesuneme řetězec do registru AX
or al, al       ; Zkontrolujeme, jestli je v registru AL ještě nějaký znak, který bychom mohli vytisknout
jz short .Done  ; Pokud ne, skočíme na .Done
mov ah, 0eh     ; Registr AH naplníme hodnotou 0eh
mov bx, 7h      ; Registr BX naplníme hodnotou 7h
int 10h         ; Vytiskneme znak
jmp PrintString ; Vrátíme se na začátek metody
.Done:          ; Popisek pro návrat
ret             ; Vrátíme se na místo, odkud jsme metodu zavolali

No a to je pre dnešok všetko.

V budúcej lekcii, Assembler - Vytvorenie NASM projektu, registre a prerušenie , si založíme ASM projekt a povieme si čo sú to registre a prerušenia.


 

Všetky články v sekcii
Assembler
Preskočiť článok
(neodporúčame)
Assembler - Vytvorenie NASM projektu, registre a prerušenie
Článok pre vás napísal Jakub Verner
Avatar
Užívateľské hodnotenie:
1 hlasov
Autor se věnuje programování v x86 Assembleru.
Aktivity

 

 

Komentáre

Avatar
Jakub Verner
Člen IT Redactor Gang
Avatar
Jakub Verner:15.1.2021 15:51

Objektový Assembler? :-? Nemyslíš kompilování do formátu .OBJ?

 
Odpovedať
15.1.2021 15:51
Avatar
DarkCoder
Člen
Avatar
DarkCoder:15.1.2021 16:15

Zdá se jedná o nízkoúrovňový či vysokoúrovňový programovací jazyk není dáno programovacím paradigmem, ale tím, jak velká je odlišnost od způsobu fungování procesoru počítače.

Jazyk C je procedurální programovací jazyk, u něhož je vše založené na funkcích. Žádný uživatelsky přívětivý programovací jazyk se bez funkcí neobejde.

jenom to není tak pohodlné jako v těch "skutečných" vysokoúrovňových jazycích.

V čem je nepohodlné provést komplexní činnost programu prostým voláním funkce?

Odpovedať
15.1.2021 16:15
"Chceš-li předávat své znalosti, měj kvalitní podklady."
Avatar
Jakub Verner
Člen IT Redactor Gang
Avatar
Odpovedá na DarkCoder
Jakub Verner:15.1.2021 16:55

To je pravda. Můžeme je rozdělit podle přístupu k hardwaru a C má nízkoúrovňový přístup jenom k paměti. Proto je to tak trochu diskutabilní.

 
Odpovedať
15.1.2021 16:55
Avatar
Odpovedá na DarkCoder
Nositelka Změny:15.1.2021 19:24

Spíš jsem měla na mysli, že bez objektového programování to je někdy těžké. Třeba knihovna GLib je ukázka toho, že to bez nich jde, ale s nimi je to jednodušší a přehlednější. A asi by se toho našlo víc, ale nic mě už nenapadá.

Odpovedať
15.1.2021 19:24
j.k.j
Avatar
Jakub Verner
Člen IT Redactor Gang
Avatar
Odpovedá na DarkCoder
Jakub Verner:15.1.2021 22:17

Ale Céčkař nejsem a ani s ním nemám moc zkušeností, takže mohu říct pouze svůj názor. :-D

 
Odpovedať
15.1.2021 22:17
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Jakub Verner
Člen IT Redactor Gang
Avatar
Jakub Verner:15.1.2021 22:52

Tak si představ, že opravdu existuje objektový Assembler. Konkrétně se jmenuje High Level Assembly a podporuje pokročilejší datové typy a OOP programování. Někdy se tak prý označuje i MASM. Docela zajímavé. P.S.: Při hledání se mi podařilo narazit na to, že C je prý vyšší programovací jazyk s prvky nižšího programovacího jazyka, takže je opravdu těžké říct, co tedy je... Je pravda, že C, pokud vím, není závislý na konkrétním procesoru a má takové typické prvky vyššího programovacího jazyka (nezávislost na procesoru, větší srozumitelnost, atd.), ale na druhou stranu, jsou tam znaky, jako třeba práce s pamětí, které nahrávají tomu, že je nižší. Pokud mám být tedy konkrétní, C je multiplatformní, což z něj činí vysokoúrovňový jazyk, ale jeho přístup k paměti z něj dělá nízkoúrovňový jazyk. Jsme tedy někde mezi. Přijde mi jako takový mezikrok.

 
Odpovedať
15.1.2021 22:52
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Jakub Verner
DarkCoder:16.1.2021 12:13

C má nízkoúrovňový přístup jenom k paměti.

Nejen k paměti, ale i k hardwaru lze pomocí jazyka C přistupovat, jen to není tak přímočaré.
Ne nadarmo je jazyk C brán jako primární jazyk pro embedded systémy.

O tom, jaké jsou možnosti jazyka C k přístupu hardwaru, viz. odkaz.
Manipulating hardware with C

Pokud Tě baví assembler, nebylo by na škodu se k němu naučit C. Velmi Ti to usnadní práci a poskytne další pohled na věc a možnosti.

Odpovedať
16.1.2021 12:13
"Chceš-li předávat své znalosti, měj kvalitní podklady."
Avatar
Jakub Verner
Člen IT Redactor Gang
Avatar
Odpovedá na DarkCoder
Jakub Verner:16.1.2021 12:30

Já vím, že by mi C mohlo usnadnit práci, ale Assembler má prostě své kouzlo. Určitě není na škodu, naučit se ho, ale operáky hodlám psát výhradně v ASM. :-D Hrozně mě baví vymýšlet všechno od píky. Na druhou stranu, C je prostě takový lepší Assembler, takže proč ne. Nikdy není na škodu, umět něco víc. A děkuji za názory. :-)

 
Odpovedať
16.1.2021 12:30
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Nositelka Změny
DarkCoder:16.1.2021 12:31

Uspořádání celků do objektů je vhodné, hlavně z důvodu přehlednosti, naprosto souhlasím. Lze se však bez něj obejít. Způsob programování v C se trochu liší od ostatních jazyků, neboť se jedná o procedurální jazyk a celé je to stavěné na funkcích namísto designu, tak jak je tomu u klasických jazyků využívající OOP. Způsob, jakým se to v C řeší, je obrácený. Jasně se řekne co se má dělat a objekt se předá jako ukazatel.

Knihovna GLib je psaná v C a její zápis je rovněž typické pro programy psané v C. Takových příkladů je spousty. Namátkově další knihovny GLFW, SDL, RAYLIB, atd.

Nicméně každému vyhovuje něco jiného, proto vzniká spousta jazyků, kde každý se hodí pro něco jiného. Stačí si jen vybrat.

Odpovedať
16.1.2021 12:31
"Chceš-li předávat své znalosti, měj kvalitní podklady."
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Jakub Verner
DarkCoder:16.1.2021 12:37

Souhlasím. Čím více se ponoříš do základů, tím více pochopíš jak co funguje a můžeš tak cokoli zlepšit. :-)

Odpovedať
16.1.2021 12:37
"Chceš-li předávat své znalosti, měj kvalitní podklady."
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!