Kokoonpanokieli

kokoonpanokieli
Kieliluokka välttämätöntä
Toteutustyyppi koottava
Esiintyi 1949
Tiedostotunniste _ .asmtai [1].s
 Mediatiedostot Wikimedia Commonsissa

Kokoonpanokieli ( englanniksi  assembly language ) - prosessorin komentojen esitys ihmisen luettavassa muodossa. Assembly-kieltä pidetään matalan tason ohjelmointikielenä , toisin kuin korkean tason kieliä , jotka eivät ole sidottu tiettyyn tietokonejärjestelmän toteutukseen. Assembly-kielellä kirjoitetut ohjelmat muuntuvat yksiselitteisesti tietyn prosessorin käskyiksi, eikä niitä useimmissa tapauksissa voida siirtää ilman merkittäviä muutoksia toimimaan koneella, jossa on eri käskyt. Assembler on ohjelma, joka muuntaa kokoonpanokielen koodin konekoodiksi; ohjelmaa, joka suorittaa käänteisen tehtävän, kutsutaan disassembleriksi.

Historia

Ensimmäiset kokoonpanijat suunnitteli Kathleen Booth vuonna 1947 ARC2 [2] ja David Wheeler vuonna 1948 EDSAC [3] , kun taas termiä "assembler" ei käytetty, vaan kieltä kutsuttiin yksinkertaisesti "perusohjeiden joukoksi". " ( englanninkielinen  perusjärjestyssarja ) ja "alkukomennot" ( englanninkieliset  aloitusmääräykset ) vastaavasti. Myöhemmissä EDSAC-raporteissa alettiin käyttää ensimmäistä kertaa termiä "assembler" kenttien yhdistämisprosessista ohjaussanaksi.

Myös ohjelmoinnin kehityksen alkuvaiheessa otettiin käyttöön autokoodin käsite  - ohjelmointikieli, jonka lauseet ovat rakenteeltaan periaatteessa samanlaisia ​​​​kuin tietyn konekielen käskyt ja käsitellyt tiedot [4][ tosiasian merkitys? ] . Termiä ei tällä hetkellä varsinaisesti käytetä.

Historiallisesti, jos konekoodeja pidetään ohjelmointikielten ensimmäisen sukupolvena, niin kokoonpanokieltä voidaan pitää ohjelmointikielten toisen sukupolvena. . Assembly-kielen puutteet, esimerkiksi vaikeus kehittää siihen suuria ohjelmistojärjestelmiä, johtivat myöhemmin kolmannen sukupolven kielten - korkean tason ohjelmointikielten (kuten Fortran , Lisp , Cobol , Pascal ) syntymiseen. , C ja muut).

Syntaksi

Yleisesti käytettyä kokoonpanokielen syntaksia ei ole. Koska eri prosessorien käskyjärjestelmät eroavat huomattavasti, myös näiden prosessorien kokoonpanokielet eroavat toisistaan. Lisäksi jokainen kokoonpanoohjelma voi käyttää erilaista syntaksia. X86-prosessorien kokoajissa käytetään laajimmin niin kutsuttua Intel-syntaksia ja vähemmässä määrin  AT&T-syntaksia .

Mnemoniikka

Assembly-kielen perusrakenne on muistomerkki eli muistokoodi - lyhyt symbolinen esitys prosessorin käskystä. Pääsääntöisesti se koostuu useista merkeistä, jotka osoittavat suoritettavan toimenpiteen (esimerkiksi movsiirtää rekisteristä toiseen, addlisätä arvoja jne.). Muistomerkki voi myös sisältää kohteen, jolle toiminto suoritetaan (rekisteri, muisti, pino) tai muita ominaisuuksia (vaikutus lippurekisteriin , suoritusehdot jne.), mutta muissa murteissa samat ominaisuudet voivat olla määritellään operandeissa.

Pääsääntöisesti kunkin prosessorin assemblerillä on oma perinteinen muistomerkkisarja, mutta on monialustaisia ​​syntaksisia assemblereitä (kuten AT&T-syntaksia), mutta niissä säilyvät vain merkinnät, yhden prosessorin koodi. ei voi siirtää suoraan toiselle.

Operandit

Rekisterit, vakioarvot, muistisolujen ja I/O-porttien osoitteet , vakiot, etiketit jne. voidaan määrittää operandeiksi. Eri kokoajat voivat vaatia erilaisen operandijärjestyksen: joissakin toteutuksissa operaattori, jossa arvo kirjoitetaan, on ensin, toisissa se tulee viimeiseksi. Operandit erotetaan käskymnemoniikasta pääsääntöisesti välilyönnillä.

Literaalit

Yleisin tietotyyppi , jonka kanssa useimmat prosessorit voivat työskennellä, on konesanaan pakattu kokonaisluku tai yksi tai useampi tavu , harvemmin liukuluku . Assembly-ohjelmissa käytetään paljon useammin eri numerojärjestelmissä annettuja arvoja. Ensinnäkin tietokoneissa, joissa on kahdeksan bitin tavu, käytetään usein heksadesimaalimerkintää , koska kaksi heksadesimaalilukua sijoitetaan yhteen tavuun. Jotkut arvot voidaan kirjoittaa binäärikoodeilla. Varhaisissa tietokoneissa, joissa oli kuusibittinen tavu, havaittiin myös oktaalilukujärjestelmä . Kirjoitusmenetelmät voivat vaihdella eri kokoajissa, esimerkiksi:

Lisäksi joskus on tarpeen määrittää ohjelmakoodin mukana ladattavat tietolohkot, joille kokoaja voi sisältää erityisiä ohjeita. Nykyaikaiset kokoajat voivat myös tukea tiedon organisointia erilaisten rakenteiden muodossa .

Ilmeisyyden elementit

Kokoonpanijat voivat tukea erilaisia ​​rakenteita kokoonpanokoodin helpottamiseksi lukea, vapauttaa ohjelmoijan tarpeesta seurata ohjeiden osoitteita ja toteuttaa elementtejä, jotka ovat ominaisia ​​korkean tason kielille.

Koodin muotoilustandardit

Kokoonpanokoodi ei yleensä käytä korkean tason kielille ominaisia ​​sisennys- ja operaattorisulkeja . Kokoonpanokoodi kirjoitetaan yleensä useisiin sarakkeisiin, jotka sisältävät:

Tämä kirjoitustapa heijastaa ohjelmien suorittamisen erikoisuutta yleisprosessoreilla: konekoodien tasolla ohjelmat ovat yleensä lineaarisia, niillä ei ole rakennetta ja yhdestä kohdasta ohjelmassa voidaan siirtyä toiseen, riippumatta kohdasta, jossa ohjelmakoodin alku sijaitsee ja ohjelma jatkaa suoritusta siitä kohdasta alkaen paikkaan, jossa siirto tehtiin. Esimerkki kokoonpanokieliohjelmasta PIC16 -arkkitehtuurille :

Jälleen: movf 0x40 , W ;Kopioi sijainti 0x40 (desimaali 64) W-rekisteriin addlw 0x05 ; Lisää vakio 5 W-rekisteriin movwf PORTC ;Kirjoita W-rekisteri mikrokontrollerin PORTC - lähtöporttiin clrw ;Tyhjennä W-rekisteri (tässä ohjeessa ei ole operandeja) Jälleen ;Siirry etikettiin Again

Edut ja haitat

Koska assembler-koodi käännetään yksiselitteisesti tietyn prosessorin konekoodiksi, voit käyttää prosessorin kaikkia ominaisuuksia täydellisemmin, vähentää tarpeettomia "tyhjäkäyntiä" ja käyttää muita ohjelmakoodin optimointimenetelmiä, jotka eivät ole käytettävissä. kääntäjiä käytettäessä optimoivien kääntäjien kehitys johtaa kuitenkin siihen, että niiden tuottaman koodin laatu voi olla korkeampi kuin kohtalaisen taitava assembler-ohjelmoija pystyy kirjoittamaan [5] . Lisäksi, mitä suurempi ohjelman volyymi, sitä pienempi hyöty on kokoonpanokielen käytöstä.

Assembly-kieliohjelmat eivät salli määrittelemätöntä käyttäytymistä , mutta yleensä koodin kirjoittaminen ja virheenkorjaus kokoonpanossa vaatii enemmän vaivaa. Tyyppiohjaus ei ole käytettävissä assemblerissä , minkä vuoksi ohjelmoijan on itse ohjattava tietyn arvon merkitystä ja siihen liittyviä sallittuja toimia. Assembly-kielisiä ohjelmia kirjoitettaessa on käytettävä jatkuvasti pinoa ja rajoitettua määrää yleiskäyttöisiä rekistereitä sekä osoittimia, mikä edellyttää ohjelmoijalta tarkkaavaisuutta ja hyvää muistia.

Kokoonpanokieliohjelmia on lähes mahdotonta siirtää koneelle, jolla on erilainen arkkitehtuuri tai käskysarja kirjoittamatta ohjelmaa uudelleen, vaikka kirjoitettaessa olisi käytetty "alustojen välistä" kokoonpanokielen murretta: eri prosessoriarkkitehtuureissa on erilaiset rekisterit, liput, eri konesanojen kokoja, ja niissä voi myös olla erittäin erikoistuneita komentoja, joita ei ole saatavilla muilla alustoilla.

Assembler - ohjelmalla on enemmän mahdollisuuksia olla vuorovaikutuksessa laitteiston ja käyttöjärjestelmän ytimen kanssa . Esimerkiksi varhaisissa kodin tietokoneissa ja pelikonsoleissa ei ehkä ollut sisäänrakennettua riittävän korkearesoluutioista ajastinta , mutta samaan aikaan prosessorin kellotaajuus oli vakio kaikille samantyyppisille laitteille, mikä mahdollisti sen. käyttää prosessoria ajastimena, laskemalla jaksojen lukumäärää tiettyjen komentojen suorittamiseksi ja lisäämällä tyhjiä operaatioita oikeisiin paikkoihin. Nykyaikaisissa prosessoreissa, jotka käyttävät sisäänrakennettuja suorituskyvyn optimointipiirejä, dynaamisia kellotaajuuden muutoksia ja monimutkaisia ​​keskeytysjärjestelmiä, ja vielä enemmän moniajokäyttöjärjestelmän hallinnassa , tällaiset tekniikat ovat tulleet mahdottomaksi, mutta niitä käytetään edelleen joissakin mikro -ohjaimissa .

Sovellus

Kokoonpanijoiden tulo helpotti suuresti varhaisten tietokoneiden ohjelmointia, mutta melko nopeasti sovellettujen ongelmien monimutkaisuus vaati korkean tason kielten käyttöä. Nämä kielet suoritettiin kuitenkin melko hitaasti, ja lisäksi heillä ei aina ollut pääsyä kaikkiin tietokoneen laitteistoominaisuuksiin. Kun keskustietokoneiden ja minitietokoneiden suorituskyky kasvoi ja kielten, kuten C :n , ilmaantumisen myötä kokoonpanokielen merkitys alkoi laskea, mutta nousi jälleen mikrotietokoneiden myötä . Varhaisilla mikroprosessoreilla oli pääsääntöisesti heikko suorituskyky ja pieni määrä käytettävissä olevaa RAM -muistia , ja lisäksi korkealaatuisia kielikääntäjiä korkean tason kielille ei heti ilmestynyt heille. Usein kotitietokoneiden ohjelmat, mukaan lukien pelit, kirjoitettiin kokonaan assemblerilla. Kuitenkin 2000-luvun alussa tietokoneiden kasvavaan suorituskykyyn lisättiin optimoivia kääntäjiä , jotka tuottivat konekoodia, joka oli optimaalisempaa kuin keskivertoohjelmoija pystyi kirjoittamaan. Lisäksi kysymys siirrettävyydestä eri alustojen välillä on noussut tärkeäksi.

Assembly-kieltä käytetään myös virheenkorjauksessa ja käänteisessä suunnittelussa käyttämällä disassembler -ohjelmia . Disassemblerin avulla voit ohjata ohjelman suorittamista konekäskyjen tasolla, mikä on hyödyllistä esimerkiksi etsittäessä paikkoja, joissa on määrittelemätön toiminta tai virheitä, joita ilmenee osoittimien kanssa työskennellessä.

Assembler insertit

Kehityksen helpottamiseksi käytettiin seuraavaa lähestymistapaa: suurin osa koodista on kirjoitettu korkean tason kielellä ja vain osat, joiden suorituskyky on kriittistä tai jotka vaativat suoran pääsyn tietokoneen laitteistoresursseihin, kirjoitetaan assemblerilla.

Demoscene

Esimerkkejä

Esimerkkejä

Hei maailma!

COM - ohjelma MS-DOS :lle TASM - murteella .MALLI PIENI KOODISEGMENTTI OLETA CS : KOODI , DS : CODE ORG 100 h ALOITUS : mov ah , 9 mov dx , OFFSET Viesti int 21 h int 20 h Viesti DB ' Hello World ' , 13 , 10 , CODE END $ S _ _ ALKAA EXE - ohjelma MS-DOS :lle TASM - murteella .MODEL SMALL .DATA msg DB ' Hello World ' , 13 , 10 , ' $ ' .CODE START : mov ax , @ DATA mov ds , ax mov ax , 0900 h lea dx , msg int 21 h mov ax0h , int4 _ 21 h LOPPU ALOITUS Ohjelma Linuxille / x86 NASM -murteella SECTION .data msg: db " Hei , maailma " , 10 len: equ $-msg SECTION .text global _start _start: mov edx , len mov ecx , msg mov ebx , 1 ; stdout mov eax , 4 ; write(2) int 0x80 mov ebx , 0 mov eax , 1 ; exit(2) int 0x80 Ohjelma FreeBSD / x86 :lle NASM -murteella SECTION .data msg: db " Hei , maailma " , 10 len: equ $-msg SECTION .text global _start syscall: int 0x80 ret _start: push len push msg push 1 ; stdout mov eax , 4 ; write(2) kutsu syscall add esp , 3 * 4 push 0 mov eax , 1 ; exit(2) kutsu syscall Ohjelma Microsoft Windowsille MASM -murteella .386 .model flat , stdcall vaihtoehto casemap : none include \ masm32 \ include \ windows.inc include \ masm32 \ include \ kernel32.inc includelib \ masm32 \ lib \ kernel32.lib .data msg db " Hei , maailma " , 13 , 10 len equ $ - msg .data ? kirjoitettu dd ? .code- aloitus: push -11 kutsu GetStdHandle push 0 push OFFSET kirjoitettu push len push OFFSET msg push eax kutsu WriteFile paina 0 kutsu ExitProcess loppu alku Konsoliohjelma Windowsille FASM- murteella muoto PE - konsolin merkinnän aloitus include ' include \ win32a.inc ' osio ' .data ' data luettavissa kirjoitettava viesti db ' Hei maailma ! _ ' , 0 osa ' .code ' koodi luettava suoritettava alku: ; CINVOKE-makro FASMissa. ; Voit kutsua CDECL-toimintoja. cinvoke printf , viesti cinvoke getch ; INVOKE on samanlainen makro STDCALL-funktioille. kutsu ExitProcess , 0 osio ' .idata ' tuoda data luettavissa oleva kirjasto ydin ' kernel32.dll ' , \ msvcrt , ' msvcrt.dll ' tuo ydin \ ExitProcess , ' ExitProcess ' _ tuo msvcrt , \ printf , ' printf ' , \ getch , ' _getch ' 64-bittinen Windows-ohjelma YASM -murteella (käyttäen Microsoftin linkkeriä) ;yasm-1.0.0-win32.exe -f win64 HelloWorld_Yasm.asm ;setenv /Release /x64 /xp ;link HelloWorld_Yasm.obj Kernel32.lib User32.lib /entry:main /subsystem:windows / LARGEADNO6 bittiä globaali pää extern MessageBoxA extern ExitProcess section .data mytit db ' Windowsin ja assemblerin 64 - bittinen maailma ... ' , 0 mymsg db ' Hei maailma ! _ ' , 0 osio .text main: mov r9d , 0 ; uType = MB_OK mov r8 , mytit ; LPCSTR lpCaption mov rdx , mymsg ; LPCSTR lpText mov rcx , 0 ; hWnd = HWND_DESKTOP- kutsu MessageBoxA mov ecx , eax ; uExitCode = MessageBox(...) kutsu ExitProcess ret Ohjelma Solaris- ja SPARC-arkkitehtuurille .section ".data " hello: .asciz "Hei maailma!\n" .osio ".text" .align 4 .global main pää: tallenna %sp , -96 , %sp ! varaa muistia Mov 4 , %g1 ! 4 = KIRJOITA ( järjestelmäkutsu ) mov 1 , % o0 ! 1 = STDOUT set hello , %o1 mov 14 , %o2 ! merkkien määrä ta 8 ! järjestelmäpuhelu _ ! ohjelma lopettaa mov 1 , % g1 ! siirrä 1 ( exit () syscall ) kohtaan %g1 mov 0 , %o0 ! siirrä 0 ( palautusosoite ) kohtaan % o0 ta 8 ! järjestelmäpuhelu _

Esimerkkiohjelmia erilaisille mikrokontrollereille

ASM-51 ohjelma AT89S52 mikrokontrollerille ( MCS-51 perhe )

Tämä ohjelma lähettää takaisin UART-sarjaportin kautta vastaanotetun merkin ("Echo"):

mov SCON , #50 h mov TH1 , #0 FDh orl TMOD , #20 h setb TR1 taas: clr RI jnb RI , $ mov A , SBUF jnb RI , $ clr TI mov SBUF , A jnb TI , jälleen $ sjmp Esimerkkejä C :n kääntämisestä kokoonpanokieleksi ARM-arkkitehtuurille

Bittitoiminnot:

C:

z = ( a << 2 ) | ( b & 15 );

Kokoaja:

ADR r4 , a ; hanki osoite LDR :lle r0 ,[ r4 ] ; hanki MOV :n arvo r0 , r0 , LSL #2 ; suorittaa vaihto ADR r4 , b ; hanki osoite b LDR r1 ,[ r4 ] ; saada arvo b JA r1 , r1 , #15 ; suorittaa JA ORR r1 , r0 , r1 ; suorittaa TAI ADR r4 , z ; hanki osoite z STR r1 ,[ r4 ] ; tallenna z:n arvo

Oksat:

C:

jos ( i == 0 ) { i = i + 10 ; }

Kokoaja:

@(muuttuja i on rekisterissä R1 ) SUBS R1 , R1 , #0 ADDEQ R1 , R1 , # 10

Syklit:

C:

for ( i = 0 ; i < 15 ; i ++ ) { j = j + j _ }

Kokoaja:

SUB R0 , R0 , R0 ; i -> R0 ja i = 0 aloittaa CMP R0 , #15 ; olenko <15? ADDLT R1 , R1 , R1 ; j = j + j ADDLT R0 , R0 , #1 ; i++ BLT käynnistyy Ohjelma PIC16F628A-mikro-ohjaimelle ( PIC -arkkitehtuuri )

Jos mikro-ohjaimen PORTB-porttiin on kytketty 8 LEDiä, ohjelma sytyttää ne yhden jälkeen:

LIST p = 16 F628A __CONFIG 0309 H STATUS equ 0x003 RP0 equ 5 TRISB equ 0x086 PORTB equ 0x006 ORG 0x0000 ;Aloitusvektori aloitti ;Siirry pääkoodin alkuun aloitus: bsf STATUS , RP0 ;Valitse pankki 1 clrf TRISB ; Kaikki PORTB:n bitit ovat lähtöjä bcf STATUS , RP0 ;Valitse pankki 0 led: movlw .170 ;Kirjoita binääriarvo "10101010" PORTB : hen PORTB movwf ; LOPPU Ohjelma MSP430G2231-mikro-ohjaimelle ( MSP430 -arkkitehtuuri ) Code Composer Studiossa .cdecls C , LIST , "msp430g2231.h" ;--------------------------------------- -------------- ------------------------------------- ---- .teksti ; Ohjelma aloitetaan ;----------------------------------------------- ------ -------------------------------- RESET mov.w #0280 h , SP ; Alusta pinoosoitin StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Pysäytä WDT SetupP1 bis.b #001 h , & P1DIR ; P1.0 lähtö ; Mainloop bit.b #010 h , & P1IN ; P1.4 hi/low? jc ON ; jmp--> P1.4 on asetettu ; OFF bic.b #001 h , & P1OUT ; P1.0 = 0 / LED POIS jmp Mainloop ; ON bis.b #001 h , & P1OUT ; P1.0 = 1 / LED PÄÄLLÄ jmp Mainloop ; ; ;------------------------------------------------- ----------------------------- ; Keskeytysvektorit ;------------------------------------------------ ------ -------------------------------- .sect ".reset" ; MSP430 RESET Vector .short RESET ; .end

Muistiinpanot

  1. https://cs.lmu.edu/~ray/notes/x86assembly/
  2. Yleisiä huomioita yleiselektronisen digitaalisen tietokoneen suunnittelussa, arkistoitu 24. maaliskuuta 2020 Wayback Machinessa , kirjoittaneet Andrew D. Booth ja Kathleen HV Britten. 2. painos. elokuuta 1947.
  3. 1985 Computer Pioneer Award "Assembly-kieliohjelmoinnista".
  4. GOST 19781-83 // Tietojenkäsittelytiede. Terminologia: Viiteopas. Numero 1 / Arvostelija Ph.D. tekniikka. Tieteet Yu. P. Selivanov. - M . : Publishing House of Standards, 1989. - 168 s. - 55 000 kappaletta.  — ISBN 5-7050-0155-X .
  5. Chris Kaspersky. War of the Worlds: Assembler vs. C (linkki ei saatavilla) . Haettu 1. kesäkuuta 2010. Arkistoitu alkuperäisestä 29. heinäkuuta 2010. 

Kirjallisuus

  • Galiseev GV Assembler for Win 32. Opetusohjelma. - M . : Dialektiikka , 2007. - 368 s. - ISBN 978-5-8459-1197-1 .
  • Zubkov SV Assembler DOS:lle, Windowsille ja UNIXille. - M. DMK Press; SPb. Peter, 2006. - 608 s. — ISBN 5-94074-259-9 .
  • Kip Irvine. Intel-prosessorien kokoonpanokieli = Intel-pohjaisten tietokoneiden kokoonpanokieli. — M .: Williams , 2005. — 912 s. — ISBN 0-13-091013-9 .
  • Kalashnikov O. A. Kokoonpanija? Se on yksinkertaista! Ohjelmoinnin oppiminen. - Pietari. : BHV-Petersburg , 2007. - 384 s. — ISBN 978-5-94157-709-5 .
  • Chris Kaspersky. Purkamisen taito. - Pietari. : BHV-Petersburg , 2008. - 896 s. - ISBN 978-5-9775-0082-1 .
  • Vladislav Pirogov. Assembler Windowsille. - Pietari. : BHV-Petersburg , 2007. - 896 s. - ISBN 978-5-9775-0084-5 .
  • Vladislav Pirogov. Kokoaminen ja purkaminen. - Pietari. : BHV-Petersburg , 2006. - 464 s. — ISBN 5-94157-677-3 .
  • Richard Simon. Microsoft Windows API -järjestelmäohjelmoijan opas.
  • Frunze A. V. Mikro-ohjaimet? Se on yksinkertaista! - T. 1.
  • Yurov V., Khoroshenko S. Kokoonpanija: koulutus. - Pietari. : Peter , 1999. - S. 672. - ISBN 5-314-00047-4 .
  • Ablyazov R. Z. Ohjelmointi assemblerissä x86-64-alustalla. - M .: DMK Press , 2011. - S. 304. - ISBN 978-5-94074-676-8 .
  • Yurichev D., Assemblykielen ymmärtäminen https://yurichev.com/writings/UAL-RU.pdf
  • Atmel AVR -mikro-ohjainten käytännön ohjelmointi assembly-kielellä .. - 2. - BHV-Petersburg, 2014. - 368 s. - (Elektroniikka). — ISBN 9785977533119 .

Linkit