Assembly-kielen ohjerakenne sisältää. IBM-PC:n Assembler-kielen komentojärjestelmän yleiset ominaisuudet (komentojen perusjoukko, perustavat operandien osoitteisiin). Ohjelman rakenne Assembler-kielellä. ohjelman osia. olettaa ohjetta

Aihe 1.4 Assembler-muistotekniikka. Komentorakenne ja -muodot. Osoitteen tyypit. Mikroprosessorin ohjesarja

Suunnitelma:

1 Kokoonpanokieli. Peruskonseptit

2 Assembly kielen symbolit

3 Assembler-lauseiden tyypit

4 Kokoontumisohjeet

5 Prosessorin ohjesarja

1 Ikokoonpanokieli. Peruskonseptit

kokoonpanokielion konekielen symbolinen esitys. Kaikkia koneen alimmalla, laitteistotasolla olevia prosesseja ohjaavat vain konekielen komennot (käskyt). Tästä on selvää, että yleisestä nimestä huolimatta kunkin tietokonetyypin kokoonpanokieli on erilainen.

Assembly-kieliohjelma on kokoelma muistilohkoja, joita kutsutaan nimellä muistisegmentit. Ohjelma voi koostua yhdestä tai useammasta näistä lohkosegmenteistä. Jokainen segmentti sisältää kokoelman kielilauseita, joista jokaisella on oma ohjelmakoodirivi.

Asennuslausuntoja on neljää tyyppiä:

1) komentoja tai ohjeita jotka ovat konekäskyjen symbolisia analogeja. Käännösprosessin aikana kokoonpanokäskyt muunnetaan vastaaviksi mikroprosessorin käskyjoukon komentoiksi;

2) makrot -ohjelman tekstin tietyllä tavalla formalisoidut lauseet korvataan lähetyksen aikana muilla lauseilla;

3) käskyjä,jotka ovat ohjeita assembler-kääntäjälle suorittamaan joitain toimintoja. Direktiiveillä ei ole vastaavia koneen esittämisessä;

4) kommenttirivit , joka sisältää mitä tahansa merkkejä, mukaan lukien venäjän aakkosten kirjaimet. Kääntäjä jättää kommentit huomioimatta.

­ Kokoonpanoohjelman rakenne. assembler-syntaksi.

Ohjelman muodostavat lauseet voivat olla komentoa, makroa, käskyä tai kommenttia vastaava syntaktinen rakennelma. Jotta assembler-kääntäjä tunnistaa ne, ne on muodostettava tiettyjen syntaktisten sääntöjen mukaisesti. Tätä varten on parasta käyttää kielen syntaksin muodollista kuvausta, kuten kieliopin sääntöjä. Yleisimmät tavat kuvailla tällaista ohjelmointikieltä - syntaksikaaviot Ja Backus-Naurin laajennetut muodot. varten käytännön käyttöä mukavampi syntaksikaaviot. Esimerkiksi kokoonpanokielen lausekkeiden syntaksi voidaan kuvata käyttämällä seuraavissa kuvissa 10, 11, 12 esitettyjä syntaksikaavioita.

Kuva 10 - Kokoonpanolauseen muoto


­ Kuva 11 - Ohjeiden muoto

­ Kuva 12 - Komentojen ja makrojen muoto

Näissä piirustuksissa:

­ etiketin nimi- tunniste, jonka arvo on ohjelman lähdekoodin lauseen ensimmäisen tavun osoite, jota se ilmaisee;

­ Nimi -tunniste, joka erottaa tämän direktiivin muista samannimistä direktiiveistä. Tietyn direktiivin kokoajan suorittaman käsittelyn seurauksena tälle nimelle voidaan määrittää tiettyjä ominaisuuksia;

­ käyttökoodi (COP) ja ohje - nämä ovat muistomerkkejä vastaavalle konekäskylle, makrokäskylle tai kääntäjälle;

­ operandit -komento-, makro- tai assembler-direktiivin osat, jotka osoittavat objekteja, joille toiminnot suoritetaan. Kokoonpanooperandit kuvataan lausekkeilla, joissa on numeerisia ja tekstivakioita, muuttujatunnisteita ja tunnisteita käyttäen operaatiomerkkejä ja joitain varattuja sanoja.

Syntaksikaaviot auttavat etsi ja kulje sitten polku kaavion syötteestä (vasemmalla) sen ulostuloon (oikealle). Jos tällainen polku on olemassa, lause tai rakenne on syntaktisesti oikein. Jos tällaista polkua ei ole, kääntäjä ei hyväksy tätä rakennetta.

­ 2 Kokoonpanokielen symbolit

Sallitut merkit ohjelmien tekstiä kirjoitettaessa ovat:

1) Kaikki kirjaimet: A-Z,a-z. Tässä tapauksessa isoja ja pieniä kirjaimia pidetään vastaavina;

2) numerot alkaen 0 ennen 9 ;

3) merkit ? , @ , $ , _ , & ;

4) erottimet , . () < > { } + / * % ! " " ? = # ^ .

Assembler-lauseet muodostetaan rahakkeita, jotka ovat syntaktisesti erottamattomia kelvollisten kielten merkkijonoja, jotka ovat kääntäjän kannalta järkeviä.

rahakkeita ovat:

1) tunnisteet - kelvollisia merkkijonoja, joita käytetään osoittamaan ohjelmaobjekteja, kuten opkoodeja, muuttujien nimiä ja nimiön nimiä. Tunnisteiden kirjoittamista koskeva sääntö on seuraava: tunniste voi koostua yhdestä tai useammasta merkistä;

2) merkkijonoja - merkkijonoja, jotka on suljettu yksittäiseen tai kaksoislainausmerkit;

3) kokonaislukuja jossakin seuraavista lukujärjestelmistä : binääri, desimaali, heksadesimaali. Numeroiden tunnistaminen kirjoitettaessa niitä assembler-ohjelmiin tapahtuu tiettyjen sääntöjen mukaisesti:

4) desimaaliluvut eivät vaadi tunnistamiseen lisäsymboleja, esim. 25 tai 139. Tunnistettavaksi ohjelman lähdekoodissa binääriluvut on tarpeen kirjoittaa niiden koostumukseen sisältyvien nollien ja ykkösten kirjoittamisen jälkeen latinaksi " b”, esimerkiksi 10010101 b.

5) heksadesimaaliluvuilla on enemmän merkintöjä:

Ensinnäkin ne koostuvat numeroista. 0...9 , latinalaisten aakkosten pienet ja isot kirjaimet a,b, c,d,e,f tai A,B,C,D,E,F.

Toiseksi kääntäjällä voi olla vaikeuksia tunnistaa heksadesimaalilukuja, koska ne voivat koostua pelkästään numeroista 0...9 (esimerkiksi 190845) tai alkaa latinalaisten aakkosten kirjaimella (esim. ef15). "Selittääkseen" kääntäjälle, että annettu lekseemi ei ole desimaaliluku tai tunniste, ohjelmoijan on erityisesti osoitettava heksadesimaaliluku. Tätä varten kirjoita heksadesimaaliluvun muodostavien heksadesimaalilukujen sarjan loppuun latinalainen kirjain " h". Tämä on edellytys. Jos heksadesimaaliluku alkaa kirjaimella, sitä edeltää etunolla: 0 ef15 h.

Melkein jokainen lause sisältää kuvauksen kohteesta, jolla tai jonka avulla jokin toiminto suoritetaan. Näitä objekteja kutsutaan operandit. Ne voidaan määritellä näin: operandit- Nämä ovat objekteja (jotkin arvot, rekisterit tai muistisolut), joihin käskyt tai käskyt vaikuttavat, tai ne ovat objekteja, jotka määrittelevät tai tarkentavat käskyjen tai käskyjen toimintaa.

On mahdollista suorittaa seuraava operandiluokitus:

­ vakio- tai välittömät operandit;

­ osoiteoperandit;

­ siirretyt operandit;

osoite laskuri;

­ rekisteröidä operandi;

­ perus- ja indeksioperandit;

­ rakenteelliset operandit;

levyjä.

Operandit ovat peruskomponentteja, jotka muodostavat osan konekäskyä ja osoittavat objekteja, joille operaatio suoritetaan. Yleisemmässä tapauksessa operandit voidaan sisällyttää komponentteina monimutkaisempiin muodostelmiin, joita kutsutaan ilmaisuja.

Ilmaisut ovat operandien ja operaattoreiden yhdistelmiä kokonaisuutena. Lausekkeen arvioinnin tulos voi olla jonkin muistisolun osoite tai jokin vakio (absoluuttinen) arvo.

­ 3 Assembler-lauseiden tyypit

Listataan mahdolliset tyypit asentajan lausunnot ja syntaktiset säännöt assembler-lausekkeiden muodostamiseen:

­ aritmeettiset operaattorit;

­ vuoro operaattorit;

­ vertailuoperaattorit;

­ loogiset operaattorit;

­ indeksioperaattori;

­ tyypin ohitusoperaattori;

­ segmentin uudelleenmäärittelyoperaattori;

­ rakennetyypin nimeämisoperaattori;

­ operaattori lausekkeen osoitteen segmenttikomponentin saamiseksi;

­ lauseke offset get -operaattori.

1 Kokoontumisohjeet

­ Assembler-ohjeet ovat:

1) Segmentointiohjeet. Edellisen keskustelun aikana saimme selville kaikki perussäännöt ohjeiden ja operandien kirjoittamiselle konekieliohjelmassa. Kysymys siitä, miten komentosarja muotoillaan oikein niin, että kääntäjä voi käsitellä ne ja mikroprosessori suorittaa ne, jää avoimeksi.

Mikroprosessorin arkkitehtuuria tarkasteltaessa opimme, että siinä on kuusi segmenttirekisteriä, joiden kautta se voi toimia samanaikaisesti:

­ yhdellä koodisegmentillä;

­ yhdellä pinosegmentillä;

­ yhdellä datasegmentillä;

­ kolmella lisädatasegmentillä.

Fyysisesti segmentti on muistialue, jossa on komentoja ja (tai) tietoja, joiden osoitteet lasketaan suhteessa vastaavan segmenttirekisterin arvoon. Segmentin syntaktinen kuvaus assemblerissä on kuvan 13 mukainen rakenne:


­ Kuva 13 - Segmentin syntaktinen kuvaus assemblerissä

On tärkeää huomata, että segmentin toiminnallisuus on hieman laajempi kuin pelkkä ohjelman jakaminen koodi-, data- ja pinolohkoihin. Segmentointi on osa yleisempää mekanismia, joka liittyy modulaarisen ohjelmoinnin käsite. Se sisältää kääntäjän luomien objektimoduulien suunnittelun yhdistämisen, mukaan lukien eri ohjelmointikielistä tulevat moduulit. Näin voit yhdistää eri kielillä kirjoitettuja ohjelmia. SEGMENT-direktiivin operandit on tarkoitettu tällaisen liiton eri vaihtoehtojen toteuttamiseen.

2) Listauksen valvontaohjeet. Listauksen ohjausohjeet on jaettu seuraaviin ryhmiin:

­ yleiset listauksen valvontaa koskevat direktiivit;

­ tulostusohjeet tiedostoluettelon sisällyttämiseksi;

­ lähtödirektiivit ehdollisille kokoonpanolohkoille;

­ ulostulodirektiivit makrojen luetteloon;

­ ohjeet listan ristiviittausten tietojen näyttämiseksi;

­ listauksen muotomuutoskäskyt.

2 Prosessorin ohjesarja

Prosessorin käskysarja näkyy kuvassa 14.

Harkitse komentojen pääryhmiä.

­ Kuva 14 - Asennusohjeiden luokitus

Komennot ovat:

1 Tiedonsiirtokomennot. Näillä ohjeilla on erittäin tärkeä paikka minkä tahansa prosessorin ohjesarjassa. Ne suorittavat seuraavat olennaiset toiminnot:

­ tallennetaan muistiin prosessorin sisäisten rekisterien sisältö;

­ sisällön kopioiminen muistialueelta toiselle;

­ kirjoittaminen I/O-laitteille ja lukeminen I/O-laitteista.

Joissakin prosessoreissa kaikki nämä toiminnot suoritetaan yhdellä käskyllä MOV (tavunsiirroille - MOVB ) mutta eri tavoilla osoittaa operandit.

Muissa prosessoreissa ohjeen lisäksi MOV lueteltujen toimintojen suorittamiseen on useita muita komentoja. Tiedonsiirtokomentoihin kuuluu myös tiedonvaihtokomentoja (niiden nimitys perustuu sanaan Vaihto ). Saattaa olla mahdollista järjestää tiedonvaihto sisäisten rekisterien välillä, yhden rekisterin kahden puoliskon välillä ( VAIHTAA ) tai rekisterin ja muistipaikan välillä.

2 Aritmeettista komentoa. Aritmeettiset käskyt käsittelevät operandikoodeja numeerisina binääri- tai BCD-koodeina. Nämä komennot voidaan jakaa viiteen pääryhmään:

­ komennot operaatioille, joissa on kiinteä piste (yhteen-, vähennys-, kerto- ja jakolasku);

­ liukulukukäskyt (yhteen-, vähennys-, kerto- ja jakolasku);

­ puhdistuskomennot;

­ lisäys- ja vähennyskomennot;

­ vertailukomento.

3 Kiinteän pisteen käskyt toimivat prosessorin rekistereissä tai muistissa olevilla koodeilla kuten tavallisilla binäärikoodeilla. Liukulukukäskyt (piste) käyttävät numeroesitysmuotoa eksponentin ja mantissan kanssa (yleensä nämä luvut vievät kaksi peräkkäistä muistipaikkaa). Modernissa tehokkaat prosessorit liukulukukäskyjoukko ei rajoitu vain neljään aritmeettiseen operaatioon, vaan sisältää myös monia muita monimutkaisempia käskyjä, esimerkiksi trigonometristen funktioiden laskentaa, logaritmisia funktioita sekä äänen ja kuvan käsittelyssä tarvittavia monimutkaisia ​​funktioita.

4 Clear-komennot on suunniteltu kirjoittamaan nollakoodi rekisteriin tai muistisoluun. Nämä komennot voidaan korvata nollakoodin siirtokäskyillä, mutta erityiset selkeät ohjeet ovat yleensä nopeampia kuin siirtokäskyt.

5 Lisäys (lisää yhdellä) ja vähennyskomennot

(Yhdellä vähennykset) ovat myös erittäin käteviä. Ne voitaisiin periaatteessa korvata yhteen- tai vähennyskäskyillä, mutta lisääminen ja vähentäminen ovat nopeampia kuin lisääminen ja vähentäminen. Nämä ohjeet vaativat yhden tulooperandin, joka on myös lähtöoperandi.

6 Vertaile-käsky on tarkoitettu kahden tulooperandin vertailuun. Itse asiassa se laskee näiden kahden operandin eron, mutta ei muodosta lähtöoperandia, vaan muuttaa vain prosessorin tilarekisterin bittejä tämän vähennyksen tuloksen perusteella. Vertailukäskyä seuraava käsky (yleensä hyppykäsky) jäsentää prosessorin tilarekisterin bitit ja suorittaa toimintoja niiden arvojen perusteella. Jotkut prosessorit tarjoavat ohjeita kahden operandijonon ketjuvertailusta muistissa.

7 Logiikkakomennot. Loogiset käskyt suorittavat operandeille loogisia (bittikohtaisia) operaatioita, eli ne eivät pidä operandikoodeja yhtenä numerona, vaan yksittäisten bittien joukkona. Tässä ne eroavat aritmeettisia ohjeita. Logiikkakomennot suorittavat seuraavat perustoiminnot:

­ looginen JA, looginen TAI, modulo 2 -lisäys (XOR);

­ loogiset, aritmeettiset ja sykliset siirrot;

­ bittien ja operandien tarkistus;

­ prosessorin tilarekisterin bittien (lippujen) asettaminen ja tyhjennys ( PSW).

Logiikkakäskyt mahdollistavat loogisten perusfunktioiden bitti bitiltä laskennan kahdesta tulooperandista. Lisäksi AND-operaatiolla pakotetaan annettujen bittien tyhjennys (yksi operandeista on maskikoodi, jossa tyhjennystä vaativat bitit asetetaan nollaan). OR-operaatiolla pakotetaan asetettuja bittejä (yhtenä operandina käytetään maskikoodia, jossa bitit, jotka vaativat asettamisen yhteen, ovat yhtä suuria kuin yksi). XOR-operaatiolla invertoidaan annetut bitit (yhtenä operandina käytetään maskikoodia, jossa invertoitavat bitit asetetaan ykköseksi). Ohjeet vaativat kaksi tulooperandia ja muodostavat yhden lähtöoperandin.

8 Siirtokomennot mahdollistavat operandin koodin siirtämisen bitti kerrallaan oikealle (alempia bittejä kohti) tai vasemmalle (ylempiä bittejä kohti). Siirron tyyppi (looginen, aritmeettinen tai syklinen) määrittää, mikä on merkittävimmän bitin (siirrettäessä oikealle) tai vähiten merkitsevän bitin (siirrettäessä vasemmalle) uusi arvo, ja määrittää myös, onko merkittävimmän bitin vanha arvo. bitti tallennetaan jonnekin (kun siirretään vasemmalle) tai vähiten merkitsevä bitti (kun siirretään oikealle). Pyörivien siirtojen avulla voit siirtää operandikoodin bittejä ympyrässä (myötäpäivään siirrettäessä oikealle tai vastapäivään siirrettäessä vasemmalle). Tässä tapauksessa vaihtorengas voi sisältää tai ei voi sisältää kantolipun. Siirtolipun bitti (jos käytössä) on asetettu merkitsevimmäksi bitiksi vasemmalle kiertoa varten ja vähiten merkitseväksi bitiksi oikealle kiertoa varten. Vastaavasti siirtolippubitin arvo kirjoitetaan uudelleen vähiten merkitseväksi bitiksi vasemmanpuoleisessa syklisessä siirrossa ja merkitsevimmäksi bitiksi oikeanpuoleisessa syklisessä siirrossa.

9 Hyppykomennot. Hyppykomennot on suunniteltu järjestämään kaikenlaisia ​​silmukoita, haaroja, alirutiinikutsuja jne., eli ne häiritsevät ohjelman peräkkäistä kulkua. Nämä käskyt kirjoittavat uuden arvon käskylaskurirekisteriin ja saavat siten prosessorin hyppäämään järjestyksessä ei seuraavaan käskyyn, vaan mihin tahansa muuhun ohjelmamuistissa olevaan käskyyn. Joidenkin hyppykomentojen avulla voit palata takaisin kohtaan, josta hyppy tehtiin, kun taas toiset eivät. Jos palautus annetaan, nykyiset prosessorin parametrit tallennetaan pinoon. Jos palautusta ei anneta, nykyisiä prosessorin parametreja ei tallenneta.

Hyppykomennot ilman paluuta on jaettu kahteen ryhmään:

­ ehdottomien hyppyjen komennot;

­ ehdolliset hyppyohjeet.

Nämä komennot käyttävät sanoja Branch (oksa) ja Jump (hyppy).

Ehdottomat hyppykomennot aiheuttavat hypyn uusi osoite ei väliä mitä. Ne voivat aiheuttaa hypyn määritettyyn siirtymäarvoon (eteenpäin tai taaksepäin) tai määritettyyn muistiosoitteeseen. Syöttöoperandiksi määritetään siirtymäarvo tai uusi osoite.

Ehdolliset hyppykomennot eivät aina aiheuta hyppyä, vaan vain silloin, kun määritetyt ehdot täyttyvät. Tällaisia ​​ehtoja ovat yleensä prosessorin tilarekisterin lippujen arvot ( PSW ). Toisin sanoen siirtymäehto on tulos edellisestä toiminnosta, joka muuttaa lippujen arvoja. Tällaisia ​​hyppyehtoja voi olla yhteensä 4 - 16. Esimerkkejä ehdollisista hyppykäskyistä:

­ hyppää, jos se on nolla;

­ hyppää jos ei ole nolla;

­ hyppää, jos on ylivuoto;

­ hyppää, jos ylivuotoa ei ole;

­ hyppää, jos suurempi kuin nolla;

­ hyppää, jos pienempi tai yhtä suuri kuin nolla.

Jos siirtymäehto täyttyy, käskylaskurin rekisteriin ladataan uusi arvo. Jos hyppyehto ei täyty, käskylaskuria yksinkertaisesti kasvatetaan ja prosessori valitsee ja suorittaa seuraavan käskyn peräkkäin.

Erityisesti haaraehtojen tarkistamiseen käytetään vertailukäskyä (CMP), joka edeltää ehdollisen hyppykäskyn (tai jopa useita ehdollisia hyppykäskyjä). Mutta liput voidaan asettaa millä tahansa muulla komennolla, kuten tiedonsiirtokomennolla, millä tahansa aritmeettisella tai logiikalla. Huomaa, että hyppykomennot itsessään eivät muuta lippuja, vaan voit laittaa useita hyppykomentoja peräkkäin.

Keskeytyskomennot ovat erityinen paikka paluukomentojen joukossa. Nämä ohjeet vaativat keskeytysnumeron (vektoriosoitteen) syöteoperandiksi.

Johtopäätös:

Assembly-kieli on konekielen symbolinen esitys. Jokaisen tietokoneen kokoonpanokieli on erilainen. Kokoonpanokieliohjelma on kokoelma muistilohkoja, joita kutsutaan muistisegmenteiksi. Jokainen segmentti sisältää kokoelman kielilauseita, joista jokaisella on oma ohjelmakoodirivi. Kokoonpanolauseita on neljää tyyppiä: komennot tai käskyt, makrot, käskyt, kommenttirivit.

Ohjelmien tekstiä kirjoitettaessa kelvolliset merkit ovat kaikki latinalaisia ​​kirjaimia: A-Z,a-z. Tässä tapauksessa isoja ja pieniä kirjaimia pidetään vastaavina; luvut alkaen 0 ennen 9 ; merkkejä ? , @ , $ , _ , & ; erottimet , . () < > { } + / * % ! " " ? = # ^ .

Seuraavat assembler-lausekkeiden tyypit ja syntaksisäännöt pätevät assembler-lausekkeiden muodostukseen. aritmeettiset operaattorit, siirtooperaattorit, vertailuoperaattorit, loogiset operaattorit, indeksioperaattorit, tyypin uudelleenmäärittelyoperaattorit, segmenttien uudelleenmäärittelyoperaattorit, rakennetyypin nimeämisoperaattorit, lausekeosoitteen segmentin hankintaoperaattorit, lausekepoikkeaman hankintaoperaattorit.

Komentojärjestelmä on jaettu 8 pääryhmään.

­ Kontrollikysymykset:

1 Mikä on assembly-kieli?

2 Mitä symboleja voidaan käyttää komentojen kirjoittamiseen assemblerissä?

3 Mitä etiketit ovat ja mikä niiden tarkoitus on?

4 Selitä asennusohjeen rakenne.

5 Luettele 4 tyyppiä assembler-lauseita.

UZBEKISTANIN KANSALLINEN YLIOPISTO, NIMI MIRZO ULUGBEKIN NIMEÄ

TIETOKONETEKNIIKKA

Aiheesta: EXE-tiedoston semanttinen jäsentäminen.

Valmistunut:

Tashkent 2003.

Esipuhe.

Kokoonpanokieli ja ohjerakenne.

EXE-tiedostorakenne (semanttinen jäsennys).

COM-tiedoston rakenne.

Miten virus toimii ja leviää.

Purkaja.

Ohjelmat.

Esipuhe

Ohjelmoijan ammatti on uskomaton ja ainutlaatuinen. Meidän aikanamme tiedettä ja elämää ei voida kuvitella ilman uusinta teknologiaa. Kaikki, mikä liittyy ihmisen toimintaan, ei tule toimeen ilman tietokone Tiede. Ja tämä edistää sen korkeaa kehitystä ja täydellisyyttä. Vaikka henkilökohtaisten tietokoneiden kehitys alkoi ei niin kauan sitten, mutta tänä aikana ohjelmistotuotteissa otettiin valtavia askeleita ja näitä tuotteita käytetään pitkään. Tietokoneisiin liittyvä tietokenttä on kasvanut räjähdysmäisesti, samoin kuin siihen liittyvä tekniikka. Jos emme ota huomioon kaupallista puolta, voimme sanoa, että tällä ammatillisen toiminnan alueella ei ole vieraita. Monet ovat mukana kehittämässä ohjelmia ei voiton tai tulon vuoksi, vaan omasta vapaasta tahdostaan, intohimosta. Tämän ei tietenkään pitäisi vaikuttaa ohjelman laatuun, ja tässä liiketoiminnassa on niin sanotusti kilpailua ja kysyntää laadukkaalle suoritukselle, vakaalle työlle ja kaikkien aikamme vaatimusten täyttämiseen. Tässä on myös syytä huomata mikroprosessorien ilmestyminen 60-luvulla, jotka korvasivat suuren määrän lamppuja. On olemassa erilaisia ​​mikroprosessoreja, jotka eroavat hyvin toisistaan. Nämä mikroprosessorit eroavat toisistaan ​​bittikapasiteetin ja sisäänrakennettujen järjestelmäkomentojen suhteen. Yleisimmät ovat: Intel, IBM, Celeron, AMD jne. Kaikki nämä prosessorit liittyvät Intel-prosessorien edistyneeseen arkkitehtuuriin. Mikrotietokoneiden leviäminen on aiheuttanut asenteiden uudelleen ajattelemisen assembly-kieltä kahdesta pääasiallisesta syystä. Ensinnäkin kokoonpanokielellä kirjoitetut ohjelmat vaativat huomattavasti vähemmän muistia ja ajonaikaa. Toiseksi kokoonpanokielen ja tuloksena olevan konekoodin tuntemus antaa ymmärrystä koneen arkkitehtuurista, jota tuskin tarjotaan korkean tason kielellä työskennellessä. Vaikka useimmat ohjelmistosuunnittelijat kehittävät korkean tason kieliä, kuten Pascal, C tai Delphi, joilla on helpompi kirjoittaa ohjelmia, tehokkain ja tehokkain. ohjelmisto kokonaan tai osittain kirjoitettu konekielellä. Korkean tason kielet on suunniteltu välttämään erityisiä tekniset ominaisuudet tietyt tietokoneet. Ja kokoonpanokieli puolestaan ​​​​on suunniteltu prosessorin erityispiirteisiin. Siksi, jotta voidaan kirjoittaa kokoonpanokieliohjelma tietylle tietokoneelle, on tunnettava sen arkkitehtuuri. Nykyään näkymä tärkeimmistä ohjelmistotuote on EXE-tiedosto. Ottaen huomioon positiivisia puolia Tästä ohjelman tekijä voi olla varma sen loukkaamattomuudesta. Mutta usein tämä on kaukana siitä. Myös purkukone löytyy. Disassemblerin avulla saat selville keskeytykset ja ohjelmakoodit. Kokoonpanijan hyvin perehtyneen henkilön ei ole vaikeaa muokata koko ohjelmaa makunsa mukaan. Ehkä tästä tulee kaikkein ratkaisemattomin ongelma - virus. Miksi ihmiset kirjoittavat viruksia? Jotkut kysyvät tämän kysymyksen hämmästyneenä, jotkut vihaisena, mutta silti on ihmisiä, jotka ovat kiinnostuneita tästä tehtävästä ei vahingon aiheuttamisen kannalta, vaan kiinnostuksena järjestelmäohjelmointiin. Kirjoita virukset päälle eri syistä. Jotkut pitävät järjestelmäkutsuista, toiset parantavat tietämystään assemblerissä. Yritän selittää tämän kaiken omassani tutkielma. Se ei myöskään kerro vain EXE-tiedoston rakenteesta, vaan myös kokoonpanokielestä.

^ Assembly Language.

On mielenkiintoista seurata ensimmäisten tietokoneiden ilmestymisestä nykypäivään asti kokoonpanokieltä koskevien käsitysten muutosta ohjelmoijien keskuudessa.

Assembler oli kerran kieli, jota tietämättä tietokonetta oli mahdotonta saada tekemään mitään hyödyllistä. Pikkuhiljaa tilanne muuttui. Kätevämmät viestintätavat tietokoneen kanssa ilmestyivät. Mutta toisin kuin muut kielet, assembler ei kuollut, lisäksi hän ei voinut tehdä tätä periaatteessa. Miksi? Etsiessään vastausta yritämme ymmärtää, mikä kokoonpanokieli yleensä on.

Lyhyesti sanottuna kokoonpanokieli on konekielen symbolinen esitys. Kaikkia koneen alimmalla, laitteistotasolla olevia prosesseja ohjaavat vain konekielen komennot (käskyt). Tästä on selvää, että yleisestä nimestä huolimatta kunkin tietokonetyypin kokoonpanokieli on erilainen. Tämä pätee myös ulkomuoto Assemblerilla kirjoitetut ohjelmat ja ideat, joita tämä kieli heijastaa.

On mahdotonta todella ratkaista laitteistoon liittyviä ongelmia (tai jopa laitteistoon liittyviä, kuten ohjelman nopeuden parantamista) ilman kokoajan tuntemusta.

Ohjelmoija tai kuka tahansa muu käyttäjä voi käyttää mitä tahansa korkean tason työkaluja, jopa virtuaalimaailmojen rakentamiseen tarkoitettuja ohjelmia, eikä ehkä edes epäile, että tietokone ei todellakaan suorita sen kielen komentoja, jolla sen ohjelma on kirjoitettu, vaan niiden komentoja. muunnettu esitys täysin eri kielen - konekielen - tylsien ja tylsien komentosarjojen muodossa. Kuvitellaan nyt, että tällaisella käyttäjällä on epätyypillinen ongelma tai vain jokin meni pieleen. Esimerkiksi hänen ohjelmansa on toimittava jonkin epätavallisen laitteen kanssa tai suoritettava muita toimintoja, jotka edellyttävät tietokonelaitteiston periaatteiden tuntemista. Huolimatta siitä, kuinka älykäs ohjelmoija on, riippumatta siitä, kuinka hyvällä kielellä hän kirjoitti upean ohjelmansa, hän ei tule toimeen ilman kokoajan tuntemusta. Eikä ole sattumaa, että lähes kaikki korkean tason kielten kääntäjät sisältävät välineet moduulien yhdistämiseen assemblerin moduuleisiin tai tukevat pääsyä assembler-ohjelmointitasolle.

Tietenkin tietokonevaunujen aika on jo ohi. Kuten sanonta kuuluu, äärettömyyttä ei voi hyväksyä. Mutta on jotain yhteistä, eräänlainen perusta, jolle mikä tahansa vakava tietokonekoulutus rakentuu. Tämä on tietoa tietokoneen toiminnan periaatteista, sen arkkitehtuurista ja kokoonpanokielestä tämän tiedon heijastuksena ja ilmentymänä.

Tyypillinen nykyaikainen tietokone (i486- tai Pentium-pohjainen) koostuu seuraavista komponenteista (kuva 1).

Riisi. 1. Tietokone ja oheislaitteet

Riisi. 2. Henkilökohtaisen tietokoneen lohkokaavio

Kuvasta (kuva 1) voidaan nähdä, että tietokone koostuu useista fyysisistä laitteista, joista jokainen on kytketty yhteen yksikköön, jota kutsutaan järjestelmäyksiköksi. Loogisesti on selvää, että sillä on jonkin koordinoivan laitteen rooli. Katsotaanpa sisäänpäin järjestelmälohko(ei tarvitse yrittää päästä näytön sisään - siellä ei ole mitään mielenkiintoista, paitsi se on vaarallista): avaamme kotelon ja näemme joitain levyjä, lohkoja, liitäntäjohtoja. Niiden toiminnallisen tarkoituksen ymmärtämiseksi katsotaanpa tyypillisen tietokoneen lohkokaaviota (kuva 2). Se ei väitä absoluuttista tarkkuutta ja pyrkii vain näyttämään nykyaikaisen henkilökohtaisen tietokoneen elementtien tarkoituksen, yhteenliittämisen ja tyypillisen koostumuksen.

Keskustellaan kuvan kaaviosta. 2 hieman epätavallisella tyylillä.
Ihmisen luonne on uuden tapaaminen etsiä assosiaatioita, jotka voivat auttaa häntä tuntemaan tuntemattoman. Mitä assosiaatioita tietokone herättää? Esimerkiksi minulle tietokone liittyy usein ihmiseen itseensä. Miksi?

Tietokonetta jossain syvyyksissään luova henkilö luuli luovansa jotain samanlaista itselleen. Tietokoneessa on ulkomaailman tiedon havainnointielimiä - tämä on näppäimistö, hiiri, magneettiset levyasemat. Kuvassa 2 nämä elimet sijaitsevat järjestelmäväylien oikealla puolella. Tietokoneessa on elimiä, jotka "sulattavat" vastaanotetun tiedon - nämä ovat prosessori Ja RAM. Ja lopuksi tietokoneessa on puheelimiä, jotka antavat käsittelyn tulokset. Nämä ovat myös joitain oikealla olevista laitteista.

Nykyaikaiset tietokoneet tietysti kaukana ihmisestä. Niitä voidaan verrata olentoihin, jotka ovat vuorovaikutuksessa ulkomaailman kanssa suuren mutta rajoitetun ehdollisten refleksien tasolla.
Tämä refleksisarja muodostaa konekäskyjärjestelmän. Riippumatta siitä, kuinka korkealla tasolla kommunikoit tietokoneen kanssa, loppujen lopuksi kaikki on tylsää ja yksitoikkoista koneen käskyjen sarjaa.
Jokainen konekäsky on eräänlainen ärsyke tämän tai toisen ehdottoman refleksin herättämiseksi. Reaktio tähän ärsykkeeseen on aina yksiselitteinen ja "kiinnitetty" mikrokomentolohkoon mikroohjelman muodossa. Tämä mikroohjelma toteuttaa toimia konekäskyn toteuttamiseksi, mutta jo tietyille annettujen signaalien tasolla logiikka tietokoneeseen, ohjaten siten tietokoneen eri alijärjestelmiä. Tämä on niin sanottu mikroohjelmaohjauksen periaate.

Jatkamme analogiaa henkilön kanssa, toteamme: jotta tietokone syö kunnolla, on keksitty monia käyttöjärjestelmiä, kääntäjiä sadoille ohjelmointikielille jne. Mutta itse asiassa ne kaikki ovat vain ruokalajeja, joilla ruoka (ohjelmat) toimitetaan tiettyjen sääntöjen mukaan vatsa (tietokone). Vain tietokoneen vatsa rakastaa ruokavaliollista, yksitoikkoista ruokaa - anna sille jäsenneltyä tietoa tiukasti järjestettyjen nollien ja ykkösten sarjoina, joiden yhdistelmät muodostavat konekielen.

Siten ulkoisesti polyglottina tietokone ymmärtää vain yhtä kieltä - konekäskyjen kieltä. Tietysti kommunikoidakseen ja työskennelläkseen tietokoneen kanssa ei ole välttämätöntä osata tätä kieltä, mutta melkein jokainen ammattiohjelmoija joutuu ennemmin tai myöhemmin joutumaan opettelemaan sitä. Onneksi ohjelmoijan ei tarvitse yrittää selvittää erilaisten binäärilukuyhdistelmien merkitystä, sillä jo 50-luvulla ohjelmoijat alkoivat käyttää ohjelmointiin konekielen symbolista analogia, jota kutsuttiin kokoonpanokieleksi. Tämä kieli heijastaa tarkasti konekielen kaikkia ominaisuuksia. Tästä syystä, toisin kuin korkean tason kielet, kokoonpanokieli on erilainen jokaiselle tietokonetyypille.

Edellä olevan perusteella voimme päätellä, että koska tietokoneen kokoonpanokieli on "alkuperäinen", tehokkain ohjelma voidaan kirjoittaa vain siihen (edellyttäen, että sen on kirjoittanut pätevä ohjelmoija). Tässä on yksi pieni "mutta": tämä on erittäin työläs prosessi, joka vaatii paljon huomiota ja käytännön kokemusta. Siksi todellisuudessa assembler kirjoittaa pääasiassa ohjelmia, joiden pitäisi tarjota tehokasta työtä laitteiston kanssa. Joskus ohjelman kriittiset osat suoritusajan tai muistin kulutuksen kannalta kirjoitetaan assemblerissä. Myöhemmin ne tehdään aliohjelmien muodossa ja yhdistetään korkean tason kielellä olevaan koodiin.

Minkä tahansa tietokoneen kokoonpanokielen oppiminen kannattaa aloittaa vasta sen jälkeen, kun on selvitetty, mikä osa tietokoneesta on jätetty näkyville ja ohjelmoitavissa tällä kielellä. Tämä on ns. tietokoneohjelmamalli, josta osa on mikroprosessoriohjelmamalli, joka sisältää 32 rekisteriä, jotka ovat enemmän tai vähemmän ohjelmoijan käytettävissä.

Nämä rekisterit voidaan jakaa kahteen suureen ryhmään:

^16 mukautettua rekisteriä;

16 järjestelmärekisteriä.

Assembly-kieliohjelmat käyttävät rekistereitä erittäin voimakkaasti. Useimmilla rekistereillä on tietty toiminnallinen tarkoitus.

Kuten nimestä voi päätellä, käyttäjärekistereitä kutsutaan, koska ohjelmoija voi käyttää niitä kirjoittaessaan ohjelmiaan. Näihin rekistereihin kuuluvat (kuva 3):

Kahdeksan 32-bittistä rekisteriä, joita ohjelmoijat voivat käyttää tietojen ja osoitteiden tallentamiseen (kutsutaan myös yleiskäyttöisiksi rekistereiksi (RON)):

kuusi segmenttirekisteriä: cs, ds, ss, es, fs, gs;

tila- ja valvontarekisterit:

Liput rekisteröi lippuja/lippuja;

eip/ip-komentoosoitinrekisteri.

Riisi. 3. I486- ja Pentium-mikroprosessorien käyttäjärekisterit

Miksi monet näistä rekistereistä näytetään vinoviivalla? Ei, nämä eivät ole erilaisia ​​rekistereitä - ne ovat osia yhtä suurta 32-bittistä rekisteriä. Niitä voidaan käyttää ohjelmassa erillisinä objekteina. Tämä tehtiin Intelin nuoremmille 16-bittisille mikroprosessorimalleille kirjoitettujen ohjelmien toimivuuden varmistamiseksi i8086:sta alkaen. i486- ja Pentium-mikroprosessoreissa on enimmäkseen 32-bittiset rekisterit. Niiden lukumäärä segmenttirekistereitä lukuun ottamatta on sama kuin i8086:lla, mutta mitta on suurempi, mikä näkyy niiden nimityksissä - niillä on
etuliite e (Laajennettu).

^ Yleiskäyttöiset rekisterit
Kaikki tämän ryhmän rekisterit mahdollistavat pääsyn niiden "alaosiin" (katso kuva 3). Kun katsot tätä kuvaa, huomaa, että vain näiden rekistereiden alempia 16- ja 8-bittisiä osia voidaan käyttää itseosoitteeseen. Näiden rekistereiden 16 ylempää bittiä eivät ole käytettävissä itsenäisinä objekteina. Tämä tehdään, kuten yllä totesimme, yhteensopivuuden vuoksi Intelin nuorempien 16-bittisten mikroprosessorimallien kanssa.

Listataan yleiskäyttöisten rekisterien ryhmään kuuluvat rekisterit. Koska nämä rekisterit sijaitsevat fyysisesti mikroprosessorissa aritmeettisen logiikkayksikön (ALU) sisällä, niitä kutsutaan myös ALU-rekistereiksi:

eax/ax/ah/al (akkurekisteri) - akku.
Käytetään välitietojen tallentamiseen. Joissakin komennoissa tämän rekisterin käyttö vaaditaan;

ebx/bx/bh/bl (perusrekisteri) - perusrekisteri.
Käytetään tallentamaan jonkin objektin perusosoite muistiin;

ecx/cx/ch/cl (Count register) - laskurirekisteri.
Sitä käytetään komentoissa, jotka suorittavat joitain toistuvia toimintoja. Sen käyttö on usein implisiittistä ja piilotettu vastaavan komennon algoritmiin.
Esimerkiksi silmukan organisointikomento sen lisäksi, että se siirtää ohjauksen tietyssä osoitteessa sijaitsevaan komentoon, analysoi ja pienentää ecx/cx-rekisterin arvoa yhdellä;

edx/dx/dh/dl (tietorekisteri) - tietorekisteri.
Aivan kuten eax/ax/ah/al-rekisteri, se tallentaa välitietoja. Jotkut komennot vaativat sen käyttöä; Joillekin komennoille tämä tapahtuu implisiittisesti.

Seuraavia kahta rekisteriä käytetään tukemaan ns. ketjuoperaatioita eli operaatioita, jotka prosessoivat peräkkäin elementtiketjuja, joista kukin voi olla 32, 16 tai 8 bittiä pitkä:

esi/si (Source Index register) - lähdeindeksi.
Tämä ketjutoimintojen rekisteri sisältää lähdeketjun elementin nykyisen osoitteen;

edi/di (Destination Index register) - vastaanottajan (vastaanottajan) indeksi.
Tämä ketjutoimintojen rekisteri sisältää kohdeketjun nykyisen osoitteen.

Mikroprosessorin arkkitehtuurissa laitteisto- ja ohjelmistotasolla sellainen tietorakenne kuin pino on tuettu. Mikroprosessorin käskyjärjestelmän pinon kanssa työskentelemiseen on erityisiä komentoja ja sisään ohjelmamalli mikroprosessori tätä varten on erityisiä rekistereitä:

esp/sp (Stack Pointer register) - pinoosoitinrekisteri.
Sisältää osoittimen pinon yläosaan nykyisessä pinosegmentissä.

ebp/bp (Base Pointer register) - pinokehyksen perusosoitinrekisteri.
Suunniteltu järjestämään pinon sisällä olevien tietojen satunnainen pääsy.

Pino on ohjelma-alue mielivaltaisten tietojen väliaikaiseen tallentamiseen. Tietysti datasegmenttiin voidaan tallentaa myös dataa, mutta tällöin jokaiselle väliaikaisesti tallennetulle tiedolle on luotava erillinen nimetty muistisolu, mikä kasvattaa ohjelman kokoa ja käytettävien nimien määrää. Pinon mukavuus on, että sen aluetta käytetään uudelleen, ja tietojen tallentaminen pinoon ja sieltä hakeminen tapahtuu tehokkailla push- ja pop-komennoilla ilman, että nimiä määritetään.
Pinoa käytetään perinteisesti esimerkiksi tallentamaan ohjelman käyttämien rekisterien sisältö ennen aliohjelman kutsumista, joka puolestaan ​​käyttää prosessorin rekistereitä "omiin tarkoituksiinsa". Rekisterien alkuperäinen sisältö vuotaa pinosta aliohjelmasta palatessa. Toinen yleinen tekniikka on välittää sen tarvitsemat parametrit aliohjelmalle pinon kautta. Aliohjelma, joka tietää, missä järjestyksessä parametrit on sijoitettu pinoon, voi ottaa ne sieltä ja käyttää niitä suorituksessaan. Erottuva ominaisuus pino on eräänlainen näytteenottojärjestys sen sisältämistä tiedoista: milloin tahansa pinosta on käytettävissä vain yläelementti, ts. viimeinen pinoon ladattu elementti. Kun ylin elementti ponnahtaa pinosta, seuraava elementti on käytettävissä. Pinon elementit sijaitsevat pinolle varatulle muistialueelle alkaen pinon alaosasta (eli sen maksimiosoitteesta) peräkkäin pieneneviin osoitteisiin. Ylimmän saavutettavan elementin osoite on tallennettu pinoosoitinrekisteriin SP. Kuten mikä tahansa muu ohjelmamuistin alue, pinon on sisällytettävä johonkin segmenttiin tai muodostettava erillinen segmentti. Kummassakin tapauksessa segmentin segmenttiosoite sijoitetaan segmenttipinorekisteriin SS. Siten rekisteripari SS:SP kuvaa käytettävissä olevan pinosolun osoitetta: SS tallentaa pinon segmenttiosoitteen ja SP tallentaa pinoon viimeksi tallennetun datan offsetin (kuva 4, a). Kiinnitetään huomiota siihen, että alkutilassa pinoosoitin SP osoittaa soluun, joka sijaitsee pinon pohjan alla ja ei sisälly siihen.

Kuva 4. Pinon organisaatio: a - alkutila, b - yhden elementin lataamisen jälkeen (tässä esimerkissä AX-rekisterin sisältö), c - toisen elementin lataamisen jälkeen (DS-rekisterin sisältö), d - yhden elementin purkamisen jälkeen elementti, e - kahden elementin purkamisen jälkeen ja palautuksen jälkeen alkuperäiseen tilaan.

Lataus pinoon tapahtuu erityisellä push pino -komennolla. Tämä käsky vähentää ensin pinoosoittimen sisältöä kahdella ja sijoittaa sitten operandin osoitteeseen SP:ssä. Jos esimerkiksi haluamme tilapäisesti tallentaa AX-rekisterin sisällön pinoon, meidän tulee suorittaa komento

Pino siirtyy kuvan 1 tilaan. 1.10, b. Voidaan nähdä, että pinon osoitinta siirretään kaksi tavua ylöspäin ( kohti alempia osoitteita) ja push-komennossa määritetty operandi kirjoitetaan tähän osoitteeseen. Seuraava komento ladata pinoon, esim.

siirtää pinon kuvassa näkyvään tilaan. 1.10, c. Pinoon mahtuu nyt kaksi elementtiä, joista vain ylin on käytettävissä, johon pinoosoitin SP osoittaa. Jos jonkin ajan kuluttua meidän on palautettava pinoon tallennettujen rekisterien alkuperäinen sisältö, meidän on suoritettava pop-komennot (pop) pinosta:

pop DS
pop AX

Kuinka suuri pinon pitäisi olla? Se riippuu siitä, kuinka intensiivisesti sitä käytetään ohjelmassa. Jos esimerkiksi aiot tallentaa pinoon 10 000 tavun taulukon, pinon on oltava vähintään tämän kokoinen. On syytä muistaa, että joissain tapauksissa järjestelmä käyttää pinoa automaattisesti, erityisesti suoritettaessa keskeytyskomentoa int 21h. Tällä komennolla prosessori työntää ensin paluuosoitteen pinoon ja sitten DOS työntää sinne rekisterien sisällön ja muun keskeytettyyn ohjelmaan liittyvän tiedon. Siksi, vaikka ohjelma ei käyttäisi pinoa ollenkaan, sen on silti oltava ohjelmassa ja sen koon on oltava vähintään useita kymmeniä sanoja. Ensimmäisessä esimerkissämme laitamme pinoon 128 sanaa, mikä on ehdottomasti tarpeeksi.

^ Kokoonpanoohjelman rakenne

Kokoonpanokieliohjelma on kokoelma muistilohkoja, joita kutsutaan muistisegmenteiksi. Ohjelma voi koostua yhdestä tai useammasta näistä lohkosegmenteistä. Jokainen segmentti sisältää kokoelman kielilauseita, joista jokaisella on oma ohjelmakoodirivi.

Asennuslausuntoja on neljää tyyppiä:

komennot tai käskyt, jotka ovat konekäskyjen symbolisia vastineita. Käännösprosessin aikana kokoonpanokäskyt muunnetaan vastaaviksi mikroprosessorin käskyjoukon komentoiksi;

makrokomennot - ohjelman tekstin lauseet, jotka on suunniteltu tietyllä tavalla ja jotka korvataan muilla lauseilla käännöksen aikana;

käskyt, jotka käskevät assembler-kääntäjän suorittamaan jonkin toiminnon. Direktiiveillä ei ole vastaavia koneen esittämisessä;

kommenttirivit, jotka sisältävät mitä tahansa merkkejä, mukaan lukien venäjän aakkosten kirjaimet. Kääntäjä jättää kommentit huomioimatta.

^ Kokoonpanokielen syntaksi

Ohjelman muodostavat lauseet voivat olla komentoa, makroa, käskyä tai kommenttia vastaava syntaktinen rakennelma. Jotta assembler-kääntäjä tunnistaa ne, ne on muodostettava tiettyjen syntaktisten sääntöjen mukaisesti. Tätä varten on parasta käyttää kielen syntaksin muodollista kuvausta, kuten kieliopin sääntöjä. Yleisimmät tavat kuvailla ohjelmointikieltä tällä tavalla ovat syntaksikaaviot ja laajennetut Backus-Naur-lomakkeet. Käytännön käyttöön syntaksikaaviot ovat kätevämpiä. Esimerkiksi kokoonpanokielen lausekkeiden syntaksi voidaan kuvata käyttämällä seuraavissa kuvissa esitettyjä syntaksikaavioita.

Riisi. 5. Assembler-lausemuoto

Riisi. 6. Muotoile käskyjä

Riisi. 7. Komentojen ja makrojen muoto

Näissä piirustuksissa:

etiketin nimi - tunniste, jonka arvo on sen osoittaman ohjelman lähdekoodilauseen ensimmäisen tavun osoite;

nimi - tunniste, joka erottaa tämän direktiivin muista samannimistä direktiiveistä. Tietyn direktiivin kokoajan suorittaman käsittelyn seurauksena tälle nimelle voidaan määrittää tiettyjä ominaisuuksia;

operaatiokoodi (COP) ja direktiivi ovat vastaavien konekäskyjen, makrokäskyjen tai kääntäjäohjeiden muistiinpanoja;

operandit - komento-, makro- tai assembler-ohjeiden osat, jotka osoittavat objekteja, joille operaatiot suoritetaan. Kokoonpanooperandit kuvataan lausekkeilla, joissa on numeerisia ja tekstivakioita, muuttujatunnisteita ja tunnisteita käyttäen operaatiomerkkejä ja joitain varattuja sanoja.

^ Kuinka käyttää syntaksikaavioita? Se on hyvin yksinkertaista: sinun tarvitsee vain etsiä ja seurata polkua kaavion syötteestä (vasemmalla) sen ulostuloon (oikealla). Jos tällainen polku on olemassa, lause tai rakenne on syntaktisesti oikein. Jos tällaista polkua ei ole, kääntäjä ei hyväksy tätä rakennetta. Kun työskentelet syntaksikaavioiden kanssa, kiinnitä huomiota nuolien osoittamaan ohituksen suuntaan, koska polkujen joukossa voi olla polkuja, joita voidaan seurata oikealta vasemmalle. Itse asiassa syntaktiset kaaviot heijastavat kääntäjän logiikkaa jäsennettäessä ohjelman syöttölauseita.

Sallitut merkit ohjelmien tekstiä kirjoitettaessa ovat:

Kaikki latinalaiset kirjaimet: A-Z, a-z. Tässä tapauksessa isoja ja pieniä kirjaimia pidetään vastaavina;

Numerot 0-9;

Merkkejä?, @, $, _, &;

Erottimet,. ()< > { } + / * % ! " " ? \ = # ^.

Kokoonpanolauseet muodostetaan lekseemeistä, jotka ovat syntaktisesti erottamattomia kelvollisia kielisymboleja, jotka ovat kääntäjän kannalta järkeviä.

Tunnukset ovat:

Tunnisteet ovat kelvollisia merkkijonoja, joita käytetään osoittamaan ohjelmaobjekteja, kuten opkoodeja, muuttujien nimiä ja nimien nimiä. Tunnisteiden kirjoittamisen sääntö on seuraava: tunniste voi koostua yhdestä tai useammasta merkistä. Merkkeinä voit käyttää latinalaisten aakkosten kirjaimia, numeroita ja joitain erikoismerkkejä - _, ?, $, @. Tunniste ei voi alkaa numeromerkillä. Tunnisteen pituus voi olla enintään 255 merkkiä, vaikka kääntäjä hyväksyy vain ensimmäiset 32 ​​merkkiä ja jättää muut huomioimatta. Voit säätää mahdollisten tunnisteiden pituutta vaihtoehdolla komentorivi mv. Lisäksi on mahdollista käskeä kääntäjää erottamaan isot ja pienet kirjaimet tai jättää huomioimatta niiden eron (mikä tehdään oletusarvoisesti).

^ Kokoonpanokielen komennot.

Assembler-komennot avaavat mahdollisuuden siirtää vaatimuksensa tietokoneelle, mekanismin ohjelman ohjauksen siirtoon (silmukat ja hyppyt) loogista vertailua ja ohjelman organisointia varten. Ohjelmointitehtävät ovat kuitenkin harvoin näin yksinkertaisia. Useimmat ohjelmat sisältävät sarjan silmukoita, joissa useita ohjeita toistetaan, kunnes tietty vaatimus saavutetaan, ja erilaisia ​​tarkistuksia sen määrittämiseksi, mitkä useista toiminnoista suoritetaan. Jotkut komennot voivat siirtää ohjauksen muuttamalla normaalia vaihesarjaa muuttamalla suoraan komentoosoittimen offset-arvoa. Kuten aiemmin mainittiin, eri prosessoreille on erilaisia ​​komentoja, mutta harkitsemme useita komentoja prosessoreille 80186, 80286 ja 80386.

Lippujen tilan kuvaamiseksi tietyn komennon suorittamisen jälkeen käytämme taulukosta valintaa, joka kuvastaa lippujen lippurekisterin rakennetta:

Tämän taulukon alarivillä luetellaan lippujen arvot komennon suorittamisen jälkeen. Tässä tapauksessa käytetään seuraavia merkintöjä:

1 - komennon suorittamisen jälkeen lippu asetetaan (yhtä kuin 1);

0 - komennon suorittamisen jälkeen lippu nollataan (yhtä kuin 0);

r - lipun arvo riippuu komennon tuloksesta;

Komennon suorittamisen jälkeen lippu on määrittelemätön;

välilyönti - komennon suorittamisen jälkeen lippu ei muutu;

Seuraavaa merkintää käytetään esittämään operandit syntaksikaavioissa:

r8, r16, r32 - operandi jossakin tavun, sanan tai kaksoissanan kokorekistereistä;

m8, m16, m32, m48 - operandi muistissa tavua, sanaa, kaksoissanaa tai 48 bittiä;

i8, i16, i32 - tavun, sanan tai kaksoissanan välitön operandi;

a8, a16, a32 - suhteellinen osoite (offset) koodisegmentissä.

Komennot (aakkosjärjestyksessä):

*Nämä komennot on kuvattu yksityiskohtaisesti.

LISÄTÄ
(Lisäys)

Lisäys

^ Komennon hahmotelma:

lisää kohde, lähde

Tarkoitus: kahden lähde- ja kohdeoperandin lisääminen tavu-, sana- tai kaksoissanadimensioina.

Työalgoritmi:

lisää lähde- ja kohdeoperandit;

kirjoita lisäyksen tulos vastaanottimeen;

asettaa liput.

Lippujen tila komennon suorittamisen jälkeen:

Sovellus:
Add-komentoa käytetään kahden kokonaislukuoperandin lisäämiseen. Summauksen tulos sijoitetaan ensimmäisen operandin osoitteeseen. Jos summauksen tulos ylittää kohdeoperandin rajat (tapahtuu ylivuoto), niin tämä tilanne tulee ottaa huomioon analysoimalla cf-lippu ja mahdollisesti käyttämällä adc-komentoa. Lisätään esimerkiksi arvot rekisteriin ax ja muistialueeseen ch. Kun lisäät, sinun tulee ottaa huomioon ylivuotomahdollisuus.

Rekisteröidy plus rekisteri tai muisti:

|000000dw|modregr/rm|

Rekisteröi AX (AL) plus välitön arvo:

|0000010w|--data--|data, jos w=1|

Rekisteri tai muisti plus välitön arvo:

|100000sw|mod000r/m|--data--|data, jos BW=01|

PUHELU
(PUHELU)

Proseduurin tai tehtävän kutsuminen

^ Komennon hahmotelma:

Tarkoitus:

ohjauksen siirto sulje- tai etäproseduuriin, jossa paluupisteen osoite tallennetaan pinoon;

tehtävän vaihto.

Työalgoritmi:
määräytyy operandityypin mukaan:

Nimiö on lähellä - eip / ip-komentoosoittimen sisältö työnnetään pinoon ja samaan rekisteriin ladataan uusi etikettiä vastaava osoitearvo;

Far label - eip/ip- ja cs-komentoosoittimen sisältö työnnetään pinoon. Sitten kaukomerkkiä vastaavat uudet osoitearvot ladataan samoihin rekistereihin;

R16, 32 tai m16, 32 - määritä rekisteri tai muistisolu, joka sisältää poikkeamat nykyisessä käskysegmentissä, johon ohjaus siirretään. Kun ohjaus siirretään, eip/ip-komentoosoittimen sisältö työnnetään pinoon;

Muistiosoitin - määrittää muistipaikan, joka sisältää 4- tai 6-tavuisen osoittimen kutsuttavaan proseduuriin. Tällaisen osoittimen rakenne on 2+2 tai 2+4 tavua. Tällaisen osoittimen tulkinta riippuu mikroprosessorin toimintatilasta:

^ Lippujen tila komennon suorittamisen jälkeen (paitsi tehtäväkytkin):

komennon suoritus ei vaikuta lippuihin

Kun tehtävä vaihdetaan, lippujen arvot muuttuvat siirrettävän tehtävän TSS-tilasegmentin lippurekisterin tietojen mukaan.
Sovellus:
Kutsukomennon avulla voit järjestää joustavan ja monimuuttujaisen ohjauksen siirron aliohjelmaan säilyttäen samalla paluupisteen osoitteen.

Objektikoodi (neljä muotoa):

Suora osoite segmentissä:

|11101000|disp-low|dieep-high|

Epäsuora osoitus segmentissä:

|11111111|mod010r/m|

Epäsuora osoitus segmenttien välillä:

|11111111|mod011r/m|

Suora osoitus segmenttien välillä:

|10011010|offset-low|offset-high|seg-low|seg-high|

CMP
(vertaa operandeja)

Operandi vertailu

^ Komennon hahmotelma:

cmp operandi1, operandi2

Tarkoitus: kahden operandin vertailu.

Työalgoritmi:

suorittaa vähennyslasku (operandi1-operandi2);

tuloksesta riippuen aseta liput, älä muuta operandia1 ja operandi2 (eli älä tallenna tulosta).

Sovellus:
Tämä komento käytetään vertaamaan kahta operandia vähentämällä, kun taas operandit eivät muutu. Liput asetetaan komennon suorittamisen seurauksena. Cmp-käskyä käytetään ehdollisten hyppykäskyjen ja setcc:n tavu kerrallaan käskyn kanssa.

Objektikoodi (kolme muotoa):

Rekisteröity tai rekisteröity muisti:

|001110dw|modreg/m|

Välitön arvo rekisterillä AX (AL):

|0011110w|--data--|data, jos w=1|

Välitön arvo rekisterillä tai muistilla:

|100000sw|mod111r/m|--data--|data, jos sw=0|

DEC
(vähennä operandia 1:llä)

Operandin vähennys yhdellä

^ Komennon hahmotelma:

dec operandi

Tarkoitus: pienennä operandin arvoa muistissa tai rekisterissä yhdellä.

Työalgoritmi:
käsky vähentää 1:n operandista. Lippujen tila komennon suorittamisen jälkeen:

Sovellus:
Dec-komentoa käytetään vähentämään muistissa tai rekisterissä olevan tavun, sanan, kaksoissanan arvoa yhdellä. Huomaa, että komento ei vaikuta cf-lippuun.

Rekisteröidy: |01001reg|

^ Rekisteri tai muisti: |1111111w|mod001r/m|

DIV
(Jaa allekirjoittamaton)

Jaosto allekirjoittamaton

Komentokaavio:

div jakaja

Tarkoitus: suorittaa jakooperaatio kahdelle etumerkittömälle binääriarvolle.

^ Työalgoritmi:
Komento vaatii kaksi operandia - jako ja jakaja. Osinko määritellään implisiittisesti ja sen koko riippuu jakajan koosta, joka määritetään komennossa:

jos jakaja on tavuissa, niin osingon tulee sijaita rekisterissä ax. Leikkauksen jälkeen osamäärä sijoitetaan arvoon al ja jäännös ah;

jos jakaja on sana, niin osingon tulee sijaita rekisteriparissa dx:ax ja jaon alaosan ollessa ax. Toimenpiteen jälkeen osamäärä sijoitetaan ax:een ja jäännös dx:ään;

jos jakaja on kaksoissana, niin osingon on sijaittava rekisteriparissa edx:eax ja osingon alaosan ollessa eax. Leikkauksen jälkeen osamäärä sijoitetaan eax:iin ja loppuosa edx:ään.

^ Lippujen tila komennon suorittamisen jälkeen:

Sovellus:
Komento suorittaa operandien kokonaislukujaon palauttaen jaon tuloksen osamääränä ja jaon loppuosan. Jakotoimintoa suoritettaessa voi tapahtua poikkeus: 0 - jakovirhe. Tämä tilanne ilmenee jommassakummassa kahdesta tapauksesta: jakaja on 0 tai osamäärä on liian suuri mahtumaan eax/ax/al-rekisteriin.

Objektikoodi:

|1111011w|mod110r/m|

INT
(Keskeyttää)

Keskeytyspalvelurutiinin kutsuminen

^ Komennon hahmotelma:

int keskeytyksen_numero

Tarkoitus: kutsua keskeytyspalvelurutiinia käskyoperandin määrittelemällä keskeytysnumerolla.

^ Työalgoritmi:

työnnä lippujen/lippujen rekisteri ja palautusosoite pinoon. Paluuosoitetta kirjoitettaessa kirjoitetaan ensin cs-segmenttirekisterin sisältö, sitten eip/ip-komentoosoittimen sisältö;

nollaa if- ja tf-liput nollaan;

siirrä ohjaus keskeytyskäsittelijälle määritetyllä numerolla. Ohjauksen siirtomekanismi riippuu mikroprosessorin toimintatilasta.

^ Lippujen tila komennon suorittamisen jälkeen:

Sovellus:
Kuten syntaksista näkyy, tällä komennolla on kaksi muotoa:

int 3 - sillä on oma yksilöllinen opkoodi 0cch ja se vie yhden tavun. Tämä seikka tekee siitä erittäin kätevän käyttää useissa ohjelmistovirheenkorjauksissa keskeytyskohtien asettamiseen korvaamalla minkä tahansa käskyn ensimmäinen tavu. Mikroprosessori kohdatessaan komennon, jossa on 0cch komentosarjassa, kutsuu keskeytyskäsittelijää vektorilla numero 3, joka palvelee kommunikointia ohjelmiston debuggerin kanssa.

Käskyn toinen muoto on kaksi tavua pitkä, sen toimintakoodi on 0cdh, ja sen avulla voit aloittaa puhelun keskeytyspalvelurutiinille, jonka vektorinumero on välillä 0-255. Ohjauksen siirron ominaisuudet, kuten todettiin, riippuvat mikroprosessorin toimintatilasta.

Objektikoodi (kaksi muotoa):

Rekisteröidy: |01000reg|

^ Rekisteri tai muisti: |1111111w|mod000r/m|

JCC
JCXZ/JECXZ
(hyppää jos kunnossa)

(Hyppää, jos CX=nolla/ Hyppää, jos ECX=nolla)

Hyppää, jos ehto täyttyy

Hyppää, jos CX/ECX on nolla

^ Komennon hahmotelma:

jcc-etiketti
jcxz etiketti
jecxz etiketti

Tarkoitus: siirtyminen nykyisen komentosegmentin sisällä joistakin ehdoista riippuen.

^ Komentalgoritmi (paitsi jcxz/jecxz):
Lippujen tilan tarkistaminen opkoodin mukaan (se heijastaa tarkistettavaa tilaa):

jos testattava ehto on tosi, siirry operandin osoittamaan soluun;

jos tarkistettava ehto on epätosi, siirrä ohjaus seuraavalle komennolle.

jcxz/jecxz komentoalgoritmi:
Tarkistaminen, että ecx/cx-rekisterin sisältö on nolla:

jos tarkistettu kunto

Ohjelmointi konekäskytasolla on minimitaso, jolla ohjelmointi on mahdollista. Koneen ohjejärjestelmän tulee olla riittävä suorittamaan vaaditut toimenpiteet antamalla ohjeita tietokonelaitteistolle.

Jokainen koneen ohje koostuu kahdesta osasta:

  • leikkaussali - "mitä tehdä" määrittäminen;
  • operandi - prosessointiobjektien määritteleminen, "mitä tehdä".

Mikroprosessorin konekäsky, joka on kirjoitettu kokoonpanokielellä, on yksi rivi, jolla on seuraava syntaktinen muoto:

nimeä komento/ohje operandi(t) ;kommentit

Tässä tapauksessa rivin pakollinen kenttä on komento tai käsky.

Tunniste, komento/käsky ja operandit (jos sellaisia ​​on) erotetaan vähintään yhdellä välilyönnillä tai sarkainmerkillä.

Jos komentoa tai käskyä on jatkettava seuraavalle riville, käytetään kenoviivaa: \.

Oletusarvoisesti kokoonpanokieli ei tee eroa isojen ja pienten kirjainten välillä komentoissa tai käskyissä.

Esimerkki koodiriveistä:

Countdb 1 ;Nimi, käsky, yksi operandi
mov eax,0 ;Komento, kaksi operandia
cbw ; Tiimi

Tunnisteet

Label asennuskielessä voi sisältää seuraavat merkit:

  • kaikki latinalaisten aakkosten kirjaimet;
  • numerot 0-9;
  • erikoismerkit: _, @, $, ?.

Pistettä voidaan käyttää tarran ensimmäisenä merkkinä, mutta jotkut kääntäjät eivät suosittele tätä merkkiä. Varattujen kokoonpanokielen nimiä (direktiivit, operaattorit, komentojen nimet) ei voi käyttää nimikkeinä.

Tarran ensimmäisen merkin on oltava kirjain tai erikoismerkki (ei numero). Suurin pituus tarrat - 31 merkkiä. Kaikkien tarrojen, jotka on kirjoitettu riville, joka ei sisällä assembler-ohjetta, on päätyttävä kaksoispisteeseen: .

Joukkueet

Tiimi kertoo kääntäjälle, mitä toimintoa mikroprosessorin tulee suorittaa. Tietosegmentissä komento (tai käsky) määrittää kentän, työtilan tai vakion. Koodisegmentissä käsky määrittää toiminnon, kuten siirron (mov) tai lisäyksen (add).

direktiivit

Kokoonpanijassa on useita operaattoreita, joiden avulla voit hallita listauksen kokoamis- ja luontiprosessia. Näitä operaattoreita kutsutaan direktiivit . Ne toimivat vain ohjelman kokoamisprosessissa, eivätkä toisin kuin käskyt luo konekoodeja.

operandit

Operandi – objekti, jolle suoritetaan koneen komento tai ohjelmointikielen operaattori.
Käskyssä voi olla yksi tai kaksi operandia tai ei ollenkaan operandia. Operandien lukumäärä määritellään implisiittisesti käskykoodilla.
Esimerkkejä:

  • Ei operandeja ret ;Return
  • Yksi operandi inc ecx ;Increment ecx
  • Kaksi operandia add eax,12 ;Add 12 to eax

Tunnisteen, komennon (ohje) ja operandin ei tarvitse alkaa jostain tietystä kohdasta merkkijonossa. On kuitenkin suositeltavaa kirjoittaa ne sarakkeeseen ohjelman luettavuuden parantamiseksi.

Operandit voivat olla

  • tunnisteet;
  • merkkijonot, jotka on suljettu lainausmerkkeihin tai lainausmerkkeihin;
  • binääri-, oktaali-, desimaali- tai heksadesimaalilukuja.
Tunnisteet

Tunnisteet – kelvollisia merkkijonoja, joita käytetään osoittamaan ohjelmaobjekteja, kuten toimintakoodeja, muuttujien nimiä ja nimiön nimiä.

Tunnisteiden kirjoittamista koskevat säännöt.

  • Tunniste voi olla yksi tai useampi merkki.
  • Merkkeinä voit käyttää latinalaisten aakkosten kirjaimia, numeroita ja joitain erikoismerkkejä: _, ?, $, @.
  • Tunniste ei voi alkaa numeromerkillä.
  • Tunnus voi olla enintään 255 merkkiä pitkä.
  • Kääntäjä hyväksyy tunnisteen ensimmäiset 32 ​​merkkiä ja jättää muut huomioimatta.
Kommentit

Kommentit erotetaan suoritettavasta rivistä merkillä; . Tässä tapauksessa kaikki, mikä on kirjoitettu puolipisteen jälkeen ja rivin loppuun asti, on kommentti. Kommenttien käyttö ohjelmassa parantaa sen selkeyttä, varsinkin jos ohjesarjan tarkoitus on epäselvä. Kommentti voi sisältää mitä tahansa tulostettavia merkkejä, mukaan lukien välilyönnit. Kommentti voi kattaa koko rivin tai seurata komentoa samalla rivillä.

Kokoonpanoohjelman rakenne

Assembly-kielellä kirjoitettu ohjelma voi koostua useista osista, ns moduulit . Jokainen moduuli voi määrittää yhden tai useamman datan, pinon ja koodisegmentin. Jokaisessa täydellisessä kokoonpanokieliohjelmassa on oltava yksi pää- tai päämoduuli, josta sen suoritus alkaa. Moduuli voi sisältää koodia, dataa ja pinosegmenttejä, jotka on ilmoitettu asianmukaisilla ohjeilla. Ennen segmenttien ilmoittamista sinun on määritettävä muistimalli .MODEL-direktiivin avulla.

Esimerkki "ei tee mitään" -ohjelmasta assembly-kielellä:

686P
.MODEL FLAT, STDCALL
.DATA
.KOODI
ALKAA:

RET
LOPETA ALOITUS

Tämä ohjelma sisältää vain yhden mikroprosessorikäskyn. Tämä komento on RET. Se varmistaa ohjelman oikean lopettamisen. Yleensä tätä komentoa käytetään proseduurista poistumiseen.
Loput ohjelmasta liittyvät kääntäjän toimintaan.
.686P - Pentium 6 (Pentium II) suojatun tilan komennot ovat sallittuja. Tämä käsky valitsee tuetun assembler-käskyjoukon määrittämällä prosessorimallin. P-kirjain direktiivin lopussa kertoo kääntäjälle, että prosessori toimii suojatussa tilassa.
.MODEL FLAT, stdcall on litteä muistimalli. Tätä muistimallia käytetään Windows-käyttöjärjestelmässä. stdcall
.DATA on dataa sisältävä ohjelmasegmentti.
.CODE on koodia sisältävä ohjelmalohko.
START on etiketti. Assemblerissä etiketeillä on suuri rooli, mitä ei voi sanoa nykyaikaisista korkean tason kielistä.
END START - ohjelman loppu ja viesti kääntäjälle, että ohjelma on käynnistettävä merkinnästä START.
Jokaisen moduulin tulee sisältää END-käsky, joka merkitsee lopun lähdekoodi ohjelmia. Kaikki rivit, jotka seuraavat END-direktiiviä, ohitetaan. END-direktiivin jättäminen pois aiheuttaa virheen.
END-käskyn perässä oleva otsikko kertoo kääntäjälle sen päämoduulin nimen, josta ohjelman suoritus alkaa. Jos ohjelma sisältää yhden moduulin, END-käskyn jälkeinen nimiö voidaan jättää pois.

Assembly-kielen käskyrakenne Ohjelmointi konekäskytasolla on minimitaso, jolla tietokoneohjelmointi on mahdollista. Koneen ohjejärjestelmän tulee olla riittävä suorittamaan vaaditut toimenpiteet antamalla ohjeita koneen laitteistolle. Jokainen konekäsky koostuu kahdesta osasta: käyttöosasta, joka määrittelee "mitä tehdä" ja operandista, joka määrittelee prosessointiobjektit eli "mitä tehdä". Mikroprosessorin konekäsky, joka on kirjoitettu Assembly-kielellä, on yksirivi, jolla on seuraava muoto: etikettiohje/ohjeoperandi(t) ; kommentit Otsikko, komento/käsky ja operandi erotetaan vähintään yhdellä välilyönnillä tai sarkainmerkillä. Käskyoperandit erotetaan pilkuilla.

Assembly-kielen käskyn rakenne Assembly-kielen ohje kertoo kääntäjälle, mitä toimintoa mikroprosessorin tulee suorittaa. Kokoonpanokäskyt ovat ohjelmatekstissä määritettyjä parametreja, jotka vaikuttavat kokoonpanoprosessiin tai tulostiedoston ominaisuuksiin. Operandi määrittää datan alkuarvon (tietosegmentissä) tai elementit, joihin käsky vaikuttaa (koodisegmentissä). Käskyssä voi olla yksi tai kaksi operandia tai ei yhtään operandia. Operandien lukumäärä määritellään implisiittisesti käskykoodilla. Jos komentoa tai käskyä on jatkettava seuraavalle riville, käytetään kenoviivaa: "" . Oletusarvoisesti kokoaja ei tee eroa isojen ja pienten kirjainten välillä komentoissa ja käskyissä. Esimerkit ohjeista ja komentoista Count db 1 ; Nimi, käsky, yksi operandi mov eax, 0 ; Komento, kaksi operandia

Tunnisteet ovat kelvollisia merkkisarjoja, joita käytetään osoittamaan muuttujien nimiä ja nimien nimiä. Tunniste voi koostua yhdestä tai useammasta seuraavista merkeistä: kaikki latinalaisten aakkosten kirjaimet; numerot 0-9; erikoismerkit: _, @, $, ? . Pistettä voidaan käyttää tarran ensimmäisenä merkkinä. Varattuja assembler-nimiä (käskyt, operaattorit, komentojen nimet) ei voi käyttää tunnisteina. Tunnisteen ensimmäisen merkin on oltava kirjain tai erikoismerkki. Tunnisteen enimmäispituus on 255 merkkiä, mutta kääntäjä hyväksyy ensimmäiset 32 ​​merkkiä ja jättää muut huomioimatta. Kaikkien tarrojen, jotka on kirjoitettu riville, joka ei sisällä assembler-ohjetta, on päätyttävä kaksoispisteeseen ":". Tunnisteen, komennon (ohje) ja operandin ei tarvitse alkaa jostain tietystä kohdasta merkkijonossa. On suositeltavaa kirjoittaa ne sarakkeeseen ohjelman luettavuuden parantamiseksi.

Tarrat Kaikkien tarrojen, jotka on kirjoitettu riville, joka ei sisällä assembler-ohjetta, tulee päättyä kaksoispisteeseen ":". Tunnisteen, komennon (ohje) ja operandin ei tarvitse alkaa jostain tietystä kohdasta merkkijonossa. On suositeltavaa kirjoittaa ne sarakkeeseen ohjelman luettavuuden parantamiseksi.

Kommentit Kommenttien käyttö ohjelmassa parantaa sen selkeyttä, varsinkin jos ohjesarjan tarkoitus on epäselvä. Kommentit alkavat millä tahansa lähdemoduulin rivillä puolipisteellä (;). Kaikki ";n" oikealla puolella olevat merkit; ' rivin loppuun ovat kommentit. Kommentti voi sisältää mitä tahansa tulostettavia merkkejä, mukaan lukien "välilyönti". Kommentti voi kattaa koko rivin tai seurata komentoa samalla rivillä.

Assembly-ohjelman rakenne Assembly-kieliohjelma voi koostua useista osista, joita kutsutaan moduuleiksi, joista jokainen voi määrittää yhden tai useamman datan, pinon ja koodisegmentin. Jokaisessa täydellisessä kokoonpanokieliohjelmassa on oltava yksi pää- tai päämoduuli, josta sen suoritus alkaa. Moduuli voi sisältää ohjelmia, tietoja ja pinosegmenttejä, jotka on ilmoitettu asianmukaisilla käskyillä.

Muistimallit Ennen segmenttien ilmoittamista sinun on määritettävä muistimalli käskyn avulla. MODEL-muunnin muistimalli, kutsumiskäytäntö, käyttöjärjestelmän_tyyppi, pinoparametri Peruskokoonpanokielen muistimallit: Muistimalli Koodiosoitus Tietojen osoitus käyttöjärjestelmä Koodin ja tiedon lomittaminen PIENI LÄHELLÄ MS-DOS:ia Sallittu PIENI LÄHELLÄ MS-DOS, Windows ei KESKIPÄÄLLÄ LÄHELLÄ MS-DOS, Windows ei KOMPAKTI LÄHELLÄ KAUKAAN MS-DOS, Windows Ei SUURI MS-DOS, Ikkunat Ei SUURI MS-DOS, Windows Ei LÄHELLÄ Windows 2000, Windows XP, Windows Sallittu FLAT NEAR NT,

Muistimallit Pieni malli toimii vain 16-bittisissä MS-DOS-sovelluksissa. Tässä mallissa kaikki tiedot ja koodi sijaitsevat yhdessä fyysisessä segmentissä. Ohjelmatiedoston koko ei tässä tapauksessa ylitä 64 kt. Pieni malli tukee yhtä koodisegmenttiä ja yhtä datasegmenttiä. Tätä mallia käytettäessä data ja koodi on osoitettu lähellä (lähellä). Keskikokoinen malli tukee useita koodisegmenttejä ja yhtä datasegmenttiä, jolloin kaikki koodisegmenttien linkit katsotaan oletuksena kaukana (kaukana) ja datasegmentin linkit lähellä (lähellä). Kompakti malli tukee useita datasegmenttejä, jotka käyttävät kaukodataosoitteita (far) ja yhtä koodisegmenttiä, joka käyttää lähellä dataosoitteita (lähellä). Suuri malli tukee useita koodisegmenttejä ja useita datasegmenttejä. Oletuksena kaikki koodi- ja dataviittaukset katsotaan pitkälle. Valtava malli vastaa melkein suurta muistimallia.

Muistimallit Litteässä mallissa oletetaan, että ohjelmakokoonpano ei ole segmentoitu, ja sitä käytetään vain 32-bittisissä käyttöjärjestelmissä. Tämä malli on samanlainen kuin pieni malli siinä mielessä, että tiedot ja koodi sijaitsevat samassa 32-bittisessä segmentissä. Laaditaan ohjelma tasaiselle mallille ennen direktiiviä. malliasuntoon tulee sijoittaa jokin direktiiveistä: . 386, . 486, . 586 tai. 686. Prosessorin valintadirektiivin valinta määrittää ohjelmia kirjoitettaessa käytettävissä olevien komentojen joukon. P-kirjain prosessorinvalintadirektiivin jälkeen tarkoittaa suojattua toimintatilaa. Tietojen ja koodien osoitus on lähellä, ja kaikki osoitteet ja osoittimet ovat 32-bittisiä.

muistimallit. MODEL-muunnin muistimalli, kutsumiskäytäntö, käyttöjärjestelmän_tyyppi, pinoparametri Muokkausparametria käytetään segmenttityyppien määrittämiseen ja se voi saada seuraavat arvot: use 16 (valitun mallin segmenttejä käytetään 16-bittisinä) use 32 (valitun mallin segmenttejä käytetään 32-bittisenä). Calling_convention-parametria käytetään määrittämään, kuinka parametrit välitetään kutsuttaessa proseduuria muista kielistä, mukaan lukien korkean tason kielistä (C++, Pascal). Parametrilla voi olla seuraavat arvot: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

muistimallit. MODEL-muunnin muisti_malli, kutsun_käytäntö, OS_tyyppi, pinoparametri OS_type-parametri on oletuksena OS_DOS ja käytössä Tämä hetki tämä on tämän parametrin ainoa tuettu arvo. Parametri stack_param asetetaan arvoon: NEARSTACK (SS-rekisteri on yhtä kuin DS, data- ja pinoalueet sijaitsevat samassa fyysisessä segmentissä) FARSTACK (SS-rekisteri ei ole sama kuin DS, data- ja pinoalueet sijaitsevat eri fyysisissä segmenteissä). Oletus on NEARSTACK.

Esimerkki "ei tee mitään" -ohjelmasta. 686 P. MALLI FLAT, STDCALL. TIEDOT. KOODI START: RET END START RET - mikroprosessorikomento. Se varmistaa ohjelman oikean lopettamisen. Loput ohjelmasta liittyvät kääntäjän toimintaan. . 686 P - Pentium 6 (Pentium II) suojatun tilan komennot ovat sallittuja. Tämä käsky valitsee tuetun assembler-käskyjoukon määrittämällä prosessorimallin. . MALLI FLAT, stdcall - litteä muistimalli. Tätä muistimallia käytetään Windows-käyttöjärjestelmässä. stdcall on käytettävä prosessikutsukäytäntö.

Esimerkki "ei tee mitään" -ohjelmasta. 686 P. MALLI FLAT, STDCALL. TIEDOT. KOODI ALOITUS: RET END START . DATA - dataa sisältävä ohjelmasegmentti. Tämä ohjelma ei käytä pinoa, joten segmentoi. STACK puuttuu. . CODE - ohjelman segmentti, joka sisältää koodin. START - etiketti. END START - ohjelman loppu ja viesti kääntäjälle, että ohjelma pitää käynnistää merkinnästä START. Jokaisen ohjelman tulee sisältää END-käsky, joka merkitsee ohjelman lähdekoodin lopun. Kaikki END-käskyä seuraavat rivit jätetään huomioimatta.Käyttäjälle END-käskyn perässä oleva etiketti kertoo kääntäjälle sen päämoduulin nimen, josta ohjelman suoritus alkaa. Jos ohjelma sisältää yhden moduulin, END-käskyn jälkeinen nimiö voidaan jättää pois.

Assembly kielen kääntäjät Kääntäjä on ohjelma tai teknisiä keinoja A, joka muuntaa jollain ohjelmointikielellä olevan ohjelman kohdekielen ohjelmaksi, jota kutsutaan objektikoodiksi. Koneohjauksen muiston tukemisen lisäksi jokaisella kääntäjällä on omat direktiivit ja makrot, jotka eivät usein ole yhteensopivia minkään muun kanssa. Assembly-kielen kääntäjien päätyypit ovat: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - vapaasti jaettu monivaiheinen kokoaja, jonka on kirjoittanut Tomasz Gryshtar (puola), NASM (Netwide Assembler) - Ilmainen kokoonpano Intel x -arkkitehtuuri 86:lle loi Simon Tatham yhdessä Julian Hallin kanssa, ja sitä kehittää parhaillaan Sourcen pieni kehitystiimi. Forge. netto.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="Ohjelman käännös Microsoft Visual Studio 2005:ssä 1) Luo projekti valitsemalla Tiedosto->Uusi->Projekti valikko Ja"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="Ohjelman käännös Microsoft Visual Studio 2005:ssä 2) Lisää projektipuuhun (View->Solution Explorer)"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Ohjelman käännös Microsoft Visual Studio 2005:ssä 3) Valitse Code C++ -tiedostotyyppi, mutta määritä nimi tunnisteella. asm:

Ohjelman käännös Microsoft Visual Studio 2005:ssä 5) Aseta kääntäjän asetukset. Valitse oikeasta painikkeesta projektitiedostovalikosta Mukautetut rakennussäännöt…

Ohjelman käännös Microsoft Visual Studio 2005:ssä ja valitse näkyviin tulevasta ikkunasta Microsoft Macro Assembler.

Ohjelman käännös Microsoft Visual Studio 2005:ssä Tarkista oikealla painikkeella tiedostossa hello. asm projektipuusta Ominaisuudet-valikosta ja aseta General->Tool: Microsoft Macro Assembler.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="Ohjelman käännös Microsoft Visual Studio 2005:ssä 6) Käännä tiedosto valitsemalla Build->Build hello.prj ."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Ohjelmointi OS Windowsissa Ohjelmointi OS Windowsissa perustuu API-toimintojen käyttöön (Application Program Interface eli ohjelmistosovellusliittymä). Niiden määrä on 2000. Windows-ohjelma koostuu suurelta osin tällaisista puheluista. Kaikki vuorovaikutukset ulkoisia laitteita ja käyttöjärjestelmän resurssit tapahtuvat pääsääntöisesti tällaisten toimintojen kautta. operaatiohuone Windows-järjestelmä käyttää litteää muistimallia. Minkä tahansa muistipaikan osoitteen määrää yhden 32-bittisen rekisterin sisältö. Windowsille on olemassa kolmenlaisia ​​ohjelmarakenteita: dialogi (pääikkuna on dialogi), konsoli tai ikkunaton rakenne, klassinen rakenne (ikkuna, kehys).

Puhelu Windowsin ominaisuudet API Ohjetiedostossa mikä tahansa API-funktio esitetään tyyppinä funktion_nimi (FA 1, FA 2, FA 3) Tyyppi – palautusarvon tyyppi; FAX – luettelo muodollisista argumenteista niiden järjestyksessä, esimerkiksi int Message. Laatikko (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Tämä toiminto näyttää ikkunan, jossa on viesti ja poistumispainike. Parametrien merkitys: h. Wnd - kahva ikkunaan, jossa viesti-ikkuna tulee näkyviin, lp. Teksti - teksti, joka tulee näkyviin ikkunaan, lp. Kuvateksti - teksti ikkunan otsikossa, u. Tyyppi - ikkunatyyppi, erityisesti voit määrittää poistumispainikkeiden määrän.

Windows API -toimintojen kutsuminen Viestissä. Laatikko (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Melkein kaikki API-funktion parametrit ovat itse asiassa 32-bittisiä kokonaislukuja: HWND on 32-bittinen kokonaisluku, LPCTSTR on 32-bittinen merkkijonoosoitin, UINT on 32-bittinen kokonaisluku. Suffiksi "A" lisätään usein funktioiden nimiin siirtyäkseen uudempiin funktioiden versioihin.

Windows API -toimintojen kutsuminen Viestissä. Laatikko (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Kun käytät MASM:ia, sinun on lisättävä @N N nimen loppuun - tavumäärä, jonka välitetyt argumentit vievät pinossa. Win 32 API -funktioissa tämä luku voidaan määritellä argumenttien lukumääräksi n kertaa 4 (tavua kussakin argumentissa): N=4*n. Funktion kutsumiseen käytetään assemblerin CALL-käskyä. Tässä tapauksessa kaikki funktion argumentit välitetään sille pinon kautta (PUSH-komento). Argumentin kulkusuunta: VASEMALTA OIKEALLE - ALHASTA YLÖS. Argumentti u työnnetään pinoon ensin. tyyppi. Määritetyn toiminnon kutsuminen näyttää tältä: CALL Message. laatikko. [sähköposti suojattu]

Windows API -toimintojen kutsuminen Viestissä. Laatikko (HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Minkä tahansa API-funktion suorittamisen tulos on yleensä kokonaisluku, joka palautetaan EAX-rekisteriin. OFFSET-direktiivi on "segmenttisiirtymä" tai korkean tason kielen termein "osoitin" merkkijonon alkuun. EQU-direktiivi, kuten C:n #define, määrittää vakion. EXTERN-direktiivi kertoo kääntäjälle, että funktio tai tunniste on moduulin ulkopuolinen.

Esimerkki ohjelmasta "Hei kaikille!" . 686 P. MALLI FLAT, STDCALL. PINO 4096. DATA MB_OK EQU 0 STR 1 DB "Ensimmäinen ohjelmani", 0 STR 2 DB "Hei kaikille!", 0 HW DD ? ULKOINEN viesti. laatikko. [sähköposti suojattu]: LÄHELLÄ. KOODI ALOITUS: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Viesti. laatikko. [sähköposti suojattu] RET END START

INVOKE-direktiivi MASM-kielen kääntäjä mahdollistaa myös funktiokutsun yksinkertaistamisen makrotyökalulla - INVOKE-direktiivi: INVOKE-funktio, parametri1, parametri2, ... Funktiokutsuun ei tarvitse lisätä @16; parametrit kirjoitetaan täsmälleen siinä järjestyksessä, jossa ne on annettu funktion kuvauksessa. kääntäjämakrot työntävät parametrit pinoon. INVOKE-direktiivin käyttämiseksi sinulla on oltava PROTO-direktiiviä käyttävän toiminnon prototyypin kuvaus muodossa: Viesti. laatikko. PROTO: DWORD, : DWORD




Ylös