Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Раздел 2.doc
Скачиваний:
12
Добавлен:
19.11.2018
Размер:
280.06 Кб
Скачать

Команда

Т =<адрес>

трассирует одну инструкцию по указанному адресу.

Команда

Т=<адрес> <число инструкций>

трассирует инструкции в количестве, определенном числом, начиная с указанного адреса.

Пример 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 (выход из отладчика) придется набирать «вслепую» без эхо-печати на дисплее.

Замечания:

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

  2. Если в команде указан адрес, первый байт которого не содержит первого байта операции, то на экране появляются неверные результаты.

  3. Если в команде в качестве начального адреса будет указан только относительный адрес, то команда использует сегмент, определенный регистром 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-винчестер С:,…).

Параметр <начальный сектор> указывает номер логического сектора, начиная с которо­го будет производиться загрузка образа опе­ративной памяти.

Параметр <число секторов> указывает общее количество записываемых на диске сек­торов.

Замечания:

  1. Следует обратить особое внимание на правильное определение секторов для записи данных. Ошибка в определении секторов вызывает уничтожение их прежнего содержимого.

  2. Если начальным адресом диапазона является относительный адрес в сегменте, то команда W использует сегмент, указанный регистром CS.

  3. Параметры <начальный сектор> и <число секторов> вводятся всегда в шестнадцатиричном виде.

Пример 1.

Команда:

W 1FD 1 100 A

переписывает данные, расположенные в памяти, начиная с адреса CS:01FD, на дискету в дисководе В: в 0АН (10) секторов, начиная с сектора с логическим номером 100Н (256).

Пример 2.