Assembleri keel on programmeerimiskeel, mida saab kasutada selleks, et öelda otse arvutile, mida teha. Assembleri keel on peaaegu täpselt nagu masinkood, millest arvuti saab aru, ainult et selles kasutatakse numbrite asemel sõnu. Arvuti ei saa assembleriprogrammist otse aru. Siiski saab ta programmi hõlpsasti muuta masinkoodiks, asendades programmi sõnad numbritega, mida need tähistavad. Programmi, mis seda teeb, nimetatakse assembleriks.
Assembleri keeles kirjutatud programmid koosnevad tavaliselt käskudest, mis on väikesed ülesanded, mida arvuti programmi käivitamisel täidab. Neid nimetatakse käskudeks, sest programmeerija kasutab neid, et anda arvutile juhiseid, mida teha. Arvuti osa, mis järgib juhiseid, on protsessor.
Arvuti koostekeel on madala taseme keel, mis tähendab, et sellega saab teha ainult lihtsaid ülesandeid, millest arvuti saab otseselt aru. Keerulisemate ülesannete täitmiseks tuleb arvutile öelda iga lihtsa ülesande osa, mis on osa keerulisest ülesandest. Näiteks ei saa arvuti aru, kuidas printida ekraanile lause. Selle asemel peab assembleris kirjutatud programm talle ütlema, kuidas teha kõiki väikseid samme, mis on seotud lause trükkimisega.
Selline koosteprogramm koosneks paljudest, paljudest käskudest, mis koos teevad midagi, mis tundub inimesele väga lihtne ja elementaarne. Seetõttu on inimesel raske assemblerprogrammi lugeda. Seevastu kõrgetasemelises programmeerimiskeeles võib olla üks käsk, näiteks PRINT "Hello, world!", mis ütleb arvutile, et ta täidaks teie eest kõik väikesed ülesanded.
Kuidas assembler töötab
Assembler on programm, mis tõlgib inimesele loetava assembleerkoodi masinkoodiks (binaarseteks opkoodideks). Iga assemblerikäsk vastab tavaliselt ühele või mõnele masinkoodikäskule. Lisaks käskudele sisaldab assembleerkood sageli silte (labels), konstandeid ja direktiive (nt muutuja mälu reserveerimiseks), mida assembler kasutab kompileerimise ajal.
Põhimõisted
- Registrid — väikesed, kiired mälukohad protsessoris (nt eax, ebx või r0, r1), mida käsud kasutavad andmete hoidmiseks ja töötlemiseks.
- Adreseerimine — viisid, kuidas käsk viitab andmetele: otsene, kaudne, indeksiga jms.
- Opkood — käsk ise (nt MOV, ADD, JMP), mis ütleb protsessorile, mida teha.
- Sildid — nimed, mis tähistavad aadresse programmiloogika juhtimiseks (nt hüpped ja tsüklid).
- Direktiivid — assembleri juhised, mis ei tundu protsessorile (nt .data, .text, reservatsioonid), kuid aitavad linkida ja paigutada koodi ning andmeid.
Näide
Lihtne assembleerinäide (süntaks varieerub arhitektuuri ja assembleri järgi):
MOV eax, 1 ADD eax, ebx JMP loop_start
Siin on kolm käsku: andmete liigutamine registrisse, liitmine ja hüpe. Assembler teisendab need vastavateks masinkoodibaitideks.
Eelised ja puudused
- Eelised: kõrge täpsus ja kontroll riistvara üle, väga suur jõudlus ja väiksem mälukasutus, võimalus optimeerida kriitilisi kohti (nt operatsioonisüsteemide tuumad, sisseehitatud süsteemid).
- Puudused: keeruline kirjutada ja hooldada, arhitektuurispetsiifiline (ülalolev kood ei tööta teisel protsessoril ilma ümberkirjutamiseta), ajakulukas arendamine ja vigade leidmine.
Kus ja miks kasutatakse assemblerit tänapäeval
Kuigi enamik rakendusi kirjutatakse nüüd kõrgema taseme keeltes (nt C, C++, Rust, Python), kasutatakse assemblerit sihtkohtades, kus on oluline maksimaalne kiirus, minimaalne mälukasutus või otsene riistvaraga suhtlemine. Tüüpilised valdkonnad on:
- operatsioonisüsteemide ja draiverite arendus;
- embedded-süsteemid ja mikrokontrollerid;
- täiustatud jõudlusega algoritmide optimeerimine;
- turva- ja krüptograafilised algoritmid, kus oluline on täpne kontroll käitumise üle;
- taastustööriistad (disassemblerid) ning pahavarauuringud.
Tööriistad ja õppimine
Assembleeri õppimiseks kasutatakse tavaliselt järgmisi tööriistu: assemblerid (nt NASM, MASM, GAS), linkijad, debuggereid (nt GDB) ja emulaatoreid. Hea õppeprotsess hõlmab arvuti arhitektuuri mõistmist (kuidas töötab protsessor, registrid, mäluaadressimine), lihtsate programmidest alustamist ning järkjärgulist keerukamate struktuuride juurde liikumist.
Kokkuvõte
Assembleri keel on madala taseme programmeerimisvahend, mis annab programmeerijale peaaegu täieliku kontrolli masina üle, kuid nõuab samas palju detailset tööd. See annab parima jõudluse ja väikseima mälukasutuse õigetes olukordades, kuid on vähem mugav ja vähem ülekantav kui kõrgema taseme keeled. Isegi kui igapäevane arendus toimub kõrgemate keeltega, on assembleeri mõistmine kasulik, et paremini aru saada, kuidas arvutid töötavad allpool abstraktsiooni kihti.