Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛРАССМБЛ№1.doc
Скачиваний:
7
Добавлен:
05.05.2019
Размер:
119.3 Кб
Скачать

Отладка программы

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

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

Отладчики бывают двух типов:

  • интегрированные отладчики, реализованные в виде интегрированной среды напоминающей среду для языков высокого уровня (Turbo Pascal, Visual C++ и т. д.);

  • автономные отладчики, представляющие собой отдельные программы.

Ни один из рассматриваемых ассемблеров (MASM, TASM) не имеет своей интегрированной среды, поэтому для отладки написанных на языке ассемблера программ используют либо автономные отладчики, либо отладчики некоторой среды программирования (например, Visual C++). С помощью автономного от­ладчика можно исследовать работу любой программы, для которой создан испол­няемый модуль, независимо от того, на каком языке был написан его исходный текст.

Для программ TASM реального режима будет использоваться 16-разрядный отладчик Turbo Debugger (TD), разработанный фирмой Borland International. Это наиболее удачный отладчик для семблерных программ реального режима.

Отладчик TD представляет собой оконную среду отладки программ на уровне одного ассемблерного текста. Он позволяет решить две главные задачи:

  • определить место логической ошибки;

  • определить причину логической ошибки.

Перечислим некоторые возможности TD:

  • трассировка программы в прямом направлении, то есть последовательное вы­полнение программы, при котором за один шаг выполняется одна машинная инструкция;

  • трассировка программы в обратном направлении, то есть выполнение програм­мы по одной команде за один шаг, но в обратном направлении;

  • просмотр и изменение состояния аппаратных ресурсов процессора во время трассировки.

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

Перечис­лим ключевые моменты процесса отладки:

  • В исходной программе обязательно должна быть определена метка для первой команды, с которой начнется выполнение программы. Такая метка может быть собственно меткой или именем процедуры. Имя этой метки обязательно должно быть указано в конце программы в качестве операн­да директивы END: end имя_метки

  • Исходный модуль должен быть оттранслирован с ключом /zi:

tasm /zi имя_исходного_модуля , , ,

Ключ /zi разрешает транслятору сохранить связь символических имен в программе с их смещениями в сегменте кода, что позволяет отладчику выполнять отладку, используя оригинальные имена.

  • редактирование модуля должно быть осуществлено с ключом /v:

tlink /v имя_объектного_модуля

Ключ /v указывает на необходимость сохранения отладочной информации в исполняемом файле.

  • запуск отладчика удобнее производить из командной строки с указанием исполняемого модуля отлаживаемой программы:

td имя_исполняемого_модуля

При правильном выполнении перечисленных действий откроется окно отлад­чика TD под названием Module с исходным текстом программы cikl.asm. Как он здесь оказался, ведь в командной строке для программы td.exe было указано толь­ко имя исполняемого модуля? Это как раз и есть результат действия ключей /zi и /v для tasm и tlink соответственно. Их применение позволило сохранить инфор­мацию об использовавшихся в коде на ассемблере символических именах. Для пол­ноты эксперимента можно попытаться получить исполняемый модуль без зада­ния этих ключей и проанализировать результат.

Вернемся к окну Module. Внимание следует обратить на так называе­мый курсор выполнения (в виде треугольника). Он указывает на первую команду, подлежащую выполнению. Этой команде предшествует имя метки (или имя процедуры). Это так называемая точка входа в программу. Если внимательно посмотреть на конец исходного текста программы, то видно, что это же имя записано в качестве операнда в заключительной директиве END. Это единственный способ сообщить загрузчику ОС о том, где в исходном тексте программы расположена точка входа в нее.

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

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

Управление работой отладчика ведется с помощью системы меню. Имеются два типа таких меню:

  • главное меню — находится в верхней части экрана и доступно постоянно (вызов его осуществляется нажатием клавиши F10, после чего следует выбрать нуж­ный пункт меню);

  • контекстное меню — для каждого окна отладчика можно вызвать его собствен­ное меню, которое учитывает особенности этого окна, щелкнув в окне правой кнопкой мыши (либо активизировав окно и нажав клавиши Alt+Fl0).

Теперь можно проверить правильность функционирования программы. Специфика программ на ассемблере состоит в том, что делать выводы о пра­вильности их функционирования можно, только отслеживая работу на уровне про­цессора. При этом нас будет интересовать прежде всего то, как программа исполь­зует процессор и изменяет состояние его ресурсов и компьютера в целом.

Запустить программу в отладчике можно в одном из четырех режимов: безусловного выполнения;

  • выполнения по шагам;

  • выполнения до текущего положения курсора;

  • выполнения с установкой точек прерывания.

Рассмотрим эти режимы подробнее.

Режим безусловного выполнения программы целесообразно применять, когда требуется посмотреть на общее поведение программы. Для запуска программы в этом режиме необходимо нажать клавишу F9. В точках, где необходимо ввести данные, отладчик, в соответствии с логикой работы применяемого средства ввода, будет осуществлять определенные действия. Аналогичные действия отладчик вы­полнит при выводе данных. Для просмотра или ввода этой информации можно открыть окно пользователя (выбрав в меню команду Window > User screen или на­жав клавиши Alt+F5). Если программа работает правильно, то на этом отладку можно закончить. В случае, если возникают какие-то проблемы или нужно более детально изучить работу программы, применяются три следующих режима отладки.

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

В режиме выполнения программы с установкой точек прерывания программа после запуска будет останавливаться в строго определенных точках прерывания (breakpoints). Перед выполнением программы необходимо установить эти точки в программе, для чего следует перейти к нужной строке и нажать клавишу F2. Выбранные строки подсвечиваются. Установленные ранее точки прерывания моя убрать — для этого нужно повторно перейти к нужной строке и нажать клавишу F2. После установки точек прерывания программа запускается клавишей F9 (см. режим безусловного выполнения). На первой точке прерывания программ остановится. После этого можно посмотреть состояние процессора и памяти, а за тем продолжить выполнение программы. Сделать это можно в пошаговом режим или до следующей точки прерывания.

Режим выполнения программы по шагам применяется для детального изучения ее работы. В этом режиме выполнение программы прерывается на каждой машин­ной (ассемблерной) команде. При этом становится возможным наблюдение за результатом исполнения команд. Для активизации этого режима нужно нажать клавишу F7 (Run > Trace into) или F8 (Run > Step over). Обе эти клавиши активизиру­ют пошаговый режим; различие их проявляется в том случае, когда в потоке ко­манд встречаются команды перехода в процедуру или на прерывание. При нажа­тии клавиши F7 отладчик осуществит переход к процедуре или прерыванию и остановится. Если же нажимается клавиша F8, то вызов процедуры или преры­вания отрабатывается как одна команда, и управление передается следующей команде программы. Кроме окна Module при работе в этом режиме полезно использовать окно CPU, вызвать которое можно через главное меню командой View > CPU.

Окно CPU отражает состояние процессора и состоит из пяти подчиненных окон:

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

  • В окне регистров процессора (Registers) отражается текущее содержимое реги­стров (по умолчанию — только регистров процессора i8086). Чтобы увидеть регистры i486 или Pentium, нужно задать режим их отображения. Для этого щелкните правой кнопкой мыши в области окна регистров и выберите в кон­текстном меню команду Registers 32-bit — Yes.

  • В окне флагов (Flags) отражается текущее состояние флагов процессора в соот­ветствии с их мнемоническими названиями.

  • В окне стека (Stack) отражается содержимое памяти, выделенной для стека. Адрес области стека определяется содержимым регистров SS и SP.

  • Окно дампа оперативной памяти (Dump) отражает содержимое области памяти по адресу, который формируется из компонентов, указанных в левой части окна. В окне можно увидеть содержимое произвольной области памяти. Для этого нужно в контекстном меню выбрать нужную команду.

Окно CPU, по сути, отражает видимую часть программной модели процессора. Некоторые из подчиненных окон окна CPU можно вывести на экран отдельно. Хотя удобнее работать с исходным текстом в окне Module, чем с его дизассемблированным вариантом в окне CPU, часто есть необходимость отслеживать состояние процессора с помощью подчиненных окон окна CPU. Совместить возможности окон Module и CPU можно, выбрав в меню View имена нужных подчиненных окон окна CPU.

Прервать выполнение программы в любом из режимов можно, нажав клавиши Ctrl+F2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]