Мы знаем, что реакцией машины на неверное использование команды является фиксация особого случая и программное прерывание. В разряды 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 |
Деление с плавающей точкой |
Деление на нуль в арифметике с плавающей точкой
|