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

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

Синтаксис

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

Параметры

[диск : ][путь ] имя_файла Задание расположения и имени исполняемого файла для тестирования. параметры Указание параметров командной строки, передаваемых отлаживаемой программе. ? Вывод списка подкоманд команды debug .

Примечания

  • Использование команд подсистемы MS-DOS

    Команда debug это команда подсистемы MS-DOS, которая выполняется в среде WOW/NTVDM.

  • Разделитель параметров команды

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

  • Использование команд debug

    Существует несколько команд debug , которыми можно воспользоваться.

Debug: a (assemble)

Создание двоичного кода процессоров 8086/8087/8088 непосредственно в памяти. Выполненная без параметров команда a начинает работу с точки последнего останова.

Синтаксис

a [адрес ]

Параметры

адрес Задает адрес, по которому записаны инструкции на языке ассемблер. Параметр адрес принимает шестнадцатеричные значения без знака h . ? Вывод списка команд debug .

Примечания

  • Задание правильных записей адреса

    Адрес состоит из двух частей: первая содержит буквенное обозначение сегментного регистра или адрес сегмента из четырех цифр, а вторая содержит значение смещения. Адрес сегмента или сегментный регистр можно пропустить. По умолчанию для команд debug a , g , l , t , u и w адрес сегмента содержится в регистре CS. Для других подкоманд по умолчанию используется сегмент DS. Все числовые значения при этом представлены в шестнадцатеричном формате. Между именем сегмента и значением смещения следует вставлять двоеточие. Примеры правильных адресов:

  • Задание мнемоник префикса

    Задайте мнемонику префикса инструкции перед кодом операции (т. е. opcode), к которой она относится. Команда a создает исполняемый машинный код из инструкций на языке ассемблера. Все числовые значения должны быть представлены в шестнадцатеричном формате и записаны как набор от 1 до 4 символов.

  • Использование мнемоник

    Мнемоники cs: , ds: , es: и ss: . Мнемоникой, вызывающей возврат управления в другой сегмент кода (far return), является retf . Мнемоники для работы со строками должны точно определять размер элементов строк. Например, для перемещения строк из слов (16 бит) следует использовать movsw , а для перемещения строк из байтов (8 бит) следует использовать movsb .

  • Задание переходов и вызовы функций

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

    A0100:0500
    0100:0500 jmp 502 ; короткий (short) переход на 2 байта
    0100:0502 jmp near 505 ; ближний (near) переход на 3 байта
    0100:0505 jmp far 50a ; длинный (far) переход на 5 байтов

    Вместо префикса near можно использовать сокращение ne .

  • Задание адреса слова или байта в памяти

    Если операнды ссылаются на адреса слов или байтов в памяти, тип данных должен быть задан с использованием префикса word ptr или byte ptr , которые можно сократить до wo для word ptr и до by для byte ptr . Например:

    dec wo
    neg byte ptr

  • Задание операндов

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

    mov ax,21 ; загрузить число 21h в регистр AX
    mov ax, ; загрузить содержимое
    ; памяти по адресу 21h
    ; в регистр AX

  • Псевдоинструкции

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

    db 1,2,3,4,"ЭТО ПРИМЕР"
    db "ЭТО КАВЫЧКА: ""
    db "ЭТО КАВЫЧКА: ""
    dw 1000,2000,3000,"BACH"

  • Ввод данных в определенные байты
  • Деассемблирование байт

Примеры

Команда a допускает различное использование ссылок на регистры. Например:

add bx,34.
pop
push )

Кроме того, команда a поддерживает использование синонимов дополнительных кодов операций: Например:

loopz 100
loope 100
ja 200
jnbe 200

Для дополнительных кодов операций процессора 8087 необходимо задать префиксы wait или fwait . Например:

fwait fadd st,st(3) ; эта строка вставляет
; в код префикса fwait

Debug: c (compare)

Сравнение двух блоков памяти.

Синтаксис

c диапазон адрес

Параметры

диапазон Обязательный параметр. Задание начального и конечного адреса или начального адресы и длины первой области в памяти для сравнения. адрес Обязательный параметр. Задание начального адреса второй области памяти для сравнения. ? Вывод списка команд debug .

Примечания

  • Задание правильных записей диапазона

    Параметр диапазон используется в командах debug для задания диапазона памяти. Для задания диапазона можно использовать один из следующих форматов: начальный и конечный адрес или начальный адрес и длина (разделяются символом l ) диапазона. Например, обе следующих команды задают 16-разрядный диапазон, начинающийся с адреса CS:100:

  • Задание правильных записей адреса

    Адрес состоит из двух частей: первая содержит буквенное обозначение сегментного регистра или адрес сегмента из четырех цифр, а вторая содержит значение смещения. Адрес сегмента или сегментный регистр могут быть пропущены. По умолчанию для команд debug a , g , l , t , u и w адрес сегмента содержится в регистре CS. Для других подкоманд по умолчанию используется сегмент DS. Все числовые значения при этом представлены в шестнадцатеричном формате. Между именем сегмента и значением смещения следует вставлять двоеточие. Следующие адреса являются допустимыми:

  • Если параметры диапазон и адрес совпадают, команда c ничего не выводит и возвращается к приглашению debug . Если при сравнении блоков памяти обнаружены различия, они выводятся командой c в следующем виде:

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

Примеры

Чтобы сравнить блок памяти от 100h до 10Fh с блоком памяти от 300h до 30Fh, введите следующую команду:

c100,10f 300

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

197F:0100 4D E4 197F:0300
197F:0101 67 99 197F:0301
197F:0102 A3 27 197F:0302
197F:0103 35 F3 197F:0303
197F:0104 97 BD 197F:0304
197F:0105 04 35 197F:0305
197F:0107 76 71 197F:0307
197F:0108 E6 11 197F:0308
197F:0109 19 2C 197F:0309
197F:010A 80 0A 197F:030A
197F:010B 36 7F 197F:030B
197F:010C BE 22 197F:030C
197F:010D 83 93 197F:030D
197F:010E 49 77 197F:030E
197F:010F 4F 8A 197F:030F

Адреса 197F:0106 и 197F:0306 отсутствуют в списке. Это означает, что значения, расположенные по этим адресам, совпадают.

Debug: d (dump)

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

Синтаксис

d [диапазон ]

Параметры

диапазон Задание начального и конечного адреса или начального адреса и длины блока памяти для просмотра его содержимого. ? Вывод списка команд debug .

Примечания

  • Задание правильных записей диапазона

    Параметр диапазон используется в подкомандах debug диапазон l

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

Примеры

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

Команда debug.exe выводит содержимое диапазона в следующем формате:

04BA:0100 54 4F 4D 00 53 41 57 59-45 52 00 00 00 00 00 00.....

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

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

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

Debug: e (enter)

Ввод данных в память по заданному адресу.

Синтаксис

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

Параметры

адрес Обязательный параметр. Адрес начала области памяти для ввода данных. список Задание списка байтов, которые требуется ввести в память. ? Вывод списка подкоманд debug .

Примечания

  • Задание правильных записей адреса

    Адрес a , g , l , t , u и w команды debug

  • Использование параметра адрес

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

    • Заменить байт данных. Для этого введите новое значение. Если введенное значение не является допустимым шестнадцатеричным числом или содержит более двух цифр, Debug.exe не выводит на экран неверные или избыточные символы.
    • Перейти к следующему байту. Для этого нажмите клавишу ПРОБЕЛ. Для изменения данного байта введите новое значение после текущего. Если при нажатии клавиши ПРОБЕЛ пройдена 8-байтная граница, Debug.exe выводит на экран новую строку с новым адресом в начале строки.
    • Возвратиться к предыдущему байту. Для этого нажмите клавишу МИНУС. Для перемещения назад более чем на один байт нажмите эту клавишу несколько раз. При нажатии клавиши МИНУС Debug.exe выводит новую строку с текущим адресом и значением.
    • Остановить выполнение подкоманды e . Для этого нажмите клавишу ENTER. Это можно сделать в любой позиции курсора.
  • Использование параметра список

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

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

  • Создание двоичного кода
  • Просмотр содержимого области памяти

Примеры

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

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

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

04BA:0100 EB.41 _

Последовательность байтов можно ввести в одной подкоманде e . Вместо нажатия клавиши Enter после нового значения, нажмите клавишу ПРОБЕЛ. Программа Debug.exe выведет следующее значение. В данном примере, если клавиша ПРОБЕЛ нажата три раза, Debug.exe выведет на экран следующие значения:

04BA:0100 EB.41 10. 00. BC._

Чтобы заменить шестнадцатеричное значение BC числом 42, введите 42 в позицию курсора, как показано ниже:

04BA:0100 EB.41 10. 00. BC.42 _

Чтобы изменить значение 10 на 6F, дважды нажмите клавишу МИНУС для возврата к адресу 0101 (значение 10). Программа Debug.exe выводит следующие сведения:

04BA:0100 EB.41 10. 00. BC.42-
04BA:0102 00.-
04BA:0101 10._

Введите 6F в позицию курсора для изменения значения, как показано ниже:

04BA:0101 10.6F _

Нажмите клавишу ENTER для завершения выполнения подкоманды e и возврата к приглашению программы debug .

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

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

Эта строка будет занимать 24 байта, начиная с адреса DS:100.

Debug: f (fill)

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

Синтаксис

f диапазон список

Параметры

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

Примечания

  • Задание правильных записей диапазона

    Параметр диапазон используется в подкомандах debug для задания диапазона памяти. Параметр диапазон можно задать в одном из следующих форматов: начальный адрес и конечный адрес или начальный адрес и длина (обозначаемая l ) диапазона. Например, оба следующих выражения задают диапазон из 16 байтов, начинающийся с адреса CS:100:

  • Задание данных

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

  • Использование параметра список

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

Примеры

Чтобы заполнить область памяти с 04BA:100 по 04BA:1FF пятью определенными значениями (например 42, 45, 52, 54, 41) и повторять этот набор, пока 100h байт не будут заполнены программой Debug.exe, введите следующую команду:

f04ba:100l100 42 45 52 54 41

Debug: g (go)

Выполнение загруженной программы. Запущенная без параметров подкоманда g начинает выполнение с текущего адреса в реестрах CS:IP.

Синтаксис

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

Параметры

адрес Задание адреса в памяти, с которого требуется начать выполнение программы. точки_останова Указание до 10 временных точек останова, которые могут быть заданы как часть подкоманды g . ? Вывод списка подкоманд debug .

Примечания

  • Задание правильных записей адреса

    Адрес состоит из двух частей: первая содержит буквенное обозначение сегментного регистра или адрес сегмента из четырех цифр, а вторая содержит значение смещения. Адрес сегмента или сегментный регистр могут быть пропущены. По умолчанию для подкоманд a , g , l , t , u и w команды debug адрес сегмента содержится в регистре CS. Для других подкоманд по умолчанию используется сегмент DS. Все числовые значения при этом представлены в шестнадцатеричном формате. Между именем сегмента и значением смещения следует вставлять двоеточие. Следующие адреса являются допустимыми:

  • Использование параметра адрес

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

  • Задание точек останова

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

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

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

    Точки останова могут быть установлены только по адресам, содержащим первый байт кода операции 8086 (opcode). Если установлено больше 10 точек останова, выводится следующее сообщение:

  • Использование указателя на стек, задаваемый пользователем

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

  • Перезапуск программы

    Не перезапускайте программу при получении следующего сообщения:

    Program terminated normally

    Чтобы правильно запустить программу, перезагрузите ее с помощью подкоманд n (name) и l (load).

Примеры

Чтобы запустить текущую программу и выполнить ее до точки останова по адресу 7550 в сегменте CS, введите следующую команду.

Debug.exe выведет на экран содержимое регистров и состояние флагов, а затем остановит подкоманду g .

Чтобы установить две точки останова, введите следующую команду:

gcs:7550, cs:8000

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

Debug: h (hexadecimal)

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

Синтаксис

h число1 число2

Параметры

число1 Обязательный параметр. Первое шестнадцатеричное число в диапазоне от 0 до FFFFh. число2 Обязательный параметр. Второе шестнадцатеричное число в диапазоне от 0 до FFFFh. ? Вывод списка подкоманд debug .

Заметки

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

Примеры

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

Результаты вычислений Debug.exe будут выведены в виде:

Debug: i (input)

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

Синтаксис

i порт

Параметры

порт Обязательный параметр. Задание порта ввода адресом. Адрес может быть 16-битным значением. ? Вывод списка подкоманд debug .

Примеры

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

Если находящаяся в порту величина равна 42h, Debug.exe считает ее и выведет в следующем виде:

Debug: l (load)

Загрузка файла или содержимого сектора диска в память. Выполненная без параметров подкоманда l загружает файл, указанный в командной строке программы debug , в память, начиная с адреса CS:100. В регистрах BX и CX указывается количество загруженных байт. Если имя файла не было задано в командной строке debug , используется файл, ранее заданный при вызове последней подкоманды n .

Синтаксис

l [адрес ]

l [адрес ] [диск ] [первый_сектор ] [ число ]

Параметры

адрес Задание адреса области памяти, в которую требуется загрузить содержимое файла или сектора. Если параметр адрес не задан, используется текущий адрес в регистре CS. диск Задание накопителя, содержащего диск, с которого считываются определенные сектора. Данный параметр задается числом: 0 = A, 1 = B, 2 = C и т. д. первый_сектор Задание шестнадцатеричного номера первого сектора, содержимое которого требуется загрузить. число Задание шестнадцатеричного числа последовательных секторов, содержимое которых требуется загрузить. Параметры диск , первый_сектор и число используются только в том случае, когда необходимо загрузить содержимое определенных секторов, а не файл, указанный в командной строке debug или в последней подкоманде n (name). ? Вывод списка подкоманд debug .

Заметки

  • Для загрузки задаваемого регистрами BX:CX числа байтов из файла на диске используется следующий синтаксис:

    l [адрес ]

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

    l [адрес ] [диск ] [первый_сектор ] [ число ]

  • Задание правильных записей адреса

    Адрес состоит из двух частей: первая содержит буквенное обозначение сегментного регистра или адрес сегмента из четырех цифр, а вторая содержит значение смещения. Адрес сегмента или сегментный регистр могут быть пропущены. По умолчанию для подкоманд a , g , l , t , u и w команды debug адрес сегмента содержится в регистре CS. Для других подкоманд по умолчанию используется сегмент DS. All numeric values are in hexadecimal format. Между именем сегмента и значением смещения следует вставлять двоеточие. Следующие адреса являются допустимыми:

  • Использование параметра адрес

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

  • Использование всех параметров

    При вызове подкоманды l со всеми параметрами Debug.exe загружает содержимое сектора диска, а не файла.

  • Загрузка содержимого сектора диска

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

  • Загрузка файла.exe

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

  • Загрузка файлов.hex

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

Примеры

В командной строке введите:

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

Чтобы загрузить файл File.com, введите следующую команду:

Debug.exe загружает этот файл и выводит приглашение debug .

Чтобы загрузить содержимое 109 (6Dh) секторов диска C, начиная с логического сектора 15 (0Fh), в область памяти, начиная с адреса 04BA:0100, введите следующую команду:

l04ba:100 2 0f 6d

Debug: m (move)

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

Синтаксис

m диапазон адрес

Параметры

диапазон Обязательный параметр. Задание начального и конечного адреса или начального адреса и длины области памяти, содержимое которой требуется скопировать. адрес Обязательный параметр. Задание начального адреса области памяти, в которую требуется скопировать содержимое диапазона . ? Вывод списка подкоманд debug .

Примечания

  • Задание правильных записей диапазона

    Параметр диапазон используется в подкомандах debug для задания диапазона памяти. Параметр диапазон можно задать в одном из следующих форматов: начальный адрес и конечный адрес или начальный адрес и длина (обозначаемая l ) диапазона. Например, оба следующих выражения задают диапазон из 16 байтов, начинающийся с адреса CS:100:

  • Задание правильных записей адреса

    Адрес состоит из двух частей: первая содержит буквенное обозначение сегментного регистра или адрес сегмента из четырех цифр, а вторая содержит значение смещения. Адрес сегмента или сегментный регистр могут быть пропущены. По умолчанию для подкоманд a , g , l , t , u и w команды debug адрес сегмента содержится в регистре CS. Для других подкоманд по умолчанию используется сегмент DS. Все числовые значения при этом представлены в шестнадцатеричном формате. Между именем сегмента и значением смещения следует вставлять двоеточие. Следующие адреса являются допустимыми:

  • Копирование данных

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

  • Перекрывающееся копирование двух областей памяти

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

Примеры

Чтобы скопировать содержимое адресов с CS:110 по CS:510, а затем с CS:10F по CS:50F и так далее, пока все содержимое адресов с CS:100 по CS:500 не будет скопировано, введите следующую команду:

mcs:100 110 cs:500

Чтобы просмотреть результаты, воспользуйтесь подкомандой d (dump), указав адреса, заданные в подкоманде m .

Debug: n (name)

Задание имени исполняемого файла для команд debug l (load) или w (write) или задание параметров для отлаживаемого исполняемого файла. Выполненная без параметров подкоманда n очищает текущие значения.

Синтаксис

n [путь ][исполняемый_файл ]

n [параметры_файла ]

Параметры

[путь ][исполняемый_файл Задание расположения и имени исполняемого файла для тестирования. [параметры_файла ] Задание параметров и ключей командной строки для тестируемого исполняемого файла. ? Вывод списка подкоманд debug .

Примечания

  • Использование подкоманды n

    Подкоманду n можно использовать двумя способами. Во-первых, для задания имени файла для последующих подкоманд l (load) или w (write). Если программа Debug.exe вызвана без задания имени файла для отладки, команда n имя_файла должна быть вызвана перед использованием команды l для загрузки файла. Имя файла форматируется соответствующим образом для контрольного блока файла (FCB) по адресу CS:5C. Во-вторых, подкоманда n может использоваться для задания параметров и ключей командной строки отлаживаемого файла.

  • Области памяти

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

    Первое имя файла, задаваемое командой n , размещается в блоке управления файлом по адресу CS:5C. Если задано второе имя, оно помещается в блок управления файлом по адресу CS:6C. Количество символов в командной строке команды n (кроме первого символа, n ) сохраняется по адресу CS:80. Собственно командная строка n (снова без символа n ) сохраняется, начиная с адреса CS:81. Эти символы могут быть любыми параметрами и разделителями, которые допустимо вводить с командной строки в Windows 2000.

Примеры

В этом примере запускается команда debug и загружается программа Prog.com для отладки. Чтобы указать два параметра для программы Prog.com и запустить эту программу, введите следующую команду:

debug prog.com
nparam1 param2
g

В этом случае подкоманда g (go) запускает программу так, как если бы она была запущена с командной строки в виде:

prog param1 param2

При тестировании и отладке создается среда времени исполнения для программы Prog.com.

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

nfile1.exe
l
nfile2.dat file3.dat
g

После команды l во втором экземпляре команда n не используется. Если подкоманда w (write) используется во втором экземпляре подкоманды n , файл File1.exe (т. е. отлаживаемый) сохраняется под именем File2.dat. Чтобы этого не произошло, всегда вызывайте команду l или w сразу же после команды n в первой форме.

Debug: o (output)

Вывод байта в порт вывода.

Синтаксис

o порт байт

Параметры

порт Обязательный параметр. Задание адреса порта вывода. Адрес порта может быть 16-битным значением. байт Обязательный параметр. Задание значения байта, выводимого в порт . ? Вывод списка подкоманд debug .

Примеры

Чтобы отправить байт 4Fh в порт вывода по адресу 2F8h, введите следующую команду:

Debug: p (proceed)

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

Синтаксис

p [= адрес ] [число ]

Параметры

адрес Задание адреса инструкции, которая будет выполнена первой. Если адрес не указан, по умолчанию выполнение начнется с инструкции, задаваемой регистрами CS:IP. число Задание количества инструкций, которые будут выполнены перед возвратом управления программе Debug.exe. По умолчанию используется значение 1. ? Вывод списка подкоманд debug .

Примечания

  • Задание правильных записей адреса

    Адрес состоит из двух частей: первая содержит буквенное обозначение сегментного регистра или адрес сегмента из четырех цифр, а вторая содержит значение смещения. Адрес сегмента или сегментный регистр могут быть пропущены. По умолчанию для подкоманд a , g , l , t , u и w команды debug адрес сегмента содержится в регистре CS. Для других подкоманд по умолчанию используется сегмент DS. Все числовые значения при этом представлены в шестнадцатеричном формате. Между именем сегмента и значением смещения следует вставлять двоеточие. Следующие адреса являются допустимыми:

  • Использование параметра адрес

    Если в параметре адрес не указан сегмент, Debug.exe использует регистр CS тестируемой программы. Если параметр адрес опущен, выполнение программы начинается с адреса, указываемого регистрами CS:IP. Чтобы отличить параметр адрес от параметра число , перед адресом обязательно должен быть введен знак равенства (=). В случае если инструкция по заданному адресу не является циклом, строковой инструкцией, программным прерыванием или процедурой, подкоманда p работает также, как подкоманда t (trace).

  • Передача управления тестируемой программе

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

  • Просмотр сообщений

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

    Предупреждение!

    • Подкоманда p не может быть использована для отладки инструкций, содержащихся в ПЗУ.

Примеры

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

Результаты программы Debug.exe будут выведены в следующем формате:

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2246 ES=2246 SS=2246 CS=2246 IP=1443 NV UP EI PL NZ AC PO NC
2246:1442 7505 JNZ 144A

Debug: q (quit)

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

Синтаксис

Параметры

? Вывод списка подкоманд debug .

Debug: r (register)

Редактирование содержимого одного или нескольких регистров ЦПУ. Выполненная без параметров команда r выводит содержимое всех регистров и флагов из временного хранилище регистра, состояния всех флагов и декодированную инструкцию в текущей области.

Синтаксис

r [регистр ]

Параметры

регистр Задание имени регистра, содержащего сведения, которые требуется вывести на экран. ? Вывод списка подкоманд debug .

Примечания

  • Использование подкоманды r

    Если задан регистр, Debug.exe выводит на экран его 16-разрядное значение в шестнадцатеричном формате и двоеточие в качестве приглашения. Если требуется изменить значение содержащееся в регистре, введите новое значение и нажмите клавишу ENTER. В противном случае нажмите клавишу ENTER для возврата к приглашению программы debug .

  • Допустимые регистры x86

    В следующей таблице перечислены допустимые регистры x86 для параметра регистр .

    Значение
    ax
    bp
    bx
    cs
    cx
    di
    ds
    dx
    es
    f
    ip
    pc
    si
    sp
    ss

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

    Ошибка: br

  • Использование f вместо регистра

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

    Новые значения флагов могут быть введены в любой последовательности. Между этими значениями не нужно вводить пробел. Чтобы завершить выполнение подкоманды r , нажмите клавишу ENTER. Флаги, новые значения для которых не вводились, останутся неизмененными.

  • Сообщения подкоманды r

    При задании более одного значения для флага выводится следующее сообщение:

    Ошибка: df

    При вводе кода, не содержащегося в таблице, выводится следующее сообщение:

    Ошибка: bf

    В обоих случаях Debug.exe пропустит все значения, следующие после неверного ввода.

  • Значения, используемые по умолчанию в программе Debug.exe

    Когда запускается программа Debug.exe, сегментный регистр указывает на нижнюю границу свободной памяти, указатель инструкций устанавливается равным 0100h, все флаги состояния очищаются, оставшиеся регистры обнуляются, за исключением sp , который устанавливается равным FFEEh.

Примеры

Если текущее положение указателя инструкций равно CS:11A, выводятся следующие сведения:



04BA:011A CD21 INT 21

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

NV UP DI NG NZ AC PE NC - _

Введите одно и несколько допустимых значений флагов с пробелами или без них. Например:

nv up di ng nz ac pe nc - pleicy

Debug.exe завершит выполнение подкоманды r и выведет приглашение debug . Для просмотра изменений воспользуйтесь командой r или rf . Программа Debug.exe выводит следующие сведения:

NV UP EI PL NZ AC PE CY - _

Нажмите клавишу ENTER для возврата к приглашению программы debug .

Debug: t (trace)

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

Синтаксис

t [= адрес ] [число ]

Параметры

адрес Задание адреса, с которого Debug.exe начнет выполнение инструкций. число Указывает число инструкций для выполнения. Указанное значение должно быть шестнадцатеричным числом. По умолчанию значение равно 1. ? Вывод списка подкоманд debug .

Примечания

  • Задание правильных записей адреса

    Адрес состоит из двух частей: первая содержит буквенное обозначение сегментного регистра или адрес сегмента из четырех цифр, а вторая содержит значение смещения. Адрес сегмента или сегментный регистр могут быть пропущены. По умолчанию для подкоманд a , g , l , t , u и w команды debug адрес сегмента содержится в регистре CS. Для других подкоманд по умолчанию используется сегмент DS. Все числовые значения при этом представлены в шестнадцатеричном формате. Между именем сегмента и значением смещения следует вставлять двоеточие. Следующие адреса являются допустимыми:

  • Трассировка инструкций, записанных в ПЗУ

    Подкоманда t использует аппаратный режим трассировки микропроцессоров 8086 и 8088. Следовательно, также можно трассировать инструкции, хранимые в ПЗУ.

Примеры

Если текущая позиция указателя кода является 04BA:011A, Debug.exe выведет следующие сведения:

AX=0E00 BX=00FF CX=0007 DX=01FF SP=039D BP=0000 SI=005C DI=0000
DS=04BA ES=04BA SS=04BA CS=O4BA IP=011A NV UP DI NG NZ AC PE NC
04BA:011A CD21 INT 21

Debug: u (unassemble)

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

Синтаксис

u [диапазон ]

Параметры

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

Примечания

  • Задание правильных записей диапазона

    Параметр диапазон используется в подкомандах debug для задания диапазона памяти. Параметр диапазон можно задать в одном из следующих форматов: начальный адрес и конечный адрес или начальный адрес и длина (обозначаемая l ) диапазона. Например, оба следующих выражения задают диапазон из 16 байтов, начинающийся с адреса CS:100:

Примеры

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

Результаты программы Debug.exe выводятся в следующем формате:


04BA:0103 69 DB 69
04BA:0104 7665 JBE 016B

04BA:0109 65 DB 65
04BA:010A 63 DB 63
04BA:010B 69 DB 69
04BA:010C 66 DB 66
04BA:010D 69 DB 69
04BA:010E 63 DB 63
04BA:010F 61 DB 61

Чтобы просмотреть сведения только об адресах с 04BA:0100 по 04BA:0108, введите следующую команду:

Программа Debug.exe выводит следующие сведения:

04BA:0100 206472 AND ,AH
04BA:0103 69 DB 69
04BA:0104 7665 JBE 016B
04BA:0106 207370 AND ,DH

Debug: w (write)

Запись файла или определенных секторов на диск. При запуске подкоманды w без параметров запись начинается с адреса CS:100.

Синтаксис

w [адрес ]

w [адрес ] [диск ] [первый_сектор ] [ число ]

Параметры

адрес Задание начального адреса файла или части файла, которые требуется записать на диск. диск Задание дисковода, содержащего диск назначения. Данный параметр задается числом: 0 = A, 1 = B, 2 = C и т. д. первый_сектор Задание шестнадцатеричного адреса первого сектора для записи. число Задание количества секторов, которые требуется записать. ? Вывод списка подкоманд debug .

Примечания

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

    w [адрес ]

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

    w [адрес ] [диск ] [первый_сектор ] [ число ]

  • Задание правильных записей адреса

    Адрес состоит из двух частей: первая содержит буквенное обозначение сегментного регистра или адрес сегмента из четырех цифр, а вторая содержит значение смещения. Адрес сегмента или сегментный регистр могут быть пропущены. По умолчанию для подкоманд a , g , l , t , u и w команды debug адрес сегмента содержится в регистре CS. Для других подкоманд по умолчанию используется сегмент DS. Все числовые значения при этом представлены в шестнадцатеричном формате. Между именем сегмента и значением смещения следует вставлять двоеточие. Следующие адреса являются допустимыми:

  • Имя файла на диске нужно задать при запуске программы Debug.exe или в последней вызванной подкоманде n (name). Оба эти метода правильно форматируют имя файла для блока управления файлом (FCB) по адресу CS:5C.
  • Сброс значений регистров BX:CX перед использованием команды w без параметров.

    Если используются подкоманды g (go), t (trace), p (proceed) или r (register), перед использованием команды w без параметров значения регистров BX:CX необходимо сбросить.

  • Запись измененного файла на диск

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

  • Запись файлов.exe или.hex

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

    Предупреждение

    • Непосредственная запись в сектор диска является исключительно опасной, так как в этом случае не выполняется дескриптор файла Windows XP. Логическая структура диска может быть повреждена при вводе неверного значения.

Примеры

Чтобы записать содержимое области памяти, начиная с адреса CS:100, на диск B и собрать данные из 2Bh секторов, начиная с логического сектора диска под номером 37h, введите следующую команду:

После окончания операции записи выводится приглашение программы debug .

Debug: xa (allocate expanded memory)

Выделение заданного количества страниц памяти EMS. Выполненная без параметров подкоманда xa

Синтаксис

xa [число_страниц ]

Параметры

число_страниц Задание числа выделяемых страниц памяти EMS. Размер страницы составляет 16 килобайт. ? Вывод списка подкоманд debug .

Примечания

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

Примеры

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

Если команда успешно выделит память, выводятся следующие сведения:

Создан дескриптор=0003

Debug: xd (deallocate expanded memory)

Освобождение дескриптора памяти EMS. Выполненная без параметров подкоманда xd проверяет наличие или отсутствие поддержки дополнительной памяти (EMS).

Синтаксис

xd [дескриптор ]

Параметры

дескриптор Задание освобождаемого дескриптора. ? Вывод списка подкоманд debug .

Примечания

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

Примеры

Чтобы освободить дескриптор 0003, введите следующую команду:

Дескриптор 0003 освобожден

Debug: xm (мар expanded memory pages)

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

Синтаксис

xm [лог_страница ] [физ_страница ] [ дескриптор ]

Параметры

лог_страница Задание номера логической страницы памяти EMS, которая будет отображена в физическую страницу физ_страница . физ_страница Задание номера физической страницы памяти EMS, в которую будет отображена логическая страница лог_страница . дескриптор Задание дескриптора. ? Вывод списка подкоманд debug .

Примечания

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

Примеры

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

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

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

Debug: xs (display expanded memory status)

Вывод сведений о состоянии памяти EMS.

Синтаксис

Параметры

? Вывод списка подкоманд debug .

Примечания

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

    Для дескриптора xx выделено xx страниц
    Физическая страница xx = Сегмент EMS xx
    Выделено xx из xx страниц EMS
    Выделено xx из xx дескрипторов EMS

Примеры

Чтобы вывести сведения о состоянии памяти EMS, введите следующую команду:

Подкоманда xs выводит сведения в следующем виде:

Handle 0000 has 0000 pages allocated Для дескриптора 0001 выделено 0002 страниц Физическая страница 00 = Сегмент EMS C000 Физическая страница 01 = Сегмент EMS C400 Физическая страница 02 = Сегмент EMS C800 Физическая страница 03 = Сегмент EMS CC00 Выделено 2 из 80 страниц EMS Выделено 2 из FF дескрипторов EMS

Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).

Отладчик DEBUG предназначен для решения широкого круга задач. К ним относятся, например, следующие задачи: изучение текущего содержимого оперативной памяти; дизассемблирование.COM и.EXE-файлов;разработка и отладка собственных программ на языке ассемблера; изучение работы программ и их модификация; тестирование периферийного оборудования, для работы с портами ввода/вывода напрямую (в диалоговом режиме); изучение системы команд процессора, прерываний BIOS и MS-DOS.

Существует два способа запуска отладчика:

debug (Enter) или debug filename (Enter)

После запуска отладчик загружается в оперативную память, а содержимое сегментных регистров CS, DS, ES, SS - на первый свободный параграф сразу после самого отладчика. Регистр IP устанавливается равным 100.

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

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

КОМАНДЫ ОТЛАДЧИКА DEBUG

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

А <число> (Enter)

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

DB 1,2,3,”EXAMPLE”

DW 1000,2000,”FFFF”

Отладчик поддерживает мнемоники всех команд процессора, а также и сопроцессора 80Х87. При ассемблировании команд JMP и CALL по умолчанию, если это возможно, используется SHORT - вариант этих команд. Но можно указывать перед адресом перехода NEAR или FAR, что приведет к генерации соответствующих команд. Мнемоникой оператора RET, соответствующего дальнему вызову CALL FAR является RETF. Возможно, а в сомнительных случаях необходимо, использовать указатели WORD PTR или BYTE PTR. При вводе программы допускается печать префиксов CS:, ES:, SS: впереди команды в той же строке.

Пример. Программа заполнения экрана символом “!”.

Наберите А 200 (Enter), затем введите программу

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

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

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

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

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

Для этого надо набрать

С 100L100 300 (Enter)

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

D - дамп оперативнойй памяти. Эта команда дает на дисплее распечатку указанной области оперативной памяти, представленной в шестнадцатеричной системе счисления, а справа дает их символьное представление. Причем, кодовые комбинации, не имеющие символьного представления в стандарте ASCII, изображаются точками. В строке отображается шестнадцать байт. При этом справа указывается полный адрес самого левого бaйта. Таким образом, в одной строке приводится шестнадцатеричный дамп, а также ASCII-дамп шестнадцати байт оперативной памяти. Если команда D дана без параметров, то всего на экране отображается 128 байт (80Н) в восьми строках. В каждой строке имеется знак “-“, разделяющий 16 байт пополам: между восьмым и девятым байтами.

Пример. Просмотреть указатели-вектора первых тридцати двух прерываний (20Н).

Необходимо ввести команду

D 0:0,7F (Enter)

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

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

Е <адрес> (Еnter)

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

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

б) “Enter”. Это приведет к выходу из режима побайтного редактирования на командный уровень отладчика;

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

Пример. Изменить значение счетчика системных часов.

Введем команду

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

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

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

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

Пример. Заполнить область памяти, начинающуюся с адреса DS:0100 нулями общим числом 16384 байта (4000 16).

F 100L4000 00 (Enter)

Проверить командой

D 100L4000 (Enter)

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

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

Исполнение этого оператора сводится к передаче управления адресу CS:IP. Значения CS и IP можно узнать набрав команду R (Enter)дампа всех регистров процессора;

б) G=<адрес> (Enter)

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

в) G <адрес> (Enter)

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

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

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

Сначала введем программу (с помощью команды А 100):

MOV ,1234

DEC BX ;здесь поставить контрольную точку

Запустим программу командой G=100 109 (Еnter) Программа, дойдя до адреса 109, остановилась и дала полный дамп регистров.

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

В ответ получим 1 (сумма) и FFFF (разность).

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

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

I <адрес_порта> (Enter)

При этом мы получим содержимое порта В из программируемого периферийного интерфейса 82 .

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

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

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

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

L 1000 0 0 1 (Enter)

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

D 1000L200 (Enter)

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

U 1000L200 (Enter)

N <имя_файла> (Enter)

Далее необходимо исполнить команду L без аргументов. В результате этих действий файл (за исключением файлов с расширением ЕХЕ), будет загружен в оперативную память начиная с адреса CS:100. Если загружаемый файл имеет расширение ЕХЕ, то отладчик загрузит файл, начиная с адреса СS:0. Число прочитанных байтов хранится в регистровой паре ВХ:СХ после выполнения команды L.

M - команда копирования.Эта команда копирует содержимого части оперативной памяти в другую область оперативной памяти. Синтаксис команды следующий:

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

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

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

D 100L100 (Enter)

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

M 100L100 1000 (Enter)

Затрем исходное содержимое

F 100L100 0 (Enter)

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

D 100L100 (Enter)

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

M 100L100 100 (Enter)

N - команда указания имени. Эта команда прежде всего, определяет имя файла, который далее либо будет считываться с диска командой L, либо записываться на диск командой W. Синтаксис этой команды следующий:

N <имя_файла> (Enter)

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

N C:\AUTOEXEC.BAT (Enter)

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

О - команда вывода данных в порт. Эта команда позволяет вывести указанный байт в порт с заданным адресом. Она полезна для тестирования работы периферийных устройств и корпусов на системной плате в диалоговом режиме. Синтаксис команды:

О <адрес_порта> <величина> (Enter)

Здесь вместо «адреса_порта» подставляется адрес необходимого порта в диапазоне 0-FFFF, а вместо “величина” - значение, которое затем загружается в порт. Если порт шестнадцатибитный, то “величина” может быть четырехразрядным шестнадцатиричным числом, которое загружается в порт.

Мотор дисковода А: для флоппи-диска можно включить следующей командой

О 3F2 10 (Enter)

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

Р=<адрес> <число_команд> (Enter)

Можно опустить любой из двух параметров командной строки: <адрес> и/или <число_команд>. Параметр<адрес> задает начальный адрес, начиная с которого будет производиться трассировка, а параметр <число_команд> будет указывать общее число команд, которые будут исполнены после нажатия клавиши (Enter). Обязателен ввод символа “=” при указании адреса для того, чтобы не спутать адрес с числом исполняемых команд. Этот тип Р -трассировки крайне полезен при изучении общей логики выполнения программы, избавляя от утомительного отслеживания деталей. При начальном изучении программы необходимо начинать именно с Р -трассировки.

Введем, начиная с адреса 100, следующую программу

Затем проведем Р-трассировку. Для этого сначала введем команду Р=100 (Enter) и далее последовательные

После этого проведем обычную детальную Т-трассировку

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

R - команда дампа/коррекции регистров. Эта команда позволяет просматривать содержимое всех регистров сразу, а также флаги, или просматривать значения отдельных регистров и регистра флагов с возможностью их изменения.

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

R <имя_регистра> (Enter)

дает распечатку содержимого указанного регистра, и затем печатает двоеточие на следующей строке. После этого пользователь может нажать клавишу (Enter) и выйти обратно на монитор команд отладчика, либо задать новое значение регистра перед нажатием клавиши (Enter). В последнем случае старое значение регистра заменится на новое. Возможные имена регистров: AX, BX, CX, DX, SP, BP, SI, DI, DS, ES, SS, CS, IP, F (регистр флагов).

При использовании команды

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

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

значения флагов печатаются в строку в порядке, обратном к порядку в таблице. Сразу же за этим в строке печатается знак черты <->, отладчик переходит в состояние ожидания ввода с клавиатуры. Если пользователь нажмет только клавишу (Enter), то значения флагов не изменятся и произойдет возврат на монитор команд отладчика. Однако, перед этим пользователь может набрать новые значения некоторых флагов согласно кодировочной таблицы. Порядок следования при этом не существенен.

S - команда поиска. Команда поиска упорядоченного набора байтов позволяет провести поиск указанной цепочки байт в заданном диапазоне оперативной памяти и имеет синтаксис:

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

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

Предположим, нужно определить встречается ли цепочка символов “DOS” в первых 32К оперативной памяти. Для этого необходимо ввести команду

S 0:0L8000 44 4F 53 (Enter)

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

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

T <число> (Enter)

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

Т=<адрес> (Enter)

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

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

Т=<адрес> <число_команд> (Enter)

Команда: Т=FFFF:0 (Enter)

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

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

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

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

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

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

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

Эта команда записывает на диск не более 80Н секторов, число секторов не более 80. Параметр <адрес> означает адрес оперативной памяти, начиная с которого содержимое памяти копируется на диск. Параметр <номер диска> указывает диск, на который производится запись (0-диск А:, 1-диск В:, ..., 80 - винчестер С:). Параметр <начальный сектор> указывает номер логического сектора, начиная с которого будет производиться загрузка образа оперативной памяти. Параметр <число секторов> указывает общее количество записываемых на диске секторов.

Скопируем в файл на диске содержимое ВIОS-области оперативной памяти. Предполагая наличие РС/АТ со стандартным ВIОS размером 64К, обнулим сначала регистр ВХ, а затем занесем в регистр СХ 2000Н. Далее зададим имя файла, куда будем копировать старшую половину ВIОS, командой

N ВIОS.СОМ (Enter)

И наконец, команда

W F000:Е000 (Enter)

занесет в файл ВIОS.СОМ содержимое BIOS.


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

Отладчик DEBUG предназначен для решения широкого круга задач. К ним относятся, например, следующие задачи: изучение текущего содержимого оперативной памяти; дизассемблирование.COM и.EXE-файлов;разработка и отладка собственных программ на языке ассемблера; изучение работы программ и их модификация; тестирование периферийного оборудования, для работы с портами ввода/вывода напрямую (в диалоговом режиме); изучение системы команд процессора, прерываний BIOS и MS-DOS.

Существует два способа запуска отладчика:

debug (Enter) или debug filename (Enter)

После запуска отладчик загружается в оперативную память, а содержимое сегментных регистров CS, DS, ES, SS - на первый свободный параграф сразу после самого отладчика. Регистр IP устанавливается равным 100.

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

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

КОМАНДЫ ОТЛАДЧИКА DEBUG

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

А <число> (Enter)

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

DB 1,2,3,”EXAMPLE”

DW 1000,2000,”FFFF”

Отладчик поддерживает мнемоники всех команд процессора, а также и сопроцессора 80Х87. При ассемблировании команд JMP и CALL по умолчанию, если это возможно, используется SHORT - вариант этих команд. Но можно указывать перед адресом перехода NEAR или FAR, что приведет к генерации соответствующих команд. Мнемоникой оператора RET, соответствующего дальнему вызову CALL FAR является RETF. Возможно, а в сомнительных случаях необходимо, использовать указатели WORD PTR или BYTE PTR. При вводе программы допускается печать префиксов CS:, ES:, SS: впереди команды в той же строке.

Пример. Программа заполнения экрана символом “!”.

Наберите А 200 (Enter), затем введите программу

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

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

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

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

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

Для этого надо набрать

С 100L100 300 (Enter)

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

D - дамп оперативнойй памяти. Эта команда дает на дисплее распечатку указанной области оперативной памяти, представленной в шестнадцатеричной системе счисления, а справа дает их символьное представление. Причем, кодовые комбинации, не имеющие символьного представления в стандарте ASCII, изображаются точками. В строке отображается шестнадцать байт. При этом справа указывается полный адрес самого левого бaйта. Таким образом, в одной строке приводится шестнадцатеричный дамп, а также ASCII-дамп шестнадцати байт оперативной памяти. Если команда D дана без параметров, то всего на экране отображается 128 байт (80Н) в восьми строках. В каждой строке имеется знак “-“, разделяющий 16 байт пополам: между восьмым и девятым байтами.

Пример. Просмотреть указатели-вектора первых тридцати двух прерываний (20Н).

Необходимо ввести команду

D 0:0,7F (Enter)

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

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

Е <адрес> (Еnter)

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

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

б) “Enter”. Это приведет к выходу из режима побайтного редактирования на командный уровень отладчика;

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

Пример. Изменить значение счетчика системных часов.

Введем команду

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

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

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

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

Пример. Заполнить область памяти, начинающуюся с адреса DS:0100 нулями общим числом 16384 байта (4000 16).

F 100L4000 00 (Enter)

Проверить командой

D 100L4000 (Enter)

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

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

Исполнение этого оператора сводится к передаче управления адресу CS:IP. Значения CS и IP можно узнать набрав команду R (Enter)дампа всех регистров процессора;

б) G=<адрес> (Enter)

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

в) G <адрес> (Enter)

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

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

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

Сначала введем программу (с помощью команды А 100):

MOV ,1234

DEC BX ;здесь поставить контрольную точку

Запустим программу командой G=100 109 (Еnter) Программа, дойдя до адреса 109, остановилась и дала полный дамп регистров.

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

В ответ получим 1 (сумма) и FFFF (разность).

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

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

I <адрес_порта> (Enter)

При этом мы получим содержимое порта В из программируемого периферийного интерфейса 82 .

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

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

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

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

L 1000 0 0 1 (Enter)

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

D 1000L200 (Enter)

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

U 1000L200 (Enter)

N <имя_файла> (Enter)

Далее необходимо исполнить команду L без аргументов. В результате этих действий файл (за исключением файлов с расширением ЕХЕ), будет загружен в оперативную память начиная с адреса CS:100. Если загружаемый файл имеет расширение ЕХЕ, то отладчик загрузит файл, начиная с адреса СS:0. Число прочитанных байтов хранится в регистровой паре ВХ:СХ после выполнения команды L.

M - команда копирования.Эта команда копирует содержимого части оперативной памяти в другую область оперативной памяти. Синтаксис команды следующий:

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

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

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

D 100L100 (Enter)

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

M 100L100 1000 (Enter)

Затрем исходное содержимое

F 100L100 0 (Enter)

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

D 100L100 (Enter)

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

M 100L100 100 (Enter)

N - команда указания имени. Эта команда прежде всего, определяет имя файла, который далее либо будет считываться с диска командой L, либо записываться на диск командой W. Синтаксис этой команды следующий:

N <имя_файла> (Enter)

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

N C:\AUTOEXEC.BAT (Enter)

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

О - команда вывода данных в порт. Эта команда позволяет вывести указанный байт в порт с заданным адресом. Она полезна для тестирования работы периферийных устройств и корпусов на системной плате в диалоговом режиме. Синтаксис команды:

О <адрес_порта> <величина> (Enter)

Здесь вместо «адреса_порта» подставляется адрес необходимого порта в диапазоне 0-FFFF, а вместо “величина” - значение, которое затем загружается в порт. Если порт шестнадцатибитный, то “величина” может быть четырехразрядным шестнадцатиричным числом, которое загружается в порт.

Мотор дисковода А: для флоппи-диска можно включить следующей командой

О 3F2 10 (Enter)

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

Р=<адрес> <число_команд> (Enter)

Можно опустить любой из двух параметров командной строки: <адрес> и/или <число_команд>. Параметр<адрес> задает начальный адрес, начиная с которого будет производиться трассировка, а параметр <число_команд> будет указывать общее число команд, которые будут исполнены после нажатия клавиши (Enter). Обязателен ввод символа “=” при указании адреса для того, чтобы не спутать адрес с числом исполняемых команд. Этот тип Р -трассировки крайне полезен при изучении общей логики выполнения программы, избавляя от утомительного отслеживания деталей. При начальном изучении программы необходимо начинать именно с Р -трассировки.

Введем, начиная с адреса 100, следующую программу

Затем проведем Р-трассировку. Для этого сначала введем команду Р=100 (Enter) и далее последовательные

После этого проведем обычную детальную Т-трассировку

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

R - команда дампа/коррекции регистров. Эта команда позволяет просматривать содержимое всех регистров сразу, а также флаги, или просматривать значения отдельных регистров и регистра флагов с возможностью их изменения.

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

R <имя_регистра> (Enter)

дает распечатку содержимого указанного регистра, и затем печатает двоеточие на следующей строке. После этого пользователь может нажать клавишу (Enter) и выйти обратно на монитор команд отладчика, либо задать новое значение регистра перед нажатием клавиши (Enter). В последнем случае старое значение регистра заменится на новое. Возможные имена регистров: AX, BX, CX, DX, SP, BP, SI, DI, DS, ES, SS, CS, IP, F (регистр флагов).

При использовании команды

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

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

значения флагов печатаются в строку в порядке, обратном к порядку в таблице. Сразу же за этим в строке печатается знак черты <->, отладчик переходит в состояние ожидания ввода с клавиатуры. Если пользователь нажмет только клавишу (Enter), то значения флагов не изменятся и произойдет возврат на монитор команд отладчика. Однако, перед этим пользователь может набрать новые значения некоторых флагов согласно кодировочной таблицы. Порядок следования при этом не существенен.

S - команда поиска. Команда поиска упорядоченного набора байтов позволяет провести поиск указанной цепочки байт в заданном диапазоне оперативной памяти и имеет синтаксис:

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

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

Предположим, нужно определить встречается ли цепочка символов “DOS” в первых 32К оперативной памяти. Для этого необходимо ввести команду

S 0:0L8000 44 4F 53 (Enter)

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

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

T <число> (Enter)

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

Т=<адрес> (Enter)

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

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

Т=<адрес> <число_команд> (Enter)

Команда: Т=FFFF:0 (Enter)

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

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

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

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

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

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

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

Эта команда записывает на диск не более 80Н секторов, число секторов не более 80. Параметр <адрес> означает адрес оперативной памяти, начиная с которого содержимое памяти копируется на диск. Параметр <номер диска> указывает диск, на который производится запись (0-диск А:, 1-диск В:, ..., 80 - винчестер С:). Параметр <начальный сектор> указывает номер логического сектора, начиная с которого будет производиться загрузка образа оперативной памяти. Параметр <число секторов> указывает общее количество записываемых на диске секторов.

Скопируем в файл на диске содержимое ВIОS-области оперативной памяти. Предполагая наличие РС/АТ со стандартным ВIОS размером 64К, обнулим сначала регистр ВХ, а затем занесем в регистр СХ 2000Н. Далее зададим имя файла, куда будем копировать старшую половину ВIОS, командой

N ВIОS.СОМ (Enter)

И наконец, команда

W F000:Е000 (Enter)

занесет в файл ВIОS.СОМ содержимое BIOS.


Привет, юный хакер! Ты уже многое знаешь, но крутой хакер никогда не останавливается на достигнутом. Эта статья посвящена работе с стандартным дебаггером системы ДОС. Ты скажешь: «На кой фиг мне это надо мне, крутому перцу?».
Представь ситуацию: ты приходишь в компьютерный клуб (интернет-кафе, к другу домой), а там на тачке дисководы сняты, сидюки заклеены, а пакость сделать все же хочется. Естественно, на любом «нормальном» компе нет никаких компиляторов С, ассемблеров… но почти на каждом «нормальном» компе есть ДОС! Да, именно ДОС, и его последователи — Винды всех типов а конкретнее программа
DEBUG.

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

Итак, вы запустили программу DEBUG

Первая команда –D (dump) .

Эта команда позволяет просмотреть некоторую область памяти, адрес которой задан в параметре в формате сегмент:смещение.

Для начала посмотрим ПЗУ BIOS:

Здесь вы видите фирму-производителя вашей
BIOS. А по адресу:

получаем интересную информацию о системе,
такую как дата создания БИОС, чипсет… А по данному адресу
(0000:046C) находится таймер БИОС. Отчетливо видно, что значения все время меняются.
Для программиста удобно просматривать сегменты команд, данных и стека (CS, DS и SS, соответственно).

Выше мы видим содержимое сегмента данных, т. е.
значения определенных переменных.

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

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

AX 1203
: 0

В данном фрагменте мы просматриваем регистр АХ и очищаем его (пишем в него 0).
Чтобы перейти к первой выполняемой команде (по адресу CS:100):

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000
SI=0000 DI=0000
DS=3B9A ES=3B9A SS=3B9A CS=3B9A IP=0100 NV UP EI PL NZ NA PO NC
3B9A:0100 E82421 CALL 2227

Третья команда –E (enter) Addres .

Предназначена она для изменения значений в
памяти – с помощью нее можно уже вводить команды в машинных кодах. Замечание: при вводе данных сначала пишется младший байт
(по младшему адресу), затем – старший (по старшему), т. е.
чтобы записать по адресу DS:0000 число 1234h необходимо ввести:

E DS:0000 34 12

Например введем следующее:

E cs:100 B8 34 12
-D CS:100

А с помощью команды U (unassemble) , дизассемблируем введенные команды и получим:
-U CS:100,102
3B9A:0100 B83412 MOV AX,1234

Таким же образом можно дизассемблировать любой участок памяти, что очень полезно.
Но вместо ввода команд на машинном языке, можно воспользоваться встроенным
ассемблером программы DEBUG. Для этого существует команда
-A (assemble) . С помощью этой команды вы можете написать уже нормальную программку на ассемблере, выполняющую необходимые действия.:

A
0B3B:0100 mov ax,1234
0B3B:0103 mov ah, 4c
0B3B:0105 int 21
0B3B:0107

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

A
0B3B:0100 mov ax,1234
0B3B:0103 mov ah, 4c
0B3B:0105 int 21
0B3B:0107
-u CS:100, 106
0B3B:0103 B44C MOV AH,4C
0B3B:0105 CD21 INT 21
-r cx
CX 0000
:7
-r
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
-N my.com
-W
Запись 00007 байт
-q

В заключение можно сказать, что данный способ создания программ открывает новые возможности для любителей компьютерных пакостей, приколов, да и просто программистов-любителей – ведь теперь для создания небольших программ, вместо установки компиляторов, можно воспользоваться стандартными средствами системы, а DEBUG входит в поставку во все Винды вплоть до ХР. Я думаю, что это поможет вам веселее провести время за чужим компом, вызывая истинное удивление хозяина (дисков и дискет-то вы не приносили!!!) новыми эффектами работы его оборудования. Успехов, юные любители хакерного экстрима!