среда, декабря 21, 2005

PDP-11 как колыбель современного программирования и могила рассудка

Кое-кто слышал, вероятно, про линейку миникомпьютеров PDP от компании DEC, весьма популярную в 70-е годы.
"Мини" не должно вводить в заблуждение. Эти миникомпьютеры были размером со средних размеров секретер. Однако уже и такие размеры были большим достижением. Что более существенно, рабочее время этих машин было дешевле чем время мэйнфреймов. Да и сами они были относительно недороги...
PDP внесли существенный вклад в развитие IT. В частности, первые версии UNIX и C создавались вначале на PDP-7, а затем на PDP-11. Хвалебные оды PDP-11 как отправной точке множества хакеров (в широком смысле этого слова) возносит небезызвестный Крис Касперски... Клонировали машины все, кому было не лень. В частности, широкое распространение машины с процессором PDP-11 (это была не микросхема, а плата с набором микросхем) получили в СССР под названием "Электроника-60" (впрочем, у нас тогда все передирали у янки)
А причина популярности была в развитой системе команд. Для каждого из операндов (всего их могло быть 2) имелось 8 способов адресации через каждый из регистров (в том числе и через R7 - счетчик команд!). В результате можно был делать очень интересные вещи.
Например, вызов функции
myFunc(1, 2)
мог быть странслирован в следующий процуссорный код:
JSR R0, myFunc ; переход на myFunc с сохранением адреса возрата в R0
1 ; op1
2 ; op2
MOV R1, C. ; сюда будет осуществлен возврат

myFunc:
MOV (R0)+, R1
; R1 = *R0++
ADD (R0)+, R1 ; R1 += *R0++
RTS R0 ; возврат по адресу в R0
Как видно, компилятор для такой системы команд писать одно удовольствие.
Машину на ее основе собрать тоже несложно. Причем в ней даже не обязательно обеспечивать стек. Как видно, вызов подпрограмм и так работать будет.
Надо сказать, что эта система команд и поныне широко используется, например, в контроллерах станков и т.п.. Естественно, теперь процессор реализуется интегрально.
Так я это к чему? А к тому, что у нас курсач - "Проектирование процессора с сокращенным набором команд на основе системы команд PDP-11". И мне эта система команд уже вот где!!!! Млин, им хорошо было придумывать, а мы сношайся!
Как прикажете трактовать команду JMP @(R7)+ ?
- как addr = *R7, R7 = *addr, R7++
- как addr = *R7, R7++, R7 = *addr
- или еще как-то?
А как быть с двухадресными командами? Например, с BIT @Array(R7), @(R7)+ (команда BIT вычисляет логическое И аргументов без записи результата)? Это же полный бульбец!!!
Нет, понятно, что здоровый человек так не напишет, но есть у меня знакомые, которые могли бы (да, Лёша, я говорю о тебе!)
А еще бесит реализация конвейера. Потому что любое изменение значения счетчика команд или же использование данных лежащих после кода команды херит к чертовой матери весь конвейер (а он всего-то 3 уровня; что бы было при большей глубине - страшно подумать!).
Охренеть!!!
Слава Богу, мне еще не надо результаты записывать в память. А то я бы уже отъехал в район АМЗ
Да здравствует архитектура RISC!!!!!!!!!