Команды управления программой

Управление программой заключается в ветвлении программы, в организации циклических участков и подпрограмм. В рассматриваемой системе команд для организации ветвления используются условные переходы по результатам предыдущей операции присваивания. Однако во многих случаях операция присваивания не предшествует команде перехода, и переход должен быть выполнен по результату исчисления предикатов (выработки признаков) на отношениях. Имеются две двухместные СМР (В) и BIT (В) и одна одноместная команда исчисления предикатов TST(B). Все три команды предоставляют произвольный доступ к операндам и имеются во всех моделях семейства. По команде СМР (В) производится арифметическое сравнение двух операндов без их изменения и устанавливается признак результата. Команда TST(B) проверяет знак операнда и равенство его нулю, команда BIT (В) — старший разряд и равенство нулю операнда после прикладывания к нему маски, которая представлена вторым операндом.

16 команд ветвления, выполняемые на всех моделях семейства, не изменяют признаков результата. Команда JMP осуществляет безусловный переход в любое место оперативной памяти (виртуального пространства), адрес которого определяется единственным операндом команды. Остальные 15 команд осуществляют переход в зоне ±256 байт от команды перехода. Использование такого приема позволяет разместить команду ветвления в одном слове, 8 разрядов которого занимает смещение (со знаком). Как правило, JMP занимает два слова (за исключением регистровой адресации). Это позволяет существенно сократить емкость памяти, занимаемой командами перехода. Если необходим условный переход за границу указанной зоны, используется комбинация команды условного перехода и команды JMP.

Команда BR является командой безусловного перехода. Восемь команд (BNE, BEQ, BPL, BMI, BVC, BVS, BCS (BLO), ВСС (BHIS)) осуществляют ветвления по значениям признаков Z, N, S и С отдельно независимо от значения остальных признаков, например команда BPL осуществляет переход, если N=0, a BMI, если N=1. Шесть команд (BGE, BLT, B-GT, BLE, BHI, BLOS) осуществляют ветвление по наиболее распространенным комбинациям признаков N∨V=0, ,N∀V=1, Z∨(N∀V)=0, Z∨(N∀V) = l, C∀Z=0 и C∨Z=1), что соответствует значениям предикатов на отношениях: больше или равно, меньше, меньше или равно для арифметических (знаковых) операций; больше, меньше или равно для логических (беззнаковых).

В системе команд есть четыре команды для организации циклов и подпрограмм. Команда SOB (переход по счетчику) указывает на номер регистра-счетчика, который уменьшается на 1 при каждом выполнении команды, и на величину «прыжка назад» (до 256 байт), если значение счетчика осталось положительным. Величина прыжка ограничивает применение этой команды циклами с небольшим телом. Три команды связаны с организацией подпрограмм. Команда JSR (передача управления подпрограмме) предусматривает автоматическое сохранение регистра связи, указанного в команде, в стеке, указателем которого является регистр R6, и занесение адреса возврата в этот регистр. После этого управление передается по адресу, указанному в команде. Особенно эффективно использовать в качестве регистра адреса возврата счетчик команд (R7); тогда в стеке просто запоминается адрес возврата. Однако в любом случае применение такой процедуры не требует предварительного выделения регистра для адреса возврата, что в известной степени упрощает программирование вызовов подпрограмм. Возврат из подпрограмм осуществляется командой RTS. В большинстве случаев (если не используется команда MARK) в команде RTS указывается тот же регистр связи, что и в команде JSR. В качестве этого регистра обычно используется счетчик команд R7. Команда JSR используется также для организации сопрограмм.

Команда MARK является специфической, используется редко, облегчает подпрограмме очистку стека перед выходом, если через стек передавались параметры и их число заранее не определено. Операндом этой команды является длина списка параметров (в словах). Перед передачей управления подпрограмме основная программа выполняет следующие операции:

  • сохраняет в стеке с указателем R6 содержимое регистра R5;
  • загружает в этот стек параметры;
  • загружает в стек саму команду MARK N, где N — число параметров; это может быть выполнено с помощью непосредственной адресации;
  • запоминает в регистре R5 адрес команды MARK, т. е. пересылает в регистр R5 содержимое регистра R6;
  • осуществляет переход на подпрограмму с помощью команды

После этого подпрограмма может как угодно использовать стек, но не регистр R5. Для возврата выдается команда RTS R5. При этом управление передается команде MARK, находящейся в стеке перед адресом возврата. Команда производит следующие действия:

  • смещает указатель стека вниз на N слов, освобождая стек от параметров; при этом указатель стека указывает на слово, сохраняющее состояние регистра R5 до передачи управления;
  • загружает адрес возврата, находящийся над ним в стеке, в счетчик команд R7;
  • восстанавливает состояние регистра R5, извлекая его содержимое из стека.

Для облегчения и ускорения обработки командных прерываний (т.е. передач управления, сопровождаемых перезагрузкой РСП) введены три типа командных прерываний для обычного выполнения программ и один для отладки. Передача управления с помощью прерываний позволяет, кроме смены режима для программы-обработчика прерываний, добиться большей независимости программ от расположения в памяти подпрограмм. При перемещении подпрограмм в памяти достаточно изменить адрес в векторе прерывания, не изменяя адреса в командах перехода. В системе выделено 256 команд для обращения к супервизору (ЕМТ N, где N — номер в диапазоне 0 ... 3778), 256 команд для обращения к пакетам пользователя (TRAP N, где N — номер в диапазоне 0 ... 3778) и одна для обращения к системе ввода-вывода (ЮТ).

Действие всех команд аналогично: они записывают в стек текущий номер РСП и адрес возврата, а затем загружают их из фиксированной для каждой команды пары ячеек памяти (вектора прерывания). Номер N, используемый в команде, не влияет на выполнение команды, а используется в дальнейшем обработчиком для Идентификации требуемых от него услуг. Команда, вызвавшая прерывание (ЕМТ или TRAP), легко отыскивается обработчиком по записанному в стеке адресу возврата.

Команда ВРТ вызывает прерывание с вектором, расположенным по адресу 14, и передает управление программе отладки (в точках останова), при этом устанавливается Т-разряд РСП.

Возврат из обработчика прерывания любого типа производится командами RTI или RTT, которые выполняются аналогично, извлекая из стека адрес возврата и номер РСП. Благодаря принятой в системе эффективной организации прерываний с запоминанием адреса возврата в стеке возврат организуется очень легко при любом уровне вложенности прерываний: на вершине стека всегда находится адрес возврата и «старое» РСП для работающего сейчас обработчика, под ним — для прерванного предыдущим прерыванием обработчика и т. д. При возврате не требуется указаний адреса, и команды RTI и RTT безадресные. Различие между ними заключается в отношении к Т-разряду РСП, который извлекается из стека. Если Т-разряд установлен, то команда RTT задерживает отладочное прерывание (по адресу 14) на одну команду; после команды RTI прерывание происходит немедленно. Команда RTT используется для пошагового выполнения отлаживаемой программы.