/
Текст
САВВАТЕЕВ И. И.
АРХИТЕКТУРА PDP-11
1
Аннотация
Данный документ представляет собой описание архитектуры вычислительных машин семейств PDP-11 и LSI-11 фирмы DEC и совместимых с ними советских ЭВМ (СМ-4,
СМ-1420, «Электроника-60» и др.) с точки зрения программиста: описываются система команд, организация прерываний, механизмы преобразования адресов и защиты памяти и т. п.
2
ОГЛАВЛЕНИЕ
1. Введение.......................................................................................................................................... 8
2. Общая организация........................................................................................................................9
2.1. Общая архитектура вычислительной системы....................................................................9
2.2. Системная шина.................................................................................................................... 13
2.3. Оперативная память..............................................................................................................15
2.3.1. Организация памяти..................................................................................................... 15
2.3.2. Адресация памяти......................................................................................................... 16
2.4. Центральный процессор.......................................................................................................17
2.5. Внешние устройства.............................................................................................................18
3. Управление центральным процессором.....................................................................................19
3.1. Состояния процессора и режимы работы...........................................................................19
3.2. Регистры процессора............................................................................................................ 19
3.2.1. Регистры общего назначения.......................................................................................19
3.2.2. Указатель стека.............................................................................................................. 20
3.2.3. Счётчик команд............................................................................................................. 21
3.2.4. Контроль стека и регистр границы стека SL..............................................................21
3.2.5. Слово состояния процессора.......................................................................................23
3.2.6. Регистр консольных переключателей SWR и регистр консольных индикаторов...26
3.2.7. Регистр программных запросов прерываний PIRQ...................................................26
3.2.8. Регистр ошибок процессора.........................................................................................27
3.2.9. Регистры аппаратного контроля..................................................................................27
3.3. Выполнение команд.............................................................................................................. 28
3.3.1. Форматы команд............................................................................................................28
3.3.2. Адресация операндов................................................................................................... 28
3.3.3. Выборка команд и операндов.......................................................................................32
3.3.4. Переходы........................................................................................................................33
3.4. Обработка прерываний.........................................................................................................33
3.4.1. Причины прерываний................................................................................................... 33
3.4.1.1. Прерывание по ошибкам обращения к шине (вектор 4)....................................34
3.4.1.2. Прерывание по недопустимой команде (вектор 10)...........................................35
3.4.1.3. Прерывание по биту T (вектор 14).......................................................................35
3.4.1.4. Прерывания по командам прерываний (векторы 14, 20, 30, 34).......................36
3.4.1.5. Прерывание по аварии электропитания (вектор 24)..........................................36
3.4.1.6. Прерывание по регистру PIRQ (вектор 240).......................................................36
3.4.1.7. Прерывание по ошибкам при выполнении команд вещественной арифметики
(вектор 244)......................................................................................................................... 36
3.4.1.8. Прерывание от MMU (вектор 250)......................................................................37
3.4.1.9. Запросы внешних прерываний.............................................................................37
3.4.2. Обработка запроса прерывания...................................................................................38
3.4.3. Возврат из прерывания................................................................................................. 38
3.5. Сброс и пуск процессора..................................................................................................... 39
4. Преобразование адресов.............................................................................................................. 40
4.1. Виртуальные и физические адреса.....................................................................................40
4.2. Регистры MMU..................................................................................................................... 41
4.2.1. Регистры адресов страниц............................................................................................42
4.2.2. Регистры описаний страниц.........................................................................................42
4.2.3. Регистр MMR0 (SR0).................................................................................................... 44
4.2.4. Регистр MMR1 (SR1).................................................................................................... 46
3
4.2.5. Регистр MMR2 (SR2).................................................................................................... 46
4.2.6. Регистр MMR3 (SR3).................................................................................................... 47
4.3. Процесс преобразования адреса..........................................................................................47
4.3.1. Преобразование адресов при выключенном MMU...................................................47
4.3.2. Преобразование адресов при включённом MMU......................................................48
4.3.3. Отслеживание обращений к памяти............................................................................49
4.4. Диагностический режим MMU...........................................................................................49
4.5. Устройство отображения адресов шины.............................................................................49
5. Набор команд центрального процессора....................................................................................50
5.1. Представление информации................................................................................................50
5.2. Двухадресные арифметико-логические команды..............................................................50
5.2.1. MOV, MOVB — пересылка.......................................................................................... 50
5.2.2. CMP, CMPB — сравнение............................................................................................51
5.2.3. BIT, BITB — проверка битов....................................................................................... 52
5.2.4. BIC, BICB — сброс битов............................................................................................52
5.2.5. BIS, BISB — установка битов......................................................................................53
5.2.6. ADD — сложение.......................................................................................................... 53
5.2.7. SUB — вычитание.........................................................................................................53
5.2.8. MUL — умножение.......................................................................................................54
5.2.9. DIV — деление.............................................................................................................. 55
5.2.10. ASH — арифметический сдвиг многоразрядный....................................................56
5.2.11. ASHC — арифметический сдвиг двойного слова многоразрядный.......................56
5.2.12. XOR — исключающее или.........................................................................................57
5.3. Одноадресные арифметико-логические команды.............................................................58
5.3.1. CLR, CLRB — очистка.................................................................................................58
5.3.2. COM, COMB — инверсия............................................................................................58
5.3.3. INC, INCB — инкремент.............................................................................................. 58
5.3.4. DEC, DECB — декремент............................................................................................ 59
5.3.5. NEG, NEGB — смена знака.........................................................................................59
5.3.6. ADC, ADCB — сложение с переносом.......................................................................59
5.3.7. SBC, SBCB — вычитание с заёмом.............................................................................60
5.3.8. TST, TSTB — проверка.................................................................................................60
5.3.9. ROR, RORB — циклический сдвиг вправо................................................................60
5.3.10. ROL, ROLB — циклический сдвиг влево.................................................................61
5.3.11. ASR, ASRB — арифметический сдвиг вправо.........................................................61
5.3.12. ASL, ASLB — арифметический сдвиг влево............................................................62
5.3.13. SWAB — обмен байтов...............................................................................................62
5.3.14. SXT — расширение знака..........................................................................................62
5.4. Команды перехода.................................................................................................................63
5.4.1. JMP — безусловный переход абсолютный.................................................................63
5.4.2. JSR — переход к подпрограмме..................................................................................63
5.4.3. RTS — возврат из подпрограммы................................................................................64
5.4.4. MARK — возврат из подпрограммы с очисткой стека..............................................64
5.4.5. SOB — переход по счётчику........................................................................................64
5.4.6. BR — безусловный переход относительный..............................................................65
5.4.7. Команды условных переходов.....................................................................................65
5.5. Команды управления флажками..........................................................................................65
5.6. Команды набора FIS............................................................................................................. 66
5.6.2. FADD — сложение вещественное...............................................................................67
5.6.3. FSUB — вычитание вещественное.............................................................................67
4
5.6.4. FMUL — умножение вещественное............................................................................68
5.6.5. FDIV — деление вещественное................................................................................... 68
5.7. Прочие команды.................................................................................................................... 69
5.7.1. BPT, IOT, EMT и TRAP — программное прерывание...............................................69
5.7.2. RTI, RTT — возврат из прерывания............................................................................70
5.7.3. MFPI, MFPD — пересылка из области предыдущего режима.................................70
5.7.4. MTPI, MTPD — пересылка в область предыдущего режима...................................71
5.7.5. MFPS — пересылка из регистра состояния................................................................72
5.7.6. MTPS — пересылка в регистр состояния...................................................................72
5.7.7. MFPT — получение типа процессора.........................................................................72
5.7.8. CSM — вызов супервизора..........................................................................................73
5.7.9. SPL — установка приоритета процессора..................................................................73
5.7.10. HALT — останов процессора....................................................................................74
5.7.11. RESET — сброс шины................................................................................................ 74
5.7.12. WAIT — ожидание прерывания.................................................................................75
5.7.13. TSTSET — проверка и установка..............................................................................75
5.7.14. WRTLCK — запись с блокировкой...........................................................................76
6. Команды процессора с плавающей запятой...............................................................................77
6.1. Форматы обрабатываемых данных.....................................................................................78
6.2. Регистры процессора с плавающей запятой.......................................................................79
6.2.1. Аккумуляторы............................................................................................................... 79
6.2.2. Регистр состояния.........................................................................................................79
6.2.3. Регистр кодов прерываний ППЗ..................................................................................81
6.2.4. Регистр адреса ошибки.................................................................................................81
6.3. Форматы команд вещественной арифметики.....................................................................81
6.4. Набор команд вещественной арифметики..........................................................................82
6.4.1. ABSF, ABSD — абсолютная величина вещественная...............................................82
6.4.2. ADDF, ADDD — сложение вещественное..................................................................83
6.4.3. CLRF, CLRD — очистка вещественная...................................................................... 83
6.4.4. CMPF, CMPD — сравнение вещественное.................................................................84
6.4.5. CFCC — копирование флажков ППЗ во флажки ЦП.................................................84
6.4.6. DIVF, DIVD — деление вещественное....................................................................... 84
6.4.7. LDF, LDD — загрузка вещественная..........................................................................85
6.4.8. LDCDF, LDCFD — загрузка вещественная с изменением точности.......................85
6.4.9. LDCIF, LDCID, LDCLF, LDCLD — загрузка целого с преобразованием в вещественное................................................................................................................................... 86
6.4.10. LDEXP — загрузка порядка.......................................................................................86
6.4.11. LDFPS — загрузка слова состояния ППЗ.................................................................87
6.4.12. MODF, MODD — умножение вещественное с получением целого.......................87
6.4.13. MULF, MULD — умножение вещественное............................................................88
6.4.14. NEGF, NEGD — смена знака вещественная.............................................................89
6.4.15. SETD — установка режима вещественных чисел двойной точности...................89
6.4.16. SETF — установка режима вещественных чисел одиночной точности................89
6.4.17. SETI — установка режима коротких целых чисел..................................................89
6.4.18. SETL — установка режима длинных целых чисел..................................................89
6.4.19. STF, STD — сохранение вещественное....................................................................90
6.4.20. STCFD, STCDF — сохранение вещественного с изменением точности...............90
6.4.21. STCFI, STCFL, STCDI, STCDL — сохранение вещественного с преобразованием
в целое...................................................................................................................................... 90
6.4.22. STEXP — сохранение порядка...................................................................................91
5
6.4.23. STFPS — сохранение слова состояния ППЗ.............................................................91
6.4.24. STST — сохранение состояния ППЗ.........................................................................91
6.4.25. SUBF, SUBD — вычитание вещественное...............................................................92
6.4.26. TSTF, TSTD — проверка вещественная....................................................................92
7. Коммерческий набор команд....................................................................................................... 93
7.1. Общие сведения....................................................................................................................93
7.2. Приостановка выполнения команды...................................................................................93
7.3. Типы данных.........................................................................................................................94
7.3.1. Символы.........................................................................................................................94
7.3.2. Строки символов........................................................................................................... 94
7.3.3. Наборы символов..........................................................................................................94
7.3.4. Десятичные строки.......................................................................................................94
7.3.4.1. Упакованные строки..............................................................................................96
7.3.4.2. Зонные строки........................................................................................................97
7.3.4.3. Перфорированные строки.....................................................................................97
7.3.4.4. Строки с отдельным знаком.................................................................................99
7.3.5. Длинные целые числа................................................................................................... 99
7.4. Требования к состоянию для выполнения команд...........................................................100
7.5. Набор команд.......................................................................................................................100
7.5.1. Команды обработки символьных строк....................................................................100
7.5.1.1. CMPC(I) — сравнение строк символов.............................................................100
7.5.1.2. LOCC(I) — поиск символа в строке..................................................................101
7.5.1.3. MATC(I) — поиск подстроки.............................................................................102
7.5.1.4. MOVC(I) — пересылка строки символов.........................................................103
7.5.1.5. MOVRC(I) — пересылка строки символов с выравниванием по правому краю
............................................................................................................................................ 104
7.5.1.6. MOVTC(I) — пересылка строки символов с преобразованием......................105
7.5.1.7. SCANC(I) — поиск символа из набора.............................................................106
7.5.1.8. SKPC(I) — пропуск символа.............................................................................. 107
7.5.1.9. SPANC(I) — пропуск символов из набора........................................................108
7.5.2. Команды обработки десятичных строк.....................................................................108
7.5.2.1. ADDN(I), ADDP(I) — сложение десятичное....................................................108
7.5.2.2. ASHN(I), ASHP(I) — арифметический сдвиг числовых строк.......................109
7.5.2.3. CMPN(I), CMPP(I) — сравнение числовых строк............................................111
7.5.2.4. DIVP(I) — деление упакованных строк.............................................................111
7.5.2.5. MULP(I) — умножение упакованных строк.....................................................112
7.5.2.6. SUBN(I), SUBP(I) — вычитание числовых строк............................................113
7.5.3. Команды преобразования десятичных строк............................................................114
7.5.3.1. CVTLN(I), CVTLP(I) — преобразование длинного целого в десятичную строку........................................................................................................................................ 114
7.5.3.2. CVTNL(I), CVTPL(I) — преобразование десятичной строки в длинное целое
............................................................................................................................................ 115
7.5.3.3. CVTNP(I), CVTPN(I) — преобразование числовой строки в упакованную или
наоборот............................................................................................................................ 116
7.5.4. Команды загрузки описателей...................................................................................117
7.5.4.1. L2Dr — загрузка двух описателей.....................................................................117
7.5.4.2. L3Dr — загрузка трёх описателей.....................................................................117
8. Прочие средства и возможности............................................................................................... 119
8.1. Загрузчик и эмулятор пульта..............................................................................................119
8.2. Сетевой таймер....................................................................................................................119
6
8.3. Консольный терминал........................................................................................................120
Приложение 1. Коды команд......................................................................................................... 122
Приложение 2. Векторы прерываний........................................................................................... 129
Приложение 3. Адреса регистров и устройств............................................................................131
7
1. Введение
Данное описание относится к мини-ЭВМ семейств PDP-11 и LSI-11, созданным американской фирмой Digital Equipment Corporation (DЕС) и ставшим, вероятно, самыми популярными вычислительными машинами конца 1970-х – начала 1980-х годов в мире. Первая модель, PDP-11/20, появилась в 1969, а производство её потомков продолжалось до конца 1980х годов. Помимо самой DEC, архитектурно аналогичные машины в больших количествах
производились в СССР, став на тот момент самыми массовыми советскими компьютерами;
наиболее известными из них были:
• мини-ЭВМ СМ-3, СМ-4, СМ-1600, СМ-1420, СМ-1425;
• микро-ЭВМ СМ-1300, «Электроника-60», «Электроника-100/25»;
• персональные ЭВМ ДВК-1, ДВК-2, ДВК-3;
• бытовые ЭВМ БК-0010, БК-0011.
Все эти ЭВМ совместимы на уровне системы команд, однако набор внешних устройств и
другие особенности организации машины в целом у них могут очень сильно отличаться. Особенно это касается бытовых ЭВМ типа БК, которые изначально создавались для работы в домашних условиях с бытовым кассетным магнитофоном, а задача обеспечить их совместимость со штатными ОС и программным обеспечением «настоящих ЭВМ» не ставилась.
Следует заметить, что в отличие от, например, IBM с её Системой 360, Системой 370 и
другими мэйнфреймами, никакого единого руководства по архитектуре PDP-11 изначально не
существовало, и «официальное упорядочивание» последующих расширений было произведено лишь в марте 1976 года выпуском стандарта DEC 168. Как следствие, машины этого семейства, будучи, в общем и целом, совместимыми между собой, нередко имеют те или иные
странности и отклонения, способные в определённых случаях создать проблемы с переносимостью программ; о некоторых из них будет сказано в этом документе.
За основу данной публикации взята документация по нескольким моделям фирмы DEC, в
частности, PDP-11/20 — хронологически первой машины, появившейся на рубеже 1960-70-х
годов, — и PDP-11/70, одной из наиболее мощных мини-ЭВМ и по сути, «эталонной» реализации данной архитектуры во второй половине 1970-х годов. Где уместно, указываются отличия других машин, однако на абсолютную полноту эти сведения претендовать не могут.
Если прямо не сказано иное, под обозначением PDP-11 будут пониматься любые машины и
этой серии, и LSI-11, и все прочие реализации данной архитектуры.
Поскольку PDP-11 является шестнадцатиразрядной машиной, одно машинное слово состоит из двух байтов. В отличие от большинства других более-менее современных вычислительных машин, на PDP-11 для записи адресов, кодов команд и т. д. принята восьмеричная, а
не шестнадцатеричная система, что вызвано наличием восьми адресуемых регистров и восьми видов адресации. В дальнейшем тексте все адреса, данные, коды команд и другая числовая информация записывается в восьмеричной системе; у любых исключений система счисления указывается явно.
8
2. Общая организация
2.1. Общая архитектура вычислительной системы
Изначально мини-ЭВМ семейства PDP-11 строились вокруг шины UNIBUS, заимствованной СССР под названием «ОБЩАЯ ШИНА». В самой первой модели, PDP-11/20, появившейся в 1969 году и предназначенной для построения модульных систем сбора данных и
управления процессами в реальном времени, базовая конфигурация включала всего лишь
несколько устройств:
• процессор KA11;
• оперативную память MM11-E объёмом 8 Кбайт1;
• системный таймер KW11-L;
• используемый в качестве терминала оператора или программиста телетайп типа Model 33
ASR, подключаемый через контроллер KL11 и включающий клавиатуру, печатающее
устройство, устройство считывания перфоленты и устройство вывода на перфоленту;
• необязательное устройство быстрого перфоленточного ввода-вывода PC11.
Единственным способом долговременного хранения информации на PDP-11/20 в базовой
конфигурации была перфолента, хотя возможность подключения магнитных дисков и лент в
документации упоминается и позже была реализована.
Одновременно с PDP-11/20 появился её вариант PDP-11/10, отличающийся составом оборудования:
• процессор KA11;
• оперативная память MW11-A объёмом 512 байт;
• постоянная память MR11-A объёмом 2 Кбайта;
• системный таймер KW11-L.
Заметим, что DEC весьма хаотично нумеровала свои модели, из-за чего некоторые номера иногда использовались повторно. В частности, позже обозначение PDP-11/10 было использовано для машины PDP-11/05, но предназначенной не для встраивания разработчиками оборудования (OEM) в качестве «мозгов» для их продукции, а как обычный компьютер для конечных пользователей. Эти две модели технически являются идентичными, основываются на
процессоре KD11-B и появились, вероятно, в 1972 году (этот год указан на имеющейся документации). Исходная же PDP-11/10, являвшаяся вариантом PDP-11/20, была, похоже, переименована
в PDP-11/15.
Все перечисленные стандартные устройства, а также оборудование, разработанное пользователем, подключаются на равноправной основе к шине UNIBUS. Процессор, используя
эту шину, может читать и записывать двухбайтовые слова или отдельные байты памяти и обращаться к регистрам внешних устройств, которые адресуются как ячейки памяти: с точки
зрения процессора, разницы между обращением к памяти и внешним устройствам нет.
Например, и телетайп (а точнее, его контроллер KL11), и отдельное устройство ввода-вывода
перфолент PC11 для программиста доступны как четыре регистра размером слово каждый и
используют по два вектора прерывания: по два регистра и одному вектору для ввода и для
вывода данных.
Шина UNIBUS насчитывает 56 сигналов, в том числе 16 линий данных и 18 линий адреса, благодаря чему объём её физического адресного пространства составляет 256 Кбайт, а не
64 Кбайта, хотя процессор прямо адресует лишь этот объём. Этим решением DEC изначально
заложила возможность расширения архитектуры, однако оно может вызвать некоторую пута1
В документации и операционных системах DEC объём памяти почти всегда выражается не в байтах, а в
словах — наследие эпохи, когда машины не имели деления слова на более мелкие единицы.
9
ницу: необходимо чётко различать 16-разрядные адреса, используемые программой, и 18-разрядные адреса шины. В дальнейшем ситуация осложнилась введением 22-разрядных физических адресов памяти, о чём будет сказано позже.
Уже на PDP-11/20 было принято распределение адресного пространства шины, почти
неукоснительно соблюдавшееся в дальнейшем. Общий объём адресного пространства памяти
на шине составляет 248 Кбайт, простираясь от нуля до адреса 757000; как правило, весь этот
объём отводится под оперативную память. Физически имеющаяся память всегда начинается с
нулевого адреса, причём младшие 256 байт (адреса 000000–000377) отводятся под векторы
прерываний. Старшие 8 Кбайт адресного пространства шины (760000–777777, так называемая внешняя страница памяти) отводятся под регистры внешних устройств, а также регистры процессора, адресуемые как ячейки памяти (впрочем, последние обычно доступны
лишь самому процессору, но не со стороны шины).
Поскольку процессор KA11 формирует 16-разрядные адреса, а для адресации регистров
устройств необходимо сформировать 18-разрядный адрес, содержащий единицы в старших
разрядах, аппаратура сопряжения процессора с шиной обеспечивает простейшее преобразование 16-разрядного адреса в 18-разрядный: если процессор сформировал адрес, лежащий в
старших 8 Кбайтах его адресного пространства, т. е. в диапазоне адресов 160000–177777 (три
старших разряда 16-разрядного адреса установлены), к ним слева добавляются два единичных разряда, что и даёт адреса шины в диапазоне 760000–777777; если же процессор формирует адрес, относящийся к младшим 56 Кбайтам (000000–157777), то слева к нему добавляется два нулевых разряда.
Несколько позже появилась шина Q-BUS, называемая также LSI BUS, поскольку изначально она предназначалась для машин серии LSI-11 — младшей ветви PDP-11, сохраняющей почти полную программную совместимость «снизу вверх», но имевшей меньшие массу,
габариты и возможности. В СССР эта шина была заимствована под обозначением МПИ («магистральный параллельный интерфейс») и широко использовалась во многих малых машинах — в «Электронике-60», ПК семейства ДВК, бытовых компьютерах БК и др., иногда с некоторыми отклонениями от стандарта. Хотя по набору сигналов Q-BUS имеет заметные отличия от UNIBUS (самое важное — совмещённая шина адреса и данных), «идеологически»
обе шины очень близки, поэтому, с точки зрения программиста, почти всё сказанное о
UNIBUS относится и к Q-BUS.
Наконец, в наиболее мощных машинах, в частности, в PDP-11/70, помимо обычной шины
UNIBUS, обеспечивается возможность подключения высокоскоростных накопителей на магнитных дисках и лентах (так называемые устройства MASS STORAGE). Использование
нескольких шин требует весьма сложной архитектуры машины в целом, что, однако, остаётся
незаметным для программиста. В качестве примера рассмотрим блок-схему PDP-11/70, взятую из руководства по этой машине.
В левой части расположен центральный процессор вместе с устройством управления памятью (MMU, memory management unit), которое в советской литературе обычно именуется
диспетчером памяти (ДП); этот блок обеспечивает преобразование 16-разрядных виртуальных адресов, используемых программой, в 18- или 22-разрядные физические. К центральному процессору может быть подключён процессор с плавающей запятой (floating point processor, FPP или ППЗ): он не является обязательным, но, как правило, присутствует.
На выходе MMU всегда формируются 22-разрядные физические адреса, однако правила
их формирования отличаются в зависимости от того, включено ли MMU, а если включено, то
работает ли в 18- или в 22-разрядном режиме. Подробнее об этом будет сказано в разделе, посвящённом MMU, здесь же заметим, что при выключенном MMU обращение к старшим 8
Кбайтам виртуального адресного пространства преобразуется в обращение к старшим 8
Кбайтам физического адресного пространства, т. е. разряды 21:13 физического адреса при та-
10
ком обращении будут установлены. Этим достигается совместимость PDP-11/70 и других машин, имеющих MMU, с программным обеспечением, не использующим этот блок.
Рис. 1. Блок-схема PDP-11/70
Обращения по физическим адресам, относящимся к старшим 256 Кбайтам адресного
пространства, т. е. лежащим в диапазоне 17000000–17777777, всегда отправляются на шину
UNIBUS; в этот диапазон, очевидно, попадают и адреса регистров процессора и внешних
устройств, занимающие старшие 8 Кбайт физического адресного пространства (17760000–
17777777). Обращения по физическим адресам ниже 17000000 попадают в кэш, имеющий на
этой модели объём 2 Кбайта, и через него в оперативную память, при этом, если производится операция считывания и данные уже имеются в кэше, они считываются из него без физического доступа к памяти, что значительно снижает время чтения. Теоретически, объём оперативной памяти может достигать 4 Мбайт без 256 Кбайт, всегда отображаемых на UNIBUS,
однако физически допускается память объёмом не свыше 2 Мбайт.
Традиционные внешние устройства, подключаемые только к шине UNIBUS и способные
обращаться к памяти по своей инициативе, используя механизм внепроцессорной передачи
данных, т. е., в более привычной терминологии, прямой доступ к памяти (direct memory access, DMA; именно этот термин будет использоваться в дальнейшем), выдают свои запросы к
памяти на UNIBUS. Эти запросы используют 18-разрядный адрес, установленный программой, запускающей операцию ввода-вывода на устройстве, и попадают в диапазон адресов
UNIBUS 000000–757777. Они обслуживаются устройством отображения адресов UNIBUS на
адреса памяти (UNIBUS MAP; не путать его с MMU, входящим в состав процессора и преобразующим адреса, вырабатываемые процессором). В советской литературе это устройство
нередко обозначается откровенно неудачным термином «контроллер памяти»; в данном документе оно будет называться просто устройством отображения. Задачей этого устройства является преобразование 18-разрядных адресов UNIBUS, сформированных устройствами, в 22разрядные физические адреса памяти. После этого запрос с уже преобразованным адресом
через кэш передаётся в память.
Наконец, высокоскоростные устройства сразу формируют 22-разрядный адрес памяти и
не нуждаются в использовании устройства отображения. Они напрямую подключены к кэшу
11
и через него к памяти, причём для обмена данными используют скоростную 32-разрядную
шину. К их числу относятся магнитные диски RP04 ёмкостью 88 Мбайт и скоростью передачи 800 Кбайт/с, магнитные диски с фиксированными головками RS04 (1 Мбайт, 1 Мбайт/с) и
RS03 (512 Кбайт, 512 Кбайт/с), а также накопители на магнитных лентах TU16 с продольной
плотностью записи 64 бит/мм (1600 бит на дюйм).
PDP-11/70 являет собой пример прозрачного для программиста использования в одной
машине нескольких шин разных типов, полностью совместимого с любыми штатными операционными системами. Встречаются, однако, и довольно странные варианты, обладающие
лишь частичной совместимостью. Посмотрим, например, на блок-схему PDP-11/44 из руководства по этой машине.
Рис. 2. Блок-схема PDP-11/44
Для начала, можно обратить внимание, что консольный терминал и накопитель на магнитных лентах типа TU58 подключены к процессору KD11-Z напрямую, а не через UNIBUS.
Этот аппаратный «костыль» для программиста незаметен, поэтому на программную совместимость не влияет.
Входящий в состав процессора модуль интерфейса шины обеспечивает связь внутренней
расширенной шины данных и адреса, шины адреса памяти и обычной шины UNIBUS. Доступы процессора к основной памяти, объём которой может достигать 1 Мбайт, кэшируются.
К шине UNIBUS, помимо внешних устройств, может быть подключена так называемая
память UNIBUS — отдельный блок памяти, имеющий объём 248 Кбайт. На шине UNIBUS
этой памяти соответствуют обычные адреса 000000–757777, а выше него располагается, как
обычно, внешняя страница памяти. Однако для процессора память UNIBUS доступна только
при использовании 22-разрядной адресации, причём по физическим адресам 17000000–
17757777, т. е. лежащим вплотную к внешней странице памяти; меньшие физические адреса
относятся к основной памяти, начинающейся, как обычно, с нулевого адреса.
Таким образом, в данной машине могут присутствовать два несмежных участка оперативной памяти, причём обычные операционные системы о памяти UNIBUS ничего не знают
и использовать не могут. Цель, которую преследовали разработчики включением этого блока
памяти, неизвестна. Заметим, что технически можно было бы подключить такую память и на
PDP-11/70, но официально это не предусматривалось — надо полагать, как раз в связи с невозможностью её использовать средствами штатных операционных систем.
12
Возможность использования нескольких процессоров изначально не предусматривалась.
Позднее появились двухпроцессорные комплексы, но они всегда являются несимметричными. Один процессор является ведущим (в документации на UNIBUS он обозначается термином interrupt fielding processor), другой — ведомым. Ведущий процессор загружает операционную систему, а в дальнейшем, помимо выполнения прикладных программ, управляет операциями ввода-вывода и обрабатывает прерывания. Ведомый процессор после завершения
загрузки системы запускается оператором вручную с пульта управления; прерывания он обрабатывать не может, а соответственно, для выполнения операций ввода-вывода обращается
к ведущему процессору. Технически он подключается к шине как обычное внешнее устройство, обладающее возможностями DMA и способное выдавать запросы прерываний, для чего
обычным образом захватывает шину (см. следующий раздел).
Технически возможно создание комплексов с процессорами разных архитектур. В СССР
существовал и получил широкое распространение один такой комплекс — ЭВМ СМ-1600,
помимо основного процессора с архитектурой PDP-11 располагавшая спецпроцессором, реализующим систему команд машины М-5000 и выглядевшим для основного процессора обычным внешним устройством, имеющим два регистра для управления его работой и обладающим возможностями прямого доступа к памяти.
2.2. Системная шина
Как уже отмечалось, независимо от того, какая физическая шина или набор шин используется в конкретной модели, с точки зрения программиста поведение машины не отличается,
поэтому в этом разделе речь идёт о принципах организации шины вообще.
Все устройства, подключённые к шине, делятся на инициаторы (в советской документации часто назывались задатчиками, английское название вполне традиционно — master) и исполнители или ответчики (slave). Обмен данными всегда начинается инициатором, исполнитель лишь отвечает на сигналы, исходящие от инициатора. Большинство устройств, например, оперативная память и многие периферийные устройства, могут выступать только в роли
исполнителей. Некоторые периферийные устройства, например, контроллеры накопителей на
магнитных дисках и лентах, могут выступать в роли и исполнителей, отвечая на обращения
процессора, настраивающего их на выполнение той или иной операции ввода-вывода, и инициаторов, осуществляя обмен с памятью с помощью DMA. Заметим попутно, что каждый
контроллер, способный использовать DMA, имеет свои собственные регистры для хранения
адреса памяти и счётчика байтов: централизованного контроллера DMA, обслуживающего
разные периферийные устройства, в PDP-11 не предусмотрено.
Процессор обычно выступает в роли инициатора, но может являться и исполнителем, а
временами — одновременно и инициатором, и исполнителем. Причина этого кроется в том,
что ряд регистров, управляющих его работой (в частности, все регистры MMU), доступны
программе как ячейки памяти, расположенные по определённым адресам, и доступ к ним
осуществляется обычными командами, адресующими память. Доступны ли такие регистры
процессора другим инициаторам и отражаются ли обращения процессора к его собственным
регистрам на самой шине, зависит от реализации; как правило, обращения к регистрам процессора возможны лишь со стороны самого процессора и его пульта управления, но не со
стороны шины.
Хотя к шине подключается множество устройств, в любой момент времени может быть
активен только один инициатор, взаимодействующий только с одним исполнителем. Некоторое устройство, желающее стать инициатором, выставляет на шину запрос, который поступает в арбитр. Арбитр заранее выставляет сигнал, подтверждающий выделение шины, после
чего устройство дожидается её освобождения текущим инициатором и приступает к выполнению своих операций, становясь новым инициатором. Благодаря этому механизму арбитраж
13
следующего обращения к шине выполняется одновременно с текущим обращением, что повышает пропускную способность.
Шина UNIBUS имеет пять уровней приоритетов запросов на доступ к шине, обозначаемых по именам соответствующих сигналов: NPR, BR7–BR4; Q-BUS в зависимости от разновидности может поддерживать сокращённый набор запросов. Архитектура допускает расширение количества запросов BR до семи, хотя на практике это, похоже, никогда не использовалось.
Запрос NPR является самым высокоприоритетным и программно блокирован быть не может. Устройство, получившее шину в ответ на этот запрос, может пользоваться шиной только
для обмена данными по DMA (само название NPR — это сокращение от non processor request, т. е. запрос на внепроцессорный обмен данными).
Запросы BR (bus request — запрос шины) могут программно блокироваться, для чего в
слове состояния процессора PSW предусмотрено трёхбитовое поле приоритета. Это поле
запрещает запросы BR с номерами, равными или меньшими значения поля; таким образом, значение 0 разрешает любые запросы BR, а значение 7 — запрещает.
Устройство, завладевшее шиной с помощью запроса BR, может использовать шину как
для обмена данными по DMA, так и для выдачи процессору запроса прерывания. Изначальная идея, вероятно, заключалась в том, что запросы BR позволяют устройствам выполнять
обмен данными, не требующий срочности, и устройства должны пользоваться им, чтобы не
препятствовать процессору, установившему повышенный приоритет, выполнять критически
важный код; запрос NPR должен использоваться только для срочной пересылки данных, которую нельзя откладывать. На практике, однако, устройства выдают запросы BR лишь для
последующей передачи запроса прерывания, из-за чего эти линии часто считаются сигналами
запросов прерываний, хотя таковыми не являются.
Поскольку линий запросов всего пять или меньше, а устройств обычно существенно
больше, линии ответов арбитра на запросы (NPG, BG7–BG4, где буква G соответствует слову
grant) проходят последовательно через все устройства. То устройство, которое выдало соответствующий запрос, блокирует дальнейшее распространение ответного сигнала и начинает
обмен по шине, как только предыдущий инициатор её освободит. Таким образом, приоритет
запроса определяется как линией, по которой он выдаётся, так и физической близостью
устройства на шине к арбитру.
Важной особенностью любых шин PDP-11 по сравнению с, например, шиной ISA, лежащей в основе IBM PC и других совместимых с ним ранних персональных компьютеров, является то, что сигналы инициатора требуют подтверждающих сигналов исполнителя. Кроме
того, нередко предусматривается возможность информировать инициатор о том, что в исполнителе обнаружены какие-либо неисправности, делающие невозможным правильное выполнение запроса (скажем, оперативная память обнаружила, что данные в адресуемой ячейке памяти повреждены и не могут быть самой памятью скорректированы). Благодаря этому инициатор знает, что его обращение дошло до адресата и было исполнено должным образом.
При обращении к несуществующей области памяти или к отсутствующему или выключенному периферийному устройству ответа не будет, аппаратура инициатора распознает так называемый таймаут шины и зафиксирует возникновение ошибки. В частности, процессор, не дождавшись ответа за определённое время или получив сигнал ошибки, прервёт выполнение
команды и вызовет обработчик прерывания по вектору 4, отвечающий за обработку подобных ошибок. Подобное решение повышает надёжность системы, однако вкупе с асинхронностью шины приводит к довольно низкой пропускной способности. Так, шина UNIBUS в
PDP-11/20 требует порядка 750 нс для пересылки одного слова, что даёт пропускную способность порядка 2,5 Мбайт/с (в реальности скорость ещё меньше из-за дополнительных задержек, вносимых памятью). Впоследствии это время немного сократилось, но всё равно осталось весьма значительным.
14
PDP-11 разрабатывалась как мини-ЭВМ невысокой стоимости, поэтому применение кэша
не предусматривалось, да и не имело на тот момент смысла. Впоследствии ситуация изменилась, и на старших моделях второй половины 1970-х и в 1980-х годах кэш-память стала
обычным явлением. Однако для сохранения совместимости с ранее созданным программным
обеспечением кэш-память является полностью прозрачной: она отслеживает любые операции на шине, выполняемые любыми инициаторами, и при необходимости корректирует своё
содержимое. Таким образом, с точки зрения программиста можно считать, что кэша не существует, а любые данные, хранящиеся в памяти, физически находятся только в ней.
2.3. Оперативная память
Оперативная память или оперативное запоминающее устройство (ОЗУ), обычно называемая просто памятью, служит для хранения данных и обеспечивает к ним доступ с прямой адресацией. Прежде чем обрабатывать данные в соответствии с программой, и программа, и
данные должны быть загружены в память с внешних устройств.
В отличие от IBM PC и от бытовых компьютеров, включая семейство БК, на подавляющем большинстве машин архитектуры PDP-11 постоянного запоминающего устройства
(ПЗУ) сколько-нибудь значительного объёма нет: имеющееся ПЗУ (обычно от 512 байт до 2
Кбайт) располагается во внешней странице памяти среди регистров периферийных устройств
и содержит лишь примитивную программу, обеспечивающую приём с консольного терминала нескольких простых команд или имени устройства для выполнения загрузки с него.
2.3.1. Организация памяти
Логически память является набором 8-разрядных байтов, имеющих последовательную
адресацию, начинающуюся с нуля. Стандартные ОС рассчитывают на непрерывность доступной памяти, начиная с нулевого адреса; использование памяти, разбитой на участки с несмежными адресами требует соответствующих доработок в системном ПО. Объём имеющейся памяти ОС определяет, постепенно увеличивая адреса обращения до тех пор, пока не возникнет прерывание по вектору 4 (в данном случае его причиной будет таймаут шины, вызванный обращением по несуществующему адресу).
Отдельные биты в байтах нумеруются слева направо, т. е. старший разряд имеет номер 7,
а младший — 0. Аналогичный способ нумерации принят на большинстве вычислительных
машин, хотя имеются исключения из этого правила (самое известное — IBM System/360 и
последующие мэйнфреймы этой фирмы, а также их советские аналоги ЕС ЭВМ).
PDP-11 является 16-разрядной машиной и может обрабатывать как отдельные байты, так
и двухбайтовые слова, нумерация разрядов которых также ведётся слева направо (старший
бит — 15, младший — 0). В памяти байты слова хранятся в порядке «младший-старший»,
причём они всегда выровнены на свою естественную границу, т. е. расположены по чётному
адресу. На большинстве машин при попытке обращения к слову по нечётному адресу возникает прерывание по вектору 4, хотя в ряде моделей (PDP-11 моделей 23 и 24, LSI-11, микропроцессор T-11 и, по меньшей мере, некоторые советские процессоры, соответствующие архитектуре LSI-11) при обращении к слову значение младшего бита адреса игнорируется и обращение выполняется по чётному адресу.
Некоторые дополнительные команды, реализованные не во всех процессорах, могут обрабатывать 32-разрядные целые и 32- и 64-разрядные вещественные числа. Нумерация битов
в этих числах также ведется слева направо. Расположение в памяти слов, составляющих более крупное целое число, определяется исключительно программой; форматы хранения вещественных чисел определяются архитектурой и описаны в соответствующих разделах. Все
эти числа должны выравниваться по границе слова; более крупное выравнивание (по размеру
числа) не требуется.
15
2.3.2. Адресация памяти
Архитектура PDP-11, будучи 16-разрядной, предоставляет адресное пространство размером 64 Кбайта. Отдельное адресное пространство ввода-вывода отсутствует, поэтому регистры внешних устройств и доступные как ячейки памяти регистры самого процессора занимают часть адресного пространства — обычно старшие 8 Кбайт, хотя иногда под них отводятся лишь старшие 4 Кбайта; весь остальной объём — 56 или 60 Кбайт — может занимать
оперативная память.
Однако уже на момент создания первых моделей было очевидно, что объём памяти, обеспечиваемый 16-разрядным адресом, недостаточен для многих применений. Кроме того, отсутствие на ранних моделях каких-либо средств защиты памяти не позволяло реализовать
надёжную многозадачность даже при наличии достаточного объёма памяти. Поэтому для
увеличения доступного объёма памяти в состав многих процессоров включается устройство
управления памятью (MMU). Подробно его работа будет описана в одном из следующих разделов, здесь же приводится краткое описание основных идей, влияющих на архитектуру машины в целом.
Виртуальные адреса, которыми прямо оперирует программа, являются 16-разрядными,
физические адреса — 16-, 18- или 22-разрядными в зависимости от модели ЭВМ.
Переносимость системного программного обеспечения между машинами без MMU и с
MMU обеспечивается за счёт того, что сразу после сброса MMU выключено, но при этом
осуществляет простое преобразование адресов, идентичное тому, которое осуществляется
аппаратурой процессора без MMU, если физический адрес шире виртуального (как, например, в PDP-11/20, где процессор формирует 18-разрядный адрес UNIBUS из 16-разрядного
виртуального адреса):
• если процессор обращается по виртуальным адресам в диапазоне 000000–157777, т. е. к
младшим 56 Кбайтам виртуального адресного пространства, обращение к памяти производится по таким же физическим адресам, только расширенным слева нулями до 18 или
22 разрядов — т. е. тоже к младшим 56 Кбайтам, в которых почти всегда находится ОЗУ;
• если процессор обращается по виртуальным адресам в диапазоне 160000–177777, т. е. к
старшим 8 Кбайтам виртуального адресного пространства, обращение производится к
старшим 8 Кбайтам физического адресного пространства, для чего к виртуальному адресу слева добавляются единичные биты до получения 18- или 22-разрядного адреса.
Таким образом, программа или операционная система, созданная для машины без MMU,
при запуске на машине с MMU сохраняет свою работоспособность — при условии, конечно,
что обе машины имеют достаточно совпадающий набор внешних устройств.
При включённом MMU имеется возможность отображать отдельные страницы виртуального адресного пространства размером до 8 Кбайт на произвольные участки физического адресного пространства; адрес начала страницы виртуальной памяти кратен 8 Кбайтам (всё
виртуальное адресное пространство размером 64 Кбайта делится на восемь страниц), а физической страницы — 64 байтам. Таким образом, хотя в любой момент времени у программы
имеется доступ лишь к 64 Кбайтам памяти, страницы виртуальной памяти могут отображаться на физически несмежные участки физической памяти, а само отображение может легко
меняться, что позволяет программе при наличии соответствующей поддержки со стороны
ОС иметь в своём распоряжении намного больший объём памяти. Кроме того, MMU обеспечивает защиту памяти.
Поскольку UNIBUS рассчитана на 18-разрядную адресацию, многие устройства, поддерживающие DMA, способны вырабатывать лишь 18-разрядные физические адреса памяти.
Если конкретная машина поддерживает 22-разрядную адресацию, в её состав входит устройство отображения адресов шины на память (UNIBUS MAP). Если на машине работает ОС,
рассчитанная на 16- или 18-разрядную физическую адресацию, устройство отображения
16
остаётся выключенным: такая ОС программирует устройства на обмен с областями памяти,
лежащими в пределах их прямой досягаемости. Если же ОС использует 22-разрядную адресацию, то, как правило, устройство отображения включается, чтобы преобразовывать 18-разрядные адреса, сформированные устройствами при использовании DMA, в 22-разрядные физические адреса памяти. Технически этого можно и не делать, но в таком случае устройства
по DMA могут обращаться только к младшим 248 Кбайтам памяти, что потребует от ОС
самостоятельно пересылать информацию в память со старшими адресами, если в этом возникнет необходимость.
Количество одновременно выполняемых операций ввода-вывода устройствами с 18-разрядной адресацией при использовании устройства отображения ограничивается количеством
регистров, имеющихся у устройства отображения (их 31), а также положением и размером
буфера ввода-вывода (от него зависит число регистров отображения, нужных для выполнения
операции). На практике это ограничение особой роли не играет, поскольку лишь некоторые
устройства поддерживают DMA, а большие объёмы информации, передаваемой за одну операцию, — редкость.
2.4. Центральный процессор
Все процессоры архитектуры PDP-11, включая LSI-11, всегда реализуют минимальный
набор команд, нередко обозначаемый аббревиатурой SIM (simple instruction set). Следует заметить, однако, что в ряде аспектов выполнение команд может несколько отличаться на
разных моделях, о чём в дальнейшем делаются соответствующие замечания.
Большинство процессоров собственно PDP-11 и некоторые процессоры LSI-11 имеют дополнительные команды обработки целых чисел XOR, MUL, DIV, ASH, ASHC; это расширение
системы команд обозначается аббревиатурой EIS (extended instruction set). Кроме того, имеется ещё несколько команд, отсутствовавших у ранних моделей, но появившихся позднее и всегда присутствующих при наличии команд набора EIS, из-за чего их иногда считают частью
данного набора; к ним относятся SXT, SOB, MARK, RTT. В действительности эти команды к
EIS не относятся и в разных сочетаниях могут присутствовать без него (например, в
PDP-11/40, где EIS является дополнительной возможностью, а перечисленные команды имеются в обязательном порядке). Нет полной ясности и с командой XOR: в случае LSI-11 она,
возможно, реализована в микросхемах ПЗУ основного набора команд, а не в ПЗУ поддержки
EIS, в котором точно реализованы четыре остальные команды; кроме того, некоторые документы DEC относят её к основному набору команд, а не к EIS, хотя она реализована не на
всех машинах. В советских микропроцессорах, похоже, XOR реализована всегда, даже если
другие четыре команды EIS отсутствуют.
У некоторых ранних моделей вместо команд набора EIS использовался специальный
арифметический расширитель EAE, доступный как внешнее устройство и аппаратно реализующий подобные операции.
Процессоры некоторых машин, например, советской СМ-4, имеют четыре команды вещественной арифметики набора FIS (float-point instruction set); они всегда включают и команды
набора EIS. Наиболее мощные машины (PDP-11/70, PDP-11/94, СМ-1600, СМ-1420, СМ-1425
и некоторые другие) взамен четырех команд набора FIS имеют в своём составе так называемый процессор с плавающей запятой (ППЗ или FPP), реализующий команды набора FPP
(float-point processor). Технически возможно реализовать процессор, имеющий и команды
FIS, и команды FPP одновременно, но на практике такое, вероятно, не встречалось.
Наконец, существует коммерческий набор команд (CIS, commercial instruction set), на
практике использовавшийся нечасто: он имелся в PDP-11/24 и 44 в качестве необязательного
расширения, а также был реализован в микропроцессоре J-11, но все остальные машины
DEC, кажется, его не поддерживали. По всей вероятности, в СССР реализующие его машины
17
не выпускались, хотя, например, процессор ЭВМ СМ-1420 мог быть при желании расширен
для её реализации: в нём присутствовал для этого необходимый аппаратный задел (в частности, поддерживалась адресация 2048 микрокоманд, хотя использовалось лишь 1024, которые
реализовали основную систему команд, EIS и FPP).
Общие принципы функционирования процессора и основной набор регистров описываются в главе «Управление центральным процессором». Все команды наборов SIM, EIS и FIS,
а также ряд других команд, имеющихся у некоторых моделей ЭВМ, но не включаемых в какой-либо определённый набор, описаны в главе «Система команд центрального процессора».
Команды вещественной арифметики набора FPP описываются в главе «Система команд процессора с плавающей запятой»; в ней же описаны регистры, относящиеся к ППЗ. Средства,
относящиеся к коммерческому набору команд, также описаны в отдельной главе.
Кроме описываемых в этом документе команд, применимых если не ко всем, то к довольно большому числу моделей, у некоторых машин реализованы специфические команды, связанные, например, с диагностикой оборудования процессора или с эмуляцией функций
пульта управления. Особенно богата ими PDP-11/60, но подобные команды встречались и в
других моделях, включая, например, советскую СМ-1420 или микропроцессоры серий 1801 и
1806. Подобные команды здесь не описываются.
2.5. Внешние устройства
Как уже говорилось, все внешние устройства подключаются к шине и адресуются как
ячейки памяти, расположенные в старших 8 Кбайтах адресного пространства. Все устройства
способны быть исполнителями, т. е. принимать или выдавать информацию при обращении со
стороны центрального процессора или других инициаторов. Некоторые из них, например
контроллеры магнитных дисков и лент, способны быть также инициаторами, т. е. по своей
инициативе обращаться к шине, чтобы прочитать или записать данные с помощью DMA.
Практически все внешние устройства для извещения центрального процессора об изменении своего состояния (например, об окончании ранее начатой операции) способны использовать векторную систему прерываний. Архитектура допускает реализацию до семи уровней
приоритетов прерываний, однако основная масса машин использует четыре уровня, а самые
простые, относящиеся к архитектуре LSI-11, — обычно лишь один уровень.
Для советских машин типичным было наличие четырёх, но использование трёх уровней
приоритета: на 6-м находится таймер, на 5-м — быстродействующие внешние устройства типа дисков и лент, на 4-м — медленные устройства (терминалы, АЦПУ и т. п.). Впрочем, настройку приоритетов можно менять путём коммутации перемычек, предусмотренных для
этого у почти каждого устройства.
Устройства имеют в своих регистрах биты, управляющие прерываниями от данного
устройства. Это позволяет запретить прерывания от конкретного устройства без повышения
приоритета самого процессора, а соответственно, без блокировки прерываний от других
устройств.
В отличие от большинства других архитектур, выдавая запрос прерывания, устройство
само сообщает процессору адрес своего вектора, который может лежать в пределах младших
64 Кбайт адресного пространства. Обычно под векторы отводятся младшие 256 байт, часть из
которых занята векторами самого процессора, но при необходимости этот объём может быть
увеличен.
18
3. Управление центральным процессором
3.1. Состояния процессора и режимы работы
Выполняет ли процессор в настоящий момент программу или нет, определяется состоянием «Стоп» или «Работа». Сразу после сброса процессор переходит в состояние «Работа» и
начинает выполнение программы. В состояние останова он переходит при выполнении команды HALT, а также при определённых действиях с пульта управления, в частности, при нажатии кнопки «Стоп».
Самые простые процессоры имеют единственный режим работы, в котором программе
доступны без ограничений все команды и возможности, предоставляемые аппаратурой. Из
моделей фирмы DEC к ним относятся, например, PDP-11/20 и линейка LSI-11; из советских
разработок можно отметить СМ-3, СМ-1300, «Электронику-60», ДВК-1, ДВК-2 и бытовые
компьютеры серии БК.
Большинство процессоров поддерживают два режима: ядра и пользователя. В режиме
ядра программе доступны все команды. В режиме пользователя попытка выполнения некоторых команд вызывает прерывание по вектору 10 или вектору 4 в зависимости от модели, а
ряд других команд либо никаких действий не выполняют, либо выполняет лишь часть своих
обычных функций. К таким машинам относятся, например, PDP-11/40, СМ-4, СМ-1420 и
СМ-1600.
Наконец, процессоры самых мощных машин, например, PDP-11/45, PDP-11/70 и
СМ-1425, поддерживают три режима работы: ядра, пользователя и супервизора. Режим
супервизора подобен режиму пользователя и отличается тем, что имеет свой набор регистров
MMU и свой указатель стека. Точное его назначение назвать затруднительно; технически без
него вполне можно обойтись. Вероятно, идея состояла в том, что в режиме пользователя работают обычные прикладные программы, а в режиме супервизора — специальная прикладная программа-сервер, обслуживающая нужды обычных программ. В этом случае наличие
отдельных регистров MMU позволяет ядру системы быстрее переключаться от обычной прикладной программы к программе-серверу: не надо при каждом переключении настраивать
MMU и стек на новую прикладную программу. Тем не менее, выигрыш от подобной оптимизации весьма невелик.
3.2. Регистры процессора
3.2.1. Регистры общего назначения
Для хранения и обработки адресов и данных процессор имеет шесть 16-разрядных регистров общего назначения, обычно обозначаемых R0–R5. В программах на языке ассемблера
иногда используется обозначение %0–%5, причём именно оно является «родным» для его
синтаксиса, однако обозначения R0–R5, технически являющиеся лишь псевдонимами, более
понятны и привычны, а поэтому применяются более широко.
При выполнении некоторых команд расширенного набора, имеющих 32-разрядные операнды, 32-разрядный операнд хранится в двух смежных регистрах, что подробно рассмотрено при описании этих команд.
PDP-11/45, PDP-11/70 и микропроцессор J-11, а также советская СМ-1425, построенная
на микропроцессорном комплекте серии 1831, имеют два банка (набора) по шесть регистров
общего назначения. В любой момент времени доступен лишь один из этих банков; выбор используемого банка осуществляется битом 11 слова состояния процессора PSW. Поскольку изменение PSW[11] возможно лишь в режиме ядра, прикладные программы могут использовать
19
лишь тот банк регистров, который предоставлен им системой. Другой банк может использоваться самой системой под свои нужды. В частности, поскольку при прерывании старое PSW
сохраняется в стеке, а новое загружается из памяти по адресу, определяемому вектором прерывания, имеется возможность реализовать обработчики прерываний, которым не требуется
сохранять содержимое регистров: для этого прикладным программам выделяется один из
банков, а в начальных PSW обработчиков прерываний указывается использование другого
банка, причём сами прерывания в этом же PSW полностью запрещаются. Как следствие, при
каждом вызове обработчика прерывания отпадает необходимость сохранять регистры прерванной программы, и выполнение коротких обработчиков, состоящих всего из нескольких
команд, может быть существенно ускорено.
Все регистры общего назначения равноправны между собой практически во всех командах и во всех видах адресации. Исключением являются весьма специфическая команда
MARK, неявным образом использующая регистр R5, очень редкая команда MFPT, модифицирующая содержимое R0, и совсем редкий коммерческий набор команд, команды которого могут использовать те или иные регистры предопределённым образом.
Чтобы просмотреть или изменить содержимое регистров, используя пульт управления,
они адресуются как ячейки памяти. Адреса 177700–177705 относятся к регистрам нулевого
банка, а 177710–177715 — первого, причём в данном случае доступ всегда осуществляется
словами, а младший бит адреса соответствует регистру с нечётным номером. Исключением
являются PDP-11 моделей 23 и 24, LSI-11 и микропроцессор J-11: они не обеспечивают
подобный доступ к регистрам процессора.
Возможность программного обращения к регистрам как к ячейкам памяти, как правило,
отсутствует — такая попытка приводит к прерыванию по вектору 4. Исключением являются
PDP-11 моделей 05 и 10, допускающие подобные обращения. Микропроцессор T-11 при обращении по эти адресам выдаёт соответствующий запрос на шину, что вызовет таймаут шины, приводящий к прерыванию по вектору 4.
3.2.2. Указатель стека
Отличительной особенностью PDP-11 от большинства других архитектур, использующих
стек, является отсутствие специальных команд для работы с хранящимися там данными. Это
объясняется гибкостью системы адресации и тем, что указатель стека адресуется в командах
как регистр общего назначения 6, в программах обычно обозначаемый как SP. Для работы
как с содержимым стека, так и с самим указателем стека могут использоваться все арифметико-логические команды процессора.
Стек растет вниз, т. е. в сторону уменьшения адресов. Указатель стека содержит адрес
слова, помещенного в стек последним. Для записи данных в стек используется автодекрементная адресация (значение указателя стека уменьшается на 2, после чего по полученному
адресу производится запись байта или слова), для их извлечения из стека — автоинкрементная адресация (по адресу, находящемуся в указателе стека, считывается слово или байт данных, после чего значение указателя стека увеличивается на два), при этом сами обращения
могут выполняться любыми командами обработки данных.
Команды вызова и возврата из подпрограмм JSR, RTS и MARK используют указатель
стека неявным образом.
Информация в стеке всегда хранится полными словами, поэтому при записи или считывании данных с помощью автоинкрементной или автодекрементной адресации адрес, т. е. содержимое указателя стека, изменяется на 2 независимо от того, используется ли для доступа
команда обработки байтов или слов. В командах обработки байтов старший байт слова при
считывании игнорируется, а при записи не изменяется.
Процессоры, поддерживающие два или три режима работы, имеют по одному указателю
стека для каждого режима. Во всех командах, кроме MFPI, MFPD, MTPI, MTPD, как регистр
20
SP (R6) доступен указатель стека текущего режима работы, задаваемого битами 15:14 слова
состояния процессора PSW. Перечисленные привилегированные команды дают возможность
обратиться к адресному пространству или указателю стека предыдущего режима работы процессора, задаваемого битами PSW[13:12].
К указателям стека возможен доступ с пульта управления как к ячейкам памяти (за исключением PDP-11 моделей 23 и 24, LSI-11 и микропроцессора J-11), используя следующие
адреса:
• указатель стека режима ядра или единственный указатель стека процессора, не поддерживающего различные режимы работы, — 177706;
• указатель стека режима пользователя на машинах, поддерживающих три режима работы
— 177717;
• указатель стека режима пользователя на машинах, поддерживающих два режима работы,
либо указатель стека режима супервизора на машинах, поддерживающих три режима работы — 177716.
Программный доступ к указателям стека как к ячейкам памяти отсутствует, за исключением PDP-11 моделей 05 и 10; микропроцессор T-11 обращения к этим адресам разрешает, но
выдаёт их на шину, что приводит к её таймауту и прерыванию по вектору 4.
Замечание по программированию.
В PDP-11/35 и 40, если MMU выключено, процессор всегда работает в режиме ядра и доступ возможен лишь к указателю стека режима ядра, а команды MFPI, MFPD, MTPI, MTPD
недоступны. В остальных моделях, имеющих разные режимы работы, их использование не
зависит от состояния MMU.
3.2.3. Счётчик команд
Счётчик команд всегда указывает на следующее слово кода команды, которое должно
быть выбрано из памяти, поэтому значение его всегда должно быть чётным. Сразу после выборки очередного слова счётчик команд увеличивается на 2 и снова указывает на следующее
слово.
Доступы к памяти для выборки слов команд могут приводить к прерыванию по вектору 4,
если PC указывает несуществующую область памяти или если адрес команды нечётный
(контроль обращения по чётному адресу не выполняется PDP-11 моделей 23 и 24, LSI-11 и
микропроцессором T-11). На PDP-11/35 и 40 при попытке выборки команды из несуществующей памяти содержимое PC не изменяется, на остальных моделях всё равно увеличивается
на 2; эту разницу необходимо учитывать при отладке программ.
Счётчик команд может быть указан в качестве регистра операнда в любых командах, для
чего используется обозначение PC или R7. Благодаря этому можно, например, использовать
команду пересылки или сложения для выполнения перехода, хотя такой способ может быть
значительно медленнее, чем использование специальных команд переходов. Кроме того, возможность доступа к счётчику команд как к регистру общего назначения даёт дополнительные
виды адресации, о чём будет сказано в своём месте.
Счётчик команд доступен с пульта управления как ячейка памяти с адресом 177707; исключением являются PDP-11 моделей 23 и 24, LSI-11 и микропроцессор J-11. Программный
доступ к нему как к ячейке памяти возможен только на PDP-11 моделей 05 и 10, а микропроцессор T-11 выдаёт программное обращение по этому адресу на шину.
3.2.4. Контроль стека и регистр границы стека SL
Если при обращении к стеку ядра (или к единственному стеку на машинах, не имеющих
разделения кода по режимам выполнения), т. е. при любом обращении к памяти с использова-
21
нием указателя стека режима ядра, возникает фатальная ошибка, т. е. ошибка, приводящая к
прерыванию по вектору 4, реакция процессора зависит от модели ЭВМ:
• в PDP-11/04, 05, 10, 15, 20, 34, 44 и LSI-11 процессор переходит в состояние останова;
• в остальных моделях в указатель стека режима ядра заносится значение 4, после чего
производится попытка входа в прерывание по вектору 4. При успехе процессор начинает
выполнять обработчик этого прерывания, который может распознать данный случай по
нулевому значению указателя стека ядра (при входе в прерывание в новый стек, образованный ячейками 0 и 2, были записаны PC и PSW на момент прерывания). При неудаче
процессор, по всей видимости, останавливается.
Другой возможной проблемой, контролируемой процессором, является переполнение
стека ядра (или единственного стека на машинах без разделения режимов). Как правило, этот
стек размещается сразу за областью векторов прерываний, поэтому при его переполнении
векторы затираются информацией, записываемой в стек.
Контроль выполняется в случаях, когда обращение к памяти производится с одновременным уменьшением содержимого указателя стека ядра:
• при выполнении команды, использующей автодекрементную или косвенную автодекрементную адресацию указателя стека;
• при сохранении PC и PSW прерванной программы во время входа в прерывание.
В LSI-11 и микропроцессоре T-11, а также, по крайней мере, части советских микропроцессоров, соответствующих архитектуре LSI-11, контроль стека не выполняется
Во многих машинах адрес обращения к стеку в указанных выше случаях сравнивается с
фиксированным значением 000400. Если адрес обращения ниже этой границы, команда или
вход в прерывание выполняются как обычно, но после завершения этого процессора происходит прерывание по вектору 4. Заметим, что переполнение стека в процессе входа в прерывание по вектору 4 не контролируется.
В некоторых средних и старших моделях процессор имеет специальный регистр предела
стека SL, который позволяет программно определить нижнюю границу стека ядра. Он содержит приращение нижней границы стека в блоках по 000400 (256 10) байтов; его содержимое
складывается с константой 000400 и определяет минимально допустимый адрес обращения к
стеку режима ядра. Например, если в SL находится значение 001000, нижней границей стека
будет 001400. Благодаря использованию SL можно защитить векторы прерываний в крупных
конфигурациях, где обычной области размером 256 байтов для всех векторов не хватает.
Сразу после сброса, включая выполнение команды RESET, регистр SL будет равен нулю.
Программа может считывать и записывать его значение по адресу 177774, причём запись в
младший байт игнорируется: он всегда содержит нуль. Регистр доступен также с пульта
управления, но не со стороны шины.
К машинам, имеющим регистр SL, относятся, по меньшей мере, PDP-11/45, PDP-11/70 и
советская СМ-4 (однако СМ-1420 и СМ-1600, превосходящие СМ-4 по всем параметрам,
регистра SL не имеют); кроме того, на некоторых машинах, например, на PDP-11/40, регистр
границы стека является дополнительным оборудованием, устанавливаемым по желанию заказчика.
Область векторов прерываний для ЭВМ, располагающих регистром SL, делится на красную и жёлтую зоны. Жёлтая зона занимает 32 байта в самых старших адресах области векторов, то есть лежит вплотную к нижней границе стека; например, при нулевом значении регистра SL жёлтая область охватывает адресов 000340–000377. Красная зона лежит ниже жёлтой
вплоть до нулевого адреса.
Если команда или вход в прерывание вызывают обращение к жёлтой зоне, они выполняются до конца и лишь после этого происходит вход в прерывание по вектору 4. Если же
22
производится попытка обращения к красной зоне, операция немедленно прерывается, в
SP режима ядра заносится значение 4 и производится вход в прерывание по вектору 4.
Существуют также реализации (по меньшей мере, микропроцессор J-11), где верхняя граница стека ядра жёстко фиксирована на значении 000400, т. е. регистр SL отсутствует, однако
производится различие между жёлтой и красной зонами стека, нарушение которых ведёт к
соответствующей реакции процессора, аналогичной машинам с регистром SL.
Контроль переполнения стеков режима супервизора и пользователя не производится, а
обращение к такому стеку, приводящее к прерыванию по вектору 4, вызывает обычный вход
в это прерывание.
Замечания по программированию
1. Из имеющейся документации неясно, будет ли обнаружено переполнение стека, если в
результате использования косвенной автодекрементной адресации адрес операнда будет
выбран из ячейки, лежащей выше области векторов прерываний, т. е. автодекремент SP
не приведёт к обращению в защищённую область памяти, но собственно операнд, заданный прочитанным адресом, в защищённую область попадёт. По всей вероятности,
контроль на эту ситуацию не распространяется, поскольку формального переполнения
стека не возникает: SP остаётся в допустимых пределах.
2. Процессоры, поддерживающие несколько режимов работы, сохраняют PSW и PC на момент прерывания в стеке того режима, в котором будет выполняться обработчик этого
прерывания, для чего загружают новое значение PSW до того, как начнут сохранять старые значения PSW и PC. Соответственно, если в новом PSW указан режим супервизора
или пользователя, сохранение должно выполняться в стеке супервизора или пользователя, а не в стеке ядра.
Если была обнаружена фатальная ошибка стека ядра или нарушение его красной зоны,
то, как было сказано, процессор занесёт в указатель стека ядра значение 4, после чего начнёт процесс вызова обработчика прерывания по вектору 4. Однако, если для вектора 4
указан обработчик режима супервизора или пользователя, то, вероятно, сохранение значений PSW и PC на момент прерывания произойдёт в стеке заданного режима, а не в стеке ядра. Точного разъяснения этой ситуации документация не даёт; впрочем, этот вопрос
носит теоретический характер, поскольку на практике обработчики потенциально фатальных прерываний всегда выполняются в режиме ядра.
3. В документации ничего не сказано о контроле переполнения стека при выполнении команды JSR, но, надо полагать, он распространяется и на этот случай, хотя сохранение содержимого регистра в стеке выполняется этой командой неявно, без использования автодекрементной адресации.
3.2.5. Слово состояния процессора
Слово состояния процессора (PSW, часто обозначается как просто PS) является 16-разрядным регистром, имеющим следующий формат:
CM
15
PM
14
13
B
12
11
CS
10
9
8
PRTY
7
6
5
T
N
Z
V
C
4
3
2
1
0
Назначение разрядов PSW следующее.
• Биты 15:14, поле CM, определяют текущий режим работы процессора:
• 00 — режим ядра;
• 01 — режим супервизора;
• 10 — запрещённая комбинация;
23
• 11 — режим пользователя.
Если процессор поддерживает только два режима, комбинация 01 также является
запрещённой. Если процессор вообще не имеет различных режимов работы, это поле не
используется и всегда содержит нули.
• Биты 13:12, поле PM, определяют предыдущий режим работы процессора и кодируются
аналогично полю CM.
Во время прерывания PSW на момент прерывания сохраняется в стеке, после чего из области, указанной вектором прерывания, загружается новое PSW, однако в биты 13:12 заносится не считанное новое значение, а содержимое битов 15:14 на момент прерывания.
Таким образом, при входе в обработчик прерывания биты 13:12 хранят код режима процессора, который был текущим на момент прерывания.
Значение поля PM влияет на выполнение команд доступа к регистрам и адресному пространству предыдущего режима (MFPI и др.), но не сказывается на остальных функциях
процессора.
• Бит 11, флаг B, задаёт используемый в данный момент банк регистров общего назначения, если процессор имеет два банка. Если процессор имеет только один банк, этот бит
всегда содержит нуль.
• Биты 10:9 «официально» не используются и обычно содержат нули. Однако существуют
машины, в которых они применяются с какими-либо нестандартными целями. Например,
процессор ЭВМ СМ-1420 допускает расширение своих возможностей путём подключения к его основному оборудованию некоего спецпроцессора; если спецпроцессор имеется, бит 9 будет всегда установлен.
• Бит 8 обычно не используется и содержит нуль. Однако, по меньшей мере, в PDP-11/24,
44 и микропроцессоре J-11 он является индикатором приостановки выполнения команды
коммерческого набора (CIS suspension): выполнение этих команд может прерываться, при
этом в стек помещается PSW с установленным битом 8, что обеспечивает возобновление
выполнения прерванной команды при возврате из прерывания.
В некоторых советских микропроцессорах бит 8 используется как индикатор пультового
режима, в который микропроцессор входит при выполнении команды HALT, что даёт возможность программно имитировать функции пульта управления.
• Биты 7:5, поле PRTY, определяет приоритет текущей выполняемой программы: 000 задаёт наименьший приоритет, 111 — наибольший.
Когда арбитру шины поступает один из запросов на захват шины BR7–BR4 (принципиально возможна также реализация запросов BR3–BR1), арбитр, физически обычно являющийся частью процессора, но логически относящийся к шине, сравнивает приоритет
запроса со значением данного поля. Если приоритет запроса выше, шина предоставляется во владение устройству, выдавшему запрос; если приоритет запроса такой же или ниже, чем значение в данном поле, управление шиной сохраняется за процессором, а выдавшее запрос устройство будет ждать, пока программа не понизит свой приоритет.
Как правило, запросы BR7–BR4 используются для выдачи процессору вектора прерывания, из-за чего они нередко рассматриваются как запросы прерываний, а данное поле —
как средство запрета прерываний, где значение 111 запрещает любые прерывания. Тем не
менее, получив шину по любому из этих запросов, устройство может использовать её не
для выдачи вектора прерывания, а для обмена данными с памятью посредством DMA.
Для последней цели, однако, обычно используется запрос NPR, который имеет самый вы-
24
сокий приоритет и не может блокироваться программой, но непригоден для выдачи вектора прерывания.
В процессорах серии LSI-11 и функционально аналогичных им советских моделях
(например, «Электроника-60») приоритетов как таковых нет, и поле PRTY сокращается
до одного разряда 7, при этом биты 6:5 содержат нули. Когда на таком процессоре бит 7
установлен, процессор игнорирует любые запросы, кроме NPR, когда сброшен — разрешает захват шины по любому запросу.
• Бит 4, флаг T, когда установлен, включает трассировку выполнения команд: сразу после
завершения выполнения команды, чьё выполнение началось при установленном бите T,
происходит прерывание по вектору 14. Исключением является команда RTT, которая блокирует это прерывание, и оно произойдёт не после RTT, а после следующей за ней команды.
• Бит 3, флаг N, изменяется определёнными арифметико-логическими командами и обычно устанавливается равным старшему биту результата (биту 7 или биту 15 в зависимости
от того, обрабатывается байт или слово). Таким образом, обычно он показывает, что командой получен отрицательный результат.
• Бит 2, флаг Z, изменяется определёнными арифметико-логическими командами: он устанавливается, если результат операции равен нулю, и сбрасывается в противном случае.
• Бит 1, флаг V, обычно устанавливается, если в арифметической операции было обнаружено переполнение.
• Бит 0, флаг C, обычно устанавливается, если при сложении возникает перенос из старшего разряда результата или если при вычитании возникает заём в старший разряд. Кроме
того, этот флаг отражает значение бита, выдвигаемого из операнда командами сдвигов.
Изменяются или нет те или иные флаги N, Z, V, C при выполнении конкретной команды,
указывается в описании этой команды. Там же указываются значения, принимаемые флагами в зависимости от полученного результата.
Как правило, доступ к регистру PSW производится как к слову памяти по адресу 177776,
возможна также адресация его отдельных байтов. Однако на LSI-11 и в микропроцессоре
T-11 обращение к нему как к ячейке памяти невозможно, и для считывания или записи его
младшего байта используются соответственно команды MTPS и MFPS (старший байт PSW на
этих машинах не реализован и равен нулю, поэтому доступ к нему не требуется). Помимо
LSI-11 и T-11, эти команды реализованы также на PDP-11/23, 24, 34 и в микропроцессоре
J-11, предоставляя доступ тоже только к младшему байту регистра состояния с некоторыми
вариациями, о чём подробнее сказано в описании команд.
В режиме ядра имеется возможность программно изменять любые реализованные биты
PSW, за исключением бита T. Бит T может изменяться программно, а также с пульта управления на PDP-11 моделей 04, 05, 10, 15 и 20; на любых других машинах он может быть изменён
только при загрузке нового PSW в процессе входа в обработчик прерывания или при выполнении команд возврата из прерывания RTI и RTT.
В режимах супервизора и пользователя приоритет процессора (биты 7:5) с помощью команд MTPS, RTI и RTT изменить невозможно. Что касается битов 15:11, то, по крайней мере,
на PDP-11/45 и в микропроцессоре J-11 эти команды могут установить, но не сбросить данные биты; таким образом, программа, работающая в режиме супервизора, может переключиться в режим пользователя, но не в режим ядра, а программа в режиме пользователя поменять его не может. Биты 8 и 4:0 командами RTI и RTT загружаются всегда независимо от текущего режима работы процессора.
25
Замечания по программированию
1. Биты 7 и 4:0 присутствуют в PSW любых моделей PDP-11 и LSI-11; наличие остальных
разрядов зависит от модели. Если некоторый разряд не реализован, он считывается как
нуль, а запись в него игнорируется.
2. В PDP-11/35 и PDP-11/40 разряды PSW[15:12] «притворяются» отсутствующими, если
MMU выключено, при этом процессор работает в режиме ядра. В остальных машинах,
имеющих разделение режимов выполнения, возможность использования режимов не зависит от того, используется ли MMU.
3. Неверная комбинация в разрядах[15:14], т. е. недопустимый код текущего режима работы, в общем случае вызывает прерывание по ошибке MMU (вектор 250). Однако на
PDP-11/23 и 24 комбинация 10 рассматривается как индикатор режима ядра и не приводит к прерыванию.
4. При выполнении какой-либо команды доступа к регистрам и памяти предыдущего режима работы недопустимая комбинация в битах PSW[13:12] приведёт к непредсказуемым
результатам. Исключением является лишь микропроцессор J-11, в такой ситуации обращающийся к пространству пользователя.
5. Если регистр PSW доступен для программы как ячейка памяти, то его значение может
быть изменено путём прямого обращения (например, командой MOV) независимо от режима работы процессора.
6. Состояние бита 8, если он присутствует в PSW в связи с наличием коммерческого набора
команд, изменяется при выполнении прерываемых команд (сбрасывается в начале выполнения, устанавливается в случае приостановки, сбрасывается при завершении выполнения). Оно также может быть загружено из вектора прерывания и командами возврата из
прерывания либо изменено с помощью прямой записи в PSW. Документация, говоря о загрузке нового значения этого бита командами возврата из прерывания или командами,
прямо обращающимися к PSW, не указывает, что бит 8 может быть изменён только при
работе в состоянии ядра, но не говорит и о возможности изменить этот разряд в любом
режиме работы.
3.2.6. Регистр консольных переключателей SWR и регистр
консольных индикаторов
На многих машинах предусмотрен доступный только для чтения регистр консольных
переключателей SWR, имеющий адрес 177570. Его содержимое отражает текущее состояние
переключателей пульта управления.
На некоторых машинах, например, PDP-11/45, по тому же адресу располагался доступный только для записи регистр, чьё содержимое отображается на индикаторах пульта управления.
3.2.7. Регистр программных запросов прерываний PIRQ
Некоторые модели, например, PDP-11/45, PDP-11/70 и микропроцессор J-11, имеют
регистр программных запросов прерываний PIRQ, доступный как слово по адресу 177772 и
имеющий следующий формат:
PIR7
15
PIR1
14
13
12
11
10
9
PIA
8
7
6
PIA
5
4
3
2
1
0
Установка хотя бы одного из битов PIR7–PIR1 (разряды 15:9) формирует запрос прерывания соответствующего уровня, причём он имеет более высокий приоритет, чем запрос по
26
линии BR с таким же номером. Если текущий приоритет процессора, заданный битами
PSW[7:5], ниже уровня приоритета программного запроса прерывания, происходит прерывание по вектору 240.
Номер самого приоритетного из программных запросов отражается значениями полей
PIA (разряды 7:5 и 3:1). Предполагается, что обработчик прерывания 240 начинает выполнение при полностью запрещённых прерываниях, т. е. при PSW[7:5] = 7, но после начала своего
выполнения понижает приоритет до уровня приоритета самого приоритетного из запросов,
пересылая содержимое младшего байта PIRQ в PSW, а затем выделяет биты PIRQ[3:1] и использует их в качестве индекса для перехода к обработчику конкретного программного
запроса прерывания с помощью примерно такой последовательности команд:
MOVB
MOV
MOV
BIC
JMP
PIRQ,PS
R5,-(SP)
PIRQ,R5
#177761,R5
@TABLE(R5)
Замечание по программированию.
Использование регистра PIRQ в машинах архитектуры PDP-11 широкого распространения не получило, поскольку сам регистр присутствовал лишь у небольшого количества моделей. Однако в VAX-11 аналогичный регистр стал обязательным и широко использовался операционной системой VAX/VMS для выполнения кода ядра разного приоритета, имеющего
доступ к разному набору общесистемных данных.
3.2.8. Регистр ошибок процессора
PDP-11/70, микропроцессор J-11 и, возможно, ряд других моделей имеют регистр ошибок
процессора, доступный по адресу 177766 и показывающий причину прерывания по вектору
4. Он имеет следующий формат:
15
•
•
•
•
•
•
14
13
12
11
10
9
8
H
O
M
B
Y
R
7
6
5
4
3
2
1
0
Назначение разрядов регистра ошибок процессора следующее.
Бит 7 устанавливается при выполнении команды HALT в режиме супервизора или пользователя.
Бит 6 устанавливается при нечётном адресе обращения к слову.
Бит 5 устанавливается при попытке обращения к несуществующей памяти.
Бит 4 устанавливается при таймауте при обращении к шине.
Бит 3 устанавливается при нарушении жёлтой границы стека.
Бит 2 устанавливается при нарушении красной границы стека.
Замечание по программированию.
Попытка обращения к несуществующей памяти отделена от таймаута шины по той причине, что при оснащении машины памятью большого объёма она подключается к процессору
не через обычную шину UNIBUS, а с помощью специального интерфейса. Выделение в этом
регистре двух битов под принципиально аналогичные ошибки позволяет отличить обращение к несуществующей памяти от обращения к несуществующему внешнему устройству.
3.2.9. Регистры аппаратного контроля
У ряда моделей имеется один или несколько регистров, предназначенных для управления
функционированием кэша, оперативной памяти и самого процессора и для контроля их работы. Например, PDP-11/45 имеет по одному регистру на каждые 16 Кбайт памяти, чей объём
27
достигает 248 Кбайт. В этих регистрах, занимающих диапазон адресов 172110–172146 включительно, отражается возникновение ошибок чётности и даётся возможность запретить их
обнаружение или вызывать останов процессора при обнаружении сбоя.
Количество, форматы и точные функции подобных регистров полностью зависят от конкретной модели и в данном документе не описываются.
3.3. Выполнение команд
3.3.1. Форматы команд
Систему команд СМ ЭВМ отличает довольно большое разнообразие форматов и одновременно простота их кодирования. В этом разделе приведены основные форматы команд центрального процессора. Некоторые форматы, используемые только одной командой, описаны
не здесь, а в разделе, посвященном соответствующей команде. Форматы команд процессора с
плавающей запятой и команд коммерческого набора описываются в соответствующих главах.
Код любой команды состоит из одного слова (16 разрядов), которое может содержать одно или несколько полей. Адресная информация или операнды некоторых команд при определенных видах адресации могут следовать сразу за кодом команды и занимать еще одно или
два слова. Таким образом, полная длина команды может составлять 1, 2 или 3 слова и определяется декодированием определённых разрядов первого слова.
Управляющие команды не имеют явно заданных операндов. Их код всегда помещается в
одном слове, не делящемся на отдельные поля.
Одноадресные команды имеют один операнд. Их код делится на две части: разряды 15:6
являются кодом операции, а разряды 5:0 определяют местоположение операнда, как описывается в разделе «Адресация операндов».
Двухадресные команды основного набора (SIM) имеют два операнда. Код этих команд
делится на три части. Разряды 15:12 задают код операции, разряды 11:6 — операнд-источник,
разряды 5:0 — операнд-приёмник.
Двухадресные команды расширенного набора (EIS) также имеют два операнда, причем
один из них всегда является регистром. Код команды в этом случае также делится на три части: код операции (разряды 15:9), номер регистра-приёмника (разряды 8:6; для команды XOR
это номер регистра-источника) и операнд-источник (разряды 5:0; для команды XOR это операнд-приёмник).
Команды переходов, использующие относительную адресацию, имеют код, состоящий из
двух частей. В разрядах 15:8 размещается код операции, а в разрядах 7:0 — смещение, определяющее адрес перехода.
3.3.2. Адресация операндов
В большинстве арифметико-логических команд для определения используемого операнда
используется шестиразрядное поле, входящее в состав первого слова кода команды. Одноадресные команды и двухадресные команды набора EIS имеют одно такое поле, занимающее
разряды 5:0. Двухадресные команды основного набора (SIM) имеют два поля операндов, занимающих разряды 11:6 (источник) и 5:0 (приёмник).
Поле операндов делится на две части. Старшие три бита задают один из восьми способов
адресации, а младшие три бита — используемый регистр, которым может быть один из регистров общего назначения (0–5), указатель стека текущего режима (6) или счётчик команд (7).
Система команд имеет восемь видов адресации:
• регистровую;
• косвенную регистровую;
• автоинкрементную;
28
•
•
•
•
•
косвенную автоинкрементную;
автодекрементную;
косвенную автодекрементную;
индексную;
косвенную индексную.
Регистровая адресация (код адресации 0) использует значение операнда, находящееся в
указанном регистре. Например, команда CLR R2 обнуляет содержимое регистра R2. Код
этой команды равен 005002, где 0050 — код операции CLR, а 02 — код регистровой адресации и номер регистра.
Если в команде обработки байтов операнд-приёмник является регистром, изменяется
только младший байт регистра, а старший байт остается без изменения. Исключением является команда MOVB, которая пересылает байт исходного операнда в младший байт заданного регистра и одновременно расширяет его знаковый бит на старший байт.
Все остальные виды адресации используют операнды, находящиеся в памяти, а указываемый в них регистр используется для определения адреса операнда.
Косвенная регистровая адресация1 (код адресации 1) для доступа к операнду использует адрес, находящийся в указанном регистре. Содержимое самого регистра при доступе к
операнду не изменяется. Например, команда CLRB (R2) или CLRB @R2 (эти два способа
записи эквивалентны) обнуляет байт памяти по адресу, находящемуся в регистре R2, причем
значение самого регистра не изменяется. Код этой команды равен 105012, где 1050 — код операции CLRB, а 12 — код косвенной регистровой адресации и номер регистра.
Автоинкрементная адресация (код адресации 2) использует содержимое регистра как
адрес операнда в памяти, а затем увеличивает содержимое регистра на 1 или 2 в зависимости
от размера операнда (байт или слово). Если эта адресация используется с регистрами R6 и
R7, т. е. с указателем стека или счётчиком команд, содержимое регистра всегда увеличивается
на 2 независимо от длины обрабатываемого операнда. Например, команда CLR (R4)+ обнуляет содержимое слова по адресу, находящемуся в регистре R4, а затем увеличивает содержимое этого регистра на 2. Эта команда имеет код 005024.
Косвенная автоинкрементная адресация (код адресации 3) сначала использует содержимое указанного регистра для считывания из памяти слова, содержащего адрес операнда, а
затем увеличивает регистр на 2. Прочитанное слово используется для доступа к собственно
операнду. Например, команда CLR @(R0)+ считывает из памяти слово по адресу, содержащемуся в регистре R0, увеличивает содержимое R0 на 2 и обнуляет слово памяти, указанное
прочитанным значением. Эта команда имеет код 005030.
Автодекрементная адресация (код адресации 4) подобна автоинкрементной адресации,
но сначала уменьшает регистр на 1 или на 2, а при адресации с использованием указателя
стека или счётчика команд — всегда на 2, а затем использует новое значение регистра в качестве адреса операнда. Например, команда CLRB -(SP) уменьшает указатель стека на 2, а затем обнуляет байт памяти по адресу, находящемуся в регистре SP после его уменьшения. Логически она помещает в стек новое слово, младший байт которого содержит нуль, а значение
старшего байта не определено (поскольку при записи в память содержимое старшего байта
не изменяется). Эта команда имеет код 105046.
Косвенная автодекрементная адресация (код адресации 5) подобна косвенной автоинкрементной адресации, но сначала уменьшает значение регистра на 2, а затем использует новое значение в качестве адреса слова памяти, в котором хранится адрес операнда. Например,
команда CLRB @-(R5) уменьшает содержимое регистра R5 на 2, считывает из памяти слово
1
В документации на PDP-11 косвенные виды адресации обозначаются словом deferred, а не более привычным в таком значении indirect.
29
по полученному адресу, а затем обнуляет байт памяти, адресуемый прочитанным словом. Эта
команда имеет код 105055.
Индексная адресация (код адресации 6) складывает содержимое указанного регистра со
словом памяти, адресуемым текущим значением счётчика команд, и использует полученное
при сложении значение в качестве адреса операнда. Содержимое адресуемого регистра не изменяется, а счётчик команд увеличивается на 2. Например, команда CLR 1000(R3) обнуляет слово памяти по адресу, равному сумме величины 1000 и содержимого регистра R3, и имеет код 005063 001000.
Косвенная индексная адресация (код адресации 7) складывает содержимое указанного
регистра со словом памяти, адресуемым текущим значением счётчика команд, выбирает из
памяти слово по полученному адресу, после чего использует выбранное значение в качестве
адреса операнда. Указанный регистр не изменяется, а содержимое счётчика команд увеличивается на 2. Например, команда CLR @2430(R0) складывает величину 2430 с содержимым
регистра R0, выбирает слово по полученному адресу, после чего обнуляет слово, адресуемое
выбранным значением. Код этой команды равен 005070 002430.
Счётчик команд можно использовать с любым видом адресации, однако практическую
ценность представляют только четыре из них, получившие специальные названия:
• непосредственная;
• абсолютная;
• относительная;
• косвенная относительная.
Непосредственная адресация является разновидностью автоинкрементной адресации.
Операнд, используемый командой, является значением, фактически входящим в состав кода
команды. Например, команда MOV #167534,R4 заносит в регистр R4 значение 1675341. Код
этой команды равен 012704 167534. В первом слове 01 является кодом операции MOV, 27 —
кодом непосредственной адресации, 04 — кодом регистровой адресации и номером регистра
R4.
В отличие от других типов вычислительных машин, непосредственная адресация в
PDP-11 применима не только к источнику, но и к приёмнику результата, так как непосредственный операнд, с точки зрения процессора, не является частью кода команды и технически ничем не отличается от любого другого операнда в памяти.
Абсолютная адресация является разновидностью косвенной автоинкрементной адресации. Команда содержит адрес ячейки памяти, содержащей операнд. Например, команда
CLR @#177776 обнуляет слово памяти, расположенное по адресу 177776. Код этой команды
равен 005037 177776.
Относительная адресация является разновидностью индексной адресации. Она определяет операнд, адрес которого равен сумме смещения, являющегося частью кода команды, и
содержимого счётчика команд, указывающего на следующее за смещением слово. Например,
если команда CLR 500, обнуляющая слово памяти с адресом 000500, расположена по адресу
000300, то её код будет равен 005067 000174, так как сумма смещения 000174 и адреса следующего за смещением слова (000304) составляет 000500.
По своему назначению этот вид аналогичен абсолютной адресации, но упрощает создание позиционно-независимых программ, поскольку, если и собственно программа, и её данные имеют одну и ту же базу, при перемещении программы по другому адресу не возникает
нужды в корректировке смещений: необходимый сдвиг будет обеспечен изменившимся со1
При записи на языке ассемблера PDP-11 сначала указывается операнд-источник, а затем операнд-приёмник. Поэтому, например, команда вычитания SUB R1,R2 вычитает из R2 значение R1 и помещает результат в
R2. Однако команда сравнения CMP R1,R2, не сохраняющая собственно результат вычитания и лишь модифицирующая флажки регистра PSW, производит вычитание в обратном порядке: R2 из R1. Это является очевидным неудобством принятого способа записи.
30
держимым PC. По этой причине для адресации перемещаемых вместе с программой данных
рекомендуется использовать именно относительную адресацию, а абсолютную применять
при доступе к абсолютным адресам, а также к адресам, чьи значения, хотя и являются перемещаемыми, но не привязаны к положению самой программы.
Косвенная относительная адресация является разновидностью косвенной индексной
адресации. Она определяет операнд, адрес которого хранится в слове памяти, расположенном
по адресу, равному сумме смещения из кода команды и значения счётчика команд, указывающего на следующее за смещением слово. Например, если команда CLRB @500, обнуляющая
байт памяти по адресу, содержащемуся в ячейке 000500, расположена по адресу 000300, то ее
код команды будет равен 105077 000174.
Для работы со стеком обычно используют автоинкрементную и автодекрементную адресацию. Например, команда MOV R3,-(SP) уменьшает значение указателя стека, чем выделяет в его вершине новое слово, после чего записывает по этому адресу содержимое регистра
R3. Команда MOVB (SP)+,R2 загружает из вершины стека слово, увеличивает указатель
стека на 2, логически удалив это слово, и помещает младший байт слова с расширением знака в регистр R2.
В командах перехода JSR и JMP применяются те же способы адресации, что и в арифметико-логических командах. Регистровый вид адресации в этих командах запрещён и попытка его использования приведёт к прерыванию по вектору 10 (недопустимая команда) или
вектору 4 (ошибка шины). Другие виды определяют адрес перехода, равный адресу операнда,
если бы данный вид адресации использовался в обычной арифметико-логической команде.
Например, команда JMP @R3 передает управление по адресу, содержащемуся в регистре R3.
Все команды условного перехода и команда безусловного перехода BR используют относительный вид адресации, однако не тот, который описан выше. Код любой из этих команд
состоит из двух частей: кода операции в разрядах 15:8 и смещения в разрядах 7:0. Значение
смещения трактуется как величина со знаком, задающая количество слов, прибавляемых к
значению счётчика команд, указывающего на следующую команду. Например, расположенная по адресу 001000 команда BR 1010 будет иметь код 000403, а команда BR 776 — код
000776. В первом случае смещение в словах равно +3, а во втором равно –2; счётчик команд
после выборки кода команды в обоих случаях равен 001002.
Замечания по программированию.
1. Для удаления верхнего слова стека часто используются команды вида TST (SP)+, а для
удаления сразу двух слов — CMP (SP)+,(SP)+ вместо команды сложения ADD #2,SP
или ADD #4,SP. Подобное применение команд позволяет уменьшить размер кода по
сравнению с командой сложения регистра с константой: обе приведённые команды занимают одно слово памяти, а сложение потребует двух слов. Однако скорость выполнения
команды сложения будет выше, чем команды вида CMP (SP)+,(SP)+, поскольку потребует двух доступов к памяти (выборка первого и второго слов кода команды), а не
трёх (выборка единственного слова кода команды и двух операндов). Скорость её выполнения по сравнению с TST (SP)+ может быть как выше, так и ниже в зависимости от
модели ЭВМ; количество обращений к памяти у них одинаково.
2. Если попытка выборки операнда при автоинкрементной адресации вызывает прерывание
по вектору 4 из-за того, что регистр указывает на несуществующую область памяти, на
большинстве моделей содержимое регистра всё равно будет увеличено (начало обращения к памяти совмещается с модификацией регистра), однако на PDP-11/04, 34 и 44 содержимое регистра останется неизменным. Это различие необходимо учитывать при отладке программ.
31
Если прерывание по вектору 4 возникает при обращении к слову из-за нечётного содержимого регистра, PDP-11/04, 05, 10, 15, 20, 34 и 44 не изменяют содержимое регистра, а
остальные модели, выполняющие контроль чётности адресов слов, его увеличивают.
Контроль чётности не выполняется на PDP-11/23 и 24, LSI-11 и микропроцессором T-11.
Вероятно, таким же образом обрабатываются случаи ошибочного содержимого регистра
при выборке адреса операнда при косвенной автоинкрементной адресации. К автодекрементной и косвенной автодекрементной адресации эти правила неприменимы, поскольку
при них содержимое регистра изменяется до попытки обращения к памяти.
3.3.3. Выборка команд и операндов
В начале выполнения новой команды адрес ее первого слова содержится в PC. Процессор
выбирает это слово и сразу же увеличивает PC на два. После этого анализируется код операции и определяется количество операндов. Заметим, что если PC содержит нечётный адрес,
машины серии PDP-11 вместо выборки команды выполняют прерывание по вектору 4, а вот
LSI-11 младший бит PC при обращении к словам игнорируют, а соответственно, нечётный
адрес слова прерывания не вызывает.
Порядок вычисления адресов и выборки операндов архитектурой не определён, и между
моделями существуют различия. Например, в двухадресных командах вида OP Rn,(Rn)+
или OP Rn,-(Rn), где для адресации приёмника используется автоинкрементная или автодекрементная адресация, а источником является тот же регистр, что используется для адресации приёмника, возможны два варианта выполнения:
• содержимое регистра Rn запоминается для адресации операнда-приёмника, увеличивается на 1 или 2, после чего используется в качестве операнда-источника;
• содержимое регистра Rn сначала запоминается для использования в качестве операндаисточника, затем используется для адресации операнда-приёмника и в конце увеличивается на 1 или 2.
Первым способом такие команды выполняют PDP-11 моделей 15, 20, 23, 24, 35, 40, 60 и
микропроцессоры T-11 и J-11; вторым способом — остальные машины серии PDP-11 и
LSI-11. Соответственно, если программа полагается на конкретный способ выполнения
подобных команд, она может работать неправильно при попытке её использования на другой
модели ЭВМ1.
Если в процессе выборки команды и определения ее операндов из-за обнаружения ошибки происходит прерывание (нечетный адрес слова, таймаут, защита памяти), то команда будет
прервана в той точке, в какой возникла ошибка, при этом используемые для адресации регистры могут быть изменены или оставаться неизменными в зависимости от точки возникновения прерывания и модели процессора.
В наиболее мощных моделях, включая PDP-11/70 и СМ-1425, модификации регистров,
выполненные в процессе подготовки операндов, отражаются в одном из регистров MMU,
поэтому операционная система может программно выполнить «откат» изменений, чтобы,
устранив причину прерывания, повторить операцию: это необходимо для реализации полноценной виртуальной памяти, когда задачи (процессы) пользователя загружаются в физическую память частями.
В более простых моделях, включая большинство машин DEC и, например, наиболее распространённые в СССР СМ-4, СМ-1420 и СМ-1600, информация об изменении регистров не
сохраняется, поэтому выполнить корректный «откат» невозможно. Виртуальная память попрежнему может использоваться, но на уровне не отдельных страниц, а на уровне целых за1
Список различий в выполнении команд в подобных ситуациях для машин производства DEC имеется, по
меньшей мере, в документе «PDP-11/94-E System User and Maintenance Guide», EK-PDP94-MG-001. Для советских машин такой обобщённой информации нет.
32
дач, т. е. выполняемая задача должна находиться в памяти целиком, однако другие задачи могут быть выгружены, а при последующей их загрузке они могут быть размещены в иных физических областях памяти. Поскольку объём виртуального адресного пространства составляет всего 64 Кбайта, подобная реализация виртуальной памяти остаётся достаточно эффективной.
3.3.4. Переходы
Как уже отмечалось, есть два основных способа формирования адреса перехода. Первый
способ используется в командах дальних переходов JMP (безусловный переход) и JSR (переход к подпрограмме). Он заключается в использовании тех же способов адресации, что и в
арифметико-логических командах, причем адрес операнда рассматривается как адрес перехода. По этой причине регистровый способ адресации в командах перехода запрещён.
При другом способе, используемом ближними переходами, к которым относятся команда
безусловного перехода BR и все команды условных переходов (их мнемоники начинаются с
B), адрес перехода задается путем указания смещения в словах относительно адреса следующей команды. Смещение имеет размер один байт и является числом со знаком. Таким образом, эти команды обеспечивают переход в диапазоне от –127 до +128 слов относительно
команды перехода. В программе на языке ассемблера обычно используются метки, а не адреса переходов; если используется адрес, то он записывается в абсолютном виде, т. е. задаётся
команда, на которую необходимо перейти, а транслятор сам вычислит необходимое смещение.
Команда перехода по счётчику SOB также использует смещение в словах относительно
следующей за ней команды, но оно рассматривается как число без знака и вычитается из
счётчика команд, т. е. переход обеспечивается только назад, в сторону меньших адресов.
Команды возврата из подпрограммы RTS и MARK неявно используют стек, однако в отличие от большинства других архитектур, сам адрес возврата может содержаться не в стеке, а
регистре, причём команда MARK требует, что он находится в регистре R5 — это чуть ли не
единственный случай в архитектуре PDP-11, когда конкретный регистр общего назначения
имеет специальное применение (другим примером является крайне редкая команда MFPT). В
случае, если адрес возврата размещается в регистре общего назначения, в вершине стека на
момент выполнения команды возврата должно находиться значение, загружаемое в этот
регистр после того, как его содержимое будет переслано в PC. Сохранение содержимого
регистра в стеке и занесение в него адреса возврата выполняется командой JSR. Подробно
механизм вызова подпрограмм и возврата из них рассмотрен при описании соответствующих
команд.
3.4. Обработка прерываний
3.4.1. Причины прерываний
В общем случае прерывания делятся на внутренние, вызываемые какими-либо событиями в процессоре, и внешние, возникающие по запросам от устройств.
Внутренние прерывания происходят по следующим причинам:
• обращение по несуществующему адресу (таймаут шины), нечётная адресация, переполнение стека, некоторые недопустимые команды — вектор 4;
• попытка выполнения несуществующей команды либо привилегированной команды в любом режиме, кроме режима ядра, — вектор 10;
• прерывание по установленному биту T — вектор 14
• прерывания по командам прерываний BPT , IOT, EMT, TRAP — векторы 14, 20, 30, 34;
• прерывание из-за сбоя питания — вектор 24;
33
• ошибка при обработке вещественных чисел командами ППЗ или командами набора FIS
— вектор 244;
• ошибка MMU или отслеживание доступов к памяти — вектор 250.
Внутренние прерывания, как правило, замаскированы быть не могут и являются синхронными, т. е. происходят сразу после завершения команды, действиями которой они вызваны, или прекращают выполнение этой команды и происходят сразу после этого.
3.4.1.1. Прерывание по ошибкам обращения к шине (вектор 4)
Прерывание по вектору 4 происходит в следующих случаях:
• при попытке обращения по адресу, которому не соответствует ячейка памяти или какойлибо регистр. Технически в этой ситуации инициатору (процессору) за разумное время не
приходит ответ от адресованного исполнителя, что рассматривается как так называемый
таймаут шины;
• в случае, если адресуемый исполнитель вместо обычного подтверждения операции выдал
сигнал ошибки (например, если контроллер ОЗУ обнаружил некорректируемую ошибку в
адресуемой ячейке памяти);
• при попытке считать или записать слово памяти по нечётному адресу, т. е. когда младший
бит адреса равен 1. Эта ошибка обнаруживается любыми машинами серии PDP-11, но не
LSI-11, которые при обращении к слову игнорируют младший бит адреса и всегда обращаются к слову, расположенному по чётному адресу. Часть микропроцессоров, реализующих архитектуру LSI-11, ведёт себя аналогично, но нельзя исключать, что некоторые
из них контролируют адрес подобно PDP-11;
• при обнаружении переполнения стека ядра или единственного стека машины; подробнее
это описано в разделе «Контроль стека и регистр границы стека SL». Контроль переполнения не распространяется на стеки пользователя и супервизора;
• в PDP-11 моделей 44, 45 и 70, а также в микропроцессоре J-11 — при использовании
регистровой адресации в командах JMP и JSR (все остальные машины в этой ситуации
выполняют прерывание по вектору 10);
• в PDP-11/44, 45, 70 и в микропроцессоре J-11 — при выполнении команды HALT в режиме пользователя или супервизора (на остальных машинах в этом случае происходит прерывание по вектору 10).
Все причины возникновения прерывания по вектору 4, кроме нарушения жёлтой зоны
стека, приводят к немедленному прекращению текущей операции и входу в прерывание. Нарушение жёлтой границы стека вызывает прерывание после нормального окончания выполнения команды или входа в какое-либо прерывание, процесс которого привёл к нарушению.
Если при попытке обращения к стеку ядра обнаруживается, что указатель стека нечётный, нормальное выполнение входа в обработчик прерывания по вектору 4 оказывается невозможным, поскольку в процессе входа необходимо сохранить в стеке текущее состояние,
чему препятствует нечётное содержимое SP. В этой ситуации в зависимости от модели либо
происходит останов процессора, либо в указатель стека ядра заносится значение 4, после чего происходит вход в обработчик прерывания по вектору 4, см. раздел «Контроль стека и
регистр границы стека SL».
Если прерывание по вектору 4 происходит из-за невозможности выбрать первое слово команды, указанной регистром PC, то на большинстве машин сохраняемое при прерывании
значение PC будет на 2 больше того значения, которое вызвало прерывание. Однако на
PDP-11/35 и 40 ошибочное значение PC сохраняется в неизменном виде.
34
Замечание по программированию.
В PDP-11/70, микропроцессоре J-11, а возможно, и в некоторых других моделях предусмотрен регистр ошибок процессора, содержимое которого показывает причину прерывания
по вектору 4.
3.4.1.2. Прерывание по недопустимой команде (вектор 10)
Прерывание по вектору 10 происходит в следующих случаях:
• считанный код команды является зарезервированным, т. е. не соответствует какой-либо
существующей команде;
• код соответствует команде, которая не реализована на данном процессоре;
• код соответствует команде JMP или JSR, в которой указан регистровый вид адресации (за
исключением PDP-11 моделей 44, 45 и 70 и микропроцессора J-11, которые в аналогичной ситуации выполняют прерывание по вектору 4);
• процессор работает в режиме пользователя или супервизора и производится попытка выполнения команды HALT. На PDP-11/44, 45, 70 и в микропроцессоре J-11 в этом случае
произойдёт прерывание по вектору 4.
Сохранённый при прерывании PC будет равен адресу недопустимой команды плюс 2, поскольку после выборки первого слова кода команды PC сразу увеличивается на 2 и лишь после этого выполняется анализ считанного кода, в результате которого происходит данное прерывание.
3.4.1.3. Прерывание по биту T (вектор 14)
Установленный в PSW бит T (разряд 5) вызывает возникновение прерывания по вектору
14 сразу после завершения выполнения команды. Исключением является команда RTT: она
подавляет действие бита T, поэтому после её завершения прерывания не будет, а начнёт выполняться следующая за ней команда (при условии, что попытка выполнения команды RTT
не вызвала появление другого прерывания — например, по вектору 4 из-за недопустимого содержимого указателя стека).
Прерывание по вектору 14 возникает также при выполнении команды BPT.
Замечания по программированию.
1. Если на момент начала выполнения команды бит T установлен и выполняемая команда
сбрасывает его, по её завершении прерывание по вектору 14 всё равно произойдёт, но в
сохраняемом при прерывании старом PSW бит T уже будет сброшен.
2. Если выполняется одна из команд прерываний EMT, TRAP и IOT и при этом бит T установлен, после выполнения команды произойдёт прерывание по соответствующему ей
вектору (20, 30, 34), а не по вектору 14, при этом в стек записывается PSW с установленным битом T.
3. Если команда начала выполняться с установленным битом T и вызвала прерывание по
вектору 4 из-за нечётной адресации или таймаута шины, поведение аналогично предыдущему случаю.
4. Если выполнение команды при уже установленном бите T привело к переполнению
стека, сначала происходит прерывание по вектору 14, которое, в свою очередь, тоже вызывает переполнение стека. После завершения процессора прерывания по вектору 14, но
до выполнения первой команды его обработчика, происходит прерывание по вектору 4,
вызванное переполнением стека.
5. Если к моменту окончания выполнения команды, установившей бит T, поступил запрос
разрешённого внешнего прерывания, то сразу после завершения этой команды происхо35
дит вход в обработчик внешнего прерывания, при этом сохраняется PSW с установленным битом T. После возврата из обработчика выполняется команда, к которой произошёл
возврат, а затем происходит прерывание по вектору 14 (за исключением перечисленных
здесь особых случаев, которые могут возникнуть при выполнении команды и помешать
немедленному прерыванию по вектору 14 по её завершении).
6. Нет полной ясности с реакцией процессора на выполнение команды WAIT при установленном бите T. Согласно таблице программных отличий различных моделей, приведённой в документации на PDP-11/94, LSI-11, PDP-11/45 и PDP-11/70 в этом случае перейдут
в ожидание, а на остальных моделях вместо ожидания произойдёт прерывание по вектору
14. В то же время документация на PDP-11/45 и PDP-11/70 говорит о том, что на этих машинах, как и на PDP-11/20, сразу произойдёт прерывание.
7. Если при установленном бите T выполняется команда HALT, процессор останавливается.
После возобновления его работы (например, при нажатии кнопки «Пуск» на пульте
управления) он выполнит следующую за HALT команду, после чего произойдёт прерывание по вектору 14 (за исключением перечисленных здесь особых случаев, которые могут
возникнуть при выполнении команды и помешать немедленному прерыванию по вектору
14 по её завершении).
3.4.1.4. Прерывания по командам прерываний (векторы 14, 20, 30, 34)
Прерывания с векторами 14, 20, 30 и 34 не связаны с ошибками, а вызываются выполнением соответственно команд BPT, IOT, EMT и TRAP. Кроме того, прерывание по вектору 14
происходит после завершения выполнения любой команды, кроме RTT, если на момент начала её выполнения в PSW был установлен бит T.
3.4.1.5. Прерывание по аварии электропитания (вектор 24)
Прерывание по вектору 24 происходит при падении напряжения в питающей сети ниже
определённого значения и выполняется сразу после нормального завершения текущей команды, т. е. выполнение программы после него может быть, в принципе, продолжено. Это
прерывание позволяет операционной системе сохранить содержимое регистров процессора в
энергонезависимой памяти и безопасным образом остановить работу для её возобновления
после восстановления питания.
3.4.1.6. Прерывание по регистру PIRQ (вектор 240)
Установка разрядов регистра PIRQ формирует запросы прерываний соответствующих
приоритетов. Когда такое прерывание разрешено, оно происходит по вектору 240.
3.4.1.7. Прерывание по ошибкам при выполнении команд
вещественной арифметики (вектор 244)
Прерывание по вектору 244 происходит при какой-либо ошибочной или необычной ситуации при выполнении команды обработки вещественных чисел набора FIS или FPP.
В случае прерывания при выполнении команды набора FIS оно происходит сразу после
завершения выполнения команды, при этом причина прерывания (переполнение порядка, деление на нуль и т. д.) отражается остановкой обычных флагов N, Z, V, C.
Прерывание в результате выполнения команды набора FPP происходит, вообще говоря,
асинхронно по отношению к работе центрального процессора, т. е. оно может произойти в
любой момент после завершения выборки вызывающей прерывание команды FPP и до начала выполнения следующей команды FPP. Причина такого поведения кроется в том, что процессор с плавающей запятой после завершения выборки команды может работать параллельно и независимо от центрального процессора — так это обстоит, например, в PDP-11/70.
36
Причина возникновения прерывания отражается содержимым регистра FEC, а адрес вызвавшей прерывание команды FPP — содержимым регистра FEA.
Прерывания из-за ошибок при выполнении команд FIS запрещены быть не могут; прерывания от FPP управляются соответствующими битами регистра FPS.
3.4.1.8. Прерывание от MMU (вектор 250)
При включённом MMU возможно возникновение прерываний по следующим причинам:
• при попытке выполнить обращение к памяти при недопустимом состоянии битов текущего режима процессора PSW[15:14];
• при попытке выполнить обращение к недоступной странице;
• при попытке выполнить запись в страницу, доступную только для чтения;
• при попытке обратиться по адресу, выходящему за пределы страницы;
• при успешном обращении к странице, для которой включено отслеживание доступов.
Во всех этих случаях происходит прерывание по вектору 250, причём прерывание по отслеживанию доступа имеет место после успешного завершения команды, а остальные причины прерываний немедленно прекращают выполнение команды. Виртуальный адрес, обращение по которому стало причиной прерывания, запоминается в регистре MMR2, а причина
прерывания отражается битами регистра MMR0.
В случае прерывания по недопустимому доступу регистры процессора могут быть уже
частично изменены вследствие использования адресации с автоинкрементом или автодекрементом. В полном MMU предусмотрен регистр MMR1, запоминающий изменения, внесённые в содержимое регистров, что даёт возможность операционной системе выполнить «откат» для повторения выполнения команды после устранения причин прерывания (например,
загрузки недостающей страницы виртуальной памяти в физическую). В упрощённых MMU
этот регистр отсутствует, поэтому прерывание по недопустимому доступу является для программы фатальным.
3.4.1.9. Запросы внешних прерываний
Внешние прерывания запрашиваются устройствами, подключёнными к процессору и памяти по шине. Эти запросы имеют приоритеты (теоретически от 1 до 7, на практике обычно
4–7 — в соответствии с количеством линий BR, поддерживаемых стандартными реализациями UNIBUS) и происходят только в том случае, когда приоритет процессора, определяемый
битами PSW[7:5], ниже, чем приоритет запроса прерывания. Если несколько устройств,
запрашивающих прерывание, имеют одинаковый приоритет, прерывание будет выполнено
для устройства, наиболее близкого на шине к процессору.
В отличие от PDP-11, машины серии LSI-11 и, по меньшей мере, некоторые реализующие
эту архитектуру микропроцессоры имеют единственную линию запросов внешних прерываний, а вместо трёх разрядов в PSW используется лишь бит 7, установленное значение которого блокирует прерывания. Однако, например, микропроцессор T-11, близкий по остальным
характеристикам к LSI-11, поддерживает четыре уровня приоритетов.
Запрос прерывания от внешнего устройства обрабатывается после выполнения очередной
команды и не влияет на её результаты. Если выполнение команды вызывает возникновение
какого-либо прерывания, сначала происходит прерывание, вызванное этой командой, и лишь
затем может произойти прерывание по запросу от устройства, если новое значение PSW, загруженное в ходе прерывания в результате выполнения команды, это позволяет.
В отличие от большинства других архитектур, значение вектора прерывания выдаётся
процессору самим устройством, захватывающим для этого шину. Хотя векторы обычно адресуют младшие 256 байт памяти, технически вектор может быть любым в пределах младших
64 Кбайт адресного пространства, так как он является 16-разрядным адресом, выровненным
на границу двойного слова (содержит нули в двух младших разряда). Технически
37
большинство внешних устройств поддерживают возможность установить используемый ими
вектор прерывания путём коммутации тех или иных перемычек.
3.4.2. Обработка запроса прерывания
Независимо от источника запроса прерывания действия процессора по обработке запроса, с точки зрения программиста, будут одинаковы:
1. Текущее слово состояния процессора запоминается во временном регистре.
2. Из памяти по адресу вектор+2 считывается значение нового PSW, причём для доступа к
памяти принудительно используется режим ядра.
3. Считанное значение нового PSW заносится в регистр PSW, однако в разряды 13:12 регистра заносится значение разрядов 15:14 старого PSW, т. е. происходит запоминание режима работы процессора, активного на момент прерывания.
4. В стеке нового текущего режима сохраняются сначала старое PSW (из временного регистра), а затем PC.
5. Из памяти по адресу вектор считывается значение нового PC, причем для доступа к памяти принудительно используется режим ядра.
6. Выполнение программы возобновляется под управлением новых PSW и PC.
Заметим, что адреса, по которым сохраняются старые и выбираются новые PSW и PC, являются виртуальными и подвергаются обычному преобразованию, если MMU включено. Это
позволяет, в частности, переместить таблицу векторов из нулевого физического адреса памяти в любую другую область.
Вход в прерывание на PDP-11/70, начиная с момента получения вектора прерывания и заканчивая началом выборки первой команды обработчика прерывания, требует порядка 2,5
мкс; на PDP-11/20 эти же действия занимают примерно 7,2 мкс.
Как правило, если имеется ожидающий обслуживания запрос прерывания, а новое PSW,
только что загруженное при входе в какое-либо прерывание, не запрещает этот ожидающий
запрос, немедленно начинается вход в прерывание по данному запросу. Однако PDP-11/15 и
20 сразу после входа в прерывание выполняют первую команду обработчика этого прерывания и лишь затем анализируют наличие иных запросов прерываний.
Ошибка при выборке нового PSW или PC либо при сохранении значений старых PSW и
PC в стеке приводит к немедленному возникновению прерывания по вектору 4.
Если во время входа в прерывание по вектору 4 происходит новое прерывание по тому же
вектору, фиксируется так называемая двойная ошибка шины. Дальнейшие действия процессора зависят от модели:
• в PDP-11/04, 05, 10, 15, 20, 34, 44 и LSI-11 процессор переходит в состояние останова;
• в остальных моделях в указатель стека режима ядра заносится значение 4, после чего
производится попытка входа в прерывание по вектору 4. При успехе процессор начинает
выполнять обработчик этого прерывания, который может распознать данный случай по
нулевому значению указателя стека ядра (при входе в прерывание в новый стек, образованный ячейками 0 и 2, были записаны PC и PSW на момент прерывания). При неудаче
процессор, по всей видимости, останавливается.
3.4.3. Возврат из прерывания
Команды возврата из прерывания RTI и RTT восстанавливают из стека текущего режима
содержимое счётчика команд и слова состояния программы, после чего работа продолжается
с использованием восстановленных значений этих регистров. Разница между ними заключается в том, что команда RTT игнорирует значение флага T в PSW, установленное на момент
38
начала её выполнения, а поэтому по её завершении прерывание трассировки никогда не
происходит. Команда RTI ведёт себя подобно остальным командам: если на момент начала её
выполнения флаг T был установлен, сразу после завершения выполнения этой команды
произойдёт прерывание трассировки.
Команда RTT отсутствует на PDP-11 моделей 05, 10, 15 и 20, однако команда RTI на этих
машинах ведёт себя подобно RTT.
3.5. Сброс и пуск процессора
При сбросе при включении питания или при нажатии соответствующей кнопки пульта
управления MMU и устройство отображения адресов шины отключаются, сбрасываются все
признаки ошибок и, как правило, имитируется прерывание по вектору 173024. Диапазон адресов 173000—173777 занимает ПЗУ начального загрузчика, и данный вектор находится внутри этого ПЗУ. Обычно он задает начальный адрес программы 173000 и значение PSW, равное 000340, что соответствует программе начальной загрузки, размещенной в этом ПЗУ и выполняемой при запрещённых прерываниях.
Программа в ПЗУ выполняет тестирование некоторых команд и режимов адресации процессора. При успешном завершении тестов на экран консольного терминала (адрес 177560)
выводится приглашение загрузчика. В ответ оператор должен ввести имя и номер устройства,
с которого будет выполняться загрузка ОС, например "DM1". Загрузчик считывает загрузочную запись с заданного устройства и передает ей управление.
Помимо возможности загрузки с определённых устройств, размещённая в ПЗУ программа даёт возможность выполнить элементарные операции, обычно производимые с пульта
управления: прочитать и изменить содержимое ячеек памяти или начать выполнение программы с указанного адреса.
При сбросе процессора производится также сброс всех устройств на шине. При этом во
всех устройствах прекращаются ранее начатые операции, сбрасываются признаки ошибок и
запросы прерываний. Если сброс выполняется в многопроцессорном комплексе, второй процессор переходит в состояние останова.
Для программного сброса всех устройств на шине, но продолжения выполнения программы процессора имеется специальная команда RESET: она выдаёт сигнал сброса на шину, а
также сбрасывает различные управляющие регистры самого процессора, что вызывает отключение MMU. Однако PSW, регистры общего назначения и регистры FPU остаются незатронутыми, поэтому программа продолжает своё нормальное выполнение.
Пуск процессора может быть произведен оператором с произвольного адреса с помощью
пульта управления, при этом сброс не выполняется. В частности, только таким путём может
быть запущен в работу второй процессор двухпроцессорной ЭВМ.
Заметим, что точный способ запуска процессора после сброса, а также действия, выполняемые запускаемой при этом программой, определяются конкретной реализацией; описанное выше является лишь типичным примером.
39
4. Преобразование адресов
16-разрядный адрес, формируемый процессорами PDP-11, ограничивает адресное пространство величиной 64 Кбайта. Для преодоления этого барьера, а также для обеспечения защиты памяти многие модели процессоров оборудованы специальным устройством управления памятью (MMU, memory management unit), в советской документации обычно именуемым диспетчером памяти.
Младшие модели MMU не имеют, поэтому способны использовать адресное пространство размером 64 Кбайта, включая 8 Кбайт для адресов регистров устройств. Многие
модели средней мощности имеют MMU, способное формировать 18-разрядный физический
адрес, что ограничивает объём адресуемой физической памяти 256 Кбайтами, включая 8
Кбайт для адресов регистров устройств; к ним относится, в частности, PDP-11/34, PDP-11/40
и советская СМ-4. В некоторых случаях собственно процессор MMU не имеет, но оно может
быть добавлено к нему, будучи «вклиненным» между собственно процессором и шиной —
так обстоит дело, например, в PDP-11/40. Старшие модели — PDP-11/70, СМ-1420 и др. —
оборудуются MMU, формирующим 22-разрядный адрес и способным для обеспечения совместимости работать в 18-разрядном режиме; такие машины имеют в своём составе также
устройство отображения адресов шины на память, чтобы преобразовывать 18-разрядные адреса, формируемые внешними устройствами, в 22-разрядные адреса памяти.
MMU разных машин отличаются
друг от друга не только по разрядности физического адреса, но и по
своим функциональным возможностям. Самым полным MMU обладает
PDP-11/70, пути передачи адреса в
которой приведены на рисунке. Все
другие реализации MMU имеют место те или иные упрощения; основной разницей, однако, являются описанная выше разрядность физического адреса, а также поддержка двух
или трёх режимов процессора и наличие или отсутствия разделения
виртуального
адресного
пространства на код и данные.
Самые распространённые советские ЭВМ СМ-1420 и СМ-1600 включают 22-разрядное MMU, поддерживающее два режима
работы и не разделяющее пространства кода и данных. На СМ-1425 поддерживаются три режима и имеется разделение на код и данные, но неизвестно, имеются ли там некоторые дополнительные возможности, присутствующие в PDP-11/70.
4.1. Виртуальные и физические адреса
16-разрядный адрес, формируемый процессором, называется виртуальным адресом, а 18или 22-разрядный, выдаваемый в ОЗУ и на шину — физическим.
Виртуальный адрес состоит из трех частей:
• номера страницы (разряды 15:13);
• номера блока (разряды 12:6);
• номера байта (разряды 5:0).
40
Физический адрес шины всегда 18-разрядный. Если аппаратура ЭВМ поддерживает только 18-разрядную адресацию, память физически подключается к шине наравне с другими
устройствами, а все доступы процессора выдаются на шину, в зависимости от адреса обращаясь либо к памяти (до 248 Кбайт, адреса 000000–757777), либо к регистрам устройств и
самого процессора (старшие 8 Кбайт, адреса 760000–777777).
Если аппаратура способна работать в 22-разрядном режиме, память подключается к процессору напрямую, а к шине — через устройство отображения. При работе MMU в 18-разрядном режиме после преобразования виртуального адреса в физический формируются адреса в диапазоне 000000–777777. Если сформированный адрес относится к младшим 248 К
байтам этого пространства, т. е. попадает в диапазон 000000–757777, обращение производится напрямую к памяти по таким же адресам. Если же сформированный адрес относится к
старшим 8 Кбайтам, т. е. находится в диапазоне 760000–777777, он выдаётся на шину, что
обеспечивает доступ к регистрам устройств.
Если MMU работает в 22-разрядном режиме, после преобразования может быть получен
любой адрес в диапазоне 00000000–17777777. Обращения в диапазоне 00000000–16777777, т.
е. охватывающие весь адресуемый объём, кроме старших 256 Кбайт, выдаются в ОЗУ. Обращения в диапазоне 17000000–17777777, соответствующие старшим 256 Кбайтам 22-разрядного физического адресного пространства, выдаются на шину как 18-разрядные адреса в
диапазоне 000000–777777, чем обеспечивается, в том числе, и доступ к регистрам устройств.
4.2. Регистры MMU
MMU имеет несколько регистров для управления его работой, а также несколько групп
регистров отображения страниц памяти.
Все регистры MMU являются 16-разрядными; доступ к ним может выполняться и полными словами, и отдельными байтами. Общее количество регистров зависит от типа MMU. Сами MMU совместимы «снизу вверх», поэтому, например операционная система, способная
использовать 18-разрядное упрощённое MMU, сможет нормально работать и на 22-разрядном полном. В дальнейшем будет описываться полное 22-разрядное MMU, а где необходимо,
будут отмечаться возможные упрощения.
Регистры, управляющие работой MMU, обозначаются либо MMR0–MMR3 (memory management registers), либо SR0–SR3 (status registers) в зависимости от модели ЭВМ. Обозначения MMR характерны для машин с полным 22-разрядным MMU, например, для PDP-11/70;
обозначения SR обычно встречаются у машин с упрощённым 18-разрядным MMU, например,
PDP-11/34, но иногда и для них используются обозначения MMR. Независимо от обозначения эти регистры содержат одни и те же биты и поля.
Как уже говорилось, полное MMU содержит три набора по две группы регистров отображения адресов: по одному набору для режимов ядра, супервизора и пользователя, в каждом
из которых имеются отдельные группы регистров для пространств команд и данных.
Упрощённое MMU содержит только наборы ядра и пользователя, включающие лишь одну
группу регистров каждый, поскольку ими оснащаются процессоры, не имеющие режима
супервизора, а разделения на пространство команд и данных не предусматривается.
Каждая группа содержит восемь пар регистров отображения. Каждая пара соответствует
одной из восьми страниц виртуального адресного пространства и состоит из регистра адреса
страницы PAR и регистра описания страницы PDR. Пара регистров PAR и PDR вместе называются регистром активной страницы — APR (active page register).
Полное обозначение регистра PAR или PDR, используемое в исходных текстах программ,
не включает букву P, однако включает буквы, идентифицирующие режим работы и вид адресного пространства, и цифру, определяющую номер страницы. Например, обозначение
41
SISDR1 обозначает регистр PDR для страницы 1 пространства команд режима супервизора
(supervisor instruction space descriptor register 1).
4.2.1. Регистры адресов страниц
Регистр адреса страницы (PAR, page address register) содержит базовый адрес страницы
физической памяти, на которую отображается страница виртуальной памяти, задаваемый
блоками по 64 байта. В 18-разрядном режиме используются биты 11:0 регистра PAR; старшие четыре разряда должны быть равны нулю (в 18-разрядном MMU они физически не реализованы). В 22-разрядном режиме используются все шестнадцать разрядов регистра.
В каждую группу входит восемь регистров PAR0–PAR7, доступных как восемь слов со
следующими адресами:
• режим ядра, пространство команд — KISAR0–KISAR7, 172340–172356;
• режим ядра, пространство данных — KDSAR0–KDSAR7, 172360–172376;
• режим супервизора, пространство команд — SISAR0–SISAR7, 172240–172256;
• режим супервизора, пространство данных — SDSAR0–SDSAR7, 172260–172276;
• режим пользователя, пространство команд — UISAR0–UISAR7, 177640–177656;
• режим пользователя, пространство данных — UDSAR0–UDSAR7, 177660–177676.
В упрощённом MMU поддерживается только два режима и нет разделения на пространства команд и данных, поэтому имеющиеся регистры PAR занимают адреса 172340–
172356 и 177640–177656, соответствующие пространству команд режимов ядра и пользователя в полном MMU.
PDP-11/34, 35, 40, 60 и микропроцессор T-11, а также советская СМ-4 имеют 12-разрядные регистры PAR: четыре старших бита у них не реализованы и всегда равны нулю. Остальные машины, имеющие MMU, располагают полными 16-разрядными регистрами PAR.
4.2.2. Регистры описаний страниц
Регистр описания страницы (PDR, page descriptor register) описывает характеристики
страницы памяти и имеет следующий формат.
NC
15
PLF
14
13
12
11
10
9
8
A
W
7
6
ED
5
4
3
ACF
2
1
0
Бит 15, NC, как правило, не используется. Однако в микропроцессоре J-11 его единичное
значение запрещает кэширование доступов к памяти, чьи адреса преобразуются с использованием данного PDR.
Заметим, что доступы к старшим 8 Кбайтам физического адресного пространства, т. е. к
регистрам устройств, не кэшируются независимо от модели процессора и состояния этого
разряда.
Биты 14:8, поле PLF (page length field), задают длину страницы в 64-байтовых блоках.
Если страница расширяется вверх (бит ED сброшен), это поле содержит максимально допустимый номер блока в данной странице; в частности, значение 177 обеспечивает доступ ко
всей странице размером 8 Кбайт, а значение 0 — лишь к первому 64-байтовому блоку страницы.
При расширении страницы вниз (бит ED установлен) в этом поле содержится минимально допустимый номер блока, доступу ко всей странице в этом случае соответствует значение
000.
Бит 7, A (access), аппаратно устанавливается, если при обращении к странице наступило
отслеживаемое событие, т. е. что из этой страницы выполнялось чтение, а поле ACF содержит значение 1 или 4, либо выполнялась запись, а поле ACF содержит значение 4 или 5. Он
аппаратно сбрасывается при выполнении любой записи в регистр PDR или соответствующий
ему регистр PAR.
42
Бит A реализован только в полном MMU, используемом в PDP-11/45 и 70 (возможно, и в
советской СМ-1425); во всех остальных машинах его нет.
Бит 6, W (written into), является признаком модификации содержимого страницы и устанавливается аппаратно при выполнении любой успешной операции записи. Он аппаратно
сбрасывается при выполнении любой записи в регистр PDR или соответствующий ему
регистр PAR.
Биты 5 и 4 не используются и должны быть равны нулю.
Бит 3, ED (expansion direction), задает направление расширения страницы. Нулевое значение указывает на расширение страницы в сторону увеличения адресов: доступная часть
страницы начинается нулевым блоком и продолжаются вплоть до блока, определённого полем PLF, включительно. Единичное значение указывает на расширение страницы в сторону
уменьшения адресов: доступная часть страницы начинается блоком 177 и простирается вниз
до блока, определённого полем PLF, включительно.
Обычно используется расширение страницы вверх; расширение вниз может применяться
для страницы, содержащей стек, который может расширяться по мере необходимости.
Биты 2:0, поле ACF (access control field), управляют доступностью страницы. На машинах с полным MMU (PDP-11/45 и 70; возможно, и на советской СМ-1425) они могут принимать следующие значения:
• 000 — доступ запрещён (страница выгружена или задаче не выделялась);
• 001 — только чтение, оповещение при считывании;
• 010 — только чтение, без оповещения;
• 011 — не используется, запрещает любые доступы;
• 100 — чтение и запись, оповещение при обращении;
• 101 — чтение и запись, оповещение при записи;
• 110 — чтение и запись, без оповещения;
• 111 — не используется, запрещает любые доступы.
В случае, если выполняется разрешённый доступ, вызывающий оповещение, после завершения выполнения команды происходит прерывание по вектору 250, уведомляющее операционную систему о выполнении данного доступа. Если команда пытается осуществить
запрещённый доступ к странице, её выполнение немедленно прекращается и происходит прерывание по тому же вектору, уведомляющее систему о недопустимом обращении к памяти.
PDP-11/23, 24, 34, 35, 40, 60, микропроцессоры J-11 и T-11, а также советские ЭВМ СМ-4,
СМ-1420 и СМ-1600 имеют поле ACF, включающее только биты 2 и 1; бит 0 физически не
реализован и считывается как нуль. Два бита этого поля имеют значения, совместимые со
значениями полного поля:
• 00 — доступ запрещён;
• 01 — только чтение;
• 10 — доступ запрещён;
• 11 — чтение и запись.
В каждую группу входит восемь регистров PDR0–PDR7, доступных как восемь слов со
следующими адресами:
• режим ядра, пространство команд — KISDR0–KISDR7, 172300–172316;
• режим ядра, пространство данных — KDSDR0–KDSDR7, 172320–172336;
• режим супервизора, пространство команд — SISDR0–SISDR7, 172200–172216;
• режим супервизора, пространство данных — SISDR0–SISDR7, 172220–172236;
• режим пользователя, пространство команд — UISDR0–UISDR7, 177600–177616;
• режим пользователя, пространство данных — UDSDR0–UDSDR7, 177620–177636.
В MMU, поддерживающих только два режима работы процессора и не имеющих разделения на пространства кода и данных, имеющиеся регистры PDR занимают адреса 172300–
43
172316 и 177600–177616, соответствующие пространству команд режимов ядра и пользователя в полном MMU.
4.2.3. Регистр MMR0 (SR0)
Регистр MMR0 отражает состояние MMU расположен по адресу 177572 и имеет следующий формат.
ANR
APL
ARO
T
15
14
13
12
11
10
TE
M
IC
9
8
7
PM
6
PAS
5
4
PN
3
2
E
1
0
Разряды регистра MMR0 имеют следующее назначение.
Бит 15, ANR (abort, non resident), устанавливается при попытке обращения к отсутствующей в памяти страницы, а также при попытке выполнить команду в недопустимом режиме
работы процессора (когда биты PSW[15:14] содержат запрещённую комбинацию). Выполнение команды немедленно прекращается и происходит прерывание по вектору 250.
Если этот бит установлен, MMU блокирует обновление содержимого разрядов
MMR0[7:1], а также регистров MMR1 и MMR2.
Программа может читать и записывать этот бит. Запись единицы не вызывает прерывание
по ошибке MMU, но блокирует обновление указанных выше регистров и разрядов. Для возобновления нормального отслеживания ошибок этот бит должен быть программно сброшен.
Бит 14, APL (abort, page length error), устанавливается при попытке обращения к адресу,
выходящему за пределы страницы, а также при попытке выполнить команду в недопустимом
режиме работы процессора. Выполнение команды немедленно прекращается и происходит
прерывание по вектору 250.
Если этот бит установлен, MMU блокирует обновление содержимого разрядов
MMR0[7:1], а также регистров MMR1 и MMR2.
Программа может читать и записывать этот бит. Запись единицы не вызывает прерывание
по ошибке MMU, но блокирует обновление указанных выше регистров и разрядов. Для возобновления нормального отслеживания ошибок этот бит должен быть программно сброшен.
Бит 13, ARO (abort, read only), устанавливается при попытке выполнить запись в страницу, доступную только для чтения. Выполнение команды немедленно прекращается и происходит прерывание по вектору 250.
Если этот бит установлен, MMU блокирует обновление содержимого разрядов
MMR0[7:1], а также регистров MMR1 и MMR2.
Программа может читать и записывать этот бит. Запись единицы не вызывает прерывание
по ошибке MMU, но блокирует обновление указанных выше регистров и разрядов. Для возобновления нормального отслеживания ошибок этот бит должен быть программно сброшен.
Бит 12, T (trap), устанавливается, если к некоторой странице выполняется отслеживаемый доступ, т. е. если из страницы выполняется чтение, а поле ACF её регистра PDR содержит значение 1 или 4, либо если в страницу выполняется запись, а в ACF содержится значение 4 или 5. Если никаких ошибок при выполнении команды не возникает, она обычным образом выполняется до завершения, после чего, если бит MMR0[9] установлен, происходит
прерывание по вектору 250.
Если этот бит установлен, MMU блокирует обновление содержимого разрядов
MMR0[7:1], а также регистров MMR1 и MMR2.
Этот бит присутствует только в MMU машин PDP-11/45 и 70 (возможно, и в СМ-1425).
Биты 11 и 10 не реализованы и считываются как нули.
Бит 9, TE (trap enable), когда установлен, разрешает прерывания по оповещению ОС о
доступе к странице, а когда сброшен, запрещает эти прерывания. При запрещённых оповещениях доступы к странице всё равно отслеживаются и отражаются установкой битов A и W её
44
регистра PDR, т. е. запрет относится только к самому прерыванию по вектору 250, вызываемому установкой бита 12.
Если команда, сбрасывающая бит 9, сама является источником возникновения оповещения о доступе к какой-либо странице памяти, после завершения её выполнения произойдёт
прерывание, хотя бит 9 к этому моменту уже будет сброшен. Если команда устанавливает бит
9, его установка приведёт к возникновению прерывания только при следующих доступах к
отслеживаемым страницам, но не при доступах, выполняемых самой командой, устанавливающей этот бит.
Этот бит присутствует только в MMU машин PDP-11/45 и 70 (возможно, и в СМ-1425).
Бит 8, M (maintenance), когда установлен, задаёт диагностический режим работы MMU.
У PDP-11/23, 24 и микропроцессора J-11 этот бит не реализован.
Бит 7, IC (instruction completed), указывает, что текущая команда была завершена.
Изначально этот бит устанавливается. Если происходит прерывание по биту T в PSW, по
нечётному адресу, по ошибке чётности или по таймауту, он сбрасывается. Заметим, что команды EMT, TRAP, IOT и BPT не устанавливают этот бит.
Бит 7 доступен только для чтения, попытка записи в него игнорируется. Он бит присутствует только в MMU машин PDP-11/45 и 70 (возможно, и в СМ-1425).
Биты 6:5, поле PM (processor mode), хранят режим работы процессора, к которому относится страница памяти, доступ к которой привёл к возникновению ошибки и установке одного из разрядов 15:13. Если происходит несколько ошибок, биты 6:5 отражают режим, использованный для доступа во время возникновения первой из них; условия возникновения последующих ошибок не сохраняются.
Бит 4, PAS (page address space), показывает, обращение к какому адресному пространству привело к возникновению ошибки. Если произошло несколько ошибок, он отражает пространство лишь для первой из них.
Этот бит присутствует только в MMU, поддерживающих разделение виртуального адресного пространства на код и данные.
Биты 3:1, поле PN (page number), содержат номер страницы, при обращении к которой
возникла ошибка. Если возникло несколько ошибок, отражается номер страницы лишь для
первой из них.
Бит 0, E (enable), разрешает работу MMU. Когда он сброшен, MMU выключено и преобразование адресов не выполняется.
Замечания по программированию.
1. Имеющаяся документация на разные модели PDP-11 несколько противоречива и не даёт
точного и однозначного ответа, блокирует ли установка бита 12 обновление содержимого
регистров MMR1 и MMR2 и битов MMR0[7:1]. Однако все документы сходятся на том,
что после обработки прерывания по вектору 250 необходимо очистить все биты 15:12,
чтобы возобновить регистрацию новых ошибок, из чего можно сделать вывод, что бит 12
по своему поведению не отличается от битов 15:13.
2. Нет полной ясности и с битом 7. Согласно документации, он даёт обработчикам прерываний возможность определить, следует ли повторить выполнение последней команды для
исправления возникшей ошибки. Нулевое значение, которое принимает этот бит в случае
прерываний по биту T (вектор 14) или по ошибкам шины (вектор 4), указывает, что повторять команду либо не требуется: она либо выполнена до конца, а прерывание связано с
установленным в PSW битом T (то же самое относится и к командам прерываний), либо
не имеет смысла из-за фатальной ошибки.
Единичное значение, которое этот разряд, похоже, сохраняет при остальных прерываниях, а фактически — при прерываниях от MMU (вектор 250; другие прерывания происходят лишь в промежутках между командами, не препятствуя завершению текущей ко45
манды), указывает, что команда потенциально может быть повторена. Остаётся неясным,
почему он назван битом завершённости команды — вероятно, правильней было бы назвать битом повторяемости команды.
4.2.4. Регистр MMR1 (SR1)
Регистр MMR1 расположен по адресу 177574 и предназначен для сохранения информации о модификации регистров в процессе вычисления адресов операндов для команды, выполнение которой привело к возникновению ошибки MMU и прерыванию по вектору 250. По
всей вероятности, он доступен только для чтения, хотя документация об этом ничего явным
образом не говорит.
Регистр MMR1 имеет следующий формат:
Изменение 2
15
14
13
12
Регистр 2
11
10
9
Изменение 1
8
7
6
5
4
Регистр 1
3
2
1
0
Если установлен любой из разрядов MMR0[15:12], модификация содержимого MMR1 заблокирована: это обеспечивает сохранность информации о точной причине возникновения
ошибки MMU.
Если все биты MMR0[15:12] сброшены, в начале выполнения каждой очередной команды
регистр MMR1 обнуляется, а в процессе выполнения команды в нём накапливается информация об изменениях, вносимых ей с помощью автоинкремента или автодекремента регистров.
Если команда модифицирует только один регистр, соответствующая информация запоминается в младшем байте MMR1, если модифицируются два регистра, сначала заполняется младший байт, а затем — старший.
Для каждой модификации в младших трёх битах байта запоминается номер изменённого
регистра, а в старших пяти — величина его изменения, выраженная как целое число в дополнительном коде. Например, если регистр R3 был увеличен на 1, а затем регистр SP был
уменьшен на 2, MMR1 будет содержать значение 013 в младшем байте и 366 в старшем
байте.
Набор и режим процессора, к которому относятся изменённые регистры, не запоминается, но обработчик прерывания может выяснить это, проанализировав старое значение PSW,
сохранённое в стеке при прерывании.
Регистр MMR1 реализован только в полном MMU.
Замечание по программированию.
Автоинкремент и автодекремент регистров в процессе вычисления адресов приводит к
изменению на 1 или 2, поэтому пяти разрядов, отведённых на величину изменения, достаточно для сохранения всей информации, необходимой для программного «отката» изменений
перед повторением команды.
Единственной командой, которая может изменить регистр на величину, не помещающуюся в такое поле, является MARK, модифицирующая указатель стека. Однако в случае, если её
выполнение дошло до этой модификации, она уже не может вызвать ошибку, приводящую к
возникновению прерывания по вектору 250, а поэтому и сохранение информации о таком изменении не требуется.
По причине отсутствия MMR1 в упрощённом MMU полноценная виртуальная память,
допускающая лишь частичную загрузку в физическое ОЗУ необходимых задаче страниц, на
таких машинах реализована быть не может, и каждый раз, когда задача ставится на выполнение, все восемь её прямо адресуемых страниц должны находиться в физической памяти.
4.2.5. Регистр MMR2 (SR2)
Регистр MMR2 расположен по адресу177576 и доступен только для чтения.
46
Если установлен любой из разрядов MMR0[15:12], модификация содержимого MMR2 заблокирована: это обеспечивает сохранность информации о точной причине возникновения
ошибки MMU.
Если все биты MMR0[15:12] сброшены, в начале выборки каждой очередной команды в
MMR2 заносится адрес этой команды, т. е. содержимое PC на момент начала выборки. В случае установки одного из разрядов MMR0[15:12] блокирование MMR2 обеспечивает сохранность адреса команды, вызвавшей установку этих битов.
На большинстве машин регистр MMR2 фиксирует лишь адреса команд. На PDP-11/45 и
70 он фиксирует также адреса векторов прерываний.
4.2.6. Регистр MMR3 (SR3)
Регистр MMR3 имеет адрес 172516 и содержит разряды, управляющие особенностями
преобразования адресов. Его формат приведён ниже.
15
14
13
12
11
10
9
8
7
UM
22
6
5
CSM KDE SDE UDE
4
3
2
1
0
Назначение разрядов регистра MMR3 следующее.
Бит 6, UM, разрешает работу устройства отображения адресов шины на память.
Бит 5, 22, разрешает работу MMU в 22-разрядном режиме. Когда он сброшен, но MMU
включено, оно работает в 18-разрядном режиме.
Бит 3, CSM, разрешает выполнение одноимённой команды. Поскольку эта команда реализована лишь в PDP-11/44 и микропроцессоре J-11, данный бит отсутствует в любых других
моделях.
Бит 2, KDE, разрешает использование пространства данных режима ядра. Когда он сброшен, любые обращения, выполняемые в режиме ядра, преобразуются с помощью регистров
PAR и PDR пространства команд, т. е., по сути, разделение на пространства данных и команд
отсутствует.
Бит 1, SDE, разрешает использование пространства данных режима супервизора.
Бит 0, UDE, разрешает использование пространства данных режима пользователя.
Биты 6:5 реализованы в PDP-11/23, 24, 44, 70 и микропроцессоре J-11, а также в советских ЭВМ СМ-1420, СМ-1425 и СМ-1600.
Бит 3 реализован только в PDP-11/44 и микропроцессоре J-11.
Биты 2:0 реализованы только в PDP-11/44, 45, 70 и микропроцессоре J-11, а также, возможно, в советской СМ-1425.
Замечание по программированию.
В упрощённом 18-разрядном MMU регистр MMR3 отсутствует, так как такое MMU не
нуждается во входящих в его состав битах.
4.3. Процесс преобразования адреса
4.3.1. Преобразование адресов при выключенном MMU
Преобразование адресов при выключенном MMU выполняется аналогично машинам вообще без MMU. Адреса, относящиеся к младшим 56 Кбайтам виртуального адресного пространства, т. е. лежащие в диапазоне 000000–157777, используются для доступа к младшим
56 Кбайтам ОЗУ, а адреса 160000–177777 используются для доступа к старшим 8 Кбайтам
физического адресного пространства шины, для чего к ним добавляются два старших единичных бита (диапазон адресов шины 760000–777777).
47
4.3.2. Преобразование адресов при включённом MMU
18-разрядный режим активизируется установкой нулевого бита регистра MMR0 при
сброшенном пятом бите регистра MMR3.
Сначала определяется, какой из наборов регистров будет использоваться — ядра, супервизора или пользователя. Как правило, для этого применяется текущий режим работы процессора, указанный битами PSW[15:14]. Однако имеются два особых случая:
• если преобразование адреса выполняется для выборки новых значений PSW и PC в процессе входа в прерывание, всегда используется режим ядра;
• если преобразование адреса выполняется для доступа к операнду в адресном пространстве предыдущего режима, что имеет место при выполнении команд MFPI, MFPD,
MTPI и MTPD, для доступа к значению операнда используется предыдущий режим, заданный битами PSW[13:12]. Заметим, что вычисление адреса этого операнда выполняется с
использованием текущего режима процессора, в предыдущем выполняется лишь обращение к самому операнду.
Далее определяется, производится ли обращение к пространству команд или пространству данных. Пространство команд используется в следующих случаях:
• производится выборка кода команды;
• производится выборка значения индекса в случае индексной или косвенной индексной
адресации;
• производится обращение к данным, для адресации которых используется регистр PC;
• производится обращение к данным, адресуемым с использованием любого другого регистра, если использование пространства данных для выбранного режима процессора
запрещено (соответствующий режиму бит регистра MMR3 сброшен).
В остальных случаях обращение производится к пространству данных.
Заметим, что документация не даёт явного ответа на вопрос, из какого пространства
производится выборка новых PC и PSW при прерывании. Поскольку для определения адреса
выборки значение PC не используется, логично предположить, что это будет пространство
данных, если его использование разрешено, однако полностью гарантировать это нельзя.
После определения режима и пространства выбирается регистр APR, т. е. пара регистров
PAR и PDR. Номер этой пары, т. е. номер страницы виртуальной памяти, задаётся битами
15:13 преобразуемого виртуального адреса.
Далее производится проверка допустимости обращения по заданному адресу. MMU обеспечивает три вида защиты страниц:
• от обращения к недоступной странице;
• от записи в страницу, доступную только для чтения;
• от выхода за пределы страницы.
Первые два вида защиты обеспечиваются путем сравнения типа запрошенного доступа к
памяти с содержимым поля ACF регистра PDR.
Защита от выхода за пределы страницы реализуется путем сравнения номера блока, заданного битами 12:6 виртуального адреса, с полем длины страницы PLF регистра PDR с
учётом направления расширения страницы, определяемого битом ED.
Если одновременно присутствуют несколько причин ошибок защиты, битами 15:13 регистра MMR0 могут отражаться все обнаруженные ошибки одновременно либо только более
приоритетные. Самой приоритетной является ошибка из-за попытки доступа к недоступной
странице, следующей по приоритету — попытка доступа за пределы страницы, т. е. нарушение её длины, самой низкоприоритетной — попытка записи в страницу, доступную только
для чтения. Расположение флагов ошибок в регистре MMR0 слева направо соответствует
убыванию приоритета.
48
При обнаружении нарушения защиты выполняются следующие действия:
• в регистре MMR0 устанавливается как минимум один из разрядов 15:13, определяющий,
какой именно вид защиты сработал; кроме того, заполняются разряды 6:1, сохраняющие
режим, адресное пространство и номер страницы, к которой осуществлялся доступ;
• в регистре MMR2 сохраняется виртуальный адрес, обращение по которому вызвало
ошибку;
• производится немедленное прерывание по вектору 250.
4.3.3. Отслеживание обращений к памяти
Помимо защиты памяти, MMU постоянно отслеживает те или иные обращения к памяти
и в подобающих случаях устанавливает биты A и W соответствующих регистров PDR. Кроме
того, если поле ACF регистра PDR содержит одну из комбинаций, требующих от MMU оповещать программу о выполнении определённых видов обращений, при выполнении такого
обращения в регистре MMR0 устанавливается бит 12 и в случае, если прерывание по оповещению разрешено (установлен бит 9 этого же регистра), после завершения выполнения команды происходит прерывание по вектору 250. Обработчик этого прерывания, анализируя
старшие четыре разряда MMR0, определяет реальную причину прерывания.
4.4. Диагностический режим MMU
Диагностический режим включается установкой 8-го разряда регистра MMR0 при выключенном диспетчере памяти. Он заключается в том, что все обращения к памяти, кроме записи результата в операнд-приёмник, выполняются, как и положено, при выключенном
преобразовании адресов, а запись в приёмник выполняется с использованием преобразования. Этот режим используется программами проверки работоспособности MMU.
В PDP-11/23, 24 и микропроцессоре J-11 диагностический режим не реализован.
4.5. Устройство отображения адресов шины
Устройство отображения имеет 31 регистр отображения 18-разрядных адресов шины на
22-разрядные адреса памяти. Каждый регистр имеет длину 32 разряда и адресуется как два
смежных слова, младшее из которых расположено по меньшему адресу. Для регистров отображения отведены адреса 170200–170373.
Разряды 31:22 и 0 регистров отображения не используются и считываются как нули. Разряды 21:1 содержат значение, используемое при преобразовании адреса устройством отображения; логически оно дополнено справа одним нулём.
При отключённом устройстве отображения (бит 6 регистра MMR3 сброшен) адреса шины 000000–757777 в неизменном виде используются для обращения к памяти; технически к
ним слева добавляются четыре нуля, чтобы отобразить их в диапазон 00000000 – 00757777.
При включённом устройстве отображения (бит MMR3[6] установлен) адреса шины в указанном диапазоне преобразовываются следующим образом.
Старшие пять разрядов адреса шины (17:13) определяют номер одного из регистров отображения от 0 до 30 включительно. Младшие 13 разрядов (12:0) адреса шины складываются с
разрядами 21:0 выбранного регистра отображения. Результатом является 22-разрядный адрес,
который выдаётся в память.
Заметим, что, поскольку бит 0 регистра отображения всегда равен нулю, технически выполняется сложение битов 21:1 регистра отображения и 12:1 виртуального адреса, а бит 0
виртуального адреса напрямую передаётся в память.
49
5. Набор команд центрального процессора
5.1. Представление информации
Центральный процессор (ЦП) предназначен для обработки как отдельных байтов, так и
слов, состоящих из двух байтов. Некоторые команды расширенного набора используют также
двойные слова, состоящие из четырех байтов.
В PDP-11, как и во всех современных вычислительных машинах, целые числа хранятся и
обрабатываются в дополнительном коде. Младший разряд всегда имеет нулевой номер, старший разряд байта — седьмой, слова — 15-й, двойного слова — 31-й.
Символьная информация обычно представлена в коде 7-битного кода ASCII, причём старший бит байта, содержащего код ASCII, равен нулю. На практике встречались расширенные
кодировки, где первые 128 значений совпадали с кодировкой ASCII, а в старших 128 кодировались различные дополнительные символы. В СССР, однако, такой возможностью для добавления кириллицы не воспользовались; вместо этого применялся 7-битный код КОИ-7, где
последние 32 символа кодировки ASCII, содержащие малые английские буквы и некоторые
спецсимволы, были заменены на 32 большие русские буквы (без «Ё»)1.
Кроме кода ASCII, операционные системы PDP-11 широко используют код RADIX-50,
обеспечивающий представление больших латинских букв, цифр и знаков «.» и «$». Каждое
слово содержит три символа в коде RADIX-50.
Таблицы кодов ASCII, КОИ-7 и RADIX-50 приведены в приложениях.
Заметим, что никаких команд, предназначенных для работы с определёнными кодировками, система команд PDP-11 не содержит, поэтому использование той или иной кодировки
определяется исключительно тем, как коды обрабатываются программой и как они воспринимаются внешними устройствами.
5.2. Двухадресные арифметико-логические команды
5.2.1. MOV, MOVB — пересылка
MOV src,dst
0
0
0
1
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
MOVB src,dst
1
0
0
1
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
Команда пересылки выполняет передачу байта или слова из источника в приёмник.
Если приёмником является регистр, команда пересылки байта MOVB считывает из источника один байт, расширяет его знак и записывает в регистр-приёмник не байт, а полное сло1
Именно с такой заменой связано знаменитое сообщение оригинальной операционной
системы RSX-11M «Iнжалид дежице», выводимое на любой «русский» терминал вместо английского «Invalid device» (в советском клоне RSX-11M, носившем имя ОС-РВ, все сообщения остались англоязычными, но были изменены для использования лишь символов верхнего
регистра, поэтому выглядели одинаково и на американских, и на советских терминалах).
50
во. Этим она отличается от других команд обработки байтов, которые изменяют только младший байт регистра-приёмника.
Флажок N устанавливается, если пересылается отрицательное число (знаковый разряд равен единице), и сбрасывается в противном случае.
Флажок Z устанавливается, если пересылаемое значение равно нулю, и сбрасывается,
если пересылаемое значение отлично от нуля.
Флажок V всегда сбрасывается.
Флажок C не изменяется.
На некоторых моделях флажки изменяются, даже если сама запись результата не была
выполнена из-за возникновения прерывания по вектору 4; на других моделях в такой же ситуации флажки не изменяются.
5.2.2. CMP, CMPB — сравнение
CMP src,dst
0
0
1
0
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
CMPB src,dst
1
0
1
0
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
Команда сравнения вычитает значение приёмника из значения источника; результат
самой операции теряется. Признаки результата устанавливаются подобно обычной операции
вычитания.
Флажок N устанавливается, если при вычитании получен отрицательный результат (старший бит результата равен единице).
Флажок Z устанавливается, если источник и приёмник равны, т. е. если при вычитании
получен нулевой результат.
Флажок V устанавливается, если результат как число со знаком не помещается в разрядную сетку операнда-приёмника, т. е. когда имеет место переполнение.
Флажок C устанавливается при возникновении заёма в старший разряд (технически —
при отсутствии переноса из старшего разряда), т. е. если вычитаемое (приёмник) как число
без знака больше уменьшаемого (источника).
Замечания по программированию.
1. Для беззнаковых чисел состояние флага C после выполнения сравнения позволяет установить, был ли источник меньше приёмника. Для чисел со знаком анализа флага N с той
же целью будет недостаточно, поскольку могло возникнуть переполнение. По этой причине команды условного перехода для чисел со знаком учитывают одновременно состояние флагов N и V.
2. Команда сравнения вычитает значение приёмника из значения источника. Команда вычитания, наоборот, вычитает значение источника из значения приёмника и сохраняет результат в приёмнике.
51
5.2.3. BIT, BITB — проверка битов
BIT src,dst
0
0
1
1
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
BITB src,dst
1
0
1
1
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
Команда проверки разрядов выполняет операцию «логическое И» между источником и
приёмником. Результат операции теряется, но по его значению производится установка признаков результата.
Флажок N устанавливается, если получен отрицательный результат (старший бит результата равен единице).
Флажок Z устанавливается, если получен нулевой результат.
Флажок V сбрасывается.
Флажок C не изменяется.
5.2.4. BIC, BICB — сброс битов
BIC src,dst
0
1
0
0
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
BICB src,dst
1
1
0
0
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
Команда сброса битов выполняет операцию «логическое И» между приёмником и инвертированным значением источника, что приводит к сбросу разрядов приёмника, которым соответствуют единичные биты источника.
Флажок N устанавливается, если получен отрицательный результат (старший бит результата равен единице).
Флажок Z устанавливается, если получен нулевой результат.
Флажок V сбрасывается.
Флажок C не изменяется.
Замечание по программированию.
Выполнение операции НЕ-И вместо операции И, принятой в большинстве вычислительных машин, позволяет использовать одни и те же значения масок как для сброса, так и для
установки определенных разрядов.
52
5.2.5. BIS, BISB — установка битов
BIS src,dst
0
1
0
1
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
BISB src,dst
1
1
0
1
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
Команда установки битов выполняет операцию «логическое ИЛИ» между приёмником и
источником, в результате чего будут установлены те разряды приёмника, которым соответствуют единичные разряды источника.
Флажок N устанавливается, если получен отрицательный результат (старший бит результата равен единице).
Флажок Z устанавливается, если получен нулевой результат.
Флажок V сбрасывается.
Флажок C не изменяется.
5.2.6. ADD — сложение
ADD src,dst
0
1
1
0
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
Команда сложения позволяет складывать слова по правилам двоичной арифметики. Команды сложения байтов нет.
Флажок N устанавливается, если получен отрицательный результат (старший бит результата равен единице).
Флажок Z устанавливается, если получен нулевой результат.
Флажок V устанавливается при возникновении переполнения в операции над числами со
знаком.
Флажок C устанавливается при возникновении переноса из старшего разряда.
Замечание по программированию.
В отличие от многих других архитектур, при сложении исходное состояние флажка переноса C не учитывается. Для сложения величин, превосходящих по размеру слово, необходимо совместно использовать команды ADD и ADC.
5.2.7. SUB — вычитание
SUB src,dst
1
1
1
0
15
14
13
12
режим
источника
11
10
регистр
источника
9
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
53
Команда вычитания производит вычитание значения источника из значения приёмника
по правилам двоичной арифметики; оба операнда имеют размер слово. Команды вычитания
байтов нет.
Флажок N устанавливается, если получен отрицательный результат (старший бит результата равен единице).
Флажок Z устанавливается, если получен нулевой результат.
Флажок V устанавливается при возникновении переполнения в операции над числами со
знаком.
Флажок C устанавливается при возникновении заёма в старший разряд (технически —
при отсутствии переноса из старшего разряда), т. е. если вычитаемое (источник) как число
без знака больше уменьшаемого (приёмника).
Замечания по программированию.
1. В отличие от многих других архитектур, при вычитании исходное состояние флажка
переноса C не учитывается. Для вычитания величин, превосходящих по размеру слово,
необходимо совместно использовать команды SUB и SBC.
2. Команда вычитания производит вычитание источника из приёмника, а команда сравнения
— наоборот.
5.2.8. MUL — умножение
MUL src,dst
0
1
1
1
0
0
0
15
14
13
12
11
10
9
регистр
приёмника
8
7
режим
источника
6
5
4
регистр
источника
3
2
1
0
Команда MUL выполняет умножение двух целых чисел со знаком размером слово каждое,
давая результат размером двойное слово.
Одним из источников и приёмником всегда является регистр. Если он имеет нечётный номер, в него помещается младшее слово результата, а старшее слово теряется, но учитывается
при установке признаков результата. Если он имеет чётный номер, в нём сохраняется старшая часть результата, а младшая часть сохраняется в следующем за ним регистре с нечётным
номером.
Флажок N устанавливается, если получен отрицательный результат (старший бит 32-разрядного результата равен единице).
Флажок Z устанавливается, если получен нулевой результат.
Флажок V сбрасывается.
Флажок C устанавливается, если произведение не может быть корректно размещено в
младшем слове результата, т. е. если его величина превышает 16 разрядов с учётом знака.
Команда MUL относится к набору EIS и отсутствует на PDP-11 моделей 04, 05, 10, 15 и 20,
а также в микропроцессоре T-11. В LSI-11 набор EIS может присутствовать или отсутствовать в зависимости от комплектации процессора (он реализован с помощью отдельного ПЗУ
микрокоманд). На PDP-11 моделей 35 и 40 эта команда реализована с помощью дополнительной опции KE-11E.
Замечания по программированию.
1. Функции, аналогичные команде MUL, могут быть реализованы на PDP-11 моделей 05, 10,
15 и 20 с помощью специального расширителя KE11-A (EAE), доступного как внешнее
устройство.
54
2. На LSI-11 выполнение команд набора EIS может быть прервано досрочно, если поступил
запрос прерывания. Состояние процессора при этом в целом соответствует моменту начала выполнения прерванной команды, что позволяет после завершения обработки прерывания повторно её выполнить. Однако состояние флагов условий после прерывания команды будет неопределённым (исходное состояние, имевшее место на момент начала выполнения команды, не сохраняется).
5.2.9. DIV — деление
DIV src,dst
0
1
1
1
0
0
1
15
14
13
12
11
10
9
регистр
приёмника
8
7
режим
источника
6
5
4
регистр
источника
3
2
1
0
Команда деления оперирует числами со знаком и делит 32-разрядное делимое на 16-разрядный делитель, результатом чего являются 16-разрядные частное и остаток. Делителем является операнд-источник, задаваемый с использованием любого вида адресации. Регистрприёмник должен обязательно иметь чётный номер; он содержит старшую часть делимого, а
после завершения операции — частное. Следующий за ним нечётный регистр содержит
младшую часть делимого, а после операции — остаток, который будет иметь знак делимого.
Если частное не помещается в отведённые ему 16 разрядов (с учётом знака), деление не выполняется.
Флажок N устанавливается, если получен отрицательный результат (старший бит 32-разрядного результата равен единице).
Флажок Z устанавливается, если получен нулевой результат.
Флажок V устанавливается, если частное не помещается с учётом знака в 16-разрядный
регистр-приёмник.
Флажок C устанавливается, если делитель равен нулю.
Команда DIV относится к набору EIS и отсутствует на PDP-11 моделей 04, 05, 10, 15 и 20,
а также в микропроцессоре T-11. В LSI-11 набор EIS может присутствовать или отсутствовать в зависимости от комплектации процессора (он реализован с помощью отдельного ПЗУ
микрокоманд). На PDP-11 моделей 35 и 40 эта команда реализована с помощью дополнительной опции KE-11E.
Замечания по программированию.
1. Функции, аналогичные команде DIV, могут быть реализованы на PDP-11 моделей 05, 10,
15 и 20 с помощью специального расширителя KE11-A (EAE), доступного как внешнее
устройство.
2. На LSI-11 выполнение команд набора EIS может быть прервано досрочно, если поступил
запрос прерывания. Состояние процессора при этом в целом соответствует моменту начала выполнения прерванной команды, что позволяет после завершения обработки прерывания повторно её выполнить. Однако состояние флагов условий после прерывания команды будет неопределённым (исходное состояние, имевшее место на момент начала выполнения команды, не сохраняется).
3. Что произойдёт, если в команде будет указан регистр с нечётным номером, документация
не сообщает.
55
5.2.10. ASH — арифметический сдвиг многоразрядный
ASH src,dst
0
1
1
1
0
1
0
15
14
13
12
11
10
9
регистр
приёмника
8
7
режим
источника
6
5
4
регистр
источника
3
2
1
0
Команда многоразрядного арифметического сдвига сдвигает содержимое регистраприёмника вправо, если значение операнда-источника меньше нуля, и влево, если значение
источника больше нуля; количество разрядов, на которое производится сдвиг приёмника,
определяется абсолютной величиной источника. В определении числа и направления сдвига
участвуют разряды 5:0 источника, рассматриваемые как число со знаком.
Флажок N устанавливается, если получен отрицательный результат (старший бит результата равен единице).
Флажок Z устанавливается, если получен нулевой результат.
Флажок V устанавливается, если во время выполнения операции произошла смена знака,
даже если окончательный знак совпадает с исходным.
Флажок C содержит значение последнего выдвинутого из регистра бита.
Команда ASH относится к набору EIS и отсутствует на PDP-11 моделей 04, 05, 10, 15 и 20,
а также в микропроцессоре T-11. В LSI-11 набор EIS может присутствовать или отсутствовать в зависимости от комплектации процессора (он реализован с помощью отдельного ПЗУ
микрокоманд). На PDP-11 моделей 35 и 40 эта команда реализована с помощью дополнительной опции KE-11E.
Замечания по программированию.
1. В микропроцессоре J-11 эта команда реализована с ошибкой: при значении источника,
равном 378, вместо сдвига влево на 31 бит выполнит сдвиг вправо.
2. Функции, аналогичные команде ASH, могут быть реализованы на PDP-11 моделей 05, 10,
15 и 20 с помощью специального расширителя KE11-A (EAE), доступного как внешнее
устройство.
3. На LSI-11 выполнение команд набора EIS может быть прервано досрочно, если поступил
запрос прерывания. Состояние процессора при этом в целом соответствует моменту начала выполнения прерванной команды, что позволяет после завершения обработки прерывания повторно её выполнить. Однако состояние флагов условий после прерывания команды будет неопределённым (исходное состояние, имевшее место на момент начала выполнения команды, не сохраняется).
5.2.11. ASHC — арифметический сдвиг двойного слова
многоразрядный
ASHC src,dst
0
1
1
1
0
1
1
15
14
13
12
11
10
9
регистр
приёмника
8
7
режим
источника
6
5
4
регистр
источника
3
2
1
0
Команда многоразрядного арифметического сдвига двойного слова сдвигает операндприёмник, которым является один или пара регистров. Если номер регистра-приёмника чётный, то производится сдвиг двойного слова, старшая часть которого находится в указанном
регистре, а младшая — в следующем за ним регистре с нечётным номером. Если же номер
регистра нечётный, осуществляется циклический сдвиг содержимого этого регистра. В опре56
делении числа и направления сдвига участвуют разряды 5:0 источника, рассматриваемые как
число со знаком.
Флажок N устанавливается, если получен отрицательный результат (старший бит 32-разрядного результата равен единице).
Флажок Z устанавливается, если получен нулевой результат.
Флажок V устанавливается, если во время выполнения операции произошла смена знака,
даже если итоговый знак совпадает с исходным.
Флажок C содержит значение последнего выдвинутого из регистра бита.
Команда ASHC относится к набору EIS и отсутствует на PDP-11 моделей 04, 05, 10, 15 и
20, а также в микропроцессоре T-11. В LSI-11 набор EIS может присутствовать или отсутствовать в зависимости от комплектации процессора (он реализован с помощью отдельного
ПЗУ микрокоманд). На PDP-11 моделей 35 и 40 эта команда реализована с помощью дополнительной опции KE-11E.
Замечания по программированию.
1. В микропроцессоре J-11 эта команда реализована с ошибкой: если биты 5:0 источника содержат значение 378, а хотя бы один из битов 15:6 установлен, вместо сдвига влево на 31
бит выполнит сдвиг вправо.
2. Функции, аналогичные команде ASHC, могут быть реализованы на PDP-11 моделей 05,
10, 15 и 20 с помощью специального расширителя KE11-A (EAE), доступного как внешнее устройство.
3. На LSI-11 выполнение команд набора EIS может быть прервано досрочно, если поступил
запрос прерывания. Состояние процессора при этом в целом соответствует моменту начала выполнения прерванной команды, что позволяет после завершения обработки прерывания повторно её выполнить. Однако состояние флагов условий после прерывания команды будет неопределённым (исходное состояние, имевшее место на момент начала выполнения команды, не сохраняется).
5.2.12. XOR — исключающее или
XOR src,dst
0
1
1
1
1
0
0
15
14
13
12
11
10
9
регистр
источника
8
7
режим
приёмника
6
5
4
регистр
приёмника
3
2
1
0
Операндом-приёмником является регистр или память, операндом-источником — регистр;
этим команда XOR отличается от других команд аналогичного формата.
Флажок N устанавливается, если получен отрицательный результат (старший бит результата равен единице).
Флажок Z устанавливается, если получен нулевой результат.
Флажок V сбрасывается.
Флажок C не изменяется.
Команда XOR в разных документах фирмы DEC относится то к базовому набору команд,
то к набору EIS. Она отсутствует на PDP-11 моделей 04, 05, 10, 15 и 20, а также в микропроцессоре T-11. В LSI-11 эта команда, кажется, реализована всегда независимо от наличия или
отсутствия четырёх сложных команд, безусловно относящихся к EIS (MUL, DIV, ASH, ASHC).
57
5.3. Одноадресные арифметико-логические команды
5.3.1. CLR, CLRB — очистка
CLR dst
0
0
0
0
1
0
1
0
0
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
3
2
3
2
3
2
1
0
CLRB dst
1
0
0
0
1
0
1
0
0
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
1
0
Содержимое операнда обнуляется.
Флажки N, V, C сбрасываются.
Флажок Z устанавливается.
5.3.2. COM, COMB — инверсия
COM dst
0
0
0
0
1
0
1
0
0
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
1
0
COMB dst
1
0
0
0
1
0
1
0
0
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
1
0
Содержимое операнда инвертируется.
Флажок N устанавливается, если результат меньше нуля (старший разряд равен единице).
Флажок Z устанавливается, если результат равен нулю.
Флажок V сбрасывается.
Флажок C устанавливается.
5.3.3. INC, INCB — инкремент
INC dst
0
0
0
0
1
0
1
0
1
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
INCB dst
1
0
0
0
1
0
1
0
1
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Содержимое операнда увеличивается на единицу.
Флажок N устанавливается, если результат меньше нуля (старший разряд равен единице).
Флажок Z устанавливается, если результат равен нулю.
Флажок V устанавливается при возникновении переполнения, т. е. когда увеличивалось
максимальное положительное число.
Флажок C не изменяется.
58
5.3.4. DEC, DECB — декремент
DEC dst
0
0
0
0
1
0
1
0
1
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
DECB dst
1
0
0
0
1
0
1
0
1
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Содержимое операнда уменьшается на единицу.
Флажок N устанавливается, если результат меньше нуля (старший разряд равен единице).
Флажок Z устанавливается, если результат равен нулю.
Флажок V устанавливается при возникновении переполнения, т. е. когда уменьшалось
максимальное отрицательное число.
Флажок C не изменяется.
5.3.5. NEG, NEGB — смена знака
NEG dst
0
0
0
0
1
0
1
1
0
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
3
2
1
0
NEGB dst
1
0
0
0
1
0
1
1
0
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
1
0
Операнд меняет знак на противоположный.
Флажок N устанавливается, если результат меньше нуля (старший разряд равен единице).
Флажок Z устанавливается, если результат равен нулю.
Флажок V устанавливается, если возникает переполнение, т. е. при попытке смены знака
максимального отрицательного числа.
Флажок C устанавливается, когда результат отличен от нуля.
5.3.6. ADC, ADCB — сложение с переносом
ADC dst
0
0
0
0
1
0
1
1
0
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
3
2
1
0
ADCB dst
1
0
0
0
1
0
1
1
0
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
1
0
К содержимому операнда прибавляется значение флажка переноса.
Флажок N устанавливается, если результат меньше нуля (старший разряд равен единице).
Флажок Z устанавливается, если результат равен нулю.
Флажок V устанавливается, если возникает переполнение.
Флажок C устанавливается, если возникает перенос из старшего разряда результата.
59
5.3.7. SBC, SBCB — вычитание с заёмом
SBC dst
0
0
0
0
1
0
1
1
1
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
SBCB dst
1
0
0
0
1
0
1
1
1
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Из операнда вычитается значение флажка переноса.
Флажок N устанавливается, если результат меньше нуля (старший разряд равен единице).
Флажок Z устанавливается, если результат равен нулю.
Флажок V устанавливается, если возникает переполнение.
Флажок C устанавливается, если возникает заём в старший разряд результата, т. е. если
исходное значение операнда было равно нулю и из него вычиталась единица.
5.3.8. TST, TSTB — проверка
TST dst
0
0
0
0
1
0
1
1
1
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
3
2
1
0
TSTB dst
1
0
0
0
1
0
1
1
1
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
1
0
Производится анализ значения операнда, после чего соответствующим образом устанавливаются признаки результата. Значение самого операнда не изменяется.
Флажок N устанавливается, если операнд меньше нуля (старший разряд равен единице).
Флажок Z устанавливается, если операнд равен нулю.
Флажки V, C сбрасываются.
5.3.9. ROR, RORB — циклический сдвиг вправо
ROR dst
0
0
0
0
1
1
0
0
0
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
3
2
1
0
RORB dst
1
0
0
0
1
1
0
0
0
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
1
0
Операнд сдвигается вправо на один разряд. Старший бит результата становится равным
исходному значению бита переноса, младший разряд операнда помещается во флажок переноса.
Флажок N устанавливается, если результат меньше нуля (старший разряд равен единице).
Флажок Z устанавливается, если результат равен нулю.
Флажок V сбрасывается.
60
Флажок C устанавливается, если младший разряд операнда до операции был равен единице.
5.3.10. ROL, ROLB — циклический сдвиг влево
ROL dst
0
0
0
0
1
1
0
0
0
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
3
2
1
0
ROLB dst
1
0
0
0
1
1
0
0
0
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
1
0
Операнд сдвигается влево на один разряд. Младший бит результата становится равным
исходному значению бита переноса, старший разряд операнда помещается во флажок переноса.
Флажок N устанавливается, если результат меньше нуля (старший разряд равен единице).
Флажок Z устанавливается, если результат равен нулю.
Флажок V сбрасывается.
Флажок C устанавливается, если старший разряд операнда до операции был равен единице.
5.3.11. ASR, ASRB — арифметический сдвиг вправо
ASR dst
0
0
0
0
1
1
0
0
1
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
ASRB dst
1
0
0
0
1
1
0
0
1
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Операнд сдвигается вправо на один разряд. Старший разряд остается без изменения, исходное значение младшего разряда заносится в бит переноса C.
Флажок N устанавливается, если результат меньше нуля (старший разряд равен единице).
Флажок Z устанавливается, если результат равен нулю.
Флажок V сбрасывается.
Флажок C устанавливается, если младший разряд операнда до операции был равен единице.
Замечание по программированию.
Появившийся в конце 1970-х годов стандарт DEC, описывающий подходы к реализации
новых команд, а также включающий описание команд коммерческого набора, предписывает
реализовывать команду ASRB таким образом, чтобы она могла использоваться для синхронизации операций в многопроцессорной системе: на всё время выполнения этой команды доступ к адресуемому ею байту памяти для других процессоров должен быть заблокирован, а
процессор, выполняющий команду, должен обращаться к фактическому содержимому ячейки
памяти, а не к её копии в его собственном кэше.
61
Многие ли машины соответствуют этому требованию, сказать затруднительно, но достоверно известно, что ни PDP-11/70, ни режим эмуляции PDP-11 на VAX-11 не обеспечивают
подобное поведение данной команды.
5.3.12. ASL, ASLB — арифметический сдвиг влево
ASL dst
0
0
0
0
1
1
0
0
1
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
3
2
1
0
ASLB dst
1
0
0
0
1
1
0
0
1
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
1
0
Операнд сдвигается влево на один разряд. Исходное значение старшего разряда заносится в бит переноса C, на место освобождающегося младшего разряда заносится нуль.
Флажок N устанавливается, если результат меньше нуля (старший разряд равен единице).
Флажок Z устанавливается, если результат равен нулю.
Флажок V сбрасывается.
Флажок C устанавливается, если старший разряд операнда до операции был равен единице.
5.3.13. SWAB — обмен байтов
SWAB dst
0
0
0
0
0
0
0
0
1
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Младший и старший байты операнда меняются местами.
Флажок N устанавливается, если 7-й бит результата (старший разряд младшего байта) равен единице.
Флажок Z устанавливается, если младший байт результата равен нулю.
Флажок V сбрасывается, за исключением PDP-11 моделей 15 и 20, где его состояние не
изменяется.
Флажок C сбрасываются.
5.3.14. SXT — расширение знака
SXT dst
0
0
0
0
1
1
0
1
1
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Если флажок N на момент начала выполнения команды установлен, в приёмник помещается значение 177777; если флажок сброшен, в приёмник заносится нуль.
Флажки N, C,CC не изменяются.
Флажок Z устанавливается, если результат равен нулю.
Команда SXT отсутствует на PDP-11 моделей 04, 05, 10, 15 и 20.
62
5.4. Команды перехода
5.4.1. JMP — безусловный переход абсолютный
JMP dst
0
0
0
0
0
0
0
0
0
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Команда JMP обеспечивает безусловный переход на любой адрес. Её формат совпадает с
форматом одноадресных арифметико-логических команд.
Регистровая адресация недопустима, попытка её использования вызывает прерывание по
отказу шины (PDP-11 моделей 44, 45 и 70 и микропроцессор J-11) или по недопустимой команде (все остальные машины). При использовании любых других видов адресации процессор определяет адрес операнда по тем же правилам, что и для арифметико-логических команд, обрабатывающих операнд размером слово, и выполняет переход на этот адрес.
Замечание по программированию.
В случае использования автоинкрементной адресации (JMP (Rn)+) возможны два варианта адреса перехода:
• переход по содержимому Rn после выполнения автоинкремента (PDP-11 моделей 05, 10,
15 и 20);
• переход по исходному содержимому регистра Rn; автоинкремент будет выполнен уже после пересылки значения регистра в PC (все остальные модели).
5.4.2. JSR — переход к подпрограмме
JSR reg,dst
0
0
0
0
1
0
0
15
14
13
12
11
10
9
регистр
8
7
режим
6
5
4
регистр
3
2
1
0
Команда JSR обеспечивает безусловный переход к подпрограмме на любой адрес. Формат кода команды аналогичен двухадресным арифметико-логическим командам набора EIS.
Адрес перехода задаётся вторым операндом и трактуется аналогично команде JMP: им
является адрес, а не содержимое этого операнда, что запрещает использование регистровой
адресации (попытка её использования на PDP-11 моделей 44, 45 и 70 и микропроцессоре J-11
приводит к прерыванию по отказу шины, а на остальных машинах — по недопустимой команде). Перед выполнением перехода процессор сохраняет значение первого операнда, всегда являющегося регистром, в стеке текущего режима, а затем заносит в него адрес команды,
следующей за данной командой JSR.
Замечания по программированию.
1. Для часто используемой команды вида JSR PC,адрес транслятор языка ассемблера
предусматривает псевдоним CALL адрес.
2. Выполнение команды JSR PC логически не отличается от выполнения команды JSR, в
которой задан любой другой регистр: сначала содержимое указанного регистра (PC)
сохраняется в стеке, а потом в него заносится текущее значение PC, что, естественно, не
меняет его содержимое, после чего в PC заносится ранее вычисленный адрес перехода.
3. Как и в команде JMP, в случае использования автоинкрементной адресации возможны
два варианта адреса перехода:
63
• переход по содержимому регистра после выполнения автоинкремента (PDP-11 моделей
05, 10, 15 и 20);
• переход по исходному содержимому регистра; автоинкремент будет выполнен уже после пересылки значения регистра в PC (все остальные модели).
5.4.3. RTS — возврат из подпрограммы
RTS reg
0
0
0
0
0
0
0
0
1
0
0
0
0
15
14
13
12
11
10
9
8
7
6
5
4
3
регистр
2
1
0
Команда RTS обеспечивает возврат из подпрограммы: она помещает содержимое заданного регистра в счётчик команд, после чего загружает из стека ранее сохранённое в нём слово
и помещает его в этот регистр.
Замечание по программированию
Часто используется команда RTS PC, являющаяся «антиподом» команды JSR PC. Для
неё транслятор ассемблера имеет псевдоним RETURN.
5.4.4. MARK — возврат из подпрограммы с очисткой стека
MARK n
0
0
0
0
1
1
0
1
0
0
15
14
13
12
11
10
9
8
7
6
n
5
4
3
2
1
0
Команда MARK обеспечивает возврат из подпрограммы и очистку стека от локальных
переменных этой подпрограммы. Единственный её операнд задаёт количество слов стека, которые нужно из него удалить перед выполнением собственно возврата. Предполагается, что
подпрограмма вызывалась командой JSR R5,адрес.
При обработке команды MARK процессор выполняет следующие действия:
• прибавляет к текущему значению указателя стека удвоенное значение операнда ( SP = SP
+ 2*n);
• пересылает содержимое регистра R5 в счётчик команд;
• загружает в R5 слово из новой вершины стека.
Команда MARK отсутствует на PDP-11 моделей 04, 05, 10, 15 и 20.
Замечание по программированию
Команда MARK является одной из двух команд, использующей строго определённый
регистр общего назначения (R5) в качестве неявного операнда.
5.4.5. SOB — переход по счётчику
SOB reg,адрес
0
1
1
1
1
1
1
15
14
13
12
11
10
9
регистр
8
7
смещение
6
5
4
3
2
1
0
Команда SOB уменьшает значение счётчика, находящегося в указанном регистре, и выполняет переход назад, если счётчик отличен от нуля.
Адрес перехода задаётся смещением в словах относительно адреса следующей команды;
в отличие от команд условных переходов и команды BR, это смещение рассматривается как
число без знака и вычитается из значения PC, что и обеспечивает переход назад.
Команда SOB отсутствует на PDP-11 моделей 04, 05, 10, 15 и 20.
64
5.4.6. BR — безусловный переход относительный
BR адрес
0
0
0
0
0
0
0
1
15
14
13
12
11
10
9
8
смещение
7
6
5
4
3
2
1
0
Команда BR выполняет безусловный переход.
Адрес перехода задаётся смещением в словах, содержащимся в младшем байте кода команды. Смещение рассматривается как число со знаком; его значение умножается на два и
складывается с адресом команды, следующей за BR, образуя адрес перехода.
5.4.7. Команды условных переходов
В эту группу входят 14 команд, имеющих тот же формат, что и команда BR. Переход осуществляется при выполнении условий, соответствующих этим командам. В следующей таблице приведены мнемоники всех команд, их коды (значение старшего байта в двоичном виде) и условия выполнения перехода.
Мнемоника Код операции
Условие
BGE
0 000 010 0 знаковое «больше либо равно»: N⊕V = 0
BLT
0 000 010 1 знаковое «меньше»: N⊕V = 1
BGT
0 000 011 0 знаковое «больше»: Z˅(N⊕V) = 0
BLE
0 000 011 1 знаковое «меньше либо равно»: Z˅(N⊕V) = 1
BHI
1 000 001 0 беззнаковое «больше»: Z˅C = 0
BLOS
1 000 001 1 беззнаковое «меньше либо равно»: Z˅C = 1
BHIS / BCC 1 000 011 0 беззнаковое «больше либо равно» или отсутствие переноса:
C=0
BLO / BCS
1 000 011 1 беззнаковое «меньше» или наличие переноса: C = 1
BVC
1 000 010 0 отсутствие переполнения: V = 0
BVS
1 000 010 1 переполнение: V = 1
BNE
0 000 001 0 не равно или ненулевой результат: Z = 0
BEQ
0 000 001 1 равно или нулевой результат: Z = 1
BPL
1 000 000 0 знак «плюс»: N = 0
BMI
1 000 000 1 знак «минус»: N = 1
5.5. Команды управления флажками
0
0
0
0
0
0
0
0
1
0
1
S/C
N
Z
V
C
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
По сути, команда управления флажками всего одна: она позволяет установить или сбросить любую комбинацию из четырёх флажков N, Z, V и C. В коде команды бит 4 определяет,
будут ли флажки сбрасываться или устанавливаться — он для этих случаев равен соответственно нулю и единице. Биты 3:0 соответствуют флажкам N, Z, V, C: когда какой-либо из
этих битов установлен, соответствующий флажок командой изменяется, когда сброшен —
сохраняет своё значение.
65
Для ряда наиболее часто используемых случаев установки и сброса флажков транслятор
ассемблера предусматривает специальные мнемоники, приведённые в следующей таблице; в
остальных случаях команду необходимо кодировать вручную (как слово данных).
Мнемоника
Код команды
Условие
CLC
000241
сброс флага C
CLV
000242
сброс флага V
CLZ
000244
сброс флага Z
CLN
000250
сброс флага N
CCC
000257
сброс всех флагов
SEC
000261
установка флага C
SEV
000262
установка флага V
SEZ
000264
установка флага Z
SEN
000270
установка флага N
SCC
000277
установка всех флагов
NOP
000240, 000260
нет операции
5.6. Команды набора FIS
Четыре команды набора FIS выполняют основные операции над числами с плавающей
запятой одиночной точности. На LSI-11 эти команды реализуются опцией KEV-11 (технически это дополнительное ПЗУ микропрограмм), на PDP-11/35 и 40 — опцией KE11-F; все
остальные машины фирмы DEC эти команды не поддерживают. Из советских ЭВМ набор FIS
был точно реализован в СМ-4 и точно отсутствовал у всех остальных моделей СМ ЭВМ, но
мог, однако, присутствовать на некоторых других машинах, не относящихся к СМ, и в микропроцессорах.
Формат вещественных чисел, обрабатываемых командами набора FIS, совпадает с форматом чисел одиночной точности, обрабатываемых процессором с плавающей запятой. Однако,
в отличие от ППЗ, результат операции всегда округляется в сторону от нуля, т. е. при округлении абсолютная величина результата будет не меньше, чем её истинное значение (в ППЗ возможно округление или усечение результата).
Все четыре команды имеют единственный явно заданный операнд — номер регистра общего назначения, кодируемый битами 2:0 кода команды. Этот регистр, обозначаемый далее
R, задаёт положение вершины стека, используемого для хранения чисел с плавающей запятой. Заметим, что им может быть регистр SP, и тогда вещественные числа будут находиться в
«настоящем» стеке, однако программа может использовать для их хранения отдельную область памяти, не пересекающуюся со стеком, используемым для вызова подпрограмм и других традиционных операций.
На момент начала выполнения команды по адресу (R) находится старшая половина первого операнда (источника), по адресу (R+2) — его младшая половина. По адресам (R+4) и
(R+6) находятся соответственно старшая и младшая половины второго операнда, являющегося также приёмником результата.
В процессе своего выполнения команда считывает первый операнд, увеличивая при этом
значение регистра R на 4, т. е. логически выталкивая операнд из стека. Затем производится
считывание второго операнда, выполняется операция и её результат записывается на место
66
второго операнда, т. е. в новую вершину стека. По результату операции производится установка флажков.
Если при выполнении команды обнаруживается каПричина
V N C Z
кая-либо ошибка (переполнение, исчезновение порядка, Переполнение
1 0 0 0
деление на нуль), происходит прерывание по вектору Исчезновение порядка 1 1 0 0
244, причём флажки изменяют своё состояние, чтобы Деление на нуль
1 1 1 0
отразить причину прерывания, как показано ниже в таблице.
Если поступает запрос прерывания от внешнего устройства, а до завершения команды
остаётся ещё достаточно длительное время (порядка 8 мкс на PDP-11/40), выполнение команды прекращается и вызывается обработчик запрошенного внешнего прерывания. В стеке
при этом сохраняется значение PC, указывающее на прекращённую команду набора FIS,
поэтому при возврате из прерывания она начнёт выполняться заново. Необходимо, однако,
учитывать, что такая отмена выполнения команды FIS на LSI-11 приведёт к неопределённому
состоянию флагов условий (на PDP-11/35 и 40 они сохранят состояние на момент начала выполнения отменённой команды).
Замечание по программированию.
При получении слишком маленького результата (по абсолютной величине меньше 2 -128),
как видно из описания команд, на место результата записывается истинный нуль. В то же
время описание говорит и о возникновении прерывания по исчезновению порядка. Полной
уверенности в том, как процессор обрабатывает подобные случаи, нет, хотя похоже, что он
записывает нулевой результат, после чего происходит прерывание с установкой флагов, как
показано в таблице выше, а не как это имеет место при получении истинно нулевого результата, например, вследствие умножения на нуль или вычитания идентичных чисел.
5.6.2. FADD — сложение вещественное
FADD reg
0
1
1
1
1
0
1
0
0
0
0
0
0
15
14
13
12
11
10
9
8
7
6
5
4
3
регистр
2
1
0
Операнды извлекаются из стека, адрес вершины которого задан указанным регистром,
после чего складываются и сумма помещается в вершину стека на место второго операнда.
Если после нормализации результат по абсолютной величине меньше 2 -128, в вершину стека
записывается истинный нуль (вещественное число, содержащее нули во всех разрядах).
Флажок N устанавливается, если получен отрицательный результат.
Флажок Z устанавливается, если получен нулевой результат.
Флажки V и C сбрасываются.
5.6.3. FSUB — вычитание вещественное
FSUB reg
0
1
1
1
1
0
1
0
0
0
0
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
регистр
2
1
0
Операнды извлекаются из стека, адрес вершины которого задан указанным регистром,
после чего первый операнд вычитается из второго и разность помещается в вершину стека на
место второго операнда. Если после нормализации результат по абсолютной величине меньше 2-128, в вершину стека записывается истинный нуль (вещественное число, содержащее нули во всех разрядах).
Флажок N устанавливается, если получен отрицательный результат.
67
Флажок Z устанавливается, если получен нулевой результат.
Флажки V и C сбрасываются.
5.6.4. FMUL — умножение вещественное
FMUL reg
0
1
1
1
1
0
1
0
0
0
0
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
регистр
2
1
0
Операнды извлекаются из стека, адрес вершины которого задан указанным регистром,
после чего первый операнд умножается на второй и произведение помещается в вершину
стека на место второго операнда. Если после нормализации результат по абсолютной величине меньше 2-128, в вершину стека записывается истинный нуль (вещественное число, содержащее нули во всех разрядах).
Флажок N устанавливается, если получен отрицательный результат.
Флажок Z устанавливается, если получен нулевой результат.
Флажки V и C сбрасываются.
Замечание по программированию.
Команда FMUL, выполняемая на LSI-11, в качестве рабочей области использует одно слово «настоящего» стека, неявно выполняя запись с декрементом регистра SP, а перед завершением восстанавливая старое значение SP. По этой причине на момент выполнения команды
SP должен содержать корректный адрес стека. PDP-11/35 и 40 «настоящий» стек при выполнении команды FMUL не используют.
5.6.5. FDIV — деление вещественное
FDIV reg
0
1
1
1
1
0
1
0
0
0
0
1
1
15
14
13
12
11
10
9
8
7
6
5
4
3
регистр
2
1
0
Операнды извлекаются из стека, адрес вершины которого задан указанным регистром,
после чего второй операнд делится на первый и частное помещается в вершину стека на место второго операнда. Если после нормализации результат по абсолютной величине меньше
2-128, в вершину стека записывается истинный нуль (вещественное число, содержащее нули во
всех разрядах).
При попытке деления на нуль содержимое стека не изменяется.
Флажок N устанавливается, если получен отрицательный результат.
Флажок Z устанавливается, если получен нулевой результат.
Флажки V и C сбрасываются.
Замечания по программированию.
1. Из описания команды остаётся неясным, изменяется ли содержимое регистра, используемого в качестве указателя стека, если производится попытка деления на нуль, или же он
сохраняет значение на момент начала выполнения команды.
2. Команда FDIV, выполняемая на LSI-11, в качестве рабочей области использует одно слово «настоящего» стека, неявно выполняя запись с декрементом регистра SP, а перед завершением восстанавливая старое значение SP. По этой причине на момент выполнения
команды SP должен содержать корректный адрес стека. PDP-11/35 и 40 «настоящий» стек
при выполнении команды FDIV не используют.
68
5.7. Прочие команды
5.7.1. BPT, IOT, EMT и TRAP — программное прерывание
BPT
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
IOT
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
0
0
0
1
0
0
0
15
14
13
12
11
10
9
8
3
2
1
0
3
2
1
0
EMT n
n
7
6
5
4
7
6
5
4
TRAP n
1
0
0
0
1
0
0
1
15
14
13
12
11
10
9
8
n
Эти четыре команды вызывают программные прерывания по векторам 14, 20, 30 и 34 соответственно. Функционально выполнение этих команд ничем не отличается, однако формат
у них разный: команды BPT и IOT состоят из одного кода операции, а команды EMT и TRAP
включают в свой состав однобайтовый код, игнорируемый процессором.
Замечания по программированию.
1. Хотя операнд команд EMT и TRAP не влияет на их выполнение, он может быть проанализирован программой обработки прерывания для определения действий, которые должны
быть предприняты. Например, в операционной системе RSX-11M (ОС-РВ) команда EMT
377 применяется задачами, чтобы запросить выполнение той или иной функции операционной системы, а команды EMT с другими кодами вызывают формирование так называемого синхронного системного прерывания, которое либо обрабатывается самой задачей,
либо приводит к её аварийному завершению системой.
2. Название команды IOT — input-output trap — восходит к её использованию в перфоленточной операционной системе, используемой на PDP-11/20 и других младших моделях: в
ней эта команда применяется для вызова подпрограмм системы, реализующих стандартные операции ввода-вывода. Однако сама по себе она никакого отношения к операциям
ввода-вывода не имеет: её использование целиком определяется программным обеспечением. Например, в RSX-11M она используется ядром, чтобы вызвать крах системы при
обнаружении какой-либо фатальной ошибки.
3. Команда BPT в PDP-11/20 присутствует, но на момент начала поставок этой машины мнемоники не имела.
4. Команда BPT использует тот же вектор прерывания, что и прерывание по установленному биту T. Определить точную причину прерывания можно, проанализировав код команды и состояние бита T в старом PSW.
69
5.7.2. RTI, RTT — возврат из прерывания
RTI
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
RTT
Эти команды предназначены для завершения обработки прерывания.
Сначала из стека текущего режима восстанавливается значение счётчика команд, а затем
— слова состояния процессора, после чего работа продолжается в соответствии с восстановленными значениями.
Если любая из этих команд выполняется в режиме пользователя, в восстанавливаемом
PSW поля предыдущего и текущего режимов должны задавать режим пользователя. Если они
выполняются в режиме супервизора, восстанавливаемые поля режимов могут задавать режим
пользователя или супервизора.
Отличие этих двух команд друг от друга заключается в реакции на бит T. Если он установлен перед началом выполнения команды или устанавливается самой командой возврата из
прерывания, сразу после завершения команды RTI произойдёт прерывание по вектору 14, в
то время как команда RTT заблокирует это прерывание и оно произойдёт после выполнения
следующей за ней команды.
Команда RTT отсутствует на PDP-11 моделей 04, 05, 10, 15 и 20, однако, по меньшей мере, на PDP-11/20 команда RTI ведёт себя подобно RTT..
5.7.3. MFPI, MFPD — пересылка из области предыдущего режима
MFPI src
0
0
0
0
1
1
0
1
0
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
3
2
1
0
MFPD src
1
0
0
0
1
1
0
1
0
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
1
0
Команды MFPI и MFPD предназначены для пересылки слова данных предыдущего режима в стек текущего режима.
Если для доступа к источнику используется регистровая адресация, выполнение этой пары команд ничем не отличается от обычной команды MOV src,-(SP), за исключением случая обращения к указателю стека: в этом случае извлекается значение указателя стека предыдущего, а не текущего режима.
Если для доступа к источнику используются другие виды адресации, то адрес источника
вычисляется по обычным правилам, в том числе если он содержится в регистре SP. Однако
обращение к памяти за значением самого операнда выполняется с использованием предыдущего режима адресации, при этом команда MFPI обращается к пространству команд, а команда MFPD — к пространству данных. Если пространства не разделяются или если использование пространства данных для предыдущего режима запрещено, обе команды выполняются одинаково.
70
Флажок N устанавливается, если пересылается отрицательное число (знаковый разряд равен единице).
Флажок Z устанавливается, если пересылаемое значение равно нулю.
Флажок V сбрасывается.
Флажок C не изменяется.
Эти команды реализованы лишь на машинах, имеющих MMU: PDP-11 моделей 04, 23, 24,
34, 35, 40, 44, 60, 70 и в микропроцессоре J-11, а также в советских СМ-4, СМ-1420,
СМ-1425, СМ-1600, микропроцессоре К1801ВМ3 и, возможно, в ряде других разработок.
Замечание по программированию
Имеющаяся документация ничего не говорит о том, как эти команды выполняются в режимах пользователя и супервизора. Однако очевидно, что предоставление доступа коду режима пользователя к пространству памяти режима супервизора или режима ядра недопустимо; аналогичным образом, код режима супервизора не должен иметь возможность обращаться к памяти режима ядра. По всей вероятности, попытка использования этих команд вызовет
прерывание по недопустимой команде.
5.7.4. MTPI, MTPD — пересылка в область предыдущего режима
MTPI dst
0
0
0
0
1
1
0
1
1
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
3
2
1
0
MTPD dst
1
0
0
0
1
1
0
1
1
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
1
0
Команды MTPI и MTPD предназначены для пересылки слова данных из стека текущего
режима в указатель стека или память предыдущего режима.
Если для доступа к приёмнику используется регистровая адресация, выполнение этой пары команд ничем не отличается от обычной команды MOV (SP)+,dst, за исключением случая обращения к указателю стека: в этом случае запись производится в указатель стека предыдущего, а не текущего режима.
Если для доступа к приёмнику используются другие виды адресации, то адрес приёмника
вычисляется по обычным правилам, в том числе если он содержится в регистре SP. Однако
обращение к памяти для записи нового значения самого операнда выполняется с использованием предыдущего режима адресации, при этом команда MTPI обращается к пространству
команд, а команда MTPD — к пространству данных. Если пространства не разделяются или
если использование пространства данных для предыдущего режима запрещено, обе команды
выполняются одинаково.
Флажок N устанавливается, если пересылается отрицательное число (знаковый разряд равен единице).
Флажок Z устанавливается, если пересылаемое значение равно нулю.
Флажок V сбрасывается.
Флажок C не изменяется.
Эти команды реализованы лишь на машинах, имеющих MMU: PDP-11 моделей 04, 23, 24,
34, 35, 40, 44, 60, 70 и в микропроцессоре J-11, а также в советских СМ-4, СМ-1420,
СМ-1425, СМ-1600, микропроцессоре К1801ВМ3 и, возможно, в ряде других разработок.
Замечание по программированию
Имеющаяся документация ничего не говорит о том, как эти команды выполняются в режимах пользователя и супервизора. Однако очевидно, что предоставление доступа коду ре71
жима пользователя к пространству памяти режима супервизора или режима ядра недопустимо; аналогичным образом, код режима супервизора не должен иметь возможность обращаться к памяти режима ядра. По всей вероятности, попытка использования этих команд вызовет
прерывание по недопустимой команде.
5.7.5. MFPS — пересылка из регистра состояния
MFPS dst
1
0
0
0
1
1
0
1
1
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Команда MFPS записывает содержимое младшего байта регистра PSW в заданный операнд-приёмник. Если приёмником является регистр, производится расширение знака байта
на старший байт, как это происходит при обычной команде MOV.
Флажок N устанавливается, если пересылается отрицательное число (знаковый разряд равен единице), и сбрасывается в противном случае.
Флажок Z устанавливается, если пересылаемое значение равно нулю, и сбрасывается,
если пересылаемое значение отлично от нуля.
Флажок V всегда сбрасывается.
Флажок C не изменяется.
Эта команда реализована в PDP-11/23, 24, 34, LSI-11 и микропроцессорах J-11 и T-11,
причём в случае LSI-11 и T-11 она является единственным способом обращения к PSW, поскольку доступ к нему как к ячейке памяти на указанных моделях не реализован.
На PDP-11/34, если эта команда выполняется в режиме пользователя и адрес PSW 177776
средствами MMU не отображён, происходит прерывание по ошибке MMU (вектор 250). Если
же указанный адрес отображён, обычным образом считывается младший байт PSW.
5.7.6. MTPS — пересылка в регистр состояния
MTPS src
1
0
0
0
1
1
0
1
0
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Команда MTPS записывает содержимое источника в младший байт регистра PSW.
Флажки загружаются из источника.
Бит T этой командой изменён быть не может. Приоритет процессора (биты PSW[7:5]) может быть загружен только при выполнении команды в режиме ядра.
Эта команда реализована в PDP-11/23, 24, 34, LSI-11 и микропроцессорах J-11 и T-11,
причём в случае LSI-11 и T-11 она является единственным способом обращения к PSW, поскольку доступ к нему как к ячейке памяти на указанных моделях не реализован.
На PDP-11/34, если эта команда выполняется в режиме пользователя и адрес PSW 177776
средствами MMU не отображён, происходит прерывание по ошибке MMU (вектор 250). Если
же указанный адрес отображён, изменяются биты PSW 7:5 и 3:0.
На PDP-11/23, 24 и в микропроцессоре J-11 эта команда не требует отображения адреса
177776, но в любом режиме изменяет только биты 3:0.
5.7.7. MFPT — получение типа процессора
MFPT
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
72
Команда MFPT (move from processor type) заносит в регистр R0 код типа процессора:
• биты 7:0 — код модели;
• биты 15:0 — подкод процессора.
Флаги N, Z, V, C не изменяются.
Известно, что для PDP-11/44 в старший байт R0 заносится нуль, а в младший байт — 1;
код 3 в младшем байте соответствует какой-то другой машине (возможно, PDP-11/24).
Эта команда реализована в PDP-11 моделей 23, 24, 44 и микропроцессоре J-11.
Замечание по программированию.
Наряду с MARK эта команда относится к тем редким исключениям, которые работают с
предопределённым регистром процессора.
5.7.8. CSM — вызов супервизора
CSM dst
0
0
0
0
1
1
1
0
0
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Эта команда предназначена для вызова супервизора из режима пользователя или самого
супервизора, но недопустима в режиме ядра. Её выполнение разрешается установкой соответствующего разряда в регистре MMR3. Попытка выполнения этой команды в режиме ядра
или когда она запрещена вызывает прерывание по вектору 10.
Команда CSM выполняет следующие действия:
• копирует значение текущего указателя стека в регистр указателя стека режима супервизора;
• запоминает во временном регистре текущее значение разрядов PSW[15:4] (содержимое
разрядов 3:0, т. е. флажков, не сохраняется — соответствующие позиции во временном
регистре обнуляются);
• копирует в PSW[13:12] код текущего режима процессора из PSW[15:14];
• заносит в PSW[15:14] код режима супервизора 01;
• сбрасывает бит PSW[4], отменяя, тем самым, трассировку выполнения программы;
• записывает в установленный стек супервизора содержимое временного регистра, т. е. состояние PSW на момент выполнения этой команды, но с обнулёнными флажками;
• записывает в стек супервизора содержимое регистра PC, т. е. адрес команды, непосредственно следующей за CSM;
• записывает в стек значение операнда, заданного командой CSM;
• заносит в PC значение 10.
Таким образом, команда CSM передаёт управление программе режима супервизора, начинающейся с виртуального адреса 10. В стеке этой программы будут находиться значение, указанное в команде CSM, и значения PC и PSW для возврата из супервизора к вызвавшей его
программе с помощью команды RTI. Кроме того, поскольку стек супервизора после выполнения команды CSM является, по сути, продолжением стека вызывающей программы, выше в
нём могут находиться дополнительные параметры, помещённые туда вызывающей программой.
Эта команда реализована в PDP-11/44 и микропроцессоре J-11.
5.7.9. SPL — установка приоритета процессора
SPL n
0
0
0
0
0
0
0
0
1
0
0
1
1
15
14
13
12
11
10
9
8
7
6
5
4
3
n
2
1
0
73
Команда SPL, если выполняется в режиме ядра, заносит три младших бита своего кода в
разряды PSW[7:5], тем самым устанавливая новый приоритет процессора.
Эта команда реализована только в некоторых моделях: PDP-11/44, 45, 70 и в микропроцессоре J-11. При выполнении этой команды в режиме пользователя или супервизора она никаких действий не выполняет.
5.7.10. HALT — останов процессора
HALT
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Команда HALT, выполненная в режиме ядра, останавливает процессор, при этом PC
указывает на следующую команду. Продолжение работы возможно только при нажатии кнопки «Пуск» на пульте управления процессором или при сбросе.
При попытке выполнения этой команды в режиме пользователя или супервизора происходит прерывание:
• по вектору 10 на PDP-11/23, 24, 34, 35, 40 и 60;
• по вектору 4 на PDP-11/44, 45, 70 и в микропроцессоре J-11.
На микропроцессоре T-11 эта команда записывает содержимое PSW и PC в стек, как это
происходит при прерываниях, заносит в PSW значение 000340 (запрещает прерывания) и загружает в PC значение, равное адресу точки входа по сбросу при включении питания плюс
40. Этим обеспечивается переход к программе эмуляции пульта управления. В советских микропроцессорах (как, возможно, и в микропроцессорах DEC) реализован специальный
пультовый режим, в который процессор переходит при выполнении HALT.
5.7.11. RESET — сброс шины
RESET
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
При выполнении в режиме ядра команда RESET выдаёт на шину сигнал сброса, что устанавливает в исходное состояние все внешние устройства, затем снимает его, некоторое время
ждёт и продолжает работу процессора со следующей команды. В самом процессоре сбрасываются регистр границы стека и, по меньшей мере, регистры MMU MMR0 и MMR3, однако
содержимое регистров общего назначения не изменяется, и программа после завершения
сброса продолжает своё обычное выполнение.
В режиме пользователя или супервизора команда RESET никаких действий не выполняет, но и к прерыванию по недопустимой команде не приводит.
Замечания по программированию.
1. Обычно команда RESET используется в процессе инициализации ядра ОС, чтобы привести внешние устройства в исходное состояние. В зависимости от реализации она может
либо дожидаться освобождения шины и лишь после этого выдавать сброс, либо выдавать
его сразу, что немедленно прекращает выполняемую на шине операцию.
2. Длительность сигнала сброса, выдаваемого на шину, а также общая продолжительность
выполнения команды RESET зависят от модели. Например, в PDP-11 моделей 15, 20, 35,
40 и 60 сигнал сброса выдаётся в течение примерно 20 мс, а суммарное время выполне ния команды составляет порядка 70 мс; в моделях 23, 24, LSI-11 и микропроцессоре J-11
74
длительность сигнала сброса составляет 10 мкс, а продолжительность команды в целом
— 100 мкс.
3. Если во время выполнения команды RESET возникает сбой питания, последствия зависят
от модели: он может приводить к досрочному завершению выполнения команды RESET,
снятию сигнала сброса с шины и входу в обработчик прерывания по отказу питания или
может оставаться незамеченным процессором.
5.7.12. WAIT — ожидание прерывания
WAIT
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
По команде WAIT, выполненной в режиме ядра, процессор останавливает свою работу до
поступления запроса прерывания. При появлении запроса работа возобновляется и вызывается соответствующий обработчик.
Замечание по программированию.
Документация не говорит, как эта команда выполняется в режиме пользователя или
супервизора. Вероятно, она трактуется как отсутствие операции, хотя не исключено, что процессор будет остановлен: прямое нарушение надёжности всей системы это не вызывает, снижается лишь общая производительность.
5.7.13. TSTSET — проверка и установка
TSTSET dst
0
0
0
0
1
1
1
0
1
0
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Эта команда атомарно считывает содержимое операнда в регистр R0, после чего записывает его обратно в память с установленным младшим битом.
Регистровая адресация недопустима, её использование вызывает прерывание по вектору 10.
Флаги устанавливаются в соответствии со значением, занесённым в R0:
• N устанавливается, если старший разряд R0 установлен (операнд меньше нуля);
• Z устанавливается, если R0 равен нулю;
• V сбрасывается;
• C отражает исходное состояние бита 0, т. е. его значение в регистре R0.
Эта команда реализована только в микропроцессоре J-11.
Замечания по программированию.
1. Очевидным назначением этой команды, как и команды WRTLCK, является организация семафоров, необходимых, например, в многопроцессорной машине. Однако появление этой
пары команд лишь в микропроцессоре J-11 сделало их фактически бесполезными, поскольку все основные операционные системы DEC были разработаны раньше и, естественно, не использовали эти команды.
2. На машинах, использующих шину UNIBUS, т. е. на «настоящих» PDP-11 и их советских
аналогах, особой нужды в подобных командах нет, поскольку обычные команды обработки данных, осуществляющие модификацию своего операнда-приёмника, обращаются
к памяти с помощью цикла шины «чтение-модификация-запись», т. е. атомарно, что позволяет достаточно легко реализовать семафоры без специальных команд.
75
5.7.14. WRTLCK — запись с блокировкой
WRTLCK dst
0
0
0
0
1
1
1
0
1
1
15
14
13
12
11
10
9
8
7
6
режим
5
4
регистр
3
2
1
0
Эта команда осуществляет атомарную запись содержимого регистра R0 в слово памяти,
указанное операндом-приёмником.
Регистровая адресация недопустима, её использование вызывает прерывание по вектору 10.
Флаги устанавливаются в соответствии с записываемым значением:
• N устанавливается, если старший разряд R0 установлен (операнд меньше нуля);
• Z устанавливается, если R0 равен нулю;
• V сбрасывается;
• C не изменяется.
Эта команда реализована только в микропроцессоре J-11.
Замечание по программированию.
В отличие от команды TSTSET, никакого технического смысла во введении команды
WRTLCK, кажется, нет: запись слова всегда выполняется атомарно независимо от типа используемой шины и конкретной модели процессора; соответственно, абсолютно тот же результат может быть достигнут обычной командой MOV.
76
6. Команды процессора с плавающей запятой
Процессор с плавающей запятой (ППЗ; FPU в англоязычной литературе) является дополнительным аппаратным средством, расширяющим вычислительные возможности центрального процессора командами, обрабатывающими вещественные числа; реализуемые им команды относятся к набору FPP. Конструктивно он является частью центрального процессора,
но на многих моделях, в том числе СМ-1420 и СМ-1600, ЦП сохраняет свою работоспособность и без ППЗ, при этом попытка выполнить какую-либо команду ППЗ приведёт к обычному прерыванию по вектору 10.
В PDP-11 используются, по меньшей мере, следующие модели ППЗ:
• FP11-A — PDP-11/34A (процессор PDP-11/34 не поддерживает использование ППЗ, но
может быть обновлён до уровня PDP-11/34A);
• FP11-B — вероятно, в ранних PDP-11/70;
• FP11-C — PDP-11/45, PDP-11/55, PDP-11/70;
• FP11-E — PDP-11/60;
• FP11-F — PDP-11/44;
• FPF11 — PDP-11/23.
Для PDP-11/23 и PDP-11/24 возможна реализация команд ППЗ на оборудовании ЦП посредством использования дополнительных микропрограмм (так называемая microcode option
KEF11-AA).
Команды FPP реализованы также в микропроцессоре J-11. Из советских микропроцессоров можно упомянуть сопроцессор К1801ВМ4, подключаемый к центральному процессору
К1801ВМ3, а также их КМОП-аналоги из серии 1806.
Общие принципы работы, формат представления чисел и система команд у всех моделей
совпадают, однако имеется ряд различий в обработке особых ситуаций, а также в точности,
обеспечиваемой в операциях над числами двойной точности (она зависит от количества физических разрядов, участвующих в операции и последующем округлении результата, хотя видимое программисту количество разрядов идентично для любых моделей ППЗ). Дальнейшее
описание основано на документации по PDP-11/70.
FP11-C и FP11-E работают параллельно с центральными процессорами: обнаружив команду ППЗ, центральный процессор вычисляет адрес её операнда и выполняет прочие действия по подготовке к её выполнению, после чего проверяет текущее состояние ППЗ. Если
последний свободен, ЦП передаёт ему необходимую информацию, после чего ППЗ приступает к выполнению своей команды, а ЦП, не дожидаясь её окончания, продолжает выполнение
программы. Если же ППЗ в этот момент занят выполнением ранее поступившей команды,
ЦП ожидает её завершения, после чего передаёт новую команду на выполнение ППЗ, а сам
возвращается к выполнению программы. Благодаря этому, чередуя команды ППЗ с командами ЦП, можно значительно увеличить общую производительность.
Остальные модели ППЗ не способны совмещать выполнение своих команд в работой ЦП,
поэтому последний ожидает завершения выполнения команды ППЗ и лишь после этого переходит к выполнению очередной команды программы.
Каким моделям ППЗ PDP-11 соответствуют ППЗ советских машин, информации нет, но
можно предположить, что это FP11-A. Во всяком случае, ППЗ самых распространённых машин — СМ-1600 и СМ-1420 — работают в тесном взаимодействии с аппаратурой ЦП, и последний не может начать выполнение следующей команды до завершения выполнения команды ППЗ. Кроме того, ППЗ ЭВМ СМ-1420 схемотехнически если не идентичен, то очень
близок к FP11-A (в частности, реализован на микропроцессорных секциях К1804ВС1 — советских аналогах Am2901, использованных в FP11-A, — и сопрягается одинаковым образом
с центральным процессором; в то же время собственно ЦП СМ-1420 полностью отличается
от процессора KD11-EA, являющегося основой PDP-11/34A).
77
6.1. Форматы обрабатываемых данных
Процессор с плавающей запятой обрабатывает 16- и 32-разрядные целые числа, представленные в дополнительном коде, и 32- и 64-разрядные вещественные числа, называемые
соответственно числами одиночной и двойной точности.
Вещественные числа одиночной точности имеют тот же формат, что и числа, обрабатываемые командами набора FIS:
S
Порядок
31 30
Мантисса
23 22
0
Вещественные числа двойной точности имеют аналогичный формат, различается лишь
количество битов мантиссы:
S
Порядок
63 62
Мантисса
55 54
0
При хранении в памяти вещественное число в зависимости от его точности занимает два
или четыре полуслова. Байты каждого полуслова хранятся в обычном порядке «младшийстарший», однако сами полуслова расположены в порядке «старший-младший». Например,
если вещественное число одиночной точности расположено по адресу 1000, то:
• байт с адресом 1000 хранит биты 23:16 вещественного числа;
• байт с адресом 1001 хранит биты 31:24 вещественного числа;
• байт с адресом 1002 хранит биты 7:0 вещественного числа;
• байт с адресом 1003 хранит биты 15:8 вещественного числа.
В целом, формат представления вещественных чисел является вполне типичным, хотя и
имеет некоторые отличия от современных форматов стандарта IEEE 754.
Знаковый бит является самым старшим; он равен нулю, если число положительно, и единице, если отрицательно.
Порядок занимает восемь разрядов и хранится в смещённой форме: истинным значениям
от –12710 до +12710 соответствуют хранимые в памяти значения от 1 до 25510 (1–3778). Особенностью представления чисел в PDP-11 является то, что нулевое значение смещённого порядка считается признаком нулевого значения числа независимо от значения знакового бита и
мантиссы; в то же время истинным нулём считается лишь число, содержащее нули во всех
своих разрядах. В зависимости от режима работы попытка загрузки значения, содержащего
нулевой смещённый порядок, может привести либо к загрузке истинного нуля, либо к прерыванию.
Мантисса представлена в прямом коде и содержит разряды дробной части числа, за исключением самого старшего бита, который считается равным единице. Таким образом, нули
в разрядах 22:0 числа одиночной точности означают, что мантисса равна 0.12, или 0.510.
Для обеспечения максимальной точности вычислений числа всегда хранятся в нормализованном виде. У таких чисел двоичное значение мантиссы находится в пределах от 0.100…
до 0.111… Поскольку первый бит после нулевой целой части мантиссы всегда содержит единицу, в машинном формате вещественного числа он не хранится. Таким образом, числа одиночной точности имеют 24 разряда мантиссы (23 явных разряда и один скрытый, являющийся старшим и всегда равный единице), а числа двойной точности — 56 разрядов.
Внутри ППЗ мантисса обрабатывается как 60-разрядное число, причём один бит резервируется для обнаружения арифметического переполнения. Соответственно, для чисел двойной
точности имеется три дополнительных сторожевых разряда (guard bits), а для чисел одиночной точности — 35 разрядов. В большинстве операций при использовании округления погрешность результата не превосходит 1/2 значения младшего представимого бита мантиссы;
78
при сложении чисел с противоположными знаками или при вычитании чисел с одинаковыми
знаками она ухудшается до 9/16 значения младшего бита.
Если в процессе выполнения вычислений возникает потеря значимости (смещённый порядок меньше либо равен нулю) или переполнение (смещённый порядок больше либо равен
4008), устанавливаются соответствующие индикаторы ошибок и, если разрешено, возникает
прерывание, при этом мантисса результата имеет правильное значение. Однако при записи в
память числа, имеющего нулевой смещённый порядок, будет записан истинный нуль.
Значение, хранящееся в памяти и содержащее единицу в знаковом бите и нули в остальных разрядах («отрицательный нуль»), называется неопределённым значением или неопределённой переменной (undefined variable). Такое значение не может быть записано самим
ППЗ без одновременного возникновения прерывания по ошибке ППЗ, что вкупе с его возможностью вызывать прерывание при загрузке такого числа упрощает отладку программ.
6.2. Регистры процессора с плавающей запятой
Процессор с плавающей запятой имеет свой набор регистров. В отличие от регистров
центрального процессора, регистры ППЗ не имеют адресов даже для пульта управления и
поэтому доступны только с помощью команд ППЗ.
6.2.1. Аккумуляторы
Аккумуляторы AC0–AC5 предназначены для хранения чисел, участвующих в выполнении операций. Разрядность аккумуляторов составляет 64 бита, но в зависимости от установленных режимов работы используются либо все эти биты, либо только старшие 32 разряда.
Аккумуляторы 0–3 равноправны и могут использоваться в качестве источников и приёмников во всех арифметико-логических операциях с плавающей запятой. Аккумуляторы 4–5
отличаются от них тем, что в некоторых командах могут использоваться только в качестве источников, но не приёмников результата.
6.2.2. Регистр состояния
Регистр состояния FPS отражает состояние ППЗ. Назначение его битов следующее.
FER FID
15
14
0
0
13
12
FIUV FIU FIV FIC
11
10
9
8
FD
FL
7
6
FT FMM FN
5
4
3
FZ
FV
FC
2
1
0
Бит 15 (FER) — ошибка ППЗ. Этот разряд устанавливается в следующих случаях:
• была выполнена попытка деления на нуль;
• встретился недопустимый код операции ППЗ;
• произошла любая другая ошибка, прерывание для которой разрешено, при этом состояние бита общего запрета прерываний ППЗ (FID) не учитывается.
Сам ППЗ никогда не сбрасывает этот бит, не считая сброса процессора, поэтому он должен обнуляться программно командой LDFPS.
Бит 14 (FID) — запрет прерываний ППЗ. Когда этот бит установлен, прерывания от ППЗ
не происходят, но, если отдельные причины прерываний, управляемые другими битами, разрешены, ППЗ выполняет все связанные с ними действия, за исключением собственно прерывания.
Заметим, что при обычном выполнении программы этот бит должен быть сброшен, а
лишние прерывания при необходимости запрещаются другими разрядами. В дальнейшем
описании предполагается, что этот бит равен нулю.
Биты 13 и 12 не используются и должны быть равны нулю.
Бит 11 (FIUV) — разрешение прерывания при загрузке неопределённого значения.
79
Если этот бит сброшен, загрузка неопределённого значения из памяти прерывания не вызывает, а само загруженное значение трактуется как нуль и может участвовать в любых операциях.
Прерывание по загрузке неопределённого значения может происходить либо до начала
собственно операции, либо уже после её выполнения в зависимости от команды и модели ППЗ.
Заметим, что получение отрицательного нуля, т. е. технически неопределённого значения,
в результате выполнения какой-либо операции на ППЗ типа FP11C, использующегося в
PDP-11/70, само по себе не вызывает прерывания; оно, если не запрещено установленным
битом FID, произойдёт при попытке сохранения такого значения в память. Бит FIUV на прерывание по записи отрицательного нуля не влияет.
Бит 10 (FIU) — разрешение прерывания по потере значимости (получению слишком маленького результата).
Когда этот бит установлен, потеря значимости вызывает формирование результата с корректными знаком и мантиссой, но с порядком, большим правильного значения на 400 8 (за исключением нулевого порядка, который является корректным).
Когда этот бит сброшен, потеря значимости вызывает формирование нулевого результата.
Бит 9 (FIV) — разрешение прерывания по переполнению.
Когда этот бит установлен, переполнение вызывает формирование результата с корректными знаком и мантиссой, но с порядком, меньшим правильного значения на 4008.
Когда этот бит сброшен, в зависимости от модели ППЗ будет сформирован либо нулевой
результат (FP11C), либо такой же результат, как при установленном бите FIV (FP11B), но без
возникновения прерывания.
При выполнении команд LDEXP и MOD могут иметь место специальные случаи переполнения, обсуждаемые при описании этих команд.
Бит 8 (FIC) — разрешение прерывания по ошибке преобразования в целое число.
Ошибка возникает, если результат операции не помещается в целое число заданного размера, определяемого битом FL. В этом случае приёмник обнуляется, а состояние бита FIC
определяет, возникнет ли прерывание.
Бит 7 (FD) — режим двойной точности. Когда установлен, ППЗ обрабатывает 64-разрядные вещественные числа, когда сброшен — 32-разрядные.
Бит 6 (FL) — режим длинных целых чисел. Когда установлен, ППЗ обрабатывает 32-разрядные целые числа, когда сброшен — 16-разрядные.
Бит 5 (FT) — режим усечения. Когда установлен, происходит усечение результата операции, а когда сброшен — округление. Этот бит влияет на выполнение команд загрузки и записи вещественных чисел с преобразованием точности, когда точность понижается.
Бит 4 (FMM) задаёт режим обслуживания ППЗ. Он используется в FP11-C и FP11-E и
при нормальной работе всегда сброшен.
Бит 3 (FN) устанавливается, если в последней операции получен отрицательный результат, и сбрасывается при получении нулевого или положительного результата.
Бит 2 (FZ) устанавливается, если в последней операции получен нулевой результат, и
сбрасывается в противном случае.
Бит 1 (FV) устанавливается, если в последней операции возникло переполнение порядка,
и сбрасывается в противном случае.
Бит 0 (FC) устанавливается, если в последней операции возник перенос из старшего разряда целочисленного результата, и сбрасывается в противном случае. Он изменяется только
командами преобразования вещественных чисел в целые.
Замечание по программированию.
Установленный бит 14 запрещает любые прерывания от процессора с плавающей запятой
независимо от состояния разрядов 11:8, которые разрешают или запрещают отдельные виды
прерываний.
80
6.2.3. Регистр кодов прерываний ППЗ
16-разрядный регистр кодов прерываний ППЗ FEC указывает причину возникновения последнего прерывания по ошибке ППЗ; для всех прерываний используется единый вектор 244.
В нём может содержаться один из следующих восьмеричных кодов:
• 2 — ошибочный код операции ППЗ;
• 4 — деление на нуль;
• 6 — ошибка преобразования в целое число;
• 108 — переполнение;
• 128 — потеря значимости;
• 148 — неопределённое значение;
• 168 — прерывание по обслуживанию ППЗ (только в моделях, имеющих соответствующие
средства).
Регистр FEC обновляется при каждом делении на нуль или ошибочном коде операции, а
также по любой другой причине, если прерывание для неё разрешено.
Замечание по программированию.
Запрет прерываний битом FID не блокирует обновление регистров FEC и FEA; блокировка обеспечивается битами разрешения конкретных видов прерываний.
6.2.4. Регистр адреса ошибки
16-разрядный регистр адреса ошибки FEA содержит виртуальный адрес команды ППЗ,
вызвавшей прерывание по ошибке. Он обновляется одновременно с регистром FEC.
6.3. Форматы команд вещественной арифметики
Процессор с плавающей запятой имеет пять форматов команд. Старшие четыре разряда
кода команды (биты 15:12) всегда равны единице, что является отличительным признаком команд ППЗ.
Разряды кода команд формата Ф1 распределены следующим образом:
Форматы Ф1 и Ф3
1
1
1
1
15
14
13
12
код операции
11
10
9
AC
8
7
режим
6
5
4
регистр
3
2
1
0
Форматы Ф1 и Ф3 используются в двухадресных командах ППЗ.
Биты 15:8 — код операции.
Биты 7:6 — номер аккумулятора 0–3.
Биты 5:3 — код режима адресации, идентичный кодам режимов адресации центрального
процессора.
Биты 2:0 — номер регистра, используемого в соответствии с заданным режимом адресации.
Если задана регистровая адресация, команды формата Ф1 обращаются к аккумуляторам
0–5; значения 6 и 7 в качестве номера регистра запрещены и вызывают прерывание по недопустимой команде. Команды формата Ф3, используя регистровую адресацию, обращаются к
регистрам общего назначения центрального процессора.
Остальные виды адресации у обоих форматов идентичны и используют указанный
регистр общего назначения для вычисления адреса операнда в памяти.
При автоинкрементной или автодекрементной адресации в командах формата Ф1 содержимое регистра общего назначения изменяется на 4 для операнда одиночной длины и на 8
для операнда двойной длины. Исключением является адресация с использованием счётчика
81
команд: последний изменяется на 2, а в ППЗ поступает 16-битное значение независимо от те кущего режима ППЗ, которое рассматривается как старшие 16 разрядов вещественного числа, при этом младшие разряды считаются равными нулю. Таким образом, задать полноценную 32- или 64-разрядную вещественную константу прямо в составе команды невозможно.
Автоинкрементная и автодекрементная адресация в командах формата Ф3 изменяет
регистр на 2 или 4 в зависимости от размера обрабатываемых целых чисел. При использовании регистровой или непосредственной адресации с 32-разрядным целым числом значение
регистра или константы рассматривается как старшая часть числа, а младшая считается равной нулю.
Форматы Ф2, Ф4
1
1
1
1
15
14
13
12
код операции
11
10
9
8
режим
7
6
5
4
регистр
3
2
1
0
Форматы Ф2 и Ф4 используются в одноадресных командах ППЗ.
Разница между этими двумя форматами в том, что при использовании регистровой адресации в формате Ф2 происходит обращение к соответствующему аккумулятору ППЗ, а в формате Ф4 — к регистру общего назначения центрального процессора.
Формат Ф5
1
1
1
1
15
14
13
12
код операции
11
10
9
8
7
6
5
4
3
2
1
0
Явно заданных операндов формат Ф5 не имеет, поэтому всё слово занимает код операции.
6.4. Набор команд вещественной арифметики
Большинство команд в зависимости от установленных в FPS режимов могут работать либо с числами одиночной точности, либо с числами двойной точности. Для облегчения восприятия программы каждая их таких команд имеет две мнемоники, хотя код операции остается тем же самым. Например, команда MULF означает умножение чисел одиночной точности, а
команда MULD — двойной точности; реальная же разрядность операндов этих команд зависит
от состояния флага FD (бит FPS[7]).
Команды, работающие с целыми числами, также имеют по две мнемоники на каждый код
операции, соответствующие 32- или 16-разрядным числам.
6.4.1. ABSF, ABSD — абсолютная величина вещественная
ABSF dst
ABSD dst
1
1
1
1
0
0
0
1
1
0
15
14
13
12
11
10
9
8
7
6
DST
5
4
3
2
1
0
Команды ABSF, ABSD формируют абсолютную величину операнда-приёмника.
Если смещённый порядок приёмника равен нулю, формируется истинный нуль.
Если приёмник имеет отрицательное значение, его знаковый бит обнуляется, что делает
значение неотрицательным.
Если приёмник содержит отрицательный нуль и бит FIUV установлен, на FP11C сначала
выполняется операция, а затем происходит прерывание, а на FP11B операция не выполняется
и сразу происходит прерывание.
82
Флажок FN сбрасывается.
Флажок FZ устанавливается, если результатом операции является нулевое значение.
Флажок FV сбрасывается
Флажок FC сбрасывается.
6.4.2. ADDF, ADDD — сложение вещественное
ADDF src,ac
ADDD src,ac
1
1
1
1
0
1
0
0
15
14
13
12
11
10
9
8
AC
7
SRC
6
5
4
3
2
1
0
Команды ADDF, ADDD производят сложение содержимого аккумулятора со значением
операнда-источника.
Если источник содержит отрицательный нуль и бит FIUV установлен, операция не выполняется и происходит прерывание.
Если в результате операции возникает переполнение и бит FIV установлен, происходит
прерывание, а в аккумулятор помещается значение, чья мантисса совпадает с мантиссой истинного результата, а порядок на 4008 меньше, чем истинный порядок результата. Если при
переполнении бит FIV сброшен, FPU типа FP11C помещает в аккумулятор нулевое значение;
FP11B помещает полученный результат независимо от состояния бита FIV.
Если в результате операции возникает потеря значимости и бит FIU установлен, происходит прерывание, а в аккумулятор помещается значение, чья мантисса совпадает с мантиссой
истинного результата, а порядок на 4008 больше истинного, за исключением случая, когда порядок равен нулю. Если при потере значимости бит FIU сброшен, в аккумулятор помещается
истинный нуль.
Отрицательный нуль может быть получен только в результате переполнения или потери
значимости. Он сохраняется в аккумуляторе лишь в случае, когда соответствующее прерывание разрешено; FP11B сохраняет его при переполнении независимо от разрешённости прерывания.
Флажок FN устанавливается, если получен отрицательный результат.
Флажок FZ устанавливается, если получен нулевой результат.
Флажок FV устанавливается, если возникло переполнение.
Флажок FC сбрасывается.
6.4.3. CLRF, CLRD — очистка вещественная
CLRF dst
CLRD dst
1
1
1
1
0
0
0
1
0
0
15
14
13
12
11
10
9
8
7
6
DST
5
4
3
2
1
0
Команды CLRF, CLRD обнуляют содержимое приёмника.
Флажок FN сбрасывается.
Флажок FZ устанавливается.
Флажок FV сбрасывается
Флажок FC сбрасывается.
83
6.4.4. CMPF, CMPD — сравнение вещественное
CMPF src,ac
CMPD src,ac
1
1
1
1
0
1
1
1
15
14
13
12
11
10
9
8
AC
7
SRC
6
5
4
3
2
1
0
Команды CMPF, CMPD вычитают содержимое источника из содержимого аккумулятора.
Разность теряется, но по результату операции устанавливаются или сбрасываются флажки.
Если источник содержит отрицательный нуль и бит FIUV установлен, операция не выполняется и происходит прерывание.
Флажок FN устанавливается, если получен отрицательный результат.
Флажок FZ устанавливается, если получен нулевой результат.
Флажок FV устанавливается, если возникло переполнение.
Флажок FC сбрасывается.
6.4.5. CFCC — копирование флажков ППЗ во флажки ЦП
CFCC
1
1
1
1
0
0
0
1
0
0
0
0
0
0
0
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Команда CFCC копирует текущие значения флажков ППЗ FN, FZ, FV, FC в соответствующие флажки ЦП.
6.4.6. DIVF, DIVD — деление вещественное
DIVF src,ac
DIVD src,ac
1
1
1
1
1
0
0
1
15
14
13
12
11
10
9
8
AC
7
SRC
6
5
4
3
2
1
0
Команды DIVF, DIVD выполняют деление содержимого заданного аккумулятора на операнд-источник; результат сохраняется в аккумуляторе.
Если источник содержит отрицательный нуль и бит FIUV установлен, операция не выполняется и происходит прерывание.
Нулевое значение смещённого порядка любого из операндов означает, что данный операнд равен нулю. В случае нулевого источника выполнение команды прекращается, в регистр
кода прерывания FEC заносится значение 4 и происходит прерывание по делению на нуль.
Если в результате операции возникает переполнение и бит FIV установлен, происходит
прерывание, а в аккумулятор помещается значение, чья мантисса совпадает с мантиссой истинного результата, а порядок на 4008 меньше, чем истинный порядок результата. Если при
переполнении бит FIV сброшен, FPU типа FP11C помещает в аккумулятор нулевое значение;
FP11B помещает полученный результат независимо от состояния бита FIV.
Если в результате операции возникает потеря значимости и бит FIU установлен, происходит прерывание, а в аккумулятор помещается значение, чья мантисса совпадает с мантиссой
истинного результата, а порядок на 4008 больше истинного, за исключением случая, когда порядок равен нулю. Если при потере значимости бит FIU сброшен, в аккумулятор помещается
истинный нуль.
Отрицательный нуль может быть получен только в результате переполнения или потери
значимости. Он сохраняется в аккумуляторе лишь в случае, когда соответствующее прерыва84
ние разрешено; FP11B сохраняет его при переполнении независимо от разрешённости прерывания.
Флажок FN устанавливается, если получен отрицательный результат.
Флажок FZ устанавливается, если получен нулевой результат.
Флажок FV устанавливается, если возникло переполнение.
Флажок FC сбрасывается.
6.4.7. LDF, LDD — загрузка вещественная
LDF src,ac
LDD src,ac
1
1
1
1
0
1
0
1
15
14
13
12
11
10
9
8
AC
7
SRC
6
5
4
3
2
1
0
Команды LDF, LDD загружают содержимое источника в приёмник-аккумулятор.
Если загружается отрицательный нуль и установлен бит FIUV, загрузка не выполняется и
возникает прерывание. Если бит FIUV сброшен, загружается отрицательный нуль, который
затем может участвовать в операциях.
Флажок FN устанавливается, если получен отрицательный результат.
Флажок FZ устанавливается, если получен нулевой результат.
Флажки FV, FC сбрасываются.
6.4.8. LDCDF, LDCFD — загрузка вещественная с изменением
точности
LDCDF src,ac
LDCFD src,ac
1
1
1
1
1
1
1
1
15
14
13
12
11
10
9
8
AC
7
SRC
6
5
4
3
2
1
0
Команды LDCDF и LDCFD загружают из источника вещественное число одной точности,
преобразуя его в число другой точности, и помещают результат в указанный аккумулятор.
Если бит FD сброшен, выполняется команда LDCDF, загружающая число двойной точности с
преобразованием его в одиночную точность; если этот бит установлен, выполняется команда
LDCFD, загружающая число одиночной точности с преобразованием его в двойную точность.
Если загружается отрицательный нуль и установлен бит FIUV, загрузка не выполняется и
возникает прерывание. Если бит FIUV сброшен, загружается отрицательный нуль, который
затем может участвовать в операциях.
Команда LDCDF в процессе преобразования из двойной в одиночную точность либо усекает число, либо округляет его в зависимости от состояния бита FT. При округлении возможно возникновение переполнения, при этом, если бит FIV установлен, в аккумулятор заносится результат преобразования, которым будет положительный или отрицательный нуль, после
чего происходит прерывание. Если же бит FIV сброшен, FP11C при переполнении заносит в
аккумулятор истинный нуль.
Флажок FN устанавливается, если получен отрицательный результат.
Флажок FZ устанавливается, если получен нулевой результат.
Флажок FV устанавливается, если возникло переполнение.
Флажок FC сбрасывается.
85
6.4.9. LDCIF, LDCID, LDCLF, LDCLD — загрузка целого с
преобразованием в вещественное
LDCIF
LDCID
LDCLF
LDCLD
src,ac
src,ac
src,ac
src,ac
1
1
1
1
1
1
1
0
15
14
13
12
11
10
9
8
AC
7
SRC
6
5
4
3
2
1
0
Команды LDCIF, LDCID, LDCLF и LDCLD загружают из источника целое 16- или 32-разрядное число, преобразуют его в вещественное число одиночной или двойной точности и помещают результат в указанный аккумулятор. Какая именно команда выполняется, определяется состоянием битов FL и FD.
Если загружается 32-разрядное целое число, а для источника используется регистровая
или непосредственная адресация, загружаемая 16-разрядная величина является старшей половиной числа, а младшая половина считается равной нулю.
Если загружается 32-разрядное целое, а приёмником является число одиночной точности,
производится либо усечение, либо округление младших разрядов целого числа до 24 разрядов мантиссы в соответствии с состоянием бита FT.
Флажок FN устанавливается, если получен отрицательный результат.
Флажок FZ устанавливается, если получен нулевой результат.
Флажок FV сбрасывается.
Флажок FC сбрасывается.
6.4.10. LDEXP — загрузка порядка
LDEXP src,ac
1
1
1
1
1
1
0
1
15
14
13
12
11
10
9
8
AC
7
SRC
6
5
4
3
2
1
0
Команда LDEXP загружает в указанный аккумулятор новое значение порядка, не изменяя
знак и мантиссу находящегося в нём вещественного числа.
В источнике находится истинное значение нового порядка, поэтому при загрузке к нему
добавляется 2008, чтобы получить смещённое значение.
Если истинное значение загружаемого порядка больше 177 8, фиксируется переполнение,
при этом:
• если бит FIV установлен, то в качестве смещённого порядка FP11C использует биты 6:0
источника, а FP11B — биты 7:0; после завершения команды происходит прерывание по
переполнению;
• если бит FIV сброшен, то FP11C заносит в аккумулятор истинный нуль, а FP11B загружает новый смещённый порядок, равный младшим восьми разрядам суммы источника и
значения 2008.
Если истинное значение загружаемого порядка меньше –1778, фиксируется потеря значимости, при этом:
• если бит FIU установлен, FP11C использует в качестве смещённого порядка значение битов 6:0 источника, а FP11B — младшие восемь разрядов суммы значения 2008 и значения
источника; после загрузки нового порядка происходит прерывание;
• если бит FIU сброшен, в аккумулятор заносится истинный нуль.
86
Флажок FN устанавливается, если итоговое значение аккумулятора считается отрицательным.
Флажок FZ устанавливается, если итоговое значение смещённого порядка в аккумуляторе
равно нулю, т. е. если содержимое аккумулятора считается нулём.
Флажок FV устанавливается, если значение истинного порядка, заданного источником,
больше 1778, т. е. если обнаруживается переполнение.
Флажок FC сбрасывается.
6.4.11. LDFPS — загрузка слова состояния ППЗ
LDFPS src
1
1
1
1
0
0
0
0
0
1
15
14
13
12
11
10
9
8
7
6
SRC
5
4
3
2
1
0
Команда LDFPS загружает из операнда-источника новое значение FPS.
6.4.12. MODF, MODD — умножение вещественное с получением
целого
MODF src,ac
MODD src,ac
1
1
1
1
0
0
1
1
15
14
13
12
11
10
9
8
AC
7
SRC
6
5
4
3
2
1
0
Команды MODF, MODD умножают содержимое аккумулятора на содержимое источника,
выделяет из произведения целую и дробную части и сохраняет либо только дробную часть,
либо и целую, и дробную части в аккумуляторах как вещественные числа.
Если указанный в команде аккумулятор имеет чётный номер, в нём будет сохранена дробная часть, а в следующем за ним аккумуляторе с нечётным номером — целая часть; если в команде указан нечётный аккумулятор, в нём сохраняется дробная часть. Такое поведение объясняется принципами выполнения сохранения результатов: сначала выполняется запись целой части в регистр AC, а затем — дробной части в регистр AC˅1, т. е. в регистр, младший
бит номера которого принудительно установлен. Соответственно, если в команде указан
нечётный регистр, запись дробной части перезапишет сохранённую перед этим целую часть.
Если источник содержит отрицательный нуль и бит FIUV установлен, операция не выполняется и происходит прерывание.
При выполнении команды возможны пять разных случаев. В описании используется значение L, равное количеству разрядов мантиссы, включая скрытый разряд: 24 для чисел одиночной точности и 56 для чисел двойной точности. Значение P — это истинный результат
умножения.
1. Если при умножении возникает переполнение и бит FIV установлен, то в AC˅1 заносится
целая часть, усечённая до L разрядов и с порядком, меньшим истинного на 4008 (что может привести к появлению в AC˅1 отрицательного нуля), а в AC помещается истинный
нуль; после этого происходит обычное прерывание.
Если возникло переполнение, но бит FIV сброшен, действия зависят от типа ППЗ:
• FP11B заносит в аккумуляторы те же значения, что описано выше;
• FP11C в оба аккумулятора заносит истинные нули, т. е. появление отрицательного нуля
в этой ситуации невозможно.
2. Если 2L ≤ |P| и при этом нет переполнения, в AC˅1 заносится целая часть, усечённая до L
разрядов, а в AC — истинный нуль.
87
3. Если 1 ≤ |P| <2L, то в AC˅1 заносится точное (без усечения) значение целой части, а в AC
— дробная часть результата. Последняя нормализуется, а также усекается или округляется в зависимости от состояния бита FT. В результате округления дробной части она может стать равной ±1.
4. Если |P| < 1 и нет потери значимости, в AC˅1 заносится истинный нуль, а в AC — нормализованный и усечённый или округлённый результат умножения; последний в результате
округления может стать равным ±1.
5. Если произошла потеря значимости и бит FIU установлен, то в AC˅1 заносится истинный нуль, а в AC — нормализованный и усечённый или округлённый результат умножения, чей порядок на 4008 больше истинного порядка, за исключением случая, когда порядок равен нулю — тогда он корректен.
Если при потере значимости бит FIU сброшен, в оба аккумулятора заносится истинный
нуль.
Флажок FN устанавливается, если получен отрицательный результат.
Флажок FZ устанавливается, если получен нулевой результат.
Флажок FV устанавливается, если на ППЗ FP11C возникло переполнение.
Флажок FC сбрасывается.
6.4.13. MULF, MULD — умножение вещественное
MULF src,ac
MULD src,ac
1
1
1
1
0
0
1
0
15
14
13
12
11
10
9
8
AC
7
SRC
6
5
4
3
2
1
0
Команды MULF, MULD умножают содержимое заданного аккумулятора на операнд-источник; результат сохраняется в аккумуляторе.
Если источник содержит отрицательный нуль и бит FIUV установлен, операция не выполняется и происходит прерывание.
Если смещённый порядок любого из операндов равен нулю, результат будет равен истинному нулю. Если оба смещённых порядка отличны от нуля, производится умножение, причём
промежуточное значение мантиссы имеет размер 48 битов для одинарной и 59 битов для
двойной точности. После выполнения умножения мантисса результата округляется или усекается до требуемого размера в зависимости от значения бита FT.
Если в результате операции возникает переполнение и бит FIV установлен, происходит
прерывание, а в аккумулятор помещается значение, чья мантисса совпадает с мантиссой истинного результата, а порядок на 4008 меньше, чем истинный порядок результата. Если при
переполнении бит FIV сброшен, FPU типа FP11C помещает в аккумулятор нулевое значение;
FP11B помещает полученный результат независимо от состояния бита FIV.
Если в результате операции возникает потеря значимости и бит FIU установлен, происходит прерывание, а в аккумулятор помещается значение, чья мантисса совпадает с мантиссой
истинного результата, а порядок на 4008 больше истинного, за исключением случая, когда порядок равен нулю. Если при потере значимости бит FIU сброшен, в аккумулятор помещается
истинный нуль.
Отрицательный нуль может быть получен только в результате переполнения или потери
значимости. Он сохраняется в аккумуляторе лишь в случае, когда соответствующее прерывание разрешено; FP11B сохраняет его при переполнении независимо от разрешённости прерывания.
Флажок FN устанавливается, если получен отрицательный результат.
88
Флажок FZ устанавливается, если получен нулевой результат.
Флажок FV устанавливается, если возникло переполнение.
Флажок FC сбрасывается.
6.4.14. NEGF, NEGD — смена знака вещественная
NEGF dst
NEGD dst
1
1
1
1
0
0
0
1
1
1
15
14
13
12
11
10
9
8
7
6
DST
5
4
3
2
1
0
Команды NEGF, NEGD изменяют знак вещественного операнда-приёмника, если его порядок отличен от нуля. В случае нулевого порядка формируется истинно нулевой результат.
Если бит FIUV установлен, а операндом является отрицательный нуль, то для FP11C прерывание происходит до выполнения операции, а для FP11B — после.
Флажок FN устанавливается, если получен отрицательный результат.
Флажок FZ устанавливается, если получен нулевой результат (порядок равен нулю).
Флажки FV, FC сбрасываются.
6.4.15. SETD — установка режима вещественных чисел двойной
точности
SETD
1
1
1
1
0
0
0
1
0
0
0
0
1
0
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Команда SETD устанавливает бит FD в слове состояния ППЗ, тем самым устанавливая
режим обработки вещественных чисел двойной точности.
6.4.16. SETF — установка режима вещественных чисел
одиночной точности
SETF
1
1
1
1
0
0
0
1
0
0
0
0
0
0
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Команда SETF сбрасывает бит FD в слове состояния ППЗ, тем самым устанавливая режим обработки вещественных чисел одиночной точности.
6.4.17. SETI — установка режима коротких целых чисел
SETI
1
1
1
1
0
0
0
1
0
0
0
0
0
0
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Команда SETI сбрасывает бит FL в слове состояния ППЗ, тем самым устанавливая режим обработки коротких целых чисел.
6.4.18. SETL — установка режима длинных целых чисел
SETI
1
1
1
1
0
0
0
1
0
0
0
0
1
0
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
89
Команда SETL устанавливает бит FL в слове состояния ППЗ, тем самым устанавливая режим обработки длинных целых чисел.
6.4.19. STF, STD — сохранение вещественное
STF ac,dst
STD ac,dst
1
1
1
1
1
0
0
0
15
14
13
12
11
10
9
8
AC
7
DST
6
5
4
3
2
1
0
Команды STF, STD сохраняют значение заданного аккумулятора в операнде-приёмнике.
Если в аккумуляторе находится отрицательный нуль, он сохраняется, при этом прерывание не возникает независимо от состояния бита FIUV.
Флажки не изменяются.
6.4.20. STCFD, STCDF — сохранение вещественного с изменением
точности
STCFD ac,dst
STCDF ac,dst
1
1
1
1
1
1
0
0
15
14
13
12
11
10
9
8
AC
7
DST
6
5
4
3
2
1
0
Команды STCDF и STCFD записывают содержимое аккумулятора в приёмник. Если бит
FD сброшен, выполняется команда STCFD, преобразующая в процессе записи число из одиночной точности в двойную; если бит FD сброшен, производится преобразование из двойной
точности в одиночную.
Отрицательный нуль может быть сохранён без возникновения прерывания независимо от
состояния бита FIUV.
В процессе преобразования числа командой STCDF из двойной в одиночную точность
производится либо усечение, либо округление в зависимости от состояния бита FT. При
округлении возможно возникновение переполнения, при этом, если бит FIV установлен, в
приёмник заносится результат преобразования, которым будет положительный или отрицательный нуль, после чего происходит прерывание. Если же бит FIV сброшен, FP11C при
переполнении заносит в приёмник истинный нуль.
Флажок FN устанавливается, если получен отрицательный результат.
Флажок FZ устанавливается, если получен нулевой результат.
Флажок FV устанавливается, если возникло переполнение.
Флажок FC сбрасывается.
6.4.21. STCFI, STCFL, STCDI, STCDL — сохранение вещественного
с преобразованием в целое
STCFI
STCFL
STCDI
STCDL
ac,dst
ac,dst
ac,dst
ac,dst
1
1
1
1
1
0
1
1
15
14
13
12
11
10
9
8
90
AC
7
DST
6
5
4
3
2
1
0
Команды STCFI, STCFL, STCDI и STCDL сохраняют содержимое аккумулятора в операнде-приёмнике, преобразуя его из вещественного формата одиночной или двойной точности в 16- или 32-разрядное целое. Какая именно команда выполняется, определяется состоянием битов FL и FD.
В процессе преобразования вещественного числа в целое производится усечение мантиссы независимо от состояния бита FT. Таким образом, целое число будет отражать истинное
значение целой части вещественного числа.
Если производится преобразование в 32-разрядное целое, а для приёмника используется
регистровая адресация, в регистр будет помещена старшая половина результата; младшая половина теряется. Судя по документации, для приёмника можно использовать и непосредственную адресацию, при этом во второе полуслово кода команды будет записана старшая
часть результата.
Если целая часть вещественного числа выходит за диапазон целых чисел используемой
разрядности, в приёмник записывается нуль и устанавливается флаг FC. Если при этом установлен бит FIC, происходит прерывание по невозможности преобразования.
Флажок FN устанавливается, если в приёмник заносится отрицательное значение.
Флажок FZ устанавливается, если в приёмник заносится нулевое значение.
Флажок FV сбрасывается.
Флажок FC устанавливается, если преобразуемое вещественное число превосходит максимально представимое целое число.
Флажки ППЗ копируются во флажки ЦП.
6.4.22. STEXP — сохранение порядка
STEXP ac,dst
1
1
1
1
1
0
1
0
15
14
13
12
11
10
9
8
AC
7
DST
6
5
4
3
2
1
0
Команда STEXP сохраняет истинное значение порядка вещественного числа, находящегося в указанном аккумуляторе, в заданном приёмнике.
Флажок FN устанавливается, если значение истинного порядка является отрицательным.
Флажок FZ устанавливается, если истинный порядок равен нулю.
Флажок FV сбрасывается.
Флажок FC сбрасывается.
Флажки ППЗ копируются во флажки ЦП.
6.4.23. STFPS — сохранение слова состояния ППЗ
STFPS dst
1
1
1
1
0
0
0
0
1
0
15
14
13
12
11
10
9
8
7
6
DST
5
4
3
2
1
0
Команда STFPS сохраняет текущее значение слова состояния ППЗ в заданном операндеприёмнике.
6.4.24. STST — сохранение состояния ППЗ
STST dst
1
1
1
1
0
0
0
0
1
1
15
14
13
12
11
10
9
8
7
6
DST
5
4
3
2
1
0
91
Команда STST сохраняет текущее состояние ППЗ: в первом слове операнда-приёмника
сохраняется содержимое регистра FEC (код прерывания ППЗ), а во втором слове — содержимое регистра FEA (адрес прерывания ППЗ).
Если для приёмника используется регистровая или непосредственная адресация, сохраняется только одно слово, содержащее значение FEC.
6.4.25. SUBF, SUBD — вычитание вещественное
SUBF src,ac
SUBD src,ac
1
1
1
1
0
1
1
0
15
14
13
12
11
10
9
8
AC
7
SRC
6
5
4
3
2
1
0
Команды SUBF, SUBD производят вычитание значения операнда-источника из содержимого аккумулятора.
Если источник содержит отрицательный нуль и бит FIUV установлен, операция не выполняется и происходит прерывание.
Если в результате операции возникает переполнение и бит FIV установлен, происходит
прерывание, а в аккумулятор помещается значение, чья мантисса совпадает с мантиссой истинного результата, а порядок на 4008 меньше, чем истинный порядок результата. Если при
переполнении бит FIV сброшен, FPU типа FP11C помещает в аккумулятор нулевое значение;
FP11B помещает полученный результат независимо от состояния бита FIV.
Если в результате операции возникает потеря значимости и бит FIU установлен, происходит прерывание, а в аккумулятор помещается значение, чья мантисса совпадает с мантиссой
истинного результата, а порядок на 4008 больше истинного, за исключением случая, когда порядок равен нулю. Если при потере значимости бит FIU сброшен, в аккумулятор помещается
истинный нуль.
Отрицательный нуль может быть получен только в результате переполнения или потери
значимости. Он сохраняется в аккумуляторе лишь в случае, когда соответствующее прерывание разрешено; FP11B сохраняет его при переполнении независимо от разрешённости прерывания.
Флажок FN устанавливается, если получен отрицательный результат.
Флажок FZ устанавливается, если получен нулевой результат.
Флажок FV устанавливается, если возникло переполнение.
Флажок FC сбрасывается.
6.4.26. TSTF, TSTD — проверка вещественная
TSTF src
TSTD src
1
1
1
1
0
0
0
1
0
1
15
14
13
12
11
10
9
8
7
6
SRC
5
4
3
2
1
0
Команды TSTF, TSTD проверяют значение операнда-источника и устанавливают соответствующим образом флажки.
Если смещённый порядок операнда равен нулю, операнд считается равным нулю.
Если операндом является отрицательный нуль и бит FIUV установлен, прерывание
происходит по завершении операции.
Флажок FN устанавливается, если операнд является отрицательным.
Флажок FZ устанавливается, если операнд является нулевым.
Флажки FV, FC сбрасываются.
92
7. Коммерческий набор команд
7.1. Общие сведения
Некоторые модели PDP-11 — по меньшей мере, PDP-11/24 и PDP-11/44, — могут быть
оборудованы дополнительным модулем, реализующим коммерческий набор команд (CIS —
commercial instruction set); этот набор команд поддерживается также микропроцессором J-11.
Какие-то варианты LSI-11, судя по доступным документам, частично поддерживают этот набор команд, но не реализуют его полностью, а также допускают некоторые отклонения и в
реализованных командах.
В советских ЭВМ коммерческий набор команд, по всей вероятности, никогда реализован
не был, хотя процессор ЭВМ СМ-1420 допускает подключение некоего «спецпроцессора»,
которым мог бы быть подобный модуль.
Данный раздел основан на документах «KE44-A CISP User's Guide» и «KE44-A CISP
Technical Manual», описывающем сопроцессор KE44-A, подключаемый к центральному процессору KD11-Z вычислительной машины PDP-11/44, и посвящённом расширениям архитектуры стандарте «DEC Standard 168. PDP11 Extended Instructions».
Во время своего выполнения команды коммерческого набора в качестве рабочей памяти
могут использовать любые ячейки приёмника результата, а также до 64 10 слов текущего стека
включительно. Соответственно, необходимо обеспечить достаточную ёмкость стека, учитывая, что запись в стек ядра, выполняемая этими командами, подвергается обычному контролю на переполнение стека.
В некоторых случаях выполнение команды даёт непредсказуемый результат или приводит
к непредсказуемым последствиям. Разница между этими формулировками заключается в том,
что непредсказуемость результата означает непредсказуемость содержимого операнда-приёмника и флагов кодов условий в PSW, а непредсказуемость последствий включает возможные
нарушения состояния процессора и памяти в целом, но лишь в пределах текущего режима работы (т. е. выполнение команды набора CIS в режиме пользователя не может затронуть память, которая в этом режиме недоступна, и регистры других режимов процессора).
7.2. Приостановка выполнения команды
Поскольку команды коммерческого набора оперируют данными переменной длины, их
время выполнения может быть очень большим. Чтобы обеспечить возможность реакции процессора на внешние прерывания, а также на связанные с выполнением самой команды прерывания, не являющиеся фатальными (например, по отслеживанию доступа к памяти), эти
команды сделаны прерываемыми: в случае появления запроса прерывания выполнение команды приостанавливается и происходит вызов обработчика прерывания, при этом в записанном в стек старом PSW будет установлен бит 8 — индикатор приостановки команды.
Чтобы успешно возобновить выполнение прерванной команды, необходимо обеспечить
сохранность следующей информации, имевшей место на момент прерывания:
• содержимого регистров общего назначения 0–5;
• состояния флагов условий PSW[3:0];
• 6410 слов в вершине стека, активного на момент возникновения прерывания, и положение
указателя этого стека (прерываемые команды могут использовать стек для сохранения состояния своего выполнения);
• содержимого приёмника результата операции (область приёмника может применяться в
качестве хранилища промежуточных результатов).
93
Если команда прерывается из-за того, что она не смогла выполнить запись в стек по причине его недостаточной длины, ОС может выделить для стека дополнительное место и возобновить выполнение команды с точки прерывания.
7.3. Типы данных
7.3.1. Символы
Символ (character) — это всегда один байт. Если при выполнении команды символ должен находиться в регистре общего назначения, он занимает его младший байт, а старший
байт должен быть равен нулю. Если символ входит в состав одного из слов кода команды, он
занимает младший байт слова, а старший байт должен быть нулевым. При нарушении последнего требования последствия будут непредсказуемы.
7.3.2. Строки символов
Строка символов (character string) состоит из символов (байтов), хранящихся в памяти
один за другим. Её положение в памяти задаётся описателем, содержащим адрес начала строки (наименьший из адресов байтов, относящихся к строке) и количество символов в строке.
Строка может быть пустой, то есть содержать 0 символов; максимально возможная длина
строки — 65 535 символов.
Описатель строки может размещаться либо в двух смежных регистрах общего назначения, либо в двух смежных словах памяти. Регистр с чётным номером или слово с наименьшим адресом содержит количество символов в строке, следующий регистр с нечётным номером или смежное с первым слово памяти содержит адрес начала строки.
Rn
ptr
Rn+1 ptr+2
количество символов в строке
адрес первого символа строки
7.3.3. Наборы символов
Набор символов (character set) включает в себя некоторое подмножество из 256 возможных символов, кодируемых одним байтом. Набор задаётся с помощью описателя, включающего адрес начала 256-байтовой таблицы и 8-разрядную маску:
Rn
ptr
Rn+1 ptr+2
0
маска
адрес таблицы
Каждая однобайтная ячейка таблицы соответствует одному символу, код которого равен
смещению этой ячейки от начала таблицы. Ячейка содержит битовую маску, задающую принадлежность данного символа к тем или иным подмножествам символов, например, к
большим буквам, к цифрам и т. д. Поскольку маска имеет размер один байт, с помощью одной таблицы можно определить до восьми независимых подмножеств. Маска в описателе
определяет, какие из подмножеств входят в данный набор символов.
Технически, если проверяемый символ имеет код C, а маска в описателе равна M, то данный символ принадлежит набору, определяемому описателем, если результат операции A[C]
& M отличен от нуля (здесь A — адрес начала таблицы, которую можно рассматривать как
массив байтов).
7.3.4. Десятичные строки
Десятичная строка (decimal string) содержит двоично-десятичные данные, над которыми
могут выполняться арифметические операции. CIS поддерживает два вида десятичных строк:
94
числовые (numeric string) и упакованные (packed string); они различаются, главным образом,
способом представления знака числа и размещением цифр в памяти.
Числовые строки делятся на зонные со знаком (signed zoned), зонные без знака (unsigned
zoned), перфорированные с конечным знаком (trailing overpunch), перфорированные с начальным знаком (leading overpunch), с отдельным конечным знаком (trailing separate) и с отдельным начальным знаком (leading separate). Упакованные строки могут быть знаковыми (signed
packed) и беззнаковыми (unsigned packed).
В памяти десятичные строки занимают несколько подряд идущих байтов и могут содержать от нуля до 31 десятичной цифры включительно. Десятичные цифры кодируются
четырьмя битами в двоично-десятичном виде (BCD, binary coded decimal) и имеют значения
от 0000 до 1001. Десятичные строки считаются десятичными целыми числами; слева они могут концептуально дополняться нулями без изменения их значения.
Корректность строк, являющихся исходными операндами, не проверяется, и наличие в
них недопустимых комбинаций битов приводит к получению непредсказуемых результатов.
Положительный и отрицательный нули считаются одним и тем же нулевым значением.
Концептуально сначала производится вычисление результата операции, а потом итоговая
десятичная строка записывается в память. Если под результат выделено больше места, чем
реально необходимо для сохранения результата, поле результата заполняется слева дополнительными нулями. Если под результат выделено меньше места, чем необходимо, сохраняются
только знак и младшие цифры результата и устанавливается признак десятичного переполнения; старшие цифры результата, не поместившиеся в отведённую память, теряются. Если результат операции равен нулю, он всегда сохраняется со знаком «плюс». Однако при переполнении, возникшем при попытке записи в память отрицательного результата, в поле результата
может быть сформирован отрицательный нуль: это происходит, когда все младшие цифры результата, которые помещаются в отведённое место, равны нулю.
Если под результат операции выделена строка с нулевой длиной, цифры результата не
сохраняются. Знак результата будет записан при использовании строки с разделителями или
упакованной строки, но не записывается в зонные и overpunch строки. Если результат операции отличен от нуля, фиксируется возникновение десятичного переполнения.
Описатель десятичной строки занимает два слова и имеет следующий формат:
15
Rn
ptr
Rn+1 ptr+2
0
14
12
тип
11
5
0
4
0
длина
адрес
Поле «адрес» задаёт адрес байта строки, содержащего самую старшую цифру этого числа. Как правило, это самый левый байт строки, т. е. байт с наименьшим адресом, однако у
строки с отдельным начальным знаком имеется байт, непосредственно предшествующий
байту, заданному данным адресом.
Поле «длина» задаёт длину строки в десятичных цифрах и не учитывает знак.
Поле «тип» задаёт тип строки. Если строка является числовой, оно может иметь следующие значения:
• 000 — зонная строка со знаком;
• 001 — зонная строка без знака;
• 010 — перфорированная строка с конечным знаком;
• 011 — перфорированная строка с начальным знаком;
• 100 — строка с отдельным конечным знаком;
• 101 — строка с отдельным начальным знаком.
Если строка является упакованной, используются следующие коды типов:
• 110 — знаковая упакованная строка;
95
• 111 — беззнаковая упакованная строка.
В командах, оперирующих числовыми строками, коды 110 и 111 являются зарезервированными; в командах, оперирующих упакованными строками, зарезервированы коды 000–
101. Использование зарезервированного кода типа или наличие единиц в зарезервированных
разрядах описателя приведёт к непредсказуемым последствиям.
7.3.4.1. Упакованные строки
Числа, представленные в виде упакованных строк, хранят по две десятичные цифры в одном байте. Байт строки, имеющий наибольший адрес, хранит код знака в битах 3:0 и младшую цифру числа в битах 7:4; все остальные байты хранят по две цифры: младшую в битах
3:0 и старшую в битах 7:4. Таким образом, знаковый полубайт является самым младшим полубайтом упакованной строки.
┌───┬───╥───┬───╥───┬───╥─/─╥───┬───╥───┬───╥───┬───┐
│ D │ D ║ D │ D ║ D │ D ║
║ D │ D ║ D │ D ║ D │ S │
└───┴───╨───┴───╨───┴───╨─/─╨───┴───╨───┴───╨───┴───┘
Предпочтительным кодом знака «плюс» является комбинация 1100; комбинации 1010,
1110 и 1111, встретившиеся в исходных операндах, тоже рассматриваются процессором как
знак «плюс», однако никогда им самим не формируются.
Предпочтительным кодом знака «минус» является комбинация 1101; комбинация 1011,
встретившаяся в исходных операндах, также рассматривается как знак «минус», но процессором не формируется.
В беззнаковых упакованных строках в битах 3:0 последнего байта находится комбинация
1111, т. е. для хранения цифры он не используется.
Если количество цифр в числе чётное, самый старший полубайт строки исходного операнда, т. е. биты 7:4 байта с наименьшим адресом, должен содержать комбинацию 0000. Если
строка с чётной длиной в цифрах является приёмником результата, процессор обнуляет биты
7:4 байта с наименьшим адресом, т. е. этот полубайт не может принять «лишнюю» цифру,
сформированную при переполнении.
Если строка имеет нулевую длину в цифрах, она физически состоит из одного байта.
Если такая строка используется в качестве исходного операнда, она задаёт операнд с нулевым
значением, причём биты 7:4 её единственного байта должны содержать нули, а биты 3:0 —
знак числа. Если такая строка используется в качестве приёмника результата, процессор заносит нуль в старший полубайт и знак результата в младший полубайт, а если истинный результат операции отличен от нуля, формирует признак десятичного переполнения. По сути,
строка с нулевой длиной в цифрах обрабатывается точно так же, как и любая строка с ненулевой, но чётной длиной.
Корректная упакованная строка имеет длину от 1 до 16 байтов включительно, что соответствует логическому размеру от 0 до 31 цифры включительно. Все полубайты, кроме знакового, должны содержать только коды цифр (комбинации 0000–1001), причём при чётном числе цифр самый старший полубайт должен содержать нуль. Знаковый полубайт должен содержать код знака (одну из комбинаций 1010–1111). Использование в команде некорректно закодированных операндов даёт непредсказуемый результат.
Замечание по программированию.
Формат упакованных десятичных чисел, используемый командами набора CIS, совпадает
с форматом упакованных десятичных чисел, применяемым в мэйнфреймах IBM, что обеспечивает перенос данных между машинами этих архитектур без дополнительной перекодировки.
96
7.3.4.2. Зонные строки
Числа, представленные зонными строками, содержат в младшем полубайте каждого
байта код десятичной цифры, а в старшем полубайте — код зоны, равный 0011. Исключением является старший полубайт самого младшего байта (т. е. байта с наибольшим адресом): в
знаковом зонном формате он содержит код знака — 0011 для знака «плюс» и 0111 для знака
«минус».
┌───┬───╥───┬───╥───┬───╥─/─╥───┬───╥───┬───╥───┬───┐
│ Z │ N ║ Z │ N ║ Z │ N ║
║ Z │ N ║ Z │ N ║Z/S│ N │
└───┴───╨───┴───╨───┴───╨─/─╨───┴───╨───┴───╨───┴───┘
Корректная зонная строка имеет длину от 0 до 31 байта включительно, что соответствует
логическому размеру от 0 до 31 цифры включительно. Все цифровые полубайты должны содержать только коды цифр (комбинации 0000–1001), зонные полубайты — код зоны 0011,
знаковый полубайт — код знака 0011 или 0111. Использование в команде некорректно закодированных операндов даёт непредсказуемый результат.
Замечания по программированию.
1. Формат зонных десятичных чисел, используемый командами набора CIS, по общей
структуре совпадает с форматом зонных десятичных чисел, применяемым в мэйнфреймах IBM. Отличия заключаются в кодах зон и знаков: у IBM для зон применяется код
1111, что соответствует принятой на мэйнфреймах символьной кодировке EBCDIC, в которой цифры кодируются как F0–F9; коды знаков совпадают с применяемыми для упакованных чисел.
2. Зонная строка может иметь нулевую длину. При её использовании в качестве источника
она соответствует нулевому значению, при использовании как приёмника она способна
«принять» нулевой результат независимо от его знака, однако любой ненулевой результат
вызывает переполнение. Адрес строки нулевой длины, указанный в описателе, игнорируется и не может вызвать, например, прерывание по нарушению защиты памяти.
7.3.4.3. Перфорированные строки
Перфорированные (overpunch) строки каждым своим байтом представляют одну десятичную цифру. Либо самый старший (первый, с наименьшим адресом), либо самый младший
(последний, с наибольшим адресом) байт строки кодирует одновременно знак числа и, соответственно, самую старшую или самую младшую десятичную цифру; все остальные байты
кодируют по одной цифре.
Все байты, кроме кодирующего цифру и знак, имеют одинаковый формат: в младшем полубайте хранится код десятичной цифры 0000–1001, а старший байт считается зоной. Если
строка является исходным операндом команды, содержимое старшего полубайта не проверяется и полностью игнорируется; если строка является результатом операции, в старший полубайт записывается код зоны 0011.
В отличие от строк в упакованном или зонном форматах, байт, содержащий знак, не делится на полубайты, содержащие отдельно код цифры и отдельно код знака: и знак, и цифру
определяет значение байта в целом, как показано в следующей таблице в двоичном и символьном коде.
Значение Предпочитаемая кодировка
Альтернативные кодировки
+0
0111 1011 {
0011 0000 0, 0101 1011 [, 0011 1111 ?
+1
0100 0001 A
0011 0001 1
+2
0100 0010 B
0011 0010 2
97
Значение Предпочитаемая кодировка
Альтернативные кодировки
+3
0100 0011 C
0011 0011 3
+4
0100 0100 D
0011 0100 4
+5
0100 0101 E
0011 0101 5
+6
0100 0110 F
0011 0110 6
+7
0100 0111 G
0011 0111 7
+8
0100 1000 H
0011 1000 8
+9
0100 1001 I
0011 1001 9
–0
0111 1101 }
0101 1101 ], 0010 0001 !, 0011 1010 :
–1
0100 1010 J
–2
0100 1011 K
–3
0100 1100 L
–4
0100 1101 M
–5
0100 1110 N
–6
0100 1111 O
–7
0101 0000 P
–8
0101 0001 Q
–9
0101 0010 R
Если строка является результатом операции, байт, содержащий знак и цифру, всегда будет
представлен в предпочитаемой кодировке. Если строка используется как исходные данные,
этот байт может кодироваться также приведёнными выше альтернативными способами.
Корректная перфорированная строка, подобно зонной строке, имеет длину от 0 до 31
байта включительно, что соответствует логическому размеру от 0 до 31 цифры включительно. Все цифровые полубайты должны содержать только коды цифр (комбинации 0000–1001);
байт, содержащий цифру и знак, — только один из предпочитаемых или альтернативных кодов, приведённых в таблице. В отличие от зонных строк, зонные полубайты в перфорированной строке игнорируются, а поэтому могут принимать любые значения, хотя обычным является код зоны 0011, соответствующий кодировке символов 0–9 в коде ASCII. Использование в команде некорректно закодированных операндов даёт непредсказуемый результат.
Замечания по программированию.
1. Какое отношение формат этих строк имеет к перфорации (punch), неясно. Возможно, они
отражают формат подготовки данных на перфокартах, принятый для техники DEC (конкретно на PDP-11 оборудование для работы с перфокартами использовалось уже нечасто,
но с более ранними семействами оно применялось весьма широко).
2. Перфорированная строка может иметь нулевую длину. При её использовании в качестве
источника она соответствует нулевому значению, при использовании как приёмника она
способна «принять» нулевой результат независимо от его знака, однако любой ненулевой
результат вызывает переполнение. Адрес строки нулевой длины, указанный в описателе,
игнорируется и не может вызвать, например, прерывание по нарушению защиты памяти.
98
7.3.4.4. Строки с отдельным знаком
Каждый байт строки с отдельным знаком представляет одну десятичную цифру, ещё один
байт — либо самый первый, либо самый последний в зависимости от конкретного типа строки — хранит знак числа. Адрес строки в описателе всегда указывает на адрес байта, содержащего самую старшую цифру числа, а длина строки указывает количество цифр.
Старшие полубайты цифровых байтов содержат код зоны, который равен 0011 для строки
результата операции и игнорируется для исходных операндов. В младших полубайтах содержатся коды десятичных цифр 0000–1001.
Знаковый байт может содержать лишь один из следующих двоичных кодов:
• знак «плюс» — 0010 1011 (+, предпочитаемый) или 0010 0000 (пробел, альтернативный);
• знак «минус» — 0010 1101 (–).
Корректной является строка длиной от 0 до 31 десятичной цифры включительно, с корректным значением знакового байта и с корректными значениями цифр в младших полубайтах знаковых байтов. Зонные полубайты цифровых байтов в строках-источниках игнорируются, в строке результата они будут равны 0011. Использование в команде некорректно закодированных операндов даёт непредсказуемый результат.
Замечание по программированию.
1. При использовании строк с отдельным знаком следует помнить, что физическая длина
строки на единицу превышает её длину в десятичных цифрах, указанную в описателе, а
знаковый байт в строке с начальным знаком расположен не по адресу, указанному в описателе, а по непосредственно предшествующему ему адресу: адрес в описателе всегда
указывает на байт со старшей цифрой числовой строки.
2. Строка с отдельным знаком может иметь нулевую длину. При её использовании в качестве
источника она соответствует нулевому значению, при использовании как приёмника она
способна «принять» нулевой результат с сохранением знака результата, однако любой ненулевой результат вызывает переполнение. В отличие от других типов строк, адрес строки
нулевой длины, указанный в описателе, не игнорируется, поскольку во время выполнения
команды будет производиться обращение к знаковому байту.
7.3.5. Длинные целые числа
Некоторые команды коммерческого набора работают с 32-разрядными двоичными целыми числами со знаком. Если такое число хранится в регистрах процессора, его старшая половина занимает регистр R2, а младшая половина — R3, использование других регистров невозможно.
Если длинное число хранится в памяти, то в команде задаётся адрес слова, содержащего
младшую половину числа; старшая половина находится в следующем за ним слове, т. е. слове, чей адрес на 2 больше указанного в команде.
Замечание по программированию.
Хранение двух половин целого числа в регистрах R2 и R3 совместимо с командами набора EIS, которые тоже размещают старшую половину в регистре с чётным номером, а младшую — в следующем за ним регистре с нечётным номером.
Хранение двух половин числа в памяти в порядке «младшее слово – старшее слово» соответствует порядку хранения, принятому в стандартном программном обеспечении DEC, использующем 32-разрядные целые числа.
99
7.4. Требования к состоянию для выполнения команд
Нарушение перечисленных ниже требований при попытке выполнения команд коммерческого набора приведёт к непредсказуемых последствиям.
1. Бит PSW[8] в начале выполнения команды (т. е. при её первичном инициировании, а не
при продолжении выполнения после прерывания) должен быть сброшен.
2. Указатель стека текущего режима должен содержать чётный адрес.
3. В стеке текущего режима должно быть свободно (доступно для записи) не менее 64 слов.
4. Зарезервированные части информационных полей, например, старший байт слова, содержащего символьный операнд, должны быть равны нулю.
5. Операнды-источники, включая таблицы, хранящие исходную информацию, полностью
или частично перекрываются любыми из 64 свободных слов стека текущего режима, областью операнда-приёмника или же расположены во внешней странице памяти.
6. Область операнда-приёмника полностью или частично перекрывает код команды,
встроенные в него описатели и операнды, области расположения операндов-источников,
свободную часть стека, область векторов прерываний или внешнюю страницу памяти.
7. Код команды, включая встроенные в него описатели и операнды, полностью или частично перекрывается любой частью операнда-приёмника или свободными словами стека либо размещается во внешней странице памяти.
Последние три пункта можно обобщить: выполнение команды ведёт к непредсказуемым
последствиям, если любые области памяти, используемые для её выполнения, хотя бы частично расположены во внешней странице памяти, либо если содержимое областей, из которых выполняется считывание команды и исходных данных, может быть перезаписано в ходе
её выполнения или при возникновении прерывания.
Любые допустимые отклонения от перечисленных правил указываются явным образом.
7.5. Набор команд
Коммерческий набор включает команды для обработки строк байтов (символов), которые
могут являться как текстовой информацией, так и двоично-десятичными числами. Коды команд CIS находятся в диапазоне 076000–076777. Большинство команд имеет два варианта: с
описателями обрабатываемых строк и другими операндами, размещёнными в регистрах общего назначения (так называемая регистровая форма — register form), и с описателями и операндами, размещёнными в памяти сразу за собственно кодом команды (встроенная форма —
inline form). Мнемоники команд встроенной формы отличаются от мнемоник регистровой
формы суффиксом I.
7.5.1. Команды обработки символьных строк
7.5.1.1. CMPC(I) — сравнение строк символов
CMPC
0
1
1
1
1
1
0
0
0
0
1
0
0
1
0
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
100
CMPCI
0
1
1
1
1
1
0
0
0
1
1
0
0
1
0
0
2
1
0
адрес описателя источника 1
адрес описателя источника 2
0
0
0
0
0
0
0
0
15
14
13
12
11
10
9
8
заполнитель
7
6
5
4
3
Выполняется сравнение двух строк, начиная с их наиболее значащих (самых левых)
байтов. Если операнды имеют разную длину, более короткий дополняется до размера более
длинного операнда байтом-заполнителем; значение последнего используется в качестве наименее значащих (самых правых) байтов более короткого операнда. Сравнение заканчивается
при обнаружении первой несовпадающей пары байтов либо при достижении конца более
длинной строки.
Использование регистров в регистровой форме команды:
• R0, R1 — описатель первого операнда;
• R2, R3 — описатель второго операнда;
• R4 — нуль в старшем байте, значение заполнителя в младшем байте.
Состояние флагов условий после выполнения команды:
• N установлен, если рассматриваемый как число со знаком байт первого операнда меньше
соответствующего байта второго операнда;
• Z установлен, если операнды равны (при этом биты N, V и C будут сброшены);
• V установлен, если при сравнении как чисел со знаком первой отличающейся пары
байтов возникло арифметическое переполнение;
• C установлен при возникновении во время сравнения первой отличающейся пары байтов
заёма в старший разряд (технически — при отсутствии переноса из старшего разряда), т.
е. если байт второго операнда как число без знака больше байта первого операнда.
Концептуально эти команды считывают очередные байты исходных строк и сравнивают
их между собой. Если байты равны, производится увеличение адресов на единицу и уменьшение длин на единицу, после чего выборка и сравнение повторяются. Если одна из исходных строк закончилась, т. е. её длина стала нулевой, дальнейшее изменение полей длины и
адреса в её описателе не производится, а в качестве байта для сравнения используется значение заполнителя. Сравнение продолжается до завершения обоих строк либо до обнаружения
первой несовпадающей пары байтов. Флаги устанавливаются по результату последнего выполненного сравнения, причём сравнение выполняется вычитанием байта второго операнда
из байта первого операнда, т. е. точно так же, как при выполнении команды CMPB.
При окончании выполнения команды регистровой формы регистры R0, R1 и R2, R3 будут
содержать описатели подстрок с адресами, указывающими на первые (самые левые) несовпадающие символы исходных строк, и длинами этих оставшихся подстрок. Если несовпадение
обнаружено уже после завершения более короткой строки, описатель последней будет содержать нулевую длину и адрес, указывающий на первый байт за концом исходной строки. Если
строки равны, то описатели обеих строк будут содержать нулевые длины и адреса, указывающие на первые байты за концами исходных строк.
7.5.1.2. LOCC(I) — поиск символа в строке
LOCC
0
1
1
1
1
1
0
0
0
0
1
0
0
0
0
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
101
LOCCI
0
1
1
1
1
1
0
0
0
1
1
0
0
0
0
0
2
1
0
адрес описателя источника
0
0
0
0
0
0
0
0
15
14
13
12
11
10
9
8
символ
7
6
5
4
3
Выполняется поиск указанного символа (байта) в заданной строке, начиная с её левого
края (с наименьшего адреса).
Использование регистров в регистровой форме команды:
• R0, R1 — описатель исходной строки;
• R4 — нуль в старшем байте, искомый символ в младшем байте.
При завершении команды независимо от её формы в регистрах R0, R1 возвращается описатель части исходной строки, начинающейся с найденного символа. Если заданного символа
в строке нет, возвращается описатель пустой строки: длина в регистре R0 равна нулю, а адрес
в регистре R1 указывает на первый байт после конца исходной строки. Если искомым является первый символ строки, описатель в R0 и R1 совпадает с описателем исходной строки.
Состояние флагов условий отражает конечное значение регистра R0:
• N установлен, если старший бит R0 установлен;
• Z установлен, если R0 содержит нуль, т. е. если найти требуемый символ не удалось;
• V сброшен;
• C сброшен.
Замечание по программированию.
Если строка пустая, сразу возвращается результат, указывающий на неудачный поиск
(флаг Z установлен, все остальные флаги сброшены, описатель строки не изменён).
7.5.1.3. MATC(I) — поиск подстроки
MATC
0
1
1
1
1
1
0
0
0
0
1
0
0
1
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
1
0
0
1
0
1
5
4
3
2
1
0
MATCI
0
адрес описателя строки
адрес описателя подстроки
15
14
13
12
11
10
9
8
7
6
В строке, заданной первым описателем, выполняется поиск подстроки, заданной вторым
описателем. Поиск будет успешным, если в строке найден участок, полностью совпадающий
с искомой подстрокой.
Использование регистров в регистровой форме команды:
• R0, R1 — описатель строки;
• R2, R3 — описатель подстроки.
Если найти подстроку удалось, после окончания выполнения команды независимо от её
формы в регистровой паре R0:R1 будет находиться описатель части исходной строки, начинающейся с символа, который совпал с первым символом искомой подстроки; длина этой части
102
исходной строки будет меньше длины исходной строки на столько символов, сколько было
пропущено с её начала до обнаружения искомой подстроки.
Если найти подстроку не удалось, после окончания выполнения команды независимо от
её формы в регистровой паре R0:R1 будет находиться описатель строки с нулевой длиной, адрес которой равен адресу первого символа, следующего непосредственно за исходной строкой.
Состояние флагов условий после выполнения команды:
• N установлен, если старший разряд регистра R0 после завершения выполнения команды
установлен;
• Z установлен, если регистр R0 после выполнения команды содержит нуль, т. е. если поиск был безуспешен;
• V сброшен;
• C сброшен.
Замечания по программированию.
1. Поиск пустой подстроки в непустой исходной строке всегда будет успешен (флаг Z будет
сброшен), при этом в R0:R1 будет возвращён описатель исходной строки.
2. Поиск в пустой исходной строке всегда будет неудачным (флаг Z будет установлен). В
R0:R1 возвращается описатель этой пустой строки.
7.5.1.4. MOVC(I) — пересылка строки символов
MOVC
0
1
1
1
1
1
0
0
0
0
0
1
1
0
0
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
0
1
1
0
0
0
2
1
0
MOVCI
0
адрес описателя источника
адрес описателя приёмника
0
0
0
0
0
0
0
0
15
14
13
12
11
10
9
8
заполнитель
7
6
5
4
3
Выполняется пересылка строки из области источника в область приёмника. При необходимости строка дополняется справа символами-заполнителями.
Использование регистров в регистровой форме команды:
• R0, R1 — описатель строки-источника;
• R2, R3 — описатель строки-приёмника;
• R4 — нуль в старшем байте, значение заполнителя в младшем байте.
После завершения выполнения команды в регистровой форме регистры R1, R2, R3 будут
содержать нули, а в регистре R0 будет находиться количество символов исходной строки, не
поместившееся в строке результата. Если строка результата достаточно длинная, чтобы вместить все исходные символы, R0 будет содержать нуль.
Состояние флагов условий после выполнения команды отражает соотношение длины исходной строки и длины строки результата. Технически значения флагов формируются таким
образом, как если бы была выполнена команда сравнения (CMP) длины исходной строки и
длины результата:
103
• N установлен, если при вычитании длины результата из длины источника было получено
отрицательное значение (старший бит 16-разрядной разности установлен);
• Z установлен, если при вычитании длин получен нулевой результат;
• V установлен, если при вычитании длин возникло переполнение;
• C установлен, если при вычитании длин возник заём в старший разряд.
Замечания по программированию.
1. Пересылка будет выполнена корректно независимо от того, перекрываются ли исходная
строка и строка результата. Концептуально можно считать, что сначала производится считывание всей исходной строки, а потом запись результата.
2. Если исходная строка пустая, строка-приёмник будет целиком заполнена заданным символом-заполнителем.
3. Если установлен флаг C, это означает, что приёмник длиннее источника и поэтому был
дополнен символом-заполнителем.
Если флаги C и Z сброшены, это означает, что приёмник короче источника.
Если установлен флаг Z, это означает, что источник и приёмник имеют одинаковую длину.
7.5.1.5. MOVRC(I) — пересылка строки символов с выравниванием по
правому краю
MOVRC
0
1
1
1
1
1
0
0
0
0
0
1
1
0
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
0
0
0
1
0
1
1
0
0
1
2
1
0
MOVRCI
0
1
адрес описателя источника
адрес описателя приёмника
0
0
0
0
0
0
0
0
15
14
13
12
11
10
9
8
заполнитель
7
6
5
4
3
Выполняется пересылка строки из области источника в область приёмника. Логически
она начинается с самых правых символов источника и приёмника. При необходимости строка
приёмника дополняется слева символами-заполнителями.
Использование регистров в регистровой форме команды:
• R0, R1 — описатель строки-источника;
• R2, R3 — описатель строки-приёмника;
• R4 — нуль в старшем байте, значение заполнителя в младшем байте.
После завершения выполнения команды в регистровой форме регистры R1, R2, R3 будут
содержать нули, а в регистре R0 будет находиться количество символов исходной строки, не
поместившееся в строке результата. Если строка результата достаточно длинная, чтобы вместить все исходные символы, R0 будет содержать нуль.
Состояние флагов условий после выполнения команды отражает соотношение длины исходной строки и длины строки результата. Технически значения флагов формируются таким
образом, как если бы была выполнена команда сравнения (CMP) длины исходной строки и
длины результата:
104
• N установлен, если при вычитании длины результата из длины источника было получено
отрицательное значение (старший бит 16-разрядной разности установлен);
• Z установлен, если при вычитании длин получен нулевой результат;
• V установлен, если при вычитании длин возникло переполнение;
• C установлен, если при вычитании длин возник заём в старший разряд.
Замечания по программированию.
1. Пересылка будет выполнена корректно независимо от того, перекрываются ли исходная
строка и строка результата. Концептуально можно считать, что сначала производится считывание всей исходной строки, а потом запись результата.
2. Если исходная строка пустая, строка-приёмник будет целиком заполнена заданным символом-заполнителем.
3. Если установлен флаг C, это означает, что приёмник длиннее источника и поэтому был
дополнен символом-заполнителем.
Если флаги C и Z сброшены, это означает, что приёмник короче источника.
Если установлен флаг Z, это означает, что источник и приёмник имеют одинаковую длину.
7.5.1.6. MOVTC(I) — пересылка строки символов с преобразованием
MOVTC
0
1
1
1
1
1
0
0
0
0
0
1
1
0
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
0
0
0
1
0
1
1
0
0
1
2
1
0
MOVTCI
0
1
адрес описателя источника
адрес описателя приёмника
0
0
0
0
0
0
0
0
заполнитель
адрес таблицы преобразования
15
14
13
12
11
10
9
8
7
6
5
4
3
Выполняется пересылка строки из области источника в область приёмника. При необходимости строка приёмника дополняется слева символами-заполнителями.
Каждый символ, считанный из исходной строки, рассматривается как индекс в заданной
256-байтной таблице. В строку-приёмник вместо данного символа строки-источника помещается байт, считанный из таблицы.
Использование регистров в регистровой форме команды:
• R0, R1 — описатель строки-источника;
• R2, R3 — описатель строки-приёмника;
• R4 — нуль в старшем байте, значение заполнителя в младшем байте;
• R5 — адрес 256-байтной таблицы.
После завершения выполнения команды в регистровой форме регистры R1, R2, R3 будут
содержать нули, а в регистре R0 будет находиться количество символов исходной строки, не
поместившееся в строке результата. Если строка результата достаточно длинная, чтобы вместить все исходные символы, R0 будет содержать нуль.
105
Состояние флагов условий после выполнения команды отражает соотношение длины исходной строки и длины строки результата. Технически значения флагов формируются таким
образом, как если бы была выполнена команда сравнения (CMP) длины исходной строки и
длины результата:
• N установлен, если при вычитании длины результата из длины источника было получено
отрицательное значение (старший бит 16-разрядной разности установлен);
• Z установлен, если при вычитании длин получен нулевой результат;
• V установлен, если при вычитании длин возникло переполнение;
• C установлен, если при вычитании длин возник заём в старший разряд.
Замечания по программированию.
1. Пересылка будет выполнена корректно независимо от того, перекрываются ли исходная
строка и строка результата. Концептуально можно считать, что сначала производится считывание всей исходной строки, а потом запись результата.
Если область приёмника перекрывает таблицу перекодирования, результат будет непредсказуемым.
2. Если исходная строка пустая, строка-приёмник будет целиком заполнена заданным символом-заполнителем.
3. Если установлен флаг C, это означает, что приёмник длиннее источника и поэтому был
дополнен символом-заполнителем.
Если флаги C и Z сброшены, это означает, что приёмник короче источника.
Если установлен флаг Z, это означает, что источник и приёмник имеют одинаковую длину.
7.5.1.7. SCANC(I) — поиск символа из набора
SCANC
0
1
1
1
1
1
0
0
0
0
1
0
0
0
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
0
0
0
1
1
0
0
0
1
0
4
3
2
1
0
SCANCI
0
1
адрес описателя строки
адрес описателя набора символов
15
14
13
12
11
10
9
8
7
6
5
Выполняется поиск в строке любого символа из заданного набора символов.
Использование регистров в регистровой форме команды:
• R0, R1 — описатель строки;
• R4, R5 — описатель набора символов.
После завершения поиска в регистрах R0, R1 будет находиться описатель части исходной
строки, начинающейся с первого символа, принадлежащего набору. Если исходная строка не
содержит ни одного символа, принадлежащего набору, R0 будет равен нулю, а R1 будет указывать на первый символ за концом строки.
Состояние флагов условий после выполнения команды отражает итоговое значение регистра R0:
• N установлен, если старший бит R0 установлен;
106
• Z установлен, если содержимое R0 равно нулю, т. е. если символов, входящих в набор, в
составе строки нет;
• V сброшен;
• C сброшен.
Замечания по программированию.
1. Если исходная строка пуста, поиск не выполняется и сразу возвращается результат, указывающий на отсутствие искомого символа (флаг Z установлен, остальные флаги сброшены, описатель строки не изменён).
2. Если 256-байтовая таблица, описывающая набор символов, не находится целиком в доступной памяти, попытка выполнения команды приведёт к непредсказуемым последствиям, в том числе в случае, когда поиск реально выполняться не будет.
7.5.1.8. SKPC(I) — пропуск символа
LOCC
0
1
1
1
1
1
0
0
0
0
1
0
0
0
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
1
0
0
0
0
1
2
1
0
LOCCI
0
адрес описателя источника
0
0
0
0
0
0
0
0
15
14
13
12
11
10
9
8
символ
7
6
5
4
3
Выполняется поиск первого символа (байта) строки, отличающегося от заданного символа, что логически соответствует пропуску всех повторений заданного символа.
Использование регистров в регистровой форме команды:
• R0, R1 — описатель исходной строки;
• R4 — нуль в старшем байте, искомый символ в младшем байте.
При завершении команды независимо от её формы в регистрах R0, R1 возвращается описатель части исходной строки, начинающейся с первого символа, отличающегося от заданного. Если такого символа в строке нет, возвращается описатель пустой строки: длина в регистре R0 равна нулю, а адрес в регистре R1 указывает на первый байт после конца исходной
строки. Если отличающимся является первый символ строки, описатель в R0 и R1 совпадает
с описателем исходной строки.
Состояние флагов условий отражает конечное значение регистра R0:
• N установлен, если установлен старший бит R0;
• Z установлен, если R0 содержит нуль, т. е. если найти отличающийся символ не удалось;
• V сброшен;
• C сброшен.
Замечание по программированию.
Если исходная строка пуста, возвращается результат, указывающий на наличие в строке
только заданного символа (флаг Z установлен, остальные флаги сброшены, описатель строки
не изменён).
107
7.5.1.9. SPANC(I) — пропуск символов из набора
SPANC
0
1
1
1
1
1
0
0
0
0
1
0
0
0
1
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
0
0
0
1
1
0
0
0
1
1
4
3
2
1
0
SPANCI
0
1
адрес описателя строки
адрес описателя набора символов
15
14
13
12
11
10
9
8
7
6
5
Выполняется поиск первого символа (байта) строки, не относящегося к заданному набору символов. Логически эта команда выполняет пропуск всех заданных символов строки.
Использование регистров в регистровой форме команды:
• R0, R1 — описатель строки;
• R4, R5 — описатель набора символов.
После завершения поиска в регистрах R0, R1 будет находиться описатель части исходной
строки, начинающейся с первого символа, не принадлежащего набору. Если исходная строка
состоит лишь из символов, входящих в набор, R0 будет равен нулю, а R1 будет указывать на
первый символ за концом строки.
Состояние флагов условий после выполнения команды отражает итоговое значение регистра R0:
• N установлен, если старший бит R0 установлен;
• Z установлен, если содержимое R0 равно нулю, т. е. если все символы строки входят в заданный набор;
• V сброшен;
• C сброшен.
Замечания по программированию.
1. Если исходная строка пуста, возвращается результат, указывающий на отсутствие в строке символов, не входящих в набор (флаг Z установлен, остальные флаги сброшены, описатель строки не изменён).
2. Если 256-байтовая таблица, описывающая набор символов, не находится целиком в доступной памяти, попытка выполнения команды приведёт к непредсказуемым последствиям, в том числе в случае, когда поиск реально выполняться не будет.
7.5.2. Команды обработки десятичных строк
7.5.2.1. ADDN(I), ADDP(I) — сложение десятичное
ADDN
0
1
1
1
1
1
0
0
0
0
1
0
1
0
0
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
108
ADDP
0
1
1
1
1
1
0
0
0
0
1
1
1
0
0
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
1
0
1
0
0
0
ADDNI
0
адрес описателя источника 1
адрес описателя источника 2
адрес описателя приёмника
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
1
1
1
0
0
0
4
3
2
1
0
ADDPI
0
адрес описателя источника 1
адрес описателя источника 2
адрес описателя приёмника
15
14
13
12
11
10
9
8
7
6
5
Производится сложение значений операндов-источников, результат сохраняется в операнде-приёмнике. Команды ADDN и ADDNI складывают числовые строки (зонные, перфорированные или с отдельным знаком), команды ADDP и ADDPI — упакованные.
Использование регистров в регистровой форме команд:
• R0, R1 — описатель источника 1;
• R2, R3 — описатель источника 2;
• R4, R5 — описатель приёмника.
После завершения выполнения команды в регистровой форме регистры R0–R3 будут обнулены.
Состояние флагов после завершения выполнения команды отражает итоговый результат:
• N установлен, если результат меньше нуля;
• Z установлен, если результат равен нулю;
• V установлен, если возникло переполнение, т. е. если не все значащие цифры результата
поместились в отведённое поле;
• C сброшен.
Замечания по программированию.
1. Исходные операнды могут перекрываться, если при этом оба остаются корректными десятичными строками соответствующего типа.
2. Исходные операнды и результат могут перекрываться лишь в случае, если соответствующие цифры операндов представлены одним и тем же байтом памяти.
7.5.2.2. ASHN(I), ASHP(I) — арифметический сдвиг числовых строк
ASHN
0
1
1
1
1
1
0
0
0
0
1
0
1
1
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
109
ASHP
0
1
1
1
1
1
0
0
0
0
1
1
1
1
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
1
0
1
1
1
0
ASHNI
0
адрес описателя источника
адрес описателя приёмника
описатель сдвига
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
1
1
1
1
1
0
5
4
3
2
1
0
ASHPI
0
адрес описателя источника
адрес описателя приёмника
описатель сдвига
15
14
13
12
11
10
9
8
7
6
Производится сдвиг значения источника на заданное количество десятичных разрядов и
запись результата в приёмник.
Описатель сдвига указывает количество и направление выполняемых сдвигов, а также содержит значение цифры, используемой для округления результата. Он имеет следующий формат:
0
15
14
цифра
13
12
11
10
9
счётчик сдвига
8
7
6
5
4
3
2
1
0
Счётчик сдвига рассматривается как число со знаком в диапазоне от –128 10 до +12710.
Если он положителен, сдвиг выполняется влево, если отрицателен — вправо. Если счётчик
равен нулю, сдвиг как таковой не выполняется, и исходный операнд пересылается в поле результата. С математической точки зрения, счётчик сдвига — это показатель степени числа 10,
на которую умножается исходный операнд.
Освобождающиеся при сдвиге цифры заполняются нулями.
При сдвиге вправо после завершения собственно сдвига выполняется округление. Для
этого к самой старшей из выдвинутых (теряемых) цифр исходного числа прибавляется значение цифры округления. Если результат сложения меньше 10, результат сдвига записывается в
поле приёмника в неизменном виде. Если же при сложении получено значение 10 или
больше, к результату сдвига прибавляется единица, и в область приёмника записывается результат этого сложения. Если необходимо выполнить сдвиг без округления, следует задать нулевое значение цифры округления.
Использование регистров в регистровой форме команд:
• R0, R1 — описатель источника;
• R2, R3 — описатель приёмника;
• R4 — описатель сдвига.
После завершения выполнения команды в регистровой форме регистры R0, R1 и R4 будут обнулены.
Состояние флагов после завершения выполнения команды отражает итоговый результат:
110
• N установлен, если результат меньше нуля;
• Z установлен, если результат равен нулю;
• V установлен, если возникло переполнение, т. е. если не все значащие цифры результата
поместились в отведённое поле;
• C сброшен.
7.5.2.3. CMPN(I), CMPP(I) — сравнение числовых строк
CMPN
0
1
1
1
1
1
0
0
0
0
1
0
1
0
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
CMPP
0
1
1
1
1
1
0
0
0
0
1
1
1
0
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
1
0
1
0
1
0
CMPNI
0
адрес описателя источника 1
адрес описателя источника 2
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
1
1
1
0
1
0
4
3
2
1
0
CMPPI
0
адрес описателя источника 1
адрес описателя источника 2
15
14
13
12
11
10
9
8
7
6
5
Производится сравнение двух десятичных чисел.
Использование регистров в регистровой форме команд:
• R0, R1 — описатель источника 1;
• R2, R3 — описатель источника 2.
После завершения выполнения команды в регистровой форме регистры R0–R3 будут обнулены.
По результату сравнения устанавливаются флаги условий:
• N установлен, если первый операнд меньше второго;
• Z установлен, если операнды равны;
• V сброшен;
• C сброшен.
7.5.2.4. DIVP(I) — деление упакованных строк
DIVP
0
1
1
1
1
1
0
0
0
0
1
1
1
1
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
111
DIVPI
0
1
1
1
1
1
0
0
0
1
1
1
1
1
0
1
4
3
2
1
0
адрес описателя источника 1
адрес описателя источника 2
адрес описателя приёмника
15
14
13
12
11
10
9
8
7
6
5
Источник 2 делится на источник 1, и частное помещается в поле приёмника. Остаток от
деления теряется.
Использование регистров в регистровой форме команд:
• R0, R1 — описатель источника 1 (делителя);
• R2, R3 — описатель источника 2 (делимого);
• R4, R5 — описатель приёмника.
После завершения выполнения команды в регистровой форме регистры R0–R3 будут обнулены.
По результату сравнения устанавливаются флаги условий:
• N установлен, если результат меньше нуля;
• Z установлен, если результат равен нулю;
• V установлен, если значащие цифры частного не вмещаются в поле приёмника или если
делитель равен нулю;
• C установлен, если делитель равен нулю.
Замечание по программированию.
При делении на нуль устанавливаются флаги C и V, при этом содержимое поля приёмника не определено.
7.5.2.5. MULP(I) — умножение упакованных строк
MULP
0
1
1
1
1
1
0
0
0
0
1
1
1
1
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
1
1
1
1
0
1
4
3
2
1
0
MULPI
0
адрес описателя источника 1
адрес описателя источника 2
адрес описателя приёмника
15
14
13
12
11
10
9
8
7
6
5
Значения операндов-источников перемножаются, произведение записывается в поле
приёмника.
Использование регистров в регистровой форме команд:
• R0, R1 — описатель источника 1;
• R2, R3 — описатель источника 2;
• R4, R5 — описатель приёмника.
После завершения выполнения команды в регистровой форме регистры R0–R3 будут обнулены.
112
•
•
•
•
По результату сравнения устанавливаются флаги условий:
N установлен, если результат меньше нуля;
Z установлен, если результат равен нулю;
V установлен, если значащие цифры произведения не вмещаются в поле приёмника;
C сброшен.
7.5.2.6. SUBN(I), SUBP(I) — вычитание числовых строк
SUBN
0
1
1
1
1
1
0
0
0
0
1
0
1
0
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
SUBP
0
1
1
1
1
1
0
0
0
0
1
1
1
0
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
1
0
1
0
0
1
SUBNI
0
адрес описателя источника 1
адрес описателя источника 2
адрес описателя приёмника
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
1
0
0
0
1
1
1
1
0
0
1
4
3
2
1
0
SUBPI
0
адрес описателя источника 1
адрес описателя источника 2
адрес описателя приёмника
15
14
13
12
11
10
9
8
7
6
5
Производится вычитание значения источника 1 из значения источника 2, результат сохраняется в операнде-приёмнике. Команды SUBN и SUBNI вычитают числовые строки (зонные,
перфорированные или с отдельным знаком), команды SUBP и SUBPI — упакованные.
Использование регистров в регистровой форме команд:
• R0, R1 — описатель источника 1;
• R2, R3 — описатель источника 2;
• R4, R5 — описатель приёмника.
После завершения выполнения команды в регистровой форме регистры R0–R3 будут обнулены.
Состояние флагов после завершения выполнения команды отражает итоговый результат:
• N установлен, если результат меньше нуля;
• Z установлен, если результат равен нулю;
• V установлен, если возникло переполнение, т. е. если не все значащие цифры результата
поместились в отведённое поле;
• C сброшен.
113
Замечания по программированию.
1. Исходные операнды могут перекрываться, если при этом оба остаются корректными десятичными строками соответствующего типа.
2. Исходные операнды и результат могут перекрываться лишь в случае, если соответствующие цифры операндов представлены одним и тем же байтом памяти.
7.5.3. Команды преобразования десятичных строк
7.5.3.1. CVTLN(I), CVTLP(I) — преобразование длинного целого в
десятичную строку
CVTLN
0
1
1
1
1
1
0
0
0
0
1
0
1
1
1
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
CVTLP
0
1
1
1
1
1
0
0
0
0
1
1
1
1
1
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
0
0
0
1
1
0
1
1
1
1
CVTLNI
0
1
адрес описателя приёмника
адрес источника
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
0
0
0
1
1
1
1
1
1
1
5
4
3
2
1
0
CVTLPI
0
1
адрес описателя приёмника
адрес источника
15
14
13
12
11
10
9
8
7
6
Производится преобразование 32-разрядного двоичного целого числа со знаком в десятичную строку указанного формата.
Использование регистров в регистровой форме команд:
• R0, R1 — описатель приёмника;
• R2, R3 — исходное длинное целое число со знаком (старшая половина находится в R2,
младшая половина — в R3).
После завершения выполнения команды в регистровой форме регистры R2–R3 будут содержать нуль.
В командах со встроенными операндами первое дополнительное слово содержит обычный адрес описателя строки-приёмника результата, а второе дополнительное слово — адрес
исходного двоичного числа, занимающего два слова в памяти (этот адрес указывает на слово,
содержащее младшую половину исходного числа, старшая половина расположена в следующем слове).
Флаги условий устанавливаются по результату преобразования:
114
•
•
•
•
N установлен, если результат имеет знак «минус»;
Z установлен, если результат равен нулю;
V установлен, если не все значащие цифры результата поместились в область приёмника;
C сброшен.
7.5.3.2. CVTNL(I), CVTPL(I) — преобразование десятичной строки в
длинное целое
CVTNL
0
1
1
1
1
1
0
0
0
0
1
0
1
0
1
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
CVTPL
0
1
1
1
1
1
0
0
0
0
1
1
1
0
1
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
0
0
0
1
1
0
1
0
1
1
CVTNLI
0
1
адрес описателя источника
адрес приёмника
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
0
0
0
1
1
1
1
0
1
1
5
4
3
2
1
0
CVTPLI
0
1
адрес описателя источника
адрес приёмника
15
14
13
12
11
10
9
8
7
6
Производится преобразование десятичной строки указанного формата в 32-разрядное
двоичное целое число со знаком.
Использование регистров в регистровой форме команд:
• R0, R1 — описатель приёмника.
После завершения выполнения команды в регистровой форме регистры R0–R1 будут содержать нуль, а в регистрах R2–R3 будет находиться результат преобразования (старшая половина размещается в R2, младшая половина — в R3).
В командах со встроенными операндами первое дополнительное слово содержит обычный адрес описателя строки-источника, а второе дополнительное слово — адрес двухсловной
области памяти, куда будет помещён результат преобразования (этот адрес указывает на слово, которое будет содержать младшую половину результата, старшая половина записывается
в следующее слово).
Флаги условий устанавливаются по результату преобразования:
• N установлен, если результат имеет знак «минус»;
• Z установлен, если результат равен нулю;
• V установлен, если результат преобразования не может быть корректно представлен в виде 32-разрядного двоичного целого числа в дополнительном коде;
115
• C установлен, если исходное число меньше нуля и полученное 32-разрядное двоичное
число не равно нулю.
Замечания по программированию.
1. В правилах установки флага C полной уверенности нет.
2. В случае переполнения в качестве результата сохраняются 32 младших бита его истинного значения; старшие значащие биты, включая знак, теряются.
3. Флаги N и Z характеризуют значение, помещаемое в 32-разрядное поле результата, а не
истинный результат преобразования. Например, если исходное значение равно +2 31, т. е.
+2'147'48З'64810, 32-разрядным результатом преобразования будет шестнадцатеричное
значение 80000000, т. е. максимальное отрицательное число. Вследствие этого будут
установлены флаги V (корректный результат не поместился в 32 бита) и N (результат —
отрицательное число), а флаги Z и C будут сброшены.
7.5.3.3. CVTNP(I), CVTPN(I) — преобразование числовой строки в
упакованную или наоборот
CVTNP
0
1
1
1
1
1
0
0
0
0
1
0
1
1
0
1
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
CVTPN
0
1
1
1
1
1
0
0
0
0
1
0
1
1
0
0
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
0
0
0
1
1
0
1
1
0
1
CVTNPI
0
1
адрес описателя источника
адрес описателя приёмника
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
1
1
1
0
0
0
1
1
0
1
1
0
0
5
4
3
2
1
0
CVTPNI
0
1
адрес описателя источника
адрес описателя приёмника
15
14
13
12
11
10
9
8
7
6
Команды CVNP и CVNPI выполняют преобразование числовой строки (зонной, перфорированной или с отдельным знаком) в упакованную, а команды CVPN и CVPNI — упакованной
строки в числовую.
Использование регистров в регистровой форме команд:
• R0, R1 — описатель источника;
• R2, R3 — описатель приёмника.
После завершения выполнения команды в регистровой форме регистры R0–R1 будут содержать нуль.
116
•
•
•
•
Флаги условий устанавливаются по результату преобразования:
N установлен, если результат имеет знак «минус»;
Z установлен, если результат равен нулю;
V установлен, если поле результата слишком мало, чтобы вместить все значащие цифры;
C сброшен.
7.5.4. Команды загрузки описателей
7.5.4.1. L2Dr — загрузка двух описателей
L2Dr
0
1
1
1
1
1
0
0
0
0
0
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
регистр
2
1
0
В регистровые пары R0:R1 и R2:R3 загружаются из памяти два описателя.
Содержимое регистра, указанное в команде, задаёт адрес двух слов в памяти. Первое из
этих слов содержит адрес первого описателя, второе слово — адрес второго описателя. В
процессе выборки адресов описателей содержимое регистра увеличивается, как если бы использовалась автоинкрементная адресация. Таким образом, после завершения загрузки адресов описателей содержимое регистра будет на 4 больше его начального значения.
После загрузки адресов описателей производится загрузка самих описателей в регистровые пары R0:R1 и R2:R3; младшее слово области описателя в памяти попадает в младший
регистр пары, старшее слово — в старший.
Флаги не изменяются.
Замечания по программированию.
1. Если в команде указан один из регистров R0–R3, он используется для выборки адресов
описателей, после чего его содержимое будет заменено одним из слов описателей. Если
указывается один из регистров R4–R7, его содержимое будет увеличено на 4 по сравнению с исходным значением.
2. Поскольку PC (R7) входит в число регистров, которые можно указать в команде, адреса
описателей можно разместить прямо в потоке команд:
L2D7
.WORD
.WORD
CMPN
SRC1
SRC2
;
;
;
;
Загрузка описателей, адреса которых указаны регистром PC
Адрес первого описателя
Адрес второго описателя
Команда, для выполнения которой были загружены описатели
7.5.4.2. L3Dr — загрузка трёх описателей
L2Dr
0
1
1
1
1
1
0
0
0
0
1
1
0
15
14
13
12
11
10
9
8
7
6
5
4
3
регистр
2
1
0
В регистровые пары R0:R1, R2:R3 и R4:R5 загружаются из памяти три описателя.
Содержимое регистра, указанное в команде, задаёт адрес трёх слов в памяти, содержащих адреса соответственно первого, второго и третьего описателей. В процессе выборки адресов описателей содержимое регистра увеличивается, как если бы использовалась автоинкрементная адресация. Таким образом, после завершения загрузки адресов описателей содержимое регистра будет на 6 больше его начального значения.
117
После загрузки адресов описателей производится загрузка самих описателей в регистровые пары R0:R1, R2:R3 и R4:R5; младшее слово области описателя в памяти попадает в
младший регистр пары, старшее слово — в старший.
Флаги не изменяются.
Замечания по программированию.
1. Если в команде указан один из регистров R0–R5, он используется для выборки адресов
описателей, после чего его содержимое будет заменено одним из слов описателей. Если
указывается один из регистров R6 или R7 (SP или PC), его содержимое будет увеличено
на 6 по сравнению с исходным значением.
2. Поскольку PC (R7) входит в число регистров, которые можно указать в команде, адреса
описателей можно разместить прямо в потоке команд:
L3D7
.WORD
.WORD
.WORD
ADDN
118
SRC1
SRC2
DST
;
;
;
;
;
Загрузка описателей, адреса которых указаны регистром PC
Адрес первого описателя
Адрес второго описателя
Адрес третьего описателя
Команда, для выполнения которой были загружены описатели
8. Прочие средства и возможности
8.1. Загрузчик и эмулятор пульта
У всех «классических» моделей PDP-11 программа загрузки размещается в постоянном
запоминающем устройстве, технически нередко входящим в состав центрального процессора, хотя логически являющимся внешним устройством, занимающим группу адресов в старших 8 Кбайтах физического адресного пространства. Однако ни размер этой программы, ни
её положение не стандартизированы. Например, объем ПЗУ загрузчика на СМ-1420 составляет 2 Кбайта, но оно разбито на четыре страницы по 512 байт, отображаемые на адреса
173000–173777; переключение страниц осуществляется записью в разряды 7:6 слова с адресом 173024. Объем ПЗУ на СМ-1600 составляет 1 Кбайт; технически оно состоит из двух независимых половин, занимающих адреса адреса 173000–173777 и 165000–165777.
Программа загрузки получает управление в результате сброса, для чего, как правило,
аппаратно формируется запрос прерывания по вектору 173024. В результате процессор считывает из ПЗУ, расположенного в этом диапазоне адресов, новые значения PSW и PC, после
чего начинает выполнение программы загрузки.
После завершения тестовой программы, проверяющей работу основных команд ЦП, загрузчик выводит на консольный терминал приглашение ввести команду эмулятора пульта или
имя устройства, с которого должна выполняться загрузка.
Эмулятор пульта на многих советских машинах поддерживает четыре команды:
• L адрес — загрузка адреса очередной ячейки памяти;
• D значение — изменение содержимого очередной ячейки и увеличение адреса на 2;
• E — отображение содержимого очередной ячейки и увеличение адреса на 2;
• S — пуск процессора с адреса очередной ячейки.
Начальная загрузка СМ-1420 возможна со следующих устройств:
• кассетных дисков типа СМ-5402 (DK) ёмкостью около 2,5 Мбайт;
• кассетных дисков типа СМ-5408 (DM) ёмкостью примерно 14 Мбайт;
• пакетных дисков типа СМ-5407 (DP) ёмкостью примерно 27 Мбайт;
• гибких дисков типа СМ-5603 (DX);
• магнитных лент типа СМ-5302 (MT);
• перфолент типа СМ-6203 (PR).
Для загрузки оператор вводит двухсимвольное имя устройства и необязательный номер
от 0 до 7, например: «DM1». Если номер не указан, он считается равным нулю.
Нередко предоставляется возможность с помощью перемычек задать начальный адрес
выполнения программы загрузчика что позволяет вместо передачи управления эмулятору
пульта сразу начать загрузку с определённого внешнего устройства.
8.2. Сетевой таймер
Большинство как американских, так и советских ЭВМ оснащены так называемым сетевым таймером — внешним устройством, вырабатывающим запросы прерывания с частотой
питающей электросети (50 или 60 Гц в зависимости от страны). На PDP-11/20 он был представлен необязательным устройством с шифром KW11-L, но в большинстве моделей таймер
де-факто обязателен (хотя некоторые модели допускают использование не сетевого, а так называемого программируемого таймера, частота которого задаётся программно). Технически
сетевой таймер обычно входит в состав процессора, хотя логически является внешним
устройством. На СМ-1420 и, вероятно, многих других ЭВМ он выполнен на одной печатной
плате с ПЗУ начального загрузчика.
119
С точки зрения программиста таймер представлен единственным регистром, расположенным по адресу 177546 и имеющим следующий формат:
15
14
13
12
11
10
9
8
T
E
7
6
5
4
3
2
1
0
Бит T (разряд 7) устанавливается аппаратно по очередному перепаду напряжения в сети,
т. е. с частотой 50 или 60 Гц. Сброс происходит при сбросе шины или при считывании содержимого регистра.
Бит E (разряд 6) разрешает прерывание от таймера. Когда он установлен, по очередному
перепаду напряжения в сети возникает прерывание, обычно имеющее приоритет 6 и использующее вектор 100. Этот разряд устанавливается и сбрасывается программно; сброс шины
обнуляет его.
8.3. Консольный терминал
Как правило, у машины имеется хотя бы один терминал, используемый как в процессе загрузки, так и при дальнейшей работе в качестве консоли операционной системы. Технически
фирмой DEC было выпущено довольно много различных моделей терминалов, в СССР и
других странах социалистического блока выпускались свои терминалы, в значительной степени совместимые с аппаратурой DEC (как правило, основное различие заключалось в наличии символов кириллицы вместо малых английских букв и некоторых специальных символов). Независимо от конкретной модели терминала взаимодействие программы с ним выполняется с помощью четырёх регистров:
• регистр состояния ввода — 177560;
• регистр данных ввода — 177562;
• регистр состояния вывода — 177564;
• регистр данных вывода — 177566.
Ввод и вывод данных осуществляется побайтно, используя младшие байты соответствующих регистров.
Точная интерпретация данных, выводимых на терминал, зависит от конкретной модели;
скажем, терминалы на основе дисплеев поддерживают тот или иной набор команд, которые
отсутствуют у терминалов на основе телетайпов. Однако передача кодов печатных символов
вызывает отображение или печать соответствующего символа и перемещение к позиции следующего символа, а управляющие коды «возврат каретки» и «перевод строки» логически выполняются одинаково и на дисплее, и на телетайпе (пишущей машинке), благодаря чему программа, использующая лишь базовые функции терминала, может работать с терминалом любого типа.
Байты, поступающие от терминала, являются, как правило, кодами символов ASCII в соответствии с нажимаемыми клавишами. Некоторые клавиши дисплеев порождают целые последовательности кодов в зависимости от типа терминала. Однако базовый набор клавиш
формирует одинаковые коды на терминалах разных типов, что, опять-таки, обеспечивает
переносимость программ.
Формат регистров состояния может несколько отличаться в зависимости от типа терминала и интерфейса, связывающего машину с терминалом, но основные разряды у них совпадают:
• установленный бит 7 означает готовность устройства принять или передать очередной
байт данных. Для ввода он свидетельствует о наличии очередного байта в регистре данных, для вывода — о том, что регистр данных пуст и в него можно записывать очередной
байт. Считывание регистра ввода или запись в регистр вывода сбрасывает бит 7 соответствующего регистра состояния;
120
• установленный бит 6 разрешает прерывание, запрос которого формируется, если бит 7
соответствующего регистра состояния установлен.
Для прерывания по наличию символа в регистре ввода используется вектор 60, для прерывания по пустому регистру вывода — вектор 64.
Заметим, что такой же набор регистров (или половина набора) используется для многих
других устройств, логически выполняющих побайтовый обмен данными — принтеров, перфоленточных устройств ввода и вывода и т. д. Использование битов 6 и 7 регистра команд и
состояния (CSR) как разрешения прерывания и признака готовности является типичным вообще для всех устройств PDP-11 независимо от их типа.
121
Приложение 1. Коды команд
В следующей таблице перечислены коды всех команд, за исключением предназначенных
для диагностики, технического обслуживания или эмуляции определённых функций на конкретных моделях ЭВМ. Графа «Набор» показывает принадлежность команды в конкретному
набору:
• пустое поле — команда имеется во всех реализациях;
• EIS — команда относится к набору EIS;
• FIS — команда относится к набору FIS;
• FPP — команда относится к процессору с плавающей запятой;
• CIS — команда входит в коммерческий набор;
• * — команда не входит в какой-либо определённый набор, но имеется не во всех реализациях.
Код
Команда
0 000 000 000 000 000
HALT
Останов
0 000 000 000 000 001
WAIT
Ожидание прерывания
0 000 000 000 000 010
RTI
Возврат из прерывания
0 000 000 000 000 011
BPT
Программное прерывание
0 000 000 000 000 100
IOT
Программное прерывание
0 000 000 000 000 101
RESET
Сброс устройств на шине
0 000 000 000 000 110
RTT
Возврат из прерывания с игнорированием бита T
*
0 000 000 000 000 111
MFPT
Получение модели процессора
*
0 000 000 000 001 000
0 000 000 000 111 111
Функция
резерв
0 000 000 001 ddd ddd
JMP
Безусловный переход абсолютный
0 000 000 010 000 rrr
RTS
Возврат из подпрограммы
0 000 000 010 001 000
0 000 000 010 010 111
0 000 000 010 011 nnn
резерв
SPL
Установка приоритета процессора
0 000 000 010 1sn zvc управление Установка или сброс флагов N, Z, V, C
флагами
0 000 000 011 ddd ddd
SWAB
0 000 000 1oo ooo ooo
BR
Безусловный переход относительный
0 000 001 0oo ooo ooo
BNE
Переход по «не равно»
0 000 001 1oo ooo ooo
BEQ
Переход по «равно»
0 000 010 0oo ooo ooo
BGE
Переход по «больше или равно» для знаковых операций
122
Набор
Обмен байтов слова
*
Код
Команда
Функция
0 000 010 1oo ooo ooo
BLT
Переход по «меньше» для знаковых операций
0 000 011 0oo ooo ooo
BGT
Переход по «больше» для знаковых операций
0 000 011 1oo ooo ooo
BLE
Переход по «меньше или равно» для знаковых операций
0 000 100 rrr ddd ddd
JSR
Переход к подпрограмме
0 000 101 000 ddd ddd
CLR
Очистка
0 000 101 001 ddd ddd
COM
Инверсия
0 000 101 010 ddd ddd
INC
Инкремент
0 000 101 011 ddd ddd
DEC
Декремент
0 000 101 100 ddd ddd
NEG
Смена знака
0 000 101 101 ddd ddd
ADC
Сложение с переносом
0 000 101 110 ddd ddd
SBC
Вычитание заёма
0 000 101 111 ddd ddd
TST
Проверка
0 000 110 000 ddd ddd
ROR
Циклический сдвиг вправо
0 000 110 001 ddd ddd
ROL
Циклический сдвиг влево
0 000 110 010 ddd ddd
ASR
Арифметический сдвиг вправо
0 000 110 011 ddd ddd
ASL
Арифметический сдвиг влево
0 000 110 100 nnn nnn
MARK
Возврат из подпрограммы с очисткой
стека
*
0 000 110 101 sss sss
MFPI
Пересылка из пространства команд предыдущего режима
*
0 000 110 110 ddd ddd
MTPI
Пересылка в пространство команд предыдущего режима
*
0 000 110 111 ddd ddd
SXT
Расширение знака
*
0 000 111 000 ddd ddd
CSM
Вызов супервизора
*
0 000 111 001 xxx xxx
резерв
0 000 111 010 ddd ddd
TSTSET
Проверка и установка
*
0 000 111 011 ddd ddd
WRTLCK
Запись с блокировкой
*
0 000 111 100 000 000
0 000 111 111 111 111
Набор
резерв
0 001 sss sss ddd ddd
MOV
Пересылка
0 010 sss sss ddd ddd
CMP
Сравнение
0 011 sss sss ddd ddd
BIT
Проверка битов
0 100 sss sss ddd ddd
BIC
Сброс битов
123
Код
Команда
0 101 sss sss ddd ddd
BIS
Установка битов
0 110 sss sss ddd ddd
ADD
Сложение
0 111 000 ddd sss sss
MUL
Умножение
EIS
0 111 001 ddd sss sss
DIV
Деление
EIS
0 111 010 rrr sss sss
ASH
Арифметический сдвиг многоразрядный
EIS
0 111 011 rrr sss sss
ASHC
Арифметический сдвиг двойного слова
многоразрядный
EIS
0 111 100 ddd sss sss
XOR
Исключающее или
0 111 101 000 000 rrr
FADD
Сложение вещественное
FIS
0 111 101 000 001 rrr
FSUB
Вычитание вещественное
FIS
0 111 101 000 010 rrr
FMUL
Умножение вещественное
FIS
0 111 101 000 011 rrr
FDIV
Деление вещественное
FIS
0 111 101 000 100 000
0 111 110 000 001 111
Функция
Набор
*
резерв
0 111 110 000 010 rrr
L2Dr
Загрузка двух описателей
CIS
0 111 110 000 011 000
MOVC
Пересылка строки символов
CIS
0 111 110 000 011 001
MOVRC
Пересылка строки символов с выравниванием по правому краю
CIS
0 111 110 000 011 010
MOVTC
Пересылка строки символов с преобразованием
CIS
0 111 110 000 011 011
0 111 110 000 011 111
резерв
0 111 110 000 100 000
LOCC
Поиск символа в строке
CIS
0 111 110 000 100 001
SKPC
Пропуск символа
CIS
0 111 110 000 100 010
SCANC
Поиск символа из набора
CIS
0 111 110 000 100 011
SPANC
Пропуск символа из набора
CIS
0 111 110 000 100 100
CMPC
Сравнение строк
CIS
0 111 110 000 100 101
MATC
Поиск подстроки
CIS
0 111 110 000 100 110
0 111 110 000 100 111
резерв
0 111 110 000 101 000
ADDN
Сложение числовых строк
CIS
0 111 110 000 101 001
SUBN
Вычитание числовых строк
CIS
0 111 110 000 101 010
CMPN
Сравнение числовых строк
CIS
0 111 110 000 101 011
CVTNL
Преобразование числовой строки в длинное целое
CIS
124
Код
Команда
0 111 110 000 101 100
CVTPN
Преобразование упакованной строки в
числовую
CIS
0 111 110 000 101 101
CVTNP
Преобразование числовой строки в упакованную
CIS
0 111 110 000 101 110
ASHN
Арифметический сдвиг числовой строки
CIS
0 111 110 000 101 111
CVTLN
Преобразование длинного целого в числовую строку
CIS
0 111 110 000 110 rrr
L3Dr
Загрузка трёх описателей
CIS
0 111 110 000 111 000
ADDP
Сложение упакованных строк
CIS
0 111 110 000 111 001
SUBP
Вычитание упакованных строк
CIS
0 111 110 000 111 010
CMPP
Сравнение упакованных строк
CIS
0 111 110 000 111 011
CVTPL
Преобразование упакованной строки в
длинное целое
CIS
0 111 110 000 111 100
MULP
Умножение упакованных строк
CIS
0 111 110 000 111 101
DIVP
Деление упакованных строк
CIS
0 111 110 000 111 110
ASHP
Арифметический сдвиг упакованных
строк
CIS
0 111 110 000 111 111
CVTLP
Преобразование длинного целого в упакованную строку
CIS
Пересылка строки символов
CIS
0 111 110 001 000 000
0 111 110 001 010 111
Функция
Набор
резерв
0 111 110 001 011 000
MOVCI
0 111 110 001 011 001
MOVRCI
Пересылка строки символов с выравниванием по правому краю
CIS
0 111 110 001 011 010
MOVTCI
Пересылка строки символов с преобразованием
CIS
0 111 110 001 011 011
0 111 110 001 011 111
резерв
0 111 110 001 100 000
LOCCI
Поиск символа в строке
CIS
0 111 110 001 100 001
SKPCI
Пропуск символа
CIS
0 111 110 001 100 010
SCANCI
Поиск символа из набора
CIS
0 111 110 001 100 011
SPANCI
Пропуск символа из набора
CIS
0 111 110 001 100 100
CMPCI
Сравнение строк
CIS
0 111 110 001 100 101
MATCI
Поиск подстроки
CIS
125
Код
0 111 110 001 100 110
0 111 110 001 100 111
Команда
Функция
Набор
резерв
0 111 110 001 101 000
ADDNI
Сложение числовых строк
CIS
0 111 110 001 101 001
SUBNI
Вычитание числовых строк
CIS
0 111 110 001 101 010
CMPNI
Сравнение числовых строк
CIS
0 111 110 001 101 011
CVTNLI
Преобразование числовой строки в длинное целое
CIS
0 111 110 001 101 100
CVTPNI
Преобразование упакованной строки в
числовую
CIS
0 111 110 001 101 101
CVTNPI
Преобразование числовой строки в упакованную
CIS
0 111 110 001 101 110
ASHNI
Арифметический сдвиг числовой строки
CIS
0 111 110 001 101 111
CVTLNI
Преобразование длинного целого в числовую строку
CIS
0 111 110 001 110 000
0 111 110 001 110 111
резерв
0 111 110 001 111 000
ADDPI
Сложение упакованных строк
CIS
0 111 110 001 111 001
SUBPI
Вычитание упакованных строк
CIS
0 111 110 001 111 010
CMPPI
Сравнение упакованных строк
CIS
0 111 110 001 111 011
CVTPLI
Преобразование упакованной строки в
длинное целое
CIS
0 111 110 001 111 100
MULPI
Умножение упакованных строк
CIS
0 111 110 001 111 101
DIVPI
Деление упакованных строк
CIS
0 111 110 001 111 110
ASHPI
Арифметический сдвиг упакованных
строк
CIS
0 111 110 001 111 111
CVTLPI
Преобразование длинного целого в упакованную строку
CIS
0 111 110 010 000 000
0 111 110 111 111 111
резерв
0 111 111 rrr ooo ooo
SOB
Переход по счётчику
1 000 000 0oo ooo ooo
BPL
Переход по «плюс»
1 000 000 1oo ooo ooo
BMI
Переход по «минус»
1 000 001 0oo ooo ooo
BHI
Переход по «больше» для беззнаковой
операции
1 000 001 1oo ooo ooo
BLOS
Переход по «меньше или равно» для беззнаковой операции
1 000 010 0oo ooo ooo
BVC
Переход по отсутствию переполнения
126
*
Код
Команда
Функция
Набор
1 000 010 1oo ooo ooo
BVS
Переход по переполнению
1 000 011 0oo ooo ooo
BCC
BHIS
Переход по отсутствию переноса или
переход по «больше или равно» для беззнаковой операции
1 000 011 1oo ooo ooo
BCS
BLO
Переход по переносу или переход по
«меньше» для беззнаковой операции
1 000 100 0nn nnn nnn
EMT
Программное прерывание
1 000 100 1nn nnn nnn
TRAP
Программное прерывание
1 000 101 000 ddd ddd
CLRB
Очистка байта
1 000 101 001 ddd ddd
COMB
Инверсия байта
1 000 101 010 ddd ddd
INCB
Инкремент байта
1 000 101 011 ddd ddd
DECB
Декремент байта
1 000 101 100 ddd ddd
NEGB
Смена знака байта
1 000 101 101 ddd ddd
ADCB
Сложение с переносом байта
1 000 101 110 ddd ddd
SBCB
Вычитание заёма из байта
1 000 101 111 ddd ddd
TSTB
Проверка байта
1 000 110 000 ddd ddd
RORB
Циклический сдвиг вправо байта
1 000 110 001 ddd ddd
ROLB
Циклический сдвиг влево байта
1 000 110 010 ddd ddd
ASRB
Арифметический сдвиг вправо байта
1 000 110 011 ddd ddd
ASLB
Арифметический сдвиг влево байта
1 000 110 100 sss sss
MTPS
Пересылка в слово состояния
*
1 000 110 101 sss sss
MFPD
Пересылка из пространства данных предыдущего режима
*
1 000 110 110 ddd ddd
MTPD
Пересылка в пространство данных предыдущего режима
*
1 000 110 111 ddd ddd
MFPS
Пересылка из слова состояния
*
1 000 111 xxx xxx xxx
резерв
1 001 sss sss ddd ddd
MOVB
Пересылка байта
1 010 sss sss ddd ddd
CMPB
Сравнение байта
1 011 sss sss ddd ddd
BITB
Проверка битов байта
1 100 sss sss ddd ddd
BICB
Сброс битов байта
1 101 sss sss ddd ddd
BISB
Установка битов байта
1 110 sss sss ddd ddd
SUB
Вычитание
1 111 000 000 000 000
CFCC
Копирование флажков ППЗ во флажки ЦП
FPP
1 111 000 000 000 001
SETF
Установка режима вещественных чисел
одиночной точности
FPP
127
Код
Команда
Функция
Набор
1 111 000 000 000 010
SETI
Установка режима коротких целых чисел
FPP
1 111 000 000 000 011
1 111 000 000 001 000
резерв
1 111 000 000 001 001
SETD
Установка режима вещественных чисел
двойной точности
FPP
1 111 000 000 001 010
SETL
Установка режима длинных целых чисел
FPP
1 111 000 000 001 011
1 111 000 000 111 111
резерв
1 111 000 001 sss sss
LDFPS
Загрузка слова состояния ППЗ
FPP
1 111 000 010 ddd ddd
STFPS
Сохранение слова состояния ППЗ
FPP
1 111 000 011 ddd ddd
STST
Сохранение состояния ППЗ
FPP
1 111 000 100 ddd ddd
CLRF/D
Очистка вещественная
FPP
1 111 000 101 ddd ddd
TSTF/D
Проверка вещественная
FPP
1 111 000 110 ddd ddd
ABSF/D
Абсолютная величина вещественная
FPP
1 111 000 111 ddd ddd
NEGF/D
Смена знака вещественная
FPP
1 111 001 0aa sss sss
MULF/D
Умножение вещественное
FPP
1 111 001 1aa sss sss
MODF/D
Умножение вещественное с получением
целого
FPP
1 111 010 0aa sss sss
ADDF/D
Сложение вещественное
FPP
1 111 010 1aa sss sss
LDF/D
Загрузка вещественная
FPP
1 111 011 0aa sss sss SUBF/D
Вычитание вещественное
FPP
1 111 011 1aa sss sss
CMPF/D
Сравнение вещественное
FPP
1 111 100 0aa ddd ddd
STF/D
Сохранение вещественного
FPP
1 111 100 1aa sss sss
DIVF/D
Деление вещественное
FPP
1 111 101 0aa ddd ddd
STEXP
Запись порядка
FPP
1 111 101 1aa ddd ddd STCFI/L Сохранение вещественного с преобразоSTCDI/L ванием в целое
FPP
1 111 110 0aa ddd ddd
STCFD
STCDF
Сохранение вещественного с изменением
точности
FPP
1 111 110 1aa sss sss
LDEXP
Загрузка порядка
FPP
1 111 111 0aa sss sss LDCIF/D Загрузка целого с преобразованием в веLDCLF/D щественное
FPP
1 111 111 1aa sss sss
FPP
128
LDCFD
LDCDF
Загрузка вещественного с изменением
точности
Приложение 2. Векторы прерываний
В следующей таблице приведены значения векторов прерываний, определённые архитектуры, а также типичные значения векторов для стандартных внешних устройств. Следует, однако, помнить, что векторы прерываний, как и адреса блоков регистров почти любых внешних устройств могут быть изменены.
Вектор
Назначение
000
Резерв
004
Обращение по несуществующему адресу, нечетный адрес или переполнение стека
010
Недопустимый код операции или привилегированная команда
014
Прерывание по биту трассировки или по команде BPT
020
Прерывание по команде IOT
024
Прерывание по сбою питания
030
Прерывание по команде EMT
034
Прерывание по команде TRAP
040-054 Резерв. RSX-11M использует эти ячейки для хранения различной системной информации
060
Клавиатура консольного терминала
064
Дисплей консольного терминала
070
Устройство ввода с перфоленты PC11
074
Устройство вывода на перфоленту PC11
100
Сетевой таймер KW11-L
104
Программируемый таймер KW11-P
110
114
Прерывание по ошибке памяти
120
Графопостроитель XY11
124
Интерфейс прямого доступа к памяти DR11-B (DA11-B)
130
Подсистема аналого-цифрового преобразования AD01
134
Аналоговая подсистема AFC11
140
Дисплей AA11
144
Световое перо дисплея AA11
150-164 Резерв
170
Зарезервировано для пользователя; прерывание от спецпроцессора комплекса
СМ-1600
174
Резерв
200
Печатающее устройство LP11/LS11
204
Контроллер дисков с фиксированными головками RS04/RF11
210
Контроллер дисков RC11
129
Вектор
Назначение
214
Контроллер магнитных лент DECtape TC11
220
Контроллер дисков RK11
224
Контроллер НМЛ TU11/TM11/TS03
230
Устройство ввода с перфокарт CD11/CM11/CR11
234
Подсистема цифрового управления UDC11
240
Программно инициированные запросы прерываний по регистру PIRQ
244
Ошибка FPU
250
Ошибка MMU
254
Контроллер пакетных магнитных дисков RP04/RP11
260
Контроллер накопителя на кассетных магнитных лентах TA11
264
Контроллер гибких дисков RX11
270–374 Резерв для пользователя
130
Приложение 3. Адреса регистров и устройств
В следующей таблице приведены адреса регистров, определённые архитектуры, а также
типичные значения адресов регистров для стандартных внешних устройств. Последние при
необходимости могут быть изменены.
Адрес
Назначение
177776 Слово состояния процессора PSW
177774 Регистр предела стека SL
177772 Регистр программных запросов прерывания PIRQ
177770
…
177720
177717 Указатель стека режима пользователя на трёхрежимных машинах
177716
Указатель стека режима пользователя на двухрежимных машинах; указатель стека
режима супервизора на трёхрежимных машинах
177715 Регистр общего назначения 5 набора 1
177714 Регистр общего назначения 4 набора 1
177713 Регистр общего назначения 3 набора 1
177712 Регистр общего назначения 2 набора 1
177711 Регистр общего назначения 1 набора 1
177710 Регистр общего назначения 0 набора 1
177707 Счётчик команд PC
177706 Указатель стека режима ядра
177705 Регистр общего назначения 5 набора 0
177704 Регистр общего назначения 4 набора 0
177703 Регистр общего назначения 3 набора 0
177702 Регистр общего назначения 2 набора 0
177701 Регистр общего назначения 1 набора 0
177700 Регистр общего назначения 0 набора 0
177676
…
Регистры PAR пространства данных пользователя
177660
177656
…
Регистры PAR пространства команд пользователя
177640
177636
…
Регистры PDR пространства данных пользователя
177620
131
Адрес
Назначение
177616
…
Регистры PDR пространства команд пользователя
177600
177576 Регистр MMR2/SR2
177574 Регистр MMR1/SR1
177572 Регистр MMR0/SR0
177570 Регистр консольных переключателей SWR; регистр консольных индикаторов
177566
…
Консольный терминал
177560
177556
…
Перфоленточные устройства ввода и вывода PC11 и PR11
177550
177546 Сетевой таймер KW11-L
177544
…
KU116-AA, UCS
177540
177536
…
177520
177516
Печатающее устройство LP11/LS11/LV11
177514
177512
…
177504
177502
Контроллер НКМЛ TA11
177500
177476
…
Контроллер НМД RK06 либо контроллеры НМД RF11 и RC11
177440
177436
…
Переключатель шины DT11
177420
177416
…
Контроллер НМД RK11
177400
177376
…
DC14-D
177360
177356
…
Контроллер НМЛ TC11
177340
132
Адрес
Назначение
177336
…
Расширитель арифметики (EAE) KE11-A №2
177320
177316
…
Расширитель арифметики (EAE) KE11-A №1
177300
177276
…
177174
177172
Контроллер НГМД RX11
177170
177166
…
Регистры устройств ввода с перфокарт CR11, CM11, CD11
177160
177156
…
176774
176772
…
Регистры подсистемы аналого-цифрового преобразования AD01
176770
176766
…
Регистры дисплея AA11 №1
176756
176754
176752
…
Контроллер НМД RP04 или RP11
176700
176676
…
KL11, DL11-A,B №1–16
176500
176476
…
Дисплеи AA11 №2–5
176400
176376
…
176300
176276
…
DX11
176200
176176
…
DL11-C,D,E №1–31
175610
133
Адрес
Назначение
175606
…
175600
175576
…
DS11 №1–4
175400
175376
…
DN11 №1–16
175200
175176
…
DM11 №1–16
175000
174776
…
DP11 №1–32
174400
174376
…
DC11 №1–32
174000
173776
…
Область ПЗУ начального загрузчика и эмулятора пульта
173000
172776
…
Перфоратор PA611
172700
172676
…
Считыватель PA611
172600
172576
…
AFC11
172570
172566
…
172560
172556
…
Графопостроитель XY11
172550
172546
…
Программируемый таймер KW11-P
172540
172536
…
Контроллер НМЛ TM11
172520
172516 Регистр MMR3/SR3
134
Адрес
Назначение
172514
…
172500
172476
…
Контроллер НМЛ TU16
172440
172436
…
DR11-B №2
172430
172426
…
172420
172416
…
DR11-B №1
172410
172406
…
172400
172376
…
Регистры PAR пространства данных режима системы
172360
172356
…
Регистры PAR пространства команд режима системы
172340
172336
…
Регистры PDR пространства данных режима системы
172320
172316
…
Регистры PDR пространства команд режима системы
172300
172276
…
Регистры PAR пространства данных режима супервизора
172260
172256
…
Регистры PAR пространства команд режима супервизора
172240
172236
…
Регистры PDR пространства данных режима супервизора
172220
172216
…
Регистры PDR пространства команд режима супервизора
172200
135
Адрес
Назначение
172176
…
172140
172136
…
Регистры ошибок чётности памяти
172100
172076
…
Контроллер НМД RS04
172040
172036
…
172020
172016
…
GT40 №2
172010
172006
…
GT40 №1
172000
171776
…
UDC11
171000
170776
…
KG11 №1–8
170700
170676
…
DM11-BB №1–16
170500
170476
…
170460
170456 Регистр дескриптора состояния спецпроцессора комплекса СМ-1600
170454 Регистр управления и состояния спецпроцессора комплекса СМ-1600
177452
…
170440
170436
…
LPS11
170400
170376
170374
136
Адрес
Назначение
170372
…
Регистры устройства отображения шины
170200
170176
170000
167776
…
DR11-C №1
167770
167766
…
DR11-C №2
167760
167756
…
DR11-C №3
167750
167746
…
166000
165776
…
Вторая область ПЗУ начального загрузчика и эмулятора пульта
165000
164776
…
160000
137