Программа DEBUG

174 63 485KB

Russian Pages [37] Year 2006

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

Программа DEBUG

Citation preview

Министерство здравоохранения и социальной защиты населения Пензенской области Мокшанский техникум–интернат

Дидактический материал Программа DEBUG

Селезнева Н.Е.

Мокшан 2006

ВВЕДЕНИЕ Назначение Запускает

программу

отладки

Debug,

которая

позволяет

Вам

тестировать и отлаживать выполняемые файлы. Формат DEBUG [ [дисковод:] [путь] имя_файла [список_аргументов] ] Параметры [дисковод:] [путь] имя_файла

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

список_аргументов

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

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

?

Выводит список команд программы debug.

a

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

c

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

d

Отображает содержимое области памяти.

e

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

f

Заполняет область памяти указанными значениями.

g

Выполняет обрабатываемый файл, загруженный в память.

h

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

i

Отображает на экране один байт из указанного порта ввода

l

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

m

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

n

Назначает имя файла для использования в команде l или w, или устанавливает параметры для файла, который Вы проверяете.

о

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

p

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

q

Прекращает выполнение утилиты Debug

r

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

s

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

t

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

u

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

w

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

xa

Выделяет расширенную память.

xd

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

xm

Отображает страницы расширенной памяти.

xs

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

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

необходимы

шестнадцатиричном

только

формате.

Таким

между

двумя

образом,

значениями

следующие

в

команды

эквивалентны:

dcs:100 110 d cs:100 110 d,cs:100,110 Параметр адрес в команде Debug указывает на определенное место в памяти. Адрес состоит из двух частей, он представляет собой буквенное обозначение

регистра

сегмента

или

состоящий

из

четырех

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

CS:0100 04ВА:0100 Обратите внимание, что между обозначением сегмента и смещением необходимо ставить двоеточие. Параметр диапазон в команде Debug указывает непрерывный участок памяти. Можно выбрать один из двух форматов диапазона: начальный адрес и конечный адрес, или начальный адрес и длину (обозначенную 1) диапазона. Например, оба следующих примера синтаксиса указывают 16-байтовый диапазон начиная с CS:100:

cs:100 10f cs:100 1 10

1. КОМАНДЫ ПРОГРАММЫ DEBUG. 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. В следующем примере приводятся два формата:

dec wo [si] neg byte ptr [128] Debug использует общее соглашение о том, что операнд, заключенный в квадратные скобки ([ ]), ссылается на адрес в памяти. Это происходит по той причине, что отладчик не может определить, делается ли ссылка в операнде на адрес в памяти или непосредственно на операнд. Например, возможны два формата: mov ах,21

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

mov ах, [21]

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

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

команде

а

можно

использовать

две

распространенных

псевдоинструкции: код операции db, по которому байтовые значения определяются непосредственно в памяти, и код операции dw, по которому словные значения определяются непосредственно в памяти. В следующих примерах приведены обе псевдоинструкции: db 1,2, 3,4, "ЭТО ПРИМЕР"

db ' ЭТО ПРИМЕР ЗНАКА КАВЫЧЕК: " ' db " ЭТО ПРИМЕР ЗНАКА КАВЫЧЕК: ' " dw 1000,2000,3000,"БАХ" Примеры Команда а поддерживает все форматы регистровых команд с косвенной адресацией, например:

add bx, 34[bp+2]. [sI-1] pop[bp+di] push [si] Команда а поддерживают также все синонимы кодов операции, как показано в следующем примере:

loopz

100

loope

100

ja

200

jnbe

200

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

Fwait fadd st,st(3)

;

Эта строка ассемблирует префикс fwait

;

DEBUG: С (Compare - Сравнить) Сравнивает содержимое двух участков памяти. Формат с диапазон адрес

Параметры диапазон

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

адрес

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

Описание и рекомендации по применению Если содержимое участков памяти диапазон и адрес идентичны, на экран ничего не выводится, и утилита Debug выдает свой командный запрос. При наличии различий Debug выводит на экран сообщение в следующем формате: адрес1 байт1 байт2 адрес2 Смотрите описание данного формата в следующем примере. Примеры Две следующие команды выполняют одинаковое действие: с100 , 10f 300 с100110 300 Каждая из этих команд сравнивает содержимое блока памяти с адресами от 100h до 10Fh с блоками памяти, имеющими адреса от 300h до 30Fh. Debug отвечает на любую из предыдущих команд, выводя следующую информацию (предполагая, что 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:00106 и 197F:0306 отсутствуют в списке. Это означает, что значения по этим адресам идентичны. DEBUG: D (Dump - Дамп) Выдает содержимое области памяти в указанном диапазоне адресов. Формат d диапазон Параметры Диапазон Указывает начальный и конечный адрес или начальный адрес и длину участка памяти, содержимое которого Вы хотите вывести на экран. Если Вы не указываете в команде d диапазон адресов, то Debug выводит на экран содержимое 128 байтов, начиная с первого адреса после конца диапазона адресов, указанного в предыдущей команде d. Описание и рекомендации по применению При использовании команды d Debug выводит дамп памяти в двух колонках:

шестнадцатиричный

дамп

(каждый

байт

представлен

в

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

dcs : 100 10f 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:

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

dcs : 100 115 DEBUG: Е (Еnter - Ввод) Вводит байтовые значения в память по указанному адресу.

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

Указывает начальный адрес в памяти, куда Вы хотите ввести данные

список

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

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

Заменить значение байта памяти. Для этого введите новое значение

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

Перейти к следующему байту. Для этого нажмите клавишу Пробел.

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

Вернуться к предыдущему байту памяти. Для этого введите символ

дефиса или минуса (—). Вы можете несколько раз нажать клавишу Минус, чтобы переместиться назад более чем на один байт. Когда Вы вводите символ Минус, Debug переходит к новой строке и отображает в ней текущий адрес и содержимое байта. 

Закончить выполнение команды е. Нажмите для этого клавишу

Enter. Вы можете нажать Enter в любой байтовой позиции.

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

ecs : 100 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. ВС.4204ВА : 0102 00. – 04ВА : 0101 10. _ Введите 6f в позиции курсора, чтобы изменить значение, как указано ниже: 04ВА : 0101 10. 6F_ Нажмите Enter, чтобы закончить выполнение команды е и вернуться к приглашению утилиты Debug В следующем примере показан ввод строки: eds : 100 "Это пример текста" Строка занимает 17 байтов, начиная с DS:100. DEBUG:F (Fill - Заполнить) Заполняет область памяти в указанном диапазоне адресов значениями из указанного списка значений. Вы можете указывать данные или в шестнадцатиричном формате, или в формате кодов ASCII. Любые ранее записанные в указанных адресах данные будут уничтожены. Формат f диапазон список

Параметры диапазон

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

список

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

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

f04ba : 1001100 42 45 52 54 41 В ответ Debug заполнит область памяти с адресами от 04ВА:100 до 04ВА:1FF указанными байтами. После этого Debug повторяет эти пять значений до тех пор, пока не окажутся заполненными все заданные 100h байтов памяти. DEBUG:G (Go - Выполнить) Выполняет текущую программу в памяти. Формат g [=адрес] [точки останова]

Параметры =адрес

Указывает в программе, содержащейся в данный момент в памяти, адрес, по которому должно начаться ее выполнение. Если адрес не указан, DOS начинает выполнение программы по текущему адресу в регистрах CS:IP.

точки останова

Указывает от 1 до 10 временных точек останова, которые Вы можете указать как часть команды g.

Описание и рекомендации по применению Вы должны указать перед параметром адрес символ равенства (=), чтобы можно было отличить адрес запуска программы (адрес) от адресов точек останова (точки останова). Выполнение программы приостанавливается на первой встреченной точке останова независимо от того, где данная точка расположена в списке точек останова. Debug заменяет первоначальную инструкцию в каждой точке останова на код прерывания. Когда выполнение программы доходит до точки останова, Debug записывает во все адреса точек останова их первоначальные инструкции, и для последней выполненной инструкции на экран выводятся значения регистров, флагов и декодированная инструкция. Debug выводит ту же самую информацию, как если бы ввели команду Debug r (регистр) и указали бы адрес точки останова; Если выполнение программы завершается в точке, отличной от точки останова, то Debug не будет заменять кодов прерывания на первоначальную инструкцию. Точки останова можно задавать только по адресам, содержащим первый байт кода операции микропроцессора 8086. Если Вы зададите более 10 точек останова, Debug выводит следующее сообщение: bp Ошибка

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

работы

операционной

системы.)

Debug

помещает

код

прерывания (0CCh) по указанным адресам точек останова. Не следует пытаться перезапустить программу после того, как DOS выведет следующее сообщение: Программа завершилась нормально Для правильного перезапуска программы перезагрузите ее с помощью команд n (имя) и l (загрузить). Примеры Предположим, что Вы вводите следующую команду:

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

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

DEBUG: Н (Hex - Шестнадцатиричное значение) Выполняет арифметические действия в шестнадцатиричной системе исчисления с двумя заданными в команде параметрами. Формат h значение1 значение! Параметры значение1

Любая шестнадцатиричная цифра в пределах от 0 до FFFFh.

значение2

Любая шестнадцатиричная цифра в пределах от 0 до FFFFh.

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

02А9 0095 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 и вводите следующую команду:

nfile.com Теперь вы можете ввести команду 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 отлаживаемому файлу назначаются параметры, такие как имена файлов и переключатели. Адрес памяти

Содержимое

СS:5С

Блок управления файлом (FCB) для файла 1

СS:6С

Блок управления файлом (FCB) для файла 2

СS:80

Длина командной строки n (в символах)

СS:81

Начало символов командной строки n

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

Debug prog.com nparam1 param2 g

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

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

nfile1.ехе l nfile2.dat file3.dat g Обратите внимание, что Вы не используете команду l после второй формы команды n. Также обратите внимание, что если Вы используете команду w, DOS сохраняет отлаживаемый файл File1.exe под именем File2.dat. Для того, чтобы избежать этого, Вы должны использовать всегда первую форму команды n до команд l или w . DEBUG: О (Оutput - Вывод) Передает указанный байт в порт вывода. Формат о порт значение _байт

Параметры Порт

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

значение байт

Указывает байтовое значение, которое Вы хотите направить в порт.

Примеры Для направления байтового значения 4Fh в порт вывода 2F8h введите следующую команду: о2f8 4f DEBUG: Р (Proceed - Продолжить) Выполняет без прерывания (до полного завершения) программный цикл, инструкцию обработки строк с повторением, программное прерывание, вызов подпрограммы или любую другую инструкцию. Формат р [=адрес] [число] Параметры Адрес

Указывает местонахождение первой выполняемой инструкции. При отсутствии этого параметра адресом, принимаемым по умолчанию, является текущий адрес, указанный в регистрах СS:IР.

Число

Указывает количество выполняемых инструкции до возврата управления в Debug. По умолчанию принимается значение 1.

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

Если параметр адрес не содержит явного указания типа сегмента, Debug использует регистр СS отлаживаемой программы. Если параметр адрес опущен, выполнение программы начинается по адресу, указанному регистрами СS:1Р отлаживаемой программе. Параметру адрес должен предшествовать символ равенства (=) для того, чтобы его можно было отличить от параметра число. Если инструкция по указанному адресу не является инструкцией начала цикла, инструкцией обработки строк с повторением, программным прерыванием или вызовом подпрограммы, команда р выполняется так же, как и команда Debug t (трассировать). После выполнения инструкции р Debug выводит содержимое регистров программы, состояние флагов и декодированную форму следующей инструкции для выполнения. Команду р нельзя использовать для трассировки ПЗУ (ROM). Примеры Допустим, что проверяемая Вами программа содержит инструкцию call по адресу СS:143F. Для того, чтобы выполнить эту подпрограмму, а затем передать управление в Debug, введите следующую команду: р=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 Параметры Данная команда не имеет параметров. Примеры Для того, чтобы закончить сеанс отладки, введите следующую команду: 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. Для того, чтобы изменить какой-либо флаг, введите соответствующий двухбуквенный код из следующей таблицы: Название флага

Установлен

Сброшен

Переполнение

OV

NV

Направление

DN (Уменьшение)

UP (Увеличение)

Прерывание

EI (Включено)

DI (Выключено)

Знак

NG (Отрицательный)

PL (Положительный)

Ноль

ZR

NZ

Вспомогательный перенос

AC

NA

Паритет

PE (Четность)

PO (Нечетность)

Перенос

CY

NC

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

При запуске программы Debug регистры сегментов настроены на нижнюю границу свободной памяти, указатель инструкции настроен на адрес 100h, все флаги сброшены, а остальные регистры установлены на ноль, кроме SP. который устанавливается на FFEEh. Примеры Для того, чтобы просмотреть содержимое всех регистров, состояния флагов и декодированную инструкцию по текущему адресу, введите следующую команду: r Если текущим адресом является СS:11А, то на экране может быть выведено следующее: АХ=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 Для просмотра только состояния флагов введите следующую команду: 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 выводит только первый адрес байтовой строки с таким же содержимым. Если список содержит всего один байт, Debug выводит все адреса, по которым появляется данное значение в указанном диапазоне адресов. Примеры Допустим, что Вы хотите найти все адреса в диапазоне от СS:100 до СS:110, содержащие значение 41. Введите для этого следующую команду:

scs:100 110 41

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

04ВА:0104 04ВА:010D Следующая команда производит поиск строки Ph в диапазоне от СS:100 до СS:110: scs:100 1а0 "Ph" DEBUG: Т (Trace - Трассировать) Выполняет одну инструкцию и выводит на экран содержимое всех регистров, значения флагов и декодированную форму выполняемой инструкции. Формат f [=адрес] [число] Параметры =адрес

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

Число

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

Описание и рекомендации по применению При

выполнении

команды

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 Параметры диапазон

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

и,

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

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

04BA : 0100

206472

AND

[SI+72],AH

04BA : 0103

69

DB

69

04BA : 0104

7665

JBE

016B

04BA : 0106

207370

AND

[BP+DI+70],DH

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

Для того, чтобы отобразить информацию только для особых адресов от 04ВА:0100 до 04ВА:0108, введите следующую команду:

u 04ba : 0100 0108 Debug выводит следующее:

04BA : 0100

206472

AND

[SI+72],AH

04BA : 0103

69

DB

69

04BA : 0104

7665

JBE

016B

04BA : 0106

207370

AND

[BP+DI+70],DH

DEBUG: W (Write - Записать) Записывает файл или определенные секторы на диск. Вы должны указывать имя файла на диске при запуске Debug или в самой последней команде Debug n (имя). В этом случае правильно форматируется имя файла для контрольного блока файла по адресу СS:5С. Для записи содержимого байтов, количество которых указано в регистрах ВХ:СХ в файл на диске, используйте следующий формат: w [адрес] Для того, чтобы миновать систему файлов DOS и непосредственно записать определенные секторы по абсолютному адресу, используйте следующий формат: w адрес устройство начало число Запись по абсолютным номерам секторов чрезвычайно опасное мероприятие, поскольку эта процедура осуществляется в обход обработчика файлов. Файловая структура диска может быть повреждена, если будут введены неправильные значения Параметры Адрес

Указывает начальный адрес памяти того файла или части файла, который Вы хотите записать на диск. Если Вы не указываете адрес, Debug начинает с адреса СS:100. Информацию о допустимых значениях для параметра адрес смотрите в описании команды Debug.

устройство

Указывает устройство, содержащее выходной диск. Имя устройства задается в числовом виде, причем значение 0 соответствует устройству А:, 1=В, 2=С и так далее

начало

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

число

Указывает количество секторов, в которые Вы хотите записывать.

Описание и рекомендации по применению Если Вы использовали команды 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). Формат ха [счетчик] Параметры счетчик

Указывает количество выделяемых страниц размером 16 Кбайт.

Описание и рекомендации по применению

Если указанное количество страниц доступно, то debug выводит на экран сообщение, в котором указывается номер созданного указателя блока памяти. В противном случае Debug выводит сообщение об ошибке. Примеры Для того, чтобы выделить восемь страниц расширенной памяти, введите следующую команду: xa8 При успешном выполнении команды Debug выводит следующее: Создан указатель – 0003 ХD

DEBUG:

(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, введите следующую команду:

xm 5 2 0003 Если эта команда завершается успешно, то 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 Размещено на Allbest.ru