RAM-muistin rakenne
RAM koostuu soluista, joista jokainen voi sisältää informaatioyksikön - konesanan. Jokaisella solulla on kaksi ominaisuutta: osoite ja sisältö. Mikroprosessorin osoiterekisterin kautta pääset mihin tahansa muistisoluun.
Segmentaalinen muistimalli
Olipa kerran, syntymän kynnyksellä tietokonelaitteet, RAM oli hyvin pieni ja sen käsittelemiseen käytettiin 2 tavua (ns. sana). Tämä lähestymistapa mahdollisti 64 KB:n muistin osoittamisen, ja osoitus oli lineaarinen - osoite käytettiin yhdellä numerolla. Myöhemmin tekniikan parantuessa valmistajat ymmärsivät, että suurempiakin määriä muistia oli mahdollista tukea, mutta tätä varten heidän piti suurentaa osoitekokoa. Yhteensopivuuden vuoksi jo kirjoitettujen ohjelmistojen kanssa päätettiin tehdä näin: osoitus on nyt kaksikomponenttinen (segmentti ja offset), joista jokainen on 16-bittinen, ja molemmat vanhat ohjelmat käyttivät yhtä 16-bittistä komponenttia eivätkä tiedä segmenteistä mitään ja jatkavat toimintaansa
Muuttaa |
Arkki |
Asiakirja nro |
Allekirjoitus |
Päivämäärä |
Arkki |
PPP PI 23.00.00 TO |
Osoiteavaruus on joukko osoitteita, jotka prosessori voi luoda. Mitä varten? Hyvä kysymys. Tosiasia on, että jokaisella muistisolulla on osoite. Ja jotta voit lukea (tai kirjoittaa) siihen tallennettuja tietoja, sinun on käytettävä niitä sen osoitteessa. Osoitteet jaetaan virtuaalisiin (loogisiin) ja fyysisiin. Fyysiset osoitteet ovat todellisten muistisolujen todellisia osoitteita. Ohjelmat ovat syvästi rinnakkaisia tällaisten osoitteiden kanssa, koska ne toimivat symbolisilla nimillä, jotka sitten kääntäjä muuntaa virtuaalisiksi osoitteiksi. Sitten virtuaaliosoitteet muunnetaan fyysisiksi.
Loogiset osoitteet esitetään heksadesimaalimuodossa ja koostuvat kahdesta osasta. Loogisesti RAM on jaettu segmentteihin. Joten loogisen osoitteen ensimmäinen osa on segmentin alku ja toinen on siirtymä tästä alusta (segmentti, offset)
Looginen rakenne on jaettu 5 vyöhykkeeseen:
1. Perinteinen muisti – päämuisti;
Alkaa osoitteesta 00000 (0000:0000) ja nousee 90000:aan (9000:0000). Tämä vie 640 kt. Ensinnäkin tälle alueelle ladataan keskeytysvektoritaulukko alkaen 00000:sta ja vievät 1 kt:n, jonka jälkeen tiedot BIOS:sta (ajastinlaskuri, näppäimistöpuskuri jne.) ja sitten kaikenlaiset 16-bittiset DOS-ohjelmat. (heille 640 kt - este, jonka yli vain 32-bittiset ohjelmat voivat hypätä). BIOS-tiedoille on varattu 768 tavua.
2. UMA (Upper Memory Area) – ylempi muisti;
Alkaa osoitteesta A0000 FFFFF:ään. Se vie 384 kt. Tietokonelaitteistoon liittyvät tiedot ladataan tähän. UMA voidaan jakaa kolmeen 128 kt:n osaan. Ensimmäinen osa (A0000 - BFFFF) on videomuistia varten. Seuraava osa (C0000:sta DFFFF:ään) ladataan BIOS-ohjelmat adapterit. Viimeinen osa (E0000 - FFFFF) on varattu järjestelmän BIOS. Asia on siinä, että viimeiset 128 kt eivät ole täysin käytössä. Useimmissa tapauksissa BIOSissa käytetään vain viimeisiä 64 kt. UMB:n vapaata osaa ohjaa EMM386.EXE-ohjain ja sitä käytetään käyttöjärjestelmän tarpeisiin.
3. HMA (High Memory Area) – suuri muistialue;
Muuttaa |
Arkki |
Asiakirja nro |
Allekirjoitus |
Päivämäärä |
Arkki |
PPP PI 23.00.00 TO |
4. XMS (eXtended Memory Specification) – lisämuisti;
Työskennelläksesi XMS:ssä DOS:n avulla prosessoreille kehitettiin toinen tila - virtuaalinen. DOS ei voi ylittää 640 kilotavun rajaa, virtuaalinen tila antaa sinun rikkoutua lisämuistia osiin
1 Mt. Jokainen osa on ladattu DOS-ohjelma ja siellä ne kypsennetään todellisessa tilassa, mutta toisiaan häiritsemättä ne suoritetaan samanaikaisesti. 32-bittiset sovellukset eivät välitä 640 kt:n esteestä. XMS vastaa prosessoritilojen kääntämisestä EMM386.EXE-ohjaimeen ja HIMEM.SYS vastaa itse alueen järjestämisestä. Voit nähdä, mitä XMS-järjestelmässäsi tapahtuu Norton Utilities -ohjelmiston SysInfon avulla.
5. EMS (Expanded Memory Specification) - laajennettu muisti;
Tämä alue sijaitsee ylemmässä muistissa ja vie noin 64 kt. Sitä käytettiin aiemmin vain vanhoissa tietokoneissa, joissa oli RAM
1 Mt. Spesifikaationsa vuoksi tämä on melko hidas alue. Tosiasia on, että laajennettu muisti on yksi monista kytketyistä segmenteistä. Kun segmentti on täynnä, käytetty segmentti korvataan uudella. Mutta voit työskennellä vain yhden segmentin kanssa, ja tämä, sinun täytyy itse ymmärtää, ei ole kovin hyvä, kätevä ja nopea. Tyypillisesti ensimmäinen EMS-segmentti sijaitsee osoitteessa D000.
RAM:n looginen rakenne graafisessa muodossa.
Muuttaa |
Arkki |
Asiakirja nro |
Allekirjoitus |
Päivämäärä |
Arkki |
PPP PI 23.00.00 TO |
4. DRAM – Dynaaminen Random Access Memory
DRAM- Tämä on hyvin vanhan tyyppinen RAM-siru, jota ei ole käytetty pitkään aikaan. Toisella tavalla DRAM- Tämä dynaaminen muisti satunnaisessa otosjärjestyksessä. Minimiyksikkö tietoja tallennettaessa tai siirrettäessä tietoja tietokoneeseen on vähän. Jokaisella bitillä voi olla kaksi tilaa: päällä (kyllä, 1) tai pois päältä (ei, 0). Mikä tahansa tietomäärä koostuu lopulta bitteistä, jotka kytketään päälle ja pois. Siten minkä tahansa datamäärän tallentamiseksi tai lähettämiseksi on tarpeen tallentaa tai lähettää tämän datan jokainen bitti sen tilasta riippumatta.
Tietobittien tallentamiseksi RAM-muistiin on soluja. Kennot koostuvat kondensaattoreista ja transistoreista. Tässä on likimääräinen ja yksinkertaistettu kaavio DRAM-solusta:
Jokainen solu voi tallentaa vain yhden bitin. Jos kennokondensaattori on ladattu, se tarkoittaa, että bitti on päällä, jos se on tyhjä, se on pois päältä. Jos sinun on tallennettava yksi tavu tietoa, tarvitset 8 solua (1 tavu = 8 bittiä). Solut sijaitsevat matriiseissa ja jokaisella niistä on oma osoite, joka koostuu rivinumerosta ja sarakenumerosta.
Muuttaa |
Arkki |
Asiakirja nro |
Allekirjoitus |
Päivämäärä |
Arkki |
PPP PI 23.00.00 TO |
Katsotaan nyt kuinka lukeminen tapahtuu. Ensinnäkin RAS (Row Address Strobe) -signaali syötetään kaikkiin tuloihin - tämä on rivin osoite. Tämän jälkeen kaikki tämän rivin tiedot kirjoitetaan puskuriin. Sitten CAS (Column Address Strobe) -signaali syötetään rekisteriin - tämä on sarakesignaali ja valitaan bitti, jolla on vastaava osoite. Tämä bitti syötetään ulostuloon. Mutta lukemisen aikana lukurivin solujen tiedot tuhoutuvat ja ne on kirjoitettava uudelleen puskurista ottamalla.
Nyt äänitys. WR (Write) -signaali syötetään ja tiedot syötetään sarakeväylään ei rekisteristä, vaan siitä tietojen syöttäminen muisti kytkimen kautta, osoitteen määrittelemä sarakkeessa. Näin ollen tietojen kulku kirjoitettaessa määräytyy sarake- ja riviosoitesignaalien yhdistelmällä ja luvalla kirjoittaa tietoja muistiin. Kirjoitettaessa rivirekisterin tietoja ei tulosteta.
On otettava huomioon, että matriisit soluilla on järjestetty seuraavasti:
Muuttaa |
Arkki |
Asiakirja nro |
Allekirjoitus |
Päivämäärä |
Arkki |
PPP PI 23.00.00 TO |
Tämä tarkoittaa, että yhtä bittiä ei lueta kerrallaan, vaan useita. Jos 8 matriisia sijaitsee rinnakkain, yksi tavu luetaan kerralla. Tätä kutsutaan bittisyvyydeksi. Niiden juovien lukumäärä, joita pitkin dataa lähetetään rinnakkaisista matriiseista (tai niihin), määräytyy mikropiirin tulo/lähtöväylän leveyden mukaan.
Kun puhutaan DRAM:n toiminnasta, yksi seikka on otettava huomioon. Koko asia on, että kondensaattorit eivät voi varastoida latausta loputtomiin, ja se lopulta "tyhjentyy". Siksi kondensaattorit on ladattava. Lataustoimintoa kutsutaan Refresh tai regeneraatioksi. Tämä toiminto tapahtuu noin 2 ms:n välein ja kestää joskus jopa 10 % (tai jopa enemmän) prosessorin työajasta.
Tärkein ominaisuus DRAM on nopeus tai yksinkertaisesti sanottuna syklin kesto + viiveaika + pääsyaika, jossa syklin kesto on tiedonsiirtoon käytetty aika, viive on ensimmäinen asennus rivi- ja sarakeosoitteet, ja pääsyaika on itse solun hakuaika. Tämä paskapuhetta mitataan nanosekunteina (sekunnin miljardisosa). Nykyaikaisten muistisirujen nopeudet ovat alle 10 ms.
RAM-muistia ohjaa piirisarjassa oleva ohjain emolevy, tai pikemminkin siinä osassa sitä nimeltä North Bridge.
Muuttaa |
Arkki |
Asiakirja nro |
Allekirjoitus |
Päivämäärä |
Arkki |
PPP PI 23.00.00 TO |
Ja nyt, kun olet ymmärtänyt, kuinka RAM toimii, selvitetään, miksi sitä ylipäätään tarvitaan. Prosessorin jälkeen RAM-muistia voidaan pitää nopeimpana laitteena. Siksi pääasiallinen tiedonvaihto tapahtuu näiden kahden laitteen välillä. Kaikki tiedot sisään henkilökohtainen tietokone tallennettu kiintolevylle. Kun käynnistät tietokoneen, ajurit kirjoitetaan RAM-muistiin (Random Access Memory) ruuvista, erityisiä ohjelmia ja käyttöjärjestelmän elementit. Sitten ne ohjelmat - sovellukset, jotka käynnistät, tallennetaan sinne. Näiden ohjelmien sulkeminen poistaa ne RAM-muistista. RAM-muistiin tallennetut tiedot siirretään CPU:lle (Central Processing Unit), jossa ne käsitellään ja kirjoitetaan takaisin. Ja niin koko ajan: he antoivat prosessorille käskyn ottaa bitit sellaisista ja sellaisista osoitteista, jotenkin käsitellä ne siellä ja palauttaa ne paikoilleen tai kirjoittaa ne uuteen - hän teki juuri niin.
Kaikki tämä on hyvä niin kauan kuin RAM-soluja on tarpeeksi. Mitä jos ei? Sitten swap-tiedosto tulee peliin. Tämä tiedosto sijaitsee kiintolevyllä ja sinne kirjoitetaan kaikki mikä ei mahdu RAM-soluihin. Koska ruuvin nopeus on huomattavasti pienempi kuin RAM, sivutustiedoston toiminta hidastaa järjestelmää huomattavasti. Lisäksi se vähentää kotelon kestävyyttä kovalevy.
Muistin määrän lisääminen ei lisää sen suorituskykyä. Muistin koon muuttaminen ei vaikuta sen toimintaan millään tavalla. Mutta jos tarkastelemme järjestelmän toimintaa, se on eri asia. Jos sinulla on tarpeeksi RAM-muistia, äänenvoimakkuuden lisääminen ei lisää järjestelmän nopeutta. Jos RAM-soluja ei ole tarpeeksi, niiden lukumäärän lisääminen (toisin sanoen uuden lisääminen tai vanhan korvaaminen uudella, jolla on suurempi muistikapasiteetti) nopeuttaa järjestelmää.
Muuttaa |
Arkki |
Asiakirja nro |
Allekirjoitus |
Päivämäärä |
Arkki |
PPP PI 23.00.00 TO |
Muuttaa |
Arkki |
Asiakirja nro |
Allekirjoitus |
Päivämäärä |
Arkki |
PPP PI 23.00.00 TO |
http://nikesina.ucoz.ru/
http://www.whatis.ru/
http://wiki.mvtom.ru/
http://www.teryra.com/
http://smartronix.ru/
http://allrefs.net/
http://sonikelf.ru/
http://beginpc.ru/
Viitteet
Käytännön opas järjestelmän ylläpitäjä. (2012)
Andrew Tanenbaum, Todd Austin - Tietokonearkkitehtuuri (2013)
Muistisolu Tietokoneen muisti koostuu yksittäisistä bittien "hiukkasista", jotka on yhdistetty 8 bitin (tavun) ryhmiin (rekistereihin). 1 tavu on muistin perusyksikkö. Jokaisella tavulla on oma numero (osoite) ja sisältö binäärikoodi. Kun prosessori käsittelee tietoja, se löytää osoitteen muistista haluttu solu, lukee sisällöstä, suorittaa tarvittavat toimet ja kirjoittaa tuloksen toiseen muistisoluun. Peräkkäisten tavujen muistisoluryhmä sisäinen muisti. Muistisolun konesanan sisältö Muistisolun leveys ja koko koneen sana bitteinä, jotka vastaavat prosessorin kapasiteettia
Nopea muisti, toteutettu muodossa elektroninen piiri. RAM on käytettävissä tietojen lukemiseen ja kirjoittamiseen. Se on RAM-muistissa, että työ suoritetaan nykyinen hetki ohjelma ja siihen tarvittavat tiedot, RAM-muistissa olevia tietoja voidaan muokata, poistaa, lisätä. Tämä on väliaikainen tallennusmuisti. RAM tallentaa tiedot vain tietokoneen kanssa työskentelyn aikana - kun tietokone on sammutettu verkosta, RAM-muistiin tallennetut tiedot menetetään ikuisesti. RAM on haihtuva laite. Kapasiteetti moderneja malleja vaihtelee välillä 512 - 1024 megatavua. RAM – hajasaantimuisti (RAM – hajasaantimuisti).
ROM - pysyvä muisti (ROM - lukumuisti - vain lukumuisti). Monissa tietokoneissa ROM on toteutettu erillisenä siruna, johon valmistuksen aikana sijoitetaan tärkeimmät komennot, jotka suorittavat alkuvuorovaikutuksen laitteiston ja laitteiston välillä. ohjelmisto. Tämän tyyppinen muisti on vain luku -muotoinen. Kun tietokone on sammutettu, tiedot tallennetaan. ROM on haihtumaton laite. ROM sisältää osan leikkaussalista BIOS-järjestelmät(Perus Input-Output System).
Välimuisti – välimuisti RAM:n ja ROM:n välillä "Cache" - piilopaikka, varasto (englanninkielinen sana). Käytetään tietokoneen nopeuden lisäämiseen. Välimuistin "salaisuus" piilee siinä, että se on näkymätön käyttäjälle ja sinne tallennetut tiedot ovat sovellusohjelmistojen ulottumattomissa. Tämän tyyppisen sisäisen muistin käyttö vähentää käyttöjen määrää kovalevy. Välimuistin puuttuminen voi vähentää merkittävästi (20-30%) yleistä suorituskykyä tietokone.
Haihtumaton muisti (CMOS-muisti, Complementary Metal-Oxid-Semicondactor) Erilaisia vaihtoehtoja tietokoneen kokoonpanot, kuten numero ja tyyppi levyasemat, videosovittimen tyyppi, apuprosessorin läsnäolo ja joitain muita tietoja on tallennettu ns CMOS-muisti. CMOS-muistisiru sisältää myös tavallisen elektroninen kello. Niiden ansiosta voit selvittää sen milloin tahansa nykyinen päivämäärä ja aikaa. Sen varmistamiseksi, että kun tietokoneen virta katkaistaan, CMOS-muistin sisältö ei tyhjenny ja kello jatkaa ajan mittaamista, CMOS-muistisiru saa virtansa erityisestä pienestä paristosta tai akusta, joka sijaitsee myös emolevyllä.
Operandien osoite ohjelmakäskyissä voi olla:
l suora;
l epäsuora;
l assosiatiivinen;
implisiittisesti.
Suora osoitus tarkoittaa itse operandin arvon määrittämistä komennossa sen osoitteen sijaan.
Suora osoitus koostuu operandin absoluuttisen tai suoritettavan osoitteen määrittämisestä suoraan komennossa. Rekisterin suora osoitus koostuu sen nimen määrittämisestä.
Epäsuoralla osoitteella tarkoitetaan sen muistisolun rekisterin tai osoitteen osoittamista komennossa, jossa operandin tai niiden komponenttien absoluuttinen, toimeenpaneva osoite sijaitsee.
Assosiatiivinen osoitus - määrittää komennossa ei osoitteen, vaan näytteitettävän operandin merkityksellisen attribuutin (käytetään assosiatiivisissa tallennuslaitteissa).
Implisiittinen osoitus - operandin osoitetta ei ole määritetty käskyssä, mutta se on implisiittisenä operaatiokoodissa.
PC:n päämuistisolujen osoittamisessa on kaksi tärkeää tyyppiä: suhteellinen ja pino.
Suhteellinen osoitus
Absoluuttinen (A ind) osoite muodostuu toimeenpano- (Aisp) ja segmenttiosoitteiden (A segm) summana:
A abs = segmentti + A ap.
Segm - 20-bittinen segmentin aloitusosoite , joka on 16-kertainen lisäys (siirretty 4 bittiä vasemmalle) segmentin segmentin A" 16-bittinen osoite, joka on tallennettu johonkin 16-bittisestä segmenttirekisteristä. Segmentin aloitusosoite tässä suoritusmuodossa on aina 16 tavun kerrannainen, ja se voi olla täysin tunnistettu arvo A" segmenttejä (segmentti koostuu aina kokonaisluvusta kappaleita ja kappale on yhtä suuri kuin 16, eli:
A segmentti = 16 A" segmentti = A" segmentti 0000.
16-bittinen executive-osoite voi olla kolmen osoitteen summa tietokoneessa:
A use = Offset [+A kanta ][+A ind ]
l A offset - 16-bittinen offset-osoite suhteessa segmentin alkuun (tai suhteessa kantaan, jos A-kantaa on);
l Operandiosoitteen kantasiirtymän 16-bittinen osoite suhteessa segmentin alkuun;
l Ind - indeksiosoite (tai yksinkertaisesti indeksi) - operandiosoitteen lisäkomponentti, jota käytetään usein ohjelmoinnissa sykliset prosessit taulukoilla ja taulukoilla. Indeksi on määritettävä suoraan vastaavassa MPP-rekisterissä.
Dataa osoitettaessa voidaan käyttää kaikkia osoitteen komponentteja:
A abs data = segmentti + A insp = segmentti + poikkeama [+A kanta ][+A ind ]
Segmentti = 16 A" segmenttiä, A" -segmentti otetaan oletusarvoisesta DS-rekisteristä tai ES-rekisteristä, jos se on määritetty ohjelmassa. A-kanta ja A ind otetaan vastaavasti BX- ja indeksirekistereistä (SI tai DI), ja A-poikkeamat osoitetaan ohjelmassa eksplisiittisesti tai implisiittisesti.
Ohjelmakomentoja osoitettaessa voidaan käyttää vain kahta osoitekomponenttia:
abs-komento = segmentti + A exp = segmentti + siirtymä
A"-segmentti otetaan CS-rekisteristä ja A offset otetaan IP-rekisteristä.
Pino osoitus
IN pinomuisti(pino) pääsy muistisoluihin ei ole satunnaista, vaan "viimeinen kirjoitettu operandi luetaan ensin" (FILO) -periaatteen mukaan.
Pino abs = segmentti + + offset
Segmentin A" segmentin 16-bittinen osoite otetaan SS-rekisteristä, offsetit suhteessa pinosegmentin alkuun luetaan automaattisesti BP (stack base offset - A base) ja SP (stack base offset) -rekistereistä. aktiivinen solu pino, johon tiedot kirjoitetaan tai luetaan - "pinon yläosa" suhteessa pohjaan - A offset).
Mikroprosessorin suojatussa (moniohjelma) toimintatilassa segmenttien aloitusosoitteet tallennetaan deskriptoritaulukoihin ja niiden pituus on 24 tai 32 bittiä (riippuen MP:n tyypistä, valitsimet tallennetaan segmenttirekistereihin). tämä tila, joka sisältää osoitelinkit vastaaviin kuvaajataulukoihin.
Itsetestauskysymykset
1. Muotoile algoritmin pääominaisuudet.
2. Harkitse tapoja kirjoittaa algoritmi.
3. Anna ja selitä koneen ohjeiden tyypillinen koostumus.
4. Harkitse mahdollisia konekäskyrakenteita.
5. Selitä järjestelmä- ja sovellusohjelmiston tarkoitus.
6. Nimeä tietokoneiden pääkäyttötilat ja kuvaile niitä lyhyesti.
7. Mitä ovat ohjelman keskeytykset ja mikä on niiden tarkoitus?
8. Nimeä ja selitä keskeytystyypit.
9. Harkitse koneen toimintojen järjestystä keskeytystä suoritettaessa.
10. Nimeä tietokoneen muistisolujen osoitteiden tyypit ja ominaisuudet.
11. Kirjoita kaava tietojen absoluuttisen osoitteen laskemiseksi.
12. Mitä mikroprosessorin muistirekistereitä käytetään tietojen osoittamiseen?
13. Kirjoita kaava ohjelmakomennon absoluuttisen osoitteen laskemiseksi.
14. Mitä mikroprosessorin muistirekistereitä käytetään ohjelmointikäskyjen osoittamiseen?
15. Kirjoita kaava pinon osoitteen laskemiseksi.
16. Mitä mikroprosessorin muistirekistereitä käytetään pinomuistisolujen osoittamiseen?
Luku 19. Ohjelmoinnin elementit Assembly-kielellä
Lukua tutkittuaan opiskelijan tulee tietää:
· - Assembly-kielen tarkoitus ja käyttöalueet;
· - kielen pääkomponentit;
· - peruskomennot, käskyt, muokkaimet;
· - MPP-rekisterien ja muistisolujen osoittaminen assemblerissä;
· - ohjelmointimenettelyt tietojen näyttämiseksi näytöllä ja tietojen syöttämiseksi näppäimistöltä;
· -asentajaohjelman rakenne;
· -menettelyt EXE-muodossa olevan ohjelman luomiseksi;
· - Debug-ohjelman debuggerin käyttötarkoitus, komennot ja vaihtoehdot.
Tietokoneen käyttäjä, samoin sovellusohjelmoija, ohjelmat käännetään pääsääntöisesti koneesta riippumattomalle algoritminen kieli korkea taso(Basic, Pascal, FORTRAN, C, PROLOG jne.), on kuitenkin erittäin hyödyllistä, jos pätevä käyttäjä ymmärtää ohjelmoinnin perusteet ja konesuuntautuneiden kielten:
l PC-arkkitehtuurin parempi ymmärtäminen ja tietokoneiden osaavampi käyttö; kehittää rationaalisempia algoritmien ja ohjelmien rakenteita sovellettavien ongelmien ratkaisemiseksi;
l katselu- ja säätövaihtoehdot suoritettavat ohjelmat Kanssa EXE-laajennukset ja COM, joka on koottu kaikista korkean tason kielistä, jos ne katoavat lähdeohjelmia(soittamalla määritettyjä ohjelmia debuggeriin DEBUG-ohjelmat ja purkamalla ne, saat niiden näytön kokoonpanokielellä);
l laatia ohjelmia tärkeimpien ongelmien ratkaisemiseksi ( koneen ohjelma konesuuntautuneella kielellä valmistettu, on yleensä tehokkaampi (lyhyempi ja nopeampi 30–60 %) kuin korkean tason kielistä kääntämisen tuloksena saadut ohjelmat ja toteuttaa pääohjelmaan sisältyviä toimenpiteitä erilliset fragmentit, jos niitä ei voida toteuttaa millään korkean tason kielellä.
Assembly-kielen peruskomponentit
Kielten aakkoset
Kielen aakkoset muodostetaan ASCII-merkkejä:
l kirjaimet A:sta Z:hen (tai a:sta z:hen, pienet kirjaimet ja isot kirjaimet eivät eroa kokoonpanossa);
l numerot 0-9;
l erikoismerkkejä: @, $, ?, ., _,–, +, *, ", ", ; ,: jne.
Kirjaimista, numeroista ja symboleista muodostetaan @, $, ?, .,_:
l yksinkertaisia viestejä: proseduurien (alirutiinien) nimet (tunnisteet), muuttujat, käskyt, komennot (tunnisteet), vakioiden ja muuttujien arvot;
l yhdistetyt viestit: komennot (operaattorit);
l direktiivit (pseudooperaattorit);
l muuntajat (operaatiot).
Tunnisteiden, muuttujien ja tunnisteiden nimet voivat olla enintään 31 merkkiä pitkiä, eivätkä ne saa alkaa numerolla.
Vakiot (numerot ja merkkijonot)
Vain kokonaisluvut
On:
l binääriluvut; päättyy kirjaimeen B;
l desimaalilukuja; ilman erityistä loppua tai D-kirjaimella päättyvää;
l heksadesimaaliluvut; päättyy N-kirjaimeen.
Osoittaaksesi numerot 10, 11, 12, 13, 14, 15 heksadesimaalijärjestelmä Numeroita käytetään vastaavasti kirjaimia A, B, C, D, E, F; mutta heksadesimaalilukujen täytyy alkaa numerolla, esim.: lauseke F19Н ei ole luku, vaan tunniste, oikea numero tulee kirjoittaa näin: 0F19Н.
Negatiivisten lukujen kirjoittaminen:
l desimaaliluvut kirjoitetaan tavalliseen tapaan, yksinkertaisesti merkillä: –32, –32D;
l binääriluvut kirjoitetaan vain lisämuokattuun koodiin: –32D ® 11.100000B, –19D ® 11.01101B;
l Heksadesimaaliluvut kirjoitetaan vain kielellä lisäkoodi:
l –32D näyttää 1.E0H:lta, –119D näyttää 1.89H:lta.
Jouset (literaalit)
Merkkijonot: sisältävät kaikki kirjaimet, numerot tai symbolit, mutta ne on suljettu lainausmerkeissä: "IBM PC Pentium D -mikroprosessorilla."
Komennot (operaattorit)
Komentomuoto:
[Label [:]] COP [Operand] [,Operand] [;Kommentti].
Komentoelementtien väliin lisätään välilyöntejä. Tässä ja alla hakasulkeisiin merkityt elementit ovat valinnaisia.
OPC (Operator Code) - komennon muistikoodi (koostuu 2–6 kirjaimesta). Erilaisia koodeja voi olla jopa 256 (IBM PC-asentajassa niiden määrä vaihtelee MP-tyypin mukaan).
Operandi - eksplisiittinen annettu osoite(suora tai epäsuora); etiketin nimi, muuttuja; itse muuttujan arvo; assosiatiivinen merkki. Kokoonpanija tietää komennossa tarvittavien operandien määrän COP:sta. Useimmissa kaksiosoiteisissa käskyissä on kohde (dst - määränpää) ja lähde (src - lähde) operandit; lähde ei muuta sisältöään vastaanottimessa, toimintoon osallistuva 1. numero korvataan tuloksella.
Selitetään ero muistisolujen, porttien ja rekisterien välillä.
Muistisolut
Ne palvelevat vain tietojen tallentamista - ensin he kirjoittavat sen soluun, ja sitten he voivat lukea sen sekä kirjoittaa muita tietoja.
I/O-portit
, yleensä palvelevat muuntamista binääritietoa missä tahansa fyysisiä signaaleja ja takaisin. Esimerkiksi dataportti rinnakkaisliitäntä lomakkeita sähköiset signaalit liittimessä, johon tulostin yleensä liitetään. Saman liitännän tilaportti näyttää tulostimesta tulevat sähköiset signaalit joukona bittejä, jotka prosessori voi lukea.
Rekisteröidy
on melko laaja käsite, jota käytetään usein synonyyminä satamalle.
Jokaisella tavulla (muistisolulla, portilla) on oma uniikki fyysinen osoite
.
Prosessori asettaa tämän osoitteen järjestelmäväylään, kun se aloittaa pääsyn tiettyyn soluun tai porttiin. x86-perheessä ja PC-yhteensopivat tietokoneet Muistisolujen ja I/O-porttien osoiteavaruudet on erotettu toisistaan. Tämä on saatavilla molemmilta puolilta: prosessorit sallivat sen, ja tietokoneet käyttävät tätä jakoa. Nykyisillä prosessoreilla on fyysisen muistin osoitteen leveys 32 ja jopa 36 bittiä, mikä mahdollistaa osoitteiden 4 ja 64 Gt asti. I/O-avaruus käyttää vain osoitteen alempia 16 bittiä, mikä mahdollistaa jopa 65 384 yksitavuisen rekisterin osoittamisen. "Historialliset" osoitteet järjestelmälaitteet PC:t eivät ole muuttuneet syntymästä lähtien - tämä on kunnianosoitus yhteensopivuudelle, jota tuskin olisi ollut olemassa niin monta vuotta ilman välilyöntejä. Muistin ja I/O-porttien tilat eivät ole yhtä suuria vain kooltaan, vaan myös pääsymenetelmien suhteen. On olemassa monia tapoja osoittaa muistisolu x86:ssa, kun taas I/O-osoitteita on vain kaksi. Muistin virtuaalinen osoitus on mahdollista (ja laajalti käytetty), jolloin ohjelmoijalle, ohjelmalle ja jopa käyttäjälle luodaan illuusio RAM-muistin jättimäisestä koosta. I/O-portteihin pääsee vain oikeilla osoitteilla, mutta myös virtualisointi on mahdollista, mutta puhtaasti ohjelmisto käyttöjärjestelmä. Ja lopuksi, merkittävin ero muistitilojen ja I/O-porttien välillä: prosessori pystyy lukemaan vain suoritusohjeita muistitilasta. Tietenkin fragmentti voidaan lukea tuloportin kautta ohjelmakoodi(mitä tapahtuu esimerkiksi luettaessa tietoja levyltä), mutta jotta tämä koodi voidaan suorittaa, se on kirjoitettava muistiin.
Rekisterit erilaisia laitteita voidaan määrittää sekä I/O-porttitilaan että muistitilaan. Laiteportti viittaa tyypillisesti kyseiseen laitteeseen liittyvään rekisteriin, joka on määritetty I/O-porttitilaan. Yllä olevan terminologian tarkkuus on tietysti suhteellista. Joten esimerkiksi videomuistisolut (myös muisti!) eivät palvele pääasiassa tiedon tallentamiseen, vaan näytön elementtien hehkun hallintaan.
varten viime viikolla Selitin ihmisille kahdesti, kuinka muistin kanssa työskentely x86:ssa on järjestetty, jotta minun ei tarvitsisi selittää kolmatta kertaa, kun kirjoitin tämän artikkelin.
Ja niin, ymmärtääksesi muistin organisoinnin, sinun on tiedettävä joitain peruskäsitteitä, kuten rekisterit, pino jne. Yritän selittää tämän yksityiskohtaisesti matkan varrella, mutta hyvin lyhyesti, koska tämä ei ole tämän artikkelin aihe. Joten aloitetaan.
Kuten ohjelmoija tietää, hän ei työskentele kirjoittaessaan ohjelmia fyysinen osoite, mutta vain loogisesti. Ja vain jos hän ohjelmoi assemblerissä. Samassa C:ssä muistisolut ovat jo piilotettu ohjelmoijalta osoittimilla, hänen oman mukavuudensa vuoksi, mutta karkeasti sanottuna osoitin on toinen esitys loogisesta muistiosoitteesta, ja Javassa ei ole osoittimia, täysin huono kieli. Kuitenkin pätevä ohjelmoija hyötyisi tiedosta, miten muisti on järjestetty, ainakin yleisellä tasolla. Yleensä ohjelmoijat, jotka eivät tiedä kuinka kone toimii, todella järkyttivät minua, yleensä tämä on Java-ohjelmoijat ja muita PHP-tyyppejä, joilla on huonompi pätevyys.
Okei, nyt riittää surullisia juttuja, ryhdytään asiaan.
Harkitse osoiteavaruutta ohjelmatila 32 bitin prosessori(64 bitin kohdalla kaikki on sama)
Tämän tilan osoiteavaruus koostuu 2^32 muistisolusta, jotka on numeroitu välillä 0 - 2^32-1.
Ohjelmoija työskentelee tämän muistin kanssa, jos hänen on määriteltävä muuttuja, hän yksinkertaisesti sanoo, että muistisolu, jolla on osoite sellainen ja sellainen, sisältää tämän ja tämän tyyppistä dataa, kun taas ohjelmoija itse ei välttämättä tiedä mikä numero tässä solussa on, hän kirjoittaa vain jotain tällaista:
int data = 10;
Tietokone ymmärtää sen näin: sinun on otettava jokin solu, jossa on numero sata sata ja asetettava siihen kokonaisluku 10. Lisäksi et tiedä solun 18894 osoitetta, se on piilotettu sinulta.
Kaikki olisi hyvin, mutta herää kysymys, kuinka tietokone etsii tätä muistisolua, koska muistimme voi olla erilainen:
Tason 3 välimuisti
Tason 2 välimuisti
1 välimuistitaso
päämuisti
kovalevy
Tämä on kaikki erilaisia muistoja, mutta tietokone löytää helposti, mikä niistä sisältää int-tietomuuttujamme.
Tätä ongelmaa ollaan ratkaisemassa käyttöjärjestelmä yhdessä prosessorin kanssa.
Koko seuraava artikkeli on omistettu tämän menetelmän analyysille.
x86-arkkitehtuuri tukee pinoa.
Pino on jatkuva RAM-alue, joka on järjestetty lautaspinon periaatteen mukaan, et voi ottaa lautasia pinon keskeltä, voit ottaa vain ylimmän ja voit laittaa lautasen vain pinon päälle. pino.
Prosessorissa on erityisiä toimintoja pinon kanssa työskentelemiseen. konekoodit, jonka kokoonpanomuistomerkit näyttävät tältä:
Työnnä operandi
työntää operandin pinoon
Pop operandi
ponnahtaa arvon pinon yläosasta ja laittaa sen operandiinsa
Muistissa oleva pino kasvaa ylhäältä alas, mikä tarkoittaa, että kun lisäät siihen arvon, pinon yläosan osoite pienenee ja siitä poistuttaessa pinon yläosan osoite kasvaa.
Katsotaanpa nyt lyhyesti, mitä rekisterit ovat.
Nämä ovat itse prosessorissa olevia muistisoluja. Tämä on nopein ja kallein muistityyppi, kun prosessori suorittaa joitain toimintoja arvolla tai muistilla, se ottaa nämä arvot suoraan rekistereistä.
Prosessorissa on useita logiikkajoukkoja, joista jokaisella on omat konekoodinsa ja omat rekisterisarjansa.
Ohjelman perusrekisterit Kaikki ohjelmat käyttävät näitä rekistereitä kokonaislukutietojen käsittelyyn.
Floating Point Unit -rekisterit (FPU) Nämä rekisterit toimivat liukulukudatalla.
On myös MMX- ja XMM-rekistereitä, joita käytetään, kun sinun on suoritettava yksi käsky suuri määrä operandit
Katsotaanpa lähemmin pääohjelmien rekistereitä. Näihin kuuluu kahdeksan 32-bittistä rekisteriä yleiseen tarkoitukseen: EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESP
Jos haluat sijoittaa tietoja rekisteriin tai poistaa tietoja rekisteristä muistisoluun, käytä mov-komentoa:
Mov eax, 10
lataa numeron 10 eax-rekisteriin.
Mov data, ebx
kopioi ebx-rekisterissä olevan numeron datamuistipaikkaan.
ESP-rekisteri sisältää pinon yläosan osoitteen.
Yleisrekisterien lisäksi pääohjelmarekistereissä on kuusi 16-bittistä segmenttirekisteriä: CS, DS, SS, ES, FS, GS, EFLAGS, EIP
EFLAGS näyttää bittejä, joita kutsutaan lippuiksi, jotka kuvastavat prosessorin tilaa tai kuvaavat aiempien käskyjen edistymistä.
EIP-rekisteri sisältää seuraavan prosessorin suorittaman käskyn osoitteen.
En kuvaile FPU-rekistereitä, koska emme tarvitse niitä. Lyhyt poikkeamamme rekistereistä ja pinosta on siis ohi, palataan muistin järjestämiseen.
Kuten muistat, artikkelin tarkoitus on puhua loogisen muistin muuntamisesta fyysiseksi muistiksi, itse asiassa on välivaihe ja koko ketju näyttää tältä:
Looginen osoite --> Lineaarinen (virtuaalinen) --> Fyysinen
Koko lineaarinen osoiteavaruus on jaettu segmentteihin. Jokaisen prosessin osoiteavaruudessa on vähintään kolme segmenttiä:Koodisegmentti.(sisältää ohjelmamme komentoja, jotka suoritetaan.)
Datasegmentti.(Sisältää dataa eli muuttujia)
pino segmentti, josta kirjoitin edellä.
![](https://i0.wp.com/habrastorage.org/getpro/habr/post_images/2ee/8a8/f7b/2ee8a8f7bbfbd6a1e8b9cdf2a8a47c36.jpg)
Lineaarinen osoite lasketaan kaavalla:
lineaarinen osoite = Janan kantaosoite (kuvassa tämä on segmentin alku) + offset
Koodisegmentti
Koodisegmentin kantaosoite otetaan CS-rekisteristä. Koodisegmentin offset-arvo otetaan EIP-rekisteristä, joka tallentaa käskyn osoitteen, jonka suorittamisen jälkeen EIP-arvoa kasvatetaan tämän käskyn koolla. Jos komento kestää 4 tavua, EIP-arvoa kasvatetaan 4 tavulla ja se osoittaa jo seuraavat ohjeet. Kaikki tämä tapahtuu automaattisesti ilman ohjelmoijan osallistumista.Muistissamme voi olla useita koodisegmenttejä. Meidän tapauksessamme niitä on vain yksi.
Datasegmentti
Tiedot ladataan rekistereihin DS, ES, FS, GSTämä tarkoittaa, että datasegmenttejä voi olla enintään 4. Kuvassamme hän on yksin.
Datasegmentin poikkeama määritetään käskyn operandiksi. Oletusarvoisesti käytetään segmenttiä, johon DS-rekisteri osoittaa. Jos haluat syöttää toisen segmentin, sinun on ilmoitettava tämä suoraan segmentin korvausetuliite -komennossa.
Pino segmentti
Käytetty pinosegmentti määräytyy SS-rekisterin arvon perusteella.Tämän segmentin siirtymää edustaa ESP-rekisteri, joka osoittaa pinon yläosaan, kuten muistat.
Lisäksi muistissa olevat segmentit voivat mennä päällekkäin perusosoite Kaikista segmenteistä voi osua yhteen esimerkiksi nollassa. Tätä rappeutunutta tapausta kutsutaan lineaariseksi muistiesitukseksi. IN nykyaikaiset järjestelmät, muisti on yleensä järjestetty tällä tavalla.
Katsotaan nyt segmentin perusosoitteiden määritelmää, kirjoitin, että ne sisältyvät SS-, DS-, CS-rekistereihin, mutta tämä ei ole täysin totta, ne sisältävät tietyn 16-bittisen valitsimen, joka osoittaa tiettyyn segmenttiin kuvaaja, johon vaadittu osoite on jo tallennettu.
Tältä valitsin näyttää, sen kolmetoista bittiä sisältävät deskriptorin indeksin deskriptoritaulukossa. Ei ole vaikeaa laskea, että 2^13 = 8192 on enimmäismäärä kuvaukset taulukossa.
Yleisesti ottaen on olemassa kahdenlaisia deskriptoritaulukoita GDT ja LDT Ensimmäistä kutsutaan globaaliksi kuvaajataulukoksi, sitä on aina vain yksi järjestelmässä, sen aloitusosoite tai pikemminkin sen nollakuvaajan osoite on tallennettu 48-bittinen järjestelmärekisteri GDTR. Ja siitä hetkestä lähtien, kun järjestelmä käynnistyy, se ei muutu eikä osallistu vaihtoon.
Mutta kuvaajien arvot voivat muuttua. Jos valitsin sisältää TI-bitin yhtä kuin nolla, sitten prosessori siirtyy yksinkertaisesti GDT:hen ja etsii indeksistä tarvittavaa kuvaajaa, jolla tähän segmenttiin pääsee käsiksi.
Tähän asti kaikki on ollut yksinkertaista, mutta jos TI on 1, niin tämä tarkoittaa, että LDT:tä käytetään. Näitä pöytiä on monia, mutta niitä käytetään tällä hetkellä on se, jonka valitsin ladataan LDTR-järjestelmän rekisteriin, joka, toisin kuin GDTR, voi muuttua.
Valitsinindeksi osoittaa kuvaajaan, joka ei enää osoita segmentin perusosoitteeseen, vaan muistiin, johon paikallinen kuvaajataulukko on tallennettu, tai pikemminkin sen muistiin. nolla elementti. No sitten kaikki on sama kuin GDT:ssä. Näin toiminnan aikana paikallisia taulukoita voidaan luoda ja tuhota tarpeen mukaan. LDT:t eivät voi sisältää kuvauksia muille LDT:ille.
Tiedämme siis, kuinka prosessori pääsee kuvaajaan, ja katsotaan mitä tämä kuvaaja sisältää kuvassa:
Kuvaajat koostuvat 8 tavusta.
Bitit 15-39 ja 56-63 sisältävät tämän segmenttikuvaajan kuvaaman segmentin lineaarisen kantaosoitteen. Muistutan teitä lineaarisen osoitteen löytämiskaavasta:
lineaarinen osoite = perusosoite + offset
Tällä yksinkertaisella toimenpiteellä prosessori pääsee käsiksi oikeaan osoitteeseen lineaarinen muisti.Katsotaanpa kuvaajan muita bittejä, Segment Limit eli raja on erittäin tärkeä, sillä on 20-bittinen arvo välillä 0-15 ja 48-51 bittiä. Raja määrittää segmentin koon. Data- ja koodisegmenteille kaikki välissä olevat osoitteet ovat saatavilla:
[pohja; perus + raja)
Riippuen 55 G-bitistä (rakeisuus), raja voidaan mitata tavuissa, kun bittiarvo on nolla ja sitten maksimiraja on 1 MB, tai arvolla 1 raja mitataan sivuina, joista jokainen on 4 KB. Ja enimmäiskoko Tämä segmentti on 4 Gt.Pinosegmentin raja on alueella:
(perus + raja; yläreuna]
Muuten, ihmettelen, miksi kanta ja raja sijaitsevat niin rosoisesti kuvauksessa. Tosiasia on, että x86-prosessorit kehittyivät evolutiivisesti ja 286x:n päivinä kuvaajat olivat yhteensä 8 bittiä, kun taas suurimmat 2 tavua oli varattu, mutta myöhemmissä prosessorimalleissa bittikapasiteetin kasvaessa myös kuvaajat kasvoivat, mutta säästääkseen taaksepäin yhteensopivuus Jouduin jättämään rakenteen ennalleen."Yläosan" osoitteen arvo riippuu 54. D-bitistä, jos se on 0, niin ylin on 0xFFF(64kb-1), jos D-bitti on 1, niin top on 0xFFFFFFFF (4Gb-1)
41-43 bittiä segmenttityyppi koodataan.
000 - datasegmentti, vain luku
001 - datasegmentti, lue ja kirjoita
010 - pinosegmentti, vain luku
011 - pinoa segmentti, lue ja kirjoita
100 - koodisegmentti, vain suoritus
101 - koodisegmentti, lue ja suorita
110 - orjakoodisegmentti, vain suoritus
111 - orjakoodisegmentti, suoritus ja vain luku
44 S bittiä, jos se on 1, kuvaaja kuvaa todellista RAM-segmenttiä, muuten S-bitin arvo on 0.
Tärkein bitti on 47. P läsnäolobitti. Jos bitti on yhtä suuri kuin 1, se tarkoittaa, että segmentti tai paikallinen kuvaajataulukko ladataan RAM-muistiin, jos tämä bitti on 0, tämä tarkoittaa, että tämä segmentti ei ole RAMissa, se sijaitsee kiintolevyllä, tapahtuu keskeytys , prosessorin toiminnan erikoistapaus käynnistää käsittelijän erityinen tilaisuus, joka lataa halutun segmentin kiintolevyltä muistiin, jos P bitti on 0, niin kaikki kuvaajan kentät menettävät merkityksensä ja vapautuvat tallentamaan niihin palvelutietoja. Kun käsittelijä on saanut työnsä valmiiksi, P-bitti asetetaan arvoon 1 ja deskriptoriin päästään uudelleen, jonka segmentti on jo muistissa.
Tämä päättää loogisen osoitteen muuntamisen lineaariseksi, ja mielestäni meidän pitäisi lopettaa tähän. Seuraavalla kerralla käsittelen lineaarisen fyysiseksi muuntamisen toista osaa.
Ja mielestäni kannattaa myös puhua hieman funktioargumenttien välittämisestä ja muuttujien sijoittamisesta muistiin, jotta saadaan jokin yhteys todellisuuteen, koska muuttujien sijoittaminen muistiin on asia, jota sinun tulee käsitellä työssäsi, eikä vain mitä varten teoreettisia spekulaatioita järjestelmän ohjelmoija. Mutta ymmärtämättä kuinka muisti toimii, on mahdotonta ymmärtää, kuinka nämä samat muuttujat tallennetaan muistiin.
Yleisesti ottaen toivon, että se oli mielenkiintoista ja nähdään taas.