Assembly (ohjelmointikieli) | ohjelmointikieli
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 sanoja numeroiden sijasta. Tietokone ei oikeastaan voi ymmärtää suoraan assembleriohjelmaa. Se voi kuitenkin helposti muuttaa ohjelman konekoodiksi korvaamalla ohjelman sanat numeroilla, joita ne edustavat. Näin toimivaa ohjelmaa kutsutaan assembleriksi.
Assembler-kielellä kirjoitetut ohjelmat koostuvat yleensä käskyistä, jotka ovat pieniä tehtäviä, jotka tietokone suorittaa ohjelmaa suorittaessaan. Niitä kutsutaan ohjeiksi, koska ohjelmoija käyttää niitä neuvoakseen tietokonetta, mitä tehdä. Tietokoneen osa, joka noudattaa ohjeita, on prosessori.
Tietokoneen assembly-kieli on matalan tason kieli, mikä tarkoittaa, että sillä voidaan tehdä vain yksinkertaisia tehtäviä, joita tietokone ymmärtää suoraan. Monimutkaisempien tehtävien suorittamiseksi tietokoneelle on kerrottava jokainen yksinkertainen tehtävä, joka on osa monimutkaista tehtävää. Tietokone ei esimerkiksi ymmärrä, kuinka tulostaa lause näytölle. Sen sijaan assembly-kielellä kirjoitetun ohjelman on kerrottava sille, miten kaikki lauseen tulostamiseen liittyvät pienet vaiheet tehdään.
Tällainen assembler-ohjelma koostuisi monista, monista ohjeista, jotka yhdessä tekevät jotakin, joka vaikuttaa ihmisestä hyvin yksinkertaiselta ja perustavanlaatuiselta. Tämän vuoksi ihmisen on vaikea lukea assembler-ohjelmaa. Sen sijaan korkean tason ohjelmointikielessä voi olla yksi ainoa käsky, kuten PRINT "Hello, world!", joka käskee tietokonetta suorittamaan kaikki pienet tehtävät puolestasi.
Kokoonpanokielen kehitys
Kun tietojenkäsittelytieteilijät rakensivat ensimmäiset ohjelmoitavat koneet, he ohjelmoivat ne suoraan konekoodilla, joka on numerosarja, joka neuvoo tietokonetta, mitä tehdä. Konekielen kirjoittaminen oli hyvin vaikeaa ja kesti kauan, joten lopulta tehtiin assembly-kieli. Kokoonpanokieli on ihmisen helpompi lukea ja sitä voidaan kirjoittaa nopeammin, mutta sitä on silti ihmisen paljon vaikeampi käyttää kuin korkean tason ohjelmointikieltä, joka yrittää jäljitellä ihmisen kieltä.
Ohjelmointi konekoodilla
Ohjelmoidakseen konekoodilla ohjelmoijan on tiedettävä, miltä kukin käsky näyttää binäärinä (tai heksadesimaalina). Vaikka tietokoneen on helppo selvittää nopeasti, mitä konekoodi tarkoittaa, se on vaikeaa ohjelmoijalle. Kullakin käskyllä voi olla useita muotoja, jotka kaikki näyttävät ihmisten silmissä vain joukolta numeroita. Kaikki virheet, joita joku tekee kirjoittaessaan konekoodia, huomataan vasta, kun tietokone tekee väärän asian. Virheen selvittäminen on vaikeaa, koska useimmat ihmiset eivät osaa sanoa konekoodin merkitystä katsomalla sitä. Esimerkki siitä, miltä konekoodi näyttää:
05 2A 00
Tämä heksadesimaalinen konekoodi käskee x86-tietokoneen prosessoria lisäämään akkuun 42. Henkilön on hyvin vaikea lukea ja ymmärtää sitä, vaikka hän osaisikin konekoodia.
Assembly-kielen käyttäminen sen sijaan
Kokoonpanokielellä jokainen käsky voidaan kirjoittaa lyhyenä sanana, jota kutsutaan mnemoniksi, ja sen jälkeen muita asioita, kuten numeroita tai muita lyhyitä sanoja. Muistilukua käytetään, jotta ohjelmoijan ei tarvitse muistaa tarkkoja konekoodin numeroita, joita tarvitaan tietokoneen käskemiseen tekemään jotakin. Esimerkkejä assembler-kielen muistikirjaimista ovat add, joka lisää dataa, ja mov, joka siirtää dataa paikasta toiseen. Koska "muistisääntö" on harvinainen sana, sen sijaan käytetään joskus ilmausta instruction type tai vain instruction, usein virheellisesti. Ensimmäisen sanan jälkeiset sanat ja numerot antavat lisätietoja siitä, mitä tehdään. Esimerkiksi yhteenlaskun jälkeiset asiat voivat kertoa, mitä kahta asiaa lasketaan yhteen, ja liikkumisen jälkeiset asiat kertovat, mitä siirretään ja mihin se laitetaan.
Esimerkiksi edellisessä jaksossa esitetty konekoodi (05 2A 00) voidaan kirjoittaa assemblerina seuraavasti:
add ax,42
Kokoonpanokieli antaa ohjelmoijille myös mahdollisuuden kirjoittaa ohjelman käyttämät varsinaiset tiedot helpommin. Useimmissa assembler-kielissä on tuki numeroiden ja tekstin helppoon tuottamiseen. Konekielisessä koodissa kukin erilainen numerotyyppi, kuten positiivinen, negatiivinen tai desimaaliluku, olisi muunnettava manuaalisesti binääriseksi, ja teksti olisi määriteltävä kirjain kerrallaan numeroiksi.
Kokoonpanokieli on niin sanottu konekoodin abstraktio. Assembleria käytettäessä ohjelmoijan ei tarvitse tietää yksityiskohtia siitä, mitä numerot merkitsevät tietokoneelle, vaan assembleri selvittää sen. Kokoonpanokielen avulla ohjelmoija voi silti käyttää kaikkia prosessorin ominaisuuksia, joita hän voisi käyttää konekoodilla. Tässä mielessä assemblerikielellä on erittäin hyvä, harvinainen ominaisuus: se pystyy ilmaisemaan asioita samalla tavalla kuin se, mitä se abstrahoi (konekoodi), mutta on samalla paljon helpompi käyttää. Tämän vuoksi konekoodia ei käytetä lähes koskaan ohjelmointikielenä.
Purkaminen ja virheenkorjaus
Kun ohjelmat ovat valmiit, ne on jo muutettu konekoodiksi, jotta prosessori voi suorittaa ne. Joskus, jos ohjelmassa on virhe, ohjelmoijat haluavat kuitenkin tietää, mitä kukin konekoodin osa tekee. Disassemblerit ovat ohjelmia, jotka auttavat ohjelmoijia tässä muuntamalla ohjelman konekoodin takaisin assembler-kielelle, joka on paljon helpompi ymmärtää. Disassemblerit, jotka muuttavat konekoodin assemblerikieleksi, toimivat päinvastoin kuin assemblerit, jotka muuttavat assemblerikielen konekieleksi.
Tietokoneen organisointi
Assemblykielisen ohjelman toiminnan ymmärtäminen edellyttää ymmärrystä siitä, miten tietokoneet on organisoitu ja miten ne näyttävät toimivan hyvin matalalla tasolla. Yksinkertaisimmillaan tietokoneissa on kolme pääosaa:
- keskusmuisti tai RAM-muisti, johon tallennetaan tietoja ja ohjeita,
- prosessori, joka käsittelee tietoja suorittamalla ohjeita, ja
- input ja output (joskus lyhennettynä I/O), joiden avulla tietokone voi kommunikoida ulkomaailman kanssa ja tallentaa tietoja keskusmuistin ulkopuolelle, jotta se voi saada tiedot takaisin myöhemmin.
Päämuisti
Useimmissa tietokoneissa muisti on jaettu tavuihin. Jokainen tavu sisältää 8 bittiä. Jokaisella muistissa olevalla tavulla on myös osoite, joka on numero, joka kertoo tavun sijainnin muistissa. Muistin ensimmäisen tavun osoite on 0, seuraavan tavun osoite on 1 ja niin edelleen. Muistin jakaminen tavuihin tekee siitä tavuosoitteistettavan, koska jokaiselle tavulle annetaan yksilöllinen osoite. Tavumuistien osoitteita ei voi käyttää viittaamaan tavun yksittäiseen bittiin. Tavu on pienin muistin osa, jota voidaan käsitellä.
Vaikka osoite viittaa tiettyyn tavuun muistissa, prosessorit mahdollistavat useiden tavujen käytön peräkkäin. Tämän ominaisuuden yleisin käyttötapa on käyttää joko 2 tai 4 tavua peräkkäin numeron, yleensä kokonaisluvun, esittämiseen. Yksittäisiä tavuja käytetään joskus myös kokonaislukujen esittämiseen, mutta koska ne ovat vain 8 bitin pituisia, niihin mahtuu vain 28 tai 256 erilaista mahdollista arvoa. Käyttämällä kahta tai neljää tavua peräkkäin saadaan eri arvojen lukumäärä 216 , 65536 tai 232 , 4294967296.
Kun ohjelma käyttää tavua tai useita tavuja peräkkäin kuvaamaan jotakin kirjainta, numeroa tai muuta, näitä tavuja kutsutaan objekteiksi, koska ne ovat kaikki osa samaa asiaa. Vaikka kaikki objektit on tallennettu identtisiin tavuihin muistiin, niitä kohdellaan ikään kuin niillä olisi "tyyppi", joka kertoo, miten tavut on ymmärrettävä: joko kokonaislukuna tai merkkinä tai jonain muuna tyyppinä (kuten muuna kuin kokonaislukuna). Konekoodi voidaan ajatella myös tyyppinä, joka tulkitaan käskyinä. Tyypin käsite on hyvin, hyvin tärkeä, koska se määrittelee, mitä asioita objektille voidaan tehdä ja mitä ei voida tehdä ja miten objektin tavuja tulkitaan. Esimerkiksi negatiivista lukua ei saa tallentaa positiivisen luvun objektiin eikä murtolukua saa tallentaa kokonaislukuun.
Osoite, joka osoittaa (on monen tavun objektin osoite), on kyseisen objektin ensimmäisen tavun osoite - tavu, jolla on pienin osoite. Sivuhuomautuksena on tärkeää huomata, että osoitteen perusteella ei voi päätellä objektin tyyppiä tai edes sen kokoa. Itse asiassa et voi edes kertoa objektin tyyppiä katsomalla sitä. Kokoonpanokielisen ohjelman on pidettävä kirjaa siitä, missä muistiosoitteissa mitäkin objekteja on ja kuinka suuria nämä objektit ovat. Ohjelma, joka tekee näin, on tyyppiturvallinen, koska se tekee objekteille vain sellaisia asioita, jotka on turvallista tehdä niiden tyypin perusteella. Ohjelma, joka ei tee niin, ei luultavasti toimi kunnolla. Huomaa, että useimmat ohjelmat eivät itse asiassa nimenomaisesti tallenna objektin tyyppiä, vaan ne vain käyttävät objekteja johdonmukaisesti - samaa objektia käsitellään aina saman tyyppisenä.
Prosessori
Prosessori suorittaa (executes) ohjeita, jotka on tallennettu konekoodina keskusmuistiin. Sen lisäksi, että useimmissa prosessoreissa on mahdollisuus käyttää muistia tallennusmuistina, niissä on myös muutamia pieniä, nopeita ja kiinteän kokoisia tiloja, joihin tallennetaan kohteita, joiden kanssa parhaillaan työskennellään. Näitä tiloja kutsutaan rekistereiksi. Prosessorit suorittavat yleensä kolmenlaisia ohjeita, vaikka jotkin ohjeet voivat olla näiden tyyppien yhdistelmiä. Alla on esimerkkejä kustakin tyypistä x86-kokoonpanokielellä.
Ohjeet, jotka lukevat tai kirjoittavat muistia
Seuraava x86-kokoonpanokielen käsky lukee (lataa) kahden tavun objektin osoitteessa 4096 olevasta tavusta (0x1000 heksadesimaalisessa muodossa) 16-bittiseen rekisteriin nimeltä 'ax':
mov ax, [1000h]
Tässä kokoonpanokielessä numeron (tai rekisterin nimen) ympärillä olevat hakasulkeet tarkoittavat, että numeroa on käytettävä käytettävän datan osoitteena. Osoitteen käyttämistä datan osoittamiseen kutsutaan indirektioksi. Seuraavassa esimerkissä ilman hakasulkeita toiseen rekisteriin, bx, ladataan itse asiassa arvo 20.
mov bx, 20
Koska indirektiota ei käytetty, rekisteriin laitettiin itse arvo.
Jos operandit (asiat, jotka tulevat muistisäännön jälkeen) ovat käänteisessä järjestyksessä, käsky, joka lataa jotain muistista, kirjoittaa sen sijaan sen muistiin:
mov [1000h], bx
Tässä tapauksessa muistiin osoitteessa 1000h tulee bx:n arvo. Jos tämä esimerkki suoritetaan heti edellisen esimerkin jälkeen, kaksi tavua osoitteissa 1000h ja 1001h on kahden tavun kokonaisluku, jonka arvo on 20.
Ohjeet, jotka suorittavat matemaattisia tai loogisia operaatioita.
Jotkin ohjeet tekevät asioita kuten vähennyslasku tai loogisia operaatioita kuten ei:
Aiemmin tässä artikkelissa esitetty konekoodiesimerkki olisi tämä assembler-kielellä:
lisää ax, 42
Tässä 42 ja ax lasketaan yhteen ja tulos tallennetaan takaisin ax:iin. x86-kokoonpanossa on myös mahdollista yhdistää muistin käyttö ja matemaattinen operaatio tällä tavoin:
add ax, [1000h]
Tämä käsky lisää 1000h:n kohdalle tallennetun kahden tavun kokonaisluvun arvon ax:iin ja tallentaa vastauksen ax:iin.
tai ax, bx
Tämä käsky laskee rekisterien ax ja bx sisällön tai ja tallentaa tuloksen takaisin ax:iin.
Ohjeet, jotka päättävät, mikä on seuraava ohje.
Yleensä ohjeet suoritetaan siinä järjestyksessä, jossa ne näkyvät muistissa, eli siinä järjestyksessä, jossa ne on kirjoitettu assembly-koodiin. Prosessori vain suorittaa ne yksi toisensa jälkeen. Jotta prosessorit voisivat tehdä monimutkaisia asioita, niiden on kuitenkin suoritettava eri ohjeita sen mukaan, mitä tietoja niille on annettu. Prosessoreiden kykyä suorittaa erilaisia ohjeita riippuen jonkin asian tuloksesta kutsutaan haarautumiseksi. Ohjeita, jotka päättävät, mikä on seuraava ohje, kutsutaan haarautumisohjeiksi.
Tässä esimerkissä oletetaan, että joku haluaa laskea maalin määrän, jonka hän tarvitsee maalatakseen neliön, jonka sivun pituus on tietty. Mittakaavaedun vuoksi maalikauppa ei kuitenkaan myy hänelle pienempää määrää maalia kuin mitä tarvitaan 100 x 100 neliön maalaamiseen.
Maalattavan neliön pituuden perusteella tarvittava maalimäärä lasketaan seuraavalla tavalla:
- vähennetään 100 sivun pituudesta
- jos vastaus on pienempi kuin nolla, asetetaan sivun pituudeksi 100.
- kerrotaan sivun pituus itsellään
Algoritmi voidaan ilmaista seuraavalla koodilla, jossa ax on sivun pituus.
mov bx, ax sub bx, 100 jge continue mov ax, 100 continue: mul ax
Tässä esimerkissä esitellään useita uusia asioita, mutta kaksi ensimmäistä ohjetta ovat tuttuja. Ne kopioivat ax:n arvon bx:ään ja vähentävät sitten bx:stä 100.
Yksi tämän esimerkin uusista asioista on nimeltään label, joka on käsite, joka esiintyy assembly-kielissä yleensä. Merkinnät voivat olla mitä tahansa, mitä ohjelmoija haluaa (paitsi jos se on käskyn nimi, mikä sekoittaisi assemblerin). Tässä esimerkissä merkintä on 'continue'. Assembler tulkitsee sen käskyn osoitteeksi. Tässä tapauksessa se on mult axin osoite.
Toinen uusi käsite on liput. x86-prosessoreissa monet käskyt asettavat prosessoriin "lippuja", joita seuraava käsky voi käyttää päättääkseen, mitä tehdä. Tässä tapauksessa, jos bx oli pienempi kuin 100, sub asettaa lipun, joka kertoo, että tulos oli pienempi kuin nolla.
Seuraava käsky on jge, joka on lyhenne sanoista 'hyppää jos suurempi tai yhtä suuri kuin'. Se on haarautumiskäsky. Jos prosessorin lippujen mukaan tulos on suurempi tai yhtä suuri kuin nolla, prosessori hyppää seuraavaan käskyyn sen sijaan, että siirtyisi seuraavaan käskyyn, joka on mul ax.
Tämä esimerkki toimii hyvin, mutta useimmat ohjelmoijat eivät kirjoittaisi sitä. Vähennyskäsky asetti lipun oikein, mutta se myös muuttaa arvoa, johon se vaikuttaa, mikä edellytti ax:n kopioimista bx:ään. Useimmat assembler-kielet sallivat vertailukomennot, jotka eivät muuta mitään niille välitettyjä argumentteja, mutta asettavat silti liput oikein, eikä x86-assembleri ole poikkeus.
cmp ax, 100 jge continue mov ax, 100 continue: mul ax
Nyt sen sijaan, että vähennettäisiin 100 ax:stä, katsottaisiin, onko luku pienempi kuin nolla, ja määritettäisiin se takaisin ax:iin, ax jätetään ennalleen. Liput asetetaan edelleen samalla tavalla, ja hyppy tehdään edelleen samoissa tilanteissa.
Tulo ja lähtö
Vaikka syöttö ja tulostus ovatkin olennainen osa tietojenkäsittelyä, niitä ei voi tehdä yhdellä ainoalla tavalla assembler-kielellä. Tämä johtuu siitä, että se, miten I/O toimii, riippuu tietokoneen kokoonpanosta ja käyttöjärjestelmästä, eikä pelkästään siitä, millainen prosessori siinä on. Alla olevassa esimerkkiosiossa Hello World -esimerkki käyttää MS-DOS-käyttöjärjestelmän kutsuja ja sen jälkeinen esimerkki BIOS-kutsuja.
I/O on mahdollista tehdä kokoonpanokielellä. Assembler-kielellä voidaan yleensä ilmaista mitä tahansa, mitä tietokone pystyy tekemään. Vaikka assembler-kielessä on käskyjä lisätä ja haarautua, jotka tekevät aina saman asian, assembler-kielessä ei kuitenkaan ole käskyjä, jotka tekevät aina I/O:n.
Tärkeää on huomata, että tapa, jolla I/O toimii, ei kuulu mihinkään kokoonpanokieleen, koska se ei ole osa prosessorin toimintaa.
Kokoonpanokielet ja siirrettävyys
Vaikka prosessori ei suoranaisesti käytä assemblerikieltä, vaan konekoodia, sillä on silti paljon tekemistä prosessorin kanssa. Kukin prosessoriperhe tukee erilaisia ominaisuuksia, ohjeita, sääntöjä siitä, mitä ohjeet voivat tehdä, ja sääntöjä siitä, millaisia ohjeiden yhdistelmiä missäkin sallitaan. Tämän vuoksi erityyppiset prosessorit tarvitsevat edelleen erilaisia kokoonpanokieliä.
Koska jokainen assembler-kielen versio on sidottu tiettyyn prosessoriperheeseen, siitä puuttuu niin sanottu siirrettävyys. Jotain siirrettävää tai siirrettävää voidaan helposti siirtää yhdestä tietokonetyypistä toiseen. Muuntyyppiset ohjelmointikielet ovat siirrettäviä, mutta assembly-kieli ei yleensä ole.
Kokoonpanokieli ja korkean tason kielet
Vaikka assemblerikieli mahdollistaa helpon tavan käyttää kaikkia prosessorin ominaisuuksia, sitä ei käytetä nykyaikaisissa ohjelmistoprojekteissa useista syistä:
- Yksinkertaisen ohjelman esittäminen assemblerilla vaatii paljon vaivaa.
- Vaikka assembler-kieli ei ole yhtä virhealtis kuin konekoodi, se tarjoaa silti hyvin vähän suojaa virheitä vastaan. Läheskään kaikki assembler-kielet eivät noudata tyyppiturvallisuutta.
- Kokoonpanokieli ei edistä hyviä ohjelmointikäytäntöjä, kuten modulaarisuutta.
- Vaikka jokainen yksittäinen assembler-kielen käsky on helppo ymmärtää, on vaikea sanoa, mikä oli sen kirjoittaneen ohjelmoijan tarkoitus. Itse asiassa ohjelman assemblerikieltä on niin vaikea ymmärtää, että yritykset eivät ole huolissaan siitä, että ihmiset purkavat (saavat selville ohjelmiensa assemblerikielen).
Näiden haittojen vuoksi useimmissa projekteissa käytetään sen sijaan korkean tason kieliä, kuten Pascalia, C:tä ja C++:aa. Niiden avulla ohjelmoijat voivat ilmaista ideansa suoremmin sen sijaan, että heidän tarvitsisi huolehtia siitä, että prosessorille kerrotaan, mitä se tekee joka vaiheessa. Niitä kutsutaan korkeatasoisiksi kieliksi, koska ohjelmoijan samalla koodimäärällä ilmaisemat ideat ovat monimutkaisempia.
Ohjelmoijat, jotka kirjoittavat koodia käännetyillä korkean tason kielillä, käyttävät kääntäjäksi kutsuttua ohjelmaa, joka muuttaa koodin assembler-kielelle. Kääntäjiä on paljon vaikeampi kirjoittaa kuin assemblereita. Korkean tason kielet eivät myöskään aina anna ohjelmoijien käyttää kaikkia prosessorin ominaisuuksia. Tämä johtuu siitä, että korkean tason kielet on suunniteltu tukemaan kaikkia prosessoriperheitä. Toisin kuin assembly-kielet, jotka tukevat vain yhtä prosessorityyppiä, korkean tason kielet ovat siirrettävissä.
Vaikka kääntäjät ovat monimutkaisempia kuin assemblerit, vuosikymmenien aikana tehtyjen tutkimusten ja tutkimusten ansiosta kääntäjistä on tullut erittäin hyviä. Nyt ei ole enää paljon syytä käyttää assemblerikieltä useimmissa projekteissa, koska kääntäjät osaavat yleensä selvittää, miten ohjelmat ilmaistaan assemblerikielellä yhtä hyvin tai paremmin kuin ohjelmoijat.
Esimerkkiohjelmat
Hello, world! -ohjelma, joka on kirjoitettu x86-kokoonpanokielellä:
adosseg .model small .stack 100h .data hello_message db 'Hello, World! ',0dh,0ah,'$' .code main proc mov ax,@data mov ds,ax mov ah,9 mov dx,offset hello_message int 21h mov ax,4C00h int 21h main endp end main.
Funktio, joka tulostaa numeron näytölle käyttämällä BIOS-keskeytyksiä, jotka on kirjoitettu NASM x86-kokoonpanolla. Modulaarinen koodi on mahdollista kirjoittaa assemblerilla, mutta se vaatii ylimääräistä vaivaa. Huomaa, että kaikki, mikä tulee rivillä puolipisteen jälkeen, on kommentti ja assembleri jättää sen huomiotta. Kommenttien kirjoittaminen assembler-koodiin on erittäin tärkeää, koska suuria assembler-kielisiä ohjelmia on niin vaikea ymmärtää.
; void printn(int number, int base); printn: push bp mov bp, sp push ax push bx push cx push dx push si mov si, 0 mov ax, [bp + 4] ; number mov cx, [bp + 6] ; base gloop: inc si ; merkkijonon pituus mov dx, 0 ; nolla dx div cx ; jaa base cmp dx, 10 ; onko se ge 10? jge num add dx, '0' ; lisää nolla dx:ään jmp anum num: add dx, ('A'- 10) ; hexa-arvo, lisää 'A' dx:ään - 10. anum: push dx ; laita dx pinoon. cmp ax, 0 ; jatketaanko? jne gloop mov bx, 7h ; keskeytystä varten tloop: pop ax ; hae sen arvo mov ah, 0eh ; keskeytystä varten int 10h ; kirjoita merkki dec si ; päästä eroon merkistä jnz tloop pop si pop dx pop cx pop bx pop ax pop bp ret 4
Kirjat
- Michael Singer, PDP-11. Assembler Language Programming and Machine Organization, John Wiley & Sons, NY: 1980.
- Peter Norton, John Socha, Peter Norton's Assembly Language Book for the IBM PC, Brady Books, NY: 1986.
- Dominic Sweetman: Katso MIPS Run. Morgan Kaufmann Publishers, 1999. ISBN 1-55860-410-3
- John Waldron: Johnron: Johdatus RISC-kokoonpanokielen ohjelmointiin. Addison Wesley, 1998. ISBN 0-201-39828-1
- Jeff Duntemann: Assembly Language Step-by-Step. Wiley, 2000. ISBN 0-471-37523-3
- Paul Carter: PC-kokoonpanokieli. Ilmainen ebook, 2001.
Verkkosivusto - Robert Britton: Britton: MIPS Assembly Language Programming. Prentice Hall, 2003. ISBN 0-13-142044-5
- Randall Hyde: Kokoonpanokielen taito. No Starch Press, 2003. ISBN 1-886411-97-2
Luonnosversiot saatavilla verkossa Arkistoitu 2011-01-28 Wayback Machine:ssa PDF- ja HTML-muodossa. - Jonathan Bartlett: Ohjelmointi alusta alkaen. Bartlett Publishing, 2004. ISBN 0-9752838-4-7
Saatavilla verkossa PDF- ja HTML-muodossa. - ASM Community Book "ASM-yhteisön verkkokirja täynnä hyödyllistä ASM-tietoa, opetusohjelmia ja koodiesimerkkejä".
Ohjelmisto
- MenuetOS - Käyttöjärjestelmä, joka on kirjoitettu kokonaan 64-bittisellä kokoonpanokielellä.
- SB-Assembler useimmille 8-bittisille prosessoreille/ohjaimille.
- GNU lightning, kirjasto, joka tuottaa ajoaikana kokoonpanokielistä koodia, joka on hyödyllinen Just-In-Time-kääntäjille.
- WinAsm Studio, The Assembly IDE - Ilmaiset lataukset, lähdekoodi , ilmainen Assembly IDE, paljon avoimen lähdekoodin ohjelmia ladattavaksi ja suosittu hallitus Arkistoitu 2008-08-05 at the Wayback Machine
- Netwide Assembler
- GoAsm - ilmainen komponentti "Go" -työkalut: tuki 32-bittinen ja 64-bittinen Windows-ohjelmointi
Kysymyksiä ja vastauksia
K: Mikä on kokoonpanokieli?
A: Kokoonpanokieli on ohjelmointikieli, jolla voidaan suoraan kertoa tietokoneelle, mitä sen tulee tehdä. Se on lähes täsmälleen samanlainen kuin konekoodi, jota tietokone ymmärtää, paitsi että siinä käytetään sanoja numeroiden sijasta.
K: Miten tietokone ymmärtää assembly-ohjelman?
V: Tietokone ei oikeastaan pysty ymmärtämään assembleriohjelmaa suoraan, mutta se voi helposti muuttaa ohjelman konekoodiksi korvaamalla ohjelman sanat numeroilla, joita ne edustavat. Tämä prosessi tehdään assemblerin avulla.
K: Mitä ovat käskyt assemblerikielessä?
V: Assembler-kielen käskyt ovat pieniä tehtäviä, joita tietokone suorittaa ohjelmaa suorittaessaan. Niitä kutsutaan ohjeiksi, koska ne neuvovat tietokonetta, mitä tehdä. Tietokoneen osaa, joka vastaa näiden ohjeiden noudattamisesta, kutsutaan prosessoriksi.
K: Minkä tyyppinen ohjelmointikieli on assembly-kieli?
V: Kokoonpanokieli on matalan tason ohjelmointikieli, mikä tarkoittaa, että sillä voidaan tehdä vain yksinkertaisia tehtäviä, joita tietokone ymmärtää suoraan. Monimutkaisempien tehtävien suorittamiseksi on kukin tehtävä pilkottava yksittäisiin komponentteihin ja annettava ohjeet kullekin komponentille erikseen.
K: Miten tämä eroaa korkean tason kielistä?
V: Korkean tason kielissä voi olla yksittäisiä komentoja, kuten PRINT "Hello, world!", joka käskee tietokonetta suorittamaan kaikki nämä pienet tehtävät automaattisesti ilman, että niitä tarvitsee määritellä erikseen, kuten assembly-ohjelmassa. Tämä tekee korkean tason kielistä ihmisille helpommin luettavia ja ymmärrettäviä kuin monista yksittäisistä käskyistä koostuvat assembly-ohjelmat.
Kysymys: Miksi ihmisten voi olla vaikea lukea assembler-ohjelmaa?
V: Koska monia yksittäisiä ohjeita on määriteltävä, jotta voidaan suorittaa monimutkainen tehtävä, kuten tulostaa jotakin näytölle tai suorittaa laskutoimituksia tietokokonaisuuksilla - asioita, jotka vaikuttavat hyvin yksinkertaisilta ja yksinkertaisilta, kun ne ilmaistaan luonnollisella ihmiskielellä - joten yhden ohjeen muodostavia koodirivejä voi olla useita, minkä vuoksi ihmisten, jotka eivät tiedä, miten tietokoneet toimivat sisäisesti niin matalalla tasolla, on vaikea seurata ja tulkita, mitä ohjelmassa tapahtuu.