...

Debug что за программа

Записки Ищущего Истину Программиста

Программирование и админка с почесыванием уха рукой через голову.

Поиски истины

  • Всё подряд
  • Змий искуситель
  • Работа с cmd, bat, debug в Windows
  • Вирт с машинами

5 сент. 2014 г.

Работа с командной строкой Windows, Программа Debug и её использование

Работа с командной строкой Windows. Программа Debug и её использование.

Запуск Debug.exe, программы для проверки и отладки исполнительных файлов MS-DOS. Выполненная без параметров команда debug запускает программу Debug.exe и выводит приглашение команды debug, представленное дефисом (-).


1)
Запустить Virtual PC 2007 с образом Windows XP. Перевести ОС в режим командной строки.
Пуск -> Выполнить -> Вводим cmd и нажимаем Enter .

2)
Получить и зафиксировать справку по опциям команды debug
В консоли: ввести debug , затем (?).
Краткий список всех команд:
A (assemble) — Транслирование команд ассемблера в машинный код . Адрес по умолчанию — CS:0100h.

С (compare) — Сравнение содержимого двух областей памяти. По умолчанию используется DS . В команде указывается либо длина участков, либо диапазон адресов.

D (dump) — Вывод содержимого области памяти в шестнадцатеричном и ASCII-форматах. По умолчанию используется DS . Можно указывать длину или диапазон.

E (enter) — Ввод в память данные или инструкции машинного кода. По умолчанию используется DS .

F (fill) — Заполнение области памяти данными из списка. По умолчанию используется DS . Использовать можно как длину, так и диапазон.

G (go) — Выполнение отлаженной программы на машинном языке до указанной точки останова. По умолчанию используется DS . При этом следует убедиться, что IP содержит корректный адрес.

H (hexadecimal) — Вычисление суммы и разности двух шестнадцатеричных величин.
I (input) — Считывание и вывод одного байта из порта.

L (load) — Загрузка файла или данных из секторов диска в память. . По умолчанию — CS:100h. Файл можно указать с помощью команды N или аргумента при запуске debug.exe.

M (move) — Копирование содержимого ячеек памяти; по умолчанию используется DS . Можно указывать как длину, так и диапазон.

N (name) — Указание имени файла для команд L (LOAD) и W (WRITE) .
O (output) — Отсылка байта в порт вывода.

P (proceed) — Выполнение инструкций CALL, LOOP, INT (цикла, прерывания, процедур) или повторяемой строковой инструкции с префиксами REPnn , переходя к следующей инструкции.

Q (quit) — Завершение работы debug.exe . Без сохранения тестируемого файла.
R (register) — Вывод содержимого регистров и следующей инструкции.

S (search) — Поиск в памяти символов из списка. По умолчанию используется DS . Можно указывать как длину, так и диапазон.

T (trace) — Пошаговое выполнение программы. Как и в команде P , по умолчанию используется пара CS:IP . Но для выполнения прерываний лучше пользоваться командой P .

U (unassemble) — Дизассемблирование машинного кода. По умолчанию используется пара CS:IP .

W (write) — Запись файла из debug.exe на диск. Необходимо обязательно задать имя файла командой N , если он не был загружен.


3)
Получим и зафиксируем дампы характерных областей RAM и ROM
Наберем команду R .

Регистры CS, DS, ES, SS в этот момент инициализированы адресом 256-байтного префикса сегмента програмы, а рабочая области в памяти будет начинаться с адреса этого префикса + 100h.

Правила набора команд:
А) В debug.exe не различается регистр букв.
Б) Пробелы в командах используется только для разделения параметров.
В) Вводимые числа должны быть в шестнадцатеричной системе счисления, причем без завершающей буквы h.
Г) Сегмент и смещение записываются с использованием двоеточия, в формате сегмент:смещение.

4)
Просмотр области памяти.

Команда D, позволяет просматривать содержимое отдельных областей памяти .
Проверим размер доступной для работы памяти. Для этого введем: d 40:13 и Ввод.
Первые два байта, появившиеся в результате на экране, содержат размер памяти в килобайтах и в шестнадцатеричном представлении, причем байты располагаются в обратной последовательности. У Нас это: 8002 0280 640 (К)

Здесь на запрос просмотра участка памяти мы получили восемь строк, в которых указано содержимое выбранной области памяти. Каждая строка состоит из трех частей:

  • Адрес первого слева показанного байта в формате сегмент:смещение.
  • Шестнадцатеричное представление параграфа (16 байт), начинающегося с указанного в начале строки байта.
  • Символы этого же параграфа в ASCII-формате.


4)
Проверка параллельных и последовательных портов.

Первые 16 байт области данных BIOS содержат адреса параллельных и последовательных портов. Первые выведенные восемь байтов указывают на адреса последовательных портов COM1-COM4. Следующие 8 байтов указывают на адреса параллельных портов LPT1-LPT4. Адрес порта 78 03 – записывается в обращенной форме.


5)
Проверка состояния регистра клавиатуры.

В области данных BIOS по адресу 417h находится первый байт, который хранит состояние регистра клавиатуры..


6)
Проверка даты производства BIOS.

Сведения об авторских правах на BIOS встроены в ROM BIOS по адресу FE00:0 . Строку с копирайтом можно легко найти в ASCII -последовательности, а серийный номер – в виде шестнадцатеричного числа. На экране видим семизначный номер компьютера и дата копирайт. Хотя, строка с указанием авторских прав может быть длинной и не умещаться в выведенную область памяти. В таком случае следует просто ввести еще раз D.

Дата также записана в ROM BIOS начиная с адреса FFFF:5 . После выполнения соответствующей команды в ASCII -последовательности будет находиться эта дата, записанная в формате мм/дд/гг .


7)
Пример машинных кодов.

Рассмотрим создание программы на машинном языке, ее представление в памяти и результаты выполнения. Команда отладчика A (Assemble) переводит DEBUG в режим приема команд ассемблера и перевода их в машинные коды.

Теперь, когда программа введена в память, попробуем управлять ее выполнением. Для начала проверим текущее состояние регистров и флагов, для этого вводим команду R.

IP — регистр, содержащий адрес-смещение следующей команды, подлежащей исполнению, относительно кодового сегмента CS в процессорах семейства x86.

Регистр IP связан с CS в виде CS:IP, где CS является текущим кодовым сегментом, а IP — текущим смещением относительно этого сегмента.

Регистр IP является 16-разрядным регистром-указателем. Кроме него, в состав регистров этого типа входят SP (Stack Pointer — указатель стека) и BP (Base Pointer — базовый указатель).

Запись CX прошла успешно и равна 8-и. Произошла инициализация сегментов DS, ES, SS, CS одним и тем же адресом. Регистр IP содержит 0100, указывая на то, что инструкции выполняются со смещения 100h относительно CS (с него и начинали).

Здесь же указаны и значения флагов переполнения, направления, прерывания, знака, нуля, дополнительного переноса, четности и переноса:

2.3. Отладчик Debug

DEBUG.EXE – специальная системная программа для ввода и пошагового выполнения программ, написанных на машинном языке или с помощью команд ассемблера.

Для запуска этой программы нажмите кнопку Пуск, затем Выполнить, введите Debug и нажмите ввод, в результате программа должна загрузиться с диска в память.

После окончания загрузки на экране появится приглашение в виде дефиса, что свидетельствует о готовности программы Debug для приема команд.

Наиболее часто используемые инструкции Debug:

1. Q – выход из программы.

2. ? – получение справки.

3. H (Hexarithmetic) – шестнадцатеричная арифметика. Если после символа Н набрать 2 числа (размером не более 4 цифр каждое) через пробел, то получим сумму и разность набранных чисел:

4. R [] – работа с регистрами (от слова Register). Инструкция «R» без параметра позволяет просмотреть содержимое всех регистров, а также значение флагов и команду, расположенную по смещению 0100 в сегменте кода. Обычно по смещению 0100 находится первая команда программы.

С помощью этой инструкции можно ввести новое значение в один регистр. Для этого после команды нужно ввести название регистра:

Как видим, при первом просмотре регистров командой r, в регистре АХ был 0, затем содержимое регистра было изменено.

5. U [:], – просмотр ячеек оперативной памяти, начиная с указанного смещения в сегменте, заданном сегментным регистром. Команда U (Unassemble) дизассемблирует команды, находящиеся в памяти по заданному адресу.

Например, в следующем примере мы просматриваем команды, находящиеся в регистре CS, начиная с адреса 100, по адрес 102.

6. Е [:] – запись информации в ячейки оперативной памяти.

Как было сказано, с помощью Debug можно вводить команды как на машинном языке, так и на языке ассемблера. Инструкция Debug E (Enter) служит для ввода команд на машинном языке. Здесь Debug используется как интерпретатор, чтобы работать непосредственно с микропроцессором. Можно задавать машинные команды, записывать их в определенное место оперативной памяти, обычно, начиная с 0100 смещения относительно начала сегмента кода. Затем выполнять пошагово (по одной команде) либо сразу всю программу.

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

Например, команда для сложения значений из регистров АХ и ВХ двухбайтовая и имеет машинный код 01D8.

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

Для ввода, например, двухбайтовой машинной команды 01D8 нужно записать 01 в сегмент кода по смещению 100, и D8 – по смещению 101:

7. Т (от Tracing) – запуск программы, находящейся в оперативной памяти по адресу 0100, в пошаговом режиме. Для вызова программы на выполнение нужно предварительно позаботиться, чтобы в регистре IP (счетчик команд) было число 0100.

8. Аввод команд в ассемблерном виде (от Assemble). Первую команду программы следует начинать вводить со смещения 0100. Далее система ждет поочередного ввода команд ассемблера. Для окончания ввода нужно нажать Enter после пустой строки.

Пример. Введем в оперативную память программу на ассемблере, выполняющую сложение двух чисел. Установим начальный адрес следующим образом: A 0100 [Enter].

Отладчик выдаст значение адреса сегмента кодов и смещения в виде хххх:0100. Теперь можно вводить каждую команду, завершая клавишей Ввод.

Прежде чем выполнить программу, проверим сгенерированные машинные коды при помощи команды U. Необходимо сообщить отладчику адреса первой и последней команд, которые необходимо просмотреть, в данном случае 0100 и 0106. Введите: U 100, 106

Как видим, машинные коды сгенерированы верно.

С помощью команды R выведем содержимое регистров и первую команду нашей программы:

С помощью команд Т выполним последовательно все команды программы:

Так вводятся и трассируются программы на языке ассемблера.

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

9. G (от Go) – запуск программы, находящейся в оперативной памяти по адресу 0100. Для вызова программы на выполнение нужно предварительно позаботиться, чтобы в регистре IP (счетчик команд) было число 0100.

10. N – задает имя программы (Name) для последующей записи ее на диск либо считывания с диска. Перед записью предварительно нужно записать 0 в регистр ВХ, а размер программы (в байтах) – в регистр СХ.

11. W (от Write) – запись программы на диск. После выполнения инструкции “W” на диске в текущей директории появится файл с расширением .COM – точная копия веденной программы.

12. L загрузка программы с диска в оперативную память. Предварительно имя программы задается с помощью команды N.

Вернемся к примеру со сложением двух чисел. Чтобы записать эту программу на диск, следует выполнить три действия:

1. присвоить программе имя;

2. указать длину программы;

3. выполнить запись.

1. Присвоим будущему файлу имя с помощью команды N.

2. Программа состоит из четырех двухбайтных инструкций, занимает адреса со смещениями с 0100 по 0106, значит ее длина – 8 байт. Размер программы Debug хранит в регистровой паре [BX:CX]. В нашем случае значение длины умещается в одном регистре, поэтому старший регистр пары мы просто обнулим: BX=0, CX=8.

3. Для записи программы на диск используем программу W.

1.3. Использование программы Debug

В составе любой операционной системы, а также в любой среде разработки программных комплексов имеются так называемые программы-отладчики.

У операционной системы MS DOS таким отладчиком была программа debug, в последних версиях OS Windows такой программой служит ntsd.exe. Первая из этих программ используется для однопрограммных однопользовательских режимов работы и 16-разрядных приложений. Вторая программа очень сложна, она предназначена для работы в многопрограммном многопользовательском режиме работы вычислительной системы с 32-разрядными приложениями.

Программу debug целесообразно использовать для обучения пользователей при начальном знакомстве с операционными системами и принципами их построения и работы. Она удобна для демонстрации процессов, происходящих в микропроцессоре во время работы и принципов управления различными устройствами компьютера.

Вызов программы debug осуществляется путем набора в командной строке её имени и нажатием клавиши . Компьютер переходит в режим эмуляции MS DOS. Программа вызывается и размещается в памяти компьютера, начиная с ячейки 100h (шестнадцатеричный адрес). В следующей строке появляется мигающий минус “-“ – приглашение к вводу нужной команды. Выход из программы debug осуществляется набором буквы q (Quit – завершение работы).

Список всех команд, выполняемых программой debug можно получить, если в строке приглашения набрать: -?, как показано ниже.

Рассмотрим некоторые весьма полезные возможности программы debug.

1. Просмотр содержимого памяти

1.1. Проверка объема основной памяти DOS

Эта информация после загрузки DOS находится в 413h и 414h байтах памяти (адреса младшего и старшего байтов в шестнадцатеричном представлении). Зададим адрес сегмента: 400 (последний нуль следует “отбросить” и этим самым указываем начало параграфа 40, умноженное на 16) и смещения: 13.

Набираем команду -d (dump – диапазон) 40:13 и нажимаем Enter. Ввод данных строчными или прописными буквами не имеет значения, поскольку DOS в командной строке воспринимает символы ASCII, независимо от выбранного регистра. На эту команду получаем следующую картину на экране дисплея:

В каждой строке текста содержатся адреса 16-ти байтов, их шестнадцатеричное и символьное представление, если таковое существует в коде ASCII. Как и должно получиться – в первом (413) и втором (414) байтах распечатки содержатся цифры 80 и 02, то есть с учетом “вращения байтов” (особенность памяти IBM-совместимого компьютера) получаем число 0280h Кбайт в шестнадцатеричном представлении. Переводим в десятичное представление 2*16*16+8*16+0 = 640 Кб.

Что и должно быть!

1.2 Проверка “серийного номера и даты копирайта”

Эта информация находится в ПЗУ, начиная с адреса FE000h. Здесь находятся: семизначный номер компьютера, дата копирайта, фирма изготовитель. Данная информация является символьной.

Аналогично наберем адрес памяти:-d FE00:0 .

На эту команду получаем следующее:

1.3. Проверка даты “прошивки” ROM BIOS

Информация находится по адресу: FFFF5h. Формат даты – американский, то есть mm/dd/yy. Вводим адрес и выполняем команду:_d FFFF:5 .

По этой команде должна быть выдана информация о дате “прошивки” ПЗУ (ROM BIOS). В верхней строке в символьном представлении читаем интересующую нас дату (09/24/03).

1. 4. Еще одна полезная операция!

Если требуется определить местоположение в памяти какой-либо информации (например, какого-то слова), то можно набрать и выполнить команду S (Search – поиск), задав адресные границы поиска и “ключевое слово”. Например, выполнение команды:

-s F000:0 L FFFF ”IBM”, в которой F000:0 – начальный адрес памяти ПЗУ, FFFF – конечный адрес, а ”IBM” – ключевое слово, позволяет получить следующие результаты выполнения команды -s F000:0 L FFFF ”IBM”

Ниже выполненной команды следует перечень адресов, в которых содержится искомое ключевое слово. Проверьте этот факт, набрав эти адреса памяти.

Команду S (Search) можно использовать, например, для поиска вирусов, если известны их “следы” и т.п.

Таким образом, рассмотренные примеры позволяют объективно позволяют определить модель и возраст компьютера, а также просмотреть содержимое любой ячейки памяти.

1.5. Работа часов реального времени

Время, измеряемое компьютером, формируется на основе отсчетов счетчика часов реального времени. Четыре байта этого счетчика располагаются в оперативной памяти, начиная с адреса 0046Сh. Значения счетчика времени корректируется по каждому сигналу от таймера с частотой 18,2 имп/с (более точно 18,206481). Тактовая частота системного таймера персонального компьютера составляет 1,19318Мгц. Она кратна основной частоте, принятой в телевидении f =14,31818 Мгц, и составляет 1/12 этой частоты.

Определим значение счетчика с помощью программы debug. Запишите два показания счетчика примерно через одну минуту. С учетом шестнадцатеричного представления чисел определите разницу этих значений. Переведите полученный результат в десятичную систему счисления, поделите на величину 60*18,2 и убедитесь, что темп изменения отсчетов действительно соответствует темпу изменения реального времени. Изменение значений байтов счетчика наглядно показывает, что время неотвратимо “бежит вперед”.

1.6. Выявление связей между ассемблерным кодом программы, ее машинным кодом и содержимым основных регистров при выполнении команд программы

Задача. Пусть имеется следующая программа:

При подготовке материала использовались источники:
https://domenzero.blogspot.com/2014/09/windows-debug.html
https://studfile.net/preview/5299570/page:3/
https://studfile.net/preview/7866452/page:7/

Добавить комментарий