Table of Contents
Процессор PDP-32
Архитектура процессора PDP-11 до сих пор считается самлй “красивой” и удобной для программиста. К сожалению, из-за ограничения по памяти (64 кбайт) это семейство вышло из употребления. Но почему бы не попробовать разработать 32-битный вариант? Возможно, это не будет очень практично, но для обучения программированию такой процессор может оказаться полезнее, чем MMIX Дональда Кнута.
Полностью сохраняется мнемоника ассемблерных команд. Сохраняется семантика большинства команд процессора. Представляется, что адаптация существующих систем программирования, например GNU binutils и GCC, для PDP-32 может быть выполнена в разумные сроки.
Отличия от PDP-11:
- нет команд ASHC, SOB, MARK
- нет команд BPT, RTT
- нет команд IOT, TRAP, WAIT, RESET
- поведение команд MUL и DIV отличается
- новые команды обработки полуслов CLRH, COMH, INCH, DECH, NEGH, ADCH, SBCH, TSTH, RORH, ROLH, ASRH, ASLH, MOVH, CMPH, BITH, BICH, BISH
При подготовке статьи использовались фрагменты работы Негоды и Никищенкова.
Регистры
Процессор PDP-32 имеет шестнадцать 32-разрядных регистров R0-R15 и 8-битное слово состояния PSW. Регистр R14 также называется SP и используется как указатель стека. Регистр R15 имеет название PC и содержит адрес текущей выполняемой команды.
31 — биты — 0 | |
---|---|
R0 | |
R1 | |
… | |
R13 | |
R14 - SP | ← указатель стека |
R15 - PC | ← счетчик команд |
Операнды, размещаемые в регистрах, могут быть тридцатидвухразрядными (слова) шестнадцатиразрядными (полуслова) и восьмиразрядными (байты). При этом восьмиразрядные операнды размещаются в младшем байте регистра, шестнадцатиразрядные - в младшем полуслове. Байт в памяти может иметь любой адрес. Полуслово может иметь только четный адрес, слово — только адрес, кратный 4. Указатель стека SP и счетчик команд PC являются указателями на слова памяти, поэтому должны быть кратны 4.
Слово состояния PSW
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
IM | — | — | T | N | Z | V | C |
- C — Carry — перенос
- V — oVerflow — переполнение
- Z — Zero — нулевой результат
- N — Negative — отрицательный результат
- T — Trace — разрешение трассировки
- IM — Interrupt Mask — запрет прерываний
Все знаковые числа внутри ЭВМ представлены в дополнительном коде. Старший разряд знаковый. Поскольку знаковый разряд двоичного числа в дополнительном коде участвует в арифметических операциях так же как и другие разряды, наличие знака не влияет на правила выполнения арифметических операций. Различение происходит в признаках результата. Если выполняется сложение двух беззнаковых чисел, то переполнение обнаруживается в признаке переноса C. Если же складываются знаковые числа, то процессор фиксирует переполнение в признаке V, а знак результата в N. Если сравниваются два числа без знака, то соотношения “меньше”, “больше”, “меньше или равно” и “больше или равно” определяются признаками Z и С. Если же сравниваются числа со знаком, то эти соотношения определяются признаками N, Z и V.
Бит T вызывает прерывание после выполнения очередной команды. Используется отладчиком для пошагового выполнения программы.
Память
Слово | 31 — биты — 24 | 23 — биты — 16 | 15 — биты — 8 | 7 — биты — 0 |
---|---|---|---|---|
0000'0000 | байт 0000'0003 | байт 0000'0002 | байт 0000'0001 | байт 0000'0000 |
0000'0004 | байт 0000'0007 | байт 0000'0006 | байт 0000'0005 | байт 0000'0004 |
… | … | … | … | … |
FFFF'FFFС | байт FFFF'FFFF | байт FFFF'FFFE | байт FFFF'FFFD | байт FFFF'FFFC |
В PDP-32 нет специальных команд ввода-вывода. Объекты ввода-вывода адресуются как ячейки памяти. Диапазон адресов FFF0'0000….FFFF'FFFC обычно используется для обращения к внешним устройствам.
Здесь и далее для кодов и чисел по умолчанию используется шестнадцатеричная система счисления.
Форматы команд
Команда PDP-32 может размещаться в 1, 2 или 3 словах. Второе и третье слова всегда являются адресными и могут содержать непосредственный операнд, абсолютный адрес, смещение для индексной адресации. Первое слово определяет операцию, длину операнда и методы адресации. Основными являются следующие форматы первых слов команды:
Двухадресные команды:
31—28 | 27—————————16 | 15 | 14-13-12 | 11-10-9-8 | 7 | 6-5-4 | 3-2-1-0 |
---|---|---|---|---|---|---|---|
BWH | Opcode | – | MS | RS | – | MD | RD |
Одноадресные команды:
31—28 | 27—————————16 | 15———————————8 | 7 | 6-5-4 | 3-2-1-0 |
---|---|---|---|---|---|
BWH | Opcode | — | – | MD | RD |
Безадресные команды:
31——————————————16 | 15————————————————————0 |
---|---|
Opcode | — |
Команды ветвления:
31—————24 | 23—————————————————————————————0 |
---|---|
Opcode |
- BWH - признак длины операнда (Byte / Word / Halfword): 0 - слово, 1 - байт, 2 - полуслово
- MS, MD - методы адресации операнда-источника (Source) и операнда-приемника (Destination)
- RS, RD - номера регистров, используемых при адресации операнда-источника и операнда-приемника
Способы адресации
Под метод адресации в коде команды выделено три бита.
Метод | Мнемоника | Название | Операнд |
---|---|---|---|
0 | R | Регистровая | R |
1 | (R) | Регистровая косвенная | M[ R ] |
2 | (R)+ | Автоинкрементная | M[ R++ ] |
3 | @(R)+ | Автоинкрементная косвенная | M[ M[ R++ ] ] |
4 | –(R) | Автодекрементная | M[ – –R ] |
5 | @–(R) | Автодекрементная косвенная | M[ M[ – –R ] ] |
6 | X(R) | Индексная | M[ R + *PC++ ] |
7 | @X(R) | Индексная косвенная | M[ M[ R + *PC++ ] ] |
Комбинация метода адресации с регистром R15 (PC) дает:
Метод | Мнемоника | Название | Операнд |
---|---|---|---|
2F | #Op | Непосредственная | *PC++ |
3F | @#EA | Абсолютная | M[ *PC++ ] |
6F | EA | Относительная | M[ PC + *PC++ ] |
7F | @IA | Косвенно-относительная | M[ M[ PC + *PC++ ] ] |
Изменение значения регистров R0-R13 при адресации R++ и – –R выполняется:
- на 1 — для команд обработки байтов
- на 2 — для команд обработки полуслов
- на 4 — в остальных случаях
Регистры PC и SP всегда рассматриваются как указатели на слова, а не байты, поэтому в операциях PC++, – –SP и им подобных выполняется модификация значения на 4.
Команды
Коды команд выбраны похожими на PDP-11. Список кодов, упорядоченный по значению, можно посмотреть здесь.
Одноадресные и двухадресные команды обработки данных
Команды пересылки и установки признаков результата:
Код | N | Z | V | C | Операция | Действия | |
---|---|---|---|---|---|---|---|
CLR | *050 xx DD | 0 | 1 | 0 | 0 | Очистка | D = 0 |
MOV | *100 SS DD | + | + | 0 | - | Пересылка | D = S |
SWAB | 0003 xx DD | + | - | 0 | 0 | Перестановка байтов | D = D[7..0]•D[15..8]•D[23..16]•D[31..24] |
MFPS | 1067 xx DD | - | - | - | - | Чтение PSW | D = PSW |
MTPS | 1064 xx SS | + | + | + | + | Запись PSW | PSW = S |
TST | *057 xx DD | + | + | 0 | 0 | Проверка | D = D |
Логические операции:
Код | N | Z | V | C | Операция | Действия | |
---|---|---|---|---|---|---|---|
COM | *051 xx DD | + | + | 0 | 1 | Инвертирование | D = ^D |
BIT | *300 SS DD | + | + | 0 | - | Проверка разрядов | S & D |
BIC | *400 SS DD | + | + | 0 | - | Очистка разрядов | D &= ^S |
BIS | *500 SS DD | + | + | 0 | - | Логическое сложение | D ^= S |
XOR | 0740 xR DD | + | + | 0 | - | Исключающее ИЛИ | D ^= R |
Арифметические операции и сдвиги:
Код | N | Z | V | C | Операция | Действия | |
---|---|---|---|---|---|---|---|
INC | *052 xx DD | + | + | + | - | Увеличение на 1 | D++ |
DEC | *053 xx DD | + | + | + | - | Уменьшение на 1 | D– – |
CMP | *200 SS DD | + | + | + | + | Сравнение | S – D |
ADD | 0600 SS DD | + | + | + | + | Сложение | D += S |
SUB | 0610 SS DD | + | + | + | + | Вычитание | D –= S |
ADC | *055 xx DD | + | + | + | + | Добавление переноса | D += C |
SBC | *056 xx DD | + | + | + | + | Вычитание переноса | D –= C |
NEG | *054 xx DD | + | + | + | + | Изменение знака | D = 0 – D |
SXT | 0067 xx DD | + | + | + | + | Расширение знака | D[*] = N |
MUL | 0700 xR SS | + | + | 0 | + | Умножение | R *= S |
DIV | 0710 xR SS | + | + | + | + | Деление | R /= S |
ASR | *062 xx DD | + | + | + | + | Арифм. сдвиг вправо | D•C = D[ст]•D |
ASL | *063 xx DD | + | + | + | + | Арифм. сдвиг влево | C•D = D•0 |
ROR | *060 xx DD | + | + | + | + | Цикл. сдвиг вправо | D•C = C•D |
ROL | *061 xx DD | + | + | + | + | Цикл. сдвиг влево | C•D = D•C |
ASH | 0720 xR SS | + | + | + | + | Арифм. сдвиг | S>0 ? R «= S : R »= -S |
Команды управления программой и прерываниями
Безусловный переход и организация подпрограмм:
Код | N | Z | V | C | Операция | Действия | |
---|---|---|---|---|---|---|---|
JMP | 0001 xx DD | - | - | - | - | Безусловный переход | PC = &D |
JSR | 0040 xR DD | - | - | - | - | Обращение к подпрограмме | *(– –SP) = R; R = PC; PC = &D |
RTS | 0002 xx xR | - | - | - | - | Возврат из подпрограммы | PC = R; R = *SP++ |
Программные прерывания и управление:
Код | N | Z | V | C | Операция | Действия | |
---|---|---|---|---|---|---|---|
EMT | 0041 xxxx | + | + | + | + | Прерывание для системных программ | *– –SP = PSW; *– –SP = PC; PC = *(18h); PSW = *(18h+4) |
RTI | 0004 xxxx | + | + | + | + | Возврат из прерывания | PC = *SP++; PSW = *SP++ |
HALT | 0000 xxxx | - | - | - | - | Останов | Ожидание внешнего прерывания |
NOP | 0240 xxxx | - | - | - | - | Нет операции | Пустая команда |
Команды ветвления
Если условие ветвления выполняется, то PC += AAAAAA, где AAAAAA - младшие три байта команды. Слово состояния PSW не изменяется.
Код | Условие | Признаки | |
---|---|---|---|
BR | 41 AAAAAA | Безусловно | нет |
BNE | 42 AAAAAA | Не нуль; неравенство | Z == 0 |
BEQ | 43 AAAAAA | Нуль; равенство | Z == 1 |
BPL | 50 AAAAAA | Плюс | N == 0 |
BMI | 51 AAAAAA | Минус | N == 1 |
BVC | 54 AAAAAA | Нет переполнения | V == 0 |
BVS | 55 AAAAAA | Есть переполнение | V == 1 |
BCC | 56 AAAAAA | Нет переноса | C == 0 |
BCS | 57 AAAAAA | Есть перенос | С == 1 |
Ветвления по неравенству чисел со знаком:
Код | Условие | Признаки | |
---|---|---|---|
BLT | 45 AAAAAA | Меньше | N ~ V == 1 |
BGT | 46 AAAAAA | Больше | Z | (N ~ V) == 0 |
BLE | 47 AAAAAA | Меньше или равно | Z | (N ~ V) == 1 |
BGE | 44 AAAAAA | Больше или равно | N ~ V == 0 |
Ветвления по неравенству чисел без знака:
Код | Условие | Признаки | |
---|---|---|---|
BLO | 57 AAAAAA | Меньше | C == 1 |
BHI | 52 AAAAAA | Больше | Z | C == 0 |
BLOS | 53 AAAAAA | Меньше или равно | Z | C == 1 |
BHIS | 56 AAAAAA | Больше или равно | C == 0 |
Команды изменения признаков в PSW
Код | N | Z | V | C | Действия | |
---|---|---|---|---|---|---|
CLN | 0250 xxxx | + | - | - | - | N = 0 |
CLZ | 0244 xxxx | - | + | - | - | Z = 0 |
CLV | 0242 xxxx | - | - | + | - | V = 0 |
CLC | 0241 xxxx | - | - | - | + | C = 0 |
CCC | 0257 xxxx | + | + | + | + | N=Z=V=C=0 |
SEN | 0270 xxxx | + | - | - | - | N = 1 |
SEZ | 0264 xxxx | - | + | - | - | Z = 1 |
SEV | 0262 xxxx | - | - | + | - | V = 1 |
SEC | 0261 xxxx | - | - | - | + | С = 1 |
SCC | 0277 xxxx | + | + | + | + | N=Z=V=C=1 |
Прерывания
Прерывания в PDP-32 в зависимости от инициатора делят на программные и аппаратные. Прерывания по инициативе программы возникают, когда процессор выполняет одну из команд EMT, TRAP, IOT, BPT. Аппаратное прерывание возникает, когда процессор перед началом выборки следующей команды обнаружил внешний запрос на прерывание. При этом разряд PSW[7] имеет смысл признака запрета прерывания. При входе в прерывание выполняются действия:
- сохранение PSW в стеке (*– –SP = PSW);
- сохранение адреса возврата в стеке (*– –SP = PC);
- занесение стартового адреса программы обработки прерывания в PC из первого слова вектора прерывания (PC = *AV);
- занесение нового значения PSW из второго слова вектора прерывания (PC = *(AV+4)).
Выход из подпрограммы обработки прерывания происходит по команде RTI, выполнение которой заключается в восстановлении из стека адреса возврата (PC = *SP++) и старого значения PSW (PSW = *SP++). Командам вызова программных прерываний соответствуют вполне определенные адреса двухсловных векторов прерываний. Адрес вектора аппаратного прерывания передается в процессор блоком сопряжения с ВУ, когда тот получает от процессора подтверждение, что его требование прерывания удовлетворяется. Вектора в PDP-32 занимают пространство памяти с адресами в диапазоне 0..256.
Вектор | Причина |
---|---|
00 | Cтарт системы |
08 | Значение PC или SP не кратно 4 |
10 | Неизвестный код команды |
18 | Системный вызов EMT |
20 | Прерывание трассировки |
Страничная организация памяти
(не проработано)