< Назад  Далее >

Статья 4. Интерактивный отладчик CodeView Microsoft

Часто бывает так, что программа, успешно пройдя этапы трансляции и компоновки, все же работает не так, как ожидалось или вообще не работает. Это значит, что формально, с точки зрения правил языка программирования, программа написана правильно (в ней нет синтаксических ошибок), однако алгоритм ее в чем-то неверен. Для отладки такой программы следует воспользоваться услугами интерактивного отладчика. Интерактивным он называется потому, что вся работа с ним осуществляется в непрерывном диалоге с пользователем.

Познакомимся с отладчиком CodeView корпорации Microsoft, воспользовавшись программой из примера 1.1, которую мы еще раз приводим здесь в слегка измененном виде. В программе сокращены комментарии и предусмотрен вывод на экран латинских, а не русских букв (отладчик CV не во всех случаях удовлетворительно работает с русскими буквами).


Пример 4.1. Простейшая программа


text     segment 'code'
assume   CS:text, DS:text
begin:   mov    AX,text       ; Инициализация
         mov    DS,AX         ; регистра DS
         mov    AH,09h        ; Номер функции DOS
         mov    DX,offset mes ; Адрес выводимой строки
         int    21h           ; Вызов DOS
         mov    AX,4C00h      ; Функция завершения с кодом возврата
         int    21h           ; Вызов DOS
mes      db     'Program started$'
text     ends
         end    begin

Как уже отмечалось, для полного использования возможностей отладчика следует при трансляции программы указать в числе других ключ /ZI, а при компоновке — ключ /CO.

    MASM /Z /ZI /N P, P, P
    LINK /CO P, P

Кроме того, следует убелиться, что в вашем рабочем каталоге имеется и загрузочный (P.EXE) и исходный (P.ASM) файлы, поскольку отладчик в своей работе использует оба этих файла. Вызовем отладчик командой

    CV P

На экране появится начальный кадр отладчика (рис. 4.1).

Рис. 4.1. Начальный кадр отладчика

Рис. 4.1. Начальный кадр отладчика


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

Управлять процессом отладки можно тремя способами: с помощью меню, путем использования функциональных и управляющих клавиш, а также с помощью команд отладчика. Часто одно и то же действие можно реализовать несколькими путями. На первых порах проще всего пользоваться меню. Так, например, для завершения работы с отладчиком надо войти в главное меню, выбрать пункт File, и в открывшемся подменю выбрать пункт Exit (т.е. переместить на него подсветку и нажать клавишу Enter). На рис. 4.2 приведена верхняя часть информационного кадра отладчика с открытым меню File перед последним нажатием клавиши Enter.

Рис. 4.2. Часть кадра отладчика с активизированным меню пункта File

Рис. 4.2. Часть кадра отладчика с активизированным меню пункта File


Второй способ (использование «горячих клавиш») предполагает запоминание некоторых комбинаций управляющих клавиш. В каждом пункте каждого меню одна буква выделена другим цветом. Ввод с клавиатуры этой буквы (при открытом меню) активизирует соответствующий пункт меню. Поскольку в пункте File выделена буква F, а в пункте Exit — буква x, для завершения работы с отладчиком достаточно нажать комбинацию клавиш Alt/f/x (можно нажать и отпустить Alt, а затем нажать сначала F, а затем X; можно, не отпуская Alt, нажать сначала F, а затем X).

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


Таблица 4.1. Перечень и значения флагов, выводимых в отладчике


Название флага Выводимые значения
Флаг установлен Флаг не установлен
 Левый столбец
   Флаг переполнения OF
   Флаг прерывания IF
   Флаг нуля ZF
   Флаг паритета PF
 Правый столбец
   Флаг направления DF
   Флаг знака SF
   Флаг вспомогательного переноса AF
   Флаг переноса CF

OV
EI
ZR
PE

DN
NG
AC
CY

NV
DI
NZ
PO

UP
PL
NA
NC

Наконец, нижнее поле информационного кадра служит для ввода команд оператора (на самой нижней строке) и получения выходных сообщений отладчика, в частности, вывода содержимого заданного участка памяти («дампа» памяти). В исходном состоянии отладчика нижнее поле является активным: в нем находится мерцающий курсор. Если нужно сделать активным основное поле (с текстом программы), следует нажать клавишу F6. Курсор будет находиться под одной из строк программы(под ее номером); перемещая курсор по программе, можно расставлять точки останова и управлять пошаговым выполнением программы.

Рассмотрим типичные действия, к которым приходится прибегать по ходу отладки программы.

Нажав клавишу F10, мы выполним одно предложение программы. Можно выполнить и сразу целый фрагмент программы (несколько предложений). Для этого надо нажатием клавиши F6 перевести курсор в основное поле, поместить его перед тем предложением, на котором требуется сделать остановку, и нажать клавишу F7. Выполнятся все строки программы до той, на которой установлен курсор; подсветка переместится на эту строку. Далее можно опять выполнять программу построчно, нажимая на клавишу F10 или, установив в требуемом месте курсор, выполнить следующий фрагмент, нажав F7.

Для повторного выполнения программы ее следует «рестартовать». Для этого надо в главном меню выбрать пункт Run, а в подменю этого пункта — пункт Restart. То же достигается нажатием комбинации клавиш Alt/r/r.

По ходу выполнения строк программы в правое поле выводится текущее состояние регистров процессора и его флагов. Контроль содержимого регистров и флагов в процессе пошагового выполнения программы — основной метод ее отладки.

Не выходя из отладчика можно увидеть результат работы программы, если она выводит что-либо на экран. Для этого надо выбрать пункт меню View, а в нем подпункт Output. То же действие выполняется нажатием клавиши F4. Для возврата в окно отладчика надо нажать любую клавишу.

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

Выполните программу 4.1 до первого предложения int 21h и просмотрите содержимое регистров процессора. Вы увидите, что в старшей половине регистра AX находится число 09 — номер вызываемой функции DOS. Младшая половина регистра AX заполнена «мусором» — остатком от выполнения последней операции с регистром AX. В регистре DX будет, скорее всего, число 11h — относительный адрес первого байта строки message в сегменте команд. Изменим этот относительный адрес. Для этого надо ввести команду

r dx=n

где n — значение (шестнадцатиричное), которое требуется записать в регистр. Введем команду

R DX=16

(или r dx=16). Выполним следующее предложение программы (клавиша F10) и посмотрим содержимое экрана DOS (клавиша F4). Будет выведена строка

ram started

Действительно, увеличив содержимое регистра DX на 4, мы поместили в него относительный адрес пятого символа нашей строки, с которого теперь и выводится текст.

Отладчик позволяет также изменять содержимое ячеек памяти. Введем команду рестарта программы (Alt/R/R) и выполним ее опять до предложения int 21h. Теперь изменим содержимое ячеек памяти, в которых хранится выводимая на экран строка. Для этого надо воспользоваться командой E, например, в таком варианте:

E DX+4 '-' '0' '1'

В байты памяти, начиная с адреса, на 4 превышающего содержимое DX, т.е. начиная с пятого байта нашего сообщения, запишутся коды символов «–», «0» и «1». Если теперь выполнить очередную команду (int 21h), на экран будет выведена строка

Prog-01 started

Еще одной полезной операцией является вывод содержимого области памяти, начиная с заданного адреса («дамп» памяти). Выведем содержимое поля message. Для этого выполним, как и раньше, программу до предложения int 21h (чтобы в DX попало смещение message) и введем команду

DB DX

Здесь D — команда выполнить дамп памяти, а буква B указывает, что дамп надо выполнять по байтам (а не по словам). В нижнее поле кадра будет выведено содержимое сегмента данных, начиная с адреса, содержащегося в регистре DX. В левой части поля указываются шестнадцатеричные коды, в правой — соответствующие им символы. Для того, чтобы увидеть весь вывод отладчика, следует нажатием клавиши F2 убрать на время изображение регистров и флагов. Вторичное нажатие клавиши F2 восстанавливает исходный режим. На рис. 4.3. приведен кадр отладчика после выполнения указанной операции.

Рис. 4.3. Кадр отладчика после ввода команды получения дампа памяти

Рис. 4.3. Кадр отладчика после ввода команды получения дампа памяти


Естественно, что возможности отладчика не ограничиваются описанными. Перечень наиболее употребительных команд отладчика приведен в приложении 2 в конце книги; кроме того, в отладчике имеется встроенный справочник, с помощью которого можно получить дополнительную информацию о возможностях и командах программы CodeView. Справочник вызывается нажатием комбинации клавиш Alt/h.


Сайт управляется системой uCoz