- •Системный отладчик debug
- •2.1. Общие сведения
- •2.2. Командный язык отладчика
- •Войти в режим ассемблирования командой
- •Перейдем в режим ассемблирования
- •Провести р-трассировку. Для этого сначала выполнить команду:
- •После этого провести обычную детальную т-трассировку
- •Команда
- •Команда
- •Команда
- •По команде
- •Предположим, необходимо заменить диагностические сообщения в воот-секторе на свои собственные. Для этого выполним последовательность действий.
- •2.3. Общий список команд программы debug
Войти в режим ассемблирования командой
А 100
и набрать программу следующего вида:
MOV СХ,10 |
|
MOV AX,0E21 |
|
LOOP 103 |
|
INT 20 |
|
Пояснение. Эта программа должна в цикле 10Н раз напечатать восклицательный знак "!" (см. команду А, пример 2). Однако, команда вызова прерывания INT 10 была пропущена, хотя должна находиться перед командой цикла LOOP. Для того, чтобы исправить ошибку можно заново набрать конец программы, начиная с адреса CS:0106. В случае больших программ это весьма затруднительно, поэтому вставку можно произвести, сдвинув конец программы в часть верхних адресов памяти командой М. Затем вставить необходимую цепочку команд, и второй командой М присоединить хвостовую часть программы в конец добавленных операторов.
В данном примере соответственно сделаем следующее:
-
выполним команду
М 106L10 200
и тем самым произведем сдвиг в область памяти, начинающуюся с DS:0200, конца программы с командами:
LOOP 103
INT 20
-
Перейдем в режим ассемблирования
А 106
-
введем пропущенную инструкцию INT 10
-
выйдем обратно на монитор отладчика - на черту
-
выполним команду
М 200L10 108
и тем самым мы присоединим «хвост» программы.
Программа отредактирована.
N – (Name) команда указания имени. Эта команда, прежде всего, определяет имя файла, который далее либо будет считываться с диска командой L, либо записываться на диск командой W.
Формат этой команды следующий:
N <имя файла>
Команда Name выполняет две функции:
-
Для первых двух файлов образует два контрольных блока файлов (FCB –File Control Block – Блок управления файлом), адреса которых CS:5C и CS:6C. Запуск программы DEBUG с указанием имени файла образует лишь один контрольный блок файла FCB (адрес блока CS:5C).
Контрольные блоки файлов используются командами Load и Write и, кроме того, передают имена файлов тестирующим программам.
-
Все введенные имена файлов и все параметры запоминаются, начиная с адреса CS:81, в таком же виде, в каком они были введены (вместе с разделителями). Адрес CS:80 содержит число введенных символов. Регистр АХ указывает правильность определения накопителей, находящихся в двух первых описаниях файлов.
Указание. Если программа DEBUG была загружена без указания имени файла, то перед загрузкой файла командой L необходимо употребить команду Name.
Пример 1.
Прочесть с диска в оперативную память файл AUTOEXEC.BAT.
Для этого выполнить:
N C:\AUTOEXEC.BAT
L
Внимание! При загрузке файла командой Load в регистровую пару ВХ:СХ, будет занесена длина загруженного файла в байтах.
Пример 2.
Создать на диске файл TEST.DAT, состоящий из нулей длины 1000Н байт.
Для этого выполним следующую цепочку команд:
F 100 L1000 0 ; обнуление области памяти, длиной 1000Н, ; начиная с адреса DS:0100
N TEST.DAT ; присвоение имени файлу
R BX ; обращение к регистру BX
-
; обнуление регистра ВХ
R CX ; обращение к регистру СХ
0 ; запись в регистр СХ размера файла
W ; запись файла на диск
В примере использованы еще не известные команды R и W, описание которых будет приведено ниже.
Эту же команду N можно использовать для ввода дополнительных параметров командной строки, как это сделано в примере 3.
Пример 3.
Предположим, что мы решили изучить программу форматирования FORMAT.COM с использованием метода трассировки. Предварительно загрузим программу в оперативную память, являющуюся рабочей областью отладчика (1 и 2 команды). Прежде чем начинать трассировку работы программы, необходимо указать имя диска (А, который собираемся форматировать, то есть передать параметр. В этом случае мы должны использовать следующие команды:
N C:\DOS\FORMAT.COM
L
N A:
T=100
Следует еще раз отметить, что имеются три области памяти, которые могут быть изменены командой N. Ими являются:
-
область размером 16 байт с адреса CS:5C. Это FCB для файла 1;
-
область размером 16 байт с адреса CS:6C. Это FCB для файла 2;
-
область размером 128 байт, начинающаяся с адреса СS:80. 3десь хранится число символов в строке после команды N, а начиная с байта CS:81 хранится сама строка символов после команды N.
Можно проверить это, используя команду распечатки Dump.
Пример 4.
В этом примере определяются файлы и другие параметры, применяемые в загруженной программе:
DEBUG prog
N file1 file2
Программа DEBUG загружает программу prog с адреса CS:100 и записывает контрольный блок файла в ячейку с адресом CS:5C. Затем команда Name образует контрольные блоки файлов file1 и file2, адреса которых соответственно CS:5C и CS:6C. Контрольный блок файла prog записывается заново. Область хранения параметров (с адреса CS:81) содержит все символы, находящиеся за кодом команды N, включая разделители (пробелы). В ячейке CS:80 записано число этих символов (0СH).
О – (Output) команда вывода данных в порт. Эта команда позволяет вывести указанный байт в порт с заданным адресом. Она полезна для тестирования работы периферийных устройств и корпусов на системной плате в диалоговом режиме.
Формат команды:
О <адрес порта> <величина>
Здесь вместо <адреса порта> подставляется адрес необходимого порта в диапазоне 0-FFFFH, а вместо <величина> - значение, которое затем загружается в порт. Если порт шестнадцатибитный, то <величина> может быть четырехразрядным шестнадцатиричным числом, которое загружается в порт.
Пример 1.
Передать значение 4FH в выходной парт 2F8H:
О 2F8 4F
Пример 2.
Мотор дисковода А: для флоппи-дисков можно включить следующей командой:
О 3F2 10
Пример 3.
Для компьютеров с CGA-контроллером можно включить окаймление дисплея командой
О 3D9 <цвет окаймления>,
где <цвет_окаймления> может быть числом из интервала 0-FН.
Пример 4.
Покажем, как можно включить звуковой сигнал путем обращения к порту 061Н. Для этого сначала прочитаем содержимое порта командой:
I 61
запомним полученное число. Далее добавим к этому числу константу 3 и по команде
О 61 <число>
выведем в порт 61, полученное в результате сложения число.
Р – (Proceed) команда высокоуровневой трассировки. Эта команда также, как и команда Т (см. ниже), предназначена для трассировки .СОМ и .ЕХЕ-программ. Однако, в отличие от Т-трассировки, эта трассировка менее детальна. Она не отслеживает досконально подпрограммы и программные прерывания, а также циклы LOOP и строковые инструкции с повторением. Но как и в случае Т-трассировки после каждой инструкции печатается содержимое всех регистров и следующей исполняемой инструкции.
Формат команды:
Р=<адрес> <число_инструкций>
Можно опустить любой из двух параметров командной строки: <адрес> и/или <число инструкций>. Параметр <адрес> задает начальный адрес, начиная с которого будет производиться трассировка, а параметр <число инструкций> будет указывать общее число инструкций, которые будут исполнены после нажатия клавиши <Enter> . Обязателен ввод символа [ = ] при указании адреса для того, чтобы не спутать адрес с числом исполняемых инструкций.
Этот тип Р-трассировки крайне полезен при изучении общей логики выполнения программы, избавляя от утомительного отслеживания деталей. При начальном изучении программы необходимо начинать именно с Р-трассировки.
Рассмотрим несколько примеров с трассировкой.
Пример 1.
Введем программу печати символа "А", начинающуюся с адреса 100:
MOV АХ,ОЕ41
INT 10
INT 20
и проведем сначала Р-трассировку (рис. 2.9):
Р=100
Р
Р
Заметим, что оттрассировались только эти три инструкции "целиком".
Теперь дадим команду:
T=100
и затем многократные
Т
Для сравнения часть детальной трассировки приведена на рис. 2.10. Увидим, что при исполнении команды INT 10 мы перешли в другую область памяти, а именно в область BIOS, а выполнение команды состоит из отдельных простых команд программы обработки прерывания STI, TEST, JZ и др.
Пример 2. (выполнить самостоятельно)
Ввести, начиная с адреса 100, следующую программу:
MOV АХ,В800
MOV DS,AX
MOV ВХ,0
MOV СХ,800
MOV АХ,0321
MOV [BX],AX
INC ВХ
INC ВХ
LOOP
INT 20