110 likes | 289 Views
RAM mašīna: teorētisks Assembler valodas prototips. Datorzinātnes pamati. Abstrakciju hierarhija datorā. Dators – arī abstrakta mašīna. Varam uz datoru skatīties dažādos veidos.
E N D
RAM mašīna: teorētisks Assembler valodas prototips Datorzinātnes pamati
Abstrakciju hierarhija datorā Dators – arī abstrakta mašīna. Varam uz datoru skatīties dažādos veidos. (a) Dators kā lietotāja tekstu un tabulu apstrādes līdzeklis, uz datora iespējams izpildīt lietojamas programmas (Word, Excel, u.c.) (b) Dators kā vide programmēšanai (valodā C++, PASCAL, PROLOG, u.c.) (c) Dators kā bināras simbolu virknes apstrādājoša iekārta (viss sastāv no 0 un 1, baits – 8 biti, Kbaits – 1024 baiti, u.tml.) (d) Dators kā fizikāli realizētu mikroshēmu sistēma, sastāv no diodēm, tranzistoriem, u.c. elementiem. Starp (b) un (c) vēl (nosacīti) 3 līmeņi: (b1) asemblera valoda (instrukcijas darbam ar reģistriem, atmiņas šūnām) (b2) operētājsistēmas kodols (vada uzdevumu plūsmu datorā) (b3) mikroprogrammas (procesora instrukciju realizācija loģisko operāciju līmenī). Zemāks līmenis realizē operācijas, kas pieejamas (izmantojamas) augstākā līmenī. Lai strādātu augstākā līmenī, nav jāzina visas zemākā līmeņa detaļas (lai brauktu ar trolejbusu, nav jāzina tā dzinēja uzbūve).
RAM mašīnas ideja RAM mašīnas modelis: procesors izpilda instrukcijas, kas ievietotas atsevišķā atmiņas apgabalā katrā brīdī viena no instrukcijām ir “kārtējā instrukcija” (realizācija: īpašā reģistrā glabājas norāde uz kārtējo instrukciju; programmas skaitītājs) dati glabājas atmiņas šūnās, sauktās par reģistriem viens no reģistriem – t.s. summators, kurš izmantojams darbību veikšanai (summators – “procesora reģistrs”) atsevišķas ieejas un izejas lentas Darbības: LOAD, STORE – informācijas pārvietošana READ, WRITE – informācijas ievads/izvads ADD, SUB, MULT, DIV – aritmētiskās operācijas JUMP, JGTZ, JZERO, HALT – programmas skaitītāja operācijas RAM mašīnas operācijas var realizēt ar loģiskajām shēmām (ierobežota, kaut arī ļoti liela skaita reģistru gadījumā). RAM mašīnas var tikt izmantotas, lai “realizētu” augstāka līmeņa programmēšanas valodā rakstītas programmas.
RAM mašīna vs. reāls dators Reāls dators (Assembler komandu līmenī): procesors izpilda instrukcijas, kas ievietotas kopējā datu telpā programmas skaitītāja reģistrs: norāde uz kārtējo izpildāmo komandu dati glabājas atmiņas šūnās - reģistros vairāki procesora reģistri, kešatmiņa datu i/o iekārtas Assembler valodas operāciju komplekts, pēc funkcionalitātes ietver darbības, kas atbilst RAM komandām, var būt plašāks, t.sk. ietver sadarbību ar datorā pieejamām fiziskajiem resursiem Nosacītās argumentu adreses komandās (operāciju sistēmas uzdevums izpildīt tās uz konkrētā procesora) RAM mašīna: procesora instrukcijas ievietotas atsevišķā atmiņas apgabalā* katrā brīdī viena no instrukcijām ir “kārtējā instrukcija” dati glabājas atmiņas šūnās - reģistros viens no reģistriem – t.s. summators, atsevišķas ieejas un izejas lentas Darbības: LOAD, STORE, READ, WRITE, ADD, SUB, MULT, DIV, JUMP, JGTZ, JZERO, HALT Fiksētās argumentu adreses komandās * (RAM modifikācija: instrukcijas kopējā datu telpā)
ieejas lenta darba lenta Procesors r0 r1 r2 r3 … PC Programma Summators izejas lenta RAM mašīna: shēma RAM – Random Access Memory: brīva pieeja atmiņai Katrā lentas šūnā var tikt ierakstīts naturāls skaitlis (potenciāli neierobežota vērtība) Pa ieejas un izejas lentu procesora galviņa pārvietojas tikai uz priekšu Ar darba lentas reģistriem procesors var strādāt patvaļīgā kārtībā Summators – īpašs procesora reģistrs: LOAD 5 – nolasīt vērtību no 5. reģistra, ievietot to summatorā (0.reģistrā) ADD 5 – pieskaitīt 5. reģistra vērtību vērtībai, kas ir summatorā.
ieejas lenta darba lenta Procesors r0 r1 r2 r3 … PC Programma Summators izejas lenta RAM mašīna: komandas Datu komandas: LOAD, STORE, ADD, SUB, MULT, DIV, READ, WRITE Arguments – operands, 3 veidi: i, =i, *i (LOAD5, LOAD=5, LOAD*5) i – i-tā reģistra saturs; =i – skaitlis i; *i – tā reģistra saturs, kura numurs ir i-tajā reģistrā Vadības komandas: JUMP, JGTZ, JZERO, HALT Argumenti JUMP, JGTZ, JZERO komandām: iezīmes programmas tekstā HALT: nav argumentu.
RAM mašīna: komandas (2) Datu komandas: LOAD, STORE, ADD, SUB, MULT, DIV, READ, WRITE i - i-tā reģistra saturs; =i – skaitlis i; *i – tā reģistra saturs, kura numurs ir i-tajā reģistrā LOAD op Ielādē summatorā op STORE op Saglabā summatora vērtību atbilstoši op (STORE =i nav jēgas) ADD op Pieskaita summatoram op (rezultāts summatorā) SUB op Atņem no summatora op (rezultāts sumamtorā) MULT op Sareizina summatora saturu ar op (rezultāts summatorā) DIV op Izdala summatora saturu ar op (rezultāts summatorā) READ op Ielasa kārtējo vērtību no ieejas lentas atbilstoši op (READ =i nav jēgas), pabīda ieejas lentas galviņu 1 vienību pa labi WRITE op Uzraksta op uz izejas lentas, pabīda galviņu 1 vienību pa labi Vadības komandas: JUMP, JGTZ, JZERO, HALT JUMP line Uzstādīt kā nākamo izpildāmo komandu, kas atzīmēta ar line JGTZ line Pāriet uz line, ja summatora vērtība pozitīva JZERO line Pāriet uz line, ja summatora vērtība ir 0 HALT Beigt darbu
RAM mašīna: lielākais kopīgais dalītājs Atrast 2 skaitļu, kas ierakstīti ieejas lentas pirmajās 2 šūnās lielāko kopīgo dalītāju, ierakstīt to izejas lentas pirmajā šūnā. Eiklīda algoritms: while x y do if x > y then x := x - y else y := y - x fi od READ 1 READ 2 Glabāsim x reģistrā r1, y reģistrā r2, ielādējam. cikls: LOAD 1 Summatorā x SUB 2 Summatorā x - y JZERO end x = y JGTZ xmx Pāreja, ja x - y > 0, t.i. x > y LOAD 2 Gadījums, ja y > x, ielādējam summatorā y SUB 1 Summatorā y - x STORE 2 Saglabājam jauno y vērtību JUMP cikls xmx: STORE 1 Summatorā jau ir x - y, saglabājam to kā jauno x vērtību JUMP cikls end: WRITE 1 Beigās x = y, izdrukājam x kā rezultātu HALT Varam ievērot, ka programmā nebija nepieciešama netiešā adresācija: *i operandi.
RAM mašīna: skaitļu virkne apgrieztā secībā Nolasīt no ieejas lentas nenulles skaitļu virkni (virknes beigu pazīme – skaitlis 0), izdrukāt šo virkni uz izejas lentas apgrieztā secībā. Problēma: nezinām, cik daudz skaitļu būs. Lai varētu visus uzglabāt un apstrādāt, jālieto netiešo adresāciju. Netiešā adresācija – līdzeklis, kā apstrādāt masīvus. Fiksētie dati: r0, r1, aiz tiem sāksim izvietot no ieejas nolasītos skaitļus. LOAD =2 STORE 1 Saglabā r1 skaitli 2 – pirmās ielasāmo datu šūnas adresi c1: READ 0 Ielasa kārtējo vērtību JZERO c2 Ja ielasīts 0, datu ievads beidzies, pārejam pie izvada STORE *1 Saglabā datu skaitli kārtējā šūnā LOAD 1 ADD =1 Palielinām kārtējās šūnas norādi par 1 STORE 1 JUMP c1 c2: LOAD 1 Ja reģistra r1 vērtība šajā punktā ir 2, tad darbu jābeidz SUB =2 Patiesībā katrā cikla apgriezienā r1 jāsamazina par 1 JZERO end WRITE *1 ADD =1 JUMP c2 STORE 1 end: HALT
RAM mašīnu varianti un lietojumi RAM mašīna interesanta šajā kursā: ļauj ilustrēt Assembler valodas būtiskās konstrukcijas, t.sk. netiešo adresāciju, kas izmantojama masīvu apstrādei reģistru mašīnās. RAM mašīnas variants: RASP (Random Access Stored Program) – ievieto arī programmas tekstu reģistros (vienai komandai 2 šūnas – komandas kodam un operanda vērtībai). RASP programma var sevi mainīt darba gaitā. Nav vajadzīga netiešā adresācija: cikli pa dažādām šūnām tiek veikti, mainot šūnas adresi programmas tekstā. Vēsturiski: von Neumann mašīna 1948. g., pirmais reālais dators – tuva šādai RASP. RAM mašīnas modeli izmanto kā vienkāršu abstraktu mašīnu algoritmu aprakstam un efektivitātes analīzei (sk. piemēram A.Aho, J.Hopcroft, J.Ullman, The Design and Analysis of Computer Algorithms). Uzmanīgi: tā kā vienā RAM mašīnas šūnā var ierakstīt cik patīk lielus skaitļus, tad var būt situācijas, kad no efektivitātes viedokļa viena operācija nav uzskatāma par izpildāmu vienā laika vienībā. Fiksētie un logaritmiskie operāciju svari. Jautājums:kā modelēt Tjūringa mašīnas darbu ar RAM ar ierobežotu reģistru skaitu?
Papildmateriāls: RASP mašīna RASP: 2 atsevišķi reģistri (ārpus darba lentas) summators un programmas skaitītājs. Sākumā programmas skaitītājs rāda uz 0-to lentas reģistru. Pēc komandas izpildes, ja tā nav bijusi vadības komanda, programmas skaitītājs tiek palielināts par 2 (lai norādītu uz nākamo komandu (pirmo no šūnām, kas šo komandu kodē)). Katra komanda tiek kodēta ar 2 šūnām: komandas kods + operands. Komandu kodi (iespējams variants): LOAD i 1 DIV i 10 LOAD =i 2 DIV =i 11 STORE i 3 READ i 12 ADD i 4 WRITE i 13 ADD =i 5 WRITE =i 14 SUB i 6 JUMP i 15 SUB =i 7 JGTZ i 16 MULT i 8 JZERO i 17 MULT =i 9 HALT 18 Vingrinājumi: Kā modelēt RAM ar RASP un otrādi? Realizēt lielākā kopīgā dalītāja un virknes otrādi apgriešanas programmas ar RASP