用车你还在单手开车吗?你是真的不想活了吗?

Assembly (usein virheellisesti assembler) on tietokoneen ohjelmointikieli, joka koostuu symbolisesta vastineesta tietylle konekielelle.[1] Toinen nimitys assembly-kielelle on symbolinen konekieli.[2] Eri suoritintyyppej? k?ytt?ville tietokoneille tarvitaan eri assembly-kieli.[1]
Assembly on matalan tason kieli, jota sanotaan my?s toisen sukupolven ohjelmointikieleksi.[3] Kieli on isomorfinen ja vastaa l?heisesti konekielt?: kielen ominaisuudet ovat yksi-yhteen tai yksi-moneen suhteessa k?skykannan ominaisuuksiin.[3] Ylemm?n tason kielet k?ytt?v?t ei-isomorfista muunnosta.[3]
Konekieli on suorittimen tai vastaavan laitteen ymm?rt?m? kieli. Konekielen k?skyt ovat lukujonoja, ja siksi vaikeita muistaa sek? hahmottaa koodia kirjoitettaessa. Siksi konekielen kirjoittamisen sijaan k?ytet??n yleens? assembly?. Assembly-ohjelma muutetaan konekieliseksi assembler-k??nt?j?ll?.
Assembly-ohjelma koostuu k?skyist? (engl. mnemonics) ja niihin liittyv?t operandeista, jotka vastaavat konekielen k?skyj?. Lis?ksi assembly-kielisess? ohjelmassa on muistiosoitteiden nimi? ja muita apusanoja.
Assemblyn k?yt?n varjopuolia verrattuna C:n tyyppisiin korkean tason kieliin ovat muun muassa ohjelmoinnin vaikeus, hitaus ja virhealttius. Assemblyn k?ytt? vaatii taitoa ja erityist? tarkkuutta.
Assembly-kieli on huonosti siirrett?v? kieli eri suorittimien v?lill?. Eri suoritintyypeille on erilaiset assembly-ohjelmat.
Historia
[muokkaa | muokkaa wikiteksti?]Small-Scale Experimental Machine (SSEM) oli ensimm?inen tallennetun ohjelman tietokone, jossa ohjelma voitiin tallettaa tietokoneen muistiin ja ohjelma voitiin ladata ilman fyysisi? muutoksia laitteeseen.[4][5] Konekieli oli koneelle tehokasta k?sitell?, mutta ei ihmisille: aluksi t?m? ei ollut ongelma koska ohjelmoijat olivat samoja henkil?it? jotka suunnittelivat koneen mutta uusien ohjelmoijien tarpeen kasvaessa laitteiston yksityiskohtien kuvaileminen tuli ongelmaksi.[6] Lis??m?ll? muistis??nt?j? (engl. mnemonics) ohjelmoijan ty?t? helpotettiin.[6] Muistis??nt?jen muuttaminen konekielisiin oli alkuun k?sity?t? ennen assembler-ohjelman kehitt?mist?.[6] Varhaisen assembly-kielen kehitti Kathleen Booth Automatic Relay Calculatorille.[7] Termin assembler yleistymiseen liitet??n Wilkesin, Wheelerin ja Gillin kirja The preparation of programs for a digital computer (1951).[6] Ennen vuotta 1954 l?hes kaikki ohjelmointi tehtiin matalan tason ohjelmointikielill? kuten konekielell? tai assemblyll?.[8]
Assembly, symbolinen konekieli
[muokkaa | muokkaa wikiteksti?]
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.
Er?s Intelin 8086 suorittimen konekielen k?sky siirt?? luvun 97 rekisteriin AL:
10110000 01100001
Monesti t?m? esitet??n heksadesimaalilukuna lyhyemm?n esitysmuodon vuoksi:
B0 61
Assemblyll? k?sky n?ytt?? viel? selke?mm?lt?:
MOV AL, 61h ; Kommentti: Siirr? AL-rekisteriin luku 97 , mik? on heksadesimaalilukuna 61 h (61 hex)
Esimerkiss? "MOV" on k?sky ja 61h operandi. Kyseist? syntaksia k?ytet??n esimerkiksi MASM:issa, jossa operandit ovat j?rjestyksess? kohde, l?hde eli "al, 61h"
GNU Assemblerissa (GAS) k?ytetyll? AT&T:n syntaksilla operandit ovat j?rjestyksess? l?hde, kohde.[9]
movb $0x61, %al
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?. Lis?ksi eri muistiosoitteisiin viitataan assemblyssa usein nimin ja itse muistiosoite voidaan antaa assemblerin m??ritelt?v?ksi. 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 riippuen k?ytetyst? assembler-ohjelmasta (esimerkiksi MASM, GAS). Muilla suorittimilla on omat eronsa ja ohjelmansa.
Esimerkiksi 32-bittisen kokonaisluvun, jonka arvo on "5" siirt?minen datarekisteriin d0
Motorola 68000 -sarjan suorittimella:
move.l #5, d0
Inline-assembly
[muokkaa | muokkaa wikiteksti?]Assembleria on k?ytetty monesti korkean tason kielten ohella nopeuttamaan ohjelman ajoa joissain kohdissa.
Korkean tason kielen k??nt?j?t, esimerkiksi GCC, osaavat k??nt?? ns. inline-assembly?, joka on korkeamman tason kielen joukossa olevia assembly-k?skyj?.[10]
Esimerkki C-kielen joukossa asm
-lausekkeella:[11]
int src = 1;
int dst;
asm ("mov %1, %0\n\t"
"add $1, %0"
: "=r" (dst)
: "r" (src));
printf("%d\n", dst);
Eri k??nt?jien tuki inline-assemblylle vaihtelee mutta muun muassa LLVM/Clang on pitk?lti yhteensopiva GCC:n kanssa.[12]
Assemblyn k?ytt?kohteet
[muokkaa | muokkaa wikiteksti?]Assembly 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 useimmat 16-bittisen sukupolven tietokoneiden pelit ohjelmoitiin assemblyll?. Varsinaisen assembly-kielen k?ytt? 8-bittisill? tietokoneilla (kuten Commodore 64, MSX, ZX Spectrum) on useimmiten liian raskasta. Sen sijaan joko k?ytettiin konekielimonitoreja tai hy?dynnettiin ristiink??nt?mist? kirjoittamalla assembly? ensin PC:ll? tai UNIX-ty?asemalla ja ristiink??nt?m?ll? se lopulliselle kohteelleen.
Puhtaan assembly-kielen k?ytt?? on perinteisesti puoltanut ohjelmakoodin tiiviys verrattuna k??nt?jien tuottamaan konekieleen. Etenkin varhaisten tietokoneiden muistit 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; tyypillisesti suoraan assemblyll? toteutettu ohjelma oli kooltaan vain 1/10 korkean tason kielell? tuotetusta ohjelmasta. Kokoedun takia esimerkiksi kiintolevyn alussa oleva k?ynnistyskoodi kirjoitetaan nyky??nkin assemblyll?.
Sovellusohjelmien osalta t?llainen optimointi ei kuitenkaan yleens? en?? ole mielek?st?, eik? assembly? juurikaan k?ytet? nykyaikaisten henkil?kohtaisten tietokoneiden kaltaisten koneiden eik? my?sk??n ?lypuhelimien sovellusohjelmoinnissa. Sovellusohjelmat ovat niin isoja, ettei niit? voi mielekk??sti hallita assembly-tasolla. Suorittimet ovat my?s niin tehokkaita, ett? koodin nopeutuksella saatava hy?ty ei yleens? ole vaivan arvoista. Pullonkaulat ovat yleens? muualla, kuten I/O-operaatioiden ja sivutuksen aiheuttamassa viiveess?. Korkean tason ohjelmointikielten k??nt?j?t ovat my?s kehittyneet, ja samalla suorittimet sis?iselt? toiminnaltaan monimutkaistuneet niin, ett? k??nt?j? tuottaa useimmiten tehokkaampaa koodia kuin mit? k?sin ohjelmoimalla voisi saada aikaan, varsinkaan kohtuullisella ty?m??r?ll?. Lis?ksi esimerkiksi tehokkaiden algoritmien ja tietorakenteiden valinta saattaa suurempia kokonaisuuksia assemblyll? koodattaessa j??d? pahasti taka-alalle, koska niiden toteuttaminen voi olla konekielell? liian ty?l?st?.
Sulautettujen j?rjestelmien ohjelmoinnissa on assemblyll? jonkin verran vahvempi asema kuin ohjelmoinnissa henkil?kohtaisille tietokoneille. Kokonaisia ohjelmia ei silti n?illek??n j?rjestelmille ole mielek?st? ohjelmoida pelk?ll? assemblyll?.
Erityistilanteissa assemblyll? on kuitenkin viel? t?rke? asema. Sit? voi tarvita laitteistol?heist? ohjelmointia vaativissa teht?viss?, kuten laiteohjainten kehityksess?. Viel? toisinaan assemblyll? on k?ytt?? my?s tehokkuutta vaativissa sovelluksissa, kuten salauksessa tai videon koodauksessa, kun ohjelman osia optimoidaan. N?iss?kin tapauksissa assemblyll? koodataan mahdollisimman pieni osa. K??nt?j?n tuottamaa assembly-koodia analysoimalla voidaan l?yt?? keinoja korjata korkeamman tason koodia ja k??nt?j?lle annettavia ohjeita, kunnes tulos on haluttu. Koodin ymm?rt?minen assembly-tasolla on joskus t?rke?? my?s vianetsinn?ss?.
Assembly-esimerkkej?
[muokkaa | muokkaa wikiteksti?]Tekstin tulostaminen MS-DOS -k?ytt?j?rjestelm?ll?
[muokkaa | muokkaa wikiteksti?]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!". Rivien toiminta:
- 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: heksaluku 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.
Yll? olevaa ohjelmaa vastaava ohjelma ylemm?n tason kielell?, t?ss? Pascal-ohjelma on
program Hello;
begin
writeln( 'Hello World' );
end.
Fibonaccin lukujen laskeminen
[muokkaa | muokkaa wikiteksti?]Seuraava esimerkki on Fibonaccin lukujen laskija Motorola 68000 -sarjan suorittimille. Lasketaan :s Fibonaccin luku antamalla rekisteriss? d0. Fibonaccin luku lasketaan silmukassa kaavalla: , ja ja .
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 ja . 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 :??. Mik?li 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.
Esimerkeist?
[muokkaa | muokkaa wikiteksti?]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.
Katso my?s
[muokkaa | muokkaa wikiteksti?]L?hteet
[muokkaa | muokkaa wikiteksti?]- ↑ a b Assembly language britannica.com. Viitattu 12.9.2020. (englanniksi)
- ↑ www.computerhope.com computerhope.com. Viitattu 26.7.2017. (englanniksi)
- ↑ a b c Roger Clarke: A Contingency Approach to the Application Software Generations rogerclarke.com. 1991. Viitattu 4.2.2020. (englanniksi)
- ↑ The Manchester Small Scale Experimental Machine -- "The Baby" curation.cs.manchester.ac.uk. Arkistoitu 11.3.2016. Viitattu 25.8.2017.
- ↑ Guy Fedorkow: About the Computer History Museum’s IBM 1401 Machines computerhistory.org. 19.2.2015. Viitattu 28.1.2020. (englanniksi)
- ↑ a b c d Harry Fairhead: History of Computer Languages - The Classical Decade, 1950s i-programmer.info. Viitattu 13.9.2020. (englanniksi)
- ↑ Liam Proven: RIP: Kathleen Booth, the inventor of assembly language theregister.com. 29.10.2022. Viitattu 30.10.2022. (englanniksi)
- ↑ John Backus: FORTRAN Session (PDF) Computer History Musem. Viitattu 10.2.2020. (englanniksi)
- ↑ Linux assemblers: A comparison of GAS and NASM IBM. Viitattu 8.10.2017.
- ↑ 6.47 How to Use Inline Assembly Language in C Code gcc.gnu.org. Viitattu 12.9.2020. (englanniksi)
- ↑ 6.47.2 Extended Asm - Assembler Instructions with C Expression Operands gcc.gnu.org. Viitattu 12.9.2020. (englanniksi)
- ↑ Inline assembly clang.llvm.org. Viitattu 12.9.2020. (englanniksi)
Aiheesta muualla
[muokkaa | muokkaa wikiteksti?]Kuvia tai muita tiedostoja aiheesta Assembly (ohjelmointikieli) Wikimedia Commonsissa
Kirjallisuutta
[muokkaa | muokkaa wikiteksti?]- Jorgensen, Ed: x86-64 Assembly Language Programming with Ubuntu. Ed Jorgensen, 2020. Teoksen verkkoversio (PDF). (englanniksi)
- Dennis Yurichev: Understanding Assembly Language (PDF) (englanniksi)
- Randall Hyde: The Art of Assembly Language - eri versioita saatavilla (englanniksi)
Suomeksi
[muokkaa | muokkaa wikiteksti?]- Link, Wolfgang: Assembler-ohjelmointi. Suomentanut Reijo Lundahl. Vantaa: Pagina, 1997. ISBN 951-644-108-4 Finna:helka.9910346093506253
- Maljugin, Vitaly; Izrailevich, Jacov; Lavin, Semyon; Sopin, Aleksandr: Inside assembler: ohjelmoijan k?sikirja. (Toimituksellinen neuvonantaja: Ivor Horton. Suomennetun laitoksen oikolukenut T. Eklin) Helsinki: IT Press, 1999. ISBN 951-826-006-0 Finna:helmet.1039076