Ľudmila Jánošíková

Programovanie v jazyku symbolických adries

pre 32-bitové procesory Intel
Obsah Index
Načo je vám jazyk symbolických adries?

Jazyk symbolických adries (assembly language) je programovací jazyk na úrovni strojového kódu, avšak namiesto strojových inštrukcií v číselnom kóde sa používa ľahšie zapamätateľný symbolický inštrukčný kód a symbolické adresy. Pridelenie konkrétnych pamäťových miest jednotlivým symbolickým adresám vykonáva prekladač jazyka (assembler). Výsledný cieľový program je rovnako efektívny ako program zapísaný priamo v strojovom kóde ako z hľadiska rýchlosti, tak aj z hľadiska použitej pamäti, pretože každej výkonnej inštrukcii v jazyku symbolických adries zodpovedá práve jedna inštrukcia v strojovom kóde.

Jazyk symbolických adries (ďalej JSA, niekedy sa uchýlim k nesprávnemu, ale vžitému pojmu "assembler") sa na našej fakulte učí v rámci predmetu Strojovo orientované jazyky. Prednášky obvykle začínam otázkou, či sa už študenti s assemblerom stretli. Vždy sa niekto prihlási a obvyklá odpoveď je, že v assembleri programovali obslužné programy vstupných a výstupných zariadení, napr. zvukový výstup alebo sieťovú komunikáciu. Toto je jedna z oblastí, v ktorých sa JSA uplatní lepšie ako vyšší programovací jazyk, napr. Pascal alebo C. V  obslužných programoch zariadení sa často pristupuje k pamäťovým miestam vyhradeným na komunikáciu so zariadením, spracovávajú sa bloky dát. Na tieto účely poskytuje JSA vhodnejšie nástroje ako vyšší programovací jazyk. Aj keď moderné programovacie jazyky už majú prostriedky na prácu s pamäťovými miestami na zadaných adresách alebo s registrami procesora, je prirodzenejšie robiť takúto „jemnú“ prácu v JSA. Keď napíšete program v JSA, viete v každom momente presne, čo procesor robí. Preklad z JSA do strojového kódu sa deje v pomere 1:1. Medzi vami a počítačom nestojí prekladač vyššieho jazyka so svojimi formálnymi pravidlami. Spoliehate sa len sami na seba, premenné za vás nikto neinicializuje. Takýto bezprostredný kontakt s procesorom je predsa vzrušujúci! A vysoko efektívny! Pretože prekladač vyššieho jazyka používa pri preklade príkazov do strojového kódu formálne pravidlá, nemôže využívať registre procesora a pamäťové miesta optimálne. Preto dobrý program napísaný v JSA musí byť rýchlejší a pamäťovo úspornejší ako program vo vyššom jazyku. A napokon spomeniem ešte jeden dôvod, prečo sa učiť JSA: znalosť práce procesora a zručnosti, ktoré nadobudnete pri programovaní v JSA, vám pomôžu písať lepšie programy vo vyššom jazyku. JSA môžete využiť napríklad pri ladení programu napísaného vo vyššom jazyku, lebo ladiaci program (debugger) umožňuje zobraziť preložený program v JSA. Takže môžete vidieť, ako si prekladač poradil pri preklade a sledovať jednotlivé kroky procesora.

Neuvádzajme však len výhody JSA. Efektívnosť assemblerovského programu je zaplatená vašimi vedomosťami o procesore, pamäti, spôsoboch adresovania, atď. Pri programovaní v JSA musíte pamätať na mnohé detaily, ktoré vás pri programovaní vo vyššom jazyku nezaujímajú, napr. ako procesor nájde druhý atribút objektu, na ktorý ukazuje piata položka poľa smerníkov. Samotný zdrojový text programu v JSA je dlhší a menej prehľadný než program vo vyššom jazyku. Jeden príkaz v JSA vykoná pomerne málo. Napr. ak chceme v Pascale sčítať dve štvorbajtové celé čísla, stačí na to jeden stručný príkaz:

i := j + k;

V JSA s využitím 32-bitových registrov vykonáme rovnakú operáciu pomocou 3 príkazov:

mov eax,[j]
add eax,[k]
mov [i],eax

Ak môžeme použiť len 16-bitové registre, potrebujeme dokonca 6 príkazov:

mov ax,[j]
add ax,[k]
mov [i],ax
mov ax,[j+2]
adc ax,[k+2]
mov [i+2],ax

Sotva by ste teda v JSA programovali výpočet okružných jázd alebo simulovali výrobnú linku, aj keď to nie je nemožné. JSA využijete tam, kde treba ovládať jednotlivé činnosti procesora.

Pretože každý procesor má iné schopnosti, musí mať aj vlastnú množinu inštrukcií, a teda aj vlastný strojový jazyk. Táto učebnica sa zaoberá jazykom symbolických adries pre procesory firmy Intel a procesory kompatibilné. Väčšina postupov pri príprave programu v JSA však má všeobecnú platnosť, nie je obmedzená len na tento typ procesorov. Napokon cieľom tohto predmetu ani nie je perfektne ovládať jeden procesor (to by bolo vzhľadom na rýchly vývoj IT technológií krátkozraké), ale naučiť myslieť v assembleri. Akonáhle sa naučíte tvoriť programy v JSA pre jeden procesor, akonáhle si osvojíte myslenie na úrovni procesora, nebude vám robiť problém programovať na strojovej úrovni na inom procesore.

Skôr, ako pristúpime k popisu jednotlivých inštrukcií, zmienime sa o najnovšej mikroarchitektúre procesorov firmy Intel s názvom Core, kvôli predstave o tom, ako moderné procesory pracujú. Pritom predpokladáme, že funkcia procesora v počítači je čitateľovi známa a ovláda princípy činnosti číslicového počítača.

Budeme používať inštrukčný súbor IA-32, ktorý bol prvýkrát implementovaný v 32-bitovom procesore Intel 80386 a zostal zachovaný vo všetkých nasledujúcich procesoroch (jeho nadstavba pre 64-bitové procesory má označenie x86-64). Zoznam inštrukcií nie je úplný. Pretože učebnica pokrýva len jednosemestrový kurz programovania v jazyku symbolických adries a je určená aj pre začiatočníkov, vynechali sme málo používané a špeciálne systémové inštrukcie. Tiež pri niektorých direktívach neuvádzame ich úplný tvar so všetkými nepovinnými parametrami. Snažili sme sa, aby ste pochopili účel jednotlivých príkazov. Vyčerpávajúci výklad so všetkými parametrami a voľbami by presiahol rámec tejto učebnice. Podrobný popis inštrukcií a direktív nájdete v niektorej referenčnej príručke JSA.

Hore

Načo je vám jazyk symbolických adries?

Architektúra moderných procesorov

Registre

Spôsoby adresovania

Premenné a návestia

Symbolické konštanty

Inštrukčný súbor

Segmentové direktívy

Moduly

Služby operačného systému MS-DOS

Služby operačného systému Windows 95/98/NT/XP

Systémová úroveň vstupu a výstupu

Prostriedky pre prípravu programu

Obsah | Architektúra moderných procesorov
Vydala Žilinská univerzita v Žiline, 2000. ISBN 80-7100-723-4.
Otázky a pripomienky môžete poslať autorke.
Naposledy upravené 9.9.2011.