 |
флагов выполнять действия над ними как можно быстрее, чтобы избе-
жать самых разнообразных ошибок, связанных с неверной установкой
флагов.
Смешение операндов в памяти и непосредственных операндов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Программа на языке Ассемблера может обращаться либо к смеще-
нию области памяти, в которой хранится переменная, либо к значе-
нию этой переменной. К сожалению, в языке Ассемблера нет ни инту-
итивных, ни строгих способов, позволяющих различить эти два вида
обращений, и в результате программисты часто путают обращения к
смещению и обращения к значению.
Ошибки, связанные с возвратом в начало сегмента
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Один из самых сложных моментов в программировании для мик-
ропроцессора 8086 состоит в том, что к памяти нельзя обращаться
как к одному большому массиву байт. Вместо этого память делится
на части (сегменты) размером 64К (килобайт), и доступ к ним осу-
ществляется через сегментные регистры. Сегментация памяти может
вызвать труднообнаруживаемые ошибки, поскольку если программа пы-
тается обратиться к адресу, который находится за границами сег-
мента, в действительности вместо этого происходит возврат в нача-
ло того же сегмента.
TDeb 3.0 #2-3 = 144 =
Сохранение содержимого регистров при обработке прерываний
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Каждый обработчик прерываний должен обязательно сохранять
содержимое всех регистров. Хотя и допускается сохранять содержи-
мое только тех регистров, которое изменяется данным обработчиком
прерываний, для надежности работы все же рекомендуется заносить
содержимое всех регистров в стек при входе в обработчик прерыва-
ний и извлекать его из стека при выходе.
Игнорирование групп в таблицах операндов и данных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Использование сегментных групп позволяет программисту логи-
чески разбивать данные на несколько областей, исключая при этом
необходимость загружать сегментный регистр каждый раз, когда не-
обходимо перейти от одной из таких логических областей данных к
другой.
К сожалению, тот способ, который используется для обработки
сегментных групп в макроассемблере фирмы Microsoft (MASM), может
вызвать некоторые проблемы, и пока не появился язык Турбо Ассемб-
лер, сегментные группы доставляли программистам много неприятнос-
тей. И хотя этих неприятностей практически невозможно было избе-
жать, сегментные группы были нужны для связи ассемблерного кода с
языками высокого уровня, такими как Си.
В режиме Quirks языка MASM Турбо Ассемблер эмулирует MASM, и
это означает, что в этом режиме он имеет те же проблемы, что и
MASM.Если вы не собираетесь использовать режим Quirks языка MASM,
можете больше ничего о нем не читать, однако если вы планируете
работать с этим режимом, вам следует обратиться за дополнительной
информацией к "Руководству пользователя по Турбо Ассемблеру".
TDeb 3.0 #2-3 = 145 =
Проверка
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Создание программы с допустимыми входными данными составляет
только часть функций проверки. В следующих разделах обсуждаются
некоторые важные случаи проверки, которым должны подвергаться
каждая программа, прежде чем можно будет сделать вывод о ее пра-
вильной работе.
Проверка граничных условий и случаи ограничения
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Если вы считаете, что подпрограмма должна работать с данны-
ми, принимающими значение в определенном диапазоне, вы должны
подвергнуть эту подпрограмму проверке с данными, принимающим раз-
личные значение в этом диапазоне. Например, если в вас имеется
подпрограмма, выводящая на экран список длиной от 1 до 20 элемен-
тов, вы должны убедиться, что она ведет себя правильно и в том
случае, когда в списке имеется ровно 1 элемент, и в том случае,
когда в списке 20 элементов (здесь могут скрываться различные
ошибки, в частности, ошибка типа "столбы и забор", описанная ра-
нее).
Ввод ошибочных данных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Когда вы убедитесь, что программа работает во всем диапазоне
допустимых данных, следует убедиться, что она ведет себя коррект-
но, когда вы задаете недопустимые входные данные. Например, убе-
дившись, что предыдущая программа воспринимает значения в диапа-
зоне от 1 до 20, нужно также убедиться, что 0 или 21 значение ей
отвергаются.
Отсутствие входных данных
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Этот момент при проверке и создании программы часто упуска-
ют. Если вы пишете программу, которая правильно себя ведет при
отсутствии входных данных, работа с ней значительно упростится.
Отладка, как часть процесса создание программы
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Когда вы начинаете разработку программы, можно заранее зап-
ланировать этап отладки. Необходимо установить, в какой степени
различные части вашей программы должны выполнять проверку на до-
пустимые входные и выходные данные.
При большом объеме проверок вы получите в результате очень
гибкую программу, которая часто будет сообщать вам об ошибочной
ситуации, но продолжать работать после выполнения некоторых дейс-
твий по восстановлению. Однако при этом объем программы возрастет
и работать она будет медленнее. Такой тип программ довольно легко
TDeb 3.0 #2-3 = 146 =
отлаживать, поскольку до возникновения опасной ситуации подпрог-
раммы сами сообщают вам о недопустимых входных данных.
Можно также реализовать программу, в которой выполняется ма-
ло проверок на допустимость входных и выходных данных или такие
проверки совсем отсутствуют. Такая программа будет меньшей по
объему и будет быстрее выполняться, но неверные входные данные
или маленькая ошибка могут привести к аварийному завершению ее
работы. Такой тип программ обычно труднее всего отлаживать, так
как небольшая ошибка может проявиться при выполнении намного
позднее. Это затрудняет выявление того места, где содержится
ошибка.
Большинство создаваемых программ сочетают в себе оба этих
метода. Данные, воспринимаемые из внешних источников (например,
вводимые пользователем или считываемые из файла на диске) подвер-
гаются обычно более тщательной проверке, чем данные, передаваемые
при вызове от одной подпрограммы к другой.
TDeb 3.0 #2-3 = 147 =
Пример сеанса отладки
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В примере сеанса отладки используются те методы, о которых
мы рассказывали в предыдущих разделах. Отлаживаемая программа
представляет собой вариант демонстрационной программы, использо-
ванной в Главе 3 (BCDEMO.C или TPDEMO.PAS), только в нее предна-
меренно внесены некоторые ошибки.
Убедитесь, что в вашем текущем каталоге содержатся два фай-
ла, необходимые для демонстрации отладки. Если вы отлаживаете
программу на Турбо Паскале, вам понадобятся файлы TPDEMOB.PAS и
TPDEMOB.EXE. Если вы работаете на языке Си, вам потребуются файлы
BCDEMOB.C и BCDEMOB.EXE. (Буква B в конце имен файлов, означает,
что в эту версию внесена ошибка.)
Сеанс отладки программы на языке Си
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В данном разделе в качестве примера используется программа
на языке Си. Если вы программируете на Паскале, см. ниже пример
сеанса отладки с использованием программы Турбо Паскаля.
Поиск ошибок
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
До того, как начать сеанс отладки, давайте запустим демонс-
трационную программу с ошибкой и посмотрим, что она делает непра-
вильно. Для запуска программы наберите:
BCDEMOB
Вам выведется подсказка для ввода строк текста. Введите две
строки текста:
one two three
four five six
Последняя пустая строка завершает ваш ввод. После этого
программа BCDEMOB выводит результаты анализа введенных вами
строк:
Arguments: (1)
Enter a line (empty line to end): one two three (2)
Enter a line (empty line to end): fou five six
Enter a line (empty line to end):
Total number of letters = 7 (3)
Total number of lines = 6 (4)
Total word count = 2 (5)
Average number of words per line = 0.3333333 (6)
'E' orrurs 1 times, 0 times at start of a word (7)
'F' occurs 1 times, 1 times at start of a word
'N' occurs 1 times, 0 times at start of a word
|