# Assembly (ohjelmointikieli)

### Wikipedia

Assembly on ohjelmointikielten alaluokka ja tarkoittaa symbolisia konekieliä. Tietokoneiden ymmärtämät konekielet koostuvat yleensä binäärimuotoisista käskyistä, jotka voidaan esittää esimerkiksi 1- ja 0-merkkien sarjoina. Symbolinen konekieli on konekielen havainnollisempi ja ihmisläheisempi esitysmuoto, joka määrittelee konekielen käskyille kirjoitetun kielen kaltaisen ulkoasun. Assembly-kielessä on siten lähes sama rakenne ja komennot kuin varsinaisessa konekielessä, mutta tekstimuotoisuus helpottaa ohjelman kirjoittamista ja ymmärtämistä. Konekieli ja siis myös assembly ovat sidonnaisia tiettyyn suoritinperheeseen.

Assembly-kielinen ohjelma muutetaan konekielelle assembleriksi nimetyllä kääntäjällä. Samaa laiteympäristöä varten voi olla useita eri syntakseja noudattavaa assembly-kieltä ja niille omat kääntäjänsä. Assembly-kieliä ovat muun muassa Intel x86 Assembly ja AT&T Assembly, jotka ovat molemmat x86-konekielen symbolisia esitysmuotoja. Sen sijaan esimerkiksi ARM-konekielen kirjoittamiseen käytetään ARM-assemblyä.

Assembly-kieli antaa ohjelmoijalle täyden määräysvallan suorittimelle syötettävän komentosarjan suhteen, ja siksi sitä käyttämällä voidaan hyödyntää tietokoneen resurssit tehokkaasti. Assemblyä ei juurikaan käytetä nykyaikaisten PC:n kaltaisten koneiden ohjelmoinnissa, paitsi erityisen laitteistoläheistä ohjelmointia vaativissa tehtävissä, kuten laiteohjaimissa, joskus myös suurta nopeutta vaativien tehtävien optimoinnissa, kuten salauksessa ja videokoodauksessa. Mobiililaitteiden ja muiden pienten sulautettujen järjestelmien ohjelmoinnissa on assemblyllä kuitenkin jonkin verran vahvempi asema. Kokonaisia ohjelmia ei tosin näillekään järjestelmille ole kovin mielekästä ohjelmoida pelkällä assemblyllä.

Korkean tason kielten kääntäjät ovat kehittyneet huomattavasti aikojen kuluessa ja se on vähentänyt tarvetta kirjoittaa konekieltä käsin. Nykyään konekieltä käytetään nostamaan pienten ja usein suoritettavien ohjelman osien nopeutta. Esimerkiksi vektorilaskutoimitukset saatettaisiin ohjelmoida konekielellä laskettavaksi vektorilaskuyksikössä, koska kääntäjä ei syystä tai toisesta tee sitä itse. Tällainen optimointi on yleistä esimerkiksi videopakkauksen purkamisessa. Toisaalta uudet suorittimet ovat sisäiseltä toiminnaltaan niin monimutkaisia, että kääntäjän tuottaman koodin kirjoittaminen käsin nopeammaksi on monesti käytännössä vaikeata tai se ei ole vaivan arvoista. Muistilatenssien kasvaminen on saanut aikaan tilanteen että tietyissä sovelluksissa muutama ylimääräinen laskutoimitus ei sinänsä hidasta ohjelman toimintaa mitenkään, koska suurin osa suoritusajasta kuluu muistin toiminnan odottamiseen. Tällaisissa tapauksissa ei ole hyödyllistä kirjoittaa koodia käsin koska muistin nopeus ei riipu siitä, mikä konekielen on tuottanut.

Lisäksi esimerkiksi tehokkaiden algoritmien ja tietorakenteiden valinta saattaa suurempia kokonaisuuksia assemblyllä kirjoittavalta jäädä pahasti taka-alalle, koska sellaisten algoritmien toteuttaminen voi olla konekielellä liian työlästä.

Puhtaan assembly-kielen käyttöä on perinteisesti puoltanut myös ohjelmakoodin tiiviys verrattuna kääntäjien tuottamaan konekieleen. Etenkin varhaisten tietokoneiden ferriittirengasmuistit, kotitietokoneiden muistit sekä sulautettujen järjestelmien ohjelmamuistit ovat olleet verrattain pieniä ja asettaneet tiukan rajan suoritettavan ohjelman koolle. Assembly-kielellä toteutettuun ohjelmaan voitiin koodata vain sovelluksen tarvitsemat toiminnot, kun taas esimerkiksi FORTRAN- tai Algol-kielellä toteutetut ohjelmat toivat aina mukanaan 'ylimääräistä' koodia. Tyypillinen kokoero oli n. 1/10 'kehittyneimpiin' kieliin nähden.

## [muokkaa] Assembly-esimerkkejä

### [muokkaa] Tekstin tulostaminen MS-DOS -käyttöjärjestelmällä

Alla on esimerkki Assembly-kielisestä ohjelmasta Intelin x86-suvun arkkitehtuureille. Ohjelmakoodissa on käytetty Intelin x86-merkintätapaa. Ohjelma on MS-DOS-käyttöjärjestelmässä suoritettava COM-tyyppinen ohjelma.

    1  org 100h
    2  section .text
    3
    4         mov ah,9
    5         mov dx,offset teksti
    6         int 21h
    7         ret
    8
    9 teksti: db 'Hei maailma!$'

Ohjelma kutsuu MS-DOS -käyttöjärjestelmän systeemikutsua, joka tulostaa annetussa muistiosoitteessa olevan tekstin "Hei maailma!".

Rivi 1 määrittelee ohjelman alkuosoitteen segmenttinsä sisällä. Com-tyyppisissä ohjelmissa alkuosoite on aina 100h.

Rivi 2 ilmoittaa kääntäjälle minkä tyyppistä aineistoa tässä kappaleessa on.

Rivi 4: luku 9 siirretään rekisteriin AH

Rivi 5: rekisteriin DX siiretään muistipaikan teksti osoite.

Rivi 6: Tulostamiseen käytetään PC:n DOS-käyttöjärjestelmien ohjelmistokeskeytystä 21h (h tarkoittaa heksalukua, luku on desimaalisena 33), jolle halutun toiminnon numero (9) annetaan rekisterissä AH. Rekisterissä DX on muistiosoite, josta haluttu $-merkkiin loppuva teksti alkaa datasegmentin ds sisällä.

Rivi 7: Rutiinin suorittamisen jälkeen palataan pääohjelmaan, mikä onnistuu com-tyyppisessä ohjelmassa pelkällä ret-käskyllä . Muuntyyppisessä ohjelmassa voi olla tarpeen käyttää ohjelmistokeskeytyksen 21h alaista toimintoa 4Ch.

Rivi 9: Tekstiin kuuluvat tavut on määritelty rivillä 9, joten ne alkavat heti ohjelmakoodin viimeisen tavun jälkeen. Tekstin alkuosoitteelle on annettu nimi (osoite) teksti. Lopussa oleva dollarin merkki päättää tulostuksen.

### [muokkaa] Fibonaccin lukujen laskeminen

Seuraava esimerkki on Fibonaccin lukujen laskija Motorola 68K-suoritinperheelle. Lasketaan n:s Fibonaccin luku antamalla n rekisterissä d0. Fibonaccin n:s luku fn lasketaan silmukassa kaavalla: fn = fn − 1 + fn − 2, ja f0 = 1 ja f1 = 1.

     1  fibonacci:      cmp.l #1,d0
     2                  bgt.b overone
     3                  moveq #1,d0
     4                  rts
     5  overone:        moveq #1,d1
     6                  moveq #1,d2
     7                  moveq #1,d3
     8  loop:           move.l d2,d4
     9                  add.l  d3,d4
    10                  move.l d3,d2
    11                  move.l d4,d3
    12                  addq.l #1,d1
    13                  cmp.l  d0,d1
    14                  bne.b  loop
    15                  move.l d4,d0
    16                  rts

Riveillä 1-4 tarkistetaan, onko d0 1 ja jos se on, lopetetaan aliohjelma ja palautetaan tuloksena 1. Rivillä 5 asetetaan silmukkalaskuri rekisterissä d1 arvoon 1. Riveillä 6 ja 7 asetetaan rekisterit d2 ja d3 arvoihin f0 ja f1. Rivillä 8 alkaa silmukka. Rivit 8 ja 9 laskevat seuraavan Fibonaccin luvun rekisteriin d4 summaamalla kaksi edellistä lukua rekistereistä d2 ja d3. Riveillä 10 ja 11 tallennetaan muistiin 2 uusinta Fibonaccin lukua rekistereihin d2 ja d3 seuraavaa kierrosta varten. Rivillä 12 kasvatetaan silmukkalaskuria yhdellä. Riveillä 13 ja 14 vertaillaan silmukkalaskuria ja n:ää. Mikäli n on saavutettu, lopetetaan silmukka. Muuten hypätään takaisin riville 8. Rivillä 15 siirretään tulos rekisteristä d4 rekisteriin d0 ja rivillä 16 poistutaan aliohjelmasta.

### [muokkaa] Esimerkeistä

Esimerkit antavat hyvän kuvan, miksi sovelluksia kehittäessä aikaa kuluu erittäin kauan ja työskentely puhtaalla assemblyllä on hankalaa. Korkeamman tason ohjelmointikielet on luotu helpottamaan tätä työtä, ja kääntäjiä käytetään muuntamaan selkeämpi kieli konekielimuotoon. Konekielet ovat kuitenkin yleensä hyvin suoraviivaisia, ja käskyjen suorittamat toiminnot ovat yksinkertaisia. Tämän vuoksi assembly-ohjelmointi on helppo opetella.

## [muokkaa] Aiheesta muualla

- (englanniksi) Assembly-opas PC:lle
- (englanniksi) Intel Itanium
- (englanniksi) x86-manuaali Sunilta Solarikselle
- (englanniksi) SPARC-manuaali Sunilta Solarikselle

## [muokkaa] Assemblereita

- A86
- flat assembler (FASM)
- GNU Assembler
- Microsoft Macro Assembler (MASM) Windows-ohjelmointiin
- Borland Turbo Assembler (TASM)
- Wolfware Assembler (WASM)
- Netwide Assembler (NASM)
- Yasm NASM yhteensopiva, AMD64 tuki

Yleisimmät ohjelmointikielet (kaikki) (muokkaa)
Tuotantokäytössä: Ada | APL | AWK | Assembly | C | C++ | C# | COBOL | Delphi | Eiffel | Fortran | Java | JavaScript | Lua | Lisp | Objective-C | Pascal | Perl | PHP | PostScript | Python | Ruby | Smalltalk | TCL | Visual Basic

Akateemiset: Haskell | Logo | ML | Prolog | Scheme |  | Historialliset: ALGOL | BASIC | Modula-3 | MUMPS | Plankalkül | PL/I | Simula

Haettu osoitteesta http://fi.wikipedia.org../../../a/s/s/Assembly_%28ohjelmointikieli%29.html

Luokka: Ohjelmointikielet

##### Views

- Artikkeli
- Keskustelu
- Nykyinen versio

##### Etsi

##### Muilla kielillä

- Bosanski
- Български
- Česky
- Dansk
- Deutsch
- Eesti
- English
- Español
- Esperanto
- Français
- 한국어
- Hrvatski
- Íslenska
- Italiano
- עברית
- Latviešu
- Magyar
- 日本語
- Norsk (bokmål)
- Português
- Русский
- Slovenščina
- Српски / Srpski
- ไทย
- 中文