Что означает debug. Команды программы debug

08.02.2019

Debug.exe ‑ программа отладчик,которую используют для проверки и отладки выполняемых файлов.

Использовалась при операционной системе MS-DOS . Под более поздние версии операционных систем

работает через эмулятор MS-DOS и имеет ограниченные возможности. Вызывается через командную сроку

DEBUG [[диск:][маршрут]имя_файла [параметры]].

Например: DEBUG C:\...\My.com

Данная программа является консольным приложением и предназначена для создания или изменения кода файлов. С помощью неё можно создавать простые приложение под MS-DOS и отслеживать их работу. Данный отладчик находится на самом низком уровне компиляторов assembler . Но обладает неплохими возможностями, такими как просмотр и изменение памяти, получение состояния регистров.

Команды debug.exe

Правила набора команд debug.exe:

· В debug.exe не различается регистр букв.

· Пробелы в командах используется только для разделения параметров.

· Вводимые числа должны быть в шестнадцатеричной системе счисления, причем без завершающей буквы h.

· Сегмент и смещение записываются с использованием двоеточия, в формате сегмент:смещение, например, CS:3C1 (смещение 3C1h в сегменте кода) или 40:17 (смещение 17h в сегменте, адрес начала которого - 40h).

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

Таблица 1. Краткая таблица всех команд debug.exe

Команда Описание Формат
A (Assemble) Транслирование команд ассемблера в машинный код; адрес по умолчанию - CS:0100h. A [<адрес_начала_кода>]
C (Compare) Сравнение содержимого двух областей памяти; по умолчанию используется DS. В команде указывается либо длина участков, либо диапазон адресов. C <начальный_адрес_1> L<длина> <начальный_адрес_2> C <начальный_адрес_1> <конечный_адрес_1> <начальный_адрес_2>
D (Display/Dump) Вывод содержимого области памяти в шестнадцатеричном и ASCII-форматах. По умолчанию используется DS; можно указывать длину или диапазон. D [<начальный_адрес> ] 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:

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

· Адрес первого слева показанного байта в формате сегмент:смещение .

· Шестнадцатеричное представление параграфа (16 байт), начинающегося с указанного в начале строки байта.

· Символы этого же параграфа в ASCII-формате.

Адрес, указанный в строке, относится исключительно к первому байту в параграфе, а адреса последующих байтов следует вычислять самостоятельно. Шестнадцатеричное представление содержит по два знака в каждом байте, а сами байты разделены пробелами для облегчения чтения. Кроме того, следует отметить, что восьмой и девятый байты разделены дефисом, разделяя тем самым параграф на две части и облегчая вычисление адресов байтов в параграфе.

Полезные приемы с командой D

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

Первые 16 байт области данных BIOS содержат адреса параллельных и последовательных портов. Поэтому с помощью следующей команды можно проверить эти порты:

Первые выведенные восемь байтов указывают на адреса последовательных портов COM1-COM4 . Следующие 8 байтов указывают на адреса параллельных портов LPT1-LPT4 . Например, если на вашем компьютере есть один параллельный порт, то первые два байта будут, скорее всего, такими: 7803. Адрес порта записывается в обращенной последовательности, т.е. 0378.

Проверка оборудования

Первые два байта, располагающиеся в BIOS по адресу 410h, содержат информацию об установленном в системе оборудовании. Находим эти байты командой:

Предположим, что первые два байта окажутся 23 44. Расшифруем эти байты для получения информации об установленных устройствах. Для этого обратим эти байты (44 23), затем переведем их в двоичную систему счисления. Получаем:

Значение бита
Позиция бита

Что означают эти биты? Продолжаем расшифровывать:

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

В области данных BIOS по адресу 417h находится первый байт, который хранит состояние регистра клавиатуры. Выключаем Num Lock и Caps Lock , затем набираем команду:

Первый байт будет равен 00. Включив Num Lock и Caps Lock , снова выполняем команду. Теперь первый байт должен равняться 60. Опытным путем установлено, что при включенном Num Lock первый байт равен 20, а при Caps Lock - 40.

Проверка состояния видеосистемы

По адресу 449h в BIOS находится первая область видеоданных. Для проверки набираем:

Первый байт показывает текущий видеорежим (к примеру, 03 - цветной), а второй - число столбцов (например, 50 - режим с 80 столбцами). Число строк можно найти по адресу 484h (40:84).

Проверка копирайта BIOS и серийного номера

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

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

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

Непосредственный ввод программы в память с помощью debug.exe

debug.exe позволяет вводить программу непосредственно в память машины, а затем следить и управлять е выполнением. Мы будем вводить программу в машинных кодах, используя команду E . При этом будьте бдительны ‑ ввод ошибочных данных по ошибочному адресу чреват непредсказуемыми последствиями! Хотя к серьезным проблемам в системе это вряд ли приведет, но потерять все данные, введенные в debug.exe , можно запросто. Программа, которую необходимо ввести, использует данные, заложенные непосредственно в теле инструкций. Далее показан листинг программы на Ассемблере, в комментариях указаны аналоги команд языка в машинных кодах, а также объяснение каждой команды. Заметьте, что в числах нет символа h , поскольку, как было сказано выше, debug.exe понимает только числа в шестнадцатеричной системе.

MOV AX, 0123 ; код B82301: заносим значение 0123h в AX

ADD AX, 0025 ; код 052500: прибавляем 0225h к значению AX

MOV BX, AX ; код 8BD8: заносим значение AX в BX

ADD BX, AX ; код 03D8: прибавляем значение AX к BX

MOV CX, BX ; код 8BCB: заносим значение BX в CX

SUB CX, AX ; код 2BC8: отнимаем значение AX из CX

SUB AX, AX ; код 2BC0: очищаем AX

JMP 100 ; код EBEE: переходим к началу программы

Как можно заметить, каждая машинная инструкция имеет длину от 1 до 3 байтов. Первый байт указывает операцию, последующие ‑ ее операнды. Исполнение программы начинается соответственно с первой инструкции и последовательно проходит через все инструкции одну за другой. Теперь можно ввести программу в память. Разделим машинный код на три части по шесть байт и введем каждую, используя команду E и начиная с адреса CS:100 .

Теперь, когда программа введена в память, попробуем управлять ее выполнением. Для начала проверим текущее состояние регистров и флагов, для этого вводим команду R . Отладчик выведет содержимое регистров в шестнадцатеричной форме; на разных машинах содержимое регистров может различаться.

Итак, как можно видеть, debug.exe инициализировал сегменты DS , ES , SS , CS одним и тем же адресом. Регистр IP содержит 0100 , указывая на то, что инструкции выполняются со смещения 100h относительно CS (а мы, вводя инструкции в память, как раз указали этот адрес).

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

После регистров и состояния флагов debug.exe выводит информацию о первой инструкции, которая будет выполняться:

· Адрес инструкции, в нашем случае это 0B12:0100, где 0B12 ‑ адрес сегмента кода.

· Машинный код, соответствующей этой инструкции (B82301).

· Собственно инструкция, записанная на ассемблере (MOV AX,0123).

Теперь, после анализа содержимого регистров и флагов, давайте перейдем к выполнению программы. Выполнять программу мы будем пошагово, используя команду T . Использовав в первый раз команду T , мы выполняем инструкцию MOV . Здесь машинный код операнда инструкции ‑ 2301 . Операция помещает 23 в AL (младшая половина AX ), а 01 ‑ в AH (старшая). После этого debug.exe снова выводит информацию о регистрах:

Теперь AX содержит 0123h , IP 0103h (следовательно, длина выполненной инструкции: 0103h - 0100h = 3 байта), а в качестве следующей инструкции указана операция ADD . Так, раз за разом выполняя команду T , мы дойдем до последней инструкции JMP 100 . Она установит регистр IP в 100h , и debug.exe вернется к началу программы. Возвращаясь к началу программы, следует заметить, что в DS , ES , SS и CS содержится один и тот же адрес. Дело в том, что debug.exe рассматривает введенные программы исключительно как программы .COM . А в программах .COM , в отличие от .EXE , стек, код и данные хранятся в одном сегменте.

Ассемблирование и дизассемблирование

В прошлом примере мы вводили программу в машинных кодах, однако, debug.exe вполне способен понимать инструкции, записанные на ассемблере. Для работы с такими программами в debug.exe используются команды A и U .

Команда A запрашивает инструкции на ассемблере и преобразовывает их в машинный код. Для начала инициализируем начальный адрес для ввода инструкций (100h):

Отладчик выведет адрес сегмента кода и смещения (например, 13F2:0100 ). Теперь мы должны ввести следующие инструкции на ассемблере в память, после каждой строки нажимая Enter :

После ввода последней инструкции нажимаем Enter дважды, чтобы указать отладчику, что мы закончили вводить текст программы. Теперь программу можно запускать, используя команды R для просмотра регистров и T для трассировки. Замечу, что в своих программах при наличии инструкций INT их следует обрабатывать не командой T , а командой P , которая обрабатывает все прерывание сразу.

Перейдем к процедуре дизассемблирования, а в качестве примера возьмем только что введенную программу. Используем адреса первой и последней инструкций для указания диапазона, который мы собираемся дизассемблировать, т.е. 100h и 107h .

После выполнения этой команды debug.exe выведет инструкции, находящиеся в указанном диапазоне, на ассемблере, в машинных кодах, а также адрес каждой инструкции:

Сохранение программы на диске

Сначала задается имя файла:

Затем в регистр СХ необходимо поместить размер программы в байтах. Он будет равен разности конечного и начального смещений. Теперь остается только осуществить запись на диск командой W и в результате увидеть записанное количество байтов. В итоге мы получаем программу, готовую к исполнению.

Выход осуществляется командой q . Пример:

0B3B:0100 mov ax,1234

0B3B:0103 mov ah, 4c

0B3B:0105 int 21

0B3B:0100 B83412 MOV AX,1234

0B3B:0103 B44C MOV AH,4C

0B3B:0105 CD21 INT 21

AX=0000 BX=0000 CX=0007 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0B3B ES=0B3B SS=0B3B CS=0B3B IP=0100 NV UP EI PL NZ NA PO NC

0B3B:0100 B83412 MOV AX,1234

Запись 00007 байт

Для выполнения этой лабораторной работы понадобится несколько команд ассемблера:

MOV AH,<шестнадцатиричное число> - запись в регистр AH числа 02 для указания системной функции - вывод символа на экран;

MOV DL,<шестнадцатиричное число> - запись в регистр DL кода символа;

INT 21 - основное прерывание DOS (процедура), реализующее много различных функций; номер функции записывается предварительно в регистр AH; для распечатки символа на экране - в регистре AH функция 02, при этом в DL записывают предварительно код символа.

INT 20 - прерывание DOS, осуществляющее выход из программы (из.COM-программы).

Пример:

Вывести символ "*" на экран.

mov AH,02 ; системная функция 02 - вывод символа на экран

mov DL,2A ; ASCII-код звездочки

int 21h ; прерывание для вывода "*"

int 20h ; выход из программы

Практическое задание

Цель

Знакомство с отладчиком debug.exe. Получение практических навыков работы с данной программой.

Оборудование:

Персональный компьютер под управлением операционной системы Windows.

Программное обеспечение:

Программа Debug.

Вопросы к допуску

1. Для чего предназначена программа Debug?

2. Как запустить эту программу?

3. Каким образом вводятся команды в Debug?

4. Что такое идентификатор?

5. Как производится ввод программы в Debug?

Задание

· Изучить теоретический материал.

· Проделать описанные по ходу текста команды.

· Найдите сумму и разность 2-х чисел: 1-е число - номер в группе (переведенное в шестнадцатиричную форму), 2-е - число, противоположное номеру первой буквы фамилии в алфавите (отрицательное число в дополнительном коде). Сумму и разность переведите в десятичную форму.

· Просмотрите содержимое регистров микропроцессора, а также флагов и выпишите их в протокол. Какую функцию выполняет каждый из регистров? .

· Запишите в регистр AX первое число (из задания 3), а в регистр BX - второе (из задания 3). Введите в оперативную память в сегмент кода (смещение 100) машинную команду сложения регистров AX и BX. Просмотрите на экране ее ассемблерную форму. Выполните эту команду, результат переведите в десятичную форму.

· Введите в оперативную память в сегмент кода (смещение 100) набор команд ассемблера для распечатки символа на экране - первой буквы вашей фамилии. Проверьте программу в DEBUG. Затем запишите ее на диск в виде.COM-файла. Чему равен размер программы? Запустите ее на выполнение из DOS.

· Все действия опишите в отчете.

1. Название работы.

2. Цель работы.

3. Приборы и оборудование.

4. Краткие теоретические сведения.

5. Описание проделанных действий.

6. Текст созданной программы.

7. Выводы.

Контрольные вопросы

1. Какая команда производит ввод в память данные или инструкции машинного кода?

2. Как сравнить содержимое двух областей памяти?

3. Каким образом заполнить область памяти данными из списка?

4. Какая команда производит выполнение отлаженной программы на машинном языке?

5. Какая команда записывает файл из Debug?

6. Как производится ассемблирование и дизассемблирование?

Лабораторная работа

"Изучение команд отладчика DEBUG"

Отладчик DEBUG предназначен для решения широкого круга задач. К ним относятся, например следующие задачи:

Изучение текущего содержимого оперативной памяти;

Редактирование отдельных секторов на флоппи-дисках и на винчестере;

Дизассемблирование.COM -файлов;

Разработка и отладка собственных программ на языке ассемблера;

Изучение работы программ и их модификация;

Тестирование периферийного оборудования для работы с портами ввода /вывода напрямую (в диалоговом режиме);

Изучение системы команд процессора, прерываний BIOS и MS-DOS.

При изучении схемотехники PC/AT необходим инструмент, позволяющий напрямую работать с периферийными портами и оперативной памятью, а также создавать короткие тестовые программы для генерации нужных сигналов на системной плате периферийных адаптерах. Отладчик наилучшим образом подходит для этих целей.

В версии MS-DOS 6.22 размер отладчика составляет 15718 байт. Существует два способа запуска отладчика: debug ENTER и debug filename ENTER. После запуска отладчика загружается в оперативную память, а содержимое сегментных регистров CS, DS, ES, SS на первый свободный параграф сразу после самого отладчика. Регистр IP устанавливается равным 100.

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

После запуска отладчика слева на экране появляется черта (-) ,которая указывает на то, что отладчик ждёт команду. Все числа интерпретируются отладчиком в шестнадцатиричной системе исчисления.

Для исполнения любой команды надо нажать клавишу "Enter".

Рассмотрим непосредственно команды отладчика DEBUG .

А-команда ассемблирования(ASSEMBLE).

Эта команда позволяет вводить программы с использованием мнемкода команд процессора в оперативную память. Ввод команды отладчика

А < число >

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

DB 1 , 2 ,3 ,"example"

DW 1000,2000,"FFFF"

Отладчик поддерживает мнемоники всех команд процессора 80286. .При ассемблировании команд JMP CALL по умолчанию, если это возможно, используется SHORT-вариант этих команд, но можно указывать перед адресом переход NEAR и FAR, что приведет к генерации соответствующих команд.

Сначала наберите A 100 ,затем введите программу

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

В данном примере показан метод организации задержки путем "прокрутки" двух циклов. Запустить эту программу можно, набрав команду

Здесь приведена программа забивки экрана символом "!"

Затем надо ввести программу

В конце программы в этих примерах стоит команда INT 20, обеспечивающая возврат управления обратно на монитор команд отладчика. Запуск этой программы осуществляется по команде G =100

MOV AX,21 ;Запись значения 21H в регистр AX

MOV AX, ;запись в АХ содержимого ячейки памяти с адресом 21H

С-сравнение(COMPARE).

Эта команда сравнивает побайтно две области памяти и печатает все различия между ними в форме

<адрес> <содержимое> <содержимое> <адрес>

В данной записи слева приведена информация о первой области памяти, а справа - о второй.

Сравнить два блока длиной 256 байт.Первый начинается с адреса 100, а второй - с 300.Для этого надо набрать

Другой вариант той же команды

Сравнить первые 100 -16 байт оперативной памяти с последними

C 0:0L100 F000:FF00

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

D-вывод на экран содержимого памяти (DUMP).

Эта команда даёт на дисплее коды из указанной области оперативной памяти, представляемых в шестнадцатиричной системе исчисления, а справа их представление в ASCII-символах. Кодовые комбинации, не имеющие символьного представления в стандарте ASCII, отображаются точками.

В строке умещается 16 байт, при этом справа указывается полный адрес самого левого байта. Таким образом, в одной строке приводится шестнадцатиричный дамп, а также ASCII-дамп шестнадцати байт оперативной памяти.

Если команда D дана без параметров, то всего на экране отображается 128 байт (80H) в восьми строках. В каждой строке имеется знак "-", разделяющий 16 байт пополам - между 8-ым и 9-ым байтами.

Для того, чтобы просмотреть указатели-вектора первых тридцати двух прерываний (20Н),надо ввести команду

Другой вариант без указания диапазона

Первые четыре байта дают вектор прерывания INT0 ,следующие четыре

Просмотр последних шестнадцати байт из ПЗУ:

Просмотр области оперативной памяти, используемой BIOS:

Если периодически несколько раз повторять эту команду, то при сравнении исходной и последующих распечаток имеются изменения в некоторых местах, в частности, происходит увеличение содержимого четверки байт начинающихся с адреса 40:006C. Дело в том,что именно по этому адресу хранится четырехбайтных счетчик системных часов.

Е- команда изменения содержимое памяти (ENTER) .

Ввод команды:

E <адрес>

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

Затем необходимо набрать один из трех управляющих символов:

1)"пробел" - означает переход к редактированию следующего байта,

2)"ENTER". Это приведет к выходу из режима побайтного редактированию на командный уровень отладчика,

3)"-" . Нажатие этого знака приведет к переходу на редактирования предыдущего байта.

Изменим значение счетчика системных часов. Введем команду

И наберем четыре числа 70 70 70 70 , разделенных пробелами, затем символ возврата каретки. Далее необходимо выйти из отладчика и выполнить команду time операционной системы DOS.

F-команда заполнения (FILL).

Эта команда позволяет заполнить содержимое указанного диапазона оперативной памяти повторяющейся цепочкой байтов заданными значениями. В частности, когда цепочка состоит из одного байта, эта команда позволяет обнулить нужную область памяти, когда байт равен 0, а также занести во все биты единицу, заполняя байтом равным FF.

Команда имеет следующий синтаксис -

F<диапазон_памяти> <цепочка_байтов >

F 5000L1000 00FF

Заполнит отрезок памяти длиной 4096 байт (1000Н) повторяющейся парой байтов 00 FF , начиная с адреса

G- команда запуска программы (GO).

Эта команда предназначена для запуска программы на исполнение. При этом, если той области памяти, где хранятся данные, передается управление как программе, компьютер требует его повторный запуск. В случае, когда в программе имеются серьезные ошибки, попытка исполнить ее с помощью оператора G также приводит к зависанию компьютера.

Этот оператор используется в одной из следующих четырех форм:

Исполнение этого оператора сводится к передаче управления адресу CS:IP.

б)G= < адрес >

При этом производится запуск программы с указанного адреса.

Например, оператор

Приводит к запуску процедуры POST (программа самодиагностики ЭВМ

в) G < адрес >

В этом случае программа запускается с адреса CS:IP и при достижении команды с указанным адресом осуществляется останов (BREAK) исполнения программы. Распространенной ошибкой является пропуск знака равенства (=) при использовании команды G. В этом случае указанный адрес воспринимается как адрес останова, и если CS:IP указывает, например, на область данных, то компьютер "зависнет".

г) G=<адрес > <другой _адрес>

В этом случае производится запуск программы с указанного после знака = адреса в случае достижения программой команды с величиной адреса, указанного вторым (др. адрес), происходит останов.

Такой способ останова программы называется введением контрольной точки останова. При указании контрольной точки останова соответствующий байт команды по этому адресу заменяется командой INT3, имеет размер 1 байт. При достижении контрольной точки исходное значение байта восстанавливается.

Н- команда шестнадцатиричной арифметики (HEXARITHMETIC).

Эта команда позволяет получить сумму и разность указанных в команде шестнадцатиричных чисел.

Получаем 02A9 (сумма) и 0095 (разность).

I- команда ввода из порта (INPUT). Эта команда позволяет прочесть содержимое порта ввода с указанным адресом и вывести его на экран в шестнадцатиричном виде.

Синтаксис команды:

I<адрес порта>

Эта команда даст состояние младшего байта счетчика системных часов. Исполнение команды I42 , с её повторением даст нам младший и старший байты счетчика, связанного с динамиком.

N-команда указания имени (NAME).

В этой команде задаётся имя файла, который далее будет считываться с диска командой L, либо записываться на диск командой W.

Синтаксис этой команды следующий:

N <имя_файла >

Прочтем с диска в оперативную память файл TEST.COM. Для этого выполним

В регистровую пару BX:CX, будет занесена длина загруженного файла в байтах.

L-команда загрузки с диска (LOAD).

Эта команда позволяет загружать как логические сектора с флоппи-дисков и винчестеров, так и отдельные файлы

L<адрес> <номер_диска> <начальный_сектор> <число_секторов >

Здесь "адрес" означает начальный адрес в оперативной памяти, начиная с которого будет последовательно размещаться содержимое блоков-секторов. Переменная "номер диска" указывает с какого диска будет производится загрузка. Число 0 означает диск А, число 1-диск В, число 2- диск С и т.д. Следующие две переменные указывают с какого сектора начинается чтение и общее число прочитанных секторов.

Загрузить ВООТ-блок с флоппи-диска А, в оперативную память, начиная с с адреса DS:1000, для чего необходимо выполнить команду

Затем содержимое ВООТ-блока можно просмотреть на экране командой

А также дизассемблировать.

М-команда копирования содержимого части оперативной памяти (MOVE).

Синтаксис команды следующий

М<диапазон > <начальный_адрес>

Здесь "диапазон" указывает на копируемую область памяти, а "начальный адрес " - на адрес первого байта, начиная с которого размещаются скопированные данные. Эту команду можно использовать для временного хранения содержимого оперативной памяти с ее последующим восстановлением.

В начале рассмотрим содержимое памяти:

Затем сохраним часть памяти

Обнулим исходное содержимое

Проверим обнуление

И наконец восстановим исходное содержимое

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

Р-высокоуровневая трассировка (PROCEED).

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

Однако, в отличие от Т трассировки, эта трассировка менее детальна. Она отслеживает досконально подпрограммы и программные прерывания, а также циклы LOOP и строковые инструкции с повторением, но как и в случае Т-трассировки после каждой инструкции печатается содержимое всех регистров и следующей исполняемой инструкции.

Синтаксис команды

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

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

Этот тип Р-трассировки крайне полезен при изучении общей логики выполнения программы, избавляя от утомительного отслеживания деталей. При начальном изучении программы необходимо начинать именно с Р- трассировки.

Q- команда выхода из отладчика (QUIT).

Команда Q приводит к выходу из отладчика на следующий верхний уровень. При этом рабочие файлы автоматически не сохраняются.

R-команда изменения содержимого регистров (RTGISTER), просмотр значений отдельных регистров и регистра флагов с возможностью их изменения.

Дает распечатку содержимого всех регистров, а также команды, на которую указывает CS: IP

R-<имя_регистра>

Дает распечатку содержимого указанного регистра, и потом печатает двоеточие на следующей строке. Перечислим возможные имена регистров

AX, BX, CX, DX, SP, BP, SI, DI, DS, ES, SS, CS, IP, F(регистр флагов)

При исполнении команды R F надо учитывать, что кодирование значений флагов производится весьма специфическим образом. Ниже приводится таблица кодировки, где символьная пара слева соответствует значению 1 флага (флаг установлен), а справа - значению 0:

Флаг переполнения OV NV

Флаг направления DN UP

Флаг маск. прерывания EI DI

Флаг знака NG PL

Флаг нуля ZR NZ

Флаг доп. Переноса AC NA

Флаг чётности PE PO

Флаг переноса CY NC

Значение флагов печатаются в строку. Сразу же за этим в строке печатается знак черты "-" , отладчик переходит в состояние ожидания ввода с клавиатуры. Нижеприведенная команда изменяет 1,3,5 и 7-й флаги:

OV DN EI NG ZR AC PE CY - PO NZ DI NV

Порядок следования обозначений флагов и пробелы при этом не имеют значения.

S- команда поиска упорядоченного набора байтов (SEARCH).

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

S <диапазон_памяти> <цепочка_байтов>

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

Предположим, что мы хотим определить встречается цепочка "DOS"(коды 44 4F 53) в первых 32К оперативной памяти. Для этого необходимо ввести команду

S 0:0L8000 44 4F 53

T- команда трассировки (TRACE).

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

Команда Т

Производит трассировку одной текущей инструкции, которую указывает CS:IP с соответствующим изменением IP.

Т <число>

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

Т=<адрес>

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

Общий вид команды Т следующий:

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

Производит трассировку первой исполняемой инструкции при начальном запуске компьютера.

U- команда дизассемблирования (UNASSEMBLE).

Эта команда позволяет дизассемблировать программы, загруженные в рабочую область отладчика

Общий синтаксис:

U<начальный_адрес > <длина>

U<начальный_адрес> <конечный_адрес>

Вызывает дизассемблирование 32 байт, начиная с байта, на который указывает CS:IP с выводом результирующего на дисплей.

Если при запуске отладчика переадресовать вывод в файл, то можно получить листинг дизассемблированной программы. При этом команду U и Q (выход из отладчика) придется набирать "вслепую" без эхо-печати на дисплее.

W-команда записи на диск (WRITE).

Эта команда позволяет записывать на диск (флоппи-диск или винчестер) в последовательные блоки указанный диапазон оперативной памяти, а также записывать в файлы.

Запись в секторы на диск производится командой

W <адрес> <номер_диска> <начальный_сектор><число_секторов>

Эта команда записывает на диск не более 80Н секторов, число секторов не более 80.

Параметр "адрес команды" означает адрес оперативной памяти, начиная с которого содержимое памяти копируется на диск.

Параметр "номер диска" указывает драйв, на который производится запись (0-диск А:, 1-диск В:)

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

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

Запись в файл на диске производится командой W без аргументов. Однако, предварительно необходимо командой N указать имя файла, куда будет производиться запись, а также в пару регистров BX:CX занести длину записываемого файла. Начало области памяти, откуда будет производиться запись, всегда по умолчанию является байтом с адресом CS:100.

Пример записи файла на диск:

BX 0000 - это старое значение содержимого регистра

: 0 - новое значение

: А - размер файла для записи 10 байт (0АH)

W - запись файла на диск, с которого загружен Debug.exe

1. Изучить команды программы DEBUG по описанию лаб. работы.

2. Загрузить с дискеты операционную систему MS DOS 6.22 , запустить программу debug.exe и проверить действие команд с примерами, отличающимися от приведенных в описании, записать эти примеры в отчёт по лаб. работе. При проверке работы программ на ассемблере рекомендуется использовать команды T и R.

3. Загрузить два массива памяти объёмом 10 байт с адреса 100Н и 200Н одинаковыми кодами 55Н (команды F и M), изменить содержимое одной ячейки памяти и с помощью команды C определить адрес этой ячейки памяти. Все действия отразить в отчёте.

4. Составить простую программу на ассемблере с выводом кодов на дисплей (см. пример 2 в разделе команды А), записать эту программу на дискету в виде файла iit.com, (использовать команду W без параметров) выйти из программы debug в DOS и запустить её, набрав в командной строке iit.com. Проверить правильность её работы. Войти в программу debug и загрузить в неё файл iit.com и проверить правильность загрузки командой U.

Главный писатель по вопросам технологий

Вам кто-то послал по электронной почте файл DEBUG, и вы не знаете, как его открыть? Может быть, вы нашли файл DEBUG на вашем компьютере и вас заинтересовало, что это за файл? Windows может сказать вам, что вы не можете открыть его, или, в худшем случае, вы можете столкнуться с соответствующим сообщением об ошибке, связанным с файлом DEBUG.

До того, как вы сможете открыть файл DEBUG, вам необходимо выяснить, к какому виду файла относится расширения файла DEBUG.

Tip: Incorrect DEBUG file association errors can be a symptom of other underlying issues within your Windows operating system. These invalid entries can also produce associated symptoms such as slow Windows startups, computer freezes, and other PC performance issues. Therefore, it highly recommended that you scan your Windows registry for invalid file associations and other issues related to a fragmented registry.

Ответ:

Файлы DEBUG имеют Uncommon Files, который преимущественно ассоциирован с Unknown Apple II File (found on Golden Orchard Apple II CD Rom).

Иные типы файлов также могут использовать расширение файла DEBUG. Если вам известны любые другие форматы файлов, использующие расширение файла DEBUG, пожалуйста, свяжитесь с нами , чтобы мы смогли соответствующим образом обновить нашу информацию.

Как открыть ваш файл DEBUG:

Самый быстрый и легкий способ открыть свой файл DEBUG - это два раза щелкнуть по нему мышью. В данном случае система Windows сама выберет необходимую программу для открытия вашего файла DEBUG.

В случае, если ваш файл DEBUG не открывается, весьма вероятно, что на вашем ПК не установлена необходимая прикладная программа для просмотра или редактирования файлов с расширениями DEBUG.

Если ваш ПК открывает файл DEBUG, но в неверной программе, вам потребуется изменить настройки ассоциации файлов в вашем реестре Windows. Другими словами, Windows ассоциирует расширения файлов DEBUG с неверной программой.

Установить необязательные продукты - FileViewPro (Solvusoft) | | | |

DEBUG Инструмент анализа файлов™

Вы не уверены, какой тип у файла DEBUG? Хотите получить точную информацию о файле, его создателе и как его можно открыть?

Теперь можно мгновенно получить всю необходимую информацию о файле DEBUG!

Революционный DEBUG Инструмент анализа файлов™ сканирует, анализирует и сообщает подробную информацию о файле DEBUG. Наш алгоритм (ожидается выдача патента) быстро проанализирует файл и через несколько секунд предоставит подробную информацию в наглядном и легко читаемом формате.†

Уже через несколько секунд вы точно узнаете тип вашего файла DEBUG, приложение, сопоставленное с файлом, имя создавшего файл пользователя, статус защиты файла и другую полезную информацию.

Чтобы начать бесплатный анализ файла, просто перетащите ваш файл DEBUG внутрь пунктирной линии ниже или нажмите «Просмотреть мой компьютер» и выберите файл. Отчет об анализе файла DEBUG будет показан внизу, прямо в окне браузера.

Перетащите файл DEBUG сюда для начала анализа

Просмотреть мой компьютер »

Пожалуйста, также проверьте мой файл на вирусы

Ваш файл анализируется... пожалуйста подождите.

    Основной режим работы отладчика Debug (характерная особенность - присутствие чёрточки и мигающего справа от неё курсора). Основной режим работы устанавливается автоматически после загрузки отладчика.


В этом режиме можно набирать любые макрокоманды отладчика от A до W . Выход из этого режима означает завершение работы отладчика.

    Режим ассемблирования . Вход в режим ассемблирования из основного режима работы отладчика осуществляется набором команды A . Признак нахождения в этом режиме - наличие адреса (например, 0CC0:0100 ) перед знаком курсора:


После набора команды необходимо нажатием клавиши Enter ввести её в память (пока не нажата клавиша Enter команда в память не введена ).

Если команда набрана с ошибкой и нажата клавиша Enter , эта команда в память не вводится. Вместо этого отладчик предлагает ввести её повторно, по тому же самому адресу :


Возвращение из режима ассемблирования в основной режим работы отладчика - нажатие клавиши Enter в пустой строке (когда не набрано ни одного символа ), например, в строке 0CFC:0103 .

    Режим ввода данных . Данный режим может быть реализован во время выполнения макрокоманд E и R . В этом режиме вводятся данные в ячейки оперативной памяти или в регистры процессора:


Возвращение из этого режима в основной режим работы отладчика - нажатие клавиши Enter. Продолжение работы в режиме ввода данных - нажатие клавиши пробел. Нажимая клавишу пробел, можно попасть на любую ячейку памяти и ввести в неё нужное число. Ввод значений завершается нажатием клавиши Enter.

    Режим выполнения кода . Вход в режим выполнения кода из основного режима работы отладчика осуществляется набором команды G . Как правило, время нахождения в данном режиме - считанные мгновенья. Исключение - зависание программы или выполнение огромных циклов.

Возвращение в основной режим работы отладчика осуществляется автоматически, без участия работающего с этим отладчиком человека.

    Режим ввода информации с клавиатуры во время работы в режиме выполнения кода. Завершение этого режима и продолжение выполнения кода осуществляется нажатием клавиши Enter.

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

    Аварийное прекращение работы отладчика . Имеет место в случае, когда процессор пытается исполнить запрещённый в режиме эмуляции работы микропроцессора i8086 программный код. Например, пытается выполнить команды работы с портами ввода-вывода данных.

DEBUG: А (Assemble - Ассемблировать)

Ассемблирует мнемонические операторы ассемблера микропроцессоров 8086/8087/8088 непосредственно в память.

Данная команда создает выполняемый машинный код из операторов языка ассемблера. Все числовые значения указываются в шестнадцатиричном формате, и Вы должны задавать их в виде 1-4 символов. Укажите префиксную мнемонику перед кодом операции, к которой она относится.

Формат а [адрес]

Параметры

Адрес Указывает адрес, в который будут вставлены ассемблированные команды. Вы должны использовать шестнадцатиричные значения для адресов и вводить каждое значение без конечного символа h. Если адрес не указан, команда а использует тот адрес, который был указан в последний раз.

Для изменения сегментов используется мнемоника cs:, ds: и ss:. Для дальнего возврата используется мнемоника retf. В операторах манипулирования строками необходимо явно задавать размер строки. Например, для пересылки строк слов (16 битов) используйте movsw, а для пересылки строк байтов (8 битов) используйте movsb.

Ассемблер автоматически ассемблирует короткие, близкие или дальние переходы и вызовы в зависимости от байтового смещения и адреса назначения. Вы можете исправить такие переходы или вызовы с помощью префикса near или far, как показано в следующем примере:

  • -а0100:0500
  • 0100:0500 jmp 502 ; 2-байтовый короткий переход
  • 0100:0502 jmp near 505 ; 3-байтовый близкий переход
  • 0100:0505 jmp far 50a ; 5-байтовый дальний переход

Префикс near можно приводить сокращенно как ne, однако для префикса FAR сокращения не предусмотрено.

Отладчик Debug не может определить, ссылается ли данный операнд на слово или байт в памяти. Вы должны явно указывать это с помощью префикса word prt или byte prt. Для сокращения записи можно пользоваться соответствующими обозначениями wo и by. В следующем примере приводятся два формата:

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

mov ах,21 ; Загрузить 21h в АХ

mov ах, ; Загрузить в АХ содержимое ячейки

; памяти по адресу 21п

В команде а можно использовать две распространенных псевдоинструкции: код операции db, по которому байтовые значения определяются непосредственно в памяти, и код операции dw, по которому словные значения определяются непосредственно в памяти. В следующих примерах приведены обе псевдоинструкции:

db 1,2, 3,4, "ЭТО ПРИМЕР"

db " ЭТО ПРИМЕР ЗНАКА КАВЫЧЕК: " "

dw 1000,2000,3000,"БАХ"

Команда а поддерживает все форматы регистровых команд с косвенной адресацией, например:

add bx, 34.

Команда а поддерживают также все синонимы кодов операции, как показано в следующем примере:

Для кодов операции микропроцессора 8087 необходимо в явном виде указывать префиксы wait или fwait, как показано в следующем примере:

DEBUG: С (Compare - Сравнить)

Сравнивает содержимое двух участков памяти.

Формат с диапазон адрес

Если содержимое участков памяти диапазон и адрес идентичны, на экран ничего не выводится, и утилита Debug выдает свой командный запрос. При наличии различий Debug выводит на экран сообщение в следующем формате:

адрес1 байт1 байт2 адрес2

Смотрите описание данного формата в следующем примере.

Две следующие команды выполняют одинаковое действие:

Каждая из этих команд сравнивает содержимое блока памяти с адресами от 100h до 10Fh с блоками памяти, имеющими адреса от 300h до 30Fh.

Debug отвечает на любую из предыдущих команд, выводя следующую информацию (предполагая, что DS=197F):

Обратите внимание, что адреса 197F:00106 и 197F:0306 отсутствуют в списке. Это означает, что значения по этим адресам идентичны.

DEBUG: D (Dump - Дамп)

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

Формат d диапазон

Параметры

Диапазон Указывает начальный и конечный адрес или начальный адрес и длину участка памяти, содержимое которого Вы хотите вывести на экран. Если Вы не указываете в команде d диапазон адресов, то Debug выводит на экран содержимое 128 байтов, начиная с первого адреса после конца диапазона адресов, указанного в предыдущей команде d.

При использовании команды d Debug выводит дамп памяти в двух колонках: шестнадцатиричный дамп (каждый байт представлен в шестнадцатиричном формате) и дамп памяти в кодах ASCII (каждый байт представлен символом в кодах ASCII). Каждый непечатный символ обозначается точкой (.). Каждая строка на экране выводит содержимое 16 байтов, причем между восьмым и девятым байтам стоит тире (-). Каждая отображаемая строка начинается на 16-ти байтовой границе.

debug выводит на экран дамп памяти в следующем виде:

04BA: 0100 54 4F 4D 00 53 41 57 59 - 45 52 00 00 00 00 00 00 ТОМ SAWYER

Если Вы вводите команду d без параметров, то формат отображаемой на экране информации будет именно таким, как показано выше. Каждая очередная строка отображения начинается с адреса, который на 16 байтов больше, чем адрес предыдущей строки (или на 8 байтов больше, если Вы имеете экран шириной в 40 колонок).

Каждая последующая команда d, вводимая без параметров, отображает на экране байты, расположенные непосредственно после последнего из ранее отображенных байтов памяти.

При вводе следующей команды Debug выводит содержимое 20 байтов, начиная с CS:100:

Если Вы введете приведенную ниже команду, Debug выводит содержимое всех байтов памяти в диапазоне адресов от 100h до 115h в сегменте CS:

DEBUG: Е (Еnter - Ввод)

Вводит байтовые значения в память по указанному адресу.

Вы можете вводить данные или в шестнадцатиричном формате или в формате кодов ASCII. Любые записанные ранее данные по указанным адресам будут уничтожены.

Формат e адрес [список ]

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

  • · Заменить значение байта памяти. Для этого введите новое значение после текущего. Если введенное Вами значение не является допустимым шестнадцатиричным значением, или в нем содержится более двух символов, debug не воспроизводит неверный или избыточный символ.
  • · Перейти к следующему байту. Для этого нажмите клавишу Пробел. Для того, чтобы изменить значение данного байта, введите новое значение после текущего. Если при нажатии клавиши Пробел Вы окажетесь за пределом 8-байтовой границы памяти, Debug перейдет к новой строке экрана и в начале ее отобразит этот адрес.
  • · Вернуться к предыдущему байту памяти. Для этого введите символ дефиса или минуса (--). Вы можете несколько раз нажать клавишу Минус, чтобы переместиться назад более чем на один байт. Когда Вы вводите символ Минус, Debug переходит к новой строке и отображает в ней текущий адрес и содержимое байта.
  • · Закончить выполнение команды е. Нажмите для этого клавишу Enter. Вы можете нажать Enter в любой байтовой позиции.

Если Вы указываете значения для параметра список , команда е последовательно заменяет существующие значения байтов значениями из списка. Если при этом установлена ошибка, значения байтов не меняются.

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

Предположим, что Вы ввели следующую команду:

Debug выводит содержимое первого байта в следующем формате:

04BA: 0100 EB. _

Для того, чтобы изменить это значение на 41, введите 41 в позиции курсора:

04BA: 0100 EB. 41_

С помощью одной команды е Вы можете вводить значения байтов, следующие друг за другом. Вместо того, чтобы нажимать Enter после введения нового значения, нажмите Пробел. Debug выводит следующее значение. В данном примере, если Вы нажмете Пробел три раза, Debug выводит следующие значения:

04ВА: 0100 ЕВ.41 10. 00. ВС._

Для того, чтобы изменить значение ВС на 42, введите 42 в позиции курсора, как указано ниже:

04ВА: 0100 ЕВ.41 10. 00. ВС. 42_

Теперь, предположим, Вы решили, что вместо значения 10 должно быть 6F. Для того, чтобы исправить эту ошибку, введите символ Минус два раза для возврата к адресу 0101 (значение 10). Debug выводит следующее:

  • 04ВА: 0100 ЕВ. 41 10. 00. ВС.42-
  • 04ВА: 0102 00. -
  • 04ВА: 0101 10. _

Введите 6f в позиции курсора, чтобы изменить значение, как указано ниже:

04ВА: 0101 10. 6F_

Нажмите Enter, чтобы закончить выполнение команды е и вернуться к приглашению утилиты Debug

В следующем примере показан ввод строки:

eds: 100 "Это пример текста"

Строка занимает 17 байтов, начиная с DS:100.

DEBUG:F (Fill - Заполнить)

Заполняет область памяти в указанном диапазоне адресов значениями из указанного списка значений.

Вы можете указывать данные или в шестнадцатиричном формате, или в формате кодов ASCII. Любые ранее записанные в указанных адресах данные будут уничтожены.

Формат f диапазон список

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

Если какой-либо участок памяти в диапазоне адресов не существует или оказывается дефектным, Debug выводит сообщение об ошибке и прекращает выполнение команды f.

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

Предположим, что Вы ввели следующую команду:

f04ba: 1001100 42 45 52 54 41

В ответ Debug заполнит область памяти с адресами от 04ВА:100 до 04ВА:1FF указанными байтами. После этого Debug повторяет эти пять значений до тех пор, пока не окажутся заполненными все заданные 100h байтов памяти.

DEBUG:G (Go - Выполнить)

Выполняет текущую программу в памяти.

Формат g [=адрес ] [точки останова ]

Вы должны указать перед параметром адрес символ равенства (=), чтобы можно было отличить адрес запуска программы (адрес ) от адресов точек останова (точки останова ).

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

Когда выполнение программы доходит до точки останова, Debug записывает во все адреса точек останова их первоначальные инструкции, и для последней выполненной инструкции на экран выводятся значения регистров, флагов и декодированная инструкция. Debug выводит ту же самую информацию, как если бы ввели команду Debug r (регистр) и указали бы адрес точки останова;

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

Точки останова можно задавать только по адресам, содержащим первый байт кода операции микропроцессора 8086. Если Вы зададите более 10 точек останова, Debug выводит следующее сообщение:

Указатель стека пользователя должен иметь допустимое значение, а также иметь 6 свободных байтов для команды g. Для реализации перехода к тестируемой программе команда использует инструкцию iret. Debug устанавливает указатель пользовательского стека, а пользовательские флаги, регистр кодового сегмента и указатель инструкции заносятся в стек. (Если пользовательский стек неверен или слишком мал, возможно аварийное завершение работы операционной системы.) Debug помещает код прерывания (0CCh) по указанным адресам точек останова.

Не следует пытаться перезапустить программу после того, как DOS выведет следующее сообщение:

Программа завершилась нормально

Для правильного перезапуска программы перезагрузите ее с помощью команд n (имя) и l (загрузить).

При выполнении этой команды программа, находящаяся в данный момент в памяти, будет выполняться до тех пор, пока управление не попадет на адрес 7550 в сегменте CS. Затем Debug выводит содержимое регистров и флагов, выполнение команды g на этом прекращается.

С помощью следующей команды устанавливаются две точки останова:

gcs: 7550, cs: 8000

При повторном вводе команды g после того, как Debug встретила точку останова, выполнение программы начинается с инструкции, расположенной после точки останова, а не с начального адреса.

DEBUG: Н (Hex - Шестнадцатиричное значение)

Выполняет арифметические действия в шестнадцатиричной системе исчисления с двумя заданными в команде параметрами.

Формат h значение1 значение!

Сначала Debug складывает два указанных Вами параметра, а затем вычитает значение второго параметра из первого. Результаты этих действий выводятся в одной строке, сначала сумма, затем разность.

Предположим, что Вы вводите следующую команду:

В ответ на это Debug производит необходимые вычисления и выводит следующий результат:

DEBUG: I (Input - Ввод)

Считывает и выводит на экран один байт из указанного Вами порта.

Формат i порт

Параметры

Указывает адрес порта ввода. Адрес может быть 16-битовый.

Предположим, что Вы вводите следующую команду: 12f8

Предположим также, что в указанном порте содержится байт со значением 42h. Debug считывает байт и выводит на экран значение, как показано ниже: 42

DEBUG:L (Load - Загрузить)

Загружает файл или содержимое секторов диска в память.

Для того, чтобы загрузить содержимое байтов, указанных в регистрах ВХ:СХ из файла на диске, используйте следующий Формат: l [адрес ]

Для того, чтобы не использовать файловую систему DOS и загружать секторы по абсолютным адресам, используйте следующий Формат: l

Параметры

Указывает место в памяти, куда Вы хотите загрузить файл или содержимое сектора. Если Вы не указываете адрес, Debug использует текущий адрес из регистра СS.

устройство

Указывает устройство, содержащее диск, с которого следует считывать секторы. Имя устройства указывается в числовом виде: 0=А, 1=В,2=С и так далее. Параметры устройство, начало и число используются только в том случае, если Вы хотите загрузить содержимое особых секторов, а не файл, указанный в командной строке программы Debug или в самой последней команде n (имя).

Указывает шестнадцатиричное число с номером первого сектора, содержимое которого Вы хотите загрузить.

Указывает количество секторов, содержимое которых Вы хотите загрузить. Количество секторов указывается в шестнадцатиричном формате.

Если Вы вводите команду l без параметров, то утилита Debug загружает указанный ранее файл в память, начиная с адреса СS:100, и устанавливает регистры ВХ и СХ на число загруженных байтов. Если Вы не указали файл в командной строке Debug, то будет загружаться тот файл, который Вы указали последним, используя команду n.

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

Если Вы используете команду l со всеми возможными параметрами, Debug загружает в память содержимое дисковых секторов.

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

Debug игнорирует параметр адрес в выполняемых файлах с расширением .exe . При указании файла .exe Debug перемещает файл в адрес загрузки, указанный в заголовке файла .exe . Сам заголовок удален из файла .exe до загрузки файла в память, поэтому размер файла .exe на диске отличается от его размера в памяти. Если Вы хотите просмотреть файл .exe полностью, присвойте файлу другое расширение.

Вы можете загружать файл, использующий шестнадцатиричный формат Intel. Debug предполагает, что файлы с расширением.hex приводятся в шестнадцатиричном формате. Для загрузки шестнадцатиричного файла начиная с указанного в файле адреса, используйте команду l без параметров. При наличии параметра адрес Debug добавляет указанный адрес к адресу в шестнадцатиричном файле, чтобы определить адрес запуска.

Предположим, что Вы запускаете Debug и вводите следующую команду:

Теперь вы можете ввести команду l, чтобы загрузить в память файл File.com. Debug загружает файл и выводит на экран свое командное приглашение.

Допустим, что Вы хотите загрузить содержимое 109 (6Dh) секторов с дисковода С, начиная с логического сектора 15 (0Fh), в память с адреса 04BA:0100. С этой целью введите следующую команду:

104ba:100 2 0f 6d

DEBUG: М (Move - Переместить)

Копирует содержимое блока памяти в другой блок памяти.

Формат m диапазон адрес

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

Копирование данных с перекрытием осуществляется без потери данных в выходных адресах. Сначала копируются данные, которые могут быть утеряны. При перемещении блока данных из области памяти со старшими адресами в область памяти с младшими адресами сначала перемещаются данные по самым младшим адресам, а затем уже данные по более старшим адресам. Соответственно, при копировании блока данных из области памяти с младшими адресами в область памяти со старшими адресами сначала копируются данные по самым старшим адресам, а затем уже данные по младшим адресам.

Допустим, что Вы вводите следующую команду:

mcs: 100 110 cs: 500

Сначала Debug копирует содержимое адреса СS:110 в СS:510, затем копирует содержимое СS:10F в СS:50F и так далее до тех пор, пока не будет скопировано содержимое СS:100 в СS:500. Для того, чтобы просмотреть на экране результаты этого копирования, можно использовать команду Debug d (дамп), указывая выходной адрес, используемый Вами с командой m.

DEBUG:N (Name - Имя)

Задает имя выполняемого файла для команд Debug l (загрузить) или w (записать), или указывает параметры для выполняемого отлаживаемого файла.

Формат n [дисковод: ] [путь ] имя_файла

Для того, чтобы указать параметры для выполняемого файла, который Вы отлаживаете, используйте следующий формат: n параметры_файла

Для удаления текущих назначений используйте следующий формат: n

Команда n выполняет две функции. Во-первых, с ее помощью можно указать файл, предназначенный для дальнейшего использования в команде l или w. Если Вы запускаете Debug, не указывая отлаживаемого файла, то прежде, чем загружать какой-либо файл, Вам необходимо выполнить для этого файла команду nимя_файла . Имя файла корректно форматируется для блока управления файлом (FCB) в СS:5С. Во-вторых, по команде n отлаживаемому файлу назначаются параметры, такие как имена файлов и переключатели.

Для первого заданного Вами имени файла в команде n блок управления файлом (FCB) создается по адресу СS:5С. Если Вы указываете второе имя файла, блок FCB для этого параметра создается по адресу СS:6С. Количество символов, введенных в командной строке n (за исключением первого символа - n) сохраняется по адресу СS:80. Цепочка символов в командной строке n (опять-таки за исключением буквы n) сохраняется по адресам, начиная с С8:81. Обратите внимание, что данные символы могут представлять собой любые переключатели и разделители, допустимые в командном режиме DOS.

Предположим, что Вы запустили Debug и загрузили программу prog.com для отладки. Вы хотите указать два параметра для prog.com и выполнить программу. Типичным примером использования команды n может служить следующая последовательность команд:

В этом случае по команде g (выполнить) файл, находящийся в памяти, выполняется так, как если бы была введена следующая командная строка:

prog param1 param2

Таким образом, при тестировании и отладке сохраняется нормальная операционная среда времени выполнения для prog.com .

В следующем ряде команд первая команда n указывает File1.exe в качестве файла для последующей команды l, которая загружает File1.exe в память. Вторая команда n указывает параметры для File1.exe . Наконец, команда g выполняет File1.exe так, как будто Вы ввели File1 file2.dat file3.dat в командном режиме DOS.

nfile2.dat file3.dat

Обратите внимание, что Вы не используете команду l после второй формы команды n. Также обратите внимание, что если Вы используете команду w, DOS сохраняет отлаживаемый файл File1.exe под именем File2.dat . Для того, чтобы избежать этого, Вы должны использовать всегда первую форму команды n до команд l или w .

DEBUG: О (Оutput - Вывод)

Передает указанный байт в порт вывода.

Формат о порт значение _байт

Параметры

Для направления байтового значения 4Fh в порт вывода 2F8h введите следующую команду:

DEBUG: Р (Proceed - Продолжить)

Выполняет без прерывания (до полного завершения) программный цикл, инструкцию обработки строк с повторением, программное прерывание, вызов подпрограммы или любую другую инструкцию.

Формат р [=адрес ] [число ]

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

Если параметр адрес не содержит явного указания типа сегмента, Debug использует регистр СS отлаживаемой программы. Если параметр адрес опущен, выполнение программы начинается по адресу, указанному регистрами СS:1Р отлаживаемой программе. Параметру адрес должен предшествовать символ равенства (=) для того, чтобы его можно было отличить от параметра число . Если инструкция по указанному адресу не является инструкцией начала цикла, инструкцией обработки строк с повторением, программным прерыванием или вызовом подпрограммы, команда р выполняется так же, как и команда Debug t (трассировать).

После выполнения инструкции р Debug выводит содержимое регистров программы, состояние флагов и декодированную форму следующей инструкции для выполнения.

Команду р нельзя использовать для трассировки ПЗУ (ROM).

Допустим, что проверяемая Вами программа содержит инструкцию call по адресу СS:143F. Для того, чтобы выполнить эту подпрограмму, а затем передать управление в Debug, введите следующую команду:

АХ=0000 ВХ=0000 СХ=0000 DХ=0000 SР=FFЕЕ ВР=0000 SI=0000 DI=0000

DS=2246 ЕS=2246 SS=2246 СS=2246 IP=1443 NV UP EI PL NZ AC PO NC

2246:1442 7505 JNZ 144A

DEBUG: Q (Quit - Закончить)

Прекращает выполнение Debug без сохранения файла, который проверяется в данный момент.

После введения q управление возвращается DOS.

Параметры

Данная команда не имеет параметров.

Для того, чтобы закончить сеанс отладки, введите следующую команду: q

DOS выводит приглашение DOS.

DEBUG: R (Register - Регистр)

Отображает на экране или меняет содержимое одного или нескольких регистров центрального процессора.

Формат r [имя_регистра ]

Для того, чтобы вывести на экран содержимое всех регистров и состояние флагов в области сохранения регистров, используйте следующий формат: r

Параметры

имя_регистра

Указывает имя регистра, содержимое которого Вы хотите отобразить.

Если Вы задаете имя регистра, то на экран выводится 16-разрядное содержимое данного регистра в шестнадцатиричной системе со знаком двоеточия в качестве приглашения. Если Вы хотите изменить значение этого регистра, введите новое значение и нажмите Enter; если Вы не хотите менять значение регистра, просто нажмите Enter.

Допустимыми именами регистра являются следующие: АХ, ВХ, СХ, DХ, SР, ВР, SI, DI, DS, ЕS, SS, СS, IP, PC и F. Как IP, так и PC обозначают указатель инструкции.

Если Вы указываете имя регистра, не включенное в предыдущий список, DOS выводит следующее сообщение: br ошибка

При введении символа f вместо имени регистра Debug отображает на экране значения каждого флага с указанием соответствующих двухбуквенных кодов, а затем выводит приглашение Debug. Для того, чтобы изменить какой-либо флаг, введите соответствующий двухбуквенный код из следующей таблицы:

Новые значения флагов можно вводить в произвольном порядке, причем между ними можно не оставлять пробелов. Нажмите Enter, чтобы; становить выполнение команды r. Флаги, для которых Вы не задавали новые значения, сохраняются неизмененными.

Если Вы задаете более одного значения для флага, Debug выводит следующее -сообщение: bf ошибка

Если Вы вводите код флага, не приведенного в предыдущем списке, Debug выводит следующее сообщение: bf ошибка

В обоих случаях Debug игнорирует все значения, указанные после неверного.

При запуске программы Debug регистры сегментов настроены на нижнюю границу свободной памяти, указатель инструкции настроен на адрес 100h, все флаги сброшены, а остальные регистры установлены на ноль, кроме SP. который устанавливается на FFEEh.

Для того, чтобы просмотреть содержимое всех регистров, состояния флагов и декодированную инструкцию по текущему адресу, введите следующую команду: r

Если текущим адресом является СS:11А, то на экране может быть выведено следующее:

04BA:011A CD21 INT 21

Для просмотра только состояния флагов введите следующую команду: rf

Debug выводит информацию в следующем формате:

NV UP DI NG NZ AC PE NC - _

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

NV UP DI NG NZ AC PE NC - pleicy

После выполнение команды r Debug выводит на экран свой символ командного приглашения. Для того, чтобы увидеть, какие произошли изменения в значениях флагов, введите команду r или rf. Затем Debug выводит следующее:

NV UP DI NG NZ AC PE CY - _-

Нажмите Enter для возвращения в приглашение Debug.

DEBUG: S (Search - Поиск)

Осуществляет поиск заданного списка байтов в области памяти в указанном диапазоне адресов.

Формат s диапазон список

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

Допустим, что Вы хотите найти все адреса в диапазоне от СS:100 до СS:110, содержащие значение 41. Введите для этого следующую команду:

Debug выводит результаты в следующем формате:

  • 04ВА:0104
  • 04ВА:010D

Следующая команда производит поиск строки Ph в диапазоне от СS:100 до СS:110:

scs:100 1а0 "Ph"

DEBUG: Т (Trace - Трассировать)

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

Формат f [=адрес ] [число ]

При выполнении команды t используется аппаратный режим трассировки микропроцессора 8086 или 8088. Следовательно, с помощью этой команды Вы также можете трассировать инструкции, хранимые в постоянном запоминающем устройстве (ROM).

Перед параметром адрес следует указать символ равенства (=), чтобы отличить этот параметр от параметра число .

Для выполнения одной инструкции, а затем для вывода содержимого регистров, состояния флагов и декодированной формы инструкции введите следующую команду: t

Если текущая инструкция располагается по адресу 04ВА:011А, Debug может вывести следующую информацию:

АХ=0E00 ВХ=00FF СХ=0007 DХ=01FF SР=039D ВР=0000 SI=005C DI=0000

DS=04BA ЕS=04BA SS=04BA СS=04BA IP=011A NV UP DI NG NZ AC PE NC

04BA:011A CD21 INT 21

DEBUG: U (Unassemble - Реассемблировать)

Реассемблирует содержимое байтов и выводит на экран соответствующие им исходные операторы с указанием адресов и значений байтов. Изображение реассемблированного кода выглядит на экране подобно выдаче ассемблера.

u [диапазон ]

Для того, чтобы реассемблировать первые 20h байтов (количество, принимаемое по умолчанию) программного файла, располагающихся сразу же после байтов, реассемблированных по предыдущей команде и, используйте следующий формат: u

Параметры

Для реассемблирования 16(10h) байтов, начиная с адреса 04ВА:0100, введите следующую команду:

Debug выводит результаты в следующем формате:

DEBUG: W (Write - Записать)

Записывает файл или определенные секторы на диск.

Вы должны указывать имя файла на диске при запуске Debug или в самой последней команде Debug n (имя). В этом случае правильно форматируется имя файла для контрольного блока файла по адресу СS:5С.

Для записи содержимого байтов, количество которых указано в регистрах ВХ:СХ в файл на диске, используйте следующий формат: w [адрес ]

Для того, чтобы миновать систему файлов DOS и непосредственно записать определенные секторы по абсолютному адресу, используйте следующий формат: w адрес устройство начало число

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

Если Вы использовали команды Debug g (выполнить), t (трассировать), р (продолжить) или r (регистр), то прежде чем вводить w, необходимо восстановить содержимое регистра ВХ:СХ.

Если Вы вносите изменения в файл, но не меняете имя, длину или начальный адрес, Debug будет правильно переписывать файл в первоначальное местонахождение на диске.

С помощью данной команды нельзя переписывать файлы с расширением .exe и .hex .

Допустим, что Вы хотите переписать содержимое памяти, начиная с адреса СS:100, на диск в дисководе В, а также Вы хотите, чтобы данные записывались на диск, начиная с логической сектора 37h, и чтобы при этом было записано 2Bh секторов:

wcs: 100 1 37 2b

По завершении записи Debug выводит на экран свой командный запрос.

DEBUG: ХА (Allocate Expanded Memory - Выделить расширенную память)

Выделяет в расширенной памяти указанное количество страниц.

Для того, чтобы использовать расширенную память, в системе должен быть установлен драйвер устройства расширенной памяти, который отвечает спецификациям LIM EMS версии 4.0 (Lotus/Intel/Microsoft Expanded Memory Specification).

Формат ха [счетчик]

Если указанное количество страниц доступно, то debug выводит на экран сообщение, в котором указывается номер созданного указателя блока памяти. В противном случае Debug выводит сообщение об ошибке.

Для того, чтобы выделить восемь страниц расширенной памяти, введите следующую команду: xa8

При успешном выполнении команды Debug выводит следующее:

Создан указатель - 0003

DEBUG: ХD (Deallocate Expanded Memory -Освободить расширенную память)

Освобождает указатель блока расширенной памяти.

Для того, чтобы использовать расширенную память, в системе должен быть установлен драйвер устройства расширенной памяти, отвечающий спецификации LIM EMS версии 4.0 (Lotus/Intel/Microsoft Expanded Memory Specification).

Формат d [указатель ]

Параметры

Для того, чтобы освободить указатель 0003, введите следующую команду: xd 0003

При успешном выполнении команды Debug выводит следующее сообщение:

Указатель 0003 освобожден

DEBUG: ХМ (Мар Expanded Memory Pages -Отобразить страницы расширенной памяти)

Отображает логическую страницу расширенной памяти, соответствующую заданному указателю, на физическую страницу расширенной памяти.

Для того, чтобы использовать расширенную память, в системе должен быть установлен драйвер устройства расширенной памяти, соответствующий спецификации LIM EMS версии 4.0 (Lotus/Intel/Microsoft Expanded Memory Specification).

Формат хm [лог. страница ] [физ. страница ] [указатель ]

Параметры

Для того, чтобы отобразить логическую страницу 5 из блока памяти с указателем 0003 на физическую страницу 2, введите следующую команду:

Если эта команда завершается успешно, то Debug; выводит следующее сообщение:

страница 05 отображена на физическую страницу 02

DEBUG: ХS (Display Expanded Memory Status - Отобразить статус расширенной памяти)

Отображает сведения о расширенной памяти EMS.

Для того, чтобы использовать расширенную память, в системе нужно установить драйвер устройства расширенной памяти, отвечающий спецификации LIM EMS версии 4.0 (Lotus/Intel/Microsoft Expanded Memory Specification).

Формат ХS

Параметры

Данная команда не воспринимает никаких параметров.

Выводимая Debug информация имеет следующий формат:

Указатель хх имеет хх распределенных страниц

Физическая страница хх = сегмент кадров хх

Распределено хх из хх страниц EMS

Размещено хх из хх указателей EMS

Для того, чтобы вывести на экран отчет о статусе расширенной памяти, введите следующую команду: ХS Debug выводит следующее сообщение:

Указатель 0000 имеет 0000 распределенных страниц

Указатель 0001 имеет 0002 распределенных страниц

Физическая страница 00 = сегмент кадров C000

Физическая страница 01 = сегмент кадров С400

Физическая страница 02 = сегмент кадров С800

Физическая страница 03 = сегмент кадров СС00

Распределено 2 из 80 страниц EMS

Размещено 2 из FF указателей EMS