Assemblerkeel

**Assemblerkeel** on teise põlvkonna madaltaseme programmeerimiskeel, mille käsud vastavad üksüheselt sihtprotsessori masinkoodi käskudele. Assemblerkeeles on masinakäskude kahendkoodid (nt. 11110111xx100xxx, kus x-id tähistavad operandide aadressi arvuti mälus) asendatud mnemooniliste tähistega ehk mnemokoodidega. Masinakäsu mnemokood on tavaliselt kahe, kolme või neljatäheline inglise keelest tulenev lühend. Assemblerkeel loodi masinkoodi kirjutamise lihtsustamiseks.

Assemblerkeele kohta vahel kasutatud ka sõna **assembler**, kuigi nii nimetatakse ka assemblerkeele kompilaatorit (vt assembler).

Masinkoodi puhul on programmikood binaarkujul ehk kahendarvude jadana. Assemblerkeele puhul on programmikood kirjeldatud lühikeste käskude ja nende parameetritega, kusjuures iga assemblerkeelne käsk on tõlgitav üheks või mitmeks sama funktsiooniga masinkoodi käsuks. Kui sama assemblerkeelne käsk on tõlgitav mitmeks masinkoodi käsuks, siis on seda tihti võimalik kirjutada erikujul, kus osutatakse, millist käsku parasjagu kasutatakse – sellele erikujule tõlgivad koodi ka disassemblerid.

Igat liiki protsessoril on oma masinkeel ja sellele vastav assemblerkeel. Ühele protsessorile arusaadavad käsud moodustavad käsustiku. Kõrgtaseme programmeerimiskeeled vähendavad sõltuvust protsessori eripäradest ja nendes kirjutatud kood kompileeritakse kinda protsessori käsustikule vastavateks masinakäskudeks.

## Assemblerkeele laused
Assemblerkeelne tekst koosneb lausetest, iga lause on jagatud järgmisteks väljadeks:
* märgendiväli,
* käsukoodiväli (mikroprotsessori masinakäskude loetavad nimed ehk mnemokoodid, assembleri direktiivid või makrokäsud),
* operandiväli,
* kommentaari- ehk kommendiväli.

Assembleri translaatori direkiivid lihtsustavad assemblerikeeles programmeerimist võrreldes masinakoodiga. Kasutusala järgi on pseudokäsud (ehk direktiivid) järgmised:
* Nimede defineerimise pseudokäsud, näiteks EQU

```asm
UMRK EQU VMRK+10; Anname nimele UMRK väärtuse mis on kümne võrra suurem nime VMRK väärtusest
```

* Andmete defineerimise pseudokäsud, näiteks DB, DW

```asm
ARV DB 100; Anname muutujale või konstandile ARV algväärtuse 100 ja eraldame muutujale või konstandile mälu
```

* Mälu reserveerimise pseudokäsud, näiteks DS

```asm
MASS DS 125; Eraldame massiivile MASS 125 mälupesa
```

* Pseudokäsud transleerimise juhtimiseks, näiteks ORG ja END

```asm
ORG 4000h;  Alustada aadressiloenduriga aadressist 4000h
```

Kus tähised UMRK, ARV ja MASS on programmeerija poolt valitud andmeobjektide või konstantide nimed.

Operandiväli sisaldab järgmist informatsiooni:
* operandide nimed (märgendiviited),
* arvväärtused (vahetu adresseerimine korral),
* avaldised.

## Lausete näide Inteli protsessori assemblerkeeles
Tavaliselt kirjutatakse ühele reale üks käsk, mis koosneb mõnetähelisest masinakäsu tähisest ehk mnemokoodist ja sellele järgnevatest käsu parameetritest ehk operandidest, mis eraldatakse üksteisest komaga:

```asm
MOV AX, 200
    ADD AX, 7
```

Näites on toodud kaks assemblerkeelset lauset Intel protsessori käsustiku mnemokoodis masinakäskudega. Märgendiväli mis algab alati teksti vasakust äärest (antud näites märgend puudub) ja kommentaariväli lause lõpus on tühjad.

Programmi selgitus:
:Muudab registri AX väärtuse 200-ks ja seejärel liidab sellele arvu seitse. Tulemus 207 asub nüüd registris AX.
:MOV on lühend ingliskeelsest sõnast *move* (liigutama). Käsk ADD tuleneb sõnast *add* (liitma). Käske võib kirjutada nii suurte kui väikeste tähtedega.

Ülal toodud näite assembleri poolt tõlgitud (kompileeritud) masinkood kuueteistkümnendsüsteemis kujutatuna:
:B8 C8 00
:05 07 00

## Makroassembler
Makroassembler on assembler, millele on lisatud makrodest koosneva metakeele toetus, mis võimaldab korraga töödelda terveid assemblerkeelseid plokke või programmikonstruktsioone (programmi ehitusreegleid).

## Vaata ka
*Assembler
*Masinakäsk

## Viited

## Välislingid
* Randall Hyde ''The Art of Assembly Language'' (HTML ja PDF versioon) (*Inglise keeles*)
* Introduction to assembly language (*Inglise keeles*)