Kokoonpanokielen komennot lasin kanssa työskentelyyn. Ohjelmointi: Assembly-kieli. Assembly-kielen perusteet. Lyhyesti kielen rakenteesta

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 leikkaussalissa Windows-järjestelmä. 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.

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 työmuisti. 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ö on pakollista;

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 mon erityisiä rekistereitä tätä varten:

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. varten käytännön käyttöä 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

Yleistä asennuskielestä

Symbolisen kokoonpanokielen avulla voidaan suurelta osin poistaa konekieliohjelmoinnin puutteet.

Sen tärkein etu on, että assembly-kielellä kaikki ohjelman elementit esitetään symbolisessa muodossa. Symbolisten komentojen nimien muuntaminen binäärikoodeiksi on vastuulla erikoisohjelma- assembler, joka vapauttaa ohjelmoijan työlästä työstä ja eliminoi väistämättömät virheet.

Assembly-kielellä ohjelmoinnissa käyttöön otetut symboliset nimet heijastavat pääsääntöisesti ohjelman semantiikkaa ja komentojen lyhenne - niiden päätehtävää. Esimerkiksi: PARAM - parametri, TABLE - taulukko, MASK - maski, ADD - yhteenlasku, ALI - vähennyslasku jne. n. Ohjelmoija muistaa tällaiset nimet helposti.

Assembly-ohjelmointiin tarvitaan monimutkaisempia työkaluja kuin konekieliseen ohjelmointiin: tarvitaan mikrotietokoneisiin perustuvia tietokonejärjestelmiä tai PC-tietokoneita, joissa on sarja oheislaitteet(aakkosnumeerinen näppäimistö, merkkinäyttö, levykeasema ja tulostin), sekä vakio- tai ristiohjelmointijärjestelmät vaadituille mikroprosessoreille. Assembly-kielen avulla voit kirjoittaa ja korjata tehokkaasti paljon monimutkaisempia ohjelmia kuin konekieli (jopa 1–4 kt).

Kokoonpanokielet ovat konesuuntautuneita, eli riippuvat vastaavan mikroprosessorin konekielestä ja rakenteesta, koska ne antavat kullekin mikroprosessorin käskylle tietyn symbolisen nimen.

Assembly-kielet lisäävät merkittävästi ohjelmoijien tuottavuutta konekieliin verrattuna ja säilyttävät samalla mahdollisuuden käyttää kaikkia mikroprosessorin ohjelmistolla saavutettavia laitteistoresursseja. Tämän ansiosta taitavat ohjelmoijat voivat kirjoittaa ohjelmia, jotka toimivat enemmän kuin lyhyt aika ja vievät vähemmän muistia kuin korkean tason kielellä kirjoitetut ohjelmat.

Tässä suhteessa melkein kaikki I / O-laitteiden ohjausohjelmat (ohjaimet) on kirjoitettu kokoonpanokielellä huolimatta melko suuresta valikoimasta korkean tason kieliä.

Assembly-kieltä käyttämällä ohjelmoija voi asettaa seuraavat parametrit:

mikroprosessorin konekielen jokaisen komennon muistomerkki (symbolinen nimi);

vakioformaatti assemblerissä kuvatun ohjelman riveille;

muotoa määrittämistä varten eri tavoilla osoite- ja komentovaihtoehdot;

muoto merkkivakioiden ja kokonaislukutyyppisten vakioiden määrittämiseen erilaisissa numerojärjestelmissä;

pseudo-komennot, jotka ohjaavat ohjelman kokoamisprosessia (käännöstä).

Assembly-kielellä ohjelma kirjoitetaan rivi riviltä, ​​eli kullekin käskylle on varattu yksi rivi.

Yleisimpien mikroprosessorityyppien pohjalta rakennetuissa mikrotietokoneissa assembly-kielen muunnelmia voi olla useita, mutta käytännössä yhdellä on yleensä yksi jakauma - tämä on ns. standardi assembly-kieli.

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:

toiminta - "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:

otsikko komento/ohjeoperandi(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ä.

Suora osoitus: Tehokas osoite määräytyy suoraan konekäskyn siirtymäkentän perusteella, joka voi olla 8, 16 tai 32 bitin kokoinen.

mov eax, summa ; eax = summa

Assembler korvaa summan vastaavalla datasegmenttiin tallennetulla osoitteella (oletuksena rekisterin ds osoite) ja sijoittaa osoitteeseen summa tallennetun arvon rekisteriin eax.

epäsuora osoitus on puolestaan ​​seuraavat tyypit:

Epäsuora perusosoite (rekisteri);

Epäsuora perusosoite (rekisteri) offsetilla;

· epäsuora indeksiosoitus;

· epäsuora perusindeksiosoitus.

Epäsuora perus (rekisteri-) osoitus. Tällä osoituksella operandin tehollinen osoite voi olla missä tahansa yleiskäyttöisessä rekisterissä paitsi sp / esp ja bp / ebp (nämä ovat erityisiä rekistereitä pinosegmentin kanssa työskentelemiseen). Tämä osoitusmuoto ilmaistaan ​​käskyssä syntaktisesti liittämällä rekisterin nimi hakasulkeisiin.

mov eax, ; eax = *esi; *esi arvo osoitteessa esi

Aihe 2.5 Prosessorin ohjelmoinnin perusteet

Ohjelman pituuden kasvaessa eri toimintojen koodien muistaminen on vaikeampaa. Mnemoniikka tarjoaa apua tässä asiassa.

Symbolisen käskyn koodauskieltä kutsutaan kokoaja.

kokoonpanokieli on kieli, jossa jokainen lause vastaa täsmälleen yhtä konekäskyä.

Kokoonpano kutsutaan ohjelman muuntamista kokoonpanokielestä, eli ohjelman valmistamista konekielellä korvaamalla symboliset operaatioiden nimet konekoodeilla ja symboliset osoitteet absoluuttisilla tai suhteellisilla luvuilla, sekä kirjastoohjelmien sisällyttämistä ja symbolisten käskyjen sekvenssien generointia määrittämällä tiettyjä parametreja. mikroohjeissa. Tämä ohjelma yleensä sijoitetaan ROM:iin tai syötetään RAM-muistiin jostain ulkoisesta tietovälineestä.

Assembly-kielellä on useita ominaisuuksia, jotka erottavat sen korkean tason kielistä:

1. Tämä on yksi yhteen vastaavuus kokoonpanokielen lausekkeiden ja konekäskyjen välillä.

2. Assembly-ohjelmoijalla on pääsy kaikkiin kohdekoneessa oleviin objekteihin ja komentoihin.

Ohjelmoinnin perusteiden ymmärtäminen konesuuntautuneilla kielillä on hyödyllistä:



PC-arkkitehtuurin parempi ymmärtäminen ja tietokoneiden parempi käyttö;

Kehittää rationaalisempia algoritmien rakenteita sovellusten ongelmien ratkaisuohjelmille;

Mahdollisuus tarkastella ja korjata suoritettavia ohjelmia laajennuksilla .exe ja .com, jotka on koottu mistä tahansa korkean tason kielistä, jos lähdeohjelmat katoavat (kutsumalla nämä ohjelmat DEBUG-ohjelman debuggeriin ja purkamalla niiden näyttö kokoonpanokielellä );

Ohjelmien kokoaminen kriittisimpien tehtävien ratkaisemiseen (konesuuntautuneelle kielelle käännetty ohjelma on yleensä tehokkaampi - lyhyempi ja 30-60 prosenttia nopeampi kuin korkean tason kielistä kääntämisen tuloksena saadut ohjelmat)

Pääohjelmaan sisältyvien toimenpiteiden toteuttamiseen erillisinä fragmentteina, mikäli niitä ei voida toteuttaa käytetyllä korkean tason kielellä tai käyttöjärjestelmän palveluproseduureja käyttäen.

Assembly-kieliohjelma voi toimia vain saman perheen tietokoneissa, kun taas korkean tason kielellä kirjoitettu ohjelma voi toimia eri koneissa.

Kokoonpanokielen aakkoset koostuvat ASCII-merkeistä.

Luvut ovat vain kokonaislukuja. Erottaa:

Binääriluvut, jotka päättyvät kirjaimeen B;

D:ään päättyvät desimaaliluvut;

Heksadesimaaliluvut, jotka päättyvät kirjaimeen N.

RAM, rekisterit, tietojen esittäminen

Tietylle MP-sarjalle käytetään yksilöllistä ohjelmointikieltä - kokoonpanokieltä.

Assembly-kieli on konekoodien ja korkean tason kielten välissä. Ohjelmointi tällä kielellä on helpompaa. Assembly-kieliohjelma käyttää tietyn koneen (tarkemmin MP) ominaisuuksia järkevämmin kuin korkean tason kielen ohjelma (joka on ohjelmoijalle helpompaa kuin assemblerille). Käsittelemme ohjelmoinnin perusperiaatteita konesuuntautuneilla kielillä käyttämällä esimerkkinä MP KR580VM80:n kokoonpanokieltä. Ohjelmoinnissa kielellä käytetään yleistä tekniikkaa. Erityiset tekniikat ohjelmien tallennusta varten liittyvät kohdeMP:n arkkitehtuuriin ja komentojärjestelmän ominaisuuksiin.

Ohjelmistomalli MP KR580VM80:een perustuva mikroprosessorijärjestelmä

Kuvan 1 mukainen MPS:n ohjelmamalli

MP-porttien muisti

S Z AC P C

Kuva 1

Ohjelmoijan näkökulmasta KR580VM80 MP:ssä on seuraavat ohjelman käytettävissä olevat rekisterit.

A– 8-bittinen akkurekisteri. Se on MP:n päärekisteri. Kaikki ALU:ssa suoritettavat toiminnot sisältävät yhden prosessoitavista operandeista sijoittamisen akkuun. Myös ALU:n toiminnan tulos tallennetaan yleensä A:han.

B, C, D, E, H, L– 8-bittiset yleiskäyttöiset rekisterit (RON). Sisäinen muisti MP. Suunniteltu tallentamaan käsitellyt tiedot sekä toiminnan tulokset. Käsiteltäessä 16-bittisiä sanoja rekistereistä muodostuu parit BC, DE, HL, ja kaksoisrekisteriä kutsutaan ensimmäiseksi kirjaimeksi - B, D, H. Rekisteriparissa ensimmäinen rekisteri on korkein. H-, L-rekistereillä, joita käytetään sekä tiedon tallentamiseen että RAM-solujen 16-bittisten osoitteiden tallentamiseen, on erityinen ominaisuus.

FL– lippurekisteri (ominaisuusrekisteri) 8-bittinen rekisteri, joka tallentaa viisi piirrettä aritmeettisten ja loogisten operaatioiden tuloksesta MP:ssä. FL-muoto kuvan mukaan

Bitti C (CY - carry) - siirto, aseta arvoksi 1, jos tavun korkeasta järjestyksestä tuli siirto aritmeettisia operaatioita suoritettaessa.

Bitti P (pariteetti) - pariteetti, asetetaan arvoon 1, jos tuloksen bittien yksikkömäärä on parillinen.

AC-bitti on ylimääräinen siirto, joka on suunniteltu tallentamaan siirtoarvo tuloksen alemmasta tetradista.

Bitti Z (nolla) - aseta arvoksi 1, jos toiminnon tulos on 0.

S (merkki) -bitti asetetaan arvoon 1, jos tulos on negatiivinen, ja 0:ksi, jos tulos on positiivinen.

SP-- pinoosoitin, 16-bittinen rekisteri, on suunniteltu tallentamaan sen muistipaikan osoite, johon viimeinen pinoon syötetty tavu kirjoitettiin.

RS– ohjelmalaskuri (ohjelmalaskuri), 16-bittinen rekisteri, suunniteltu tallentamaan seuraavan suoritettavan käskyn osoite. Ohjelmalaskurin sisältö kasvaa automaattisesti yhdellä välittömästi seuraavan käskytavun noutamisen jälkeen.

Osoitteen 0000H - 07FF alkumuistialueella sijaitsee ohjausohjelma ja demo-ohjelmat. Tämä on ROM-alue.

0800 - 0AFF - osoitealue tutkittavien ohjelmien tallentamista varten. (RAM).

0В00 - 0ВВ0 - osoitealue tietojen tallentamista varten. (RAM).

0BB0 on ​​pinon aloitusosoite. (RAM).

Pino on erityisesti järjestetty RAM-alue, joka on suunniteltu tietojen tai osoitteiden väliaikaiseen tallentamiseen. Viimeinen pinoon työnnetty numero on ensimmäinen numero, joka ponnahtaa pinosta. Pinoosoitin tallentaa viimeisen pinon sijainnin osoitteen, johon tiedot on tallennettu. Kun aliohjelma kutsutaan, pääohjelman paluuosoite tallennetaan automaattisesti pinoon. Pääsääntöisesti jokaisen aliohjelman alussa pinoon tallennetaan kaikkien sen suorittamiseen osallistuvien rekisterien sisältö ja aliohjelman lopussa ne palautetaan pinosta.

Assembly Language -tietomuoto ja komentorakenne

Muisti MP KR580VM80 on joukko 8-bittisiä sanoja, joita kutsutaan tavuiksi. Jokaisella tavulla on oma 16-bittinen osoite, joka määrittää sen sijainnin muistisolujen sekvenssissä. MP voi osoittaa 65536 tavua muistia, joka voi sisältää sekä ROM- että RAM-muistia.

Tietojen muoto

Tiedot tallennetaan muistiin 8-bittisinä sanoina:

D7 D6 D5 D4 D3 D2 D1 D0

Vähiten merkitsevä bitti on bitti 0, tärkein bitti on bitti 7.

Komennolle on tunnusomaista formaatti, eli sille varattu bittien määrä, jotka jaetaan tavu tavulta tiettyihin toiminnallisiin kenttiin.

Komentomuoto

MP KR580VM80 -komennot ovat yhden, kahden tai kolmen tavun muotoisia. Monitavuiset käskyt on sijoitettava viereisiin PL:ihin. Komennon muoto riippuu suoritettavan toiminnon erityispiirteistä.

Komennon ensimmäinen tavu sisältää muistomuodossa kirjoitetun opkoodin.

Se määrittelee komennon muodon ja toiminnot, jotka MP:n on suoritettava tiedoille sen suorittamisen aikana, sekä osoitusmenetelmän, ja se voi sisältää myös tietoa tietojen sijainnista.

Toinen ja kolmas tavu voivat sisältää dataa, jota käytetään, tai osoitteita, jotka osoittavat datan sijainnin. Dataa, jolle operaatiot suoritetaan, kutsutaan operandeiksi.

Yksitavuinen komentomuoto kuvan 2 mukaan

Kuva 4

Kokoonpanokielen ohjeissa opkoodilla on lyhennetty muoto englanninkielisten sanojen kirjoittamisesta - muistomerkintä. Mnemoniikka (kreikan sanasta mnemoniikka - muistamisen taito) helpottaa komentojen muistamista niiden toiminnallisen tarkoituksen mukaan.

Ennen suoritusta lähdeohjelma käännetään käännösohjelmalla, nimeltään assembler, koodiyhdistelmien kielelle - konekielelle, tässä muodossa se sijoitetaan MP:n muistiin ja käytetään sitten komentoa suoritettaessa.


Osoitusmenetelmät

Kaikki operandikoodit (tulo ja lähtö) on sijoitettava jossain. Ne voivat olla MP:n sisäisissä rekistereissä (kätevin ja nopea vaihtoehto). Ne voivat sijaita järjestelmämuistissa (yleisin vaihtoehto). Lopuksi ne voivat olla I / O-laitteissa (harvinaisin tapaus). Operandien sijainti määräytyy ohjekoodin mukaan. Olla olemassa erilaisia ​​menetelmiä, jolla käskykoodi voi määrittää, mihin tulooperandi viedään ja minne tulosoperandi asetetaan. Näitä menetelmiä kutsutaan osoitemenetelmiksi.

MP KR580VM80:lle on olemassa seuraavat osoitusmenetelmät:

Välitön;

Rekisteröidy;

epäsuora;

Pino.

Välitön osoitus olettaa, että operandi (syöte) on muistissa välittömästi käskykoodin jälkeen. Operandi on yleensä vakio, joka on lähetettävä jonnekin, lisättävä johonkin jne. data sisältyy komennon toiseen tai toiseen ja kolmanteen tavuun, matala datatavu toisessa komentotavussa ja korkea datatavu kolmannessa komentotavussa.

Suoraan (alias absoluuttinen) osoitus olettaa, että operandi (tulo tai lähtö) sijaitsee muistissa osoitteessa, jonka koodi sijaitsee ohjelman sisällä välittömästi käskykoodin jälkeen. Käytetään kolmen tavun komentoissa.

Rekisteröidy osoitus olettaa, että operandi (tulo tai lähtö) on sisäisessä MP-rekisterissä. Käytetään yksitavuisissa komentoissa

Epäsuora (implisiittinen) osoitus olettaa, että MP:n sisäinen rekisteri ei ole itse operandi, vaan sen osoite muistissa.

Pino Osoittaminen olettaa, että komento ei sisällä osoitetta. Osoittaminen muistisoluihin 16-bittisen SP-rekisterin (pinoosoitin) sisällön perusteella.

Komentojärjestelmä

MP-komentojärjestelmä on täydellinen luettelo perustoiminnoista, joita MP pystyy suorittamaan. Näillä komentoilla ohjattu MP suorittaa yksinkertaisia ​​toimintoja, kuten alkeellisia aritmeettisia ja loogisia operaatioita, tiedonsiirtoa, kahden arvon vertailua jne. MP KR580VM80:n komentojen määrä on 78 (mukaan lukien muutokset 244).

On olemassa seuraavat komentoryhmät:

Tiedonsiirto;

Aritmeettinen;

Brain teaser;

Hyppykomennot;

Komennot tulo-ulostulolle, ohjaukselle ja pinon kanssa työskentelylle.


Symbolit ja lyhenteet, joita käytetään kuvattaessa komentoja ja kirjoitusohjelmia

Symboli Vähentäminen
OSOITE 16-bittinen osoite
TIEDOT 8-bittinen data
TIEDOT 16 16-bittinen data
PORT 8-bittinen I/O-osoite (I/O-laitteet)
TAVU 2 Toinen komentotavu
TAVU 3 Kolmas komentotavu
R, R1, R2 Yksi rekistereistä: A, B, C, D, E, H, L
RP Yksi rekisteripareista: B - asettaa lentokoneparin; D - asettaa DE-parin; H - määrittää HL-parin
RH Parin ensimmäinen rekisteri
RL Parin toinen rekisteri
Λ Boolen kertolasku
V Boolen lisäys
Modulo kaksi lisäystä
M Muistisolu, jonka osoite määrittää HL-rekisteriparin sisällön, eli M = (HL)

Johdanto.

Kieltä, jolla alkuperäinen ohjelma on kirjoitettu, kutsutaan syöttö kieli ja kieli, jolle se on käännetty suorittimen suorittamista varten - viikonloppu Kieli. Prosessia, jossa syöttökieli muunnetaan tulostuskieleksi, kutsutaan lähettää. Koska prosessorit pystyvät suorittamaan ohjelmia binäärisellä konekielellä, jota ei käytetä ohjelmointiin, kaikki lähdeohjelmat on käännettävä. tiedossa kaksi tapaa käännökset: kokoaminen ja tulkkaus.

klo kokoelma lähdeohjelma käännetään ensin kokonaan vastaavaksi ohjelmaksi kohdekielellä, ns esine ohjelma ja suoritettiin sitten. Tämä prosessi suoritetaan käyttämällä erityistä ohjelmat, nimeltään kääntäjä. Kääntäjä, jonka syöttökieli on symbolinen esitys binäärikoodien konekielestä (tulostus) on ns. kokoaja.

klo tulkintoja jokainen lähdeohjelman tekstirivi jäsennetään (tulkitaan) ja siinä määritetty komento suoritetaan välittömästi. Tämän menetelmän toteutus kuuluu tulkki ohjelma. Tulkinta kestää kauan. Tehokkuuden lisäämiseksi tulkki muuntaa alustavasti jokaisen rivin käsittelyn sijaan komento merkkijonot (

). Luotua symbolisarjaa käytetään suorittamaan alkuperäiselle ohjelmalle määrätyt toiminnot.

Alla käsitelty kokoonpanokieli toteutetaan kääntämisen avulla.

Kielen ominaisuudet.

Kokoonpanon pääominaisuudet:

● binäärikoodien sijaan kieli käyttää symbolisia nimiä - muistitekniikka. Esimerkiksi summauskomennolle (

) käytetään muistomerkkiä

Vähennykset (

kertolasku (

Divisioonat (

jne. Symbolisia nimiä käytetään myös osoittamaan muistisoluja. Jotta voit ohjelmoida kokoonpanokielellä binäärikoodien ja osoitteiden sijaan, sinun on tiedettävä vain symboliset nimet, jotka assembler kääntää binäärikoodeiksi;

jokainen väite vastaa yksi konekäsky(koodi), eli konekäskyjen ja operaattorien välillä on yksi yhteen vastaavuus kokoonpanokieliohjelmassa;

● kieli tarjoaa pääsyn kaikkiin esineisiin ja joukkueet. Korkean tason kielillä ei ole tätä kykyä. Esimerkiksi kokoonpanokielen avulla voit tarkistaa lippurekisteribitin ja korkean tason kielen (esim.

) ei ole tätä ominaisuutta. Huomaa, että järjestelmäohjelmoinnin kielet (esimerkiksi C) ovat usein väliasemassa. Saavutettavuuden suhteen ne ovat lähempänä assembly-kieltä, mutta niissä on korkean tason kielen syntaksi;

● kokoonpanokieli ei ole universaali kieli. Jokaisella tietyllä mikroprosessoriryhmällä on oma kokoajansa. Korkeatasoisilla kielillä ei ole tätä haittaa.

Toisin kuin korkean tason kielet, kokoonpanokieliohjelman kirjoittaminen ja virheenkorjaus vie paljon aikaa. Tästä huolimatta assembly-kieltä on tullut laaja käyttö seuraavien olosuhteiden vuoksi:

● Assembly-kielellä kirjoitettu ohjelma on paljon pienempi ja nopeampi kuin korkean tason kielellä kirjoitettu ohjelma. Joissakin sovelluksissa näillä indikaattoreilla on ensisijainen rooli, esimerkiksi monissa järjestelmäohjelmissa (mukaan lukien kääntäjät), luottokorttiohjelmissa, Kännykät, laiteohjaimet jne.;

● jotkin menettelyt vaativat täysi pääsy laitteistoon, mikä ei yleensä ole mahdollista korkean tason kielellä. Tämä tapaus sisältää keskeytykset ja keskeytyskäsittelijät käyttöjärjestelmät, sekä laiteohjaimet sulautetuissa järjestelmissä, jotka toimivat reaaliajassa.

Useimmissa ohjelmissa vain pieni prosenttiosuus koodin kokonaismäärästä on vastuussa suuresta prosenttiosuudesta ohjelman suoritusajasta. Tyypillisesti 1 % ohjelmasta on vastuussa 50 % suoritusajasta ja 10 % ohjelmasta 90 % suoritusajasta. Siksi tietyn ohjelman kirjoittamiseen todellisissa olosuhteissa käytetään sekä assembleria että yhtä korkean tason kieliä.

Operaattorin muoto assembly-kielellä.

Kokoonpanokieliohjelma on luettelo komentoista (lausekkeet, lauseet), joista jokainen on erillisellä rivillä ja sisältää neljä kenttää: nimikekenttä, operaatiokenttä, operandikenttä ja kommenttikenttä. Jokaisella kentällä on erillinen sarake.

Etikettikenttä.

Tarrakenttään on varattu sarake 1. Tarra on symbolinen nimi tai tunniste, osoitteita muisti. Se on välttämätöntä, jotta voidaan:

● tehdä ehdollinen tai ehdoton siirtyminen komentoon;

● päästä käsiksi paikkaan, jossa tiedot on tallennettu.

Tällaiset lausunnot on merkitty. Nimen määrittämiseen käytetään englannin aakkosten (isoja) kirjaimia ja numeroita. Nimen tulee alkaa kirjaimella ja päättyä kaksoispisteeseen. Kaksoispistetunniste voidaan kirjoittaa erilliselle riville ja opcode voidaan kirjoittaa sarakkeen 2 seuraavalle riville, mikä yksinkertaistaa kääntäjän työtä. Kaksoispisteen puuttuminen tekee mahdottomaksi erottaa tarran ja opkoodin toisistaan, jos ne ovat eri riveillä.

Joissakin kokoonpanokielen versioissa kaksoispisteet sijoitetaan vain ohjetarrojen jälkeen, ei tietotarrojen jälkeen, ja tarran pituus voidaan rajoittaa 6 tai 8 merkkiin.

Tarrakentässä ei saa olla samoja nimiä, koska tarra liittyy komentojen osoitteisiin. Jos ohjelman suorituksen aikana ei tarvitse kutsua komentoa tai dataa muistista, etikettikenttä jää tyhjäksi.

Tapahtumakoodi-kenttä.

Tämä kenttä sisältää komennon muistokomento tai pseudo-komento (katso alla). Komentomuistikoodin valitsevat kielen kehittäjät. Assembly-kielellä

muistomerkki valittu lataamaan rekisteri muistista

), ja tallentaa rekisterin sisältö muistiin - muistomerkki

). Assembly-kielillä

voit käyttää samaa nimeä molemmille toiminnoille

Jos muistonimien valinta voi olla mielivaltainen, niin kahden konekäskyn käyttö johtuu prosessorin arkkitehtuurista

Rekisterin muistomerkit riippuvat myös assembler-versiosta (taulukko 5.2.1).

Operandi kenttä.

Tässä sijaitsee lisäinformaatio tarvitaan toimenpiteen suorittamiseen. Hyppykäskyjen operandit-kentässä ilmoitetaan osoite, johon haluat hypätä, sekä osoitteet ja rekisterit, jotka ovat konekäskyn operandeja. Esimerkkinä tässä ovat operandit, joita voidaan käyttää 8-bittisille prosessoreille

● numeeriset tiedot,

esitetään eri numerojärjestelmissä. Käytettävän numerojärjestelmän osoittamiseksi vakiota seuraa yksi seuraavista Latinalaiset kirjaimet: SISÄÄN,

Vastaavasti binääri-, oktaali-, heksadesimaali- ja desimaalilukujärjestelmät (

ei välttämättä tallenneta). Jos heksadesimaaliluvun ensimmäinen numero on A, B, C,

Sitten eteen lisätään merkityksetön 0 (nolla);

● mikroprosessorin sisäisten rekisterien ja muistisolujen koodit

M (informaation lähteet tai vastaanottajat) kirjainten A, B, C muodossa,

M tai niiden osoitteet missä tahansa numerojärjestelmässä (esimerkiksi 10V - rekisteriosoite

binäärijärjestelmässä);

● tunnisteet,

rekisteröidyille lentokonepareille,

Ensimmäiset kirjaimet B

H; akun ja ominaisuusrekisterin parille -

; ohjelmalaskuria varten -

; pinoosoittimelle -

● tarrat, jotka osoittavat operandien osoitteet tai seuraavat käskyt ehdollisissa ehdoissa

(kun ehto täyttyy) ja ehdottomia siirtymiä. Esimerkiksi operandi M1 komennossa

tarkoittaa tarvetta siirtyä ehdottomaan komentoon, jonka osoite tarrakentässä on merkitty tunnisteella M1;

● ilmaisuja,

jotka on rakennettu linkittämällä edellä käsitellyt tiedot aritmeettisten ja loogisten operaattoreiden avulla. Huomaa, että tietotilan varaustapa riippuu kielen versiosta. Assembly-kielen kehittäjät for

Määrittele sana) ja esiteltiin myöhemmin Vaihtoehtoinen vaihtoehto.

joka oli alusta lähtien prosessorien kielellä

Kieliversiossa

käytetty

määritä vakio).

Prosessorit käsittelevät eripituisia operandeja. Kokoonpanijakehittäjät ovat tehneet erilaisia ​​päätöksiä määritelläkseen sen, esimerkiksi:

Eripituisilla II-rekistereillä on eri nimet: EAX - 32-bittisten operandien sijoittamiseen (tyyppi

); AX - 16-bittiselle (tyyppi

ja AN - 8-bittiselle (tyyppi

● prosessoreille

päätteet lisätään jokaiseen opcode: suffix

Tyyppiä varten

; tyypin pääte ".B".

eripituisille operandeille käytetään erilaisia ​​opkoodeja, esimerkiksi lataamaan tavu, puolisana (

) ja sanat 64-bittisessä rekisterissä käyttävät opkoodeja

vastaavasti.

Kommentit-kenttä.

Tämä kenttä sisältää selitykset ohjelman toiminnoista. Kommentit eivät vaikuta ohjelman toimintaan ja on tarkoitettu henkilölle. Niitä voidaan tarvita sellaisen ohjelman muokkaamiseen, joka ilman tällaisia ​​kommentteja voi olla täysin käsittämätön jopa kokeneille ohjelmoijille. Kommentti alkaa merkillä ja sitä käytetään selittämään ja dokumentoimaan ohjelmia. Kommentin aloitusmerkki voi olla:

● puolipiste (;) yrityksen prosessoreille tarkoitetuilla kielillä

Huutomerkki(!) kielillä

Jokaista kommentille varattua erillistä riviä edeltää aloitusmerkki.

Pseudokomennot (käskyt).

Assembly-kielessä voidaan erottaa kaksi päätyyppiä komentoja:

perus ohjeet, jotka vastaavat prosessorin konekoodia. Nämä komennot suorittavat kaiken ohjelman tarjoaman käsittelyn;

pseudo-komennot tai käskyjä, suunniteltu palvelemaan ohjelman kääntämistä koodiyhdistelmien kielelle. Esimerkkinä taulukossa. 5.2.2 näyttää joitain pseudo-komentoja as-assemblerilta

perheelle

.

Ohjelmoinnissa on tilanteita, joissa algoritmin mukaan sama komentoketju on toistettava monta kertaa. Päästäksesi pois tilanteesta, voit:

● kirjoittaa haluttu komentosarja aina kun se tapahtuu. Tämä lähestymistapa johtaa ohjelman määrän kasvuun;

● Järjestä tämä sekvenssi proseduuriksi (alirutiiniksi) ja kutsu se tarvittaessa. Tällaisessa poistumisessa on haittapuolensa: joka kerta, kun joudut suorittamaan erikoisproseduurikutsukäskyn ja paluukäskyn, jotka lyhyellä ja usein käytetyllä sekvenssillä voivat vähentää ohjelman nopeutta huomattavasti.

Yksinkertaisin ja tehokas menetelmä komentoketjun toistuvaa toistoa on käytettävä makro, jota voidaan pitää pseudo-komentona, joka on suunniteltu kääntämään uudelleen ohjelmassa usein esiintyvä komentoryhmä.

Makrolle tai makrokäskylle on tunnusomaista kolme näkökohtaa: makron määritelmä, makron inversio ja makron laajennus.

makron määritelmä

Tämä on toistuvasti toistuvan ohjelman komentosarjan nimitys, jota käytetään ohjelman tekstin viittauksiin.

Makrolla on seuraava rakenne:

Luettelo ilmaisuista; makron määritelmä

Yllä olevassa makromäärittelyrakenteessa on kolme osaa:

● otsikko

makro, joka sisältää nimen

Pseudo-komento

ja joukko parametreja;

● pisteviiva kehon makro;

● joukkue

valmistumisen

makron määritelmät.

Makroparametrijoukko sisältää luettelon kaikista valitun käskyryhmän operandikentässä annetuista parametreista. Jos nämä parametrit on annettu aiemmin ohjelmassa, ne voidaan jättää pois makromäärittelyn otsikosta.

Valitun ohjeryhmän kokoamiseen käytetään kutsua, joka koostuu nimestä

makro- ja parametriluettelo muilla arvoilla.

Kun kokoaja kohtaa makromäärityksen kääntämisen aikana, se tallentaa sen makromäärittelytaulukkoon. Myöhempien esiintymisten kanssa nimen ohjelmassa (

) makrosta, kokoaja korvaa sen makron rungolla.

Makron nimen käyttäminen opkoodina kutsutaan makron kääntäminen(makrokutsu) ja sen korvaaminen makron rungolla - makrolaajennus.

Jos ohjelma esitetään merkkijonona (kirjaimet, numerot, välilyönnit, välimerkit ja rivinvaihdot siirtyäksesi uudelle riville), makrolaajennus koostuu siitä, että jotkut tämän sarjan merkkijonot korvataan muilla merkkijonoilla.

Makrolaajennus tapahtuu kokoonpanoprosessin aikana, ei ohjelman suorituksen aikana. Tapoja käsitellä merkkijonoja on määritetty makrotyökalut.

Kokoonpanoprosessi suoritetaan kahdessa erässä:

● Ensimmäisellä kerralla kaikki makromääritykset säilytetään ja makrokutsuja laajennetaan. Tässä tapauksessa lähdeohjelma luetaan ja muunnetaan ohjelmaksi, jossa kaikki makromääritykset poistetaan ja jokainen makrokutsu korvataan makrorungolla;

● Toinen vaihe käsittelee vastaanotetun ohjelman ilman makroja.

Makrot parametreillä.

Makron määritelmät tarjotaan työskennelläksesi toistuvien komentosarjojen kanssa, joiden parametrit voivat saada eri arvoja:

● kanssa todellinen parametrit, jotka sijoitetaan makrokutsun operandikenttään;

● kanssa muodollinen parametrit. Makrolaajennuksen aikana jokainen makron rungossa näkyvä muodollinen parametri korvataan vastaavalla todellisella parametrilla.

käyttämällä makroja parametrien kanssa.

Ohjelma 1 näyttää kaksi samanlaista komentosarjaa, jotka eroavat siinä, että ensimmäinen niistä vaihtaa P ja

Ja toinen

Ohjelma 2 sisältää makron, jossa on kaksi muodollista parametria P1 ja P2. Makrolaajennuksen aikana jokainen makron rungon sisällä oleva P1-merkki korvataan ensimmäisellä todellisella parametrilla (P,

), ja symboli P2 korvataan toisella todellisella parametrilla (

) ohjelmasta nro 1. Makrokutsussa

ohjelma 2 on merkitty: P,

Ensimmäinen todellinen parametri,

Toinen todellinen parametri.

Ohjelma 1

Ohjelma 2

MOV EBX,Q MOV EAX,Pl

MOV Q, EAX MOV EBX, P2

MOV P, EBX MOV P2, EAX

Laajennetut ominaisuudet.

Harkitse joitain kielen edistyneitä ominaisuuksia

Jos makroa, joka sisältää ehdollisen haarakäskyn ja tunnisteen, johon hypätä, kutsutaan kaksi kertaa tai useammin, otsikko monistuu (tarran monistusongelma), mikä aiheuttaa virheen. Siksi jokaiselle kutsulle on määritetty (ohjelmoijan toimesta) erillinen nimike parametriksi. Kielessä

etiketti on ilmoitettu paikalliseksi (

) ja edistyneiden ominaisuuksien ansiosta kokoaja luo automaattisesti erilaisen tarran joka kerta, kun makroa laajennetaan.

voit määrittää makroja muiden makrojen sisällä. Tämä edistynyt ominaisuus on erittäin hyödyllinen yhdistettynä ehdolliseen ohjelmalinkitykseen. Harkitse

IF WORDSIZE GT 16 M2 MAKRO

Makro M2 voidaan määritellä käskyn molemmissa osissa

Määritelmä riippuu kuitenkin siitä, kootaanko ohjelma 16- vai 32-bittiselle prosessorille. Jos M1:tä ei kutsuta, makroa M2 ei määritellä ollenkaan.

Toinen kehittynyt ominaisuus on, että makrot voivat kutsua muita makroja, mukaan lukien itseään - rekursiivinen puhelu. Jälkimmäisessä tapauksessa, välttääkseen äärettömän silmukan, makron on välitettävä itselleen parametri, joka muuttuu jokaisen laajennuksen myötä, ja myös tarkistaa tämä parametri ja lopeta rekursio, kun parametri saavuttaa tietyn arvon.

Makrojen käytöstä assemblerissä.

Makroja käytettäessä kokoajan on kyettävä suorittamaan kaksi toimintoa: tallentaa makromääritykset Ja laajentaa makropuheluita.

Tallennetaan makromääritelmiä.

Kaikki makrojen nimet tallennetaan taulukkoon. Jokaisen nimen mukana on osoitin vastaavaan makroon, jotta sitä voidaan kutsua tarvittaessa. Joillakin kokoajilla on erillinen taulukko makronimille, toisilla yhteinen taulukko, jossa on makronimien lisäksi kaikki konekäskyt ja -ohjeet.

Kun kohtaat makron kokoonpanon aikana luotu:

uusi pöytäelementti makron nimellä, parametrien lukumäärällä ja osoittimella toiseen makromäärittelytaulukkoon, johon makron runko tallennetaan;

● luettelo muodollinen parametrit.

Tämän jälkeen makron runko, joka on yksinkertaisesti merkkijono, luetaan ja tallennetaan makron määritelmätaulukkoon. Silmukan rungossa esiintyvät muodolliset parametrit on merkitty erikoishahmo.

Makron sisäinen esitys

yllä olevasta esimerkistä ohjelmalle 2 (s. 244) on:

MOV EAX, MOV EBX, MOV MOV &

jossa puolipistettä käytetään rivinvaihtomerkkinä ja et-merkkiä & käytetään muodollisena parametrimerkkinä.

Makropuhelulaajennus.

Aina kun makromäärittely kohdataan kokoonpanon aikana, se tallennetaan makrotaulukkoon. Kun makroa kutsutaan, kokoaja keskeyttää tilapäisesti syöttötietojen lukemisen syöttölaitteelta ja alkaa lukea tallennettua makrorunkoa. Makrorungosta poimitut muodolliset parametrit korvataan todellisilla parametreilla, ja ne tarjoavat kutsun. Et-merkki & parametrien edessä antaa kokoajan tunnistaa ne.

Vaikka kokoonpanosta on olemassa monia versioita, kokoonpanoprosesseilla on yhteisiä piirteitä ja ne ovat monella tapaa samanlaisia. Kaksivaiheisen kokoajan työtä tarkastellaan alla.

Kaksivaiheinen kokoaja.

Ohjelma koostuu useista operaattoreista. Siksi näyttää siltä, ​​​​että seuraavaa toimintosarjaa voidaan käyttää kokoonpanon aikana:

● kääntää se konekielelle;

● siirtää vastaanotettu konekoodi tiedostoon ja vastaava osa listauksesta toiseen tiedostoon;

● toista edellä kuvatut toimenpiteet, kunnes koko ohjelma lähetetään.

Tämä lähestymistapa ei kuitenkaan ole tehokas. Esimerkkinä on niin sanottu ongelma johtava linkki. Jos ensimmäinen lause on hyppy P-lauseeseen aivan ohjelman lopussa, kokoaja ei voi kääntää sitä. Hänen on ensin määritettävä operaattorin P osoite, ja tätä varten on tarpeen lukea koko ohjelma. Jokaista alkuperäisen ohjelman täydellistä lukemista kutsutaan kulku. Näytetään, kuinka voimme ratkaista eteenpäin suunnatun referenssiongelman käyttämällä kahta läpimenoa:

ensimmäisellä läpikäynnillä kerätä ja tallenna kaikki symbolimääritykset (mukaan lukien tarrat) taulukkoon, ja toisella läpikäynnillä lue ja kokoa jokainen operaattori. Tämä menetelmä on suhteellisen yksinkertainen, mutta toinen läpikulku alkuperäisen ohjelman läpi vaatii lisää I/O-aikaa;

● ensimmäisellä kerralla muuntaa ohjelmoi välimuotoon ja tallenna se taulukkoon, ja toinen läpikulku ei suoriteta alkuperäisen ohjelman, vaan taulukon mukaan. Tämä kokoonpanomenetelmä säästää aikaa, koska toisella läpikäynnillä ei suoriteta I/O-toimintoja.

Ensimmäinen läpimeno.

Ensimmäisen passin tarkoitus- rakentaa symbolitaulukko. Kuten edellä todettiin, ensimmäisen vaiheen toinen tavoite on tallentaa kaikki makromääritykset ja laajentaa kutsuja niiden ilmestyessä. Siksi sekä merkin määrittely että makrolaajennus tapahtuvat samassa passissa. Symboli voi olla kumpi tahansa etiketti, tai merkitys, jolle on annettu tietty nimi komennolla -you:

;Arvo - puskurin koko

Antamalla käskytunnistekentän symbolisille nimille merkityksen kokoaja asettaa olennaisesti osoitteet, jotka jokaisella käskyllä ​​on ohjelman suorittamisen aikana. Tätä varten kokoaja säästää kokoonpanoprosessin aikana ohjeiden osoitelaskuri(

) erikoismuuttujana. Ensimmäisen läpimenon alussa erikoismuuttujan arvoksi asetetaan 0 ja sitä lisätään jokaisen käsitellyn komennon jälkeen kyseisen komennon pituudella. Esimerkkinä taulukossa. 5.2.3 näyttää ohjelman fragmentin, joka ilmaisee komentojen pituuden ja laskurin arvot. Taulukot luodaan ensimmäisen ajon aikana symbolien nimet, käskyt Ja toimintakoodit, ja tarvittaessa kirjaimellinen pöytä. Literaali on vakio, jolle kokoaja varaa automaattisesti muistia. Huomaamme heti, että nykyaikaiset prosessorit sisältävät ohjeet suorilla osoitteilla, joten niiden kokoajat eivät tue literaaleja.

Symbolitaulukko

sisältää yhden elementin jokaiselle nimelle (taulukko 5.2.4). Jokainen symbolitaulukon elementti sisältää itse nimen (tai osoittimen siihen), sen numeerisen arvon ja joskus joitain lisätietoja, jotka voivat sisältää:

● symboliin liittyvän tietokentän pituus;

● muistin uudelleenkuvausbitit (jotka osoittavat muuttuuko symbolin arvo, jos ohjelma ladataan eri osoitteeseen kuin kokoajan tarkoitti);

● tiedot siitä, voidaanko symbolia käyttää toimenpiteen ulkopuolelta.

Symboliset nimet ovat etikettejä. Ne voidaan määrittää käyttämällä operaattoreita (esim.

Ohjeiden taulukko.

Tässä taulukossa luetellaan kaikki käskyt tai pseudo-komennot, jotka esiintyvät ohjelmaa koottaessa.

Toimintakooditaulukko.

Taulukossa on jokaiselle operaatiokoodille erilliset sarakkeet: operaatiokoodin nimi, operandi 1, operandi 2, operaatiokoodin heksadesimaaliarvo, käskyn pituus ja käskytyyppi (taulukko 5.2.5). Operaatiokoodit on jaettu ryhmiin operandien lukumäärän ja tyypin mukaan. Komentotyyppi määrittää ryhmän numeron ja prosessin, jota kutsutaan käsittelemään kaikki kyseisen ryhmän komennot.

Toinen passi.

Toisen kierroksen tarkoitus- objektiohjelman luominen ja tarvittaessa kokoonpanoprotokollan tulostaminen; tuottavat tiedot, joita linkittäjä tarvitsee linkittääkseen eri aikoina kootut prosessit yhdeksi suoritettavaksi tiedostoksi.

Toisessa läpikäynnissä (kuten ensimmäisessä) lauseet sisältävät rivit luetaan ja käsitellään peräkkäin. Alkuperäinen operaattori ja siitä johdettu tulos heksadesimaalimuodossa esine koodi voidaan tulostaa tai puskuroida myöhempää tulostusta varten. Kun komentoosoitelaskuri on nollattu, komento kutsutaan seuraava lausunto.

Alkuperäinen ohjelma saattaa sisältää virheitä, esim.

annettua symbolia ei ole määritelty tai määritelty useammin kuin kerran;

● Operaatiokoodia edustaa virheellinen nimi (johtuen kirjoitusvirheestä), siinä ei ole tarpeeksi operandeja tai siinä on liian monta operandia;

● ei operaattoria

Jotkut kokoajat voivat havaita määrittelemättömän symbolin ja vaihtaa sen. Useimmissa tapauksissa, kun kuitenkin virheellinen lauseke löytyy, kokoaja näyttää virheilmoituksen näytöllä ja yrittää jatkaa kokoonpanoprosessia.

Assembly-kielelle omistettuja artikkeleita.




Ylös