stringtranslate.com

Архитектура PDP-11

Архитектура PDP-11 [1] — это 16-битная архитектура набора инструкций CISC (ISA), разработанная Digital Equipment Corporation (DEC). Она реализована центральными процессорами (ЦП) и микропроцессорами, используемыми в мини-компьютерах PDP-11 . Она широко использовалась в 1970-х годах, но в конечном итоге была вытеснена более мощной архитектурой VAX в 1980-х годах.

Память

Форматы данных

Наименьшая единица адресуемой и записываемой памяти — 8-битный байт . Байты также могут храниться в нижней половине регистров R0 — R5.

16-битные слова хранятся в порядке от младшего к младшему с младшими байтами по нижнему адресу. Слова всегда выравниваются по четным адресам памяти. Слова могут храниться в регистрах R0 — R7.

32-битные двойные слова в расширенном наборе инструкций (EIS) могут храниться только в парах регистров, при этом нижнее слово хранится в регистре с меньшим номером. Двойные слова используются инструкциями MUL, DIV и ASHC. Другие 32-битные данные поддерживаются как расширения базовой архитектуры: данные с плавающей точкой в ​​наборе инструкций FPU или длинные данные в коммерческом наборе инструкций хранятся в более чем одном формате, включая необычный формат middle-endian [2] [3], иногда называемый «PDP-endian».

64-битный формат чисел с плавающей запятой двойной точности поддерживается опцией процессора с плавающей запятой (FPP) для 11/45 и большинства последующих моделей.

Управление памятью

16-битные адреса PDP-11 могут адресовать 64  КБ . К тому времени, как PDP-11 уступил место VAX, 8-битные байты и шестнадцатеричная запись стали стандартом в отрасли; однако числовые значения на PDP-11 всегда используют восьмеричную запись, а объем памяти, подключенной к PDP-11, всегда указывается как количество слов. Базовое логическое адресное пространство составляет 32 КБ слов, но верхние 4 КБ физического адресного пространства (адреса с 160000 8 по 177777 8 при отсутствии управления памятью) не заполняются, поскольку регистры ввода-вывода на шине отвечают на адреса в этом диапазоне. Поэтому изначально полностью расширенный PDP-11 имел 28 КБ слов, или 56 КБ в современных терминах.

Процессор резервирует нижние адреса памяти для двухсловных векторов, которые дают счетчик программ и слово состояния процессора, с которых начинается процедура обслуживания. Когда устройство ввода-вывода прерывает программу, оно помещает адрес своего вектора на шину, чтобы указать, какая процедура обслуживания должна взять управление на себя. Самые нижние векторы — это процедуры обслуживания для обработки различных типов ловушек. Ловушки возникают при некоторых ошибках программы, таких как попытка выполнить неопределенную инструкцию; а также когда программа выполняет инструкцию, такую ​​как BPT, EMT, IOT или TRAP, чтобы запросить обслуживание у операционной системы.

Расширение памяти

В течение жизни PDP-11 16-битное логическое адресное пространство становилось все более ограничивающим фактором. Для его обхода использовались различные методы:

Регистры ЦП

Центральный процессор содержит восемь 16-битных регистров общего назначения (R0–R7). Регистр R7 — это счетчик программ (PC). Хотя любой регистр может использоваться в качестве указателя стека, R6 — это указатель стека (SP), используемый для аппаратных прерываний и ловушек. R5 часто используется для указания на текущий кадр вызова процедуры. Для ускорения переключения контекста некоторые модели PDP-11 предоставляют двойные наборы регистров R0–R5. Режимы ядра, супервизора (где они есть) и пользователя имеют отдельные карты памяти, а также отдельные указатели стека (чтобы пользовательская программа не могла вызвать сбой в работе системы, сохранив недопустимое значение в регистре указателя стека).

Режимы адресации

Большинство инструкций выделяют шесть бит для указания операнда. Три бита выбирают один из восьми режимов адресации, а три бита выбирают общий регистр.

Кодировка режима адресации шестибитного операнда выглядит следующим образом:


В следующих разделах каждый элемент включает пример того, как операнд будет записан на языке ассемблера. Rn означает один из восьми регистров, обозначаемых как R0 — R7.

Режимы адресации общих регистров

Следующие восемь режимов могут быть применены к любому общему регистру. Их эффекты при применении к R6 (указатель стека, SP) и R7 (счетчик программ, PC) изложены отдельно в следующих разделах.

В индексном и индексном отложенном режимах X — это 16-битное значение, взятое из второго слова инструкции. В двухоперандных инструкциях оба операнда могут использовать эти режимы. Такие инструкции имеют длину в три слова.

Операции автоинкремента и автодекремента в регистре выполняются на 1 в байтовых инструкциях, на 2 в словарных инструкциях и на 2 всякий раз, когда используется отложенный режим, поскольку величина, к которой обращается регистр, является указателем (словом).

Режимы адресации счетчика программ

Когда указан R7 (счетчик программ), четыре режима адресации естественным образом дают полезные эффекты:

Единственное распространенное использование абсолютного режима, синтаксис которого сочетает в себе немедленный и отложенный режим, — это указание регистров ввода/вывода, поскольку регистры для каждого устройства имеют определенные адреса памяти. Относительный режим имеет более простой синтаксис и более типичен для ссылки на переменные программы и назначения переходов. Программа, которая использует относительный режим (и относительный отложенный режим) исключительно для внутренних ссылок, является позиционно-независимой ; она не содержит никаких предположений о своем собственном местоположении, поэтому ее можно загрузить в произвольное место памяти или даже переместить, без необходимости корректировать ее адреса для отражения ее местоположения ( переместить ). При вычислении таких адресов относительно текущего местоположения процессор выполнял перемещение на лету.

Непосредственный и абсолютный режимы — это просто автоинкремент и автоинкремент отложенного режима, соответственно, применяемые к PC. Когда вспомогательное слово находится «в инструкции», как указано в таблице выше, PC для следующей инструкции автоматически увеличивается после вспомогательного слова. Поскольку PC всегда указывает на слова, операция автоинкремента всегда выполняется на 2.

Режимы адресации стека

R6, также обозначаемый как SP, используется как аппаратный стек для ловушек и прерываний. Соглашение, навязываемое набором режимов, предоставляемых PDP-11, заключается в том, что стек растет вниз — в сторону меньших адресов — по мере помещения в него элементов. Когда режим применяется к SP или к любому регистру, который программист выбирает для использования в качестве программного стека, режимы адресации имеют следующие эффекты:

Хотя программные стеки могут содержать байты, SP всегда является стеком слов. Операции автоинкремента и автодекремента на SP всегда выполняются на 2.

Набор инструкций

PDP-11 работает с байтами и словами. Байты указываются номером регистра, идентифицирующим младший байт регистра, или ячейкой памяти. Слова указываются номером регистра или ячейкой памяти младшего байта, которая должна быть четным числом. В большинстве инструкций, которые принимают операнды, бит 15 устанавливается для указания адресации байта или очищается для указания адресации слова. В списках в следующих двух разделах программист на языке ассемблера добавляет B к символу инструкции для указания операции с байтом; например, MOV становится MOVB.

Некоторые инструкции, например MARK и SOB, не были реализованы в некоторых моделях PDP-11.

Инструкции с двумя операндами

Старшие четыре бита определяют операцию, которая должна быть выполнена (при этом бит 15 обычно выбирает адресацию слова или байта). Две группы по шесть бит определяют режим адресации исходного операнда и режим адресации целевого операнда, как определено выше.

Инструкции ADD и SUB используют адресацию слов и не имеют байт-ориентированных вариаций.

Некоторые двухоперандные инструкции используют операнд режима адресации и дополнительный операнд регистра:

Если используется пара регистров (ниже обозначается как «(Reg, Reg+1)», первый регистр содержит младшую часть операнда и должен быть четным регистром. Следующий регистр с большим номером содержит старшую часть операнда (или остаток). Исключением является инструкция умножения; Reg может быть нечетным, но если это так, старшие 16 бит результата не сохраняются.

Инструкции с одним операндом

Старшие десять бит определяют операцию, которая должна быть выполнена, причем бит 15 обычно выбирает адресацию байта или слова. Одна группа из шести бит определяет операнд, как определено выше.

Инструкции по отделению

В большинстве инструкций ветвления выбор перехода зависит от состояния кодов условий. Инструкции ветвления обычно предшествует инструкция CMP с двумя операндами (сравнение) или BIT (тест бита) или инструкция TST с одним операндом (тест). Арифметические и логические инструкции также устанавливают коды условий. В отличие от процессоров Intel в архитектуре x86 , инструкции MOV также устанавливают их, поэтому инструкция ветвления может использоваться для перехода в зависимости от того, было ли перемещенное значение нулевым или отрицательным.

Старший байт инструкции определяет операцию. Биты с 9 по 15 являются кодом операции, а бит 8 является значением расчета кода условия, который приводит к выполнению перехода. Младший байт является смещением знакового слова относительно текущего местоположения счетчика программ. Это позволяет выполнять прямые и обратные переходы в коде.

Ограниченный диапазон инструкций ветвления означал, что по мере роста кода целевые адреса некоторых ветвлений становились недостижимыми. Программист менял однословную инструкцию BR на двухсловную инструкцию JMP из следующей группы. Поскольку JMP не имеет условных форм, программист менял BEQ на BNE, которая разветвлялась вокруг JMP.

SOB (Subtract One and Branch) — еще одна инструкция условного перехода. Указанный регистр уменьшается на 1, и если результат не равен нулю, выполняется обратный переход на основе смещения 6-битного слова.

Инструкции подпрограммы

JSR вызывает подпрограмму. Группа из шести бит определяет режим адресации. Инструкция JSR может сохранять любой регистр в стеке и загружать этот регистр с адресом возврата. Программы, которым не нужна эта функция, указывают PC в качестве регистра ( JSR PC, address), а подпрограмма возвращает значение, используя RTS PC.

Если процедура вызывается, например, с помощью JSR R4, address, то старое значение R4 помещается на вершину стека, а адрес сразу после JSR (обычно адрес возврата) помещается в R4. Однако процедура может получить доступ к значениям, закодированным в строке, указав (R4)+, или к указателям в строке, указав @(R4)+. Автоинкрементация перемещается мимо этих данных, к точке, в которой возобновляется код вызывающей стороны. В любом случае такая процедура указывает RTS R4на возврат к своей вызывающей стороне.

Форма JSR PC,@(SP)+, которая обменивает содержимое PC с верхним элементом стека, может использоваться для реализации сопрограмм . Как только процедура помещает адрес входа сопрограммы в стек, выполнение JSR PC,@(SP)+сохраняет PC в стеке и переходит к сопрограмме. Затем обе сопрограммы могут использовать дополнительные JSR PC,@(SP)+инструкции для перехода к другой сопрограмме, где бы она ни остановилась. Это позволяет двум процедурам обмениваться управлением и возобновлять друг друга с точки предыдущего обмена.

Значение PCmoved to Reg— это адрес после инструкции JSR.

MARK используется для удаления параметров в стеке при выходе из подпрограммы. Сначала вызывающий помещает R5 в стек. Затем в стек может быть помещено до 63 аргументов длиной в слово. Затем вызывающий добавляет количество аргументов к коду операции MARK и помещает этот результат в стек. Значение SP копируется в R5. Наконец, JSR PC,addressвыполняется a для вызова подпрограммы. После выполнения своего кода подпрограмма завершается с помощью RTS R5. Это загружает значение из R5 (указывающее на инструкцию MARK в стеке) в ПК и помещает адрес возврата вызывающего в R5. Выполняется инструкция MARK. MARK умножает количество аргументов на 2, добавляет это к SP, удаляя аргументы, а затем возвращается к вызывающему с эквивалентом RTS R5. MARK необычен тем, что он помещается в стек возврата вызывающим для последующего выполнения непосредственно в стеке процедурой возврата. Инструкция MARK используется редко, поскольку ее сложную операцию можно заменить на ADD к SP. [5]

Инструкции по установке ловушек

Назначение адресов векторов ловушек и исключений

Разные инструкции

Операции с кодом состояния

Четыре кода состояния в слове состояния процессора (PSW) следующие:

Инструкции в этой группе были тем, что Digital назвала «микропрограммируемыми»: один бит в командном слове ссылался на один код условия. Ассемблер не определял синтаксис для указания каждой комбинации, но символы SCC и CCC собирали инструкцию, которая устанавливала или очищала, соответственно, все четыре кода условий.

Очистка или установка ни одного из кодов условий (коды операций 000240 и 000260 соответственно) могли бы фактически рассматриваться как инструкции без операции. Фактически, мнемоника NOP была собрана в 000240.

Непоследовательные инструкции

В течение жизни PDP-11 возникли тонкие различия в реализации инструкций и комбинаций режимов адресации, хотя ни одна реализация не считалась правильной. Несоответствия не влияли на обычное использование PDP-11.

Дополнительные наборы инструкций

Расширенный набор инструкций (EIS)

Система EIS является опцией для процессоров 11/35/40 и 11/03 и входит в стандартную комплектацию более новых процессоров.

Плавающий набор инструкций (FIS)

FIS — опция для PDP-11/35/40 и 11/03. Плавающие числа одинарной точности обрабатываются в стеке, адресуемом операндом регистра. Старшие 13 бит определяют операцию, которая должна быть выполнена. Трехбитное поле определяет, какой регистр используется в качестве указателя стека операнда с плавающей точкой. Каждое плавающее число состоит из двух слов, и каждая инструкция с плавающей точкой обрабатывает два плавающих числа, возвращая в результате одно плавающее число. Выбранный указатель стека увеличивается на шаг 4 после каждой операции.

Процессор с плавающей точкой (FPP)

Это была дополнительная опция процессора с плавающей точкой для 11/45 и большинства последующих моделей.

Набор коммерческих инструкций (CIS)

Коммерческий набор инструкций, известный как CIS или CIS11, добавляет строковые и двоично-десятичные (BCD) инструкции, используемые в COBOL и DIBOL . Он был реализован дополнительным микрокодом в 11/23/24 и дополнительным модулем в 11/44 и одной из версий 11/74. [6]

Строки представлены двумя 16-битными целыми числами, хранящимися в любых двух регистрах общего назначения, или как два 16-битных значения в последовательных местах в памяти. Одно обозначено как «n», что означает длину до 64 кБ, а другое как «A», что является указателем на начало символьных данных в памяти. Вместе пара n/A указывает местоположение и длину строки. Базовыми операциями являются MOVEC, MOVTC и MOVRC, которые перемещают символьные данные в памяти из местоположения, указанного в одной паре n/A, в местоположение во второй n/A, обе в регистрах. MOVECI, MOVTCI и MOVRCI сделали то же самое, но с местоположениями, указанными парами n/A в памяти вместо регистров. Во всех инструкциях перемещения, если источник короче назначения, то назначение дополняется, если источник длиннее, то оно усекается. Если происходит что-либо из этого, для указания этого используются флаги состояния процессора. [6]

MOVEC/MOVECI просто копирует данные из одного места в другое. MOVRC/MOVRCI переворачивает исходную строку в место назначения. MOVTC/MOVTCI преобразует символы во время копирования с помощью 256-байтовой таблицы поиска, хранящейся в третьей паре n/A, где A указывает на начало таблицы, а нижние восемь бит n являются значением, используемым для заполнения строки назначения, если исходная строка короче. Переводы используют значения символов исходной строки в качестве индексных номеров и копируют значение в таблице перевода по этому индексу в строку назначения. Это можно использовать для преобразований EBCDIC в ASCII , поместив соответствующий код символа ASCII для сопоставленных кодов EBCDIC в таблице. Символ «E» — это символ 69 в ASCII и 197 в EBCDIC, поэтому для преобразования EBCDIC в ASCII нужно создать таблицу из 256 байт с 69 в позиции 197. Когда вызывается MOVTC и в исходной строке обнаруживается 197, в новой строке выводится 97, что и выполняет преобразование. [6]

Сравнения строк обрабатываются CMPC, который устанавливает коды условий процессора на основе результатов сравнения двух строк. LOCC находит первое вхождение символа в строке, в то время как SKPC ищет первый символ, который не совпадает, например, для обрезки пробелов в начале строк. SCANC и SPANC похожи на LOCC и SKPC, но соответствуют любому символу в замаскированном наборе символов. Это можно использовать, например, для поиска следующего вхождения любого символа переноса строки, такого как VT, LF или CR. Наборы символов представляют собой таблицу из 256 байт, разделенную на подмножества. [a] Они похожи на таблицы перевода, в которых нижние восемь бит первого слова образуют маску, а второе слово указывает на начало таблицы. Маска выбирает, какие из подмножеств, до восьми, являются частью набора символов во время сравнений. Используя эту систему, можно определить наборы символов, такие как заглавные буквы, строчные буквы, цифры и т. д., а затем легко объединить их с помощью маски, например, выбрав подмножества заглавных и строчных букв для получения полного набора букв. [6]

CIS также включает набор типов данных и инструкций для работы с числами BCD. Эти данные также представлены двумя 16-битными регистрами или ячейками памяти, причем второе число является A, идентичным регистру строки. Первое слово теперь содержит четыре поля, которые описывают строковое представление данных, которое включает упакованные и распакованные цифры, обработку знака и длину строки от 0 до 16 байт. DEC называла распакованные данные, с одной цифрой на байт, «числовыми строками». Используя упакованные данные, с двумя цифрами BCD на байт, 16-байтовая строка содержала числа BCD длиной до 32 цифр. Инструкции включали ADDP/ADDN для упакованных и распакованных данных, SUBP/SUBN, ASHP/ASHN (арифметический сдвиг) и CMPP/CMPN (сравнение). Для упакованных данных доступны только MULP и DIVP. CIS также включает набор из шести инструкций (CVT) для преобразования чисел BCD между упакованными и неупакованными форматами, а также в двоичные значения и обратно. [6]

Окончательный набор инструкций предназначен для загрузки двух или трех дескрипторов строк из 2 слов во внутренние регистры, что позволяет избежать необходимости использования нескольких MOV. [6]

Доступ к слову состояния процессора (PSW)

PSW отображается на адрес памяти 177 776 и, таким образом, может обрабатываться как любые данные. Инструкции, имеющиеся на всех, кроме самых ранних PDP-11, дают программам более прямой доступ к регистру.

Доступ к другим областям памяти

На PDP-11, которые предоставляют несколько пространств инструкций и пространств данных, набор неортогональных инструкций Move предоставляет доступ к другим пространствам. Например, процедуры в операционной системе, которые обрабатывают вызовы служб времени выполнения, используют эти инструкции для обмена информацией с вызывающей стороной.

Пример кода

Следующий исходный код ассемблера PDP-11 предназначен для подпрограммы с именем , которая преобразует строку символов ASCIIZTOUPPER с нулевым завершением в верхний регистр.

Следующий исходный код ассемблера PDP-11 демонстрирует, как режимы адресации PDP-11 можно использовать для написания той же процедуры без каких-либо общих регистров.

Скорость

Скорость процессора PDP-11 зависит от модели, конфигурации памяти, кода операции и режимов адресации. Временные характеристики инструкций включают до трех компонентов: выборку/выполнение самой инструкции и время доступа к источнику и месту назначения. Последние два компонента зависят от режима адресации. Например, на PDP-11/70 (около 1975 г.) инструкция вида ADD  x (R m ), y (R n ) имела время выборки/выполнения 1,35 микросекунды плюс время источника и места назначения по 0,6 микросекунды каждое, что в итоге давало время инструкции 2,55 микросекунды. Любой случай, когда адресуемая память отсутствует в кэше, добавляет 1,02 микросекунды. Регистр-регистр ADD R m ,R n может быть выполнен из кэша за 0,3 микросекунды. Плавающая точка еще сложнее, поскольку есть некоторое перекрытие между ЦП и процессором с плавающей точкой, но в целом плавающая точка значительно медленнее. Инструкция сложения чисел с плавающей точкой одинарной точности занимает от 2,4 до 5,5 микросекунд плюс время на выборку операндов. [7]

Прерывания

PDP-11 работает с уровнем приоритета от 0 до 7, который задается тремя битами в слове состояния процессора (PSW) , а высокопроизводительные модели могут работать в нескольких режимах: Kernel (привилегированный), User (приложение) и иногда Supervisor, в соответствии с двумя битами в PSW.

Чтобы запросить прерывание, шинное устройство утверждает одну из четырех общих шинных линий, BR4 - BR7, пока процессор не ответит. Более высокие числа указывают на большую срочность, возможно, что данные могут быть потеряны или желаемый сектор может выйти из контакта с головками чтения/записи, если процессор не ответит быстро. Готовность принтера к следующему символу имеет самый низкий приоритет (BR4), так как он может оставаться готовым неопределенно долго. Если процессор работает на уровне 5, то BR6 и BR7 будут в порядке. Если процессор работает на уровне 3 или ниже, он предоставит любое прерывание; если на уровне 7, он не предоставит ни одного. Запросы шины, которые не были предоставлены, не теряются, а просто откладываются. Устройство, которому требуется обслуживание, продолжает утверждать свой запрос шины.

Всякий раз, когда прерывание превышает уровень приоритета процессора, процессор утверждает соответствующий грант шины, BG4 через BG7. Линии предоставления шины не являются общими линиями, а представляют собой последовательную цепь : вход каждого вентиля является выходом предыдущего вентиля в цепочке. Вентили находятся на каждом устройстве шины, и устройство, физически ближе к процессору, находится раньше в последовательной цепи. Если устройство сделало запрос, то при обнаружении своего входа предоставления шины оно делает вывод, что оно контролирует шину, и не передает сигнал предоставления следующему устройству на шине. Если устройство не сделало запрос, оно распространяет свой вход предоставления шины на свой выход предоставления шины, давая следующему ближайшему устройству возможность ответить. (Если устройства не занимают смежные слоты на плате процессора, «карты непрерывности предоставления», вставленные в пустые слоты, распространяют линию предоставления шины.)

Получив управление шиной, устройство сбрасывает свой запрос шины и помещает на шину адрес памяти своего двухсловного вектора. Процессор сохраняет счетчик программ (PC) и PSW, переходит в режим ядра и загружает новые значения из указанного вектора. Для устройства в BR6 новый PSW в своем векторе обычно указывает 6 в качестве нового приоритета процессора, поэтому процессор будет выполнять более срочные запросы (BR7) во время процедуры обслуживания, но откладывать запросы с тем же или более низким приоритетом. С новым PC процессор переходит к процедуре обслуживания для прерывающего устройства. Эта процедура управляет устройством, по крайней мере удаляя условие, вызвавшее прерывание. Процедура заканчивается инструкцией RTI (ReTurn from Interrupt), которая восстанавливает PC и PSW непосредственно перед тем, как процессор предоставил прерывание.

Если запрос шины выполнен с ошибкой и ни одно устройство не отвечает на предоставление шины, процессор отключается по тайм-ауту и ​​выполняет ловушку, указывающую на неисправное оборудование.

Язык ассемблера MACRO-11

Перфолента, используемая для PDP-11

MACRO-11язык ассемблера для PDP-11. Он является преемником PAL-11 (Program Assembler Loader), более ранней версии языка ассемблера PDP-11 без макросов. MACRO-11 поддерживается всеми операционными системами DEC PDP-11. Системы PDP-11 Unix также включают ассемблер (называемый « as »), структурно похожий на MACRO-11, но с другим синтаксисом и меньшим количеством функций.

Смотрите также

Примечания

  1. ^ Однобайтовая маска подразумевает наличие восьми подмножеств по 32 символа в каждом, но в документации это четко не указано.

Ссылки

  1. ^ Руководство по процессору pdp11 pdp11/04/34a/44/60/70 (PDF) . ДЕКАБРЬ 1979. Получено 13 ноября 2015 г.
  2. ^ "Глава 7". Руководство по процессору pdp11/05/10/35/40 (PDF) . ДЕКАБРЬ 1973.
  3. ^ Руководство по процессору pdp11 pdp11/04/34a/44/60/70 (PDF) . ДЕКАБРЬ 1979. стр. 421.
  4. ^ Дотцель, Гюнтер (1986). «О LSI-11, RT-11, мегабайтах памяти и Modula-2/VRS» (PDF) .
  5. ^ "The PDP11/40 Processor Handbook". Digital Equipment Corporation . Получено 16 июля 2024 г.
  6. ^ abcdef "Commercial Instruction Set". Руководство по процессору pdp11 pdp11/04/34a/44/60/70 (PDF) . ДЕКАБРЬ 1979.
  7. ^ Справочник процессора DEC PDP-11/70, 1975, Приложение C, Синхронизация команд

Дальнейшее чтение

Внешние ссылки