|
Article on other languages:
|
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 noudattavia assembly-kieliä 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ä.
Assemblyn käyttökohteetAssembly-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ä käytettiin kotimikrojen alkuaikoina melko yleisesti. Esimerkiksi MS-DOS-käyttöjärjestelmä, taulukkolaskentaohjelma Lotus 1-2-3 ja lähes kaikki Commodore 64:n sekä Amigan kaupalliset pelit ohjelmoitiin assemblyllä. Assemblyä ei juurikaan käytetä nykyaikaisten PC:n kaltaisten koneiden ohjelmoinnissa. Sovellusohjelmat ovat niin isoja, ettei niitä voi mielekkäästi hallita assembly-tasolla, ja suorittimen teho sellainen, että itse koodin nopeus monelle ohjelmoijalle on toissijainen. Pullonkaulat ovat yleensä muualla, kuten I/O-operaatioiden ja sivutuksen aiheuttamassa viiveessä. Korkean tason kielten kääntäjät ovat myös kehittyneet ja suorittimet sisäiseltä toiminnaltaan monimutkaistuneet niin, että kääntäjä useimmiten tuottaa tehokkaampaa koodia kuin mitä käsin saisi aikaan, varsinkaan kohtuullisella työmäärällä. Erityistilanteissa assemblyllä on vielä tärkeä asema. Sitä voi tarvita laitteistoläheistä ohjelmointia vaativissa tehtävissä, kuten laiteohjainten kehityksessä, joskus myös suurta nopeutta vaativien tehtävien, kuten salauksen ja videokoodauksen, joidenkin osien optimoinnissa. Näissäkin tapauksissa assemblyllä koodataan mahdollisimman pieni osa. Kääntäjän tuottamaa koodia voi analysoida assembly-muodossa ja korkeamman tason koodia ja kääntäjälle annettavia ohjeita voidaan muokata, kunnes tulos on haluttu. Koodin ymmärtäminen assembly-tasolla on joskus tärkeää myös vianetsinnässä. Mobiililaitteiden ja muiden pienten sulautettujen järjestelmien ohjelmoinnissa on assemblyllä jonkin verran vahvempi asema. Kokonaisia ohjelmia ei tosin näillekään järjestelmille ole kovin mielekästä ohjelmoida pelkällä assemblyllä. 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. Koon takia esimerkiksi kiintolevyn alussa oleva käynnistyskoodi kirjoitetaan nykyäänkin assemblyllä, mutta sovellusohjelmien osalta tällainen optimointi ei ole mielekästä. Assembly-esimerkkejä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,9h 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 järjestelmäkutsua, 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 siirretää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. Fibonaccin lukujen laskeminenSeuraava 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 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. Aiheesta muualla
Assemblereita
|
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net