Просмотр областей памяти
Использование стандартного отладчика debug.exe
Сегодня мы рассмотрим стандартный отладчик debug.exe, входящий в любую версию DOS/Windows. Должен заметить, что этот отладчик не такой мощный, как гиганты SoftICE или Turbo Debugger. Однако, в то же время debug.exe очень прост и доступен, и просто идеально подходит для начинающих программистов на языке Ассемблер.
Итак, запускаем debug.exe (для этого заходим в Пуск->Выполнить и выполняем команду debug) и начинаем изучать этот замечательный отладчик
Команды debug.exe
Для начала разберемся с правилами набора команд debug.exe:
· В debug.exe не различается регистр букв.
· Пробелы в командах используется только для разделения параметров.
· Вводимые числа должны быть в шестнадцатеричной системе счисления, причем без завершающей буквы h.
· Сегмент и смещение записываются с использованием двоеточия, в формате сегмент:смещение, например, CS:3C1 (смещение 3C1h в сегменте кода) или 40:17 (смещение 17h в сегменте, адрес начала которого - 40[0]h).
Разобравшись с правилами, давайте перейдем к изучению команд debug.exe. Замечу, что работа с командами debug.exe в чем-то похожа на работу с командной строкой DOS. Поcле загрузки отладчика на экране появится приглашение, выглядещее в виде дефиса:
Регистры CS, DS, ES, SS в этот момент инициализированы адресом 256-байтного префикса сегмента програмы, а рабочая области в памяти будет начинаться с адреса этого префикса + 100h.
Команды debug.exe вводятся сразу после приглашения на месте, которое отмечено курсором. Каждая команда состоит из идентификатора и параметров, идентификатор состоит из одной буквы.
Краткая таблица всех команд debug.exe
Команда | Описание | Формат |
A (Assemble) | Транслирование команд ассемблера в машинный код; адрес по умолчанию - CS:0100h. | A [<адрес_начала_кода>] |
C (Compare) | Сравнение содержимого двух областей памяти; по умолчанию используется DS. В команде указывается либо длина участков, либо диапазон адресов. | C <начальный_адрес_1> L<длина> <начальный_адрес_2> C <начальный_адрес_1> <конечный_адрес_1> <начальный_адрес_2> |
D (Display/Dump) | Вывод содержимого области памяти в шестнадцатеричном и ASCII-форматах. По умолчанию используется DS; можно указывать длину или диапазон. | D [<начальный_адрес> [L<длина>]] D [начальный_адрес конечный_адрес] |
E (Enter) | Ввод в память данные или инструкции машинного кода; по умолчанию используется DS. | E [<адрес> [<инструкции/данные>]] |
F (Fill) | Заполнение области памяти данными из списка; по умолчанию используется DS. Использовать можно как длину, так и диапазон. | F <начальный_адрес_1> L<длина> '<данные>' F <начальный_адрес> <конечный_адрес> '<данные>' |
G (Go) | Выполнение отлаженной программы на машинном языке до указанной точки останова; по умолчанию используется CS. При этом убедитесь, что IP содержит корректный адрес. | G [=<начальный_адрес>] <адрес_останова> [<адрес_останова> ...] |
H (Hexadecimal) | Вычисление суммы и разности двух шестнадцатеричных величин. | H <величина_1> <величина_2> |
I (Input) | Считывание и вывод одного байта из порта. | I <адрес_порта> |
L (Load) | Загрузка файла или данных из секторов диска в память; по умолчанию - CS:100h. Файл можно указать с помощью команды N или аргумента при запуске debug.exe. | L [<адрес_в_памяти_для_загрузки>] L [<адрес_в_памяти_для_загрузки> [<номер_диска> <начальный_сектор> <количество_секторов>]] |
M (Move) | Копирование содержимого ячеек памяти; по умолчанию используется DS. Можно указывать как длину, так и диапазон. | M <начальный_адрес> L<длина> <адрес_назначения> M <начальный_адрес> <конечный_адрес> <адрес_назначения> |
N (Name) | Указание имени файла для команд L и W. | N <имя_файла> |
O (Output) | Отсылка байта в порт. | O <адрес_порта> <байт> |
P (Proceed) | Выполнение инструкций CALL, LOOP, INT или повторяемой строковой инструкции с префиксами REPnn, переходя к следующей инструкции. | P [=<адрес_начала>] [<количество_инструкций>] |
Q (Quit) | Завершение работы debug.exe. | Q |
R (Register) | Вывод содержимого регистров и следующей инструкции. | R <имя_регистра> |
S (Search) | Поиск в памяти символов из списка; по умолчанию используется DS. Можно указывать как длину, так и диапазон. | S <начальный_адрес> L<длина> '<данные>' S <начальный_адрес> <конечный_адрес> '<данные>' |
T (Trace) | Пошаговое выполнение программы. Как и в команде P, по умолчанию используется пара CS:IP. Замечу, что для выполнения прерываний лучше пользоваться командой P. | T [=<адрес_начала>] [<количество_выполняемых_команд>] |
U (Unassemble) | Дизассемблирование машинного кода; по умолчанию используется пара CS:IP. К сожалению, debug.exe некорректно дизассемблирует специфические команды процессоров 80286+, хотя они все равно выполняются корректно. | U [<начальный_адрес>] U [<начальный_адрес конечный_адрес>] |
W (Write) | Запись файла из debug.exe; необходимо обязательно задать имя файла командой N, если он не был загружен. А программы записываются только в виде файлов .COM! | W [<адрес> [<номер_диска> <начальный_сектор> <количество_секторов>]] |
Примечание. Символами [] отмечены необязательные параметры.
Просмотр областей памяти
В этой части нашей статьи мы рассмотрим подробно работу команды D, позволяющей просматривать содержимое отдельных областей памяти.
Этот пример использует команду D для просмотра области памяти, начиная с 0159:0240:
-d 0159:0240
0159:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........l.....
0159:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0159:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0159:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0159:0280 00 00 00 00 00 00 00 00-00 FF FF FF FF 00 00 00 ................
0159:0290 FF 00 00 00 00 00 00 00-00 00 4E 4F 20 4E 41 4D ..........NO NAM
0159:02A0 45 20 20 20 20 00 26 81-4F 03 00 01 CB 00 00 00 E .&.O.......
0159:02B0 00 00 00 00 00 00 00 00-00 00 00 01 07 04 FF 02 ................
-_
Здесь на запрос просмотра участка памяти мы получили восемь строк, в которых указано содержимое выбранной области памяти. Каждая строка состоит из трех частей:
· Адрес первого слева показанного байта в формате сегмент:смещение.
· Шестнадцатеричное представление параграфа (16 байт), начинающегося с указанного в начале строки байта.
· Символы этого же параграфа в ASCII-формате.
Адрес, указанный в строке, относится исключительно к первому байту в параграфе, а адреса последующих байтов следует вычислять самостоятельно. Шестнадцатеричное представление содержит по два знака в каждом байте, а сами байты разделены пробелами для облегчения чтения. Кроме того, следует отметить, что восьмой и девятый байты разделены дефисом, разделяя тем самым параграф на две части и облегяая вычисление адресов байтов в параграфе.
Дата добавления: 2016-06-29; просмотров: 2267;