НАР 1
NAR 1 или просто NAR ( серб. Na stavni R ačunar, англ. Образовательный компьютер ) — теоретическая модель компьютера, созданная профессором математического факультета университета Белградского Неделько Парежановичем (на сербском языке: Неделько Парежанович). Он использовался на ассемблера и компьютерной архитектуры курсах .
Технические характеристики
[ редактировать ]NAR 1 Центральный процессор имеет 5- битную адресную шину (32 байта адресуемой памяти) и 8-битную шину данных . Машинные инструкции были однобайтовыми, с тремя старшими битами, задающими код операции , и пятью младшими битами, параметром — адресом памяти . Был доступен единственный 8-битный аккумуляторный регистр и не было никаких флагов или регистров флагов . Был доступен только режим абсолютной адресации , а все остальные достигались с помощью самомодифицирующегося кода .
Несмотря на то, что это всего лишь теоретический компьютер, ему были даны следующие физические характеристики:
- Цикл памяти: 1 мкс
- Цикл арифметической операции (SABF): 0,9 мкс (900 нс)
- Панель управления обеспечивает включение и выключение питания, ввод и считывание данных в память, ввод счетчика команд и выбор режима выполнения программы или режима панели управления.
Кодирование и установка инструкций
[ редактировать ]- SABF (001aaaaa, ср. Сабери у эн Фиксном зарезу , . Добавить фиксированную точку) загружает содержимое ячейки памяти, указанной параметром адреса, добавляет его к текущему значению аккумулятора и сохраняет результат в аккумуляторе.
- PZAF (010xxxxxx, ср. Про мени Z нак А kumulatora u F iksnom zarezu , англ. Изменение знака аккумулятора в фиксированной точке) Отменяет значение фиксированной точки (например, целое число) в аккумуляторе
- AUM (011aaaaa, . A kumulator . ср UM memoriju , англ. Accumulator Into Memory) сохраняет содержимое аккумулятора в ячейку памяти, указанную параметром адреса
- MUA (100aaaaa, . ср Memorija U A kumulator , англ. Memory Into Accumulator) загружает содержимое ячейки памяти, указанной параметром адреса, в аккумулятор.
- НЭС (101ааааа, ср. Негативни С кок по адресу, указанному параметром , , англ. Negative Jump) выполняет условный переход если текущее значение аккумулятора отрицательное.
- ZAR (110xxxxx, ср. Za ustavi R ačunar , англ. Stop the Computer) останавливает дальнейшую обработку.
Еще две инструкции не были указаны, но обычно присутствовали в симуляторах и имели коды инструкций 000aaaaa и 111aaaaa:
- BES ( ср. Be zuslovni S kok , англ. Unconditional Jump) выполняет безусловный переход по адресу, указанному параметром.
- НУС ( ср. Ну ла- С кок , эн. Zero Jump) выполняет условный переход по адресу, указанному параметром, если текущее значение аккумулятора равно нулю.
Примеры программ
[ редактировать ]Пример программы, суммирующей массив 8-битных целых чисел:
00: 0 ; input: 0 or value 22, output: result
01..21: 0,0,0... ; input: values 1..21
22: MUA 0 ; Start of program; Load accumulator from address 0
23: SABF 1 ; Add value from address 1 to accumulator
24: AUM 0 ; Store accumulator to address 0
25: MUA 23 ; Load instruction at address 23 (SABF)
26: SABF 31 ; Add value from address 31 (+1) to accumulator
27: AUM 23 ; Store accumulator to address 23 (modifies SABF instruction)
28: SABF 30 ; Add value from address 30 to accumulator
29: NES 22 ; Jump back to 22 if accumulator value is negative
30: ZAR 10 ; Stop the computer. Argument makes this byte have the value of -(SABF 22) = -54.
31: 1 ; Value to add to address in each iteration
Приведенная выше программа добавляет до 22 8-битных значений, если выполняется с адреса 22:
- Значения 1–21 хранятся в ячейках 1–21.
- Значение 22 сохраняется в позиции 0 вместо константы 0 и будет заменено результатом.
Программы NAR 1 обычно являются самомодифицирующими. В отличие от некоторых других архитектур, это не «уловка». Поскольку память не может быть адресована через регистр, единственным способом динамического манипулирования данными памяти является изменение инструкций манипулирования памятью. Приведенный выше пример также содержит типичный прием для экономии памяти — инструкция (по адресу 30) повторно используется в качестве данных другой инструкцией (по адресу 28).
Если начальным значением аккумулятора можно управлять с панели управления, в нем можно сохранить 23-е значение. Вышеупомянутую программу необходимо лишь немного изменить - команду SABF 1 по адресу 23 следует заменить на SABF 0, и программа должна выполняться с этого адреса (23), а не с 22.
Другие уловки включали использование изменений знака после изменения инструкции, как показано в следующем примере:
00..21: 0,0,0... ; input values 22 to 1
22: 0 ; input: 0 or value 23, output: result
23: MUA 21 ; start of program; Load (next) value
24: SABF 22 ; Add subtotal at 22 to accumulator
25: AUM 22 ; Store new subtotal to 22
26: MUA 23 ; Load instruction 23 into accumulator
27: SABF 31 ; Decrement instruction by 1
28: AUM 23 ; Update instruction
29: NES 23 ; Repeat if the instruction is still negative
30: ZAR ; Otherwise, stop the computer
31: -1 ; Constant needed for instruction at 27
Здесь инструкция «MUA 21» по адресу 23 имеет двоичное значение 10010101, что соответствует десятичному значению -107, если рассматривать его как целое число со знаком в дополнении до двух . Инструкции по адресам 26, 27 и 28 уменьшают это значение на 1 на каждой итерации. Это изменит 5 младших битов, определяющих адрес, и не затронет три бита, обозначающие инструкцию, пока эта инструкция не станет MUA 0 (10000000 двоичный = -128 десятичный, отрицательный). Как только это значение уменьшается на единицу, оно становится 01111111 (+127 десятичное число), которое больше не является отрицательным и приведет к выполнению инструкции перехода в случае отрицательного результата в 29, переходя к «остановке компьютера» в 30.
Как и выше, эта программа может складывать от 22 до 24 значений, в зависимости от того, можно ли использовать адрес 22 как для ввода, так и для вывода, и можно ли использовать начальное значение аккумулятора в качестве ввода (затем программа должна выполняться с адреса 24 и инструкция в пункте 23 должна быть MUA 22).
Если конкретная реализация останавливает компьютер, если он встречает неизвестный код операции или реализует дополнительную инструкцию безусловного перехода с кодом операции «111aaaaa», то такое поведение можно использовать следующим образом:
00..22: 0,0,0... ; input values 23 to 1
23: 0 ; input: 0 or value 24, output: result
24: MUA 22 ; start of program; Load (next) value
25: SABF 23 ; Add subtotal at 23 to accumulator
26: AUM 23 ; Store new subtotal to 23
27: MUA 24 ; Load instruction 24 into accumulator
28: SABF 31 ; Decrement instruction by 1
29: AUM 24 ; Update instruction
30: NES 24 ; Repeat if the instruction is still negative
31: -1 ; BES 31 or invalid instruction & constant for instruction at 28
Вышеуказанное значение «-1», найденное по адресу 31, может рассматриваться либо как недопустимая инструкция, вызывающая остановку компьютера, либо как безусловный переход (BES 31) на тот же адрес, что приводит к бесконечному циклу, который не влияет на результат (управление панель можно использовать для его отображения).
Наконец, в зависимости от того, решено ли, что компьютер прекратит выполнение программы, если она достигнет конца памяти (адрес 31, не будет откатываться к адресу 0), вышеуказанную программу можно реорганизовать так, чтобы она принимала на одно значение больше, исключив необходимость команда «остановить компьютер» в целом, а именно:
00..22: 0,0,0... ; input values 23 to 1
23: 0 ; input: 0 or value 24, output: result
24: -1 ; Constant needed for instruction at 29
25: MUA 22 ; start of program; Load (next) value
26: SABF 23 ; Add subtotal at 23 to accumulator
27: AUM 23 ; Store new subtotal to 23
28: MUA 25 ; Load instruction 25 into accumulator
29: SABF 24 ; Decrement instruction by 1
30: AUM 25 ; Update instruction
31: NES 25 ; Repeat if the instruction is still negative
; ------------- end of memory
Пустяки
[ редактировать ]- Слово «нар» означает обучающую компьютерную модель.
- Было создано множество симуляторов НАР 1. Один из них был назван «Шлива» ( англ. «слива» ), поскольку этот фрукт растет в Сербии , а «нар» — нет.
- Одной из часто задаваемых задач было создание программы, которая складывает как можно больше чисел, сохраняя эти числа в 32-байтовой памяти вместе с программой.
- Некоторые протоколы языка ассемблера основаны на коде хулила NAR1.
См. также
[ редактировать ]Профессор доктор Неделько Парежанович (и сербский)