Assembly-kielen peruskomponentit ja ohjerakenne. Assembly-kielen komentojen datamuoto ja rakenne. Kurilla "Järjestelmäohjelmointi"

Johdanto.

Kieltä, jolla lähdeohjelma on kirjoitettu, kutsutaan Sisäänkäynti kieli, ja kieli, jolle se käännetään suorittimen suorittamista varten vapaapäivinä 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ä. Tunnettu kaksi tapaa lähetykset: kokoaminen ja tulkinta.

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

klo tulkintoja Jokainen lähdeohjelman tekstirivi analysoidaan (tulkitaan) ja siinä määritetty komento suoritetaan välittömästi. Tämän menetelmän toteuttaminen on uskottu tulkki ohjelma. Tulkinta kestää kauan. Tehokkuuden lisäämiseksi tulkki muuntaa ensin kaikki jokaisen rivin käsittelyn sijaan tiimi 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 muistomerkkejä

Vähennykset (

kertolasku (

Divisioonat (

jne. Symbolisia nimiä käytetään myös osoittamaan muistisoluja. Ohjelmoidaksesi 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), ts. 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 lippurekisterin bitit ja korkean tason kielen (esim.

) ei ole tätä kykyä. Huomaa, että järjestelmän ohjelmointikielet (esimerkiksi C) ovat usein väliasemassa. Saavutettavuuden kannalta 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. Korkean tason kielillä ei ole tätä haittaa.

Toisin kuin korkean tason kielet, ohjelman kirjoittaminen ja virheenkorjaus asennuskielellä vie paljon aikaa. Tästä huolimatta kokoonpanokieli on saanut laaja käyttö seuraavien olosuhteiden vuoksi:

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

● jotkin menettelyt vaativat täysi pääsy laitteistoon, mikä on yleensä mahdotonta tehdä korkean tason kielellä. Tämä kotelo sisältää keskeytykset ja keskeytyskäsittelijät käyttöjärjestelmissä sekä laiteohjaimet sulautetuissa reaaliaikaisissa järjestelmissä.

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 voit:

● tehdä ehdollinen tai ehdoton siirtyminen komentoon;

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

Tällaiset lausunnot on varustettu etiketillä. Nimen ilmoittamiseen käytetään englannin aakkosten (isoja) kirjaimia ja numeroita. Nimen alussa tulee olla kirjain ja lopussa kaksoispiste. Kaksoispistenimike voidaan kirjoittaa erilliselle riville ja opcode voidaan kirjoittaa sarakkeen 2 seuraavalle riville, mikä yksinkertaistaa kääntäjän työtä. Kaksoispisteen puuttuminen ei mahdollista tarran erottamista toimintakoodista, jos ne sijaitsevat eri riveillä.

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

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

Toimintakoodikenttä.

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

muistomerkki on valittu lataamaan rekisteri muistista

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

). Assembly-kielillä

molemmissa toiminnoissa voit käyttää samaa nimeä

Jos muistonimien valinta voi olla mielivaltainen, niin kahden konekäskyn käyttötarve määräytyy prosessorin arkkitehtuurista

Rekisterien muistiinpanot riippuvat myös assembler-versiosta (taulukko 5.2.1).

Operandi kenttä.

Tässä sijaitsee lisäinformaatio, joita tarvitaan toimenpiteen suorittamiseen. Hyppykomentojen operandikentässä ilmoitetaan osoite, johon hyppy on tehtävä, sekä osoitteet ja rekisterit, jotka ovat konekäskyn operandeja. Esimerkkinä annamme 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 latinalaisista kirjaimista: B,

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

Sinun ei tarvitse kirjoittaa sitä ylös). Jos heksadesimaaliluvun ensimmäinen numero on A, B, C,

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

● sisäisten mikroprosessorirekisterien ja muistisolujen koodit

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

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

binäärijärjestelmässä);

● tunnisteet,

ilma-alusparien rekisteröintiä varten,

Ensimmäiset kirjaimet ovat B,

N; akun ja ominaisuusrekisterin parille -

; ohjelmalaskuria varten -

;pinoosoittimelle -

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

(jos 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 muodostetaan yhdistämällä edellä käsitellyt tiedot aritmeettisten ja loogisten operaattoreiden avulla. Huomaa, että datatilan varaustapa riippuu kieliversiosta. Assembly-kielen kehittäjät for

Määritä sana) ja syötä se myöhemmin Vaihtoehtoinen vaihtoehto.

joka oli alusta lähtien prosessorien kielellä

Kieliversiossa

käytetty

Määritä vakio).

Prosessorit käsittelevät eripituisia operandeja. Sen määrittämiseksi kokoajien kehittäjät tekivät erilaisia ​​päätöksiä, esimerkiksi:

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

); AX - 16-bittiselle (tyyppi

ja AN - 8-bittiselle (tyyppi

● prosessoreille

Suffiksit lisätään jokaiseen toimintakoodiin: suffiksi

Tyyppiä varten

; tyypin pääte ".B".

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

) ja sanat 64-bittiseen rekisteriin opkoodeja käyttäen

vastaavasti.

Kommentit-kenttä.

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

● puolipiste (;) yrityksen prosessorien kielillä

Huutomerkki(!) kielillä

Jokaista erillistä kommenttiriviä edeltää johtava merkki.

Pseudo-komennot (käskyt).

Assembly-kielessä on kaksi päätyyppiä komentoja:

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

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

perheen puolesta

.

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

● kirjoittaa vaadittu komentosarja aina kun se tulee näkyviin. Tämä lähestymistapa johtaa ohjelman määrän kasvuun;

● Järjestä tämä sekvenssi proseduuriksi (alirutiiniksi) ja kutsu se tarvittaessa. Tällä lähdöllä on haittapuolensa: joka kerta, kun joudut suorittamaan eja paluukäskyn, jotka lyhyen ja usein käytetyn sekvenssin aikana voivat vähentää ohjelman nopeutta huomattavasti.

Yksinkertaisin ja tehokas menetelmä komentoketjun toistuva toisto koostuu käytöstä makro, joka voidaan esittää pseudo-komentona, joka on suunniteltu kääntämään uudelleen ohjelmassa usein esiintyvä komentoryhmä.

Makrolle tai makrokomennolle on ominaista kolme näkökohtaa: makromäärittely, makroinversio ja makrolaajennus.

Makro määritelmä

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

Makromääritelmällä on seuraava rakenne:

Luettelo ilmaisuista; Makro määritelmä

Annetussa makromääritelmän rakenteessa voidaan erottaa kolme osaa:

● otsikko

makro, mukaan lukien nimi

Pseudo-komento

ja joukko parametreja;

● merkitty pisteillä kehon makro;

● joukkue

valmistumisen

makron määritelmät.

Makromäärittelyparametrijoukko sisältää luettelon kaikista valitun käskyryhmän operandikentässä annetuista parametreista. Jos nämä parametrit on annettu aiemmin ohjelmassa, niitä ei tarvitse ilmoittaa makromäärittelyn otsikossa.

Valitun komentoryhmän kokoamiseksi uudelleen käytetään nimestä koostuvaa vetoomusta

makrokomennot ja parametrien luettelo muilla arvoilla.

Kun kokoaja kohtaa makromäärityksen käännösprosessin aikana, se tallentaa sen makromäärittelytaulukkoon. Myöhemmissä esiintymisissä nimen ohjelmassa (

) makrosta, kokoaja korvaa sen makron rungolla.

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

Jos ohjelma esitetään merkkijonona (kirjaimet, numerot, välilyönnit, välimerkit ja rivinvaihdot siirtyäksesi uudelle riville), makrolaajennus koostuu joidenkin tämän sarjan ketjujen korvaamisesta muilla ketjuilla.

Makrolaajennus tapahtuu kokoonpanoprosessin aikana, ei ohjelman suorituksen aikana. Merkkijonojen käsittelymenetelmät on määritetty makro tarkoittaa.

Kokoonpanoprosessi suoritetaan kahdessa erässä:

● Ensimmäisellä kerralla kaikki makromääritykset säilyvät ja makrokutsut laajennetaan. Tässä tapauksessa alkuperäinen ohjelma luetaan ja muunnetaan ohjelmaksi, jossa kaikki makromääritykset poistetaan ja jokainen makrokutsu korvataan makron rungolla;

● toinen vaihe käsittelee tuloksena olevan ohjelman ilman makroja.

Makrot parametreillä.

Jotta voit työskennellä toistuvien komentosarjojen kanssa, joiden parametrit voivat saada eri arvoja, tarjotaan makromääritykset:

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

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

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

Ohjelma 1 sisältää kaksi samanlaista komentosarjaa, jotka eroavat siinä, että ensimmäinen vaihtaa P ja

Ja toinen

Ohjelma 2 sisältää makron, jossa on kaksi muodollista parametria P1 ja P2. Makron laajennuksen aikana jokainen P1-merkki makron rungossa 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.

Katsotaanpa joitain edistyneitä kieliominaisuuksia

Jos makroa, joka sisältää ehdollisen hyppykomennon ja tunnisteen, johon hypätään, kutsutaan kaksi kertaa tai useammin, otsikko monistuu (katso otsikkoongelma), mikä aiheuttaa virheen. Siksi jokainen puhelu määrittää erillisen nimen parametriksi (ohjelmoijalta). Kielessä

etiketti on ilmoitettu paikalliseksi (

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

voit määrittää makroja muiden makrojen sisällä. Tämä edistynyt ominaisuus on erittäin hyödyllinen yhdessä ohjelman ehdollisen linkityksen kanssa. Harkitsemme

IF WORDSIZE GT 16 M2 MAKRO

M2-makro voidaan määritellä käskyn molemmissa osissa

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

Toinen edistynyt ominaisuus on, että makrot voivat kutsua muita makroja, mukaan lukien itseään - rekursiivinen puhelu. Jälkimmäisessä tapauksessa loputtoman silmukan välttämiseksi 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.

Makrovälineiden käytöstä assemblerissä.

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

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, toisissa yleinen taulukko, jossa makronimien ohella kaikki koneen ohjeet ja käskyt sijaitsevat.

Kun kohtaat makron kokoonpanon aikana on 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ä.

Makropuheluiden laajentaminen.

Aina kun makromäärittely kohdataan kokoonpanon aikana, se tallennetaan makrotaulukkoon. Kun makroa kutsutaan, kokoaja lopettaa tilapäisesti syöttötietojen lukemisen syöttölaitteelta ja alkaa lukea tallennettua makrorunkoa. Makrorungosta poimitut muodolliset parametrit korvataan todellisilla parametreilla ja ne tarjotaan kutsulla. Et- ja ennen -parametrit antavat kokoajan tunnistaa ne.

Huolimatta siitä, että assembler-versioita on monia, kokoonpanoprosesseilla on yhteisiä piirteitä ja ne ovat monella tapaa samanlaisia. Kaksivaiheisen kokoajan toimintaa käsitellään alla.

Kaksivaiheinen kokoaja.

Ohjelma koostuu useista lauseista. Siksi näyttää siltä, ​​​​että kokoamisen aikana voit käyttää seuraavaa toimintosarjaa:

● kääntää se konekielelle;

● siirtää tuloksena oleva konekoodi tiedostoon ja vastaava osa listauksesta toiseen tiedostoon;

● toista lueteltuja toimenpiteitä, kunnes koko ohjelma on käännetty.

Tämä lähestymistapa ei kuitenkaan ole tehokas. Esimerkkinä on niin sanottu ongelma eteenpäin linkki. Jos ensimmäinen lause on hyppy lauseeseen P, joka sijaitsee aivan ohjelman lopussa, kokoaja ei voi kääntää sitä. Hänen on ensin määritettävä operaattorin P osoite, ja tätä varten hänen on luettava koko ohjelma. Jokaista lähdeohjelman täydellistä lukemista kutsutaan kulku. Katsotaanpa, kuinka voit ratkaista ennakoiva linkkiongelman käyttämällä kahta kulkua:

ensimmäisellä läpikäynnillä sinun pitäisi 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äaikaa I/O-toimintoihin;

● ensimmäisellä kierroksella sinun pitäisi muuntaa ohjelman välimuotoon ja tallenna se taulukkoon ja suorita toinen läpikulku ei alkuperäisen ohjelman, vaan taulukon mukaan. Tämä kokoonpanomenetelmä säästää aikaa, koska toinen läpikulku ei suorita I/O-toimintoja.

Ensimmäinen läpimeno.

Ensimmäinen maali- rakentaa symbolitaulukko. Kuten edellä todettiin, ensimmäisen vaiheen toinen tavoite on säilyttää kaikki makromääritykset ja laajentaa kutsuja sellaisina kuin ne ilmestyvät. Näin ollen sekä symbolien määrittely että makrolaajennus tapahtuvat yhdellä kertaa. Symboli voi olla kumpi tahansa etiketti, tai merkitys, jolle on annettu tietty nimi komennolla -you:

;Arvo - puskurin koko

Määrittämällä symbolisille nimille merkityksen komennon otsikkokentässä kokoaja määrittää olennaisesti osoitteet, jotka jokaisella komennolla on ohjelman suorittamisen aikana. Tätä tarkoitusta varten kokoaja varastoi kokoonpanon 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ää ohjelmafragmentin, joka ilmaisee komentojen pituuden ja laskurin arvot. Ensimmäisellä läpikäynnillä luodaan taulukot symbolisia nimiä, ohjeita Ja toimintakoodit, ja tarvittaessa kirjaimellinen pöytä. Literaali on vakio, jolle kokoaja varaa automaattisesti muistia. Huomaa heti, että nykyaikaiset prosessorit sisältävät ohjeet välittömillä osoitteilla, joten niiden kokoajat eivät tue literaaleja.

Symbolien nimitaulukko

sisältää yhden elementin jokaiselle nimelle (taulukko 5.2.4). Jokainen symbolisen nimitaulukon 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 uudelleenallokointibitit (jotka osoittavat, muuttuuko symbolin arvo, jos ohjelma ladataan eri osoitteeseen kuin assembler tarkoitti);

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

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

Direktiivin taulukko.

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

Toimintakooditaulukko.

Taulukossa on jokaiselle operaatiokoodille erilliset sarakkeet: operaatiokoodin nimi, operandi 1, operandi 2, operaatiokoodin heksadesimaaliarvo, komennon pituus ja komentotyyppi (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 syötön maali- objektiohjelman luominen ja tarvittaessa kokoonpanoprotokollan tulostaminen; tuottavat tiedot, joita linkittäjä tarvitsee linkittääkseen eri aikoina kootut proseduurit yhdeksi suoritettavaksi tiedostoksi.

Toisessa läpikäynnissä (kuten ensimmäisessä) lauseet sisältävät rivit luetaan ja käsitellään yksitellen. Alkuperäinen operaattori ja lähtöoperaattori johdettiin siitä heksadesimaalimuodossa esine Koodi voidaan tulostaa tai laittaa puskuriin myöhempää tulostusta varten. Kun komentoosoitelaskuri on nollattu, komento kutsutaan seuraava lausunto.

Lähdeohjelma voi sisältää virheitä, esimerkiksi:

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

● operaatiokoodia edustaa virheellinen nimi (kirjoitusvirheen vuoksi), siinä ei ole tarpeeksi operandeja tai siinä on liian monta operandia;

● ei operaattoria

Jotkut kokoajat voivat havaita määrittelemättömän symbolin ja korvata sen. Useimmissa tapauksissa, kun kokoaja havaitsee virheilmoituksen, se näyttää virheilmoituksen näytöllä ja yrittää jatkaa kokoonpanoprosessia.

Assembly-kielelle omistettuja artikkeleita.

UZBEKISTANIN KANSALLINEN YLIOPISTO, NIMI MIRZO ULUGBEKIN NIMEÄ

TIETOKONETEKNIIKKA

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

Valmistunut:

Taškent 2003.

Esipuhe.

Kokoonpanokieli ja komentorakenne.

EXE-tiedostorakenne (semanttinen jäsennys).

COM-tiedostorakenne.

Toimintaperiaate ja viruksen leviäminen.

Purkaja.

Ohjelmat.

Esipuhe

Ohjelmoijan ammatti on uskomaton ja ainutlaatuinen. Nykyään tiedettä ja elämää on mahdoton kuvitella ilman uusinta teknologiaa. Kaikkea ihmisen toimintaan liittyvää ei voi tehdä ilman tietokone teknologia. Ja tämä edistää sen korkeaa kehitystä ja täydellisyyttä. Vaikka henkilökohtaisten tietokoneiden kehitys alkoi ei niin kauan sitten, ohjelmistotuotteissa on tänä aikana otettu valtavia askeleita ja näitä tuotteita käytetään laajasti vielä pitkään. Tietokoneisiin liittyvän tiedon ala on kokenut räjähdyksen, samoin kuin vastaava tekniikka. Jos emme ota huomioon kaupallista puolta, voimme sanoa, että tällä ammatillisen toiminnan alueella ei ole vieraita. Monet ihmiset kehittävät ohjelmia ei voittoa tai tuloa varten, 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 toteutukselle, vakaalle työlle ja kaikkien nykyaikaisten vaatimusten täyttämiselle. Tässä on myös syytä huomata mikroprosessorien ilmestyminen 60-luvulla, joka korvasi suuren määrän lamppusarjoja. On olemassa tietyntyyppisiä mikroprosessoreita, jotka eroavat hyvin toisistaan. Nämä mikroprosessorit eroavat toisistaan ​​bittisyvyydellään ja sisäänrakennetuilla järjestelmäkomennoillaan. Yleisimmät ovat: Intel, IBM, Celeron, AMD jne. Kaikki nämä prosessorit liittyvät Intel-prosessorien edistyneeseen arkkitehtuuriin. Mikrotietokoneiden leviäminen aiheutti asennekielen uudelleenarvioinnin kahdesta pääasiallisesta syystä. Ensinnäkin kokoonpanokielellä kirjoitetut ohjelmat vaativat huomattavasti vähemmän muistia ja suoritusaikaa. Toiseksi, kokoonpanokielen ja tuloksena olevan konekoodin tuntemus antaa ymmärrystä koneen arkkitehtuurista, mikä on epätodennäköistä, että työskentely korkean tason kielellä. Vaikka useimmat ohjelmistoalan ammattilaiset kehittävät korkean tason kieliä, kuten Pascal, C tai Delphi, mikä on helpompaa ohjelmia kirjoitettaessa, tehokkain ja tehokkain ohjelmisto kirjoitettu kokonaan tai osittain assembly-kielellä. Korkean tason kielet on suunniteltu välttämään erityisiä tekniset ominaisuudet tietyt tietokoneet. Ja kokoonpanokieli puolestaan ​​​​on suunniteltu prosessorin erityispiirteisiin. Siksi, jotta voit kirjoittaa kokoonpanokieliohjelman tietylle tietokoneelle, sinun on tunnettava sen arkkitehtuuri. Näinä päivinä, koska tärkein ohjelmistotuote on EXE-tiedosto. Ottaen huomioon positiivisia puolia Tämä tarkoittaa, että ohjelman tekijä voi luottaa sen eheyteen. Mutta usein tämä on kaukana siitä. Myös purkukone löytyy. Disassembler-laitteen avulla voit selvittää keskeytykset ja ohjelmakoodit. Kokoonpanijaan perehtyneen henkilön ei ole vaikeaa muokata koko ohjelmaa makunsa mukaan. Ehkä tässä syntyy ratkaisemattomin ongelma - virus. Miksi ihmiset kirjoittavat viruksia? Jotkut kysyvät tämän kysymyksen hämmästyneenä, jotkut vihaisena, mutta silti on edelleen ihmisiä, jotka ovat kiinnostuneita tästä tehtävästä ei haitan aiheuttamisen kannalta, vaan kiinnostuksena järjestelmäohjelmointiin. Virukset ovat kirjoittaneet monia syitä. Jotkut ihmiset pitävät järjestelmäkutsuista, toiset parantavat tietämystään assemblerista. Yritän selittää tämän kaiken omassani kurssityötä. 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 ohjelmoijien käsitysten muutosta kokoonpanokielestä.

Assembly oli kerran kieli, jota ilman tietokonetta ei saanut aikaan mitään hyödyllistä. Pikkuhiljaa tilanne muuttui. Kätevämpi tapa kommunikoida tietokoneen kanssa ilmestyi. Mutta toisin kuin muut kielet, assembler ei kuollut; sitä paitsi se ei periaatteessa voinut tehdä tätä. Miksi? Etsiessään vastausta, yritetään ymmärtää, mitä kokoonpanokieli yleensä on.

Lyhyesti sanottuna kokoonpanokieli on konekielen symbolinen esitys. Kaikkia koneen alimmalla laitteistotasolla olevia prosesseja ohjaavat vain konekieliset komennot (ohjeet). Tästä on selvää, että yleisnimestä huolimatta kokoonpanokieli on erilainen jokaiselle tietokonetyypille. Tämä pätee myös ulkomuoto asennuskielellä kirjoitetut ohjelmat ja ideat, joita tämä kieli heijastaa.

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

Ohjelmoija tai kuka tahansa muu käyttäjä voi käyttää mitä tahansa korkean tason työkaluja, jopa ohjelmia virtuaalimaailmojen rakentamiseen, eikä ehkä edes epäile, että tietokone ei itse asiassa suorita sen kielen komentoja, jolla sen ohjelma on kirjoitettu, vaan niiden muunnettua esitystä. tylsien ja tylsien komentosarjojen muodossa täysin eri kielestä - konekielestä. Kuvitellaan nyt, että tällaisella käyttäjällä on epätyypillinen ongelma tai jokin ei vain toimi. Hänen ohjelmansa on esimerkiksi toimittava jonkin epätavallisen laitteen kanssa tai suoritettava muita toimintoja, jotka edellyttävät tietokonelaitteiston toimintaperiaatteiden tuntemista. Huolimatta siitä, kuinka älykäs ohjelmoija on, riippumatta siitä, kuinka hyvällä kielellä hän kirjoitti upean ohjelmansa, hän ei voi tulla toimeen ilman kokoajan tuntemusta. Eikä ole sattumaa, että lähes kaikki korkean tason kielenkääntäjät sisältävät keinoja yhdistää moduulinsa assembler-moduuleihin tai tukea ohjelmoinnin kokoonpanotason pääsyä.

Tietenkin tietokonegeneralistien aika on jo ohi. Kuten sanotaan, äärettömyyttä ei voi omaksua. 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. Lohkokaavio henkilökohtainen tietokone

Kuvasta (kuva 1) käy selvästi ilmi, että tietokone koostuu useista fyysisistä laitteista, joista jokainen on kytketty yhteen yksikköön, jota kutsutaan järjestelmäyksiköksi. Jos ajattelemme loogisesti, on selvää, että se toimii jonkinlaisena koordinoivana laitteena. Katsotaanpa järjestelmäyksikön sisään (ei tarvitse yrittää päästä näytön sisään - siellä ei ole mitään mielenkiintoista, ja lisäksi se on vaarallista): avaa kotelo ja katso joitain levyjä, lohkoja, liitäntäjohtoja. Niiden toiminnallisen tarkoituksen ymmärtämiseksi katsotaanpa tyypillisen tietokoneen lohkokaaviota (kuva 2). Se ei vaadi absoluuttista tarkkuutta ja on tarkoitettu vain osoittamaan nykyaikaisen henkilökohtaisen tietokoneen elementtien tarkoitus, yhteenliittäminen ja tyypillinen koostumus.

Keskustellaan kuvan kaaviosta. 2 hieman epätavallisella tyylillä.
On tavallista, että ihminen kohdatessaan jotain uutta etsii assosiaatioita, jotka voivat auttaa häntä ymmärtämään tuntematonta. Mitä assosiaatioita tietokone herättää? Esimerkiksi yhdistän tietokoneen usein ihmiseen itseensä. Miksi?

Kun ihminen loi tietokoneen, hän ajatteli jossain syvällä sisällään luovansa jotain samanlaista itselleen. Tietokoneessa on elimet tiedon vastaanottamiseen ulkomaailmasta - näppäimistö, hiiri ja 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-muistia. Ja lopuksi, tietokoneessa on puheelimiä, jotka tuottavat käsittelyn tulokset. Nämä ovat myös joitain oikealla olevista laitteista.

Nykyaikaiset tietokoneet on tietysti kaukana ihmisestä. Niitä voidaan verrata olentoihin, jotka ovat vuorovaikutuksessa ulkomaailman kanssa suuren mutta rajallisen ehdottomien refleksien tasolla.
Tämä refleksisarja muodostaa koneen komentojärjestelmän. Riippumatta siitä, kuinka korkealla tasolla kommunikoit tietokoneen kanssa, loppujen lopuksi se on tylsää ja yksitoikkoista koneen komentojen sarjaa.
Jokainen konekäsky on eräänlainen ärsyke virittää yksi tai toinen ehdoton refleksi. Reaktio tähän ärsykkeeseen on aina yksiselitteinen ja "kiinteä" mikrokomentolohkossa mikroohjelman muodossa. Tämä mikroohjelma toteuttaa toimia konekäskyn toteuttamiseksi, mutta tietyille toimitettujen 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 kaikki ne ovat itse asiassa vain lautanen, jolla ruoka (ohjelmat) toimitetaan tiettyjen sääntöjen mukaan.vatsa (tietokone). Vain tietokoneen vatsa rakastaa ruokavaliota, yksitoikkoista ruokaa - anna sille jäsenneltyä tietoa, tiukasti järjestettyinä nollien ja ykkösten sarjoina, joiden yhdistelmät muodostavat konekielen.

Näin ollen, vaikka ulkoisesti monikielinen, 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 opiskelemaan sitä. Onneksi ohjelmoijan ei tarvitse yrittää ymmärtää erilaisten binäärilukuyhdistelmien merkitystä, sillä jo 50-luvulla ohjelmoijat alkoivat käyttää ohjelmoinnissa 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.

Kaikesta yllä olevasta voimme päätellä, että koska kokoonpanokieli on tietokoneelle "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övoimavaltainen prosessi, joka vaatii paljon huomiota ja käytännön kokemusta. Siksi todellisuudessa he kirjoittavat pääasiassa ohjelmia assemblerissä, jonka pitäisi tarjota tehokasta työtä laitteiston kanssa. Joskus ohjelman osat, jotka ovat kriittisiä suoritusajan tai muistin kulutuksen kannalta, kirjoitetaan assemblerissä. Myöhemmin ne formalisoidaan aliohjelmien muodossa ja yhdistetään korkean tason kielen koodiin.

Minkä tahansa tietokoneen kokoonpanokielen opiskelu 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ää tavalla tai toisella ohjelmoijan käytössä 32 rekisteriä.

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

^ 16 käyttäjärekisteriä;

16 järjestelmärekisteriä.

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

Kuten nimestä voi päätellä, käyttäjärekistereitä kutsutaan käyttäjärekistereiksi, 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 (GPR)):

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

tila- ja valvontarekisterit:

Liput rekisteröi lippuja/lippuja;

Komentoosoittimen rekisteri eip/ip.

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

Miksi monet näistä rekistereistä näkyvät 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 prosessoreille kirjoitettujen ohjelmien toimivuuden varmistamiseksi, alkaen i8086:sta. 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). Katso 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ä tehtiin, kuten yllä totesimme, yhteensopivuuden varmistamiseksi Intelin mikroprosessorien nuorempien 16-bittisten mallien 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) - paristo.
Käytetään välitietojen tallentamiseen. Jotkut komennot edellyttävät tämän rekisterin käyttöä;

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

ecx/cx/ch/cl (Count register) - laskurirekisteri.
Käytetään ryhmissä, jotka suorittavat joitain toistuvia toimintoja. Sen käyttö on usein implisiittistä ja piilotettu vastaavan komennon algoritmiin.
Esimerkiksi komento silmukan organisoimiseksi 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. Joissakin komennoissa sen käyttö on pakollista; Joillekin komennoille tämä tapahtuu implisiittisesti.

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

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

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

Mikroprosessoriarkkitehtuurissa tietorakennetta, kuten pinoa, tuetaan laitteisto- ja ohjelmistotasolla. Pinon kanssa työskentelyä varten mikroprosessorin käskyjärjestelmässä on erityisiä komentoja, ja mon erityiset rekisterit 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 dataa voidaan tallentaa myös datasegmenttiin, 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 piilee siinä, että sen alue on uudelleenkäytettävissä 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 ohjelman käyttämien rekisterien sisällön tallentamiseen ennen aliohjelman kutsumista, joka puolestaan ​​käyttää prosessorin rekistereitä "omiin tarkoituksiinsa". Rekisterien alkuperäinen sisältö ponnahtaa pinosta aliohjelman palattua. 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ä suorituksensa aikana. Erottuva ominaisuus Pino on yksilöllinen järjestys, jossa sen sisältämät tiedot haetaan: kulloinkin pinosta on käytettävissä vain ylin elementti, ts. viimeksi pinoon työnnetty elementti. Kun ylin elementti ponnahtaa pinosta, seuraava elementti on käytettävissä. Pinoelementit sijaitsevat pinolle varatulle muistialueelle alkaen pinon alaosasta (eli sen maksimiosoitteesta) peräkkäin pieneneviin osoitteisiin. Ylimmän saavutettavissa olevan elementin osoite on tallennettu pinoosoitinrekisteriin SP. Kuten minkä tahansa muun ohjelmamuistin alueen, pinon on oltava osa jotakin segmenttiä tai muodostaa erillinen segmentti. Kummassakin tapauksessa tämän 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). Huomaa, 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.

Pinoon lataaminen suoritetaan erityisellä komennolla pinon kanssa työskentelemiseen (push). 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 menee kuvan 1 mukaiseen tilaan. 1.10, b. Voidaan nähdä, että pinon osoitinta siirretään kaksi tavua ylöspäin ( kohti alempia osoitteita) ja tähän osoitteeseen kirjoitetaan push-komennossa määritetty operandi. Seuraava pinon latauskomento on esim.

asettaa pinon kuvassa näkyvään tilaan. 1.10, c. Pino tallentaa nyt kaksi elementtiä, ja vain ylin, johon pinoosoittimen SP osoittaa, on käytettävissä. Jos jonkin ajan kuluttua meidän on palautettava pinoon tallennettujen rekisterien alkuperäinen sisältö, meidän on suoritettava pop (push) -komennot pinosta purkamiseksi:

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 int 21h keskeytyskomentoa. Tällä komennolla prosessori työntää pinoon ensin paluuosoitteen, jonka jälkeen DOS työntää pinoon rekisterien sisällön ja muut keskeytettyyn ohjelmaan liittyvät tiedot. Siksi, vaikka ohjelma ei käyttäisi pinoa ollenkaan, sen on silti oltava ohjelmassa ja sen on oltava vähintään useita kymmeniä sanoja kooltaan. Ensimmäisessä esimerkissämme osoitimme pinoon 128 sanaa, mikä on varmasti tarpeeksi.

^ Assembler-ohjelman rakenne

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

Assembler-lauseita on neljää tyyppiä:

komennot tai käskyt, jotka ovat symbolisia analogeja konekäskyille. Käännösprosessin aikana assembler-käskyt muunnetaan vastaaviksi mikroprosessorin käskyjoukon komentoiksi;

makrokomennot - ohjelmatekstin lauseet, jotka on muotoiltu tietyllä tavalla, korvattu lähetyksen aikana muilla lauseilla;

käskyjä, jotka ovat ohjeita assembler-kääntäjälle suorittamaan tiettyjä toimia. 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.

^ Kokoonpanon 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. Kokoonpanolauseen muoto

Riisi. 6. Direktiivin muoto

Riisi. 7. Komentojen ja makrojen muoto

Näissä kuvissa:

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

nimi - tunniste, joka erottaa tämän direktiivin muista samannimistä direktiiveistä. Kokoonpanijan tietyn direktiivin käsittelyn seurauksena tälle nimelle voidaan antaa tiettyjä ominaisuuksia;

operaatiokoodi (OPC) ja käsky ovat vastaavien konekäskyjen, makrokäskyjen tai kääntäjäohjeiden muistisymboleja;

operandit ovat osia komento-, makro- tai assembler-direktiivistä, jotka osoittavat objektit, joille toiminnot suoritetaan. Kokoonpanokielen operandit kuvataan lausekkeilla, joissa on numeerisia ja tekstivakioita, nimikkeitä ja muuttujatunnisteita käyttäen operaattorimerkkejä 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 läpikulkusuuntaan, koska polkujen joukossa voi olla joitain, joita voidaan seurata oikealta vasemmalle. Pohjimmiltaan syntaksikaaviot heijastavat kääntäjän toiminnan logiikkaa jäsennettäessä ohjelman syöttölauseita.

Hyväksyttäviä merkkejä kirjoitettaessa ohjelmatekstiä ovat:

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

Numerot 0-9;

Merkit ?, @, $, _, &;

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

Kokoonpanokielen lauseet muodostetaan lekseemeistä, jotka ovat syntaktisesti erottamattomia kelvollisten kielen symbolien sarjoja, jotka ovat kääntäjän kannalta järkeviä.

Lekseemit ovat:

Tunnisteet ovat kelvollisia merkkijonoja, joita käytetään osoittamaan ohjelmaobjekteja, kuten toimintakoodeja, muuttujien nimiä ja nimien nimiä. Tunnisteiden kirjoittamisen sääntö on seuraava: tunniste voi koostua yhdestä tai useammasta merkistä. Symboleina 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 32 ensimmäistä ja jättää muut huomioimatta. Voit säätää mahdollisten tunnisteiden pituutta vaihtoehdolla komentorivi mv. Lisäksi on mahdollista ohjeistaa kääntäjä erottamaan isot ja pienet kirjaimet tai jättämään niiden ero huomioimatta (mikä tehdään oletusarvoisesti).

^Assemblerin komennot.

Assembler-komennot paljastavat kyvyn siirtää vaatimukset tietokoneelle, mekanismin ohjelman ohjauksen siirtämiseksi (syklit ja siirtymät) loogista vertailua ja ohjelman organisointia varten. Ohjelmoitavat tehtävät ovat kuitenkin harvoin näin yksinkertaisia. Useimmat ohjelmat sisältävät sarjan silmukoita, joissa useita komentoja toistetaan, kunnes tietty vaatimus saavutetaan, sekä erilaisia ​​tarkistuksia, jotka määrittävät, mitkä useista toiminnoista tulisi suorittaa. Jotkut käskyt voivat siirtää ohjauksen muuttamalla normaalia vaihesarjaa muuttamalla suoraan käskyosoittimen offset-arvoa. Kuten aiemmin mainittiin, eri prosessoreille on erilaisia ​​komentoja, mutta tarkastelemme useita komentoja 80186-, 80286- ja 80386-prosessoreille.

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

Tämän taulukon alimmalla rivillä näkyy lippujen arvot komennon suorittamisen jälkeen. 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;

Kun komento on suoritettu, lippua ei ole määritetty;

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 tavukoon, sanan tai kaksoissanan rekistereistä;

m8, m16, m32, m48 - muistin operandikoko tavu, sana, kaksoissana tai 48 bittiä;

i8, i16, i32 - välitön operandikoko tavu, sana tai kaksoissana;

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

Komennot (aakkosjärjestyksessä):

*Nämä komennot on kuvattu yksityiskohtaisesti.

LISÄTÄ
(Lisäys)

Lisäys

^ Komentokaavio:

lisää kohde, lähde

Tarkoitus: kahden tavun, sanan tai kaksoissanan suuruisen lähde- ja kohdeoperandin lisääminen.

Työalgoritmi:

lisää lähde- ja kohdeoperandit;

kirjoita summaustulos 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ää vastaanotinoperandin rajat (ylivuoto tapahtuu), tämä tilanne tulee ottaa huomioon analysoimalla cf-lippua ja sitä seuraavaa mahdollista adc-komennon käyttöä. Lisätään esimerkiksi arvot ax-rekisteriin ja ch-muistialueeseen. Kun lisäät, ota huomioon ylivuotomahdollisuus.

Rekisteröidy plus rekisteri tai muisti:

|000000dw|modregr/rm|

AX-rekisteri (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

^ Komentokaavio:

Tarkoitus:

ohjauksen siirtäminen lähi- tai etäproseduuriin tallentamalla paluupisteen osoite pinoon;

tehtävien vaihto.

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

Lähellä etikettiä - eip/ip-komentoosoittimen sisältö työnnetään pinoon ja nimiötä vastaava uusi osoitearvo ladataan samaan rekisteriin;

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

R16, 32 tai m16, 32 - määrittelee rekisterin tai muistisolun, joka sisältää siirtymät 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 kutsuttuun 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än vaihtaminen):

komennon suorittaminen 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 monimuotoisen 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

^ Komentokaavio:

cmp operandi1,operandi2

Tarkoitus: kahden operandin vertailu.

Työalgoritmi:

suorittaa vähennyslasku(operandi1-operandi2);

tuloksesta riippuen aseta liput, älä vaihda operandi1 ja operandi2 (eli älä muista tulosta).

Sovellus:
Tämä komento käytetään kahden operandin vertaamiseen vähentämällä operandia muuttamatta. Liput asetetaan komennon tulosten perusteella. cmp-komentoa käytetään ehdollisten hyppykomentojen ja setcc byte byte -komennon kanssa.

Objektikoodi (kolme muotoa):

Rekisteröi tai muisti rekisterin kanssa:

|001110dw|modregr/m|

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

|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 pienentäminen yhdellä

^ Komentokaavio:

dec operandi

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

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

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

Rekisteröidy: |01001reg|

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

DIV
(Jaa allekirjoittamaton)

Allekirjoittamaton jako

Joukkueen hahmotelma:

div jakaja

Tarkoitus: Suorita jakotoiminto kahden etumerkittömän binaariarvon välillä.

^ Toimintaalgoritmi:
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 tavun kokoinen, niin osingon tulee sijaita kirvesrekisterissä. Leikkauksen jälkeen osamäärä sijoitetaan arvoon al ja jäännös ah;

jos jakaja on kooltaan sana, niin osingon on sijaittava rekisteriparissa dx:ax ja osingon alemman kertaluvun osuuden sijaitaessa ax. Toimenpiteen jälkeen osamäärä sijoitetaan ax:een ja jäännös dx:ään;

jos jakaja on kooltaan kaksinkertainen sana, niin osingon on sijaittava rekisteriparissa edx:eax ja osingon alemman kertaluvun osuuden 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 ja tuottaa jaon tuloksen osamääränä ja jaon loppuosan. Jakotoimintoa suoritettaessa voi tapahtua poikkeus: 0 - jakovirhe. Tämä tilanne tapahtuu kahdessa tapauksessa: jakaja on 0 tai osamäärä on liian suuri mahtumaan eax/ax/al-rekisteriin.

Objektikoodi:

|1111011w|mod110r/m|

INT
(Keskeyttää)

Keskeytyspalvelurutiinin soittaminen

^ Komentokaavio:

int keskeytyksen_numero

Tarkoitus: kutsu keskeytyspalvelurutiinia komentooperandin määrittelemällä keskeytysnumerolla.

^ Toimintaalgoritmi:

työnnä liput rekisteriliput/liput ja paluuosoite pinoon. Paluuosoitetta kirjoitettaessa kirjoitetaan ensin segmenttirekisterin cs sisältö, sitten komentoosoittimen eip/ip sisältö;

nollaa if- ja tf-liput nollaan;

siirrä ohjaus keskeytyspalveluohjelmalle 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 toimintakoodi 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 komennon ensimmäinen tavu. Mikroprosessori, joka kohtaa komentosarjassa komennon, jonka toimintakoodi on 0cch, kutsuu keskeytyskäsittelyohjelmaa vektorilla 3, joka palvelee kommunikointia ohjelmistovirheenkorjaajan kanssa.

Komennon toinen muoto vie kaksi tavua, 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|

J.C.C.
JCXZ/JECXZ
(hyppää jos kunnossa)

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

Hyppää, jos ehto täyttyy

Hyppää, jos CX/ECX on nolla

^ Komentokaavio:

jcc-etiketti
jcxz etiketti
jecxz etiketti

Tarkoitus: siirtyminen nykyisen komentosegmentin sisällä tietyistä 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 seuraavaan komentoon.

Jcxz/jecxz-komennon algoritmi:
Tarkistaminen, että ecx/cx-rekisterin sisältö on nolla:

jos kunto tarkistetaan

Komentorakenne kokoonpanokielellä Ohjelmointi konekäskyjen tasolla on minimitaso, jolla tietokoneohjelmointi on mahdollista. Koneen ohjausjärjestelmän tulee olla riittävä toteuttamaan vaaditut toimenpiteet antamalla ohjeita konelaitteistolle. Jokainen konekäsky koostuu kahdesta osasta: operatiivisesta, joka määrittää "mitä tehdä" ja operandista, joka määrittää prosessointiobjektit, eli "mitä tehdä". Mikroprosessorin konekäsky, joka on kirjoitettu kokoonpanokielellä, on yksi rivi, jolla on seuraava muoto: nimikomento/komentooperandit; kommentit Otsikko, komento/käsky ja operandi erotetaan vähintään yhdellä välilyönnillä tai sarkainmerkillä. Komennon operandit erotetaan pilkuilla.

Assembly Language -komentorakenne Assembly-komento 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 elementtien, joille komentotoiminto suoritetaan (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 assembler ei erota isoja ja pieniä kirjaimia kirjoittaessaan komentoja ja käskyjä. Esimerkkejä direktiiveistä ja komennoista Count db 1 ; Nimi, käsky, yksi operandi mov eax, 0 ; Komento, kaksi operandia

Tunnisteet ovat kelvollisia merkkijonoja, joita käytetään merkitsemään muuttujien nimiä ja nimiön 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. Suurin pituus Tunnisteessa on 255 merkkiä, mutta kääntäjä hyväksyy ensimmäiset 32 ​​ja jättää muut huomioimatta. Kaikkien tarrojen, jotka on kirjoitettu riville, joka ei sisällä assembler-ohjetta, on päätyttävä kaksoispisteeseen ":". Nimikkeen, komennon (direktiivin) ja operandin ei tarvitse alkaa tietystä kohdasta rivillä. 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 ":". Nimikkeen, komennon (direktiivin) ja operandin ei tarvitse alkaa tietystä kohdasta rivillä. On suositeltavaa kirjoittaa ne sarakkeeseen ohjelman luettavuuden parantamiseksi.

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

Assembly Language -ohjelman rakenne Assembly-kielellä kirjoitettu ohjelma voi koostua useista osista, joita kutsutaan moduuleiksi, joista jokainen voi määrittää yhden tai useamman datan, pinon ja koodisegmentin. Jokaisen kokoonpanokielen täydellisen ohjelman tulee sisältää yksi pää- tai päämoduuli, josta sen suoritus alkaa. Moduuli voi sisältää ohjelman osia, data- ja pinosegmentit, jotka on ilmoitettu asianmukaisin ohjein.

Muistimallit Ennen segmenttien ilmoittamista on määritettävä muistimalli käskyn avulla. MODEL-muunnin muistimalli, kutsumiskäytäntö, käyttöjärjestelmätyyppi, pinoparametri Assembly-kielen perusmuistimallit: Muistimalli Koodiosoitus Tietojen osoitus käyttöjärjestelmä Koodin ja tietojen lomittaminen PIENI LÄHELLÄ MS-DOSIA Hyväksyttävä PIENI LÄHELLÄ MS-DOS, Windows ei KESKIPÄÄLLÄ LÄHELLÄ MS-DOS, Windows ei KOMPAKTI LÄHELLÄ KAUKAAN MS-DOS, Ikkunat Ei SUURI MS-DOS, Windows Ei SUURI MS-DOS, Windows Ei LÄHELLÄ Windows 2000, Windows XP, Windows Acceptable 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ä. Data ja koodi osoitetaan mahdollisimman lähelle tätä mallia käytettäessä. Keskikokoinen malli tukee useita koodisegmenttejä ja yhtä datasegmenttiä, jolloin kaikki viittaukset koodisegmenteissä katsotaan oletuksena kaukana ja datasegmentin viittaukset lähellä. Kompakti malli tukee useita datasegmenttejä, jotka käyttävät etäosoitteita (far), ja yhtä koodisegmenttiä, joka käyttää lähiosoitetta (lähellä). Suuri malli tukee useita koodisegmenttejä ja useita datasegmenttejä. Oletuksena kaikki viittaukset koodiin ja tietoihin katsotaan pitkälle. Valtava malli vastaa melkein suurta muistimallia.

Muistimallit Litteässä mallissa oletetaan segmentoimatonta ohjelmakokoonpanoa, 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 yhdessä segmentissä, mutta se on 32-bittinen. Laaditaan ohjelma tasaiselle mallille ennen direktiiviä. malliasuntoon tulee sijoittaa jokin direktiiveistä: . 386, . 486, . 586 tai. 686. Prosessorin valintadirektiivin valinta määrää ohjelmia kirjoitettaessa käytettävissä olevien käskyjen joukon. P-kirjain prosessorin valintadirektiivin 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 parametrien välitystapa 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_parameter asetetaan seuraavasti: NEARSTACK (SS-rekisteri on yhtä suuri kuin DS, data- ja pinoalueet sijaitsevat samassa fyysisessä segmentissä) FARSTACK (SS-rekisteri ei ole sama kuin DS, data- ja pinoalueet sijaitsevat eri fyysisissä segmenteissä). Oletusarvo on NEARSTACK.

Esimerkki ohjelmasta, joka ei tee mitään. 686 P. MALLI FLAT, STDCALL. TIEDOT. KOODI START: RET END START RET - mikroprosessorikomento. Se varmistaa, että ohjelma päättyy oikein. Loput ohjelmasta koskevat kääntäjän toimintaa. . 686 P - Pentium 6 (Pentium II) suojatun tilan komennot ovat sallittuja. Tämä ohje valitsee tuetut kokoonpanokäskyt, jotka osoittavat prosessorimallin. . MALLI FLAT, stdcall - litteä muistimalli. Tätä muistimallia käytetään Windows-käyttöjärjestelmässä. stdcall - käytetty menettelyn kutsukäytäntö.

Esimerkki ohjelmasta, joka ei tee mitään. 686 P. MALLI FLAT, STDCALL. TIEDOT. KOODI START: RET END START. DATA on dataa sisältävä ohjelmasegmentti. Tämä ohjelma ei käytä pinoa, joten segmenttiä. STACK puuttuu. . KOODI on koodia sisältävä ohjelmasegmentti. START - etiketti. END START - ohjelman loppu ja sanoma kääntäjälle, että ohjelman suoritus alkaa START-tunnisteella. Jokaisen ohjelman tulee sisältää END-käsky, joka merkitsee lopun lähdekoodi ohjelmia. Kaikki END-käskyä seuraavat rivit jätetään huomioimatta.. END-käskyn jälkeen määritetty 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ä - ohjelma tai teknisiä keinoja, joka muuntaa jollain ohjelmointikielellä esitetyn ohjelman kohdekielen ohjelmaksi, jota kutsutaan objektikoodiksi. Koneohjauksen muiston tukemisen lisäksi jokaisella kääntäjällä on omat direktiivit ja makrotyökalut, jotka eivät usein ole yhteensopivia minkään muun kanssa. Assembly-kielen kääntäjien päätyypit: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - vapaasti jaettu monivaiheinen kokoaja, jonka on kirjoittanut Tomasz Gryshtar (puola), NASM (Netwide Assembler) - ilmainen. Kokoonpanija Intel x -arkkitehtuurille 86, jonka loi Simon Tatham yhdessä Julian Hallin kanssa, ja sitä kehittää parhaillaan pieni Sourcen kehittäjäryhmä. Forge. netto.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="Ohjelman kääntäminen Microsoft Visual Studio 2005:ssä 1) Luo projekti valitsemalla Tiedosto->Uusi- >Projektivalikko 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ääntäminen Microsoft Visual Studio 2005:ssä 2) Projektipuussa (View->Solution Explorer) lisätä"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Ohjelman kääntäminen Microsoft Visual Studio 2005:ksi 3) Valitse Code C++ -tiedostotyyppi, mutta määritä nimi ja tunniste. asm:

Ohjelman kääntäminen Microsoft Visual Studio 2005:ksi 5) Aseta kääntäjän parametrit. Napsauta hiiren kakkospainikkeella projektitiedoston mukautetut koontisäännöt -valikkoa...

Käännä ohjelma Microsoft Visual Studio 2005:een ja valitse Microsoft Macro Assembler avautuvasta ikkunasta.

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

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="Ohjelman kääntäminen 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 Windows-käyttöjärjestelmässä Ohjelmointi Windows-käyttöjärjestelmässä 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 esiintyvät yleensä tällaisten toimintojen kautta. operaatiohuone Windows-järjestelmä käyttää litteää muistimallia. Minkä tahansa muistisolun 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 (ikkunallinen, kehys).

Puhelu Windowsin toiminnot 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 esiintymisjärjestyksessä, esimerkiksi int Message. Laatikko (HWND h. Wnd, LPCTSTR lp. Teksti, LPCTSTR lp. Kuvateksti, UINT u. Tyyppi); Tämä toiminto näyttää ikkunan, jossa on viesti ja poistumispainike (tai -painikkeet). Parametrien merkitys: h. Wnd on sen ikkunan kuvaaja, jossa viesti-ikkuna tulee näkyviin, lp. Teksti - teksti, joka tulee näkyviin ikkunaan, lp. Kuvateksti - teksti ikkunan otsikossa, u. Tyyppi - ikkunan tyyppi; erityisesti voit määrittää poistumispainikkeiden lukumäärän.

Windows API int Message -toimintojen kutsuminen. Laatikko (HWND h. Wnd, LPCTSTR lp. Teksti, LPCTSTR lp. Kuvateksti, UINT u. Tyyppi); Melkein kaikki API-funktion parametrit ovat itse asiassa 32-bittisiä kokonaislukuja: HWND on 32-bittinen kokonaisluku, LPCTSTR on 32-bittinen osoitin merkkijonoon, UINT on 32-bittinen kokonaisluku. Suffiksi "A" lisätään usein funktion nimeen siirtyäkseen funktion uudempiin versioihin.

Windows API int Message -toimintojen kutsuminen. Laatikko (HWND h. Wnd, LPCTSTR lp. Teksti, LPCTSTR lp. Kuvateksti, UINT u. Tyyppi); MASM:ia käytettäessä nimen loppuun on lisättävä @N N - tavumäärä, jonka välitetyt argumentit vievät pinossa. Win 32 API -funktioissa tämä luku voidaan määritellä argumenttien lukumääräksi n kerrottuna 4:llä (tavua kussakin argumentissa): N=4*n. Voit kutsua funktion käyttämällä assembler CALL -ohjetta. Tässä tapauksessa kaikki funktion argumentit välitetään sille pinon kautta (PUSH-komento). Argumenttien välityssuunta: VASEMALTA OIKEALLE - ALALLA YLÖS. Argumentti u työnnetään pinoon ensin. Tyyppi. Kutsu määritetylle funktiolle näyttää tältä: CALL Message. Laatikko. A@16

Windows API int Message -toimintojen kutsuminen. Laatikko (HWND h. Wnd, LPCTSTR lp. Teksti, LPCTSTR lp. Kuvateksti, UINT u. Tyyppi); Minkä tahansa API-funktion suorittamisen tulos on yleensä kokonaisluku, joka palautetaan EAX-rekisteriin. OFFSET-direktiivi edustaa "poikkeamaa segmentissä" tai korkean tason kielen termeiksi käännettynä "osoitinta" rivin alkuun. EQU-direktiivi, kuten SI:n #define, määrittelee vakion. EXTERN-direktiivi kertoo kääntäjälle, että funktio tai tunniste on tämän moduulin ulkopuolinen.

Esimerkki "Hei kaikille!" -ohjelmasta . 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. A@16: LÄHELLÄ. KOODI ALOITUS: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Viesti. Laatikko. A@16 RET END START

INVOKE-direktiivi MASM-kielikääntäjä mahdollistaa myös funktiokutsujen yksinkertaistamisen makrotyökalun avulla - 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än makron avulla parametrit sijoitetaan pinoon. INVOKE-direktiivin käyttämiseksi sinulla on oltava PROTO-direktiiviä käyttävän toiminnon prototyypin kuvaus muodossa: Viesti. Laatikko. PROTO: DWORD, : DWORD Jos ohjelma käyttää monia Win 32 API -funktioita, on suositeltavaa käyttää include-direktiiviä C: masm 32includeuser 32. inc

Aihe 2.5 Prosessoriohjelmoinnin perusteet

Ohjelman pituuden kasvaessa eri toimintojen koodien muistaminen on yhä vaikeampaa. Mnemoniikka auttaa tässä asiassa.

Symbolista komentokoodauskieltä kutsutaan kokoaja.

Kokoonpanokieli on kieli, jossa jokainen ilmaisu vastaa täsmälleen yhtä koneen komentoa.

Kokoonpano kutsutaan ohjelman muuntamiseksi kokoonpanokielestä, eli ohjelman valmistaminen konekielellä korvaamalla symboliset toimintojen nimet konekoodeilla ja symboliset osoitteet absoluuttisilla tai suhteellisilla luvuilla sekä kirjastoohjelmien sisällyttäminen ja symbolisten käskyjen sekvenssien luominen määrittämällä tiettyjä parametrit mikrotiimeissä. Tämä ohjelma sijaitsee yleensä ROM-muistissa 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 ohjeisiin.

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



PC-arkkitehtuurin parempi ymmärtäminen ja tietokoneiden osaavampi 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 määritettyjä ohjelmia DEBUG-ohjelman debuggerissa ja purkamalla niiden näyttö kokoonpanossa Kieli);

Ohjelmien kokoaminen kriittisimpien ongelmien ratkaisemiseen (konesuuntautuneella kielellä kirjoitettu ohjelma on yleensä tehokkaampi - lyhyempi ja nopeampi 30-60 prosenttia korkean tason kielistä kääntämisen tuloksena saaduista ohjelmista)

Toteuttaa pääohjelmaan sisältyviä proseduureja erillisten fragmenttien muodossa, mikäli niitä ei voida toteuttaa käytetyllä korkean tason kielellä tai käyttöjärjestelmän palveluproseduureja käyttäen.

Assembly-kielinen ohjelma voi toimia vain yhdessä tietokoneperheessä, kun taas korkean tason kielellä kirjoitettu ohjelma voi toimia eri koneissa.

Kokoonpanokielen aakkoset koostuvat ASCII-merkeistä.

Luvut ovat vain kokonaislukuja. On:

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

Desimaaliluvut, jotka päättyvät kirjaimeen D;

Heksadesimaaliluvut päättyvät kirjaimeen H.

RAM, rekisterit, tietojen esittäminen

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

Kokoonpanokieli on konekoodien ja korkean tason kielten välissä. Ohjelmointi tällä kielellä on helpompaa. Assembly-kielinen ohjelma hyödyntää tehokkaammin tietyn koneen (tarkemmin MP:n) ominaisuuksia kuin korkean tason kielen ohjelma (joka on ohjelmoijalle yksinkertaisempi kuin assemblerille). Katsotaanpa ohjelmoinnin perusperiaatteita konesuuntautuneilla kielillä MP KR580VM80:n kokoonpanokielen esimerkin avulla. Kielellä ohjelmoinnissa käytetään yleistä metodologiaa. Erityiset tekniset tekniikat ohjelmien tallentamiseen liittyvät kohdeMP:n arkkitehtuurin ja komentojärjestelmän ominaisuuksiin.

Ohjelmistomalli MP KR580VM80:een perustuva mikroprosessorijärjestelmä

Kuvan 1 mukainen MPS:n ohjelmistomalli

MP-porttien muisti

S Z A.C. P C

Kuva 1

Ohjelmoijan näkökulmasta MP KR580VM80:ssä on seuraavat ohjelmakäyttöiset 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. ALU:n toiminnon tulos tallennetaan yleensä myös A:hun.

B, C, D, E, H, L– 8-bittiset yleiskäyttöiset rekisterit (GPR). Sisäinen muisti MP. Suunniteltu tallentamaan käsiteltyä tietoa sekä toiminnan tuloksia. Käsiteltäessä 16-bittisiä sanoja rekisterit muodostavat pareja BC, DE, HL ja kaksoisrekisteriä kutsutaan ensimmäiseksi kirjaimeksi - B, D, H. Rekisteriparissa korkein on ensimmäinen rekisteri. Rekistereillä H ja L on erityinen ominaisuus, jota käytetään sekä tiedon tallentamiseen että RAM-solujen 16-bittisten osoitteiden tallentamiseen.

FL– lippurekisteri (merkkirekisteri) 8-bittinen rekisteri, johon on tallennettu viisi etumerkkiä MP:n aritmeettisten ja loogisten operaatioiden tuloksesta. 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 1:ksi, jos tuloksen bittien ykkösten määrä on parillinen.

AC-numero on ylimääräinen siirto, joka on suunniteltu tallentamaan siirtoarvo tuloksen matalan kertaluvun tetradista.

Bitti Z (nolla) – aseta arvoksi 1, jos operaation tulos on 0.

Bitti S (merkki) – asetetaan arvoon 1, jos tulos on negatiivinen, ja arvoon 0, jos tulos on positiivinen.

SP– pinoosoitin, 16-bittinen rekisteri, joka on suunniteltu tallentamaan sen muistisolun osoite, johon viimeinen pinoon lisätty tavu kirjoitettiin.

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

Alkumuistialueella osoitteella 0000Н – 07FF on ohjausohjelma ja esittelyohjelmia. Tämä on ROM-alue.

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

0В00 – 0ВВ0 - osoitealue tietojen kirjoittamista varten. (RAM).

0ВВ0 – pinon aloitusosoite. (RAM).

Pino on erityisesti järjestetty RAM-alue, joka on tarkoitettu tietojen tai osoitteiden väliaikaiseen tallentamiseen. Viimeinen pinoon kirjoitettu numero pompataan ensin. Pinoosoitin tallentaa viimeisen pinosolun osoitteen, johon tiedot on kirjoitettu. 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-kielen tietomuoto ja komentorakenne

MP KR580VM80:n muisti on joukko 8-bittisiä sanoja, joita kutsutaan tavuiksi. Jokaisella tavulla on oma 16-bittinen osoite, joka määrittää sen sijainnin muistisolujen järjestyksessä. MP voi osoittaa 65536 tavua muistia, joka voi olla sekä ROM- että RAM-muistissa.

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 sen muoto eli sille varattu bittien määrä, jotka jaetaan tavu tavulta tiettyihin toimintakenttiin.

Komentomuoto

MP KR580VM80 -komennot ovat yhden, kahden tai kolmen tavun muotoisia. Monitavuiset komennot on sijoitettava vierekkäisille kielille. Komennon muoto riippuu suoritettavan toiminnon erityispiirteistä.

Komennon ensimmäinen tavu sisältää toimintakoodin, joka on kirjoitettu muistomuodossa.

Se määrittää komentomuodon ja toiminnot, jotka MP:n on suoritettava tiedoille suorituksen aikana, sekä osoitusmenetelmän, ja se voi sisältää myös tietoa tietojen sijainnista.

Toinen ja kolmas tavu voivat sisältää dataa, jolle toiminnot suoritetaan, tai osoitteita, jotka osoittavat datan sijainnin. Tietoja, joille toiminnot suoritetaan, kutsutaan operandeiksi.

Yksitavuinen komentomuoto kuvan 2 mukaan

Kuva 4

Assembly-kielen komennoissa toimintakoodilla on lyhennetty englanninkielisten sanojen kirjoitusmuoto - muistomerkintä. Mnemoniikka (kreikan sanasta mnemoniikka - muistamisen taito) helpottaa komentojen muistamista niiden toiminnallisen tarkoituksen perusteella.

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


Osoitusmenetelmät

Kaikki operandikoodit (tulo ja lähtö) on sijoitettava jossain. Ne voivat sijaita MP:n sisäisissä rekistereissä (kätevin ja nopea vaihtoehto). Ne voivat sijaita sisällä järjestelmämuisti(yleisin vaihtoehto). Lopuksi ne voivat sijaita 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 mihin lähtöoperandi sijoitetaan. Näitä menetelmiä kutsutaan osoitemenetelmiksi.

MP KR580VM80:lle on olemassa seuraavat osoitusmenetelmät:

Suoraan;

Rekisteröidy;

epäsuora;

Pinottu.

Suoraan osoitus olettaa, että (syöte)operandi sijaitsee 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, ja datan alhainen tavu sijaitsee komennon toisessa tavussa, ja korkea tavu 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 MP:n sisäisessä rekisterissä. Käytetään yksitavuisissa komentoissa

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

Pino Osoittaminen olettaa, että komento ei sisällä osoitetta. Muistisolujen osoittaminen käyttämällä 16-bittisen SP-rekisterin sisältöä (pinoosoitin).

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 (muutoksia 244 huomioiden).

Seuraavat komentoryhmät erotetaan toisistaan:

Tiedonsiirto;

Aritmeettinen;

Brain teaser;

Hyppykomennot;

Input/output, control ja pino komennot.


Symbolit ja lyhenteet, joita käytetään kuvattaessa komentoja ja laadittaessa ohjelmia

Symboli Vähentäminen
OSOITE 16-bittinen osoite
TIEDOT 8-bittinen data
TIEDOT 16 16-bittinen data
PORT 8-bittinen I/O-laitteen osoite
TAVU 2 Komennon toinen tavu
TAVU 3 Kolmas komennon tavu
R, R1, R2 Yksi rekistereistä: A, B, C, D, E, H, L
R.P. Yksi rekisteripareista: B - määrittää parin BC; D - määrittää DE-parin; H – määrittää HL-parin
RH Parin ensimmäinen rekisteri
R.L. Parin toinen rekisteri
Λ Looginen kertolasku
V Looginen lisäys
Lisäys modulo kaksi
M Muistisolu, jonka osoite määrittää rekisteriparin HL sisällön, eli M = (HL)



Yläosa