Лекции по Вычислительным машинам, системам и сетям   

5. Программирование на языке Ассемблер

5.22. Отладка программ

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

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

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

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

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

Окно

регистров

Окно флагов

 

Окно данных

Окно стека

 

Рис. 5.12

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

Окно, в котором в настоящий момент находится курсор, является активным. Перемещать курсор между окнами, меняя тем самым активное окно, можно, например, с помощью клавиши 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 и можете выполнять отладку программы.



*****

© 2009-2017 Банк лекций siblec.ru
Лекции для преподавателей и студентов. Формальные, технические, естественные, общественные, гуманитарные, и другие науки.