Код завершения

Мы знаем, что реакцией машины на неверное использование команды является фиксация особого случая и программное прерывание. В разряды 16—31 старого PSW автоматически заносится код прерывания, в частности в разряды 28—31 — последние 4 бита этого кода. Информация этих 4 битов определяет, какого рода особый случай вызвал прерывание. Новое загруженное значение PSW вызывает передачу управления операционной системе, которая выдает сообщение об ошибке и завершает задание.

Операционная система использует содержимое указанных 4 битов PSW при формировании кода завершения. В системе OS код завершения печатается вместе с выдачей JCL, соответствующей тому шагу задания, на котором произошло прерывание. Код завершения представляет собой совокупность трех шестнадцатеричных цифр. Все коды, соответствующие фиксации особого случая в программе, начинаются цифрами ОС. Третья цифра определяется переводом содержимого разрядов 28—31 PSW в шестнадцатеричную форму. Например, значение кода 0С4 говорит о том, что был зафиксирован особый случай в выполнявшейся программе и что это был особый случай защиты.

Особый случай в программе является результатом попытки недопустимого использования оборудования. Выполнение задания может также окончиться аварийно при неправильной попытке использования средств операционной системы или обращения к ней. Смысл получающихся в этих случаях кодов завершения можно найти в руководстве «Сообщения и коды».

Рассмотрим теперь смысл кодов завершения, выдаваемых при фиксации особых случаев в программах. Это будет полезно не только для проведения отладки.

0С1 — Особый случай употребления кода операции. Этот особый случай фиксируется, когда производится попытка выполнения команды с неверно заданным кодом операции. Здесь сочетание неверно заданный используется в том смысле, что команда с таким кодом вообще не имеет смысла для данного процессора. Код 0С1 означает, что случайно был произведен переход к ячейке, содержимое которой не было определено, или что в теле исходной программы или одной из вызываемых подпрограмм содержатся поля данных, обход которых при выборке команд не предусмотрен. Это часто происходит в результате неправильной загрузки базового или индексного регистров.

0С2 — Особый случай употребления привилегированной операции. Здесь снова производится попытка выполнения операции с неверно заданным кодом. Однако в данном случае такой код, вообще говоря, имеет смысл, т. е. команда с таким кодом может быть выполнена процессором. Все дело в том, что это — код привилегированной операции, а команды с таким кодом недопустимо использовать в обычных программах.

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

Привилегированными командами, вообще говоря, являются те, неправильное применение которых может привести к нарушениям в работе всей системы. Например, по команде LPSW в регистр PSW загружается содержимое некоторой области памяти. Неверное применение этой команды в программе пользователя может привести к нарушению работы операционной системы и, таким образом, к по крайней мере временной потере работоспособности системы в целом. Все программы пользователей выполняются в состоянии задачи. Однако при необходимости выполнения действий, которые в состоянии задачи запрещены, можно за соответствующими услугами обратиться к операционной системе или супервизору. Программы, выполняющие подобные заказы, работают уже в режиме супервизора и могут выполнять привилегированные команды.

ОСЗ — Особый случай употребления команды ЕХ. В гл. 15 описано, как можно использовать команду ЕХ (ВЫПОЛНИТЬ) для выполнения отдельной команды, хранящейся вне основной последовательности команд программы. При попытке применения команды ЕХ для выполнения другой команды ЕХ фиксируется особый случай. (Это случается, однако, очень редко).

0С4 — Особый случай защиты памяти. Операционная система производит распределение памяти программам пользователей, выделяя каждой программе некоторую область. Для предотвращения возможности непредусмотренного влияния программ друг на друга каждой из них присваивается индивидуальный 4-битовый ключ защиты. Значение ключа хранится в PSW программы. При попытке обращения программы к памяти процессором производится сравнение ключа, приписанного данной области памяти, с ключом в PSW. Если ключи не соответствуют друг другу, это свидетельствует о том, что пользователь пытается обратиться к не принадлежащей ему области памяти. В результате фиксируется особый случай.

В машинах фирмы IBM применение такой системы защиты памяти, вообще говоря, не является обязательным. В большинстве ЭВМ предусмотрена защита от записи. Она предотвращает влияние программ — будь то программы операционной системы или программы пользователей— друг на друга, возникающее вследствие случайных ошибок адресации. В тех случаях, когда возможно присутствие в памяти некоторых секретных данных, доступных лишь отдельному пользователю или группе пользователей, используется защита от выборки, которая запрещает чтение программой информации, находящейся за пределами области памяти, выделенной этой программе.

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

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

Поскольку адреса в Системах 360 и 370 задаются 24-битовыми числами, то, следовательно, максимально возможный адрес равен 16777215. Основная память, вообще говоря, является достаточно дорогим ресурсом, и поэтому обычно объем фактически установленной памяти гораздо меньше, чаще всего он не превышает миллиона байтов. В машинах, работающих с таким объемом памяти, тем не менее возможно адресовать те же самые 16 777 215 байтов. Таким образом, возможно получить адрес, превышающий максимальный адрес, использующийся в данной системе. При возникновении подобной ситуации и фиксируется особый случай адресации.

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

LA 3, DATA

LOOP A 6, DATA(3)

DATA DS 100F

Адрес операнда команды сложения в данном случае равен удвоенному адресу DATA. Так, очевидно, быть не должно, и существует большая вероятность того, что будет зафиксирован особый случай адресации (0С5) или особый случай защиты памяти (0С4). Какое значение на самом деле должно находиться в регистре 3 для того, чтобы в команде А адресовалось первое слово области DATA?

0С6 — Особый случай спецификации. Этот особый случай означает, что в какой-то команде неверно задан операнд. Наиболее частой ошибкой является нарушение правил выравнивания. Особый случай спецификации фиксируется также при попытке передачи управления по нечетному адресу и попытке использования регистра с нечетным номером в командах, требующих задания четного регистра.

0С7 — Особый случай в данных. Этот особый случай является результатом попытки использования некорректно заданного числа в качестве операнда одной из команд десятичной арифметики. Подробнее об этом мы узнаем, рассмотрев материал гл. 16.

Описанные выше особые случаи являются наиболее часто встречающимися. Перечислим некоторые другие.

0С8 — Переполнение с фиксированной точкой. Он происходит, когда при сложении (или вычитании) двоичных чисел результат не помещается в отведенное для него 32-разрядное слово.

0С9 — Особый случай деления с фиксированной точкой. При выполнении команд D или DR частное может не уместиться в регистре. Это и является причиной определения особого случая деления с фиксированной точкой.

ОСА — Десятичное переполнение. Десятичное переполнение про-исходит тогда, когда результат выполнения команды десятичной арифметики не помещается в отведенное для него поле.

ОС В — Особый случай десятичного деления. Этот случай фиксируется тогда, когда частное, полученное при десятичном делении, выходит за пределы указанного поля.

Остальные особые случаи являются следствиями различных нарушений, происходящих при выполнении команд арифметики с плавающей точкой, которые будут рассмотрены в гл. 19.

0СС — Переполнение порядка. Отмечается, если результат выполнения команды арифметики с плавающей тачкой настолько велик, что не может быть точно представлен в принятом в ЭВМ формате.

0CD — Исчезновение порядка. Отличается от предыдущего случая только тем, что фиксируется, когда результат слишком мал.

0СЕ — Потерн значимости. Потеря значимости фиксируется тогда, когда результатом сложения или вычитания с плавающей точкой является 0. Это означает, что все значащие цифры результата при выполнении операции потеряны.

0CF — Особый случай деления с плавающей точкой. Распознается при попытке деления на 0 по команде деления с плавающей точкой.

В Системе 370 при работе с виртуальной памятью возможна фиксация некоторых иных особых случаев, выходящих за пределы нашего рассмотрения. В табл. 12.1 приведена сводка рассмотренных особых случаев.

Таблица 12.1 Особые случаи и коды завершения

Системный код

завершения

Особый случай

Значение

0C1

Операция

Команда с кодом операции, не предусмотренным для данного процессора

0С2

Привилегированная операция

Привилегированная команда в состоянии задачи

0СЗ

ЕХ

Подчиненной для команды ЕХ является команда ЕХ

0С4

Защита

Обращение к защищенной по отношению к программе области памяти

0С5

Адресация

Обращение за пределы имеющейся физической памяти

0С6

Спецификация

Некорректное задание операнда

0С7

Данные

Некорректное задание числа в качестве операнда команды десятичной арифметики

0С8

Переполнение с фиксированной точкой

Переполнение в двоичной целочисленной арифметике

0С9

Деление с фиксированной точкой

Переполнение при двоичном целочисленном делении

0СА

Десятичное переполнение

Переполнение в десятичной арифметике

0СВ

Десятичное деление

Переполнение при десятичном делении

0СС

Переполнение порядка

Переполнение в арифметике с плавающей точкой

0CD

Исчезновение порядка

Нулевое значение характеристики в арифметике с плавающей точкой

0СЕ

Потеря значимости

Нулевая мантисса результата в арифметике с плавающей точкой

0CF

Деление с плавающей точкой

Деление на нуль в арифметике с плавающей точкой

Расскажи друзьям