НАР (Наставни Рачунар) је теоретски рачунар који је осмислио професор Природно-математичког Факултета у Београду, др Недељко Парезановић, ради коришћења у предавањима о асемблерском програмирању.


Карактеристике

уреди

НАР процесор има адресну магистралу од 5 бита (дакле, могао је да адресира 32 бајта меморије) и магистралу података од 8 бита. Кодови инструкција су по 1 бајт, у којем виша 3 бита одређују саму инструкцију а нижих 5 бита представља параметар (меморијску адресу). Подржан је само један акумулатор (регистар) и не постоје „заставице“. Могуће је једино апсолутно адресирање - сва остала су постизана само-модификујућим програмима.

Иако је НАР теоретски рачунар, дефинисане су следеће физичке карактеристике:

  • Меморијски циклус: 1μs
  • Аритметичка операција (САБФ): 0.9μs (900ns)
  • Управљачки пулт
    • Омогућава укључивање и искључивање рачунара у електрично напајање
    • Уношење бинарних речи у регистре меморије и у бројач наредби
    • Читање садржаја меморијских регистара и приказивање на пулту
    • Довођење рачунара у режим рада по програму или рада са управљачким пултом

Скуп и кодирање инструкција

уреди

НАР 1 познаје 6 од могућих 8 инструкција:

  • САБФ (001aaaaa, САБери са акумулатором у Фиксном зарезу и стави резултат у акумулатор)
  • ПЗАФ (010xxxxx, Промени Знак Акумулатора у Фиксном зарезу)
  • АУМ (011aaaaa, Акумулатор-У-Меморију)
  • МУА (100aaaaa, Меморија-У-Акумулатор)
  • НЕС (101aaaaa, НЕгативни Скок - скок под условом да је вредност у акумулатору негативна)
  • ЗАР (110xxxxx, ЗАустави Рачунар)

Следеће две инструкције нису званично дефинисане али су постојале у многим симулаторима:

  • НУС (НУла Скок, скок ако акумулатор садржи нулу)
  • БЕС (БЕзусловни Скок).

Постоји само један начин адресирања - директан. Параметар инструкције представља адресу са које ће се узети вредност за операцију. Тако, рецимо, "ОДУ 5" у ствари одузима од акумулатора 8-битну вредност која се налази на адреси 5.

Сви остали начини адресирања се симулирају само-модификујућим програмима. Инструкција ЗАР је једина која игнорише параметар.

Примери програма

уреди

Пример програма који сабира низ 8-битних целих бројева:

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

Овај програм додаје до 22 8-битне целобројне вредности уколико се изврши са адресе 22:

  • Улазне вредности 1-21 је потребно сместити на адресе 1-21
  • Вредност 22 може да се смести на адресу 0 (уместо нуле) али ће ова вредност бити изгубљена и замењена резултатом

НАР 1 програми су често само-модификујући. У случају НАР-а, насупрот другим архитектурама, ово није трик. Како је присутно само апсолутно непосредно адресирање (није, рецимо, могуће адресирати садржајем било ког регистра), једини начин да се динамички бира адреса је модификација самих инструкција које раде са меморијом. Претходни пример такође садржи трик зарад уштеде меморије - инструкција на адреси 30 је искоришћена као бројна величина (-54) коју користи друга инструкције (на адреси 28).

У случају да је дозвољено уписивање вредности акумулатора на управљачком пулту, могуће је сабрати још један број тако што ће он бити постављен у акумулатор пред почетак програма. Програм је потребно изменити тако да инструкција на адреси 23 не буде „САБФ 1" већ „САБФ 0" и потребно је програм стартовати од адресе 23 (а не 22).

Остали трикови који су били коришћени су употреба промене знака при модификацији инструкције, као што се може видети на следећем примеру:

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

Овде инструкција „МУА 21" на адреси 23 има бинару вредност 10010101, што је -107 децимално ако се третира као 8-битни комплемент двојке. Инструкције на адресама 26, 27 и 28 умањују ову вредност за 1 у свакој итерацији. Ово ће мењати 5 нижих битова (адресни део) и неће утицати на три највиша бита који одређују инструкцију све док инструкција не постане „МУА 0" (10000000 бинарно = -128 децимално, још увек негативно). Када се ова вредност умањи за 1 она постаје 01111111 (+127 децимално) што више није негативна вредност те НЕС инструкција на адреси 29 неће „скочити“ и ЗАР инструкција на адреси 30 ће зауставити рачунар.

Слично претходном примеру, овај програм може да сабере између 22 и 24 броја, зависно од тога да ли је дозвољено употребити адресу 22 и за улаз и за резултат и да ли се почетна вредност акумулатора може употребити као улазна вредност (програм је потребно изтвршити од адресе 24 а инструкција на адреси 23 треба да буде промењена у „МУА 22").

У случају да конкретна изведба рачунара (симулатора) зауставља рад уколико наиђе на непозназту инструкцију или садржи додатну инструкцију безусловног скоја са кодом 111ааааа, онда се та особина може искористити на следећи начин::

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

У овом случају вредност "-1" на адреси 31 се третира или као непостојећа инструкција која зауставља рачунар или као безусловни скок на саму себе (мртва петља). У било ком случају резултат је могуће прочитати употребом управљачког пулта.

Зависно од тога да ли НАР прекида са радом по завршетку инструкције на последњјој адреси (31, без повратка на адресу 0), горњи програм је могуће реорганизовати да уопште не садржи инструкцију која зауставља рачунар:

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   ; понови ако је инструкција још увек негативна
; ------------- крај меморије

Интересантни детаљи

уреди
  • Написани су многи симулатори овог рачунара. Један је познат под именом "шљива", као домаће воће ("нар" је воће, али није домаће).
  • НАР 2 је идејни наследник овог НАР 1, са нешто више инструкција и разноврсним начинима адресирања.
  • Прављене су пародије на имена инструкција у НАР 1 и још више у НАР 2 јер подсећају на „нормалне“ речи српског језика (бес, зар? мува, нес кафа, (они) оду (негде), ...)