Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КНИГА_АСМ ассемблер.doc
Скачиваний:
61
Добавлен:
19.11.2019
Размер:
732.16 Кб
Скачать
  1. Отладка программ.

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

Существует много различных отладчиков, однако программисты чаще всего используют отладчик td.exe (Turbo Debugger). Именно на нем мы и остановимся. Этот отладчик предоставляет программисту мощный инструментарий для отладки ассемблерных программ. Мы не будем здесь описывать весь этот инструментарий, а ограничимся минимальным набором, достаточным для начинающего программиста.

Turbo Debugger позволяет производить отладку программ в двух режимах: режим Module и режим CPU. Программист выбирает конкретный режим в зависимости от своих привычек. Авторы предпочитают режим CPU, именно его мы и опишем. Обычно, когда мы попадаем в Turbo Debugger окно CPU (оно светло зеленое) уже открыто. Если это не так, зайдите в меню View и выберите в нем пункт CPU.

Окно CPU состоит из пяти подокон, как показано на рис. 4.1.

окно программы

окно регистров

окно флагов

окно данных

окно стека

Рис. 4.1

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

Окно, в котором в настоящий момент находится курсор, является активным. Перемещать курсор между окнами, меняя тем самым активное окно, можно, например, с помощью клавиши TAB. Внутри любого окна можно перемещаться (перемещать курсор) с помощью клавиш – стрелок, PgUp и PgDn. Увеличить (уменьшить) размер окон можно с помощью клавиши F5. Для активного окна можно вызвать контекстное меню, нажав ALTF10.

Сама отладка программы (ее пошаговое выполнение) производится, когда активным является окно программы. При этом нажатие клавиши F8 или F7 приводит к выполнению одной очередной команды. Выполниться при этом необязательно та команда, на которой стоит курсор. Очередной командой, которая и будет выполнена, является команда, на которую указывает пара cs:ip (содержимое этих регистров отражено в окне регистров). Разница между клавишами F7 и F8 заключается в обработке таких команд как loop (цикл), call (вызов подпрограммы) и int n (вызов обработчика прерывания). При нажатии F8 весь цикл (или подпрограмма, или…) выполняется как одна единственная команда, то есть мы не попадаем внутрь цикла, подпрограммы или обработчика, а вот по клавише F7 мы туда попадаем и выполняем цикл или подпрограмму пошагово (даже если после этого мы жмем F8). Рекомендуем всегда использовать клавишу F8, а клавишей F7 пользоваться, только если надо посмотреть что происходит внутри цикла или подпрограммы. Не советуем нажимать F7 на командах int n, Вы попадете внутрь обработчика (который написан не Вами и ничего полезного Вам не даст) и вряд ли оттуда выберетесь.

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

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

Иногда нужно вручную изменить содержимое некоторого регистра. Сделайте активным окно регистров (клавишей TAB), установите курсор на нужный регистр и начинайте набирать новое содержимое. На экране автоматически появится окно (Enter new value), в которое Вы введете нужную информацию, после чего жмите ENTER. Не забудьте, информация вводится в шестнадцатеричной форме и если вводимое число начинается с буквы, перед буквой должен быть введен ноль.

Исходно в окне регистров отображается содержимое 16 разрядных регистров (ax, cx,…). А что если мы работаем с 32 разрядными регистрами (eax, ecx, …), как посмотреть их содержимое? Переходим в окно регистров (TAB), вызываем контекстное меню (ALTF10), находим в нем пункт Registers 32 - bit No, подгоняем на него курсор и жмем ENTER.

Если надо вручную поменять значение какого-то флага, переходим в окно флагов, устанавливаем курсор на нужный флаг и жмем ENTER.

Очень часто в окне данных высвечивается совсем не та информация, которая нас интересует (хотим наблюдать, как меняются значения наших переменных, а отладчик показывает нам начальную область PSP). Переходим в окно данных, вызываем контекстное меню (ALTF10), выбираем в нем пункт Go To, появляется окно (Enter address to position to), в которое мы вводим ds:100h (для СОМ программы) или ds:0 (для EXE программы). После чего жмем ENTER. Отметим, что для EXE программы данную операцию надо делать, после того как ds настроен на начало сегмента данных, то есть после выполнения команд

mov ax, data

mov ds, ax

Изменить вручную значение любого байта в окне данных можно, например, следующим образом. Переходим в окно данных, устанавливаем курсор на нужном байте, начинаем вводить новое значение. Появляется окно Enter new data bytes. Вводим в это окно нужное число и жмем ENTER. Не забудьте, информация вводится в шестнадцатеричной форме и если вводимое число начинается с буквы, перед буквой должен быть введен ноль.

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

Остался неосвещенным только один важный вопрос: а как загрузить в отладчик нашу СОМ (или EXE) программу? Проще всего поступить следующим образом. Поместить отладчик и нашу программу (пусть, для определенности, она называется lab1.com) в одну директорию, а затем набрать в командной строке:

td.exe laba1.com

после чего нажать ENTER. Выполнив эти действия, мы попадаем в Turbo Debugger, причем наша программа уже загружена в окно программы. Кроме того, на экране, скорее всего, мы увидим надпись Program has no symbol table. Не обращайте на нее внимания, жмите ESC и можете выполнять отладку программы.