6. peatükk: Moodsa arvutiarhitektuuri põhitõed koos montaažikeelega

6 Peatukk Moodsa Arvutiarhitektuuri Pohitoed Koos Montaazikeelega



6.1 Sissejuhatus

Kaasaegseid üldotstarbelisi arvuteid on kahte tüüpi: CISC ja RISC. CISC tähistab Complex Instruction Set Computer. RISK tähistab lühendatud juhiste komplekti arvutit. 6502 või 6510 mikroprotsessorid, nagu Commodore-64 arvuti puhul, sarnanevad rohkem RISC-arhitektuuriga kui CISC-arhitektuuriga.

RISC-arvutitel on üldiselt lühemad montaažikeele juhised (baitide arvu järgi) võrreldes CISC-arvutitega.







Märge : olenemata sellest, kas tegemist on CISC-, RISC- või vana arvutiga, algab välisseade sisemisest pordist ja läheb arvuti süsteemiüksuse (põhiseadme) vertikaalsel pinnal oleva välise pordi kaudu väljapoole välisseadmesse.



CISC-arvuti tüüpilist käsku võib vaadelda kui mitme lühikese montaažikeele juhiste ühendamist üheks pikemaks koostekeele juhiseks, mis muudab ühe saadud käsu keeruliseks. Eelkõige laadib CISC-arvuti operandid mälust mikroprotsessori registritesse, sooritab toimingu ja salvestab seejärel tulemuse tagasi mällu, seda kõike ühe käsuga. Teisest küljest on see RISC-arvuti jaoks vähemalt kolm juhist (lühike).



CISC-arvuteid on kaks populaarset seeriat: Inteli mikroprotsessorarvutid ja AMD mikroprotsessorarvutid. AMD tähistab Advanced Micro Devices; see on pooljuhte tootev ettevõte. Inteli mikroprotsessorite seeriad on arendamise järjekorras 8086, 8088, 80186, 80286, 80386, 80486, Pentium, Core, i Series, Celeron ja Xeon. Varasemate Inteli mikroprotsessorite (nt 8086 ja 8088) montaažikeele juhised pole kuigi keerulised. Uute mikroprotsessorite jaoks on need aga keerulised. Hiljutised CISC-seeria AMD mikroprotsessorid on Ryzen, Opteron, Athlon, Turion, Phenom ja Sempron. Inteli ja AMD mikroprotsessoreid tuntakse x86 mikroprotsessoritena.





ARM tähistab Advanced RISC Machine. ARM-i arhitektuurid määratlevad RISC-protsessorite perekonna, mis sobivad kasutamiseks paljudes rakendustes. Kuigi lauaarvutite personaalarvutites kasutatakse paljusid Inteli ja AMD mikroprotsessoreid, toimivad paljud ARM-protsessorid ohutuse seisukohalt olulistes süsteemides, nagu autode mitteblokeeruvad pidurid, ja üldotstarbeliste protsessoritena nutikellades, kaasaskantavates telefonides, tahvelarvutites ja sülearvutites. . Kuigi mõlemat tüüpi mikroprotsessoreid võib näha väikestes ja suurtes seadmetes, leidub RISC mikroprotsessoreid rohkem väikestes seadmetes kui suurtes seadmetes.

Arvuti Word
Kui öeldakse, et arvuti on 32-bitine sõna, tähendab see, et teave salvestatakse, edastatakse ja manipuleeritakse kolmekümne kahebitiste binaarkoodide kujul emaplaadi sisemises osas. See tähendab ka seda, et arvuti mikroprotsessori üldotstarbelised registrid on 32-bitised. 6502 mikroprotsessori A-, X- ja Y-registrid on üldotstarbelised registrid. Need on kaheksa bitti laiad ja seega on Commodore-64 arvuti kaheksabitine sõnaarvuti.



Mõni sõnavara
X86 arvutid

Baiti, sõna, topeltsõna, neliksõna ja topelt-nelisõna tähendused on x86 arvutite puhul järgmised:

  • Bait : 8 bitti
  • Sõna : 16 bitti
  • Topeltsõna : 32 bitti
  • Quadword : 64 bitti
  • Kahekordne neliksõna : 128 bitti

ARM-arvutid
Baiti, poolsõna, sõna ja topeltsõna tähendused on ARM-arvutite puhul järgmised:

  • Bait : 8 bitti
  • Saa pooleks : 16 bitti
  • Sõna : 32 bitti
  • Topeltsõna : 64 bitti

Märkida tuleks x86 ja ARM-i nimede (ja väärtuste) erinevusi ja sarnasusi.

Märge : mõlema arvutitüübi märgitäisarvud on kahetäisarvud.

Mälu asukoht
Commodore-64 arvuti puhul on mälu asukoht tavaliselt üks bait, kuid osutite (kaudne adresseerimine) kaalumisel võib see mõnikord olla kaks järjestikust baiti. Kaasaegse x86-arvuti puhul on mälukoht 16 järjestikust baiti, kui tegemist on 16-baidise (128-bitise) topelt-nelisõnaga, 8 järjestikust baiti, kui tegemist on 8-baidise (64-bitise) neliksõnaga, ja 4 järjestikust baiti, kui tegemist on topeltsõnaga. 4 baiti (32 bitti), 2 järjestikust baiti 2-baidise sõna (16 bitti) käsitlemisel ja 1 baiti, kui käsitlete baiti (8 bitti). Kaasaegse ARM-arvuti puhul on mälukoht 8 järjestikust baiti, kui tegemist on 8-baidise (64-bitise) topeltsõnaga, 4 järjestikust baiti 4-baidise (32-bitise) sõnaga, 2 järjestikust baiti poolsõnaga. 2 baiti (16 bitti) ja 1 baiti, kui käsitletakse baiti (8 bitti).

Selles peatükis selgitatakse, mis on CISC- ja RISC-arhitektuurides ühist ning millised on nende erinevused. Seda tehakse võrreldes 6502 µP ja commodore-64 arvutiga, kus see on rakendatav.

6.2 Moodsa arvuti emaplaadi plokkskeem

PC tähistab personaalarvutit. Järgnevalt on toodud üheainsa mikroprotsessoriga kaasaegse emaplaadi üldine põhiplokkskeem personaalarvuti jaoks. See esindab CISC- või RISC-emaplaati.


Joonis 6.21 Moodsa arvuti emaplaadi põhiplokkskeem

Diagrammil on näidatud kolm sisemist porti, kuid praktikas on neid rohkem. Igal pordil on register, mida saab vaadelda kui porti ennast. Igal pordiahelal on vähemalt teine ​​register, mida võib nimetada 'olekuregistriks'. Olekuregister näitab programmi porti, mis saadab mikroprotsessorile katkestussignaali. Seal on katkestuskontrolleri ahel (pole näidatud), mis eristab eri portide erinevaid katkestusliine ja millel on µP-ni vaid paar rida.

HD.C diagrammil tähistab kõvakettakaarti. NIC tähistab võrguliidese kaarti. Kõvakettakaart (vooluahel) on ühendatud kõvakettaga, mis asub tänapäevase arvuti põhiseadme (süsteemiüksuse) sees. Võrguliidese kaart (ahel) on välise kaabli kaudu ühendatud teise arvutiga. Diagrammil on üks port ja DMA (vt järgmist joonist), mis on ühendatud kõvakettakaardi ja/või võrguliidese kaardiga. DMA tähistab otsest mälujuurdepääsu.

Peatükist Commodore-64 arvuti pea meeles, et baitide saatmiseks mälust kettaseadmesse või teise arvutisse tuleb iga bait enne vastavasse sisemisse porti kopeerimist mikroprotsessoris asuvasse registrisse ja seejärel automaatselt. seadmele. Selleks, et baite kettaseadmest või teisest arvutist mällu vastu võtta, tuleb iga bait enne mällu kopeerimist vastavast sisemisest pordiregistrist mikroprotsessoriregistrisse kopeerida. See võtab tavaliselt kaua aega, kui voo baitide arv on suur. Lahendus kiireks edastuseks on Direct Memory Access (ahela) kasutamine ilma mikroprotsessorit läbimata.

DMA-ahel on pordi ja HD vahel. C või NIC. DMA-ahela otsese mälujuurdepääsu korral toimub suurte baitide voogude edastamine otse DMA-ahela ja mälu (RAM) vahel ilma mikroprotsessori jätkuva osaluseta. DMA kasutab µP asemel aadressi siini ja andmesiini. Ülekande kogukestus on lühem kui µP kõva kasutamise korral. Nii HD C. kui ka NIC kasutavad DMA-d, kui neil on RAM-iga (mälu) edastamiseks suur andmevoog (baite).

GPU tähistab graafikaprotsessorit. See emaplaadi plokk vastutab teksti ja liikuvate või piltide ekraanile saatmise eest.

Kaasaegsetes arvutites (arvutites) puudub kirjutuskaitstud mälu (ROM). Siiski on BIOS või UEFI, mis on omamoodi püsiv RAM. BIOS-is sisalduvat teavet haldab tegelikult aku. Aku on see, mis tegelikult hoiab ka kellataimerit, arvuti jaoks õigel ajal ja kuupäeval. UEFI leiutati pärast BIOS-i ja on asendanud BIOS-i, kuigi BIOS on tänapäevastes arvutites endiselt üsna asjakohane. Nendest räägime hiljem lähemalt!

Kaasaegsetes arvutites ei ole µP ja sisemiste pordiahelate (ja mälu) vahelised aadressi- ja andmesiinid paralleelsiinid. Need on jadasiinid, mille edastamiseks on vaja kahte juhti ühes suunas ja kahte teist juhti vastassuunas edastamiseks. See tähendab näiteks seda, et 32-bitiseid saab saata järjestikku (üks bitt teise järel) mõlemas suunas.

Kui jadaedastus toimub ainult ühes suunas kahe juhiga (kahe liiniga), siis öeldakse, et see on pooldupleks. Kui jadaedastus toimub mõlemas suunas nelja juhiga, üks paar kummaski suunas, siis öeldakse, et see on täisdupleks.

Kaasaegse arvuti kogu mälu koosneb endiselt reast baitide asukohtadest: kaheksa bitti baidi kohta. Kaasaegses arvutis on mäluruumi vähemalt 4 gigabaiti = 4 x 210 x 2 10 x 2 10 = 4 x 1 073 741 824 10 baiti = 4 x 1024 10/alam> 1024 10 x 1024 10 = 4 x 1 073 741 824 10 .

Märge : Kuigi eelmisel emaplaadil taimeriahelat ei kuvata, on kõigil kaasaegsetel emaplaatidel taimerahelad.

6.3 x64 arvutiarhitektuuri põhitõed

6.31 x64 registrikomplekt
X86 seeria mikroprotsessorite 64-bitine mikroprotsessor on 64-bitine mikroprotsessor. Üsna kaasaegne on sama seeria 32-bitist protsessorit välja vahetada. 64-bitise mikroprotsessori üldotstarbelised registrid ja nende nimed on järgmised:


Joonis 6.31 Üldotstarbelised registrid x64 jaoks

Antud joonisel on kujutatud kuusteist (16) üldotstarbelist registrit. Kõik need registrid on 64-bitised. Vaadates vasakus ülanurgas olevat registrit, on 64 bitti identifitseeritud kui RAX. Selle sama registri esimesed 32 bitti (paremalt) identifitseeritakse kui EAX. Selle sama registri esimesed 16 bitti (paremalt) identifitseeritakse kui AX. Selle sama registri teine ​​bait (paremalt) on identifitseeritud kui AH (H tähendab siin kõrget). Ja esimene bait (sellest samast registrist) on identifitseeritud kui AL (L tähendab siin madalat). Parempoolses alanurgas asuvat registrit vaadates on 64 bitti tähistatud kui R15. Selle sama registri esimesed 32 bitti on identifitseeritud kui R15D. Selle sama registri esimesed 16 bitti on identifitseeritud kui R15W. Ja esimene bait on identifitseeritud kui R15B. Sarnaselt selgitatakse ka teiste registrite (ja alamregistrite) nimesid.

Inteli ja AMD µP-de vahel on mõningaid erinevusi. Selles jaotises olev teave on Inteli jaoks.

6502 µP puhul on programmiloenduri register (pole otse juurdepääsetav), mis sisaldab järgmist täidetavat käsku, 16-bitine. Siin (x64) nimetatakse programmiloendurit Instruction Pointer ja see on 64 bitti lai. See on märgistatud kui RIP. See tähendab, et x64 µP suudab adresseerida kuni 264 = 1,844674407 x 1019 (tegelikult 18 446 744 073 709 551 616) mälubaidi asukohti. RIP ei ole üldotstarbeline register.

Stack Pointer Register ehk RSP kuulub 16 üldotstarbelise registri hulka. See osutab viimasele virna kirjele mälus. Nagu 6502 µP puhul, kasvab ka x64 virn allapoole. x64 puhul kasutatakse RAM-i virna alamprogrammide tagastusaadresside salvestamiseks. Seda kasutatakse ka 'varjuruumi' salvestamiseks (vt järgmist arutelu).

6502 µP-l on 8-bitine protsessori olekuregister. Samaväärset x64-s nimetatakse RFLAGS-registriks. See register salvestab lipud, mida kasutatakse toimingute tulemuste ja protsessori juhtimiseks (µP). Selle laius on 64 bitti. Kõrgemad 32 bitti on reserveeritud ja neid praegu ei kasutata. Järgmises tabelis on RFLAGS-registris sageli kasutatavate bittide nimed, indeks ja tähendused:

Tabel 6.31.1
Enim kasutatud RFLAGS-lipud (bitid)
Sümbol Natuke Nimi Eesmärk
CF 0 Kanna See määratakse, kui aritmeetiline tehe genereerib tulemuse kõige olulisemast bitist ülekande või laenamise; kustutatud muidu. See lipp näitab märgita täisarvude aritmeetika ületäitumise tingimust. Seda kasutatakse ka mitmekordse täpsusega aritmeetikas.
PF 2 Pariteet See määratakse, kui tulemuse vähima tähtsusega bait sisaldab paarisarv 1 bitti; kustutatud muidu.
OF 4 Kohandage See määratakse, kui aritmeetiline tehe genereerib tulemuse bitist 3 kande või laenamise; kustutatud muidu. Seda lippu kasutatakse kahendkoodiga kümnendsüsteemi (BCD) aritmeetikas.
ZF 6 Null See määratakse, kui tulemus on null; kustutatud muidu.
SF 7 Sign See määratakse, kui see on võrdne tulemuse kõige olulisema bitiga, mis on märgiga täisarvu märgibitt (0 tähistab positiivset väärtust ja 1 negatiivset väärtust).
OF üksteist Ülevool See määratakse, kui täisarvuline tulemus on liiga suur positiivne arv või liiga väike negatiivne arv (v.a märgibitt), et mahutada sihtoperandi; kustutatud muidu. See lipp näitab märgilise täisarvu (kahe täiendi) aritmeetika ületäitumise tingimust.
DF 10 Suund See määratakse, kui suunastringi juhised töötavad (kasvatage või vähendage).
ID kakskümmend üks Identifitseerimine See määratakse, kui selle muutlikkus tähistab CPUID käsu olemasolu.

Lisaks eelnevalt märgitud kaheksateistkümnele 64-bitisele registrile on x64 arhitektuuril µP kaheksa 80-bitise laiusega registrit ujukomaaritmeetika jaoks. Neid kaheksat registrit saab kasutada ka MMX-registritena (vt järgmist arutelu). XMM-i jaoks on ka kuusteist 128-bitist registrit (vt järgmist arutelu).

See pole veel kõik registrite kohta. On rohkem x64 registreid, mis on segmendiregistrid (enamasti ei kasutata x64 puhul), juhtregistrid, mäluhaldusregistrid, silumisregistrid, virtualiseerimisregistrid, jõudlusregistrid, mis jälgivad kõikvõimalikke sisemisi parameetreid (vahemälu tabamused/puudused, käivitatud mikrooperatsioonid, ajastus ja palju muud).

SIMD

SIMD tähistab Single Instruction Multiple Data. See tähendab, et üks montaažikeele käsk võib ühes mikroprotsessoris korraga toimida mitmele andmele. Kaaluge järgmist tabelit:

1 2 3 4 5 6 7 8
+ 9 10 üksteist 12 13 14 viisteist 16
= 10 12 14 16 18 kakskümmend 22 24

Selles tabelis liidetakse paralleelselt (sama kestusega) kaheksa numbripaari, et saada kaheksa vastust. Üks komplekteerimiskeele käsk võib teha kaheksa paralleelset täisarvu liitmist MMX-registrites. Sarnast asja saab teha ka XMM-registritega. Seega on täisarvude jaoks MMX-juhised ja ujukite jaoks XMM-juhised.

6.32 Mälukaart ja x64

Kui käsuosutil (programmiloendur) on 64 bitti, tähendab see, et adresseerida saab 264 = 1,844674407 x 1019 mälubaitide asukohti. Kuueteistkümnendsüsteemis on kõrgeim baidi asukoht FFFF,FFFF,FFFF,FFFF16. Ükski tavaline arvuti tänapäeval ei suuda pakkuda nii suurt (täielikku) mäluruumi. Seega on x64 arvuti jaoks sobiv mälukaart järgmine:

Pange tähele, et vahe vahemikus 0000,8000,0000,000016 kuni FFFF,7FFF,FFFF,FFFF16 ei sisalda mälukohti (mälu RAM-i pangad puuduvad). See on FFFF,0000,0000,000116 erinevus, mis on üsna suur. Kanoonilisel kõrgel poolel on operatsioonisüsteem, samas kui kanoonilisel madalal poolel on kasutajaprogrammid (rakendused) ja andmed. Operatsioonisüsteem koosneb kahest osast: väikesest UEFI-st (BIOS) ja suurest osast, mis laaditakse kõvakettalt. Järgmises peatükis räägitakse lähemalt kaasaegsetest operatsioonisüsteemidest. Pange tähele sarnasust selle mälukaardiga ja Commodore-64 mälukaardiga, kui 64 KB võis tunduda palju mäluna.

Selles kontekstis nimetatakse operatsioonisüsteemi laias laastus tuumaks. Kernel sarnaneb Commodore-64 arvuti kernaliga, kuid sellel on palju rohkem alamprogramme.

X64 endiaalsus on väike, mis tähendab, et asukoha puhul osutab alumine aadress mälu madalamale sisubaidile.

6.33 Assembly Language Addressing Modes for x64

Adresseerimisrežiimid on viisid, kuidas käsud pääsevad ligi µP registritele ja mälule (kaasa arvatud sisemised pordiregistrid). X64-l on palju adresseerimisrežiime, kuid siin käsitletakse ainult tavaliselt kasutatavaid adresseerimisrežiime. Siinse juhise üldine süntaks on:

opkoodi sihtkoht, allikas

Kümnendarvud kirjutatakse ilma ees- ja järelliiteta. 6502 puhul on allikas kaudne. X64-l on rohkem op-koode kui 6502-l, kuid mõnel opkoodil on sama märguanne. Üksikud x64 käsud on muutuva pikkusega ja võivad ulatuda 1 kuni 15 baiti. Tavaliselt kasutatavad adresseerimisrežiimid on järgmised.

Vahetu adresseerimise režiim
Siin on lähteoperand tegelik väärtus, mitte aadress või silt. Näide (loe kommentaari):

ADD EAX, 14 ; lisage 64-bitise RAX-i kümnendkoha 14-32-bitine EAX, vastus jääb EAX-i (sihtkoht)

Registreeruge aadressirežiimi registreerimiseks
Näide:

ADD R8B, AL ; lisage RAX-i 8-bitine AL 64-bitise R8 R8B-le – vastused jäävad R8B-sse (sihtkoht)

Kaudne ja indekseeritud adresseerimisrežiim
Kaudne adresseerimine 6502 µP-ga tähendab, et antud aadressi asukohal käsus on lõpliku asukoha efektiivne aadress (pointer). Sarnane asi juhtub ka x64-ga. Indeksaadresseerimine 6502 µP-ga tähendab, et käsus antud aadressile lisatakse tegeliku aadressi saamiseks µP registri sisu. Sarnane asi juhtub ka x64-ga. Samuti saab x64-ga registri sisu enne antud aadressile lisamist ka 1 või 2 või 4 või 8-ga korrutada. x64 mov (kopeeri) käsk võib kombineerida nii kaudset kui ka indekseeritud adresseerimist. Näide:

MOV R8W, 1234 [8*RAX+RCX] ; liigutage sõna aadressil (8 x RAX + RCX) + 1234

Siin on R8W-l R8 esimesed 16 bitti. Antud aadress on 1234. RAX-i registris on 64-bitine arv, mis korrutatakse 8-ga. Tulemus lisatakse 64-bitise RCX-registri sisusse. See teine ​​tulemus lisatakse tegeliku aadressi saamiseks antud aadressile, mis on 1234. Tõhusa aadressi asukohas olev number teisaldatakse (kopeeritakse) R8 registri esimesse 16-bitisesse kohta (R8W), asendades seal oleva. Pange tähele nurksulgude kasutamist. Pidage meeles, et sõna x64 keeles on 16 bitti lai.

RIP suhteline adresseerimine
6502 µP puhul kasutatakse suhtelist adresseerimist ainult harujuhistega. Seal on opkoodi üksik operandiks nihe, mis lisatakse või lahutatakse programmiloenduri sisust tõhusa käsuaadressi (mitte andmeaadressi) jaoks. Sarnane asi juhtub ka x64-ga, kus programmiloendurit nimetatakse juhiste osutiks. Käsk x64-ga ei pea olema ainult harukäsk. RIP-i suhtelise adresseerimise näide on:

MOV AL, [RIP]

RAX-i AL-il on 8-bitine märgiga number, mis lisatakse või lahutatakse RIP-i sisust (64-bitine käsu osuti), et osutada järgmisele käsule. Pange tähele, et allikas ja sihtkoht on selles juhises erandkorras vahetatud. Pange tähele ka nurksulgude kasutamist, mis viitavad RIP-i sisule.

6.34 Tavaliselt kasutatavad x64 juhised

Järgmises tabelis tähistab * opkoodide alamhulga erinevaid võimalikke järelliiteid:

Tabel 6.34.1
Tavaliselt kasutatavad juhised x64-s
Opkood Tähendus
MOV Liiguta (kopeeri) mälusse/mälust/registrite vahel
CMOV* Erinevad tingimuslikud käigud
XCHG Vahetada
BSWAP Baitivahetus
PUSH/POP Virna kasutamine
ADD/ADC Lisa/kandmisega
SUB/SBC Lahutamine/kandmisega
MUL/IMUL Korruta/märgita
DIV/IDIV Jaga/allkirjastamata
INC/DEC Kasv/vähendamine
NEG Eitada
CMP Võrdlema
JA/VÕI/XOR/EI Bitipõhised toimingud
SHR/SAR Loogiline/aritmeetiline nihe paremale
SHL/SAL Loogiline/aritmeetiline nihe vasakule
ROR/ROLL Pöörake paremale/vasakule
RCR/RCL Pöörake paremale/vasakule läbi kandeotsaku
BT/BTS/BTR Bititest/ja seadista/ja lähtestamine
JMP Tingimusteta hüpe
JE/JNE/JC/JNC/J* Hüppa, kui võrdne/mitte võrdne/ kanna/ei kanna/palju teisi
KÕNNI/KÕNNI/KÕNNI Silmus ECX-iga
HELISTA/RET Helista alamprogrammile/tagasi
NOP Ei mingit operatsiooni
CPUID CPU teave

X64-l on korrutamise ja jagamise juhised. Selle µP-s on korrutamise ja jagamise riistvaraahelad. 6502 µP ei sisalda korrutamise ja jagamise riistvaralülitusi. Riistvaraliselt on korrutamine ja jagamine kiirem kui tarkvara (sh bittide nihutamine).

Stringi juhised
Stringi käske on mitmeid, kuid ainuke, mida siin käsitletakse, on MOVS (liikumise stringi jaoks) käsk stringi kopeerimiseks, mis algab aadressilt C000 H . Alustamiseks aadressil C100 H , kasutage järgmisi juhiseid:

MOVS [C100H], [C000H]

Pange tähele kuueteistkümnendsüsteemi järelliidet H.

6.35 Looping in x64

Mudelil 6502 µP on silmuste loomiseks harujuhised. Harukäsk hüppab aadressi asukohta, millel on uus käsk. Aadressi asukohta võib nimetada tsükliks. X64-l on silmuse loomiseks juhised LOOP/LOOPE/LOOPNE. Neid reserveeritud komplekteerimiskeele sõnu ei tohi segi ajada sildiga 'silmus' (ilma jutumärkideta). Käitumine on järgmine:

LOOP vähendab ECX-i ja kontrollib, kas ECX ei ole null. Kui see tingimus (null) on täidetud, hüppab see määratud sildi juurde. Vastasel juhul kukub see läbi (jätkake järgmises arutelus ülejäänud juhistega).

LOOPE vähendab ECX-i ja kontrollib, et ECX ei oleks null (võib olla näiteks 1) ja ZF on seatud (1). Kui need tingimused on täidetud, hüppab see sildi juurde. Muidu kukub läbi.

LOOPNE vähendab ECX-i ja kontrollib, et ECX ei oleks null ja ZF EI OLE seatud (st oleks null). Kui need tingimused on täidetud, hüppab see sildile. Muidu kukub läbi.

x64 puhul hoiab RCX-i register või selle alamosad, nagu ECX või CX, loenduri täisarvu. LOOP juhiste korral loendab loendur tavaliselt allapoole, vähendades iga hüppe (silmuse) kohta 1 võrra. Järgmises silmuskoodi segmendis suureneb EAX-registri arv kümne iteratsiooniga 0-lt 10-le, samal ajal kui ECX-i arv loendab (väheneb) 10 korda (lugege kommentaare):

MOV EAX, 0 ;
MOV ECX, 10 ; vaikimisi loendama 10 korda, üks kord iga iteratsiooni jaoks
silt:
INC EAX ; suurendage EAX-i tsükli kehana
LOOP silt ; vähendage EAX-i ja kui EAX ei ole null, käivitage sildi keha uuesti sildist:

Tingimuste kodeerimine algab sõnast 'silt:'. Pange tähele käärsoole kasutamist. Silmuse kodeerimine lõpeb sildiga 'LOOP', mis ütleb EAX vähendamise. Kui selle sisu ei ole null, minge tagasi käsu juurde pärast sõna 'label:' ja täitke uuesti kõik käsud (kõik kehakäsud), mis tulevad allapoole, kuni ilmub silt 'LOOP'. Pange tähele, et 'sildil' võib siiski olla teine ​​nimi.

6.36 x64 sisend/väljund

Peatüki see osa käsitleb andmete saatmist väljundporti (sisemisse) või andmete vastuvõtmist sisendpordist (sisemisest). Kiibistikul on kaheksabitised pordid. Iga kahte järjestikust 8-bitist porti saab käsitleda 16-bitise pordina ja mis tahes nelja järjestikust porti saab käsitleda 32-bitisena. Sel viisil saab protsessor edastada 8, 16 või 32 bitti välisseadmesse või välisseadmest.

Teavet saab protsessori ja sisemise pordi vahel edastada kahel viisil: kasutades nn mälukaardistatud sisendit/väljundit või kasutades eraldi sisendi/väljundi aadressiruumi. Mäluga kaardistatud I/O on nagu see, mis juhtub 6502 protsessoriga, kus pordiaadressid on tegelikult osa kogu mäluruumist. Sellisel juhul lähevad andmed konkreetsesse aadressi asukohta saatmisel porti, mitte mälupanka. Portidel võib olla eraldi I/O aadressiruum. Viimasel juhul on kõigi mälupankade aadressid nullist alates. Eraldi aadressivahemik on 0000H kuni FFFF16. Neid kasutavad kiibistiku pordid. Emaplaat on programmeeritud nii, et mitte ajada segamini mälukaardistatud I/O ja eraldi I/O aadressiruumi vahel.

Mäluga kaardistatud I/O
Sellega käsitletakse porte mälukohtadena ning mälu ja µP vahel kasutatavaid tavalisi opkoode kasutatakse andmeedastuseks µP ja portide vahel. Seega, et teisaldada bait pordist aadressil F000H µP registrisse RAX:EAX:AX:AL, toimige järgmiselt.

MOV AL, [F000H]

Stringi saab teisaldada mälust porti ja vastupidi. Näide:

MOVS [F000H], [C000H] ; allikas on C000H ja sihtkoht on F000H sadam.

Eraldi I/O aadressiruum

Sellega seoses tuleb kasutada sisendi ja väljundi erijuhiseid.

Üksikute esemete ülekandmine
Ülekande protsessoriregister on RAX. Tegelikult on see topeltsõna jaoks RAX:EAX, sõna jaoks RAX:EAX:AX ​​ja baidi jaoks RAX:EAX:AX:AL. Seega, et edastada bait pordist FFF0h, RAX:EAX:AX:AL, tippige järgmine:

IN AL, [FFF0H]

Vastupidiseks ülekandeks tippige järgmine:

OUT [FFF0H], AL

Seega on üksikute esemete puhul juhised SISSE ja VÄLJA. Pordi aadressi saab anda ka RDX:EDX:DX registris.

Stringide ülekandmine
Stringi saab mälust üle kanda kiibikomplekti porti ja vastupidi. Stringi ülekandmiseks pordist aadressil FFF0H mällu alustage C100H-st, tippige:

INS [ESI], [DX]

millel on sama mõju kui:

INS [EDI], [DX]

Programmeerija peaks sisestama FFF0H kahebaidise pordiaadressi RDX:EDX:Dx registrisse ja C100H kahebaidise aadressi RSI:ESI või RDI:EDI registrisse. Vastupidiseks ülekandeks tehke järgmist.

INS [DX], [ESI]

millel on sama mõju kui:

INS [DX], [EDI]

6.37 Pinn x64-s

Nagu 6502 protsessoril, on ka x64 protsessoril RAM-i virn. X64 virn võib olla 2 16 = 65 536 baiti pikk või see võib olla 2 32 = 4 294 967 296 baiti pikk. See kasvab ka allapoole. Kui registri sisu virna lükatakse, vähendatakse RSP-virna osuti numbrit 8 võrra. Pidage meeles, et x64 mäluaadress on 64 bitti lai. Viru kursori väärtus µP-s osutab RAM-i virna järgmisele asukohale. Kui registri sisu (või väärtus ühes operandis) hüppatakse virust registrisse, suurendatakse RSP-virna osuti numbrit 8 võrra. Operatsioonisüsteem otsustab pinu suuruse ja selle alguse koha RAM-is ja kasvab allapoole. Pidage meeles, et virn on LIFO (Last-In-First-Out) struktuur, mis sel juhul kasvab allapoole ja kahaneb ülespoole.

µP RBX registri sisu virna surumiseks tehke järgmist.

PUSH RBX

Virna viimase kirje RBX-i tagasi tõstmiseks tehke järgmist.

POP RBX

6.38 Protseduur x64-s

Alamprogrammi x64-s nimetatakse protseduuriks. Virna kasutatakse siin rohkem kui 6502 µP puhul. x64 protseduuri süntaks on:

proc_name:
protseduuri keha

õige

Enne jätkamist pange tähele, et x64 alamprogrammi opkoodid ja sildid (üldiselt koostekeele juhised) ei ole tõstutundlikud. Protsessi_nimi on sama, mis PROC_NAME. Sarnaselt 6502-ga algab protseduuri nime (sildi) nimi montaažikeele tekstiredaktoris uue rea algusest. Sellele järgneb koolon, mitte tühik ja opkood, nagu 6502 puhul. Järgneb alamprogrammi keha, mis lõpeb RET-iga, mitte RTS-iga nagu 6502 µP puhul. Sarnaselt 6502-ga ei alga iga käsk kehas, sealhulgas RET, selle rea algusest. Pange tähele, et siin võib silt olla pikem kui 8 tähemärki. Selle protseduuri kutsumiseks ülalt või alla trükitud protseduuri tehke järgmist.

HELISTA protseduuri_nimi

6502 puhul on sildi nimi helistamiseks lihtsalt tüüp. Siin aga trükitakse reserveeritud sõna “CALL” või “call”, millele järgneb tühiku järel protseduuri (alamprogrammi) nimi.

Protseduuride käsitlemisel on tavaliselt kaks protseduuri. Üks protseduur kutsub teist. Protseduuri, mis helistab (millel on helistamisjuhis), nimetatakse 'helistajaks' ja protseduuri, mida kutsutakse, nimetatakse 'helistajaks'. On konventsioon (reeglid), mida järgida.

Helistaja reeglid

Helistaja peaks alamprogrammi käivitamisel järgima järgmisi reegleid:

1. Enne alamprogrammi kutsumist peaks helistaja salvestama teatud registrite sisu, mis on määratud helistaja poolt salvestatud virnastamiseks. Helistaja salvestatud registrid on R10, R11 ja kõik registrid, kuhu parameetrid sisestatakse (RDI, RSI, RDX, RCX, R8, R9). Kui nende registrite sisu tuleb säilitada kogu alamprogrammi kutses, lükake need RAM-i salvestamise asemel virna. Neid tuleb teha, sest helistaja peab varasema sisu kustutamiseks kasutama registreid.

2. Kui protseduur on näiteks kahe numbri lisamine, on need kaks numbrit virna edastatavad parameetrid. Parameetrite edastamiseks alamprogrammile pange neist kuus järjekorras järgmistesse registritesse: RDI, RSI, RDX, RCX, R8, R9. Kui alamprogrammis on rohkem kui kuus parameetrit, lükake ülejäänud pinu vastupidises järjekorras (st viimane parameeter enne). Kuna pinu kasvab, salvestatakse esimene lisaparameetritest (tegelikult seitsmes parameeter) madalaimale aadressile (seda parameetrite inversiooni kasutati ajalooliselt selleks, et võimaldada funktsioonide (alamprogrammide) edastamist muutuva arvu parameetritega).

3. Alamprogrammi (protseduuri) kutsumiseks kasutage kutsumisjuhist. See käsk asetab tagastusaadressi pinu parameetrite kohale (madalaim positsioon) ja alamprogrammi koodi harudesse.

4. Pärast alamprogrammi naasmist (st kohe pärast kutsumisjuhist) peab helistaja pinust eemaldama kõik täiendavad parameetrid (peale kuue, mis on registritesse salvestatud). See taastab virna selle oleku, mis oli enne kõne sooritamist.

5. Helistaja võib eeldada, et ta leiab RAX-registrist alamprogrammi tagastusväärtuse (aadressi).

6. Helistaja taastab helistaja salvestatud registrite sisu (R10, R11 ja kõik parameetrite edastamise registrid), tõstes need virnast välja. Helistaja võib eeldada, et alamprogramm ei muutnud ühtegi teist registrit.

Kutsumistava ülesehituse tõttu on tavaliselt nii, et mõned (või enamik) neist sammudest ei muuda pinu. Näiteks kui parameetreid on kuus või vähem, ei lükata selles etapis midagi virna. Samuti jätavad programmeerijad (ja kompilaatorid) tavaliselt nende jaoks olulised tulemused sammude 1 ja 6 käigus helistaja salvestatud registritest välja, et vältida liigseid tõukeid ja hüppamisi.

Parameetrite alamprogrammile edastamiseks on veel kaks võimalust, kuid neid selles veebipõhises karjäärikursuses ei käsitleta. Üks neist kasutab üldotstarbeliste registrite asemel pinu ennast.

Callee reeglid

Kutsutud alamprogrammi määratlus peaks järgima järgmisi reegleid:

1. Jaotage kohalikud muutujad (muutujad, mis töötatakse välja protseduuri käigus), kasutades registreid või pinu ruumi tehes. Tuletame meelde, et virn kasvab allapoole. Seega, et virna ülaosas ruumi teha, tuleks virna osutit vähendada. Summa, mille võrra pinu osutit vähendatakse, sõltub vajalikust kohalike muutujate arvust. Näiteks kui on vaja kohalikku ujukit ja kohalikku pikka (kokku 12 baiti), tuleb pinukursorit vähendada 12 võrra, et nendele kohalikele muutujatele ruumi teha. Kõrgetasemelises keeles, nagu C, tähendab see muutujate deklareerimist ilma väärtusi määramata (initsialiseerimata).

2. Järgmisena tuleb salvestada funktsiooni poolt kasutatavate registrite väärtused, mis on määratud helistaja poolt salvestatud (üldotstarbelised registrid, mida helistaja ei salvesta). Registrite salvestamiseks lükake need virna. Helistatava poolt salvestatud registrid on RBX, RBP ja R12 kuni R15 (kõnekokkulepe säilitab ka RSP-d, kuid seda ei pea selle etapi ajal virnale suruma).

Pärast nende kolme toimingu sooritamist võib alamprogrammi tegelik töö jätkuda. Kui alamprogramm on naasmiseks valmis, jätkuvad kõne kokkuleppereeglid.

3. Kui alamprogramm on tehtud, tuleks alamprogrammi tagastusväärtus asetada RAX-i, kui seda veel pole.

4. Alamprogramm peab taastama kõigi muudetud helistaja poolt salvestatud registrite (RBX, RBP ja R12 kuni R15) vanad väärtused. Registri sisu taastatakse virnast hüppamisega. Pange tähele, et registrid tuleks hüpata nende lükkamise vastupidises järjekorras.

5. Järgmisena eraldame kohalikud muutujad. Lihtsaim viis seda teha on lisada RSP-le sama summa, mis sellest sammus 1 lahutati.

6. Lõpuks pöördume tagasi helistaja juurde, täites ret käsu. See juhis otsib ja eemaldab virnast sobiva tagastusaadressi.

Näide helistaja alamprogrammi põhiosast, et kutsuda teist alamprogrammi, mis on 'myFunc', on järgmine (lugege kommentaare):

; Tahad kutsuda funktsiooni 'myFunc', mis võtab kolm
; täisarvuline parameeter. Esimene parameeter on RAX-is.
; Teine parameeter on konstant 456. Kolmas
; parameeter on mälu asukohas 'variabl'

push rdi ; rdi on parameeter, seega salvestage see
; pikk retVal = myFunc (x, 456, z);

mov rdi , rax ; pane esimene parameeter RDI-sse
mov rsi, 456 ; pane RSI-sse teine ​​parameeter
mov rdx , [muutuja] ; pane RDX-i kolmas parameeter

helistage myFuncile; helistage funktsioonile

pop rdi ; taastada salvestatud RDI väärtus
; myFunci tagastusväärtus on nüüd RAX-is saadaval

Callee funktsiooni (myFunc) näide on (lugege kommentaare):

myFunc:
; ∗∗∗ Standardne alamprogrammi proloog ∗∗∗
sub-rsp, 8; ruumi 64-bitise kohaliku muutuja (tulemuse) jaoks, kasutades opkoodi 'alam'.

push rbx ; salvesta helistaja-salvesta registrid
push rbp ; mõlemat kasutab myFunc

; ∗∗∗ Alamrutiin Keha ∗∗∗
mov rax , rdi ; parameeter 1 RAX-ile
mov rbp , rsi ; parameeter 2 RBP-le
mov rbx, rdx; parameeter 3 kuni rb x
mov [rsp + 1 6], rbx; pane rbx kohalikku muutujasse
lisa [rsp + 1 6], rbp; lisage kohalikku muutujasse rbp
mov rax, [rsp +16]; kohaliku muutuja mov sisu RAX-i
; (tagastusväärtus/lõpptulemus)

; ∗∗∗ Standardne alamprogrammi epiloog ∗∗∗
pop rbp ; helistaja salvestamise registrite taastamine
pop rbx ; lükkamisel vastupidine
lisa rsp, 8; kohaliku muutuja(te) eraldamine. 8 tähendab 8 baiti
ret ; pop top väärtus virust , hüppa sinna

6.39 Katkestused ja erandid x64 jaoks

Protsessor pakub programmi täitmise katkestamiseks, katkestusteks ja eranditeks kahte mehhanismi:

  • Katkestus on asünkroonne (võib juhtuda igal ajal) sündmus, mille tavaliselt käivitab I/O-seade.
  • Erandiks on sünkroonne sündmus (toimub koodi käivitamisel, eelprogrammeeritud, mõne sündmuse põhjal), mis genereeritakse, kui protsessor tuvastab käsu täitmisel ühe või mitu eelmääratletud tingimust. Määratletakse kolm erandite klassi: vead, lõksud ja katkestused.

Protsessor reageerib katkestustele ja eranditele sisuliselt samamoodi. Katkestusest või erandist teavitamisel peatab protsessor praeguse programmi või ülesande täitmise ja lülitub käitleja protseduurile, mis on kirjutatud spetsiaalselt katkestuse või erandi tingimuse käsitlemiseks. Protsessor pääseb töötleja protseduurile ligi katkestuse kirjelduse tabelis (IDT) oleva kirje kaudu. Kui töötleja on katkestuse või erandi käsitlemise lõpetanud, tagastatakse programmi juhtimine katkestatud programmile või ülesandele.

Operatsioonisüsteem, juht- ja/või seadmedraiverid käitlevad tavaliselt katkestusi ja erandeid rakendusprogrammidest või ülesannetest sõltumatult. Rakendusprogrammid pääsevad aga juurde operatsioonisüsteemi integreeritud katkestuste ja erandite töötlejatele või käivitavad seda montaažikeelsete kõnede kaudu.

Määratletakse kaheksateist (18) eelnevalt määratletud katkestust ja erandit, mis on seotud IDT kirjetega. Samuti saab teha ja tabeliga seostada kakssada kakskümmend neli (224) kasutaja määratud katkestust. Iga katkestus ja erand IDT-s on identifitseeritud numbriga, mida nimetatakse 'vektoriks'. Tabelis 6.39.1 on loetletud katkestused ja erandid IDT kirjetega ja nende vastavad vektorid. Vektorid 0 kuni 8, 10 kuni 14 ja 16 kuni 19 on eelmääratletud katkestused ja erandid. Vektorid 32 kuni 255 on mõeldud tarkvara poolt määratletud katkestuste (kasutaja) jaoks, mis on kas tarkvara katkestuste või maskeeritavate riistvarakatkestuste jaoks.

Kui protsessor tuvastab katkestuse või erandi, teeb see üht järgmistest toimingutest.

  • Käivitage töötleja protseduuri kaudne kutse
  • Käivitage töötleja ülesande kaudne kutse

6.4 64-bitise ARM-i arvutiarhitektuuri põhitõed

ARM-i arhitektuurid määratlevad RISC-protsessorite perekonna, mis sobivad kasutamiseks paljudes erinevates rakendustes. ARM on laadimis-/salvestamisarhitektuur, mis nõuab andmete laadimist mälust registrisse, enne kui sellega saab toimuda mis tahes töötlemine, näiteks ALU (aritmeetiline loogikaüksus). Järgmine käsk salvestab tulemuse tagasi mällu. Kuigi see võib tunduda samm tagasi x86- ja x64-arhitektuurist, mis töötavad otse mälus olevatele operandidele ühe käsuga (kasutades muidugi protsessoriregistreid), võimaldab laadimis-/salvestamisviis praktikas mitmeid järjestikuseid toiminguid. mida teostatakse suurel kiirusel operandil, kui see on laaditud ühte paljudest protsessoriregistritest. ARM-protsessoritel on väikese või suure lõpu valik. ARM 64 vaikesäte on väike, mis on konfiguratsioon, mida operatsioonisüsteemid tavaliselt kasutavad. 64-bitine ARM-arhitektuur on kaasaegne ja on seatud asendama 32-bitist ARM-i arhitektuuri.

Märge : 64-bitise ARM µP iga käsk on 4 baiti (32 bitti) pikk.

6.41 64-bitine ARM-i registrikomplekt
64-bitise ARM µP jaoks on 64-bitisel registril 31 üldist eesmärki. Järgmine diagramm näitab üldotstarbelisi registreid ja mõningaid olulisi registreid:


Joon.4.11.1 64-bitine üldeesmärk ja mõned olulised registrid

Üldotstarbelistele registritele viidatakse kui X0 kuni X30. Iga registri esimest 32-bitist osa nimetatakse W0 kuni W30. Kui 32 biti ja 64 biti erinevust ei rõhutata, kasutatakse eesliidet 'R'. Näiteks R14 tähistab W14 või X14.

6502 µP-l on 16-bitine programmiloendur ja see suudab käsitleda 2 16 mälubaitide asukohad. 64-bitisel ARM µP-l on 64-bitine programmiloendur ja see suudab adresseerida kuni 2 64 = 1,844674407 x 1019 (tegelikult 18 446 744 073 709 551 616) mälubaitide asukohti. Programmi loendur hoiab järgmise täidetava käsu aadressi. ARM64 või AArch64 käsu pikkus on tavaliselt neli baiti. Protsessor suurendab seda registrit automaatselt nelja võrra pärast iga käsu toomist mälust.

Stack Pointer register ehk SP ei kuulu 31 üldotstarbelise registri hulka. Mis tahes arhitektuuri pinukursor osutab mälu viimasele pinu kirjele. ARM-64 puhul kasvab virn allapoole.

6502 µP-l on 8-bitine protsessori olekuregister. ARM64 ekvivalenti nimetatakse PSTATE registriks. See register salvestab lipud, mida kasutatakse toimingute tulemuste ja protsessori juhtimiseks (µP). See on 32 bitti lai. Järgmises tabelis on PSTATE registris tavaliselt kasutatavate bittide nimed, indeks ja tähendused:

Tabel 6.41.1
Enim kasutatud PSTATE lipud (bitid)
Sümbol Natuke Eesmärk
M 0-3 Režiim: praegune täitmisõiguse tase (USR, SVC ja nii edasi).
T 4 Pöial: see määratakse, kui käsukomplekt T32 (Pöial) on aktiivne. Kui see on selge, on ARM-i käsukomplekt aktiivne. Kasutajakood saab selle biti määrata ja kustutada.
JA 9 Endianness: selle biti määramine lubab suure lõpu režiimi. Kui see on selge, on väikese lõpu režiim aktiivne. Vaikimisi on väikese lõpu režiim.
K 27 Kumulatiivne küllastuslipp: see määratakse, kui operatsioonide seerias tekib mingil hetkel ületäitumine või küllastumine
IN 28 Ülevoolu lipp: see määratakse, kui toiming põhjustas allkirjastatud ületäitumise.
C 29 Kandelipp: see näitab, kas liitmine andis ülekande või lahutamine laenu.
KOOS 30 Nulli lipp: see määratakse, kui toimingu tulemus on null.
N 31 Negatiivne lipp: see määratakse, kui toimingu tulemus on negatiivne.

ARM-64 µP-l on palju muid registreid.

SIMD
SIMD tähistab ühtset juhist, mitut andmeid. See tähendab, et üks montaažikeele käsk võib ühes mikroprotsessoris korraga toimida mitmele andmele. SIMD- ja ujukomaoperatsioonide jaoks on olemas kolmkümmend kaks 128 biti laiust registrit.

6.42 Mälu kaardistamine
RAM ja DRAM on mõlemad muutmälu. DRAM töötab aeglasemalt kui RAM. DRAM on odavam kui RAM. Kui mälus on rohkem kui 32 gigabaiti (GB) jätkuvat DRAM-i, tekib rohkem mäluhaldusprobleeme: 32 GB = 32 x 1024 x 1024 x 1024 baiti. Kui kogu mäluruum on palju suurem kui 32 GB, tuleks parema mäluhalduse huvides üle 32 GB mahuga DRAM-i vahele segada RAM-id. ARM-64 mälukaardi mõistmiseks peaksite kõigepealt mõistma 32-bitise ARM-i keskprotsessori (CPU) 4 GB mälukaarti. CPU tähendab µP. 32-bitise arvuti puhul on maksimaalne adresseeritav mäluruum 2 32 = 4 x 2 10 x 2 10 x 2 10 = 4 x 1024 x 1024 x 1024 = 4 294 967 296 = 4 GB.

32-bitine ARM-i mälukaart
32-bitise ARM-i mälukaart on järgmine:

32-bitise arvuti puhul on kogu mälu maksimaalne maht 4 GB. Alates 0 GB aadressist kuni 1 GB aadressini on ROM-i operatsioonisüsteem, RAM ja I/O asukohad. Kogu ROM OS-i, RAM-i ja I/O-aadresside idee sarnaneb Commodore-64 olukorraga koos võimaliku 6502 protsessoriga. Commodore-64 operatsioonisüsteemi ROM asub mäluruumi ülaosas. Siinne ROM OS on palju suurem kui Commodore-64 oma ja asub kogu mälu aadressiruumi alguses. Võrreldes teiste kaasaegsete arvutitega, on siinne ROM OS täielik selles mõttes, et see on võrreldav nende kõvaketaste OS-i hulgaga. OS-i olemasolul ROM-i integraallülitustes on kaks peamist põhjust: 1) ARM-protsessoreid kasutatakse enamasti väikestes seadmetes, näiteks nutitelefonides. Paljud kõvakettad on suuremad kui nutitelefonid ja muud väikesed seadmed, 2) turvalisuse huvides. Kui OS on kirjutuskaitstud mälus, ei saa häkkerid seda rikkuda (osad üle kirjutada). RAM-i sektsioonid ja sisend/väljundi sektsioonid on samuti väga suured võrreldes Commodore-64 omadega.

Kui toide on sisse lülitatud 32-bitise ROM OS-iga, peab OS algama (käivitama) aadressilt 0x00000000 või 0xFFFF0000 aadressilt, kui HiVEC on lubatud. Seega, kui pärast lähtestamisfaasi toide sisse lülitatakse, laadib CPU riistvara programmiloendurisse 0x00000000 või 0xFFFF0000. '0x' eesliide tähendab kuueteistkümnendsüsteemi. ARMv8 64-bitiste protsessorite alglaadimisaadress on määratletud teostus. Autor soovitab arvutiinseneril aga tagasiühilduvuse huvides alustada väärtusest 0x00000000 või 0xFFFF0000.

1 GB kuni 2 GB on kaardistatud sisend/väljund. Kaardistatud I/O ja lihtsalt I/O vahel on erinevus 0 GB ja 1 GB vahel. I/O puhul on iga pordi aadress fikseeritud nagu Commodore-64 puhul. Vastandatud I/O puhul ei pruugi iga pordi aadress olla arvuti iga toimingu jaoks sama (dünaamiline).

2 GB kuni 4 GB on DRAM. See on eeldatav (või tavaline) RAM. DRAM tähistab dünaamilist RAM-i, mitte aadressi muutumise tähendust arvuti töötamise ajal, vaid selles mõttes, et füüsilise RAM-i iga lahtri väärtust tuleb iga taktimpulsi korral värskendada.

Märge :

  • Alates 0x0000 0000 kuni 0x0000 on FFFF OS-i ROM.
  • Alates 0x0001 0000 kuni 0x3FFF, FFFF võib olla rohkem ROM-i, seejärel RAM-i ja seejärel natuke I/O-d.
  • Alates 0x4000 0000 kuni 0x7FFF,FFFF on lubatud täiendav I/O ja/või kaardistatud I/O.
  • Alates 0x8000 0000 kuni 0xFFFF on oodatav DRAM FFFF.

Need tähendavad, et eeldatav DRAM ei pea praktikas algama 2 GB mälupiirist. Miks peaks programmeerija austama ideaalseid piire, kui pole piisavalt füüsilisi RAM-i, mis on emaplaadile paigutatud? Seda seetõttu, et kliendil ei jätku raha kõigi RAM-i pankade jaoks.

36-bitine ARM-i mälukaart
64-bitise ARM-arvuti puhul kasutatakse kõiki 32 bitti kogu mälu adresseerimiseks. 64-bitise ARM-arvuti puhul saab esimest 36 bitti kasutada kogu mälu adresseerimiseks, mis antud juhul on 2 36 = 68 719 476 736 = 64 GB. Sellest on juba palju mälu. Tavalised arvutid ei vaja tänapäeval sellist mälumahtu. See ei ületa veel maksimaalset mäluvahemikku, millele pääseb juurde 64 bitti. ARM-protsessori 36-bitise mälukaart on järgmine:

Alates 0 GB aadressist kuni 4 GB aadressini on 32-bitine mälukaart. 'Reserveeritud' tähendab, et seda ei kasutata ja seda hoitakse edaspidiseks kasutamiseks. Need ei pea olema füüsilised mälupangad, mis on selle ruumi jaoks emaplaadile ühendatud. Siin on DRAM-il ja vastendatud I/O-l samad tähendused, mis 32-bitise mälukaardi puhul.

Praktikas võib ilmneda järgmine olukord:

  • 0x1 0000 0000 – 0x3 FFFF FFFF; reserveeritud. 12 GB aadressiruumi on reserveeritud edaspidiseks kasutamiseks.
  • 0x4 0000 0000 – 0x7 FFFF FFFF; kaardistatud I/O. Dünaamiliselt kaardistatud I/O jaoks on saadaval 16 GB aadressiruumi.
  • 0x8 0000 0000 – 0x8 7FFF FFFF FFFF; Auk või DRAM. 2 GB aadressiruumi võib sisaldada ühte järgmistest:
    • Auk DRAM-seadme partitsioonide lubamiseks (nagu on kirjeldatud järgmises arutelus).
    • DRAM.
  • 0x8 8000 0000 – 0xF FFFF FFFF; DRAM. 30 GB aadressiruumi DRAM-i jaoks.

See mälukaart on 32-bitise aadressikaardi superkomplekt, mille lisaruum on jagatud 50% DRAM-iks (1/2) koos valikulise auguga ning 25% kaardistatud I/O ruumi ja reserveeritud ruumiga (1/4). ). Ülejäänud 25% (1/4) on 32-bitise mälukaardi jaoks ½ + ¼ + ¼ = 1.

Märge : 32 bitist 360 bitti on 4 biti lisamine 36 biti kõige olulisemale poolele.

40-bitine mälukaart
40-bitine aadressikaart on 36-bitise aadressikaardi superkomplekt ja järgib sama mustrit: 50% DRAM-i valikulisest august, 25% vastendatud I/O ruumist ja reserveeritud ruumist ning ülejäänud 25% ulatuses. ruumi eelmise mälukaardi jaoks (36-bitine). Mälukaardi diagramm on järgmine:

Ava suurus on 544 – 512 = 32GB. Praktikas võib ilmneda järgmine olukord:

  • 0x10 0000 0000 – 0x3F FFFF FFFF; reserveeritud. 192 GB aadressiruumi on reserveeritud edaspidiseks kasutamiseks.
  • 0x40 0000 0000 – 0x7F FFFF FFFF; kaardistatud. I/O Dünaamiliselt kaardistatud I/O jaoks on saadaval 256 GB aadressiruumi.
  • 0x80 0000 0000 – 0x87 FFFF FFFF; auk või DRAM. 32 GB aadressiruum võib sisaldada ühte järgmistest:
    • Auk DRAM-seadme partitsioonide lubamiseks (nagu on kirjeldatud järgmises arutelus)
    • DRAM
  • 0x88 0000 0000 – 0xFF FFFF FFFF; DRAM. 480 GB aadressiruumi DRAM-i jaoks.

Märge : 36 bitist 40 bitti on 4 biti lisamine 36 biti kõige olulisemale poolele.

DRAM-i auk
Üle 32-bitise mälukaardi puhul on see kas DRAM-i auk või DRAM-i jätk ülalt. Kui see on auk, tuleb seda hinnata järgmiselt: DRAM-i auk võimaldab jagada suur DRAM-seade mitmeks aadressivahemikuks. Valikuline DRAM-i auk on pakutud kõrgema DRAM-i aadressipiiri alguses. See võimaldab lihtsustatud dekodeerimisskeemi, kui jagatakse suure mahutavusega DRAM-seade alumises füüsiliselt adresseeritud piirkonnas.

Näiteks 64 GB DRAM-i osa jagatakse kolmeks piirkonnaks, mille aadressi nihked teostatakse lihtsa lahutamise teel kõrge järgu aadressibittides järgmiselt:

Tabel 6.42.1
Näide 64 GB DRAM-i aukudega jaotusest
Füüsilised aadressid SoC-s Nihe Sisemine DRAM-i aadress
2 GB (32-bitine kaart) 0x00 8000 0000 – 0x00 FFFF FFFF -0x00 8000 0000 0x00 0000 0000 – 0x00 7FFF FFF
30 GB (36-bitine kaart) 0x08 8000 0000 – 0x0F FFFF FFFF -0x08 0000 0000 0x00 8000 0000 – 0x07 FFFF FFFF
32 GB (40-bitine kaart) 0x88 0000 0000 – 0x8F FFFF FFFF -0x80 0000 0000 0x08 0000 0000 – 0x0F FFFF FFFF

Pakutud 44-bitised ja 48-bitised adresseeritud mälukaardid ARM-protsessoritele
Oletame, et personaalarvutil on 1024 GB (= 1 TB) mälu; see on liiga palju mälu. Seega on 44-bitised ja 48-bitised adresseeritud mälukaardid ARM-protsessorite jaoks vastavalt 16 TB ja 256 TB jaoks vaid ettepanekud tulevaste arvutivajaduste jaoks. Tegelikult järgivad need ARM-protsessorite ettepanekud sama mälu jaotust suhte järgi nagu eelmised mälukaardid. See tähendab: 50% DRAM-i, milles on valikuline auk, 25% kaardistatud I/O-ruumi ja reserveeritud ruumi ning ülejäänud 25% ruumi eelmise mälukaardi jaoks.

52-bitised, 56-bitised, 60-bitised ja 64-bitised adresseeritud mälukaardid tuleb ARM 64 bittide jaoks kaugemasse tulevikku veel välja pakkuda. Kui teadlased peavad tol ajal kogu mäluruumi 50 : 25 : 25 jaotamist kasulikuks, säilitavad nad suhte.

Märge : SoC tähistab süsteemi kiibil, mis viitab µP kiibi ahelatele, mida muidu seal poleks olnud.

SRAM ehk staatiline muutmälu on kiirem kui traditsioonilisem DRAM, kuid vajab rohkem ränipinda. SRAM ei vaja värskendamist. Lugeja võib ette kujutada RAM-i kui SRAM-i.

6.43 ARM 64 koostekeele adresseerimisrežiimid
ARM on laadimis-/salvestamisarhitektuur, mis nõuab andmete laadimist mälust protsessoriregistrisse, enne kui sellega saab toimuda töötlus, näiteks aritmeetiline loogikaoperatsioon. Järgmine käsk salvestab tulemuse tagasi mällu. Kuigi see võib tunduda samm tagasi x86-st ja selle järgnevatest x64-arhitektuuridest, mis töötavad otse mälus olevatele operandidele ühe käsuga, võimaldab laadimis-/salvestamisviis praktikas teha mitu järjestikust toimingut suurel kiirusel. operandi, kui see on laaditud ühte paljudest protsessoriregistritest.

ARM-i montaažikeele vormingul on sarnasusi ja erinevusi x64 (x86) seeriaga.

  • Nihe : Alusregistrisse saab lisada märgistatud konstandi. Nihe sisestatakse juhendi osana. Näiteks: ldr x0, [rx, #10] laadib r0 koos sõnaga r1+10 aadressil.
  • Registreeri : Registrisse salvestatud märgita juurdekasvu saab baasregistri väärtusele lisada või sellest lahutada. Näiteks: ldr r0, [x1, x2] laadib r0 koos sõnaga x1+x2 aadressil. Kumbagi registrit võib pidada põhiregistriks.
  • Skaleeritud register : Kasv registris nihutatakse vasakule või paremale määratud arvu bitipositsioonide võrra, enne kui see lisatakse või lahutatakse põhiregistri väärtusest. Näiteks: ldr x0, [x1, x2, lsl #3] laadib r0 koos sõnaga r1+(r2×8) aadressil. Nihe võib olla loogiline nihe vasakule või paremale (lsl või lsr), mis lisab tühjadesse bitikohtadesse nulli, või aritmeetiline nihe paremale (asr), mis kordab märgibitti vabanenud positsioonides.

Kui tegemist on kahe operandiga, on sihtkoht enne (vasakul) allikat (sellest on mõned erandid). ARM-i koostekeele opkoodid ei ole tõstutundlikud.

Vahetu ARM64 adresseerimisrežiim
Näide:

mov r0, #0xFF000000 ; Laadige 32-bitine väärtus FF000000h kausta r0

Kümnendväärtus on ilma 0x-ita, kuid sellele eelneb siiski #.

Registreeri otse
Näide:

mov x0, x1 ; Kopeerige x1 kuni x0

Registreeri kaudne
Näide:

str x0, [x3] ; Salvestage x0 aadressile x3

Registreeri kaudne nihkega
Näited:

ldr x0, [x1, #32] ; Laadige r0 väärtusega aadressil [r1+32]; r1 on baasregister
str x0, [x1, #4] ; Salvestage r0 aadressile [r1+4]; r1 on põhiregister; numbrid on 10

Registreeri kaudne nihkega (eelnevalt suurendatud)
Näited:

ldr x0, [x1, #32]! ; Laadige r0 väärtusega [r1+32] ja värskendage r1 väärtusele (r1+32)
str x0, [x1, #4]! ; Salvestage r0 väärtuseks [r1+4] ja värskendage r1 väärtuseks (r1+4)

Pange tähele '!' sümbol.

Registreeri kaudne nihkega (järelekasv)
Näited:

ldr x0, [x1], #32 ; Laadige [x1] väärtusele x0, seejärel värskendage x1 väärtuseks (x1+32)
str x0, [x1], #4; Salvestage x0 väärtuseks [x1], seejärel värskendage x1 väärtuseks (x1+4)

Kahekordne register kaudne
Operandi aadress on baasregistri ja juurdekasvuregistri summa. Registrinimed on ümbritsetud nurksulgudega.
Näited:

ldr x0, [x1, x2] ; Laadige x0 koos [x1+x2]
str x0, [rx, x2] ; Salvestage x0 kuni [x1+x2]

Suhteline adresseerimisrežiim
Suhtelise adresseerimise režiimis on efektiivne käsk programmiloenduri järgmine käsk, millele lisandub indeks. Indeks võib olla positiivne või negatiivne.
Näide:

ldr x0, [pc, #24]

See tähendab koormusregistrit X0 sõnaga, millele viitab arvuti sisu pluss 24.

6.44 Mõned tavaliselt kasutatavad juhised ARM 64 jaoks
Siin on tavaliselt kasutatavad juhised:

6.45 Loopimine

Illustratsioon
Järgmine kood lisab X10 registris oleva väärtuse X9 väärtusele, kuni väärtus X8-s on null. Oletame, et kõik väärtused on täisarvud. X8 väärtus lahutatakse igas iteratsioonis 1-ga:

silmus:
CBZ X8, jäta vahele
ADD X9, X9, X10 ; esimene X9 on sihtkoht ja teine ​​X9 on allikas
SUB X8, X8, #1 ; esimene X8 on sihtkoht ja teine ​​X8 on allikas
B silmus
vahele jätma:

Nagu 6502 µP ja X64 µP puhul, algab märgistus ARM 64 µP rea algusest. Ülejäänud juhised algavad mõne tühikuga pärast rea algust. x64 ja ARM 64 puhul järgneb sildile koolon ja uus rida. Kui 6502 puhul järgneb sildile tühiku järel juhis. Eelmises koodis tähendab esimene käsk, mis on 'CBZ X8, jäta vahele', et kui X8 väärtus on null, jätkake sildiga 'jätke vahele', jättes vahele vahepealsed juhised ja jätkates ülejäänud allolevate juhistega. 'vahele jätma:'. 'B silmus' on tingimusteta hüpe siltusele 'silmus'. Sõna 'silmus' asemel võib kasutada mis tahes muud sildi nime.

Niisiis, nagu 6502 µP puhul, kasutage harujuhiseid, et luua silmus ARM 64-ga.

6.46 ARM 64 sisend/väljund
Kõik ARM-i välisseadmed (sisepordid) on mälukaardistatud. See tähendab, et programmeerimisliides on mäluga adresseeritud registrite (sisemiste portide) kogum. Sellise registri aadress on nihe konkreetse mälu baasaadressi suhtes. See on sarnane sellega, kuidas 6502 teeb sisendit/väljundit. ARM-il pole eraldi I/O aadressiruumi võimalust.

6.47 ARM 64 virn
ARM 64-l on mälu (RAM) virn sarnaselt 6502-l ja x64-l. Kuid ARM64 puhul pole tõuke- ega pop-koodi. ARM 64 virn kasvab ka allapoole. Aadress pinukursoris osutab vahetult pärast virna asetatud viimase väärtuse viimast baiti.

Põhjus, miks ARM64 jaoks puudub üldine pop- või push-opkood, on see, et ARM 64 haldab oma pinu järjestikuste 16-baidiliste rühmadena. Väärtused eksisteerivad aga ühest, kahest, neljast ja kaheksast baidist koosnevates baidirühmades. Seega saab virna paigutada ühe väärtuse ja ülejäänud kohad (baitide asukohad), mis moodustavad 16 baiti, on täidetud näivate baitidega. Selle puuduseks on mälu raiskamine. Parem lahendus on täita 16-baidine asukoht väiksemate väärtustega ja lasta mõnel programmeerijal kirjutada kood, mis jälgib, kust 16-baidise asukoha väärtused pärinevad (registreerib). Seda lisakoodi on vaja ka väärtuste tagasitõmbamiseks. Selle alternatiiviks on täita kaks 8-baidist üldotstarbelist registrit erinevate väärtustega ja seejärel saata kahe 8-baidise registri sisu virna. Siin on ikkagi vaja lisakoodi, et jälgida konkreetseid väikeseid väärtusi, mis virna sisenevad ja sealt lahkuvad.

Järgmine kood salvestab virna neli 4-baidist andmeid:

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

Registrite esimesed neli baiti (w) – x0, x1, x2 ja x3 – saadetakse virna 16 järjestikuse baidi asukohtadesse. Pange tähele 'str' ​​ja mitte 'push' kasutamist. Pange tähele iga juhise lõpus olevat hüüumärki. Kuna mälupinn kasvab allapoole, algab esimene neljabaidine väärtus positsioonist, mis on miinus-neli baiti eelmisest pinu osuti asukohast madalam. Ülejäänud neljabaidised väärtused järgnevad allapoole. Järgmine koodisegment teeb nelja baidi hüppamise õige (ja järjekorras) ekvivalendi:

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

Pange tähele ldr opkoodi kasutamist popi asemel. Pange tähele ka seda, et siin ei kasutata hüüumärki.

Kõik X0 (8 baiti) ja X1 (8 baiti) baidid saab saata virna 16-baidisesse asukohta järgmiselt:

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

Sel juhul pole x2 (w2) ja x3 (w3) registreid vaja. Kõik otsitavad baidid on X0 ja X2 registrites. Pange tähele stp opkoodi registri sisu paaride RAM-i salvestamiseks. Pange tähele ka hüüumärki. Popi ekvivalent on:

ldp x0, x1, [sp], #0

Sellel juhisel pole hüüumärki. Kahe järjestikuse andmekoha laadimiseks mälust kahte µP registrisse pange tähele opkoodi LDP, mitte LDR. Samuti pidage meeles, et mälust µP registrisse kopeerimine on laadimine, mida ei tohi segi ajada faili laadimisega kettalt RAM-i, ja kopeerimine µP registrist RAM-i on salvestamine.

6.48 Alamprogramm
Alamprogramm on koodiplokk, mis täidab ülesande, tuginedes valikuliselt mõnele argumendile ja soovi korral tagastab tulemuse. Kokkuleppeliselt kasutatakse R0 kuni R3 registreid (neli registrit) argumentide (parameetrite) edastamiseks alamprogrammile ja R0 kasutatakse tulemuse edastamiseks helistajale. Alamprogramm, mis vajab rohkem kui 4 sisendit, kasutab täiendavate sisendite jaoks pinu. Alamprogrammi kutsumiseks kasutage linki või tingimuslikku haru käsku. Linkimisjuhise süntaks on:

BL silt

Kus BL on opkood ja silt tähistab alamprogrammi algust (aadressi). See haru on tingimusteta, edasi või tagasi 128 MB ulatuses. Tingimusliku haru käsu süntaks on:

B.cond etikett

Kus kond on tingimus, nt eq (võrdne) või ne (mitte võrdne). Järgmisel programmil on alamprogramm doadd, mis lisab kahe argumendi väärtused ja tagastab tulemuse R0:

PIIRKOND, KOOD, READONLY ; Nimetage see koodiplokk
SISSEpääs ; Märkige esimene käivitamisjuhis
käivita MOV r0, #10 ; Seadistage parameetrid
MOV r1, nr 3
BL doadd ; Helista alamprogrammile
stop MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SVC # 0x123456 ; ARM-i poolmajutus (endine SWI)
doadd ADD r0, r0, r1 ; Alamprogrammi kood
BX lr ; Alamprogrammist naasmine
;
LÕPP ; Märkige faili lõpp

Lisatavad numbrid on kümnendkohad 10 ja kümnendkohad 3. Selle koodiploki (programmi) kahte esimest rida selgitatakse hiljem. Järgmised kolm rida saadavad 10 registrisse R0 ja 3 registrisse R1 ning kutsuvad välja ka doadd alamprogrammi. Doadd on silt, mis sisaldab alamprogrammi alguse aadressi.

Alamprogramm koosneb vaid kahest reast. Esimene rida lisab R-i sisu 3-le R0 sisule 10, mis võimaldab tulemuseks 13 R0-s. Teine rida BX opkoodi ja LR operandiga naaseb alamprogrammist helistaja koodi.

ÕIGE
RET opkood ARM 64-s käsitleb endiselt alamprogrammi, kuid töötab erinevalt RTS-ist 6502-s või RET-ist x64-s või kombinatsioonist BX LR ARM 64-s. ARM 64-s on RET-i süntaks järgmine:

SIRGE {Xn}

See käsk annab programmile võimaluse jätkata alamprogrammiga, mis ei ole helistaja alamprogramm, või lihtsalt jätkata mõne muu käsu ja sellele järgneva koodilõiguga. Xn on üldotstarbeline register, mis sisaldab aadressi, kuhu programm peaks jätkama. See juhend hargneb tingimusteta. Kui Xn ei ole antud, on vaikimisi X30 sisu.

Protseduurikutse standard
Kui programmeerija soovib, et tema kood suhtleks kellegi teise kirjutatud koodiga või kompilaatori poolt toodetud koodiga, peab programmeerija isiku või kompilaatori kirjutajaga kokku leppima registri kasutamise reeglid. ARM-i arhitektuuri puhul nimetatakse neid reegleid protseduurikõne standardiks või PCS-iks. Need on kahe või kolme osapoole vahelised kokkulepped. PCS määrab järgmist:

  • Milliseid µP registreid kasutatakse argumentide edastamiseks funktsiooni (alamprogrammi)
  • Milliseid µP registreid kasutatakse tulemuse tagastamiseks funktsioonile, mis helistab ja mida nimetatakse helistajaks
  • Milline µP registreerib väljakutsutava funktsiooni, mida nimetatakse kutsutavaks, võib rikkuda
  • Milline µP helistaja registreerib, ei saa rikkuda

6.49 Katkestused
ARM-protsessori jaoks on saadaval kahte tüüpi katkestuskontrolleri ahelaid:

  • Standardne katkestuskontroller: Katkestuste töötleja määrab, milline seade vajab hooldust, lugedes katkestuse kontrolleris oleva seadme bitmap registri.
  • Vector Interrupt Controller (VIC): seab katkestused prioriteediks ja lihtsustab katkestuse põhjustanud seadme määramist. Pärast prioriteedi ja töötleja aadressi seostamist iga katkestusega kinnitab VIC protsessorile katkestussignaali ainult siis, kui uue katkestuse prioriteet on kõrgem kui hetkel töötaval katkestuse käitlejal.

Märge : Erand viitab veale. 32-bitise ARM-arvuti vektorkatkestuse kontrolleri üksikasjad on järgmised (64-bitine on sarnane):

Tabel 6.49.1
ARM-vektori erand/katkestus 32-bitise arvuti jaoks
Erand/katkestus Lühike käsi Aadress Kõrge aadress
Lähtesta RESET 0x00000000 0xffff0000
Määratlemata juhend UNDEF 0x00000004 0xffff0004
Tarkvara katkestus SWI 0x00000008 0xffff0008
Eellaadimise katkestamine pabt 0x0000000C 0xffff000C
Abordi kuupäev DABT 0x00000010 0xffff0010
Reserveeritud 0x00000014 0xffff0014
Katkestamise taotlus IRQ 0x00000018 0xffff0018
Kiire katkestuse taotlus FIQ 0x0000001C 0xffff001C

See näeb välja nagu 6502 arhitektuuri paigutus NMI , BR , ja IRQ võivad olla viited lehel null ja vastavad rutiinid on mälus (ROM OS) kõrgel. Eelmise tabeli ridade lühikirjeldused on järgmised:

RESET
See juhtub protsessori sisselülitamisel. See lähtestab süsteemi ja seadistab virnad erinevate protsessorirežiimide jaoks. See on kõrgeima prioriteediga erand. Lähtestamishaldurisse sisenemisel on CPSR SVC-režiimis ja nii IRQ kui ka FIQ bitid on seatud väärtusele 1, varjates kõik katkestused.

ABORTI KUUPÄEV
Teine kõrgeim prioriteet. See juhtub siis, kui proovime lugeda/kirjutada valesse aadressi või pääseda juurde valele juurdepääsuloale. Andmete katkestamise töötlejasse sisenemisel keelatakse IRQ-d (I-biti komplekt 1) ja FIQ on lubatud. IRQ-d on maskeeritud, kuid FIQ-d hoitakse maskeerimata.

FIQ
Kõrgeima prioriteediga katkestus, IRQ ja FIQ, on keelatud seni, kuni FIQ on käsitletud.

IRQ
Kõrge prioriteediga katkestus, IRQ-käsitleja, sisestatakse ainult siis, kui käimasolevat FIQ- ja andmekatkestust ei toimu.

Eeltoomise katkestamine
See sarnaneb andmete katkestamisega, kuid juhtub aadressi toomise tõrke korral. Töötlejasse sisenemisel on IRQ-d keelatud, kuid FIQ-d jäävad lubatuks ja võivad juhtuda eelhankimise katkestamise ajal.

SWI
Tarkvarakatkestuse (SWI) erand ilmneb siis, kui SWI käsk täidetakse ja ühtegi teist kõrgema prioriteediga erandit pole märgitud.

Määratlemata juhend
Määratlemata käsu erand ilmneb siis, kui käsk, mis ei ole käsukomplektis ARM või Thumb, jõuab konveieri täitmisfaasi ja ühtegi teist erandit pole märgistatud. See on sama prioriteet kui SWI, kui üks kord võib juhtuda. See tähendab, et täidetav käsk ei saa olla korraga nii SWI-käsk kui ka määratlemata käsk.

ARM-i erandi käsitlemine
Erandi korral ilmnevad järgmised sündmused:

  • Salvestage CPSR erandrežiimi SPSR-i.
  • Arvuti on salvestatud erandrežiimi LR-i.
  • Linkide register seatakse kehtiva juhise alusel konkreetsele aadressile. Näiteks: ISR puhul LR = viimati täidetud käsk + 8.
  • Värskendage CPSR-i erandi kohta.
  • Määrake arvuti erandikäsitleja aadressile.

6.5 Juhised ja andmed

Andmed viitavad muutujatele (siltidele nende väärtustega) ning massiividele ja muudele massiiviga sarnastele struktuuridele. String on nagu märkide massiiv. Täisarvude massiivi on näha ühes eelmistest peatükkidest. Juhised viitavad opkoodidele ja nende operandidele. Programmi saab kirjutada opkoodide ja andmetega, mis on segatud ühes jätkumälu osas. Sellel meetodil on puudusi, kuid see pole soovitatav.

Kõigepealt tuleks kirjutada programm koos juhistega, seejärel andmetega (mitmus datum on andmed). Juhiste ja andmete vahe võib olla vaid mõni bait. Programmi puhul võivad nii juhised kui ka andmed olla mälus ühes või kahes eraldi jaotises.

6.6 Harvardi arhitektuur

Üks varasemaid arvuteid kannab nime Harvard Mark I (1944). Range Harvardi arhitektuur kasutab programmi juhiste jaoks ühte aadressiruumi ja andmete jaoks erinevat eraldi aadressiruumi. See tähendab, et on kaks eraldi mälu. Järgmine näitab arhitektuuri:


Joonis 6.71 Harvardi arhitektuur

Juhtseade dekodeerib juhised. Aritmeetiline loogikaüksus (ALU) teeb aritmeetilisi toiminguid kombineeritud loogikaga (väravad). ALU teeb ka loogilisi toiminguid (nt nihutamine).

Mikroprotsessoriga 6502 läheb käsk kõigepealt mikroprotsessorile (juhtplokile), enne kui nullpunkt (andmete ainsus) läheb µP registrisse, enne kui nad omavahel suhtlevad. Selleks on vaja vähemalt kahte taktimpulssi ja see ei ole samaaegne juurdepääs käsule ja nullpunktile. Teisest küljest pakub Harvardi arhitektuur samaaegset juurdepääsu juhistele ja andmetele, kusjuures nii käsk kui ka nullpunkt sisenevad samaaegselt µP-sse (opkood juhtseadmesse ja nullpunkt µP registrisse), salvestades vähemalt ühe taktimpulsi. See on paralleelsuse vorm. Seda paralleelsuse vormi kasutatakse tänapäevaste emaplaatide riistvara vahemälus (vt järgmist arutelu).

6.7 Vahemälu

Vahemälu (RAM) on suure kiirusega mälupiirkond (võrreldes põhimälu kiirusega), mis salvestab ajutiselt programmijuhised või andmed edaspidiseks kasutamiseks. Vahemälu töötab kiiremini kui põhimälu. Tavaliselt tuuakse need juhised või andmeüksused hiljutisest põhimälust ja neid läheb tõenäoliselt peagi uuesti vaja. Vahemälu esmane eesmärk on kiirendada korduvat juurdepääsu samadele põhimälu asukohtadele. Tõhususe tagamiseks peab vahemällu salvestatud üksustele juurdepääs olema oluliselt kiirem kui juhiste või andmete algallikale juurdepääs, mida nimetatakse tugipoeks.

Kui vahemälu on kasutusel, algab iga põhimälu asukohale juurdepääsu katse vahemälu otsinguga. Kui soovitud üksus on olemas, otsib protsessor selle kohe välja ja kasutab seda. Seda nimetatakse vahemälu tabamuseks. Kui vahemälu otsing ebaõnnestub (vahemälust puudu), tuleb käsk või andmeüksus hankida tagavarasalvest (põhimälust). Taotletud üksuse allalaadimise käigus lisatakse koopia vahemällu eeldatavaks lähitulevikuks kasutamiseks.

Mälu haldusüksus
Mäluhaldusüksus (MMU) on ahel, mis haldab põhimälu ja sellega seotud mäluregistreid emaplaadil. Varem oli see emaplaadil eraldi integraallülitus; kuid tänapäeval on see tavaliselt mikroprotsessori osa. MMU peaks haldama ka vahemälu (vooluahelat), mis on samuti tänapäeval mikroprotsessori osa. Vahemäluahel oli minevikus eraldi integraallülitus.

Staatiline RAM
Staatilisel RAM-il (SRAM) on oluliselt kiirem juurdepääsuaeg kui DRAM-il, ehkki oluliselt keerukama vooluahela arvelt. SRAM-i bitielemendid võtavad integraallülitusplaadil palju rohkem ruumi kui DRAM-seadme rakud, mis on võimelised salvestama samaväärset kogust andmeid. Põhimälu (RAM) koosneb tavaliselt DRAM-ist (dünaamiline RAM).

Vahemälu parandab arvuti jõudlust, kuna paljudel operatsioonisüsteemide ja rakenduste käivitatavatel algoritmidel on viitekoht. Viitepaik viitab hiljuti kasutatud andmete taaskasutamisele. Seda nimetatakse ajaliseks paikkonnaks. Kaasaegsel emaplaadil on vahemälu mikroprotsessoriga samas integraallülituses. Põhimälu (DRAM) on kaugel ja sellele pääseb ligi busside kaudu. Viitepaik viitab ka ruumilisele paikkonnale. Ruumiline asukoht on seotud füüsilise läheduse tõttu suurema andmete juurdepääsu kiirusega.

Reeglina on vahemälu piirkonnad väikesed (baitide asukohtade arvu poolest) võrreldes tagavarasalvega (põhimälu). Vahemäluseadmed on loodud maksimaalse kiirusega, mis tähendab üldiselt, et need on keerulisemad ja biti kohta kulukamad kui tugisalves kasutatav andmesalvestustehnoloogia. Piiratud suuruse tõttu kipuvad vahemälu seadmed kiiresti täituma. Kui vahemälus ei ole vaba asukohta uue kirje salvestamiseks, tuleb vanem kirje ära visata. Vahemälu kontroller kasutab vahemälu asendamise poliitikat, et valida, milline vahemälu kirje uue kirjega üle kirjutatakse.

Mikroprotsessori vahemälu eesmärk on maksimeerida vahemälu tabamuste protsenti aja jooksul, tagades nii kõrgeima püsiva käsu täitmise kiiruse. Selle eesmärgi saavutamiseks peab vahemällu salvestamise loogika määrama, millised juhised ja andmed paigutatakse vahemällu ja säilitatakse lähituleviku kasutamiseks.

Protsessori vahemällu salvestamise loogika ei taga, et vahemällu salvestatud andmeüksust hakatakse kunagi uuesti kasutama, kui see on vahemällu sisestatud.

Vahemällu salvestamise loogika tugineb tõenäosusele, et ajalise (ajas korduva) ja ruumilise (ruumilise) lokaalsuse tõttu on väga hea võimalus, et vahemällu salvestatud andmetele pääsetakse ligi lähitulevikus. Kaasaegsete protsessorite praktilistes rakendustes esinevad vahemälu tabamused tavaliselt 95–97 protsendil mälupöördustest. Kuna vahemälu latentsusaeg moodustab DRAM-i latentsusest väikese osa, suurendab vahemälu kõrge tabamusmäär võrreldes vahemäluvaba disainiga oluliselt jõudlust.

Teatav paralleelsus vahemäluga
Nagu varem mainitud, on hea mälus oleva programmi juhised andmetest eraldatud. Mõnes vahemälusüsteemis on vahemäluahel protsessori 'vasakul' ja teine ​​vahemäluahel on protsessori 'paremal' küljel. Vasak vahemälu haldab programmi (või rakenduse) juhiseid ja parem vahemälu sama programmi (või sama rakenduse) andmeid. See toob kaasa parema kiiruse suurenemise.

6.8 Protsessid ja lõimed

Nii CISC- kui ka RISC-arvutitel on protsessid. Tarkvaras on protsess. Töötav (käitav) programm on protsess. Operatsioonisüsteemiga on kaasas oma programmid. Arvuti töötamise ajal töötavad ka operatsioonisüsteemi programmid, mis võimaldavad arvutil töötada. Need on operatsioonisüsteemi protsessid. Kasutaja või programmeerija saab ise programme kirjutada. Kui kasutaja programm töötab, on see protsess. Pole vahet, kas programm on kirjutatud assemblerkeeles või kõrgetasemelises keeles nagu C või C++. Kõiki protsesse (kasutaja või OS) haldab teine ​​protsess, mida nimetatakse ajakavandajaks.

Lõim on nagu protsessi kuuluv alamprotsess. Protsess võib alata ja lõimedeks jaguneda ning jätkub siis ikkagi ühe protsessina. Lõimedeta protsessi võib pidada põhilõimeks. Protsesse ja nende lõime haldab sama planeerija. Planeerija ise on programm, kui see on OS-i ketta elanik. Mälus töötades on planeerija protsess.

6.9 Mitmekordne töötlemine

Lõime hallatakse peaaegu nagu protsesse. Mitmiktöötlus tähendab mitme protsessi samaaegset käitamist. On arvuteid, millel on ainult üks mikroprotsessor. On arvuteid, millel on rohkem kui üks mikroprotsessor. Ühe mikroprotsessori puhul kasutavad protsessid ja/või lõimed ühte ja sama mikroprotsessorit interleaving (või ajalõikamise) viisil. See tähendab, et protsess kasutab protsessorit ja peatub ilma lõpetamata. Teine protsess või lõim kasutab protsessorit ja peatub ilma viimistlemata. Seejärel kasutab teine ​​protsess või lõim mikroprotsessorit ja peatub ilma viimistlemata. See jätkub seni, kuni kõik protsessid ja lõimed, mille ajakava seadis järjekorda, on saanud protsessori osa. Seda nimetatakse samaaegseks mitmetöötluseks.

Kui mikroprotsessoreid on rohkem kui üks, toimub paralleelne mitmetöötlus, mitte samaaegsus. Sel juhul käitab iga protsessor teatud protsessi või lõime, mis erineb sellest, mida teine ​​protsessor töötab. Kõik samal emaplaadil olevad protsessorid käitavad oma erinevaid protsesse ja/või erinevaid lõime samaaegselt paralleelselt multitöötluses. Paralleelsel mitmiktöötlusel olevaid protsesse ja lõime haldab endiselt planeerija. Paralleelne multitöötlus on kiirem kui samaaegne mitmetöötlus.

Siinkohal võib lugeja küsida, kuidas paralleelne töötlemine on kiirem kui samaaegne töötlemine. Põhjus on selles, et protsessorid jagavad (peavad kasutama eri aegadel) sama mälu ja sisend/väljundporte. Noh, vahemälu kasutamisega on emaplaadi üldine töö kiirem.

6.10 Lehitsemine

Mäluhaldusüksus (MMU) on mikroprotsessori lähedal või mikroprotsessori kiibis olev vooluahel. See käsitleb mälukaarti või lehitsemist ja muid mäluprobleeme. Ei 6502 µP ega Commodore-64 arvutil ei ole iseenesest MMU-d (kuigi Commodore-64-s on veel mäluhaldus). Commodore-64 haldab mälu lehitsedes, kus iga lehekülg on 256 10 baiti pikk (100 16 baiti pikk). Mälu haldamine lehitsemise teel ei olnud talle kohustuslik. Sellel võib ikkagi olla lihtsalt mälukaart ja seejärel programmid, mis sobivad nende erinevatele määratud aladele. Noh, saalemine on üks viis tõhusaks mälukasutuseks ilma paljude mälusektsioonideta, millel pole andmeid või programmi.

Arvuti arhitektuur x86 386 ilmus 1985. aastal. Aadressi siini laius on 32 bitti. Niisiis, kokku 2 32 = 4 294 967 296 aadressiruum on võimalik. See aadressiruum on jagatud 1 048 576 leheküljeks = 1 024 KB lehtedeks. Selle lehekülgede arvu juures koosneb üks leht 4096 baidist = 4 KB. Järgmine tabel näitab x86 32-bitise arhitektuuri füüsilise aadressi lehti:

Tabel 6.10.1
Füüsiliselt adresseeritavad lehed x86 arhitektuuri jaoks
Alus 16 aadressi Leheküljed Põhi 10 aadressi
FFFFF000 – FFFFFFFF Lk 1 048 575 4 294 963 200 – 4 294 967 295
FFFFE000 – FFFFEFFF lk 1 044 479 4 294 959 104 – 4 294 963 199
FFFFD000 – FFFFDFFF lk 1 040 383 4 294 955 008 – 4 294 959 103
|
|
|
|
|
|
|
|
|
00002000 – 00002FFF 2. lehekülg 8 192 – 12 288
00001000 – 00001FFF 1. lehekülg 4096 – 8191
00000000 – 00000FFF Lehekülg 0 0 – 4095

Tänapäeval koosneb rakendus rohkem kui ühest programmist. Ühele programmile võib kuluda vähem kui lehekülg (vähem kui 4096) või kaks või enam lehekülge. Seega võib rakendus võtta ühe või mitu lehekülge, kus iga leht on 4096 baiti pikk. Avalduse saavad kirjutada erinevad inimesed, kusjuures iga inimene on määratud ühele või mitmele lehele.

Pange tähele, et lehekülg 0 on vahemikus 00000000H kuni 00000FFF
leht 1 on 00001000H kuni 00001FFFH, leht 2 on 00002000 H – 00002FFF H , ja nii edasi. 32-bitise arvuti puhul on protsessoris kaks 32-bitist registrit lehe füüsiliseks adresseerimiseks: üks baasaadressi ja teine ​​indeksaadressi jaoks. Näiteks 2. lehekülje baitide asukohtadele juurdepääsu saamiseks peaks baasaadressi register olema 00002 H mis on esimesed 20 bitti (vasakult) lehekülje 2 algusaadresside jaoks. Ülejäänud bitid on vahemikus 000 H FFF-ile H on registris, mida nimetatakse 'indeksiregistriks'. Seega pääseb ligi kõigile lehel olevatele baitidele, suurendades lihtsalt indeksiregistri sisu 000-st. H FFF-ile H . Indeksregistri sisu lisatakse tegeliku aadressi saamiseks põhiregistris muutumatule sisule. See registri aadressiskeem kehtib ka teistele lehtedele.

Assembly keele programm ei ole aga tegelikult iga lehe jaoks kirjutatud. Iga lehe jaoks kirjutab programmeerija koodi alates leheküljest 000 H lehele FFF H . Kuna erinevatel lehtedel olevad koodid on ühendatud, kasutab kompilaator indeksi aadressimist, et ühendada kõik erinevatel lehtedel olevad aadressid. Näiteks eeldades, et lehekülg 0, leht 1 ja leht 2 on mõeldud ühe rakenduse jaoks ja mõlemal on 555 H aadressid, mis on omavahel ühendatud, kompileerib kompilaator nii, et kui 555 H leheküljele 0 pääseb juurde, 00000 H saab olema baasregistris ja 555 H on indeksiregistris. Kui 555 H 1. leheküljel on juurdepääs, 00001 H saab olema baasregistris ja 555 H on indeksiregistris. Kui 555 H 2. leheküljel on juurdepääs, 00002 H saab olema baasregistris ja 555H indeksregistris. See on võimalik, kuna aadresse saab tuvastada siltide (muutujate) abil. Erinevad programmeerijad peavad kokku leppima erinevate ühendusaadresside jaoks kasutatavate siltide nimed.

Lehekülg Virtuaalne mälu
Nagu eelnevalt kirjeldatud, saab lehitsemist modifitseerida, et suurendada mälu suurust tehnikas, mida nimetatakse 'lehe virtuaalmäluks'. Kui eeldada, et kõigil füüsilise mälu lehtedel, nagu eelnevalt kirjeldatud, on midagi (juhised ja andmed), ei ole kõik lehed hetkel aktiivsed. Lehed, mis ei ole hetkel aktiivsed, saadetakse kõvakettale ja asendatakse kõvaketta lehtedega, mis peavad töötama. Sel viisil suureneb mälu maht. Kui arvuti töötab edasi, vahetatakse passiivseks muutunud lehed kõvakettal olevate lehtedega, mis võivad siiski olla mälust kettale saadetud lehed. Seda kõike teeb mäluhaldusüksus (MMU).

6.11 Probleemid

Lugejal soovitatakse enne järgmise peatüki juurde liikumist lahendada kõik peatüki ülesanded.

1) Too välja CISC ja RISC arvutiarhitektuuri sarnasused ja erinevused. Nimetage üks näide SISC- ja RISC-arvutitest.

2) a) Millised on CISC-arvuti järgmised nimetused bittide järgi: bait, sõna, topeltsõna, neliksõna ja topeltnelisõna.
b) Millised on RISC-arvuti järgmised nimetused bittide järgi: bait, poolsõna, sõna ja topeltsõna.
c) Jah või ei. Kas topelt- ja nelisõna tähendavad nii CISC kui ka RISC arhitektuuris samu asju?

3 a) x64 puhul on komplekteerimiskeele juhiste baitide arv vahemikus millest kuni milleni?
b) Kas ARM 64 kõigi montaažikeelte juhiste baitide arv on fikseeritud? Kui jah, siis milline on kõigi juhiste baitide arv?

4) Loetlege x64 jaoks kõige sagedamini kasutatavad montaažikeele juhised ja nende tähendused.

5) Loetlege ARM 64 jaoks kõige sagedamini kasutatavad montaažikeele juhised ja nende tähendused.

6) Joonistage vana arvuti Harvard Architecture sildistatud plokkskeem. Selgitage, kuidas selle juhiseid ja andmefunktsioone kasutatakse tänapäevaste arvutite vahemälus.

7) Tehke vahet protsessil ja lõimel ning andke protsessi nimi, mis enamikus arvutisüsteemides protsesse ja lõime käsitleb.

8) Selgitage lühidalt, mis on multitöötlus.

9) a) Selgitage otsimist vastavalt x86 386 µP arvutiarhitektuurile.
b) Kuidas saab seda lehte muuta kogu mälu mahu suurendamiseks?