Luku 6: Modernin tietokonearkkitehtuurin perusteet kokoonpanokielellä

Luku 6 Modernin Tietokonearkkitehtuurin Perusteet Kokoonpanokielella



6.1 Johdanto

Nykyaikaisia ​​yleiskäyttöisiä tietokoneita on kahta tyyppiä: CISC ja RISC. CISC on lyhenne sanoista Complex Instruction Set Computer. RISK on lyhenne sanoista Reduced Instruction Set Computer. 6502- tai 6510-mikroprosessorit, kuten Commodore-64-tietokoneessa, muistuttavat enemmän RISC-arkkitehtuuria kuin CISC-arkkitehtuuria.

RISC-tietokoneissa on yleensä lyhyemmät asennuskieliohjeet (tavumäärän mukaan) verrattuna CISC-tietokoneisiin.







Huomautus : Olipa kyseessä CISC, RISC tai vanha tietokone, oheislaite alkaa sisäisestä portista ja kulkee ulospäin tietokoneen järjestelmäyksikön (perusyksikön) pystysuorassa pinnassa olevan ulkoisen portin kautta ja ulkoiseen laitteeseen.



Tyypillinen CISC-tietokoneen käsky voidaan nähdä useiden lyhyiden kokoonpanokielen käskyjen yhdistämisenä yhdeksi pidemmäksi kokoonpanokielen käskyksi, mikä tekee tuloksena olevasta käskystä monimutkaisen. Erityisesti CISC-tietokone lataa operandit muistista mikroprosessorin rekistereihin, suorittaa toiminnon ja tallentaa sitten tuloksen takaisin muistiin, kaikki yhdessä käskyssä. Toisaalta tämä on vähintään kolme ohjetta (lyhyt) RISC-tietokoneelle.



CISC-tietokoneita on kaksi suosittua sarjaa: Intelin mikroprosessoritietokoneet ja AMD-mikroprosessoritietokoneet. AMD on lyhenne sanoista Advanced Micro Devices; se on puolijohteita valmistava yritys. Intelin mikroprosessorisarjat ovat kehitysjärjestyksessä 8086, 8088, 80186, 80286, 80386, 80486, Pentium, Core, i Series, Celeron ja Xeon. Varhaisten Intelin mikroprosessorien, kuten 8086 ja 8088, asennuskieliohjeet eivät ole kovin monimutkaisia. Ne ovat kuitenkin monimutkaisia ​​uusille mikroprosessoreille. Uusimmat AMD-mikroprosessorit CISC-sarjaan ovat Ryzen, Opteron, Athlon, Turion, Phenom ja Sempron. Intel- ja AMD-mikroprosessorit tunnetaan x86-mikroprosessoreina.





ARM tulee sanoista Advanced RISC Machine. ARM-arkkitehtuurit määrittelevät RISC-prosessorien perheen, jotka soveltuvat käytettäväksi monenlaisissa sovelluksissa. Vaikka monia Intel- ja AMD-mikroprosessoreja käytetään pöytätietokoneissa, monet ARM-prosessorit toimivat sulautetuina prosessoreina turvallisuuden kannalta kriittisissä järjestelmissä, kuten autojen lukkiutumattomissa jarruissa ja yleiskäyttöisinä prosessoreina älykelloissa, kannettavissa puhelimissa, tableteissa ja kannettavissa tietokoneissa. . Vaikka molempia mikroprosessoreita voidaan nähdä pienissä ja suurissa laitteissa, RISC-mikroprosessoreita löytyy enemmän pienistä laitteista kuin suurista laitteista.

Tietokone Word
Jos tietokoneen sanotaan olevan 32-bittinen sana, se tarkoittaa, että tiedot tallennetaan, siirretään ja käsitellään 32-bittisten binäärikoodien muodossa emolevyn sisäosassa. Se tarkoittaa myös sitä, että tietokoneen mikroprosessorin yleiskäyttöiset rekisterit ovat 32-bittisiä. 6502-mikroprosessorin A-, X- ja Y-rekisterit ovat yleiskäyttöisiä rekistereitä. Ne ovat kahdeksan bittiä leveitä, joten Commodore-64-tietokone on kahdeksan bitin sanatietokone.



Jotain sanastoa
X86 tietokoneet

Tavun, sanan, kaksoissanan, quadwordin ja double-quadwordin merkitykset ovat seuraavat x86-tietokoneissa:

  • Tavu : 8 bittiä
  • Sana : 16 bittiä
  • Doubleword : 32 bittiä
  • Quadword : 64 bittiä
  • Kaksoisnelisana : 128 bittiä

ARM-tietokoneet
Tavun, puolisanan, sanan ja kaksoissanan merkitykset ovat seuraavat ARM-tietokoneissa:

  • Tavu : 8 bittiä
  • Tule puoliksi : 16 bittiä
  • Sana : 32 bittiä
  • Doubleword : 64 bittiä

x86- ja ARM-nimien (ja arvojen) erot ja yhtäläisyydet tulee huomioida.

Huomautus : Molempien tietokonetyyppien etumerkkiset kokonaisluvut ovat kahden komplementteja.

Muistin sijainti
Commodore-64-tietokoneessa muistipaikka on tyypillisesti yksi tavu, mutta se voi olla satunnaisesti kaksi peräkkäistä tavua, kun otetaan huomioon osoittimet (epäsuora osoite). Nykyaikaisessa x86-tietokoneessa muistipaikka on 16 peräkkäistä tavua, kun käsitellään 16 tavun (128 bitin) kaksoisnelisanaa, 8 peräkkäistä tavua, kun käsitellään 8 tavun (64 bitin) nelisanaa, 4 peräkkäistä tavua, kun käsitellään kaksoissanaa 4 tavua (32 bittiä), 2 peräkkäistä tavua käsiteltäessä 2 tavun (16 bittiä) sanaa ja 1 tavu, kun käsitellään tavua (8 bittiä). Nykyaikaisessa ARM-tietokoneessa muistipaikka on 8 peräkkäistä tavua, kun käsitellään 8 tavun (64 bitin) kaksoissanaa, 4 peräkkäistä tavua, kun käsitellään 4 tavun (32 bitin) sanaa, 2 peräkkäistä tavua, kun käsitellään puolisanaa. 2 tavua (16 bittiä) ja 1 tavua käsiteltäessä tavua (8 bittiä).

Tässä luvussa kerrotaan, mikä on yhteistä CISC- ja RISC-arkkitehtuureissa ja mitä eroja niillä on. Tämä tehdään verrattuna 6502 µP:ään ja commodore-64-tietokoneeseen, jos sitä voidaan soveltaa.

6.2 Nykyaikaisen tietokoneen emolevyn lohkokaavio

PC tulee sanoista Personal Computer. Seuraavassa on yleinen peruslohkokaavio nykyaikaiselle emolevylle, jossa on yksi mikroprosessori henkilökohtaiseen tietokoneeseen. Se edustaa CISC- tai RISC-emolevyä.


Kuva 6.21 Nykyaikaisen PC:n perusemolevyn lohkokaavio

Kaaviossa on kolme sisäistä porttia, mutta käytännössä niitä on enemmän. Jokaisella portilla on rekisteri, joka voidaan nähdä itse porttina. Jokaisessa porttipiirissä on ainakin toinen rekisteri, jota voidaan kutsua 'tilarekisteriksi'. Tilarekisteri ilmoittaa portin ohjelmalle, joka lähettää keskeytyssignaalin mikroprosessorille. On keskeytysohjainpiiri (ei esitetty), joka erottaa eri porteista tulevat eri keskeytyslinjat ja jolla on vain muutama rivi µP:hen.

Kaavion HD.C tarkoittaa kiintolevykorttia. NIC tulee sanoista Network Interface Card. Kiintolevykortti (piiri) on kytketty kiintolevyyn, joka on nykyaikaisen tietokoneen perusyksikön (järjestelmäyksikön) sisällä. Verkkokortti (piiri) on kytketty ulkoisella kaapelilla toiseen tietokoneeseen. Kaaviossa on yksi portti ja DMA (katso seuraava kuva), jotka on kytketty kiintolevykorttiin ja/tai verkkokorttiin. DMA on lyhenne sanoista Direct Memory Access.

Muista Commodore-64 tietokone -luvusta, että jotta tavut voidaan lähettää muistista levyasemaan tai toiseen tietokoneeseen, jokainen tavu on kopioitava mikroprosessorissa olevaan rekisteriin ennen kuin se kopioidaan vastaavaan sisäiseen porttiin ja sitten automaattisesti. laitteeseen. Tavujen vastaanottamiseksi levyasemalta tai toiselta tietokoneelta muistiin, jokainen tavu on kopioitava vastaavasta sisäisestä porttirekisteristä mikroprosessorirekisteriin ennen kopioimista muistiin. Tämä kestää yleensä kauan, jos virran tavumäärä on suuri. Ratkaisu nopeaan siirtoon on Direct Memory Accessin (piirin) käyttö ilman mikroprosessorin läpikulkua.

DMA-piiri on portin ja HD:n välissä. C tai NIC. DMA-piirin suoralla muistin pääsyllä suurten tavuvirtojen siirto tapahtuu suoraan DMA-piirin ja muistin (RAM) välillä ilman mikroprosessorin jatkuvaa osallistumista. DMA käyttää osoiteväylää ja dataväylää µP:n sijasta. Siirron kokonaiskesto on lyhyempi kuin käytettäessä µP hardia. Sekä HD C. että NIC käyttävät DMA:ta, kun niillä on suuri tietovirta (tavuja) siirrettäväksi RAM-muistin (muistin) kanssa.

GPU tulee sanoista Graphics Processing Unit. Tämä emolevyn lohko vastaa tekstin ja liikkuvien tai still-kuvien lähettämisestä näytölle.

Nykyaikaisissa tietokoneissa (PC:t) ei ole lukumuistia (ROM). On kuitenkin olemassa BIOS tai UEFI, joka on eräänlainen haihtumaton RAM. BIOSissa olevia tietoja ylläpitää itse asiassa akku. Akku on se, mikä itse asiassa ylläpitää myös kelloajastinta, oikeaan aikaan ja oikeaan päivämäärään tietokoneelle. UEFI keksittiin BIOSin jälkeen, ja se on korvannut BIOSin, vaikka BIOS on edelleen varsin ajankohtainen nykyaikaisissa tietokoneissa. Keskustelemme näistä lisää myöhemmin!

Nykyaikaisissa tietokoneissa osoite- ja dataväylät µP:n ja sisäisten porttipiirien (ja muistin) välillä eivät ole rinnakkaisväyliä. Ne ovat sarjaväyliä, jotka tarvitsevat kaksi johdinta siirtoon yhteen suuntaan ja toiset kaksi johdinta vastakkaiseen suuntaan. Tämä tarkoittaa esimerkiksi sitä, että 32-bittiä voidaan lähettää sarjassa (bitti toisensa jälkeen) kumpaankin suuntaan.

Jos sarjalähetys on vain yhteen suuntaan kahdella johtimella (kaksi linjaa), sen sanotaan olevan half-duplex. Jos sarjalähetys on molempiin suuntiin neljällä johtimella, yksi pari kumpaankin suuntaan, sen sanotaan olevan full-duplex.

Nykyajan tietokoneen koko muisti koostuu edelleen sarjasta tavupaikkoja: kahdeksan bittiä tavua kohden. Nykyaikaisessa tietokoneessa on muistitilaa vähintään 4 gigatavua = 4 x 210 x 2 10 x 2 10 = 4 x 1 073 741 824 10 tavua = 4 x 1024 10/ala> x 1024 10 x 1024 10 = 4 x 1 073 741 824 10 .

Huomautus : Vaikka aikaisemmalla emolevyllä ei näy ajastinpiiriä, kaikissa nykyaikaisissa emolevyissä on ajastinpiirit.

6.3 x64-tietokonearkkitehtuurin perusteet

6.31 x64-rekisterisarja
X86-sarjan mikroprosessorien 64-bittinen mikroprosessori on 64-bittinen mikroprosessori. On varsin modernia korvata saman sarjan 32-bittinen prosessori. 64-bittisen mikroprosessorin yleiskäyttöiset rekisterit ja niiden nimet ovat seuraavat:


Kuva 6.31 Yleiskäyttöiset rekisterit x64:lle

Esitetyssä kuvassa on kuusitoista (16) yleiskäyttöistä rekisteriä. Jokainen näistä rekistereistä on 64-bittinen. Kun tarkastellaan rekisteriä vasemmassa yläkulmassa, 64 bittiä tunnistetaan RAX:ksi. Tämän saman rekisterin ensimmäiset 32 ​​bittiä (oikealta) tunnistetaan nimellä EAX. Tämän saman rekisterin ensimmäiset 16 bittiä (oikealta) tunnistetaan nimellä AX. Tämän saman rekisterin toinen tavu (oikealta) tunnistetaan AH:ksi (H tarkoittaa tässä korkeaa). Ja ensimmäinen tavu (saman rekisterin) tunnistetaan AL:ksi (L tarkoittaa tässä matalaa). Oikeassa alakulmassa olevaa rekisteriä tarkasteltaessa 64 bittiä tunnistetaan nimellä R15. Tämän saman rekisterin ensimmäiset 32 ​​bittiä tunnistetaan nimellä R15D. Tämän saman rekisterin ensimmäiset 16 bittiä tunnistetaan nimellä R15W. Ja ensimmäinen tavu tunnistetaan nimellä R15B. Muiden rekisterien (ja alirekisterien) nimet selitetään samalla tavalla.

Intelin ja AMD µP:n välillä on joitain eroja. Tämän osan tiedot ovat Intelille.

6502 µP:ssä seuraavan suoritettavan käskyn sisältävä ohjelmalaskurirekisteri (johon ei pääse suoraan) on 16 bittiä leveä. Tässä (x64) ohjelmalaskuria kutsutaan Instruction Pointeriksi, ja se on 64 bittiä leveä. Se on merkitty nimellä RIP. Tämä tarkoittaa, että x64 µP voi osoittaa jopa 264 = 1,844674407 x 1019 (itse asiassa 18 446 744 073 709 551 616) muistitavupaikkaa. RIP ei ole yleiskäyttöinen rekisteri.

Stack Pointer Register tai RSP on yksi 16 yleiskäyttöisen rekisterin joukosta. Se osoittaa viimeiseen muistin pinon merkintään. Kuten 6502 µP:n kohdalla, x64:n pino kasvaa alaspäin. x64:ssä RAM-pinoa käytetään aliohjelmien palautusosoitteiden tallentamiseen. Sitä käytetään myös 'varjotilan' tallentamiseen (katso seuraava keskustelu).

6502 µP:ssä on 8-bittinen prosessorin tilarekisteri. Vastaavaa x64:ssä kutsutaan RFLAGS-rekisteriksi. Tämä rekisteri tallentaa liput, joita käytetään toimintojen tulosten ja prosessorin ohjaamiseen (µP). Se on 64 bittiä leveä. Korkeammat 32 bittiä on varattu, eikä niitä tällä hetkellä käytetä. Seuraavassa taulukossa on RFLAGS-rekisterin yleisesti käytettyjen bittien nimet, indeksi ja merkitykset:

Taulukko 6.31.1
Eniten käytetyt RFLAGS-liput (bitit)
Symboli Bitti Nimi Tarkoitus
CF 0 Kanna Se asetetaan, jos aritmeettinen operaatio tuottaa siirron tai lainauksen tuloksen merkittävimmästä bitistä; selvitetty muuten. Tämä lippu osoittaa ylivuotoehdon etumerkittömälle kokonaislukuaritmetiikalle. Sitä käytetään myös monitarkkuusaritmetiikassa.
PF 2 Pariteetti Se asetetaan, jos tuloksen vähiten merkitsevä tavu sisältää parillisen määrän 1 bittiä; selvitetty muuten.
OF 4 Säätää Se asetetaan, jos aritmeettinen operaatio tuottaa siirto- tai lainauksen tuloksen bitistä 3; selvitetty muuten. Tätä lippua käytetään binäärikoodatussa desimaaliaritmetiikassa (BCD).
ZF 6 Nolla Se asetetaan, jos tulos on nolla; selvitetty muuten.
SF 7 Merkki Se asetetaan, jos se on yhtä suuri kuin tuloksen merkittävin bitti, joka on etumerkillisen kokonaisluvun etumerkkibitti (0 tarkoittaa positiivista arvoa ja 1 negatiivista arvoa).
OF yksitoista Ylivuoto Se asetetaan, jos kokonaislukutulos on liian suuri positiivinen luku tai liian pieni negatiivinen luku (pois lukien etumerkkibitti) mahtumaan kohdeoperandiin; selvitetty muuten. Tämä lippu osoittaa etumerkityn kokonaisluvun (kahden komplementin) aritmeettisen ylivuotoehdon.
DF 10 Suunta Se asetetaan, jos suuntamerkkijonokäskyt toimivat (lisää tai vähennä).
ID kaksikymmentäyksi Henkilöllisyystodistus Se asetetaan, jos sen vaihdettavuus ilmaisee CPUID-käskyn olemassaolon.

Edellä mainittujen kahdeksantoista 64-bittisen rekisterin lisäksi x64-arkkitehtuurissa µP on kahdeksan 80 bitin levyistä rekisteriä liukulukuaritmetiikkaa varten. Näitä kahdeksaa rekisteriä voidaan käyttää myös MMX-rekistereinä (katso seuraava keskustelu). XMM:lle on myös kuusitoista 128-bittistä rekisteriä (katso seuraava keskustelu).

Siinä ei ole kaikki rekistereistä kiinni. On olemassa lisää x64-rekistereitä, jotka ovat segmenttirekistereitä (useimmiten käyttämättömiä x64:ssä), ohjausrekistereitä, muistinhallintarekistereitä, virheenkorjausrekistereitä, virtualisointirekistereitä, suorituskykyrekistereitä, jotka seuraavat kaikenlaisia ​​sisäisiä parametreja (välimuistin osumat/puutteet, suoritetut mikrooperaatiot, ajoitus). , ja paljon enemmän).

SIMD

SIMD tulee sanoista Single Instruction Multiple Data. Tämä tarkoittaa, että yksi kokoonpanokielen käsky voi vaikuttaa useaan dataan samanaikaisesti yhdessä mikroprosessorissa. Harkitse seuraavaa taulukkoa:

1 2 3 4 5 6 7 8
+ 9 10 yksitoista 12 13 14 viisitoista 16
= 10 12 14 16 18 kaksikymmentä 22 24

Tässä taulukossa kahdeksan numeroparia lisätään rinnakkain (saman keston aikana), jolloin saadaan kahdeksan vastausta. Yhdellä kokoonpanokielen käskyllä ​​voidaan tehdä kahdeksan rinnakkaista kokonaislukujen lisäystä MMX-rekistereihin. Samanlainen asia voidaan tehdä XMM-rekistereillä. Joten kokonaisluvuille on MMX-ohjeet ja kelluville XMM-ohjeet.

6.32 Muistikartta ja x64

Kun käskyosoittimessa (ohjelmalaskurissa) on 64 bittiä, tämä tarkoittaa, että 264 = 1,844674407 x 1019 muistitavun sijainti voidaan osoittaa. Heksadesimaalimuodossa suurin tavun sijainti on FFFF,FFFF,FFFF,FFFF16. Mikään tavallinen tietokone ei nykyään pysty tarjoamaan näin suurta (täydellistä) muistitilaa. Joten sopiva muistikartta x64-tietokoneelle on seuraava:

Huomaa, että välissä 0000,8000,0000,000016 arvoon FFFF,7FFF,FFFF,FFFF16 ei ole muistipaikkoja (ei muistipankkeja). Tämä on ero FFFF,0000,0000,000116, joka on melko suuri. Kanonisessa yläosassa on käyttöjärjestelmä, kun taas kanonisessa alimmassa puoliskossa on käyttäjäohjelmat (sovellukset) ja data. Käyttöjärjestelmä koostuu kahdesta osasta: pienestä UEFI:stä (BIOS) ja suuresta osasta, jotka ladataan kiintolevyltä. Seuraavassa luvussa puhutaan lisää nykyaikaisista käyttöjärjestelmistä. Huomaa samankaltaisuus tämän muistikartan ja Commodore-64:n kanssa, jolloin 64 kilotavua saattoi näyttää paljon muistia.

Tässä yhteydessä käyttöjärjestelmää kutsutaan karkeasti 'ytimeksi'. Ydin on samanlainen kuin Commodore-64-tietokoneen ydin, mutta siinä on paljon enemmän aliohjelmia.

x64:n endianisuus on pieni endianisuus, mikä tarkoittaa, että sijainnissa alempi osoite osoittaa alempaan sisältötavuun muistissa.

6.33 Assembly Language Addressing Modes for x64

Osoitemuodot ovat tapoja, joilla käsky voi päästä käsiksi µP-rekistereihin ja muistiin (mukaan lukien sisäiset porttirekisterit). x64:ssä on monia osoitetiloja, mutta tässä käsitellään vain yleisesti käytettyjä osoitetiloja. Tässä olevan ohjeen yleinen syntaksi on:

opkoodin kohde, lähde

Desimaaliluvut kirjoitetaan ilman etu- tai päätettä. 6502:ssa lähde on implisiittinen. x64:ssä on enemmän toimintakoodeja kuin 6502:ssa, mutta joillakin operaatiokoodeilla on sama muisti. Yksittäiset x64-käskyt ovat vaihtelevan pituisia, ja niiden koko voi vaihdella 1-15 tavua. Yleisesti käytetyt osoitemuodot ovat seuraavat:

Välitön osoitetila
Tässä lähdeoperandi on todellinen arvo, ei osoite tai nimiö. Esimerkki (lue kommentti):

ADD EAX, 14 ; lisää 64-bittisen RAX:n 14 desimaali 32-bittiseen EAX:iin, vastaus säilyy EAX:ssa (kohde)

Rekisteröidy osoiterekisteröintitilaan
Esimerkki:

ADD R8B, AL ; lisää RAX:n 8-bittinen AL 64-bittisen R8:n R8B:hen – vastaukset jää R8B:hen (kohde)

Epäsuora ja indeksoitu osoitetila
Epäsuora osoite 6502 µP:llä tarkoittaa, että käskyssä annetun osoitteen sijainnilla on lopullisen sijainnin tehokas osoite (osoitin). Sama tapahtuu x64:n kanssa. Indeksiosoite 6502 µP:llä tarkoittaa, että ohjeessa annettuun osoitteeseen lisätään µP-rekisterin sisältö tehokkaan osoitteen saamiseksi. Sama tapahtuu x64:n kanssa. Lisäksi x64:llä rekisterin sisältö voidaan myös kertoa 1:llä tai 2:lla tai 4:llä tai 8:lla ennen kuin se lisätään annettuun osoitteeseen. x64:n mov (copy) -käsky voi yhdistää sekä epäsuoran että indeksoidun osoitteen. Esimerkki:

MOV R8W, 1234[8*RAX+RCX] ; siirrä sana osoitteeseen (8 x RAX + RCX) + 1234

Tässä R8W:llä on R8:n ensimmäiset 16 bittiä. Annettu osoite on 1234. RAX-rekisterissä on 64-bittinen luku, joka kerrotaan 8:lla. Tulos lisätään 64-bittisen RCX-rekisterin sisältöön. Tämä toinen tulos lisätään annettuun osoitteeseen, joka on 1234 tehokkaan osoitteen saamiseksi. Tehollisen osoitteen sijainnissa oleva numero siirretään (kopioidaan) R8-rekisterin ensimmäiseen 16-bittiseen paikkaan (R8W), joka korvaa siellä olevan. Huomaa hakasulkujen käyttö. Muista, että sana x64:ssä on 16 bittiä leveä.

RIP Suhteellinen osoitus
6502 µP:ssä suhteellista osoitusta käytetään vain haarakäskyjen kanssa. Siellä operaatiokoodin yksi operandi on siirtymä, joka lisätään tai vähennetään ohjelmalaskurin sisältöön tehokkaalle käskyosoitteelle (ei dataosoitteelle). Samanlainen asia tapahtuu x64:n kanssa, jossa ohjelmalaskuria kutsutaan käskyosoittimeksi. x64-käskyn ei tarvitse olla vain haarakäsky. Esimerkki RIP-suhteellisesta osoitteesta on:

MOV AL, [RIP]

RAX:n AL:ssa on 8-bittinen etumerkillinen numero, joka lisätään tai vähennetään RIP:n sisällöstä (64-bittinen käskyosoitin) osoittamaan seuraavaan käskyyn. Huomaa, että lähde ja kohde on poikkeuksellisesti vaihdettu tässä ohjeessa. Huomaa myös hakasulkujen käyttö, joka viittaa RIP:n sisältöön.

6.34 x64:n yleisesti käytetyt ohjeet

Seuraavassa taulukossa * tarkoittaa eri mahdollisia jälkiliitteitä operaatiokoodien osajoukosta:

Taulukko 6.34.1
Yleisesti käytetyt ohjeet x64:ssä
Opcode Merkitys
MOV Siirrä (kopioi) muistiin/muistista/muistista ja rekisterien välillä
CMOV* Erilaisia ​​ehdollisia liikkeitä
XCHG Vaihto
BSWAP Tavun vaihto
PUSH/POP Pinon käyttö
ADD/ADC Lisää/kannalla
SUB/SBC Vähennä/siirrolla
MUL/IMUL Kerro/allekirjoita
DIV/IDIV Jaa/allekirjoittamaton
INC/DEC Lisäys/vähennys
NEG Kiellä
CMP Vertailla
JA/TAI/XOR/EI Bittikohtaiset toiminnot
SHR/SAR Siirrä oikealle loogista/aritmeettista
SHL/SAL Siirrä vasemmalle looginen/aritmeettinen
ROR/ROLI Kierrä oikealle/vasemmalle
RCR/RCL Kierrä oikealle/vasemmalle kantoterän läpi
BT/BTS/BTR Bittitesti/ja aseta/ja nollaa
JMP Ehdoton hyppy
JE/JNE/JC/JNC/J* Hyppää, jos yhtä suuri/ei yhtä suuri/ kanna/ei kanna/monet muut
KÄVELLE/KÄVELE/KÄVELLE Silmukka ECX:llä
SOITTA/RET Soita aliohjelmaan/paluu
NOP Ei operaatiota
CPUID CPU tiedot

x64:ssä on kerto- ja jako-ohjeet. Siinä on kerto- ja jakolaitteistopiirit µP:ssä. 6502 µP:ssä ei ole kerto- ja jakolaitteistopiirejä. Kertominen ja jako on nopeampaa tehdä laitteistolla kuin ohjelmistolla (mukaan lukien bittien siirto).

Merkkijono-ohjeet
On olemassa useita merkkijono-ohjeita, mutta ainoa, josta tässä keskustellaan, on MOVS-käsky (for move string) kopioida osoitteesta C000 alkava merkkijono. H . Aloita osoitteesta C100 H , käytä seuraavaa ohjetta:

MOVS [C100H], [C000H]

Huomaa heksadesimaaliliitteen H.

6.35 Silmukka x64

6502 µP:ssä on haaraohjeet silmukointiin. Haarakäsky hyppää osoitepaikkaan, jossa on uusi käsky. Osoitepaikkaa voidaan kutsua 'silmukaksi'. x64:ssä on LOOP/LOOPE/LOOPNE-ohjeet silmukointiin. Näitä varatun kokoonpanokielen sanoja ei pidä sekoittaa 'silmukka'-tunnisteeseen (ilman lainausmerkkejä). Käyttäytyminen on seuraava:

LOOP pienentää ECX:ää ja tarkistaa, ettei ECX ole nolla. Jos tämä ehto (nolla) täyttyy, se hyppää määritettyyn tarraan. Muuten se epäonnistuu (jatka seuraavan keskustelun ohjeiden kanssa).

LOOPE pienentää ECX:ää ja tarkistaa, että ECX ei ole nolla (voi olla esimerkiksi 1) ja että ZF on asetettu (1). Jos nämä ehdot täyttyvät, se hyppää etikettiin. Muuten se kaatuu.

LOOPNE pienentää ECX:ää ja tarkistaa, että ECX ei ole nolla ja ZF EI OLE asetettu (eli se on nolla). Jos nämä ehdot täyttyvät, se siirtyy etikettiin. Muuten se kaatuu.

x64:ssä RCX-rekisteri tai sen alaosat, kuten ECX tai CX, sisältävät laskurin kokonaisluvun. LOOP-käskyjen avulla laskuri laskee normaalisti alaspäin ja pienentää 1:llä jokaista hyppyä (silmukkaa) kohti. Seuraavassa silmukkakoodisegmentissä EAX-rekisterin numero kasvaa 0:sta 10:een kymmenellä iteraatiolla, kun taas ECX:n luku laskee (vähenee) 10 kertaa (lue kommentit):

MOV EAX, 0 ;
MOV ECX, 10; laskea oletusarvoisesti 10 kertaa, kerran jokaista iteraatiota kohden
etiketti:
INC EAX ; lisää EAX silmukan rungoksi
LOOP etiketti ; vähennä EAX, ja jos EAX ei ole nolla, suorita silmukan runko uudelleen 'label:'sta.

Silmukan koodaus alkaa sanasta 'label:'. Huomaa kaksoispisteen käyttö. Silmukan koodaus päättyy 'LOOP-nimikkeeseen', joka sanoo decrement EAX. Jos sen sisältö ei ole nolla, palaa ohjeeseen 'label:' jälkeen ja suorita uudelleen kaikki käskyt (kaikki runkokäskyt), jotka tulevat alaspäin, kunnes 'LOOP label'. Huomaa, että 'tarralla' voi silti olla toinen nimi.

6.36 x64:n tulo/lähtö

Tämä luvun osa käsittelee tietojen lähettämistä lähtöporttiin (sisäiseen) tai tiedon vastaanottamiseen tuloportista (sisäisestä). Piirisarjassa on kahdeksanbittiset portit. Mitä tahansa kahta peräkkäistä 8-bittistä porttia voidaan käsitellä 16-bittisenä porttina, ja mitä tahansa neljää peräkkäistä porttia voidaan käsitellä 32-bittisenä. Tällä tavalla prosessori voi siirtää 8, 16 tai 32 bittiä ulkoiselle laitteelle tai ulkoisesta laitteesta.

Tiedot voidaan siirtää prosessorin ja sisäisen portin välillä kahdella tavalla: käyttämällä niin sanottua muistikartoitettua tuloa/lähtöä tai käyttämällä erillistä tulo/lähtöosoiteavaruutta. Muistikartoitettu I/O on kuin mitä tapahtuu 6502-prosessorissa, jossa porttiosoitteet ovat itse asiassa osa koko muistitilaa. Tässä tapauksessa, kun tiedot lähetetään tiettyyn osoitepaikkaan, se menee porttiin eikä muistipankkiin. Porteilla voi olla erillinen I/O-osoitetila. Tässä jälkimmäisessä tapauksessa kaikkien muistipankkien osoitteet ovat nollasta alkaen. On erillinen osoitealue 0000H - FFFF16. Näitä käyttävät piirisarjan portit. Emolevy on ohjelmoitu niin, että muistikartoitettua I/O:ta ja erillistä I/O-osoitetilaa ei sekoiteta keskenään.

Muistikartoitettu I/O
Tällöin portteja pidetään muistipaikkoina ja µP:n ja porttien väliseen tiedonsiirtoon käytetään normaaleja muistin ja µP:n välillä käytettäviä opkoodeja. Jos haluat siirtää tavun osoitteesta F000H olevasta portista µP-rekisteriin RAX:EAX:AX:AL, toimi seuraavasti:

MOV AL, [F000H]

Merkkijono voidaan siirtää muistista porttiin ja päinvastoin. Esimerkki:

MOVS [F000H], [CO00H]; lähde on C000H ja kohde on satama F000H.

Erillinen I/O-osoitetila

Tätä varten on käytettävä erityisiä tulo- ja lähtöohjeita.

Yksittäisten kohteiden siirto
Siirron prosessorirekisteri on RAX. Itse asiassa se on RAX:EAX kaksoissanalle, RAX:EAX:AX ​​sanalle ja RAX:EAX:AX:AL tavulle. Joten jos haluat siirtää tavun portista FFF0h:ssa RAX:EAX:AX:AL:iin, kirjoita seuraava:

IN AL, [FFF0H]

Kirjoita käänteistä siirtoa varten seuraava:

OUT [FFF0H], AL

Joten yksittäisille tuotteille ohjeet ovat IN ja OUT. Portin osoite voidaan antaa myös RDX:EDX:DX-rekisterissä.

Merkkien siirto
Merkkijono voidaan siirtää muistista piirisarjaporttiin ja päinvastoin. Jos haluat siirtää merkkijonon portista osoitteessa FFF0H muistiin, aloita kohdasta C100H, kirjoita:

INS [ESI], [DX]

jolla on sama vaikutus kuin:

INS [EDI], [DX]

Ohjelmoijan tulee laittaa FFF0H:n kaksitavuinen porttiosoite RDX:EDX:Dx-rekisteriin ja C100H:n kaksitavuinen osoite RSI:ESI- tai RDI:EDI-rekisteriin. Tee käänteinen siirto seuraavasti:

INS [DX], [ESI]

jolla on sama vaikutus kuin:

INS [DX], [EDI]

6.37 Pino x64:ssä

Kuten 6502-prosessorissa, myös x64-prosessorissa on pino RAM-muistia. x64:n pino voi olla 2 16 = 65 536 tavua pitkä tai se voi olla 2 32 = 4 294 967 296 tavua pitkä. Se kasvaa myös alaspäin. Kun rekisterin sisältö työnnetään pinoon, RSP-pinoosoittimen numero pienenee 8:lla. Muista, että x64:n muistiosoite on 64 bittiä leveä. Pinoosoittimen arvo µP:ssä osoittaa seuraavaan paikkaan pinossa RAM-muistissa. Kun rekisterin sisältö (tai yhden operandin arvo) pomppataan pinosta rekisteriin, RSP-pinoosoittimen numeroa kasvatetaan 8:lla. Käyttöjärjestelmä päättää pinon koon ja RAM-muistissa sen alkamispaikan. ja kasvaa alaspäin. Muista, että pino on Last-In-First-Out (LIFO) -rakenne, joka tässä tapauksessa kasvaa alaspäin ja kutistuu ylöspäin.

Työntääksesi µP RBX -rekisterin sisällön pinoon, toimi seuraavasti:

PUSH RBX

Jos haluat siirtää pinon viimeisen merkinnän takaisin RBX:hen, toimi seuraavasti:

POP RBX

6.38 Menettely x64:ssä

x64:n aliohjelmaa kutsutaan 'menettelyksi'. Pinoa käytetään tässä enemmän kuin 6502 µP:ssä. x64-proseduurin syntaksi on:

proc_name:
menettelyn elin

oikein

Ennen kuin jatkat, huomaa, että x64-alirutiinin toimintakoodit ja nimet (yleensä kokoonpanokieliohjeet) eivät erota kirjainkoosta. Tämä on proc_name on sama kuin PROC_NAME. Kuten 6502, toimintosarjan nimen (etiketin) nimi alkaa uuden rivin alusta kokoonpanokielen tekstieditorissa. Tätä seuraa kaksoispiste eikä välilyöntiä ja opkoodia, kuten 6502:ssa. Alirutiinin runko päättyy RET:iin eikä RTS:ään, kuten 6502 µP:ssä. Kuten 6502:ssa, jokainen kehon käsky, mukaan lukien RET, ei ala rivinsä alusta. Huomaa, että tässä tunniste voi olla yli 8 merkkiä pitkä. Voit kutsua tämän menettelyn kirjoitetun toiminnon ylä- tai alapuolelta seuraavasti:

CALL prosessin_nimi

6502:ssa tarran nimi on vain tyyppi soittamista varten. Tässä kuitenkin kirjoitetaan varattu sana 'CALL' tai 'call', jota seuraa toimenpiteen nimi (alirutiini) välilyönnin jälkeen.

Menettelyjä käsiteltäessä on yleensä kaksi menettelyä. Yksi menettely kutsuu toista. Proseduuria, joka kutsuu (jolla on soittokäsky) kutsutaan 'soittajaksi', ja kutsuttavaa menettelyä kutsutaan 'soittajaksi'. On noudatettava sopimusta (sääntöjä).

Soittajan säännöt

Soittajan tulee noudattaa seuraavia sääntöjä kutsuessaan aliohjelmaa:

1. Ennen aliohjelman kutsumista soittajan tulee tallentaa tiettyjen soittajan tallentamien rekisterien sisältö pinottavaksi. Soittajan tallentamat rekisterit ovat R10, R11 ja kaikki rekisterit, joihin parametrit laitetaan (RDI, RSI, RDX, RCX, R8, R9). Jos näiden rekisterien sisältö halutaan säilyttää alirutiinikutsussa, työnnä ne pinoon sen sijaan, että tallennat sen RAM-muistiin. Nämä on tehtävä, koska kutsuttavan on käytettävä rekistereitä poistaakseen aiemman sisällön.

2. Jos toimenpide on esimerkiksi kahden numeron lisääminen, nämä kaksi numeroa ovat pinoon välitettävät parametrit. Siirtääksesi parametrit aliohjelmaan, laita niistä kuusi seuraaviin rekistereihin järjestyksessä: RDI, RSI, RDX, RCX, R8, R9. Jos aliohjelmassa on enemmän kuin kuusi parametria, työnnä loput pinoon käänteisessä järjestyksessä (eli viimeinen parametri ensin). Koska pino kasvaa, ensimmäinen ylimääräisistä parametreista (todella seitsemäs parametri) tallennetaan alimpaan osoitteeseen (tätä parametrien käänteistä käännöstä käytettiin historiallisesti sallimaan funktioiden (alirutiinien) välittäminen vaihtelevalla määrällä parametreja).

3. Kutsu aliohjelma (toimenpide) kutsuohjeiden avulla. Tämä ohje sijoittaa paluuosoitteen pinon parametrien päälle (alin paikka) ja aliohjelman koodin haaroihin.

4. Kun aliohjelma palaa (eli välittömästi kutsun käskyn jälkeen), soittajan on poistettava pinosta kaikki lisäparametrit (rekisteriin tallennetun kuuden lisäksi). Tämä palauttaa pinon tilaan ennen kutsua.

5. Soittaja voi odottaa löytävänsä aliohjelman palautusarvon (osoitteen) RAX-rekisteristä.

6. Soittaja palauttaa soittajan tallentamien rekisterien sisällön (R10, R11 ja kaikki parametrien välitysrekistereissä) poistamalla ne pinosta. Soittaja voi olettaa, että aliohjelma ei ole muokannut muita rekistereitä.

Johtuen kutsutavan rakenteesta, on tyypillisesti niin, että jotkin (tai useimmat) näistä vaiheista eivät tee mitään muutoksia pinoon. Jos parametreja on esimerkiksi kuusi tai vähemmän, pinoon ei työnnetä mitään tässä vaiheessa. Samoin ohjelmoijat (ja kääntäjät) pitävät tyypillisesti tulokset, joista he välittävät, poissa soittajan tallentamista rekistereistä vaiheissa 1 ja 6 välttääkseen ylimääräisiä työntöjä ja ponnahduksia.

On kaksi muuta tapaa siirtää parametrit aliohjelmaan, mutta niitä ei käsitellä tässä online-urakurssissa. Yksi niistä käyttää itse pinoa yleisten rekisterien sijaan.

Calleen säännöt

Kutsutun aliohjelman määritelmän tulee noudattaa seuraavia sääntöjä:

1. Varaa paikalliset muuttujat (muuttujat, jotka kehitetään proseduurissa) käyttämällä rekistereitä tai tekemällä pinoon tilaa. Muista, että pino kasvaa alaspäin. Jotta pinon päälle jää tilaa, pinon osoitinta tulee pienentää. Pinon osoittimen pienennyksen määrä riippuu tarvittavasta paikallismuuttujien määrästä. Jos esimerkiksi vaaditaan paikallinen float ja paikallinen pitkä (yhteensä 12 tavua), pinon osoitinta on pienennettävä 12:lla, jotta näille paikallisille muuttujille jää tilaa. Korkean tason kielessä, kuten C, tämä tarkoittaa muuttujien ilmoittamista ilman arvojen osoittamista (alustamista).

2. Seuraavaksi on tallennettava kaikkien funktion käyttämien rekisterien arvot, jotka ovat nimetyn kutsutun henkilön tallentamia (yleiskäyttörekisterit, joita soittaja ei ole tallentanut). Tallenna rekisterit työntämällä ne pinoon. Kutsutun henkilön tallentamat rekisterit ovat RBX, RBP ja R12 - R15 (puhelukäytäntö säilyttää myös RSP:n, mutta sitä ei tarvitse työntää pinossa tämän vaiheen aikana).

Kun nämä kolme toimintoa on suoritettu, aliohjelman varsinainen toiminta voi jatkua. Kun aliohjelma on valmis palaamaan, puhelukonventiosäännöt jatkuvat.

3. Kun aliohjelma on valmis, aliohjelman palautusarvo tulee sijoittaa RAX:iin, jos sitä ei vielä ole.

4. Alirutiinin on palautettava kaikkien muokattujen kutsutun henkilön tallennettujen rekisterien (RBX, RBP ja R12 - R15) vanhat arvot. Rekisterin sisältö palautetaan poistamalla ne pinosta. Huomaa, että rekisterit tulee avata käänteisessä järjestyksessä kuin ne työnnettiin.

5. Seuraavaksi puretaan paikalliset muuttujat. Helpoin tapa tehdä tämä on lisätä RSP:hen sama summa, joka vähennettiin siitä vaiheessa 1.

6. Lopuksi palaamme soittajan luo suorittamalla ret-käskyn. Tämä ohje etsii ja poistaa oikean palautusosoitteen pinosta.

Esimerkki soittajan aliohjelman rungosta toisen aliohjelman kutsumiseksi, joka on 'myFunc', on seuraava (lue kommentit):

; Haluatko kutsua funktiota ”myFunc”, joka kestää kolme
; kokonaislukuparametri. Ensimmäinen parametri on RAX:ssa.
; Toinen parametri on vakio 456. Kolmas
; parametri on muistipaikassa ”variabl”

push rdi ; rdi on parametri, joten se tallennetaan
; pitkä retVal = myFunc (x, 456, z);

mov rdi, rax; aseta ensimmäinen parametri RDI:hen
mov rsi, 456 ; laita toinen parametri RSI:hen
mov rdx , [muuttuja] ; laita kolmas parametri RDX:ään

soita myFunc ; kutsua funktiota

pop rdi ; palauta tallennettu RDI-arvo
; myFuncin palautusarvo on nyt saatavilla RAXissa

Esimerkki kutsuttavan funktiosta (myFunc) on (lue kommentit):

myFunc:
; ∗∗∗ Vakioalirutiinin prologi ∗∗∗
sub rsp, 8; tilaa 64-bittiselle paikalliselle muuttujalle (tulokselle) käyttämällä 'ali'-operaatiokoodia

paina rbx ; tallenna puhelun vastaanottaja - tallenna rekisterit
push rbp ; myFunc käyttää molempia

; ∗∗∗ Alarutiini Body ∗∗∗
mov rax, rdi; parametri 1 RAX:lle
mov rbp, rsi; parametri 2 RBP:lle
mov rbx, rdx; parametri 3 arvoon rb x
mov [rsp+16], rbx; laita rbx paikalliseen muuttujaan
lisää [rsp + 1 6], rbp; lisää rbp paikalliseen muuttujaan
mov rax , [ rsp +16 ] ; paikallisen muuttujan mov sisällön RAX:iin
; (palautusarvo/lopputulos)

; ∗∗∗ Vakioalirutiinin epilogi ∗∗∗
pop rbp ; palauttaa kutsutun henkilön tallennusrekisterit
pop rbx ; päinvastoin työnnettäessä
lisää rsp, 8; purkaa paikallinen muuttuja (muuttujia). 8 tarkoittaa 8 tavua
ret ; pop top arvo pinosta , hyppää sinne

6.39 Keskeytykset ja poikkeukset x64:lle

Prosessori tarjoaa kaksi mekanismia ohjelman suorittamisen keskeyttämiseen, keskeytyksiä ja poikkeuksia:

  • Keskeytys on asynkroninen (voi tapahtua milloin tahansa) tapahtuma, jonka tyypillisesti laukaisee I/O-laite.
  • Poikkeus on synkroninen tapahtuma (tapahtuu, kun koodi suoritetaan, esiohjelmoitu, perustuen johonkin tapahtumaan), joka syntyy, kun prosessori havaitsee yhden tai useamman ennalta määritetyn ehdon suorittaessaan käskyä. Kolme poikkeusluokkaa on määritelty: viat, traps ja keskeytykset.

Prosessori reagoi keskeytyksiin ja poikkeuksiin olennaisesti samalla tavalla. Kun keskeytyksestä tai poikkeuksesta ilmoitetaan, prosessori pysäyttää nykyisen ohjelman tai tehtävän suorittamisen ja siirtyy käsittelijäproseduuriin, joka on kirjoitettu erityisesti käsittelemään keskeytys- tai poikkeusehtoa. Prosessori käyttää käsittelijäproseduuria keskeytyskuvaustaulukon (IDT) merkinnän kautta. Kun käsittelijä on käsitellyt keskeytyksen tai poikkeuksen, ohjelman ohjaus palautetaan keskeytetylle ohjelmalle tai tehtävälle.

Käyttöjärjestelmä-, executive- ja/tai laiteajurit käsittelevät normaalisti keskeytykset ja poikkeukset sovellusohjelmista tai tehtävistä riippumatta. Sovellusohjelmat voivat kuitenkin päästä käsiksi käyttöjärjestelmään sisältyviin keskeytys- ja poikkeuskäsittelijöihin tai suorittaa sitä kokoonpanokielisten kutsujen kautta.

Kahdeksantoista (18) ennalta määritettyä keskeytystä ja poikkeusta, jotka liittyvät IDT:n merkintöihin, on määritelty. Kaksisataa kaksikymmentäneljä (224) käyttäjän määrittelemää keskeytystä voidaan myös tehdä ja liittää taulukkoon. Jokainen keskeytys ja poikkeus IDT:ssä tunnistetaan numerolla, jota kutsutaan 'vektoriksi'. Taulukossa 6.39.1 on lueteltu keskeytykset ja poikkeukset IDT:n merkinnöillä ja niitä vastaavilla vektoreilla. Vektorit 0 - 8, 10 - 14 ja 16 - 19 ovat ennalta määritettyjä keskeytyksiä ja poikkeuksia. Vektorit 32 - 255 ovat ohjelmiston määrittämiä keskeytyksiä (käyttäjä), jotka ovat joko ohjelmistokeskeytyksiä tai maskoitavia laitteistokeskeytyksiä.

Kun prosessori havaitsee keskeytyksen tai poikkeuksen, se tekee jonkin seuraavista:

  • Suorita implisiittinen kutsu käsittelijäproseduurille
  • Suorita implisiittinen kutsu käsittelijän tehtävään

6.4 64-bittisen ARM-tietokonearkkitehtuurin perusteet

ARM-arkkitehtuurit määrittelevät RISC-suorittimien perheen, jotka soveltuvat käytettäväksi monissa erilaisissa sovelluksissa. ARM on lataus/tallennusarkkitehtuuri, joka vaatii tietojen lataamisen muistista rekisteriin, ennen kuin sillä voidaan suorittaa mitään käsittelyä, kuten ALU (Aritmetic Logic Unit) -toimintoa. Seuraava ohje tallentaa tuloksen takaisin muistiin. Vaikka tämä saattaa tuntua askelta taaksepäin x86- ja x64-arkkitehtuureista, jotka toimivat suoraan muistissa olevilla operandeilla yhdellä käskyllä ​​(käyttäen tietysti prosessorirekistereitä), lataus/tallennus-lähestymistapa mahdollistaa käytännössä useita peräkkäisiä operaatioita. suoritetaan suurella nopeudella operandille, kun se on ladattu johonkin monista prosessorirekistereistä. ARM-prosessoreilla on mahdollisuus valita pieni tai suuri lopputulos. ARM 64:n oletusasetus on little-endian, joka on käyttöjärjestelmien yleisesti käyttämä kokoonpano. 64-bittinen ARM-arkkitehtuuri on moderni ja se on asetettu korvaamaan 32-bittinen ARM-arkkitehtuuri.

Huomautus : Jokainen 64-bittisen ARM µP:n käsky on 4 tavua (32 bittiä) pitkä.

6.41 64-bittinen ARM-rekisterisarja
64-bittisille ARM µP:lle on 31 yleiskäyttöistä 64-bittistä rekisteriä. Seuraava kaavio näyttää yleiskäyttöiset rekisterit ja joitain tärkeitä rekistereitä:


Kuva 4.11.1 64-bittinen yleiskäyttö ja joitakin tärkeitä rekistereitä

Yleiskäyttöisiä rekistereitä kutsutaan X0 - X30. Kunkin rekisterin ensimmäistä 32-bittistä osaa kutsutaan W0-W30:ksi. Kun 32 bitin ja 64 bitin eroa ei korosteta, käytetään 'R'-etuliitettä. Esimerkiksi R14 viittaa W14:ään tai X14:ään.

6502 µP:ssä on 16-bittinen ohjelmalaskuri ja se voi osoittaa 2 16 muistitavujen paikat. 64-bittisessä ARM µP:ssä on 64-bittinen ohjelmalaskuri ja se voi osoittaa jopa 2 64 = 1,844674407 x 1019 (itse asiassa 18 446 744 073 709 551 616) muistitavupaikkoja. Ohjelmalaskuri pitää sisällään seuraavan suoritettavan käskyn osoitteen. ARM64:n tai AArch64:n käskyn pituus on tyypillisesti neljä tavua. Prosessori lisää automaattisesti tätä rekisteriä neljällä, kun jokainen käsky on haettu muistista.

Stack Pointer -rekisteri tai SP ei ole 31 yleiskäyttöisen rekisterin joukossa. Minkä tahansa arkkitehtuurin pinoosoitin osoittaa viimeiseen muistin pinomerkintään. ARM-64:ssä pino kasvaa alaspäin.

6502 µP:ssä on 8-bittinen prosessorin tilarekisteri. Vastaavaa ARM64:ssä kutsutaan PSTATE-rekisteriksi. Tämä rekisteri tallentaa liput, joita käytetään toimintojen tulosten ja prosessorin ohjaamiseen (µP). Se on 32 bittiä leveä. Seuraavassa taulukossa on PSTATE-rekisterin yleisesti käytettyjen bittien nimet, indeksi ja merkitykset:

Taulukko 6.41.1
Eniten käytetyt PSTATE-liput (bitit)
Symboli Bitti Tarkoitus
M 0-3 Tila: Nykyinen suoritusoikeustaso (USR, SVC ja niin edelleen).
T 4 Peukalo: Se asetetaan, jos T32 (Thumb) -käskysarja on aktiivinen. Jos selvä, ARM-käskysarja on aktiivinen. Käyttäjäkoodi voi asettaa ja tyhjentää tämän bitin.
JA 9 Endianness: Tämän bitin asettaminen ottaa käyttöön big-endian-tilan. Jos selvä, pieni lopputila on aktiivinen. Oletus on little-endian-tila.
K 27 Kumulatiivinen kylläisyyslippu: Se asetetaan, jos jossain vaiheessa toimintosarjaa tapahtuu ylivuoto tai kyllästyminen
SISÄÄN 28 Ylivuotolippu: Se asetetaan, jos toiminto johti allekirjoittaneeseen ylivuotoon.
C 29 Kuljetuslippu: Se osoittaa, tuottiko yhteenlasku kuljetuksen vai vähennys lainan.
KANSSA 30 Nollalippu: Se asetetaan, jos operaation tulos on nolla.
N 31 Negatiivinen lippu: Se asetetaan, jos toiminnon tulos on negatiivinen.

ARM-64 µP:ssä on monia muita rekistereitä.

SIMD
SIMD tulee sanoista Single Instruction, Multiple Data. Tämä tarkoittaa, että yksi kokoonpanokielen käsky voi vaikuttaa useaan dataan samanaikaisesti yhdessä mikroprosessorissa. SIMD- ja liukulukuoperaatioita varten on 32 128 bitin levyistä rekisteriä.

6.42 Muistin kartoitus
RAM ja DRAM ovat molemmat Random Access -muisteja. DRAM toimii hitaammin kuin RAM. DRAM on halvempaa kuin RAM. Jos muistissa on yli 32 gigatavua (Gt) jatkuvaa DRAM-muistia, tulee lisää muistinhallintaongelmia: 32 Gt = 32 x 1024 x 1024 x 1024 tavua. Jos koko muistitila on paljon suurempi kuin 32 Gt, yli 32 Gt:n DRAM-muisti tulee olla välissä RAM-muistien kanssa paremman muistinhallinnan varmistamiseksi. Ymmärtääksesi ARM-64-muistikartan, sinun tulee ensin ymmärtää 32-bittisen ARM-keskusyksikön (CPU) 4 Gt:n muistikartta. CPU tarkoittaa µP. 32-bittiselle tietokoneelle osoitettavissa oleva muisti on enintään 2 32 = 4 x 2 10 x 2 10 x 2 10 = 4 x 1024 x 1024 x 1024 = 4 294 967 296 = 4 Gt.

32-bittinen ARM-muistikartta
32-bittisen ARM:n muistikartta on:

32-bittisessä tietokoneessa koko muistin enimmäiskoko on 4 Gt. 0 Gt:n osoitteesta 1 Gt:n osoitteeseen ovat ROM-käyttöjärjestelmä, RAM-muisti ja I/O-paikat. Koko ajatus ROM-käyttöjärjestelmästä, RAM-muistista ja I/O-osoitteista on samanlainen kuin Commodore-64:ssä mahdollisella 6502-suorittimella. Commodore-64:n käyttöjärjestelmän ROM on muistitilan yläpäässä. ROM-käyttöjärjestelmä tässä on paljon suurempi kuin Commodore-64, ja se on koko muistin osoiteavaruuden alussa. Muihin nykyaikaisiin tietokoneisiin verrattuna tässä ROM-käyttöjärjestelmä on täydellinen siinä mielessä, että se on verrattavissa niiden kiintolevyjen käyttöjärjestelmän määrään. On kaksi pääsyytä, miksi käyttöjärjestelmä on integroiduissa ROM-piireissä: 1) ARM-suorittimia käytetään enimmäkseen pienissä laitteissa, kuten älypuhelimissa. Monet kiintolevyt ovat suurempia kuin älypuhelimet ja muut pienet laitteet, 2) turvallisuuden vuoksi. Kun käyttöjärjestelmä on vain luku -muistissa, hakkerit eivät voi vioittaa sitä (osia ylikirjoittaa). RAM-osuudet ja tulo/lähtö-osuudet ovat myös erittäin suuria verrattuna Commodore-64:n vastaaviin.

Kun virta kytketään 32-bittiseen ROM-käyttöjärjestelmään, käyttöjärjestelmän on aloitettava (käynnistettävä) osoitteesta 0x00000000 tai 0xFFFF0000 osoitteesta, jos HiVEC on käytössä. Joten kun virta kytketään nollausvaiheen jälkeen, CPU-laitteisto lataa 0x00000000 tai 0xFFFF0000 ohjelmalaskuriin. '0x' etuliite tarkoittaa heksadesimaalilukua. 64-bittisten ARMv8-suorittimien käynnistysosoite on määritelty toteutus. Kirjoittaja kuitenkin neuvoo tietokoneinsinööriä aloittamaan 0x00000000 tai 0xFFFF0000 taaksepäin yhteensopivuuden vuoksi.

1 Gt - 2 Gt on yhdistetty tulo/lähtö. Yhdistetyn I/O:n ja vain I/O:n välillä on ero, joka löytyy 0 Gt ja 1 Gt välillä. I/O:ssa jokaisen portin osoite on kiinteä kuten Commodore-64:ssä. Yhdistetyssä I/O:ssa kunkin portin osoite ei välttämättä ole sama jokaiselle tietokoneen toiminnalle (dynaaminen).

2-4 Gt on DRAM-muistia. Tämä on odotettu (tai tavallinen) RAM. DRAM tarkoittaa dynaamista RAM:ia, ei sitä, että osoite muuttuu tietokoneen käytön aikana, vaan siinä mielessä, että fyysisen RAM:n jokaisen solun arvo on päivitettävä jokaisella kellopulssilla.

Huomautus :

  • 0x0000 0000 - 0x0000 FFFF on käyttöjärjestelmän ROM.
  • 0x0001 0000:sta 0x3FFF,FFFF:ään voi olla enemmän ROM-muistia, sitten RAM-muistia ja sitten vähän I/O:ta.
  • 0x4000 0000 - 0x7FFF,FFFF ylimääräinen I/O ja/tai yhdistetty I/O on sallittu.
  • 0x8000 0000 - 0xFFFF, FFFF on odotettu DRAM.

Nämä tarkoittavat sitä, että odotetun DRAM:n ei tarvitse käytännössä alkaa 2 Gt:n muistin rajalta. Miksi ohjelmoijan pitäisi kunnioittaa ihanteellisia rajoja, kun fyysisiä RAM-pankkeja ei ole riittävästi emolevylle? Tämä johtuu siitä, että asiakkaalla ei ole tarpeeksi rahaa kaikkiin RAM-pankkeihin.

36-bittinen ARM-muistikartta
64-bittisessä ARM-tietokoneessa kaikkia 32 bittiä käytetään koko muistin osoittamiseen. 64-bittisessä ARM-tietokoneessa ensimmäisiä 36 bittiä voidaan käyttää osoittamaan koko muisti, joka tässä tapauksessa on 2 36 = 68 719 476 736 = 64 Gt. Tästä on jo paljon muistia. Tavalliset tietokoneet eivät nykyään tarvitse tätä määrää muistia. Tämä ei vielä ylitä 64 bitin käytettävissä olevan muistin enimmäisaluetta. ARM-suorittimen 36-bitin muistikartta on:

0 Gt:n osoitteesta 4 Gt:n osoitteeseen on 32-bittinen muistikartta. 'Varattu' tarkoittaa, että sitä ei käytetä ja säilytetään tulevaa käyttöä varten. Sen ei tarvitse olla fyysisiä muistipankkeja, jotka on sijoitettu emolevyyn tätä tilaa varten. Tässä DRAM:lla ja yhdistetyllä I/O:lla on samat merkitykset kuin 32-bittisellä muistikartalla.

Käytännössä voi havaita seuraavanlaisen tilanteen:

  • 0x1 0000 0000 – 0x3 FFFF FFFF; varattu. 12 Gt osoitetilaa on varattu tulevaa käyttöä varten.
  • 0x4 0000 0000 – 0x7 FFFF FFFF; kartoitettu I/O. 16 Gt osoitetilaa on käytettävissä dynaamisesti kartoitettua I/O:ta varten.
  • 0x8 0000 0000 – 0x8 7FFF FFFF FFFF; Hole tai DRAM. 2 Gt osoitetilaa voi sisältää jommankumman seuraavista:
    • Reikä DRAM-laitteen osioinnin mahdollistamiseksi (kuten kuvataan seuraavassa keskustelussa).
    • DRAM.
  • 0x8 8000 0000 – 0xF FFFF FFFF; DRAM. 30 Gt osoitetilaa DRAM-muistille.

Tämä muistikartta on 32-bittisen osoitekartan superjoukko, jossa lisätila on jaettu 50 % DRAMiksi (1/2), jossa on valinnainen reikä ja 25 % kartoitettu I/O-tila ja varattu tila (1/4). ). Loput 25 % (1/4) on 32-bittiselle muistikartalle ½ + ¼ + ¼ = 1.

Huomautus : 32 bitistä 360 bittiin on 4 bitin lisäys 36 bitin merkittävimpään puoleen.

40-bittinen muistikartta
40-bittinen osoitekartta on 36-bittisen osoitekartan superjoukko ja noudattaa samaa kaavaa, jossa 50 % DRAM:sta on valinnaisesta reiästä, 25 % on kartoitettu I/O-tila ja varattu tila sekä loput 25 %:sta. tilaa edelliselle muistikartalle (36-bittinen). Muistikartan kaavio on:

Reiän koko on 544 – 512 = 32GB. Käytännössä voi havaita seuraavanlaisen tilanteen:

  • 0x10 0000 0000 – 0x3F FFFF FFFF; varattu. 192 Gt osoitetilaa on varattu tulevaa käyttöä varten.
  • 0x40 0000 0000 – 0x7F FFFF FFFF; kartoitettu. I/O 256 Gt osoitetilaa on käytettävissä dynaamisesti kartoitettua I/O:ta varten.
  • 0x80 0000 0000 – 0x87 FFFF FFFF; reikä tai DRAM. 32 Gt osoiteavaruudessa voi olla jompikumpi seuraavista:
    • Reikä DRAM-laitteen osioinnin mahdollistamiseksi (kuten kuvataan seuraavassa keskustelussa)
    • DRAM
  • 0x88 0000 0000 – 0xFF FFFF FFFF; DRAM. 480 Gt osoitetilaa DRAM-muistille.

Huomautus : 36 bitistä 40 bittiin on 4 bitin lisäys 36 bitin merkittävimpään puoleen.

DRAM-aukko
32-bittisessä muistikartassa se on joko DRAM-aukko tai DRAMin jatko ylhäältä. Kun se on reikä, se on arvostettava seuraavasti: DRAM-aukko tarjoaa tavan osioida suuri DRAM-laite useisiin osoitealueisiin. Valinnainen DRAM-aukko ehdotetaan korkeamman DRAM-osoiterajan alussa. Tämä mahdollistaa yksinkertaistetun dekoodausmenetelmän, kun suurikapasiteettinen DRAM-laite osioidaan alemmalla fyysisesti osoitetulla alueella.

Esimerkiksi 64 Gt:n DRAM-osa on jaettu kolmeen alueeseen, joissa osoitepoikkeamat suoritetaan yksinkertaisella vähennyksellä korkean kertaluvun osoitebiteissa seuraavasti:

Taulukko 6.42.1
Esimerkki 64 Gt:n DRAM-osioinnista reikien kanssa
Fyysiset osoitteet SoC:ssa Offset Sisäinen DRAM-osoite
2 Gt (32-bittinen kartta) 0x00 8000 0000 – 0x00 FFFF FFFF -0x00 8000 0000 0x00 0000 0000 – 0x00 7FFF FFF
30 Gt (36-bittinen kartta) 0x08 8000 0000 – 0x0F FFFF FFFF -0x08 0000 0000 0x00 8000 0000 – 0x07 FFFF FFFF
32 Gt (40-bittinen kartta) 0x88 0000 0000 – 0x8F FFFF FFFF -0x80 0000 0000 0x08 0000 0000 – 0x0F FFFF FFFF

Ehdotetut 44-bittiset ja 48-bittiset osoitetut muistikartat ARM-suorittimille
Oletetaan, että henkilökohtaisessa tietokoneessa on 1024 Gt (= 1 Tt) muistia; se on liikaa muistia. Niinpä 44-bittiset ja 48-bittiset osoitteelliset muistikartat ARM-suorittimille 16 Tt:lle ja 256 Tt:lle ovat vain ehdotuksia tulevia tietokonetarpeita varten. Itse asiassa nämä ARM-suorittimia koskevat ehdotukset noudattavat samaa muistin jakoa suhteiden mukaan kuin aiemmat muistikartat. Eli: 50 % DRAM-muistia, jossa on valinnainen reikä, 25 % kartoitettua I/O-tilaa ja varattua tilaa ja loput 25 % tilasta edelliselle muistikartalle.

52-bittisiä, 56-bittisiä, 60-bittisiä ja 64-bittisiä osoitettuja muistikarttoja on vielä ehdotettava ARM 64 -bitille pitkälle tulevaisuudelle. Jos tiedemiehet vielä tuolloin pitävät koko muistitilan 50 : 25 : 25 osiointia hyödyllisenä, he säilyttävät suhteen.

Huomautus : SoC tarkoittaa System-on-Chipiä, joka viittaa µP-sirun piireihin, joita ei muuten olisi ollut.

SRAM tai Static Random Access Memory on nopeampi kuin perinteisempi DRAM, mutta vaatii enemmän piialuetta. SRAM ei vaadi päivittämistä. Lukija voi kuvitella RAM-muistin SRAM-muistiksi.

6.43 Assembly Language -osoitustilat ARM 64:lle
ARM on lataus/tallennusarkkitehtuuri, joka vaatii tietojen lataamisen muistista prosessorirekisteriin, ennen kuin sillä voidaan suorittaa mitään käsittelyä, kuten aritmeettista logiikkaa. Seuraava ohje tallentaa tuloksen takaisin muistiin. Vaikka tämä saattaa tuntua askelta taaksepäin x86:sta ja sen myöhemmistä x64-arkkitehtuureista, jotka toimivat suoraan muistissa oleville operandeille yhdellä käskyllä, käytännössä load/store -lähestymistapa mahdollistaa useiden peräkkäisten toimintojen suorittamisen suurella nopeudella. operandi, kun se on ladattu yhteen monista prosessorirekistereistä.

ARM-kokoonpanokielen muodossa on yhtäläisyyksiä ja eroja x64 (x86) -sarjan kanssa.

  • Offset : Etumerkillinen vakio voidaan lisätä perusrekisteriin. Poikkeama kirjoitetaan osana ohjetta. Esimerkki: ldr x0, [rx, #10] lataa r0:n sanalla r1+10-osoitteessa.
  • Rekisteröidy : Rekisteriin tallennettu etumerkitön lisäys voidaan lisätä perusrekisterin arvoon tai vähentää siitä. Esimerkki: ldr r0, [x1, x2] lataa r0:n sanalla x1+x2-osoitteessa. Kumpaakin rekistereistä voidaan pitää perusrekisterinä.
  • Skaalattu rekisteri : Rekisterin lisäystä siirretään vasemmalle tai oikealle tietyllä määrällä bittipaikkoja, ennen kuin se lisätään perusrekisterin arvoon tai vähennetään siitä. Esimerkki: ldr x0, [x1, x2, lsl #3] lataa r0:n sanalla r1+(r2×8)-osoitteessa. Siirto voi olla looginen siirto vasemmalle tai oikealle (lsl tai lsr), joka lisää nollabittiä tyhjiin bittipaikkoihin tai aritmeettinen siirto oikealle (asr), joka replikoi etumerkkibitin vapautuneissa paikoissa.

Kun mukana on kaksi operandia, kohde tulee ennen (vasemmalla) lähdettä (joitakin poikkeuksia on). ARM-kokoonpanokielen toimintakoodit eivät erota kirjainkoosta.

Välitön ARM64-osoitetila
Esimerkki:

mov r0, #0xFF000000 ; Lataa 32-bittinen arvo FF000000h kohtaan r0

Desimaaliarvo on ilman 0x, mutta sitä edeltää silti #.

Rekisteröidy suoraan
Esimerkki:

mov x0, x1 ; Kopioi x1 x0:ksi

Rekisteröidy epäsuora
Esimerkki:

str x0, [x3] ; Tallenna x0 x3:n osoitteeseen

Rekisteröi epäsuora offsetilla
Esimerkkejä:

ldr x0, [x1, #32] ; Lataa r0 arvolla osoitteessa [r1+32]; r1 on perusrekisteri
str x0, [x1, #4] ; Tallenna r0 osoitteeseen [r1+4]; r1 on perusrekisteri; numerot ovat kantaluku 10

Rekisteröi epäsuora siirtymällä (esim. lisätty)
Esimerkkejä:

ldr x0, [x1, #32]! ; Lataa r0 [r1+32]:lla ja päivitä r1 arvoon (r1+32)
str x0, [x1, #4]! ; Tallenna r0 arvoon [r1+4] ja päivitä r1 muotoon (r1+4)

Huomaa '!' symboli.

Rekisteröi epäsuora siirtymällä (jälkilisätty)
Esimerkkejä:

ldr x0, [x1], #32 ; Lataa [x1] arvoon x0 ja päivitä sitten x1 arvoon (x1+32)
str x0, [x1], #4; Tallenna x0 arvoon [x1] ja päivitä sitten x1 arvoon (x1+4)

Double Register Epäsuora
Operandin osoite on perusrekisterin ja inkrementtirekisterin summa. Rekisterin nimet on ympäröity hakasulkeilla.
Esimerkkejä:

ldr x0, [x1, x2] ; Lataa x0 [x1+x2]:lla
str x0, [rx, x2] ; Tallenna x0 - [x1+x2]

Suhteellinen osoitetila
Suhteellisessa osoitetilassa tehokas käsky on ohjelmalaskurin seuraava käsky plus indeksi. Indeksi voi olla positiivinen tai negatiivinen.
Esimerkki:

ldr x0, [pc, #24]

Tämä tarkoittaa kuormarekisteriä X0, jossa on sana, johon PC-sisältö osoittaa plus 24.

6.44 Joitakin yleisesti käytettyjä ohjeita ARM 64:lle
Tässä ovat yleisesti käytetyt ohjeet:

6.45 Silmukka

Kuva
Seuraava koodi jatkaa X10-rekisterin arvon lisäämistä X9:n arvoon, kunnes X8:n arvo on nolla. Oletetaan, että kaikki arvot ovat kokonaislukuja. X8:n arvo vähennetään 1:llä jokaisessa iteraatiossa:

silmukka:
CBZ X8, ohita
ADD X9, X9, X10 ; ensimmäinen X9 on kohde ja toinen X9 on lähde
SUB X8, X8, #1 ; ensimmäinen X8 on kohde ja toinen X8 on lähde
B silmukka
ohita:

Kuten 6502 µP:ssä ja X64 µP:ssä, ARM 64 µP:n leima alkaa rivin alusta. Loput ohjeet alkavat joistakin välilyönneistä rivin alun jälkeen. x64:ssä ja ARM 64:ssä tarraa seuraa kaksoispiste ja uusi rivi. Kun käytössä on 6502, tarraa seuraa ohje välilyönnin jälkeen. Edellisessä koodissa ensimmäinen käsky, joka on 'CBZ X8, ohita' tarkoittaa, että jos X8:n arvo on nolla, jatka 'skip:'-tarrasta ohittaen välissä olevat ohjeet ja jatkamalla alla olevilla muilla ohjeilla. 'ohita:'. 'B-silmukka' on ehdoton hyppy 'silmukka' -tunnisteeseen. Mitä tahansa muuta nimikkeen nimeä voidaan käyttää 'silmukan' sijasta.

Joten, kuten 6502 µP:n kanssa, käytä haaraohjeita luodaksesi silmukan ARM 64:n kanssa.

6.46 ARM 64 tulo/lähtö
Kaikki ARM-oheislaitteet (sisäiset portit) on muistikartoitettu. Tämä tarkoittaa, että ohjelmointirajapinta on joukko muistiin osoitettuja rekistereitä (sisäisiä portteja). Tällaisen rekisterin osoite on poikkeama tietystä muistin perusosoitteesta. Tämä on samanlainen kuin kuinka 6502 tekee tulon/lähdön. ARM:lla ei ole vaihtoehtoa erilliselle I/O-osoiteavaruudelle.

6.47 ARM 64 pino
ARM 64:ssä on pino muistissa (RAM) samalla tavalla kuin 6502:ssa ja x64:ssä. ARM64:ssä ei kuitenkaan ole push- tai pop-opcodea. Myös ARM 64:n pino kasvaa alaspäin. Pinon osoittimen osoite osoittaa juuri pinoon sijoitetun viimeisen arvon viimeisen tavun jälkeen.

Syy siihen, miksi ARM64:lle ei ole yleistä pop- tai push-operaatiokoodia, on se, että ARM 64 hallitsee pinoaan 16 peräkkäisen tavun ryhmissä. Arvot ovat kuitenkin yhden tavun, kahden tavun, neljän tavun ja 8 tavun tavuryhmissä. Joten yksi arvo voidaan sijoittaa pinoon, ja loput paikat (tavupaikat), jotka muodostavat 16 tavua, täytetään valetavuilla. Tämän haittapuolena on muistin tuhlaaminen. Parempi ratkaisu on täyttää 16-tavuinen sijainti pienemmillä arvoilla ja ohjelmoijan kirjoittama koodi, joka seuraa, mistä 16-tavuisen sijainnin arvot tulevat (rekisterit). Tätä ylimääräistä koodia tarvitaan myös arvojen takaisinvetämiseen. Vaihtoehtona tälle on täyttää kaksi 8-tavuista yleiskäyttöistä rekisteriä eri arvoilla ja lähettää sitten kahden 8-tavuisen rekisterin sisältö pinoon. Tässä tarvitaan edelleen ylimääräistä koodia tiettyjen pienten arvojen seuraamiseksi, jotka menevät pinoon ja poistuvat pinosta.

Seuraava koodi tallentaa neljä 4-tavuista dataa pinoon:

str w0, [sp, #-4]!
str w1, [sp, #-8]!
str w2, [sp, #-12]!
str w3, [sp, #-16]!

Ensimmäiset neljä tavua (w) rekistereistä – x0, x1, x2 ja x3 – lähetetään 16 peräkkäisen tavun paikkoihin pinossa. Huomaa 'str' ​​eikä 'push' käyttö. Huomaa jokaisen ohjeen lopussa oleva huutomerkki. Koska muistipino kasvaa alaspäin, ensimmäinen neljän tavun arvo alkaa kohdasta, joka on miinus neljä tavua edellisen pinon osoittimen paikan alapuolella. Loput neljän tavun arvot seuraavat ja laskevat. Seuraava koodisegmentti tekee oikean (ja järjestyksessä) vastaavan neljän tavun avaamista:

ldr w3, [sp], #0
ldr w2, [sp], #4
ldr w1, [sp], #8
ldr w0, [sp], #12

Huomaa ldr-operaatiokoodin käyttö popin sijaan. Huomaa myös, että huutomerkkiä ei käytetä tässä.

Kaikki X0 (8 tavua) ja X1 (8 tavua) tavut voidaan lähettää pinon 16 tavun sijaintiin seuraavasti:

stp x0, x1, [sp, #-16]! ; 8 + 8 = 16

Tässä tapauksessa x2 (w2) ja x3 (w3) rekistereitä ei tarvita. Kaikki halutut tavut ovat X0- ja X2-rekistereissä. Huomaa stp-operaatiokoodi rekisterisisällön parien tallentamiseksi RAM-muistiin. Huomaa myös huutomerkki. Pop-vastine on:

ldp x0, x1, [sp], #0

Tässä ohjeessa ei ole huutomerkkiä. Huomaa operaatiokoodi LDP LDR:n sijaan kahden peräkkäisen datapaikan lataamiseksi muistista kahteen µP-rekisteriin. Muista myös, että kopiointi muistista µP-rekisteriin lataa, eikä sitä pidä sekoittaa tiedoston lataamiseen levyltä RAM-muistiin, ja kopiointi µP-rekisteristä RAM-muistiin on tallennusta.

6.48 Aliohjelma
Aliohjelma on koodilohko, joka suorittaa tehtävän valinnaisesti joidenkin argumenttien perusteella ja palauttaa valinnaisesti tuloksen. Sopimuksen mukaan R0-R3-rekistereitä (neljä rekisteriä) käytetään argumenttien (parametrien) välittämiseen aliohjelmalle, ja R0:aa käytetään tulosten välittämiseen takaisin kutsujalle. Aliohjelma, joka tarvitsee enemmän kuin 4 tuloa, käyttää pinoa lisätuloille. Voit kutsua aliohjelman käyttämällä linkkiä tai ehdollista haaraohjetta. Linkkiohjeen syntaksi on:

BL-merkki

Missä BL on toimintakoodi ja nimike edustaa aliohjelman aloitusta (osoitetta). Tämä haara on ehdoton, eteenpäin tai taaksepäin 128 megatavun sisällä. Ehdollisen haarakäskyn syntaksi on:

B.cond etiketti

Missä cond on ehto, esim. eq (sama) tai ne (ei yhtä suuri). Seuraavassa ohjelmassa on doadd-aliohjelma, joka lisää kahden argumentin arvot ja palauttaa tuloksen muodossa R0:

AREA-aliliittymä, KOODI, LUKU ; Nimeä tämä koodilohko
SISÄÄNPÄÄSY ; Merkitse ensimmäinen suoritettava käsky
käynnistä MOV r0, #10 ; Aseta parametrit
MOV r1, #3
BL doadd ; Kutsu aliohjelma
stop MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SVC #0x123456 ; ARM semihosting (aiemmin SWI)
doadd ADD r0, r0, r1 ; Aliohjelman koodi
BX lr; Paluu aliohjelmasta
;
LOPPU ; Merkitse tiedoston loppu

Lisättävät luvut ovat desimaaliluku 10 ja desimaali 3. Tämän koodilohkon (ohjelman) kaksi ensimmäistä riviä selitetään myöhemmin. Seuraavat kolme riviä lähettävät 10 R0-rekisteriin ja 3 R1-rekisteriin ja kutsuvat myös doadd-alirutiinia. 'doadd' on etiketti, joka sisältää aliohjelman alun osoitteen.

Aliohjelma koostuu vain kahdesta rivistä. Ensimmäinen rivi lisää R:n sisällön 3 R0:n sisältöön 10, mikä sallii tuloksen 13 R0:ssa. Toinen rivi, jossa on BX-operandi ja LR-operandi, palaa alirutiinista soittajan koodiin.

OIKEIN
ARM 64:n RET-operaatiokoodi käsittelee edelleen aliohjelmaa, mutta toimii eri tavalla kuin RTS 6502:ssa tai RET x64:ssä tai 'BX LR' -yhdistelmä ARM 64:ssä. ARM 64:ssä RET:n syntaksi on:

SUORA {Xn}

Tämä käsky antaa ohjelmalle mahdollisuuden jatkaa aliohjelmalla, joka ei ole kutsujan aliohjelma, tai vain jatkaa jollain muulla käskyllä ​​ja sitä seuraavalla koodisegmentillä. Xn on yleiskäyttöinen rekisteri, jossa on osoite, johon ohjelman tulisi jatkua. Tämä ohje haarautuu ehdoitta. Sen oletusarvo on X30, jos Xn:ää ei ole annettu.

Proseduuripuhelustandardi
Jos ohjelmoija haluaa hänen koodinsa olevan vuorovaikutuksessa jonkun muun kirjoittaman tai kääntäjän tuottaman koodin kanssa, ohjelmoijan tulee sopia henkilön tai kääntäjän kanssa rekisterin käyttöä koskevista säännöistä. ARM-arkkitehtuurissa näitä sääntöjä kutsutaan Procedure Call Standardiksi tai PCS:ksi. Nämä ovat kahden tai kolmen osapuolen välisiä sopimuksia. PCS määrittelee seuraavat asiat:

  • Mitä µP-rekistereitä käytetään argumenttien välittämiseen funktioon (alirutiiniin)
  • Mitä µP-rekistereitä käytetään palauttamaan tulos kutsun suorittavalle funktiolle, jota kutsutaan kutsujaksi
  • Mikä µP rekisteröi kutsuttavan toiminnon, joka tunnetaan nimellä kutsuttava, voi korruptoitua
  • Kumpi µP rekisteröi kutsun, ei voi korruptoitua

6.49 Keskeytykset
ARM-prosessorille on saatavana kahden tyyppisiä keskeytysohjainpiirejä:

  • Vakiokeskeytysohjain: Keskeytyskäsittelijä määrittää huoltoa vaativan laitteen lukemalla laitteen bittikarttarekisterin keskeytysohjaimessa.
  • Vector Interrupt Controller (VIC): Priorisoi keskeytykset ja yksinkertaistaa keskeytyksen aiheuttaneen laitteen määrittämistä. Kun jokaiseen keskeytykseen on liitetty prioriteetti ja käsittelijän osoite, VIC antaa keskeytyssignaalin prosessorille vain, jos uuden keskeytyksen prioriteetti on korkeampi kuin sillä hetkellä suoritettavan keskeytyksen käsittelijän.

Huomautus : Poikkeus viittaa virheeseen. 32-bittisen ARM-tietokoneen vektorikeskeytysohjaimen tiedot ovat seuraavat (64-bittinen on samanlainen):

Taulukko 6.49.1
ARM-vektoripoikkeus/keskeytys 32-bittiselle tietokoneelle
Poikkeus/keskeytys Lyhyt käsi Osoite Korkea osoite
Nollaa RESET 0x00000000 0xffff0000
Määrittelemätön ohje UNDEF 0x00000004 0xffff0004
Ohjelmiston keskeytys SWI 0x00000008 0xffff0008
Esihaku keskeytys pabt 0x0000000C 0xffff000C
Abortin päivämäärä DABT 0x00000010 0xffff0010
Varattu 0x00000014 0xffff0014
Keskeytyspyyntö IRQ 0x00000018 0xffff0018
Nopea keskeytyspyyntö FIQ 0x0000001C 0xffff001C

Tämä näyttää järjestelyltä 6502-arkkitehtuurin osalta NMI , BR , ja IRQ voi olla osoittimia sivulla nolla, ja vastaavat rutiinit ovat korkealla muistissa (ROM OS). Lyhyet kuvaukset edellisen taulukon riveistä ovat seuraavat:

RESET
Tämä tapahtuu, kun prosessori käynnistyy. Se alustaa järjestelmän ja asettaa pinot eri prosessoritiloja varten. Se on korkeimman prioriteetin poikkeus. Nollauskäsittelijään saapuessaan CPSR on SVC-tilassa ja sekä IRQ- että FIQ-bitit asetetaan arvoon 1, mikä peittää mahdolliset keskeytykset.

ABOTTIPÄIVÄMÄÄRÄ
Toiseksi korkein prioriteetti. Näin tapahtuu, kun yritämme lukea/kirjoittaa virheelliseen osoitteeseen tai käyttää väärää käyttöoikeutta. Data Abort Handleriin tullessa IRQ:t poistetaan käytöstä (I-bittisarja 1) ja FIQ otetaan käyttöön. IRQ:t on peitetty, mutta FIQ:t pidetään paljastamattomina.

FIQ
Korkeimman prioriteetin keskeytys, IRQ ja FIQ, ovat poissa käytöstä, kunnes FIQ on käsitelty.

IRQ
Korkean prioriteetin keskeytys, IRQ-käsittelijä, syötetään vain, jos ei ole meneillään olevaa FIQ- ja datakeskeytystä.

Esihaku Keskeytä
Tämä on samanlainen kuin tietojen keskeyttäminen, mutta tapahtuu osoitteen noudon epäonnistuessa. Käsittelijään tullessa IRQ:t poistetaan käytöstä, mutta FIQ:t pysyvät käytössä ja voivat tapahtua esihaun keskeytyksen aikana.

SWI
Software Interrupt (SWI) -poikkeus tapahtuu, kun SWI-käsky suoritetaan eikä muita korkeamman prioriteetin poikkeuksia ole merkitty.

Määrittelemätön ohje
Määrittämättömän käskyn poikkeus tapahtuu, kun käsky, joka ei ole ARM- tai Thumb-käskyjoukossa, saavuttaa liukuhihnan suoritusvaiheen, eikä muita poikkeuksia ole merkitty lipuksi. Tämä on sama prioriteetti kuin SWI, koska se voi tapahtua kerrallaan. Tämä tarkoittaa, että suoritettava käsky ei voi olla samanaikaisesti sekä SWI-käsky että määrittelemätön käsky.

ARM poikkeuskäsittely
Seuraavat tapahtumat tapahtuvat, kun tapahtuu poikkeus:

  • Tallenna CPSR poikkeustilan SPSR:ään.
  • PC on tallennettu poikkeustilan LR:ään.
  • Linkkirekisteri asetetaan tiettyyn osoitteeseen nykyisen käskyn perusteella. Esimerkiksi: ISR:lle LR = viimeksi suoritettu käsky + 8.
  • Päivitä CPSR poikkeuksesta.
  • Aseta tietokone poikkeuskäsittelijän osoitteeseen.

6.5 Ohjeet ja tiedot

Data viittaa muuttujiin (tunnisteisiin niiden arvoineen) ja taulukoihin ja muihin rakenteita, jotka ovat samanlaisia ​​kuin taulukko. Merkkijono on kuin joukko merkkejä. Joukko kokonaislukuja on nähtävissä yhdessä edellisistä luvuista. Ohjeet viittaavat opkoodeihin ja niiden operandeihin. Ohjelma voidaan kirjoittaa siten, että operaatiokoodit ja tiedot on sekoitettu yhteen muistin jatko-osaan. Tällä lähestymistavalla on haittoja, mutta sitä ei suositella.

Ohjelma tulee kirjoittaa ohjeilla ensin ja sitten datalla (datumin monikko on data). Ohjeiden ja tietojen välinen ero voi olla vain muutama tavu. Ohjelmassa sekä ohjeet että tiedot voivat olla muistissa yhdessä tai kahdessa erillisessä osiossa.

6.6 Harvardin arkkitehtuuri

Yksi varhaisista tietokoneista on nimeltään Harvard Mark I (1944). Tiukka Harvard-arkkitehtuuri käyttää yhtä osoiteavaruutta ohjelmaohjeille ja erillistä osoiteavaruutta datalle. Tämä tarkoittaa, että on kaksi erillistä muistia. Seuraavassa näkyy arkkitehtuuri:


Kuva 6.71 Harvardin arkkitehtuuri

Ohjausyksikkö purkaa käskyt. Arithmetic Logic Unit (ALU) tekee aritmeettiset operaatiot yhdistelmälogiikalla (portit). ALU tekee myös loogiset toiminnot (esim.

6502-mikroprosessorilla käsky menee ensin mikroprosessorille (ohjausyksikkö), ennen kuin datam (tiedon yksikkö) menee µP-rekisteriin, ennen kuin ne ovat vuorovaikutuksessa. Tämä vaatii vähintään kaksi kellopulssia, eikä se ole samanaikainen pääsy käskyyn ja datamiin. Toisaalta Harvardin arkkitehtuuri tarjoaa samanaikaisen pääsyn ohjeisiin ja tietoihin, jolloin sekä käsky että data saapuvat µP:hen samanaikaisesti (opcode ohjausyksikköön ja datum µP-rekisteriin), mikä säästää vähintään yhden kellopulssin. Tämä on eräänlainen rinnakkaisuuden muoto. Tätä rinnakkaisuuden muotoa käytetään nykyaikaisten emolevyjen laitteistovälimuistissa (katso seuraava keskustelu).

6.7 Välimuisti

Välimuisti (RAM) on nopea muistialue (verrattuna päämuistin nopeuteen), joka tallentaa tilapäisesti ohjelmaohjeet tai tiedot tulevaa käyttöä varten. Välimuisti toimii nopeammin kuin päämuisti. Yleensä nämä ohjeet tai tietokohteet haetaan viimeaikaisesta päämuistista ja niitä tarvitaan todennäköisesti uudelleen pian. Välimuistin ensisijainen tarkoitus on nopeuttaa toistuvaa pääsyä samoihin päämuistipaikkoihin. Jotta välimuistissa olevien kohteiden käyttö olisi tehokasta, sen on oltava huomattavasti nopeampaa kuin ohjeiden tai tietojen alkuperäisen lähteen, jota kutsutaan Backing Storeksi, käyttö.

Kun välimuisti on käytössä, jokainen yritys päästä päämuistipaikkaan alkaa välimuistin haulla. Jos pyydetty kohde on olemassa, prosessori hakee ja käyttää sen välittömästi. Tätä kutsutaan välimuistiosumaksi. Jos välimuistihaku epäonnistuu (välimuisti puuttuu), käsky tai tieto on haettava taustamuistista (päämuistista). Pyydetyn kohteen noudon yhteydessä välimuistiin lisätään kopio odotettavissa olevaa lähitulevaisuutta varten.

Muistinhallintayksikkö
Muistinhallintayksikkö (MMU) on piiri, joka hallitsee emolevyn päämuistia ja siihen liittyviä muistirekistereitä. Aiemmin se oli erillinen integroitu piiri emolevyllä; mutta nykyään se on tyypillisesti osa mikroprosessoria. MMU:n tulisi myös hallita välimuistia (piiriä), joka on myös osa mikroprosessoria nykyään. Välimuistipiiri on aiemmin ollut erillinen integroitu piiri.

Staattinen RAM
Staattisella RAM:lla (SRAM) on huomattavasti nopeampi pääsyaika kuin DRAM:illa, vaikkakin huomattavasti monimutkaisempien piirien kustannuksella. SRAM-bittisolut vievät paljon enemmän tilaa integroidussa piirilevyssä kuin DRAM-laitteen solut, joka pystyy tallentamaan vastaavan määrän dataa. Päämuisti (RAM) koostuu tyypillisesti DRAM:ista (Dynamic RAM).

Välimuisti parantaa tietokoneen suorituskykyä, koska monet käyttöjärjestelmien ja sovellusten suorittamat algoritmit osoittavat viitepaikan. Viitepaikka viittaa äskettäin käsiteltyjen tietojen uudelleenkäyttöön. Tätä kutsutaan Temporal Locality. Nykyaikaisella emolevyllä välimuisti on samassa integroidussa piirissä kuin mikroprosessori. Päämuisti (DRAM) on kaukana ja siihen pääsee bussien kautta. Viitepaikalla tarkoitetaan myös spatiaalista sijaintia. Paikallinen sijainti liittyy fyysisen läheisyyden vuoksi nopeampaan tiedonsaantiin.

Pääsääntöisesti välimuistin alueet ovat pieniä (tavupaikkojen lukumäärässä) taustamuistiin (päämuistiin) verrattuna. Välimuistilaitteet on suunniteltu maksimaaliseen nopeuteen, mikä tarkoittaa yleensä, että ne ovat monimutkaisempia ja bittikohtaisesti kalliimpia kuin taustavarastossa käytettävä tiedontallennustekniikka. Rajoitetun koonsa vuoksi välimuistilaitteet täyttyvät nopeasti. Jos välimuistissa ei ole vapaata sijaintia uuden merkinnän tallentamiseen, vanhempi merkintä on hylättävä. Välimuistin ohjain käyttää välimuistin korvauskäytäntöä valitakseen, mikä välimuistin merkintä korvataan uudella tiedolla.

Mikroprosessorin välimuistin tavoitteena on maksimoida välimuistin osumien prosenttiosuus ajan mittaan, mikä tarjoaa korkeimman jatkuvan käskyn suoritusnopeuden. Tämän tavoitteen saavuttamiseksi välimuistilogiikan on määritettävä, mitkä ohjeet ja tiedot sijoitetaan välimuistiin ja säilytetään lähitulevaisuutta varten.

Prosessorin välimuistilogiikka ei takaa, että välimuistissa olevaa tietokohdetta käytetään uudelleen, kun se on lisätty välimuistiin.

Välimuistin logiikka perustuu todennäköisyyteen, että ajallisen (ajan myötä toistuvan) ja spatiaalisen (avaruus) paikallisuuden vuoksi on erittäin hyvä mahdollisuus, että välimuistiin tallennettuja tietoja päästään käsiksi lähitulevaisuudessa. Käytännön toteutuksissa nykyaikaisissa prosessoreissa välimuistiosumat tapahtuvat tyypillisesti 95–97 prosentissa muistin käytöistä. Koska välimuistin latenssi on pieni murto-osa DRAM-muistin latenssista, korkea välimuistin osumataajuus parantaa huomattavasti suorituskykyä verrattuna välimuistittomaan malliin.

Jonkin verran rinnakkaisuutta välimuistin kanssa
Kuten aiemmin mainittiin, hyvässä muistissa olevan ohjelman ohjeet on erotettu tiedoista. Joissakin välimuistijärjestelmissä prosessorin 'vasemmalla' puolella on välimuistipiiri ja prosessorin 'oikealla' puolella on toinen välimuistipiiri. Vasen välimuisti käsittelee ohjelman (tai sovelluksen) ohjeita ja oikea välimuisti käsittelee saman ohjelman (tai saman sovelluksen) tietoja. Tämä johtaa parempaan nopeuteen.

6.8 Prosessit ja säikeet

Sekä CISC- että RISC-tietokoneissa on prosesseja. Ohjelmistossa on prosessi. Käynnissä oleva (suoritettava) ohjelma on prosessi. Käyttöjärjestelmän mukana tulee omat ohjelmansa. Kun tietokone on käynnissä, myös käyttöjärjestelmän ohjelmat, jotka mahdollistavat tietokoneen toiminnan, ovat käynnissä. Nämä ovat käyttöjärjestelmäprosesseja. Käyttäjä tai ohjelmoija voi kirjoittaa omia ohjelmiaan. Kun käyttäjän ohjelma on käynnissä, se on prosessi. Ei ole väliä onko ohjelma kirjoitettu assembly-kielellä vai korkean tason kielellä, kuten C tai C++. Kaikkia prosesseja (käyttäjää tai käyttöjärjestelmää) hallitsee toinen prosessi, jota kutsutaan 'aikatauluksi'.

Säie on kuin prosessiin kuuluva aliprosessi. Prosessi voi alkaa ja jakaa säikeiksi ja jatkuu sitten yhtenä prosessina. Prosessia ilman säikeitä voidaan pitää pääsäikeenä. Prosesseja ja niiden säikeitä hallitsee sama ajoitus. Itse ajastin on ohjelma, kun se on käyttöjärjestelmän levyllä. Kun ajastin on käynnissä muistissa, se on prosessi.

6.9 Monikäsittely

Säikeitä hallitaan melkein kuin prosesseja. Monikäsittely tarkoittaa useamman kuin yhden prosessin suorittamista samanaikaisesti. On tietokoneita, joissa on vain yksi mikroprosessori. On tietokoneita, joissa on useampi kuin yksi mikroprosessori. Yhdellä mikroprosessorilla prosessit ja/tai säikeet käyttävät samaa mikroprosessoria lomitus- (tai aikaleikkaus-) tavalla. Tämä tarkoittaa, että prosessi käyttää prosessoria ja pysähtyy ilman viimeistelyä. Toinen prosessi tai säie käyttää prosessoria ja pysähtyy ilman viimeistelyä. Sitten toinen prosessi tai säie käyttää mikroprosessoria ja pysähtyy ilman viimeistelyä. Tämä jatkuu, kunnes kaikilla ajoittajan jonoon asettamilla prosesseilla ja säikeillä on ollut osuus prosessorista. Tätä kutsutaan samanaikaiseksi monikäsittelyksi.

Kun mikroprosessoreita on useampi kuin yksi, on olemassa rinnakkainen moniprosessointi rinnakkaisuuden sijaan. Tässä tapauksessa jokainen prosessori suorittaa tietyn prosessin tai säiettä, joka on erilainen kuin toinen suoritin. Kaikki saman emolevyn prosessorit ajavat eri prosessejaan ja/tai eri säikeitä samaan aikaan rinnakkaisessa moniprosessoinnissa. Rinnakkaisen monikäsittelyn prosesseja ja säikeitä hallitsee edelleen ajoittaja. Rinnakkainen moniprosessointi on nopeampaa kuin samanaikainen monikäsittely.

Tässä vaiheessa lukija saattaa ihmetellä, kuinka rinnakkaiskäsittely on nopeampaa kuin samanaikainen käsittely. Tämä johtuu siitä, että prosessorit jakavat (on käytettävä eri aikoina) saman muistin ja tulo-/lähtöportit. No, välimuistia käytettäessä emolevyn yleinen toiminta on nopeampaa.

6.10 Haku

Muistinhallintayksikkö (MMU) on piiri, joka on lähellä mikroprosessoria tai mikroprosessorisirussa. Se käsittelee muistikartan tai haun ja muita muistiongelmia. 6502 µP:ssä eikä Commodore-64-tietokoneessa ei sinänsä ole MMU:ta (vaikka Commodore-64:ssä on vielä jonkin verran muistinhallintaa). Commodore-64 käsittelee muistia sivuamalla, jossa jokainen sivu on 256 10 tavua pitkä (100 16 tavua pitkä). Sen ei ollut pakko käsitellä muistia sivuttamalla. Siinä voisi silti olla vain muistikartta ja sitten ohjelmat, jotka vain sopivat niille eri määrätyille alueille. No, sivutus on yksi tapa tarjota tehokasta muistin käyttöä ilman, että siinä on monia muistiosia, joissa ei voi olla tietoja tai ohjelmia.

x86 386 -tietokonearkkitehtuuri julkaistiin vuonna 1985. Osoiteväylä on 32 bittiä leveä. Eli yhteensä 2 32 = 4 294 967 296 osoiteavaruutta on mahdollista. Tämä osoiteavaruus on jaettu 1 048 576 sivuun = 1 024 kt sivuun. Tällä sivumäärällä yksi sivu koostuu 4 096 tavusta = 4 kt. Seuraavassa taulukossa näkyvät 32-bittisen x86-arkkitehtuurin fyysiset osoitesivut:

Taulukko 6.10.1
Fyysiset osoitteelliset sivut x86-arkkitehtuurille
Perus 16 osoitetta Sivut Perus 10 osoitetta
FFFFF000 – FFFFFFFF sivu 1,048,575 4 294 963 200 – 4 294 967 295
FFFFE000 – FFFFEFFF Sivu 1,044,479 4 294 959 104 – 4 294 963 199
FFFFD000 – FFFFDFFF sivu 1,040,383 4 294 955 008 – 4 294 959 103
|
|
|
|
|
|
|
|
|
00002000 – 00002FFF Sivu 2 8 192 – 12 288
00001000 – 00001FFF Sivu 1 4 096 – 8 191
00000000 – 00000FFF Sivu 0 0 - 4,095

Nykyään sovellus koostuu useammasta kuin yhdestä ohjelmasta. Yksi ohjelma voi kestää alle sivun (alle 4096) tai se voi kestää kaksi tai useampia sivuja. Sovellus voi siis ottaa yhden tai useamman sivun, joissa jokainen sivu on 4096 tavua pitkä. Eri ihmiset voivat kirjoittaa hakemuksen, jolloin jokainen henkilö on määrätty yhdelle tai useammalle sivulle.

Huomaa, että sivu 0 on 00000000H - 00000FFF
sivu 1 on 00001000H - 00001FFFH, sivu 2 on 00002000 H – 00002FFF H , ja niin edelleen. 32-bittisessä tietokoneessa prosessorissa on kaksi 32-bittistä rekisteriä fyysistä sivun osoitetta varten: toinen perusosoitetta ja toinen indeksiosoitetta varten. Jos haluat päästä esimerkiksi sivun 2 tavupaikkoihin, perusosoitteen rekisterin tulee olla 00002 H joka on ensimmäiset 20 bittiä (vasemmalta) sivun 2 aloitusosoitteille. Loput bitit ovat välillä 000 H FFF:lle H ovat rekisterissä nimeltä 'indeksirekisteri'. Joten kaikki sivun tavut ovat käytettävissä lisäämällä hakemistorekisterin sisältöä arvosta 000 H FFF:lle H . Indeksirekisterin sisältö lisätään sisältöön, joka ei muutu perusrekisterissä tehokkaan osoitteen saamiseksi. Tämä hakemiston osoitejärjestelmä pätee muille sivuille.

Assembly-kieliohjelmaa ei kuitenkaan todellakaan ole kirjoitettu jokaiselle sivulle. Ohjelmoija kirjoittaa jokaiselle sivulle koodin sivulta 000 alkaen H sivulle FFF H . Koska eri sivuilla olevat koodit on yhdistetty, kääntäjä käyttää indeksiosoitteita yhdistääkseen kaikki asiaan liittyvät osoitteet eri sivuilla. Jos esimerkiksi oletetaan, että sivu 0, sivu 1 ja sivu 2 ovat yhdelle sovellukselle ja jokaisella on 555 H osoitteet, jotka ovat yhteydessä toisiinsa, kääntäjä kääntää siten, että kun 555 H sivulta 0 päästään, 00000 H tulee olemaan perusrekisterissä ja 555 H tulee olemaan hakemistorekisterissä. Kun 555 H sivulta 1 päästään, 00001 H tulee olemaan perusrekisterissä ja 555 H tulee olemaan hakemistorekisterissä. Kun 555 H sivulta 2 on pääsy, 00002 H on perusrekisterissä ja 555H on indeksirekisterissä. Tämä on mahdollista, koska osoitteet voidaan tunnistaa tarrojen (muuttujien) avulla. Eri ohjelmoijien on sovittava eri yhteysosoitteisiin käytettävien tarrojen nimet.

Sivun virtuaalimuisti
Hakua, kuten aiemmin on kuvattu, voidaan muokata muistin koon lisäämiseksi tekniikalla, jota kutsutaan nimellä 'Page Virtual Memory'. Olettaen, että kaikilla fyysisen muistin sivuilla, kuten aiemmin on kuvattu, on jotain (ohjeet ja tiedot), kaikki sivut eivät ole tällä hetkellä aktiivisia. Sivut, jotka eivät ole tällä hetkellä aktiivisia, lähetetään kiintolevylle ja korvataan kiintolevyn sivuilla, joiden on oltava käynnissä. Tällä tavalla muistin koko kasvaa. Kun tietokone jatkaa toimintaansa, passiivisiksi tulleet sivut vaihdetaan kiintolevyllä olevilla sivuilla, jotka saattavat edelleen olla muistista levylle lähetettyjä sivuja. Kaiken tämän tekee muistinhallintayksikkö (MMU).

6.11 Ongelmat

Lukijaa kehotetaan ratkaisemaan kaikki luvun ongelmat ennen siirtymistä seuraavaan lukuun.

1) Esitä CISC- ja RISC-tietokonearkkitehtuurien yhtäläisyydet ja erot. Nimeä yksi esimerkki SISC- ja RISC-tietokoneista.

2) a) Mitkä ovat seuraavat CISC-tietokoneen nimet bitteinä: tavu, sana, kaksoissana, nelisana ja kaksoisnelisana.
b) Mitkä ovat seuraavat RISC-tietokoneen nimet bitteinä: tavu, puolisana, sana ja kaksoissana.
c) Kyllä vai ei. Tarkoittaako kaksoissana ja nelisana samoja asioita sekä CISC- että RISC-arkkitehtuureissa?

3 a) X64:ssä kokoonpanokielen käskyjen tavujen määrä vaihtelee mistä ja mihin?
b) Onko ARM 64:n kaikkien kokoonpanokielisten ohjeiden tavumäärä kiinteä? Jos kyllä, mikä on tavujen määrä kaikille ohjeille?

4) Listaa yleisimmin käytetyt asennuskieliohjeet x64:lle ja niiden merkitykset.

5) Listaa yleisimmin käytetyt ARM 64:n asennuskieliohjeet ja niiden merkitykset.

6) Piirrä merkitty lohkokaavio vanhasta tietokoneesta Harvard Architecture. Selitä, kuinka sen ohjeita ja tietoominaisuuksia käytetään nykyaikaisten tietokoneiden välimuistissa.

7) Tee ero prosessin ja säikeen välillä ja anna prosessin nimi, joka käsittelee prosesseja ja säikeitä useimmissa tietokonejärjestelmissä.

8) Selitä lyhyesti mitä moniprosessointi on.

9) a) Selitä sivutus soveltuvin osin x86 386 µP -tietokonearkkitehtuuriin.
b) Kuinka tätä sivutusta voidaan muokata koko muistin koon kasvattamiseksi?