ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
ГЛАВА 6 ОТЛАДЧИК __________________________________________________________ Примечание: Выход из отладчика может быть осуществлен в любое время нажатием клавиш CONTROL+C. При нажатии CONTROL+S вывод на экран временно приостанавливается. Для продолжения достаточно нажать любую клавишу. Запуск отладчика Запустить отладчик можно двумя способами. При первом все команды вводятся в ответ на запрос отладчика, при втором команды помещаются в командную строку вызова отладчика: метод 1: debug метод 2: debug [имя_файла [список_аргументов]] При запуске отладчика по первому методу, знак тире (-) на экране сигнализирует о готовности отладчика к приему команд. Примечание: Если вы не укажете имя_файла отладчику, то создаваемый заголовок программы затирается. При отладке .com и .exe файлов не следует изменять содержимое памяти по адресам, ниже 05СН, иначе отладчик прервется. Не пытайтесь запустить программу после того, как на экране появилось сообщение: Program terminated normally (Программа завершена по обычной процедуре) Для этого вы должны перезагрузить программу с помощью команд N (имя) и L (загрузить), а уж затем запустить ее. При запуске отладчика вторым методом, указанный в командной строке программный файл грузится в наименьший по значению доступный сегмент со смещением в последнем 100Н. В регистры BX:CX помещается количество загруженных байт. Общая информация о командах отладчика Каждая команда отладчика состоит из буквы, за которой следуют один или несколько параметров. В случае нарушения синтаксиса команды отладчик помечает ошибочное место стрелкой (^) и соответствующим сообщением error (ошибка): dcs:100 cs:110 ^ Error При наборе командной строки можно вводить как заглавные буквы, так и прописные. - 364 - Общая информация о параметрах отладчика Все команды отладчика (за исключением команды Q) могут иметь параметры, которые в свою очередь могут быть разделены пробелами или запятыми. Разделитель обязателен между двумя последовательными шестнадцатеричными величинами. Следующие команды эквивалентны: dcs:100 110 d cs:100 110 d,cs:100,110 Параметр Определение __________________________________________________________ дисковод: Указвает дисковод, с которого грузится или на который записывается отлаживаемый файл. Разрешенные значения 0 - 3, где 0=А, 1=В, 2=С, 3=D. байт Две шестнадцатеричные цифры помещаемые в или считываемые из к-л адреса или регистра. запись 1 - 3 шестнадцатеричные цифры указывающие номер логической записи на диске или количество секторов, записываемых или считываемых с диска. значение До четырех шестнадцатеричных цифр, (величина) указывающих, например, номер порта или количество раз, которое команда повторяет свои действия. адрес Определение адреса включает определение сегмента, за которым через двоеточие следует определение смещения. Вы можете опустить определение сегмента. В этом случае по умолчанию будет принят сегмент ds для всех команд, за исключением A,G,L,T,U,W, для которых по умолчанию принимается сегмент cs. Все значения указываются в шестнадцатеричной форме. Помимо этого, сегмент может быть определен по имени соответствующего сегментного регистра: CS:0100 04BA:0100 область Область может быть задана двумя способами. В первом указывается адрес, за которым следует смещение от этого адреса: CS:0100 110 Во втором способе за адресом следует символ L (длина) и соответствующее значение длины области: CS:0100 L 10 - 365 - Следующая строка неправильна: CS:0100 CS:0110 b Error Размер области не должен превышать четыре шестнадцатеричные цифры. список Этот параметр должен быть последним в командной строке и представляет собой последовательность байт или строк: FCS:0100 42 45 52 54 41 строка Любое количество символов, помещенное в кавычки (разрешены как двойные, так и одинарные кавычки). В случае появления внутри строки кавычек, то количество последних удваивается: 'this ''string'' is okay.' или "this ""string"" is okay." число Количество выделяемых 16К-страниц. хендл Логический номер EMS (Системы управления расширенной памятью). лстраница Номер логической страницы. фстраница Номер физической страницы. __________________________________________________________ Последующий материал этой главы посвящен подробному описанию команд отладчика. __________________________________________________________ ASSEMBLE (A) Цель: Ассемблирование мнемоники и загрузка полученного кода по указанному адресу. Синтаксис: A [адрес] Комментарий: Все числа указываются в шестнадцатеричной форме. Мнемоника для переназначения сегмента - CS:, DS:, ES:, SS:. Мнемоника для дальнего возврата - RETF. Команды пересылки строк должны явно указывать длину опрерандов, т.е. MOVSB или MOVSW. Команды переходов и вызовов процедур автоматически ассемблируются в команды переходов и вызовов процедур short, near и far, в зависимости от смещения указываемого адреса. Вы можете выбрать отличный от создаваемого по умолчанию код команды, используя префиксы NEAR или FAR: - 366 - 0100:0500 JMP 502 ; двубайтный код 0100:0502 JMP NEAR 505 ; трехбайтный код 0100:0505 JMP FAR 50A ; пятибайтный код 0100:050А ............ Префикс NEAR можно сокращать до NE. При указании длины операнда, префиксы WORD PTR и BYTE PTR можно сокращать соответственно WO и BY. __________________________________________________________ COMPARE (C) Цель: Сравнение области памяти, определенной в параметре "область", с областью памяти такого же размера по указанному "адресу". Синтаксис: Собласть Комментарий: В случае обнаружения различий, последние выводятся в следующем формате: адрес1 байт1 байт2 адрес2 Пример: Действия следующих команд приводят к одному результату: C100,1FF 300 или C100L100 300 __________________________________________________________ DUMP (D) Цель: Вывод на экран содержимого области памяти. Синтаксис: D[область] Комментарий: Если вы не укажете область, то на экран будет выведено содержимое 128 байт, начиная с DS:100, или следующие 128 байт за 128 байтами, выведенными предыдущей командой D. - 367 - Содержимое памяти выводится в двух панелях экрана - в одной шестнадцатеричные значения байт, входящих в область, в другой графический образ этих байт (непечатные символы заменяются на точки (.)). В одной строке выводятся значения 16 байт. Между восьмым и девятым байтами вставляется тире. Примеры: DCS:100 110 DCS:100 L 20 __________________________________________________________ ENTER (E) Цель: Поместить по указанному адресу указанное значение. Синтаксис: Еадрес[список] Комментарий: Если вы опустите опцию списка, то отладчик выводит указанный адрес, за которым следует его содержимое. Этот же адрес появится на следующей строке, а отладчик будет ожидать от вас действий, варианты которых приведены ниже: - Просто напечатайте новое значение за текущим. Если введенное значение будет содержать более двух знаков, то лишние знаки игнорируются (также как и неразрешенные знаки). Заметьте, нажатия клавиши ВВОД для ввода нового значения не требуется. - Нажмите пробел для перехода к следующему байту. Для ввода нового значения выполните действия, описанные в предыдущем абзаце. Можно вместо ввода нового значения повторить продвижение вперед нажатием пробела. - Нажмите тире (-) для возврата к предыдущему байту. Как вы уже заметили, при всяком передвижении выводится текущий адрес и значение байта по этому адресу. Вы мо- жете выполнить действия описанные выше, т.е. ввести новое значение или снова перейти на другой адрес. - Нажатием клавиши ВВОД, вы можете в любой момент выйти из команды Е. - 368 - __________________________________________________________ FILL (F) Цель: Поместить в указанную область значения, указанные в списке. Синтаксис: Fобласть список Комментарий: Если размер области превышает длину списка, то список используется повторно, пока вся область не будет заполнена. Если длина списка превышает размер области, то лишние значения списка игнорируются. Пример: По следующей команде область памяти в 100Н (256) байт будет заполнена пятибайтными участками: F04BA:100 L 100 42 46 54 53 41 __________________________________________________________ GO (G) Цель: Выполнение загруженной отладчиком программы. Синтаксис: G[=адрес [адреса]] Комментарий: Если вы нажмете G без опций, то загруженная программа выполняется как обычно. Если вы укажете =адрес, то выполнение программы начинается с указанного адреса. Остальные адреса (если указаны) в командной строке представляют собой адреса точек прерывания программы. Когда программа достигает адреса точки прерывания, содержимое регистров, состояние флагов и деассемблированная команда по этому адресу выводятся на экран. Разрешено указание до десяти точек прерывания, в противном случае будет возвращена ошибка. Пользовательская программа должна иметь достаточный (6 байт для этой команды) стэк. Команда G использует команду IRET для перехода к тестируемой программе. При этом выставляется указатель стэка пользователя, флаги и регистры CS:IP. По адресам точек прерывания помещается код прерывания (0ССН). Для продолжения выполнения программы после выхода на точку прерывания введите команду G снова. Пример: По следующей команде загруженная программа будет выполняться до адреса точки прерывания: GCS:7550 - 369 - __________________________________________________________ HEX (H) Цель: Выполнение арифметических действий с шестнадцатеричными величинами. Синтаксис: Нвеличина величина Комментарий: По этой команде на экран выводится строка, в которой первой идет сумма двух величин, а второй разница между первой и второй величинами. Пример: Предположим вы ввели следующие величины: H19F 10A в ответ на экране появится следующее: 02A9 0095 __________________________________________________________ INPUT (I) Цель: Ввод байта из указанного порта (указывается величиной) и вывод его на экран. Синтаксис: Iвеличина Комментарий: Разрешены 16-битные порты. - 370 - __________________________________________________________ LOAD (L) Цель: Загрузка файла в память. Синтаксис: L[адрес [дисковод: запись количество_записей]] Комментарий: В ВХ:СХ помещается количество прочитанных байт. Имя файла должно быть определено к этому моменту либо при запуске debug, либо с помощью команды N (name). Если введете команду L без параметров, то файл будет загружен, начиная с адреса CS:100, а в ВХ:СХ будет помещено количество загруженных байт. Если вы укажете параметр "адрес", то файл будет загружен, начиная с указанного адреса. Если вы укажете все параметры, то загружаться будут абсолютные сектора. Дисковод определяется следующим образом: 0=А, 1=В, 2=С и т.д.. Сектора в количестве, определяемом параметром "количество_записей", считываются, начиная с логического номера сектора, указанного параметром "запись". Пример: Отладчик загрузит 109 (6DH) записей, начиная с записи с логическим номером 15 (FH) по адресу 04ВА:100, если вы введете следующую команду (считается, что имя файла уже определено): L04BA:100 2 0F 6D Примечание: Параметр "адрес" всегда игнорируется отладчиком для .exe файлов, т.к. последние могут загружаться по адресу, указанному в заголовке файла. Сам заголовок .exe файла "отрезается" от тела файла при загрузке, поэтому дисковый образ файла несколько больше образа файла в памяти. Если загружаемый файл имеет расширение .hex, то загружаться он будет по адресу, указанному в самом .hex файле, либо (при наличии параметра "адрес") по адресу, указанному параметром "адрес" плюс адрес, указанный в .hex файле. - 371 - __________________________________________________________ MOVE (M) Цель: Переместить блок памяти, указываемый параметром "область", на указанный адрес. Синтаксис: Мобласть адрес Комментарий: Если при передвижении часть адресов сдвигаемого блока перекрывается адресами назначения, то данные не будут потеряны, т.к. перекрываемые адреса сдвигаются первыми, т.е. при сдвиге вперед (в старшие адреса) первыми сдвигаются значения из старших адресов, а при сдвиге назад первыми сдвигаются значения из младших адресов. Обратите внимание на то, что понятие сдвиг условно, т.е. данные не сдвигаются, а переписываются по новым адресам, причем данные по старым адресам не удаляются (если они конечно не перекрыты новыми значениями). Пример: MCS:100 110 CS:500 __________________________________________________________ NAME (N) Цель: Присвоить имя файлу. Синтаксис: Nимя_файла [имя_файла...] Комментарий: Команда N выполняет две функции. Прежде всего, эта команда определяет имя файла, который в последствии будет загружаться или записываться. Имя файла необходимо определить с помощью команды N, если при вызове отладчика это имя не было указано. Второе предназначение команды - определение параметров, используемых загружаемым файлом и помещаемых при обычном запуске этого командного файла в командную строку его вызова. Обратите внимание на то, что обе функции выполняются одновременно, например, в ниже приведенном случае: - Nprog.exe - L - G - 372 - команда G запустит файл prog.exe, в качестве параметра которого будет принят тот же файл prog.exe. Если ваша программа не использует параметров, то назначенный ей параметр вас не интересует, однако если ваша программа использует параметры, то последние должны быть определены перед командой G, например: - Nprog.exe - L - Nfile1.dat file2.inf - G Теперь, если вы введете команду W, то записаны будут как prog.exe, так и file1.dat. Чтобы избежать такого результата следует использовать команду N перед каждой командой L или W. Для первого указанного файла форматируется блок управления файлом по адресу CS:5C, аналогичный блок создается и для второго файла (если файл указан) по адресу CS:6С. В ячейку CS:80 помещается количество введенных символов после N, а вся введенная строка без N помещается в буфер, начиная с адреса CS:81. __________________________________________________________ OUTPUT (O) Цель: Вывести байт в указанный "величиной" порт. Синтаксис: Овеличина байт Комментарий: Разрешен 16-битовый адрес порта. __________________________________________________________ PROCEED (P) Цель: Выполнить цикл, повторяемую строковую команду, программное прерывание или вызов подпрограммы. Синтаксис: Р[=адрес] [количество] где: адрес - адрес первой выполняемой команды. количество - количество выполняемых команд. - 373 - Комментарий: Команда Р передает управление отлаживаемому фрагменту программы. Этот фрагмент выполняется без прерывания до тех пор, пока не будет завершено выполнение цикла, повторяющейся команды пересылки строк, прерывания, вызова подпрограммы или указанного количества команд. После этого управление возвращается отладчику, а на экран выводится информация о состоянии регистров и флагов отлаживаемого фрагмента. Если параметр адрес (имеет знак (=) впереди) опущен, то таковым считается адрес, определяемый регистрами CS:IP отлаживаемой программы. По умолчанию сегмент определяется регистром CS. Если команда по указанному адресу не является циклом, повторяемой строковой командой, программным прерыванием или вызовом подпрограммы, то команда Р действует как команда Т (трассировать). По умолчанию параметр "количество" равен единице. Примечание: Команда Р не может быть использована для трассировки ПЗУ. __________________________________________________________ QUIT (Q) Цель: Выход из отладчика. Синтаксис: Q Комментарий: По этой команде управлений возвращается системе. __________________________________________________________ REGISTER (R) Цель: Вывод на экран содержимого регистров процессора. Синтаксис: R[имя_регистра] - 374 - Комментарий: Если вы опустите опцию имя_регистра, то на экран будет выведено содержимое всех регистров и состояние всех флагов. Если вы укажете имя регистра, то на экране появится шестнадцатеричное значение этого регистра, за которым следует двоеточие, означающее ожидание отладчиком ввода вами нового значения для этого регистра. Вы можете ввести новое значение или просто нажать ввод, тем самым оставляя прежнее значение. Ниже приведены допустимые имена регистров: AX BP SS BX SI CS CX DI IP или PC DX DS SP F ES Если вы укажете в качестве имени символ F, то на экран будут выведены двусимвольные названия флагов, отражающие одновременно и их состояние. Для изменения состояния флага наберите противоположную двусимвольную пару после знака тире. название флага установлен сброшен __________________________________________________________ Переполнение OV NV Направление DN UP Прерывание EI DI Знак NG PL Ноль ZR NZ Вспомогательный AC NA перенос Четность PE PO Перенос CY NC __________________________________________________________ При запуске отладчика сегментные регистры выствляются в начало выделенного участка памяти, регистр IP получает значение 0100Н, все флаги сбрасываются, все остальные регистры получают значение ноль. При выполнении этой команды могут выводится следующие сообщения об ошибках: BR - недопустимое имя регистра DF - для флага указано больше одного значения BF - недопустимое значение для флага Пример: После вывода спомощью команды RF состояния флагов вы можете ввести новые значения для флагов в любом порядке, с пробелами или без пробелов между ними: NV UP DI NG NZ AC PE NC - PLEICY ------ - 375 - __________________________________________________________ SEARCH (S) Цель: Поиск в указанной "области" указанного "списка" байт. Синтаксис: Sобласть список Комментарий: Байты списка могут отделяться как пробелами, так и запятыми. Если в списке указаны несколько байт, то возвращается только первый адрес найденной строки. Если список содержит только один байт, то выводятся адреса всех найденных байт в указанной области. __________________________________________________________ TRACE (T) Цель: Выполнить одну команду, вывести содержимое регистров, состояние флагов и саму команду в деассемблированном виде. Синтаксис: Т[=адрес] [величина] Комментарий: Если вы укажете адрес, то трассировка выполняется с указанного адреса. Величина указывает количество шагов трассировки. Для трассировки используются аппаратные возможности микропроцессоров 8088 или 8086. __________________________________________________________ UNASSEMBLE (U) Цель: Деассемблирование кода. Синтаксис: U[область] Комментарий: Если вы опустите параметр область, то на экран будут выведены в деассемблированном виде только 20 байт, начиная с адреса байта, следующего за последним байтом, - 376 - деассемблированным предыдущей командой Unassemble. Если вы вместо области укажете только адрес, то будут деассемблированы только 20 байт, начиная с указанного адреса. Выводимая информация будет иметь примерно следующий вид: 04BA:0100 206472 AND [SI+72],AH ... ... __________________________________________________________ WRITE (W) Цель: Запись отлаживаемого файла на диск. Синтаксис: W[адрес [дисковод: запись количество]] Комментарий: Если вы используете команду W без параметров, то предварительно необходимо загрузить в ВХ:СХ количество записываемых байт. Если вы не укажете адрес байта, начиная с которого будет выполняться запись, то запись будет выполняться, начиная с адреса CS:100. Дисковод определяется следующим образом - 0=А, 1=В и т.д.. На диск файл записывается, начиная с логического сектора, указанного параметром "запись". Параметр "количество" указывает количество записываемых секторов. __________________________________________________________ ALLOCATE EXPANDED MEMORY (XA) Цель: Выделить указанное количество страниц расширенной памяти (EMS). При успешном завершении на экран выводится сообщение: "Нandle created" (Логический номер создан) Синтаксис: ХА число где: число - шестнадцатеричное число, определяющее количество выделяемых 16К-страниц. - 377 - Комментарий: Если указанное количество страниц не доступно, то на экран выводится сообщение об ошибке. Пример: Для выделения 8 страниц расширенной памяти введите следующее: ХА 8 Если это количество страниц доступно, то на экране появится примерно следующее сообщение: Handle created=0003 __________________________________________________________ DEALLOCATE EXPANDED MEMORY (XD) Цель: Отменить выделение памяти, выполненное командой ХА. Синтаксис: XD логический_номер_памяти_EMS_созданный_командой_ХА Пример: После ввода команды: xd 0003 на экране появится (если отмена выполнена успешно) следующее сообщение: Handle 0003 deallocated (Выделение памяти EMS с логическим номером 0003 отменено) - 378 - __________________________________________________________ MAP EXPANDED MEMORY PAGES (XM) Цель: Привести физическую страницу расширенной памяти в соответствие логической странице, принадлежащей указанному логическому номеру EMS. Синтаксис: ХМ лстраница фстраница логический_номер где: лстраница - Номер логической страницы. фстраница - Номер физической страницы. Пример: Привести физическую страницу (2) расширенной памяти в соответствие логической странице (5), принадлежащей указанному логическому номеру EMS (0003): xm 5 2 0003 При успешном завершении на экране появится сообщение: Logical page 05 mapped to physical page 02 (Физическая страница 2 приведена в соответствие логической странице 5) __________________________________________________________ GET EXPANDED MEMORY STATUS (XS) Цель: Вывод на экран информации о текущем состоянии расширенной памяти. Синтаксис: XS Комментарий: Выводимая информация имеет следующий формат: Handle %1 has %2 pages allocated Physical page %1 = Frame segment %2 %1 of a total %2 EMS pages have been allocated %1 of a total %2 EMS handles have been allocated - 379 - Логическому номеру %1 принадлежит %2 выделенных страниц Сегмент %2 есть сегментный адрес физической страницы %1 Выделено %1 страниц из общего числа %2 EMS страниц Выделено %1 логических номеров из общего числа %2 EMS логических номеров. __________________________________________________________ СООБЩЕНИЯ ОТЛАДЧИКА ОБ ОШИБКАХ Приведенные ошибки прерывают только саму выполняемую команду, а не отладчик. BF - недопустимое значение для флага BP - Для команды G указано больше десяти точек прерывания. BR - недопустимое имя регистра DF - для флага указано больше одного значения © KOAP Open Portal 2000 |