- •Системный отладчик debug
- •2.1. Общие сведения
- •2.2. Командный язык отладчика
- •Войти в режим ассемблирования командой
- •Перейдем в режим ассемблирования
- •Провести р-трассировку. Для этого сначала выполнить команду:
- •После этого провести обычную детальную т-трассировку
- •Команда
- •Команда
- •Команда
- •По команде
- •Предположим, необходимо заменить диагностические сообщения в воот-секторе на свои собственные. Для этого выполним последовательность действий.
- •2.3. Общий список команд программы debug
Команда
Т =<адрес>
трассирует одну инструкцию по указанному адресу.
Команда
Т=<адрес> <число инструкций>
трассирует инструкции в количестве, определенном числом, начиная с указанного адреса.
Пример 1.
Пусть регистр IP содержит значение 011А и по этому адресу записано В40Е (MOV AH,0EH). Тогда после ввода команды Т без параметров выполняется одна (следующая) инструкция, затем на экран будут выведены состояния регистров и процессора:
AX=0E00 |
BX=00FF |
CX=0007 |
DX=01FF |
SP=039D |
BP=0000 |
SI=005C |
DI=0000 |
DS=04BA |
ES=04BA |
SS=04BA |
CS=04BA |
IP=011C |
NV UP DI NG NZ AC PE NC |
||
04BA:011C |
CD21 INT21 |
т.е., на экране находятся результаты выполнения команды, записанной по адресу 011А и следующая выполняемая команда (команда INT 21 в ячейке 04ВА:011С).
Пример 2.
Команда
T=FFFF:0000
производит трассировку первой исполняемой инструкции
при первоначальном запуске компьютера.
Пример3.
Введем программу, начиная с адреса CS:100.
MOV АХ,123
MOV ВХ,456
MUL ВХ
INT 20
Затем, исполнив команду отладчика
Т =100 3
мы получим представление о выполнении этой программы умножения двух чисел. После выполнения каждой команды, на экран выводится содержимое всех регистров и флагов.
U – (Unassembler) команда дизассемблирования. Эта команда позволяет дизассемблировать содержимое памяти, в том числе .СОМ и .ЕХЕ-программы, загруженные в рабочую область отладчика.
Формат команды:
U <начальный адрес> <длина>
или U <начальный адрес> <конечный адpec>
Команда
U
вызывает дизассемблирование 32 байт, начиная с байта, на который указывает CS:IP с выводом результирующего листинга на дисплей. Многократное применение команды U позволяет провести дизассемблирование большой непрерывной области памяти. Если впервые, то с адреса 100H.
Если при запуске отладчика переадресовать вывод в файл, то можно получить листинг дизассемблированной программы. При этом команду U и команду Q (выход из отладчика) придется набирать «вслепую» без эхо-печати на дисплее.
Замечания:
-
Часто оказывается, что число дизассемблируемых (и, следовательно, выводимых на экран) байтов больше заданного числа. Это является результатом того, что операторы имеют различную длину и последний оператор может оказаться длиннее, чем мы считали.
-
Если в команде указан адрес, первый байт которого не содержит первого байта операции, то на экране появляются неверные результаты.
-
Если в команде в качестве начального адреса будет указан только относительный адрес, то команда использует сегмент, определенный регистром CS.
Пример 1.
По команде
U 04ВА:0100 108
на экране может появится ответ:
04ВА:0100 |
206472 |
AND |
[SI+72],AH |
04BA:0103 |
FC |
CLD |
|
04BA:0104 |
7665 |
JBE |
016B |
04BA:0106 |
207370 |
AND |
[BP+DI+70] |
В строках: в 1-ой позиции - адрес первого байта команды; во 2-ой позиции - код команды; в 3-ей и 4-ой позициях - команда, записанная на языке ассемблера (4-ая позиция - операнды).
Такой же ответ можно получить и после следующих команд:
|
U 04BA:0100 L 7 |
или |
U 04BA:0100 L 8 |
или |
U 04BA:0100 L 9 |
Это очевидно, если ознакомиться с Замечанием 1.
Пример 2.
Дизассемблирование BIOSa компьютера PC AT можно (в первом приближении) произвести по команде:
U F000:E000 L 2000
Внимание! Часть полученного кода будет бессодержательной, так как отладчик дизассемблирует не только программу, но и области данных, хранимых в BIOS. Эта проблема не снимается другими отладчиками, которые также нуждаются в знании того, какая часть файла программы отведена под данные.
Рекомендуется следующее решение данной задачи. Во-первых, необходимо провести символьный дамп всей программы и выписать адреса тех ее частей, которые содержат осмысленный текст. Во-вторых, эти части необходимо исключить из процесса дизассемблирования. Затем надо дизассемблировать командой U оставшиеся "куски" программы. При этом надо внимательно изучать появляющийся листинг. Присутствие псевдокоманд DB, обильное использование косвенной адресации, последовательные команды с занесением в один и тот же регистр различных значений, условные переходы без предварительных команд с установкой флагов позволяет сделать вывод, что отладчик дизассемблирует область данных.
Начало такой области данных можно определить, найдя команду типа JMP, RET, IRET, после которой и начинается программная "бессмыслица". Для уточнения конца таких областей данных полезна таблица адресов условных и безусловных переходов, а также адресов входа в подпрограммы, пометив которые, можно определить конец областей данных.
В результате такой работы можно найти дополнительные области данных.
В-третьих, сделать окончательный листинг программы, чередуя команды U и D для кодовых областей и областей с данными.
Обычно требуется совсем незначительное уточнение к листингу, полученному таким образом.
W – (Write) команда записи на диск. Эта команда позволяет записывать на диск (флоппи-диски или винчестер) в последовательные блоки указанный диапазон оперативной памяти, а также записывать в файлы.
Запись в секторы на диск производится командой
W <адрес> <номер диска> <начальный сектор> <число секторов>
Замечание. Одной командой можно записать на диск не более 80H секторов.
Параметр <адрес> команды означает адрес оперативной памяти, начиная с которого содержимое памяти копируется на диск.
Параметр <номер диска> указывает драйв, на который производится запись (0-диск А:, 1-диск В:,…, 80-винчестер С:,…).
Параметр <начальный сектор> указывает номер логического сектора, начиная с которого будет производиться загрузка образа оперативной памяти.
Параметр <число секторов> указывает общее количество записываемых на диске секторов.
Замечания:
-
Следует обратить особое внимание на правильное определение секторов для записи данных. Ошибка в определении секторов вызывает уничтожение их прежнего содержимого.
-
Если начальным адресом диапазона является относительный адрес в сегменте, то команда W использует сегмент, указанный регистром CS.
-
Параметры <начальный сектор> и <число секторов> вводятся всегда в шестнадцатиричном виде.
Пример 1.
Команда:
W 1FD 1 100 A
переписывает данные, расположенные в памяти, начиная с адреса CS:01FD, на дискету в дисководе В: в 0АН (10) секторов, начиная с сектора с логическим номером 100Н (256).
Пример 2.