b'\n_START_ARTICLE_\nAssembly (ohjelmointikieli)\n_START_PARAGRAPH_\nAssembly eli assembler on ohjelmointikieli, joka on l\xc3\xa4hell\xc3\xa4 konekielt\xc3\xa4. Toinen nimitys assembly-kielelle on symbolinen konekieli._NEWLINE_Konekieli on suorittimen tai vastaavan laitteen ymm\xc3\xa4rt\xc3\xa4m\xc3\xa4 kieli._NEWLINE_Konekielen k\xc3\xa4skyt ovat lukujonoja, ja siksi vaikeita muistaa sek\xc3\xa4 hahmottaa koodia kirjoitettaessa. Siksi konekielen kirjoittamisen sijaan k\xc3\xa4ytet\xc3\xa4\xc3\xa4n yleens\xc3\xa4 assembly\xc3\xa4. Assembly-ohjelma muutetaan konekieliseksi assembler-k\xc3\xa4\xc3\xa4nt\xc3\xa4j\xc3\xa4ll\xc3\xa4._NEWLINE_Assembly-ohjelma koostuu k\xc3\xa4skyist\xc3\xa4 (engl. mnemonics) ja niihin liittyv\xc3\xa4t operandeista, jotka vastaavat konekielen k\xc3\xa4skyj\xc3\xa4. Lis\xc3\xa4ksi assembly-kielisess\xc3\xa4 ohjelmassa on muistiosoitteiden nimi\xc3\xa4 ja muita apusanoja._NEWLINE_Assemblyn k\xc3\xa4yt\xc3\xb6n varjopuolia verrattuna C:n tyyppisiin korkean tason kieliin ovat muun muassa ohjelmoinnin vaikeus, hitaus ja virhealttius. Assemblyn k\xc3\xa4ytt\xc3\xb6 vaatii taitoa ja erityist\xc3\xa4 tarkkuutta._NEWLINE_Assembly-kieli on huonosti siirrett\xc3\xa4v\xc3\xa4 kieli eri prosessoreiden v\xc3\xa4lill\xc3\xa4. Eri prosessorityypeille on erilaiset assembly-ohjelmat, elleiv\xc3\xa4t prosessorit ole kesken\xc3\xa4\xc3\xa4n yhteensopivia. Assembly\xc3\xa4 vaivaa my\xc3\xb6s assembler-k\xc3\xa4\xc3\xa4nt\xc3\xa4jien erilaisuus esim. PC-maailmassa. Eri valmistajien tekem\xc3\xa4t assembly-k\xc3\xa4\xc3\xa4nt\xc3\xa4j\xc3\xa4t saattavat erota toisistaan huomattavasti, vaikka prosessori olisikin sama._NEWLINE_Assemblyn vahvin puoli on sill\xc3\xa4 tuotetun ohjelman nopeus. Assembly on my\xc3\xb6s melko helppo oppia, koska sen k\xc3\xa4skyt ovat melko yksinkertaisia._NEWLINE_Assembleria on k\xc3\xa4ytetty monesti korkean tason kielten ohella nopeuttamaan ohjelman ajoa joissain kohdissa._NEWLINE_Korkean tason kielen k\xc3\xa4\xc3\xa4nt\xc3\xa4j\xc3\xa4t, esimerkiksi GCC, osaavat k\xc3\xa4\xc3\xa4nt\xc3\xa4\xc3\xa4 ns. inline-assembly\xc3\xa4.\n_START_SECTION_\nAssembly, symbolinen konekieli\n_START_PARAGRAPH_\nAssembly on ohjelmointikielten alaluokka ja tarkoittaa symbolisia konekieli\xc3\xa4. Tietokoneiden ymm\xc3\xa4rt\xc3\xa4m\xc3\xa4t konekielet koostuvat yleens\xc3\xa4 bin\xc3\xa4\xc3\xa4rimuotoisista k\xc3\xa4skyist\xc3\xa4, jotka voidaan esitt\xc3\xa4\xc3\xa4 esimerkiksi 1- ja 0-merkkien sarjoina._NEWLINE_Er\xc3\xa4s Intelin 8086 suorittimen konekielen k\xc3\xa4sky siirt\xc3\xa4\xc3\xa4 luvun 97 rekisteriin AL:_NEWLINE_ 10110000 01100001_NEWLINE_Monesti t\xc3\xa4m\xc3\xa4 esitet\xc3\xa4\xc3\xa4n heksadesimaalilukuna lyhyemm\xc3\xa4n esitysmuodon vuoksi:_NEWLINE_ B0 61_NEWLINE_Assemblyll\xc3\xa4 k\xc3\xa4sky n\xc3\xa4ytt\xc3\xa4\xc3\xa4 viel\xc3\xa4 selke\xc3\xa4mm\xc3\xa4lt\xc3\xa4:_NEWLINE_MOV AL, 61h       ; Kommentti: Siirr\xc3\xa4 AL-rekisteriin luku 97 , mik\xc3\xa4 on heksadesimaalilukuna 61 h (61 hex)_NEWLINE_Esimerkiss\xc3\xa4 "MOV" on k\xc3\xa4sky ja 61h operandi. Kyseist\xc3\xa4 syntaksia k\xc3\xa4ytet\xc3\xa4\xc3\xa4n esimerkiksi MASM:issa, jossa operandit ovat j\xc3\xa4rjestyksess\xc3\xa4 kohde, l\xc3\xa4hde eli "al, 61h"_NEWLINE_GNU Assemblerissa (GAS) k\xc3\xa4ytetyll\xc3\xa4 AT&T:n syntaksilla operandit ovat j\xc3\xa4rjestyksess\xc3\xa4 l\xc3\xa4hde, kohde._NEWLINE_ movb    $0x61, %al_NEWLINE_Symbolinen konekieli on konekielen havainnollisempi ja ihmisl\xc3\xa4heisempi esitysmuoto, joka m\xc3\xa4\xc3\xa4rittelee konekielen k\xc3\xa4skyille kirjoitetun kielen kaltaisen ulkoasun. Assembly-kieless\xc3\xa4 on siten l\xc3\xa4hes sama rakenne ja komennot kuin varsinaisessa konekieless\xc3\xa4, mutta tekstimuotoisuus helpottaa ohjelman kirjoittamista ja ymm\xc3\xa4rt\xc3\xa4mist\xc3\xa4. Lis\xc3\xa4ksi eri muistiosoitteisiin viitataan assemblyssa usein nimin ja itse muistiosoite voidaan antaa assemblerin m\xc3\xa4\xc3\xa4ritelt\xc3\xa4v\xc3\xa4ksi. Konekieli ja siis my\xc3\xb6s assembly ovat sidonnaisia tiettyyn suoritinperheeseen._NEWLINE_Assembly-kielinen ohjelma muutetaan konekielelle assembleriksi nimetyll\xc3\xa4 k\xc3\xa4\xc3\xa4nt\xc3\xa4j\xc3\xa4ll\xc3\xa4. Samaa laiteymp\xc3\xa4rist\xc3\xb6\xc3\xa4 varten voi olla useita eri syntakseja riippuen k\xc3\xa4ytetyst\xc3\xa4 assembler-ohjelmasta (esimerkiksi MASM, GAS). Muilla suorittimilla on omat eronsa ja ohjelmansa._NEWLINE_Esimerkiksi 32-bittisen kokonaisluvun, jonka arvo on "5" siirt\xc3\xa4minen datarekisteriin d0 Motorola 68000:n suorittimella:_NEWLINE_ move.l    #5, d0\n_START_SECTION_\nAssemblyn k\xc3\xa4ytt\xc3\xb6kohteet\n_START_PARAGRAPH_\nAssembly antaa ohjelmoijalle t\xc3\xa4yden m\xc3\xa4\xc3\xa4r\xc3\xa4ysvallan suorittimelle sy\xc3\xb6tett\xc3\xa4v\xc3\xa4n komentosarjan suhteen, ja siksi sit\xc3\xa4 k\xc3\xa4ytt\xc3\xa4m\xc3\xa4ll\xc3\xa4 voidaan hy\xc3\xb6dynt\xc3\xa4\xc3\xa4 tietokoneen resurssit tehokkaasti. Assembly\xc3\xa4 k\xc3\xa4ytettiin kotimikrojen alkuaikoina melko yleisesti. Esimerkiksi MS-DOS-k\xc3\xa4ytt\xc3\xb6j\xc3\xa4rjestelm\xc3\xa4, taulukkolaskentaohjelma Lotus 1-2-3 ja l\xc3\xa4hes kaikki Commodore 64:n sek\xc3\xa4 useimmat Amigan kaupalliset videopelit ohjelmoitiin assemblyll\xc3\xa4._NEWLINE_Puhtaan assembly-kielen k\xc3\xa4ytt\xc3\xb6\xc3\xa4 on perinteisesti puoltanut ohjelmakoodin tiiviys verrattuna k\xc3\xa4\xc3\xa4nt\xc3\xa4jien tuottamaan konekieleen. Etenkin varhaisten tietokoneiden ferriittirengasmuistit, kotitietokoneiden muistit sek\xc3\xa4 sulautettujen j\xc3\xa4rjestelmien ohjelmamuistit ovat olleet verrattain pieni\xc3\xa4 ja asettaneet tiukan rajan suoritettavan ohjelman koolle. Assembly-kielell\xc3\xa4 toteutettuun ohjelmaan voitiin koodata vain sovelluksen tarvitsemat toiminnot, kun taas esimerkiksi FORTRAN- tai Algol-kielell\xc3\xa4 toteutetut ohjelmat toivat aina mukanaan ylim\xc3\xa4\xc3\xa4r\xc3\xa4ist\xc3\xa4 koodia; tyypillisesti suoraan assemblyll\xc3\xa4 toteutettu ohjelma oli noin 1/10 korkean tason kielell\xc3\xa4 tuotettua ohjelmaa pienempi. Kokoedun takia esimerkiksi kiintolevyn alussa oleva k\xc3\xa4ynnistyskoodi kirjoitetaan nyky\xc3\xa4\xc3\xa4nkin assemblyll\xc3\xa4._NEWLINE_Sovellusohjelmien osalta t\xc3\xa4llainen optimointi ei kuitenkaan yleens\xc3\xa4 en\xc3\xa4\xc3\xa4 ole mielek\xc3\xa4st\xc3\xa4, eik\xc3\xa4 assembly\xc3\xa4 juurikaan k\xc3\xa4ytet\xc3\xa4 nykyaikaisten, PC:n kaltaisten koneiden eik\xc3\xa4 my\xc3\xb6sk\xc3\xa4\xc3\xa4n \xc3\xa4lypuhelinten sovellusohjelmoinnissa. Sovellusohjelmat ovat niin isoja, ettei niit\xc3\xa4 voi mielekk\xc3\xa4\xc3\xa4sti hallita assembly-tasolla. Suorittimet ovat my\xc3\xb6s niin tehokkaita, ett\xc3\xa4 koodin nopeutuksella saatava hy\xc3\xb6ty ei yleens\xc3\xa4 ole vaivan arvoista. Pullonkaulat ovat yleens\xc3\xa4 muualla, kuten I/O-operaatioiden ja sivutuksen aiheuttamassa viiveess\xc3\xa4. Korkean tason ohjelmointikielten k\xc3\xa4\xc3\xa4nt\xc3\xa4j\xc3\xa4t ovat my\xc3\xb6s kehittyneet, ja samalla suorittimet sis\xc3\xa4iselt\xc3\xa4 toiminnaltaan monimutkaistuneet niin, ett\xc3\xa4 k\xc3\xa4\xc3\xa4nt\xc3\xa4j\xc3\xa4 tuottaa useimmiten tehokkaampaa koodia kuin mit\xc3\xa4 k\xc3\xa4sin ohjelmoimalla voisi saada aikaan, varsinkaan kohtuullisella ty\xc3\xb6m\xc3\xa4\xc3\xa4r\xc3\xa4ll\xc3\xa4. Lis\xc3\xa4ksi esimerkiksi tehokkaiden algoritmien ja tietorakenteiden valinta saattaa suurempia kokonaisuuksia assemblyll\xc3\xa4 koodattaessa j\xc3\xa4\xc3\xa4d\xc3\xa4 pahasti taka-alalle, koska niiden toteuttaminen voi olla konekielell\xc3\xa4 liian ty\xc3\xb6l\xc3\xa4st\xc3\xa4._NEWLINE_Sulautettujen j\xc3\xa4rjestelmien ohjelmoinnissa on assemblyll\xc3\xa4 jonkin verran vahvempi asema kuin PC-koneiden ohjelmoinnissa. Kokonaisia ohjelmia ei silti n\xc3\xa4illek\xc3\xa4\xc3\xa4n j\xc3\xa4rjestelmille ole mielek\xc3\xa4st\xc3\xa4 ohjelmoida pelk\xc3\xa4ll\xc3\xa4 assemblyll\xc3\xa4._NEWLINE_Erityistilanteissa assemblyll\xc3\xa4 on kuitenkin viel\xc3\xa4 t\xc3\xa4rke\xc3\xa4 asema. Sit\xc3\xa4 voi tarvita laitteistol\xc3\xa4heist\xc3\xa4 ohjelmointia vaativissa teht\xc3\xa4viss\xc3\xa4, kuten laiteohjainten kehityksess\xc3\xa4. Viel\xc3\xa4 toisinaan assemblyll\xc3\xa4 on k\xc3\xa4ytt\xc3\xb6\xc3\xa4 my\xc3\xb6s tehokkuutta vaativissa sovelluksissa, kuten salauksessa tai videon koodauksessa, kun ohjelman osia optimoidaan. N\xc3\xa4iss\xc3\xa4kin tapauksissa assemblyll\xc3\xa4 koodataan mahdollisimman pieni osa. K\xc3\xa4\xc3\xa4nt\xc3\xa4j\xc3\xa4n tuottamaa assembly-koodia analysoimalla voidaan l\xc3\xb6yt\xc3\xa4\xc3\xa4 keinoja korjata korkeamman tason koodia ja k\xc3\xa4\xc3\xa4nt\xc3\xa4j\xc3\xa4lle annettavia ohjeita, kunnes tulos on haluttu. Koodin ymm\xc3\xa4rt\xc3\xa4minen assembly-tasolla on joskus t\xc3\xa4rke\xc3\xa4\xc3\xa4 my\xc3\xb6s vianetsinn\xc3\xa4ss\xc3\xa4.\n_START_SECTION_\nTekstin tulostaminen MS-DOS -k\xc3\xa4ytt\xc3\xb6j\xc3\xa4rjestelm\xc3\xa4ll\xc3\xa4\n_START_PARAGRAPH_\nAlla on esimerkki Assembly-kielisest\xc3\xa4 ohjelmasta Intelin x86-suvun arkkitehtuureille. Ohjelmakoodissa on k\xc3\xa4ytetty Intelin x86-merkint\xc3\xa4tapaa. Ohjelma on MS-DOS-k\xc3\xa4ytt\xc3\xb6j\xc3\xa4rjestelm\xc3\xa4ss\xc3\xa4 suoritettava COM-tyyppinen ohjelma._NEWLINE_1  org 100h_NEWLINE_2  section .text_NEWLINE_3_NEWLINE_4         mov ah,9h_NEWLINE_5         mov dx,offset teksti_NEWLINE_6         int 21h_NEWLINE_7         ret_NEWLINE_8_NEWLINE_9 teksti: db \'Hei maailma!$\'_NEWLINE_Ohjelma kutsuu MS-DOS -k\xc3\xa4ytt\xc3\xb6j\xc3\xa4rjestelm\xc3\xa4n j\xc3\xa4rjestelm\xc3\xa4kutsua, joka tulostaa annetussa muistiosoitteessa olevan tekstin "Hei maailma!"._NEWLINE_Rivi 1 m\xc3\xa4\xc3\xa4rittelee ohjelman alkuosoitteen segmenttins\xc3\xa4 sis\xc3\xa4ll\xc3\xa4. Com-tyyppisiss\xc3\xa4 ohjelmissa alkuosoite on aina 100h._NEWLINE_Rivi 2 ilmoittaa k\xc3\xa4\xc3\xa4nt\xc3\xa4j\xc3\xa4lle, mink\xc3\xa4 tyyppist\xc3\xa4 aineistoa t\xc3\xa4ss\xc3\xa4 kappaleessa on._NEWLINE_Rivi 4: heksaluku 9 siirret\xc3\xa4\xc3\xa4n rekisteriin AH._NEWLINE_Rivi 5: rekisteriin DX siirret\xc3\xa4\xc3\xa4n muistipaikan teksti osoite._NEWLINE_Rivi 6: Tulostamiseen k\xc3\xa4ytet\xc3\xa4\xc3\xa4n PC:n DOS-k\xc3\xa4ytt\xc3\xb6j\xc3\xa4rjestelmien ohjelmistokeskeytyst\xc3\xa4 21h (h tarkoittaa heksalukua, luku on desimaalisena 33), jolle halutun toiminnon numero (9) annetaan rekisteriss\xc3\xa4 AH. Rekisteriss\xc3\xa4 DX on muistiosoite, josta haluttu $-merkkiin loppuva teksti alkaa datasegmentin ds sis\xc3\xa4ll\xc3\xa4._NEWLINE_Rivi 7: Rutiinin suorittamisen j\xc3\xa4lkeen palataan p\xc3\xa4\xc3\xa4ohjelmaan, mik\xc3\xa4 onnistuu com-tyyppisess\xc3\xa4 ohjelmassa pelk\xc3\xa4ll\xc3\xa4 ret-k\xc3\xa4skyll\xc3\xa4 . Muuntyyppisess\xc3\xa4 ohjelmassa voi olla tarpeen k\xc3\xa4ytt\xc3\xa4\xc3\xa4 ohjelmistokeskeytyksen 21h alaista toimintoa 4Ch._NEWLINE_Rivi 9: Tekstiin kuuluvat tavut on m\xc3\xa4\xc3\xa4ritelty rivill\xc3\xa4 9, joten ne alkavat heti ohjelmakoodin viimeisen tavun j\xc3\xa4lkeen. Tekstin alkuosoitteelle on annettu nimi (osoite) teksti. Lopussa oleva dollarin merkki p\xc3\xa4\xc3\xa4tt\xc3\xa4\xc3\xa4 tulostuksen._NEWLINE_Yll\xc3\xa4 olevaa ohjelmaa vastaava korkean tason kielinen, t\xc3\xa4ss\xc3\xa4 PASCAL-ohjelma on_NEWLINE_program Hello;begin_NEWLINE_  writeln( \'Hello World\' );end.\n_START_SECTION_\nFibonaccin lukujen laskeminen\n_START_PARAGRAPH_\nSeuraava esimerkki on Fibonaccin lukujen laskija Motorola 68K-suoritinperheelle. Lasketaan :s Fibonaccin luku antamalla  rekisteriss\xc3\xa4 d0. Fibonaccin  luku  lasketaan silmukassa kaavalla: , ja  ja ._NEWLINE_ 1  fibonacci:      cmp.l #1,d0_NEWLINE_ 2                  bgt.b overone_NEWLINE_ 3                  moveq #1,d0_NEWLINE_ 4                  rts_NEWLINE_ 5  overone:        moveq #1,d1_NEWLINE_ 6                  moveq #1,d2_NEWLINE_ 7                  moveq #1,d3_NEWLINE_ 8  loop:           move.l d2,d4_NEWLINE_ 9                  add.l  d3,d4_NEWLINE_10                  move.l d3,d2_NEWLINE_11                  move.l d4,d3_NEWLINE_12                  addq.l #1,d1_NEWLINE_13                  cmp.l  d0,d1_NEWLINE_14                  bne.b  loop_NEWLINE_15                  move.l d4,d0_NEWLINE_16                  rts_NEWLINE_Riveill\xc3\xa4 1-4 tarkistetaan, onko d0  1, ja jos se on, lopetetaan aliohjelma ja palautetaan tuloksena 1. Rivill\xc3\xa4 5 asetetaan silmukkalaskuri rekisteriss\xc3\xa4 d1 arvoon 1. Riveill\xc3\xa4 6 ja 7 asetetaan rekisterit d2 ja d3 arvoihin  ja . Rivill\xc3\xa4 8 alkaa silmukka. Rivit 8 ja 9 laskevat seuraavan Fibonaccin luvun rekisteriin d4 summaamalla kaksi edellist\xc3\xa4 lukua rekistereist\xc3\xa4 d2 ja d3. Riveill\xc3\xa4 10 ja 11 tallennetaan muistiin 2 uusinta Fibonaccin lukua rekistereihin d2 ja d3 seuraavaa kierrosta varten. Rivill\xc3\xa4 12 kasvatetaan silmukkalaskuria yhdell\xc3\xa4. Riveill\xc3\xa4 13 ja 14 vertaillaan silmukkalaskuria ja :\xc3\xa4\xc3\xa4. Mik\xc3\xa4li  on saavutettu, lopetetaan silmukka. Muuten hyp\xc3\xa4t\xc3\xa4\xc3\xa4n takaisin riville 8. Rivill\xc3\xa4 15 siirret\xc3\xa4\xc3\xa4n tulos rekisterist\xc3\xa4 d4 rekisteriin d0, ja rivill\xc3\xa4 16 poistutaan aliohjelmasta.\n_START_SECTION_\nEsimerkeist\xc3\xa4\n_START_PARAGRAPH_\nEsimerkit antavat hyv\xc3\xa4n kuvan, miksi sovelluksia kehitt\xc3\xa4ess\xc3\xa4 aikaa kuluu eritt\xc3\xa4in kauan ja ty\xc3\xb6skentely puhtaalla assemblyll\xc3\xa4 on hankalaa. Korkeamman tason ohjelmointikielet on luotu helpottamaan t\xc3\xa4t\xc3\xa4 ty\xc3\xb6t\xc3\xa4, ja k\xc3\xa4\xc3\xa4nt\xc3\xa4ji\xc3\xa4 k\xc3\xa4ytet\xc3\xa4\xc3\xa4n muuntamaan selke\xc3\xa4mpi kieli konekielimuotoon. Konekielet ovat kuitenkin yleens\xc3\xa4 hyvin suoraviivaisia, ja k\xc3\xa4skyjen suorittamat toiminnot ovat yksinkertaisia. T\xc3\xa4m\xc3\xa4n vuoksi assembly-ohjelmointi on helppo opetella.'