Дамп - Признаки ошибки

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

Если справедливо первое предположение, то для устранения ошибки следует либо вывести команды DS и DC за пределы реально выполняемой программы, либо организовать обход зарезервированной области с использованием команд перехода. Причиной записи данных в тело программы во время выполнения является ошибка адресации. Код 0С1 может быть выдан еще и в том случае, если расположенные за пределами выполняемой части программы данные выбираются как команды. (Не забыли ли вы написать команду EOJ или ее эквивалент?) Наконец, как уже было отмечено, мог произойти переход на команду с неверно заданным кодом операции. Это опять свидетельствует об ошибочной адресации.

Ошибки адресации, вообще, являются наиболее часто встречающимися. Они приводят к выдаче кодов завершения 0С4, 0С5, 0С6 (или, как мы только что видели, 0С1). Поиск признаков ошибки сводится к рассмотрению содержимого регистров и значений смещений, использованных при вычислении адресов операндов команд работы с памятью. Это конкретно означает проверку содержимого базового и индексного регистров, если они были использованы, и соответствующего значения смещения для операндов команды.

Возвращаясь к нашему примеру, мы видим, что допущена ошибка в адресации, о чем свидетельствует код завершения 0С6. Найденная нами машинная команда, выполнение которой привело к аварийному завершению, указывает смещение D8; в качестве индексного и базового регистров использованы соответственно регистры 9 и 13. Адрес расположения операнда в памяти равен

D8+(9)+(13)

Для определения содержимого регистров используем информацию третьей строки (REGS 8—15) на рис. 12.46.

Находим, что на момент остановки

(9) = 00000001

(13) = 0006А828

Итак, адрес операнда вычисляется следующим образом:

D8 = смещение

+1 = (9)

6A828 = (13)

6A901 = действительный адрес

Вы можете сказать: «Ну и что?» Давайте подумаем. Код завершения, равный 0С6, говорит о том, что была совершена ошибка при задании операнда. Кроме того, известно, что команда, выполнение которой привело к фиксации ошибки, является командой LOAD и что адрес ее операнда равен 6А901. Какие действия выполняются по команде LOAD? Производится пересылка содержимого полного слова, расположенного по адресу, указанному в команде, в регистр общего назначения. Но адрес полного слова должен быть кратен четырем... Вот, в чем дело! Полученный нами код завершения 0С6 говорит о том, что мы использовали команду, работающую с полным словом, адрес которого не был кратен четырем.

Почему же это произошло? Значение смещения, как и содержимое базового регистра, делится на 4. Значение индекса равно 1. Значит, в индекс-регистр было загружено неверное значение.

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

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

АДРЕС=ЕРА+ЕОС

Определим, например, содержимое NMBRS на момент остановки все той же программы, приведенной на рис. 12.2. В данном случае значение ЕРА равно 6В810, а адрес NMBRS относительно начала программы (значение счетчика размещения) — F0. Итак, необходимо определить содержимое полного слова, имеющего адрес

6А810+ F0=6А900

Дамп, изображенный на рис. 12.46, обеспечивает нас необходимой информацией. Находим:

(6А900)=0000000А

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

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

 



 
Статьи раздела