Jazyk asembleru (assembly language) je nízkoúrovňový programovací jazyk, ktorý sa dá použiť na priame zadanie úlohy počítaču. Skladá sa z mnemotechnických inštrukcií (slovných kódov), ktoré veľmi úzko zodpovedajú strojovému kódu procesora. Hlavný rozdiel medzi assemblerom a strojovým kódom je v tom, že namiesto číselných kódov používa ľahšie zapamätateľné symboly (napr. MOV, ADD, JMP). Počítač sám o sebe program v jazyku assembleru nedokáže vykonať — musí ho najprv previesť do strojového kódu program nazývaný assembler (alebo assemblerový prekladač).

Základné vlastnosti

  • Nízka úroveň: jazyk pracuje priamo s inštrukčnou sadou (ISA) konkrétneho procesora, s registrami, pamäťou a bitovými operáciami.
  • Jednoznačnosť: každá inštrukcia assembleru zodpovedá jednej alebo niekoľkým presným strojovým inštrukciám.
  • Efektivita: program napísaný v assembleri môže byť veľmi rýchly a šetriť pamäť, pretože umožňuje jemné doladenie vykonávania.
  • Nízka prenositeľnosť: kód závisí od konkrétnej architektúry procesora (x86, ARM, MIPS a pod.) a spravidla nie je prenositeľný medzi rôznymi typmi CPU bez úprav.
  • Čitateľnosť: pre človeka je assemblerový kód ťažšie čitateľný a udržiavateľný než v moderných vysokoúrovňových jazykoch.

Princíp fungovania

Programy v jazyku assembleru sú zložené z krátkych inštrukcií, ktoré počítaču stanovujú konkrétne kroky. Časť počítača, ktorá tieto inštrukcie vykonáva, je procesor. Pri spustení sa assemblerový zdrojový kód spracuje assemblerom, ktorý vykoná tieto kroky:

  • prevedie mnemotechnické inštrukcie na binárne opkódy (strojový kód),
  • vyhodnotí symboly (mená premenných, štítky/labels) a vytvorí tabuľku symbolov,
  • aplikuje direktyvy (napr. rezervovanie miesta v pamäti, nastavenie segmentov),
  • vygeneruje objektový súbor, ktorý môže byť ďalej spojený (linkovaný) s inými objektovými súbormi do spustiteľného programu.

Assemblerové prekladače môžu mať rôzne režimy práce — jednoprechodové (one-pass) alebo dvojprechodové (two-pass) — v závislosti od schopnosti riešiť odkazy na symboly, ktoré ešte neboli definované pri prvom čítaní.

Komponenty assemblerového programu

  • Inštrukcie (mnemonics): napr. ADD, SUB, MOV, JMP — definujú operácie, ktoré vykoná CPU.
  • Registry: malé rýchle úložiská v procesore (napr. AX, BX, R0, R1), s ktorými inštrukcie pracujú.
  • Adresovanie: spôsoby, ako inštrukcie pristupujú k dátam — priame, nepriamé, indexované, relativne atď.
  • Štítky (labels): symbolické mená pre adresy v kóde alebo dátach, používané na skoky a odkazy.
  • Direktívy (pseudo-inštrukcie): pokyny pre assembler, ktoré nevytvárajú strojový kód (napr. .data, .text, .org, .equ).
  • Makrá: zoskupenia inštrukcií nahrádzané počas zloženia, uľahčujú opakovateľné vzory a abstrakciu.

Výhody a nevýhody

  • Výhody:
    • možnosť vysokého výkonu a veľmi presnej kontroly nad hardvérom,
    • malé pamäťové nároky a optimálne využitie prostriedkov, vhodné pre embedded systémy, bootloadery a systémový softvér,
    • nevyhnutný pri písaní kódu závislého na architektúre, napr. ovládače, časovo kritické rutiny.
  • Nevýhody:
    • veľká pracovná náročnosť pri tvorbe a údržbe kódu,
    • nízka prenositeľnosť medzi rôznymi CPU,
    • vyššie riziko chýb (napr. chybné adresovanie alebo riadenie zásobníka).

Praktické použitie

Asembler sa dnes používa najmä tam, kde je potrebná priama komunikácia s hardvérom alebo extrémna optimalizácia výkonu. Typické oblasti použitia:

  • firmvér a bootloadery (napr. štartovanie počítača alebo mikrokontroléra),
  • ovládače zariadení a systémové moduly operačných systémov,
  • vložené (embedded) systémy s obmedzenými prostriedkami,
  • kritické časové úlohy (realtime systémy),
  • vzdelávanie — porozumenie fungovaniu CPU a OS na nízkej úrovni.

Krátky príklad

Nižšie je ukážka jednoduchého assemblerového fragmentu (x86 štýl) so stručným popisom:

 ; nastavenie hodnoty 1 do registra AX a návrat MOV AX, 1      ; uložiť 1 do AX RET            ; návrat z funkcie 

Tento kód pozostáva z dvoch inštrukcií, ktoré procesor prevedie na príslušné binárne opkódy počas assemblovania.

Záver

Jazyk assembleru predstavuje most medzi človekom a strojom — nie je určený pre rýchly vývoj veľkých aplikácií, ale pre situácie, kde je potrebná maximálna kontrola nad hardvérom a efektivitou. Zatiaľ čo moderné vysokoúrovňové jazyky poskytujú pohodlie a prenositeľnosť (napr. jediná inštrukcia PRINT "Hello, world!" za vás vykoná mnoho vnútorných krokov), assemblerový kód odhaľuje a umožňuje riadiť tie malé kroky, ktoré sa vykonávajú na najnižšej úrovni.