Kokoonpanokieli on ohjelmointikieli, jolla voidaan suoraan kertoa tietokoneelle, mitä sen tulee tehdä. Kokoonpanokieli on lähes täsmälleen samanlainen kuin tietokoneen ymmärtämä konekoodi, paitsi että siinä käytetään ihmisen helpommin luettavia sanoja eli mnemonisia käskyjä numeroiden sijasta. Tietokone ei kuitenkaan suoranaisesti ymmärrä assembler‑lähdekoodia; sen voi muuntaa konekoodiksi ohjelma, jota kutsutaan assembleriksi. Assembler korvaa kielen sanat vastaavilla binäärisillä opkoodeilla ja usein myös linkittää ja sijoittaa dataa muistiosoitteisiin.

Miten kokoonpanokieli toimii

Assemblerilla kirjoitettu ohjelma koostuu käskyistä eli pienistä toiminto‑ohjeista, jotka prosessori suorittaa yksi kerrallaan. Nämä käskyt kertovat muun muassa:

  • mitä tietoja siirretään (esim. rekisterien ja muistin välillä),
  • mitä laskutoimituksia tehdään (lasku- ja loogiset operaatiot),
  • mitä ehtotarkastuksia suoritetaan ja mihin hyppääminen johtaa (kontrollirakenne),
  • miten kutsutaan järjestelmäpalveluita tai muita ohjelmia.

Tietokoneen osa, joka noudattaa ohjeita, on prosessori. Prosessorilla on joukko rekistereitä (pieniä ja nopeita muistiyksiköitä), funktioita käskyjen purkamiseen ja suorittamiseen sekä ohjejoukko (instruction set), joka määrittelee tuetut käskyt ja osoitusmuodot.

Käskyt, rekisterit ja osoitemuodot

Assembly‑kielessä on yleensä erilaisia käskytyyppejä, kuten:

  • Data movement (esim. MOV, LDR, STR) — siirtää tietoa rekistereiden ja muistin välillä;
  • Aritmeettiset ja loogiset (esim. ADD, SUB, AND, OR) — suorittavat laskutoimituksia;
  • Kontrollikomentoja (esim. JMP, CALL, RET) — muuttavat suorituksen kulkua;
  • Bitin käsittely ja erityisoperaatiot (skippaukset, siirrot, kertolaskun nopeutukset).

Käskyillä voi olla erilaisia osoitemuotoja: suora muistiosoite, rekisteriosoite, epäsuora osoitus rekisterin kautta, välittömät arvot (immédiates) ja indeksoidut osoitteet. Osoitemuodot vaikuttavat suorituksen nopeuteen ja koodin monimutkaisuuteen.

Assembler ja käännösprosessi

Tyypillinen kehitysvaihe kokoonpanokielellä on:

  • kirjoitetaan lähdekoodi assembler‑muodossa (tekstimuotoinen .asm‑tiedosto),
  • assembler kääntää mnemoniset käskyt binääriseksi konekoodiksi ja tuottaa objektitiedoston,
  • linkkeri yhdistää objektit ja kirjastot, korjaa viittaukset (symbolien paikannus) ja tuottaa suoritettavan tiedoston tai käynnistyskuvan (image).

Assemblerit tukevat usein myös diraatteja (directives), makroja ja aluejakoja (sections), jotka eivät ole suoria prosessorikäskyjä mutta ohjaavat käännösprosessia ja muistiasettelua.

Yksinkertainen esimerkki

Tässä pieni ja yleistävä x86‑tyyppinen esimerkkipätkä (NASM‑tyylinen syntaksi), joka näyttää käskyjä ja kommentteja:

; yksinkertainen laskuesimerkki section .text global _start  _start:     mov eax, 5    ; laita rekisteriin eax arvo 5     add eax, 3    ; lisää arvoon 3 -> eax = 8     ; yleensä jatkettaisiin esimerkiksi tulostuksella tai järjestelmäkutsulla 

Huomaa, että tämä näyttää paljon yksityiskohtia, jotka korkeammalla tasolla piilotettaisiin yhdellä käskyllä kuten PRINT.

Käyttötapaukset ja nykyaikainen rooli

Kokoonpanokieltä käytetään edelleen, kun tarvitaan:

  • erittäin tehokasta tai laitteistokohtaista koodia (boot‑koodi, käynnistyslataajat),
  • ohjaimissa ja sulautetuissa järjestelmissä, joissa resurssit ovat tiukat,
  • optimointeja suorituskykykriittisissä kohdissa (esim. kryptografia, signaalinkäsittely),
  • käänteistekniikassa ja haittaohjelmien analyysissä, joissa työskennellään suoraan konekoodin kanssa.

Suuri osa ohjelmistosta kirjoitetaan nykyään korkean tason kielillä (C, C++, Rust, Python jne.) niiden tuottaman tuottavuuden ja ylläpidettävyyden vuoksi. Korkean tason kielessä voi olla esimerkiksi yksi käsky kuten PRINT "Hello, world!", joka piilottaa kaikki pienemmät askeleet.

Edut ja haitat

  • Plussat: tarkka laitteiston hallinta, mahdollisuus maksimaaliseen optimointiin, pieni koon ja suorituskyvyn hallinta.
  • Miinukset: hankala lukea ja ylläpitää, aikaa vievä kehittää, vähemmän kannettava (eri prosessoreilla eri käskyt).

Yhteenveto

Kokoonpanokieli tarjoaa kätevän tavan kirjoittaa suoritettavaa konekoodia ihmisen luettavassa muodossa ja antaa ohjelmoijalle täydellisen hallinnan laitteiston yli. Sitä käytetään yleensä silloin, kun suorituskyky tai laitteistokohtainen kontrolli on ratkaisevaa. Useimmissa projekteissa korkean tason kielet ja modernit kääntäjät tuottavat kuitenkin paremman tuottavuuden ja ylläpidettävyyden, jolloin assemblya hyödynnetään vain tarvittaessa.