NAR (Nastavni Računar) je teoretski računar koji je osmislio profesor Prirodno-matematičkog Fakulteta u Beogradu, dr Nedeljko Parezanović, radi korišćenja u predavanjima o asemblerskom programiranju.


Karakteristike

uredi

NAR procesor ima adresnu magistralu od 5 bita (dakle, mogao je da adresira 32 bajta memorije) i magistralu podataka od 8 bita. Kodovi instrukcija su po 1 bajt, u kojem viša 3 bita određuju samu instrukciju a nižih 5 bita predstavlja parametar (memorijsku adresu). Podržan je samo jedan akumulator (registar) i ne postoje „zastavice“. Moguće je jedino apsolutno adresiranje - sva ostala su postizana samo-modifikujućim programima.

Iako je NAR teoretski računar, definisane su sledeće fizičke karakteristike:

  • Memorijski ciklus: 1μs
  • Aritmetička operacija (SABF): 0.9μs (900ns)
  • Upravljački pult
    • Omogućava uključivanje i isključivanje računara u električno napajanje
    • Unošenje binarnih reči u registre memorije i u brojač naredbi
    • Čitanje sadržaja memorijskih registara i prikazivanje na pultu
    • Dovođenje računara u režim rada po programu ili rada sa upravljačkim pultom

Skup i kodiranje instrukcija

uredi

NAR 1 poznaje 6 od mogućih 8 instrukcija:

  • SABF (001aaaaa, SABeri sa akumulatorom u Fiksnom zarezu i stavi rezultat u akumulator)
  • PZAF (010xxxxx, Promeni Znak Akumulatora u Fiksnom zarezu)
  • AUM (011aaaaa, Akumulator-U-Memoriju)
  • MUA (100aaaaa, Memorija-U-Akumulator)
  • NES (101aaaaa, NEgativni Skok - skok pod uslovom da je vrednost u akumulatoru negativna)
  • ZAR (110xxxxx, ZAustavi Računar)

Sledeće dve instrukcije nisu zvanično definisane ali su postojale u mnogim simulatorima:

  • NUS (NUla Skok, skok ako akumulator sadrži nulu)
  • BES (BEzuslovni Skok).

Postoji samo jedan način adresiranja - direktan. Parametar instrukcije predstavlja adresu sa koje će se uzeti vrednost za operaciju. Tako, recimo, "ODU 5" u stvari oduzima od akumulatora 8-bitnu vrednost koja se nalazi na adresi 5.

Svi ostali načini adresiranja se simuliraju samo-modifikujućim programima. Instrukcija ZAR je jedina koja ignoriše parametar.

Primeri programa

uredi

Primer programa koji sabira niz 8-bitnih celih brojeva:

00:     0         ; улаз: 0 или 22. вредност, излаз: резултат
01..21: 0,0,0...  ; улаз: вредности 1-21
22:     МУА  0    ; Почетак програма; Учитај прву тренутни збир
23:     САБФ 1    ; Сабери са вредношћу на адреси 1
24:     АУМ  0    ; Сачувај резултат
25:     МУА  23   ; Учитај инструкцију на адреси 23 (САБФ)
26:     САБФ 31   ; Додај +1 (помери адресу на следећу)
27:     АУМ  23   ; Сачувај промењену инструкцију
28:     САБФ 30   ; Одузми 54 (вредност инструкције САБФ 22)
29:     НЕС  22   ; Понови ако је адреса у САБФ инструкцији још увек мања
30:     ЗАР  10   ; Крај. Аргумент је присутан да би вредност испала -54.
31:     1         ; Константа потребна у инструкцији на адреси 26

Ovaj program dodaje do 22 8-bitne celobrojne vrednosti ukoliko se izvrši sa adrese 22:

  • Ulazne vrednosti 1-21 je potrebno smestiti na adrese 1-21
  • Vrednost 22 može da se smesti na adresu 0 (umesto nule) ali će ova vrednost biti izgubljena i zamenjena rezultatom

NAR 1 programi su često samo-modifikujući. U slučaju NAR-a, nasuprot drugim arhitekturama, ovo nije trik. Kako je prisutno samo apsolutno neposredno adresiranje (nije, recimo, moguće adresirati sadržajem bilo kog registra), jedini način da se dinamički bira adresa je modifikacija samih instrukcija koje rade sa memorijom. Prethodni primer takođe sadrži trik zarad uštede memorije - instrukcija na adresi 30 je iskorišćena kao brojna veličina (-54) koju koristi druga instrukcije (na adresi 28).

U slučaju da je dozvoljeno upisivanje vrednosti akumulatora na upravljačkom pultu, moguće je sabrati još jedan broj tako što će on biti postavljen u akumulator pred početak programa. Program je potrebno izmeniti tako da instrukcija na adresi 23 ne bude „SABF 1" već „SABF 0" i potrebno je program startovati od adrese 23 (a ne 22).

Ostali trikovi koji su bili korišćeni su upotreba promene znaka pri modifikaciji instrukcije, kao što se može videti na sledećem primeru:

00..21: 0,0,0...  ; улазне вредности од 22. до 1.
22:     0         ; улаз: 0 или 23. улазна вредност, излаз: резултат
23:     МУА  21   ; почетак програма; учитај (следећу) вредност
24:     САБФ 22   ; додај тренутни збир са адресе 22
25:     АУМ  22   ; сачувај нови збир на адресу 22
26:     МУА  23   ; учитај инструкцију са адресе 23
27:     САБФ 31   ; умањи инструкцију (адресни део) за 1
28:     АУМ  23   ; упиши измењену инструкцију 
29:     НЕС  23   ; понови ако је и даље негативна (није прешла преко нулте адресе)
30:     ЗАР       ; ... иначе заустави рачунар
31:     -1        ; констант потребна инструкцији на адреси 27

Ovde instrukcija „MUA 21" na adresi 23 ima binaru vrednost 10010101, što je -107 decimalno ako se tretira kao 8-bitni komplement dvojke. Instrukcije na adresama 26, 27 i 28 umanjuju ovu vrednost za 1 u svakoj iteraciji. Ovo će menjati 5 nižih bitova (adresni deo) i neće uticati na tri najviša bita koji određuju instrukciju sve dok instrukcija ne postane „MUA 0" (10000000 binarno = -128 decimalno, još uvek negativno). Kada se ova vrednost umanji za 1 ona postaje 01111111 (+127 decimalno) što više nije negativna vrednost te NES instrukcija na adresi 29 neće „skočiti“ i ZAR instrukcija na adresi 30 će zaustaviti računar.

Slično prethodnom primeru, ovaj program može da sabere između 22 i 24 broja, zavisno od toga da li je dozvoljeno upotrebiti adresu 22 i za ulaz i za rezultat i da li se početna vrednost akumulatora može upotrebiti kao ulazna vrednost (program je potrebno iztvršiti od adrese 24 a instrukcija na adresi 23 treba da bude promenjena u „MUA 22").

U slučaju da konkretna izvedba računara (simulatora) zaustavlja rad ukoliko naiđe na nepoznaztu instrukciju ili sadrži dodatnu instrukciju bezuslovnog skoja sa kodom 111aaaaa, onda se ta osobina može iskoristiti na sledeći način::

00..22: 0,0,0...  ; улазне вредности од 23. до 1.
23:     0         ; улаз: 0 или 24. улазна вредност, излаз: резултат
24:     МУА  22   ; почетак програма; учитај (следећу) вредност
25:     САБФ 23   ; додај тренутни збир
26:     АУМ  23   ; сачувај нови збир
27:     МУА  24   ; учитај инструкцију са адресе 24
28:     САБФ 31   ; умањи је за 1...
29:     АУМ  24   ; ... и упиши
30:     НЕС  24   ; понови ако је инструкција још увек негативна
31:     -1        ; БЕС 31 или непостојећа инструкција и константа за инструкцију на адресу 28

U ovom slučaju vrednost "-1" na adresi 31 se tretira ili kao nepostojeća instrukcija koja zaustavlja računar ili kao bezuslovni skok na samu sebe (mrtva petlja). U bilo kom slučaju rezultat je moguće pročitati upotrebom upravljačkog pulta.

Zavisno od toga da li NAR prekida sa radom po završetku instrukcije na poslednjjoj adresi (31, bez povratka na adresu 0), gornji program je moguće reorganizovati da uopšte ne sadrži instrukciju koja zaustavlja računar:

00..22: 0,0,0...  ; улазне вредности 23. до 1.
23:     0         ; улаз: 0 или 24. улазна вредност, излаз: резултат
24:     -1        ; константа за инструкцију 29
25:     МУА  22   ; почетак програма; учитај (следећу) вредност
26:     САБФ 23   ; додај тренутни збир
27:     АУМ  23   ; сачувај нови збир
28:     МУА  25   ; учитај инструкцију са адресе 25
29:     САБФ 24   ; умањи је за 1...
30:     АУМ  25   ; ... и упиши
31:     НЕС  25   ; понови ако је инструкција још увек негативна
; ------------- крај меморије

Interesantni detalji

uredi
  • Napisani su mnogi simulatori ovog računara. Jedan je poznat pod imenom "šljiva", kao domaće voće ("nar" je voće, ali nije domaće).
  • NAR 2 je idejni naslednik ovog NAR 1, sa nešto više instrukcija i raznovrsnim načinima adresiranja.
  • Pravljene su parodije na imena instrukcija u NAR 1 i još više u NAR 2 jer podsećaju na „normalne“ reči srpskog jezika (bes, zar? muva, nes kafa, (oni) odu (negde), ...)