РУКОВОДСТВО ПРОГРАММИСТА III.2. Диалоговый отладочный комплекс (продолжение) СОДЕРЖАНИЕ 3. Отладчик ДОК 3.1. Общие сведения 3.2. Запуск Отладчика 3.3. Представление данных 3.4. Правила записи директив 3.5. Выдача и модификация содержимого ячеек памяти 3.6. Копирование, сравнение, поиск 3.7. Реассемблирование 3.8. Запуск программ и организация контрольных точек 3.9. Переключение режимов экрана и банков памяти 3.10. Поблоковый обмен с диском 3.11. Исполнение директив Командера 3.12. Мини-ассемблер 3.13. Отличия от Отладчика ДОК ИКП 3.14. Особенности взаимодействия с системой 3. ОТЛАДЧИК ДОК 3.1. Общие сведения Отладчик предназначен для работы в режиме прямого досту- па к памяти и может служить для отладки программ в машинных командах. По своим возможностям он является расширением Системного Монитора ПЭВМ "Агат" и позволяет: - управлять переключением банков памяти; - просматривать содержимое ячеек и участков памяти в циф- ровом или символьном виде и изменять их; - исполнять хранящиеся в памяти программы в кодах с воз- вратом управления по их завершению, останову BRK или сбросу с клавиатуры; - реассемблировать участок памяти, т.е. выдавать его со- держимое в виде листинга машинной программы с указанием мнемокодов команд и абсолютных адресов данных; - записывать в память команды в мнемонической форме; - перемещать данные в памяти, производить сравнение и по- иск по образцу; - осуществлять блочный обмен данными с диском; - исполнять все функции командного режима ОС "Спрайт", в т.ч. запуск программных и командных файлов (последние могут содержать директивы Отладчика). Работа с Отладчиком ведется в диалоговом режиме с помо- щью директив. Приглашение к вводу - знак '>'. Отладчик имеет два исполнения: встроенный в ДОК и авто- номный (файл DEBUG.PRG). Обе версии идентичны. 3.2. Запуск Отладчика Автономный Отладчик вызывается запуском файла DEBUG.PRG из командного режима. Отладчик ДОК вызывается выбором альтернативы 'ОТЛАДЧИК' в меню систем ДОК. Возврат - по директиве 'Q': из автономной версии - в ко- мандный режим, из ДОК - в режим редактирования с восстанов- лением текста, если он не испорчен при работе в Отладчике. 3.3. Представление данных Отладчик оперирует следующими типами данных: 1) Шестнадцатеричная константа: - длинное (4-значное, т.е. двухбайтовое) число для обозна- чения адреса памяти; - короткое (2-значное, т.е. однобайтовое) число для обоз- начения содержимого ячейки памяти. Константы задаются последовательностью шестнадцатеричных цифр произвольной длины без префиксов. В качестве корот- кого числа берутся младшие 2 цифры, а в качестве длинно- го - младшие 4 цифры этой последовательности; если число короче, слева дописываются нули. Примеры: длинные: 0 (0000), 1A7 (01A7), FDAC, 67AF1 (7AF1); короткие: 7 (07), 6A, 123A (3A). Десятичные числа в Отладчике не используются; ниже везде употребляются только шестнадцатеричные числа. 2) Литера, обозначаемая апострофом (') и последующим произ- вольным символом. Алфавитный код литеры задает короткое число, которому она эквивалентна. Примеры: 'A (C0), 'Б (E1), '1 (B1), '* (AA). 3) Адрес блока внешней памяти - длинное число, определяющее номер блока на внешнем носителе в сквозной нумерации. 3.4. Правила записи директив Ниже при описании директив Отладчика используются нота- ция БНФ и следующие обозначения: а - адрес, длинное число, м - содержимое ячейки памяти, короткое число, т - адрес блока внешней памяти - длинное число. команда - команда Мини-ассемблера (см. 3.12), '[' - символ [ . В Отладчике есть следующие директивы: а + а а Y а - а [ [ а ] . а ] [ X ] ^ м & м [ а ] : { м } м % м [ а ] / команда м ! м P а < а . а M [ а ] G а < а . а V [ а ] L а < а . а S а [ . а ] T а < т . т R '[' командная строка а < т . т W Q Директивы обычно записывают по одной в строке. Разделять директиву переводом строки нельзя. Пробелы обязательны только в директиве записи ':' при разделении чисел. Допускаются пробелы в записи команд Мини- ассемблера и в командной строке директивы '['. Использова- ние их в других местах не предусмотрено и приводит обычно к нераспознаванию директивы. Везде, где допустим 1 пробел, их может быть несколько. В одной строке может быть указано и несколько директив. Разделение их требуется только если слияние ведет к неодно- значности. Разделителями являются пробелы и ';'. Директива записи ':' отделяется от последующей пробелом и ';'. Дирек- тива '[' может быть только последней в строке. Примеры: 1500G 1500L 2CAAL L L;L;L;L - то же самое, что 2CAALLLLLL 5463:10 20 30 ;5466/JMP6000 - ';' обязательна 10/ASL 12/JMP 100 - это не то же, что 10/ASL;12/JMP 100 При ошибке в записи директив подается звуковой сигнал. 3.5. Выдача и модификация содержимого ячеек памяти а - выдача содержимого ячейки с адресом а: > 2567 2567- FF а1.а2 - выдача содержимого участка памяти с а1 по а2: > 2565.2573 2567- 00 00 FF 2568- 4C 85 1B A9 00 8D 45 12 2570- AA BD 56 12 а1.а2X - выдача участка памяти в символьном виде: > A783.A7A5X A783- текст выдается пор A79B- циями по 18 символ A7A3- ов! а: м1 м2 ... мN - изменение последовательных ячеек памяти: >10.17 0010- 01 02 03 04 05 06 07 >10:7 >15:3 D0 EA >10.17 0010- 07 02 03 04 05 03 D0 EA В ячейку а заносится число м1, в следующую - м2 и т.д. Допускается использование литер в качестве мi. Адрес последней выданной (записанной) ячейки сохраняется и используется, если при очередной директиве записи/выдачи начальный адрес опущен. Это дает еще ряд полезных возмож- ностей: ПС - выдача участка памяти с текущего адреса до ближайшего, кратного 8: > 15 0016- AA > 0016- 76 04 > 0018- AE 56 23 76 A5 2F 11 23 а ПС : м1 - просмотр и изменение содержимого ячейки: > 245A 245A- FF > :19 > 245A 245A- 19 3.6. Копирование, сравнение, поиск а1<а2.а3M - копирование содержимого участка памяти а2.а3 в участок а1.а1+а3-а2: > 2001<2000.3FFEM Так как перепись идет последовательно, интересный эффект возникает при частичном наложении двух участков: при а1= а2+N интервал а1.а3+N заполняется содержимым своих пер- вых N байтов (при N=1 это позволяет добиться заполнения участка памяти одним заданным числом, как в примере). а1<а2.а3V - сравнение содержимого участков памяти а2.а3 и а1.а1+а3-а2 с выдачей различий на экран: > 2000<3000.3FFFV 2567-11 3567-AD 2FEA-23 3FEA-22 а1<а2.а3S - поиск цепочки байтов в участке а2.а3 по образцу в а1, записанному в виде: а1- N м1 ... мN : > 300:3 4C 50 1B > 300<2000.27FFS 2156- 246A- Начала всех найденных вхождений выдаются на экран. Сравнение и поиск можно прервать нажатием РЕД. 3.7. Реассемблирование аL - выдача листинга участка памяти, начиная с адреса а, в абсолютных адресах: адрес- код ком. сим мнем. операнд >2000L 2000- A9 00 )@ LDA #00 2002- 8D 10 20 Mp STA 2010 2005- EE E6 20 НФ INC 20E6 2008- D0 10 Pp BEQ 201A 200A- 60 ю RTS 200B- FF Ъ ??? ... Реассемблирование полей данных в программе или участков, не содержащих программы, приводит к выдаче малоосмыслен- ной информации. Число реассемблируемых строк определяется по размеру те- кущего окна диалога на экране. L - продолжение реассемблирования с последнего адреса. а1.а2T - выделение в листинге диапазона адресов. Если число в операнде реассемблируемой команды попадает в заданный диапазон, то оно выделяется красным цветом (в 32-режиме) или инверсным прямоугольником (в 64-режиме). Это позво- ляет облегчить поиск в листинге обращения к нужным ячей- кам или адресам. '.а2' может быть опущено. 3.8. Запуск программ и организация контрольных точек Р - настройка текущий адрес выдачи/изменения на ячейки От- ладчика, хранящие содержимое регистров машины в кон- трольных точках. Последующие перевод строки или команда записи позволяют узнать их текущее состояние или изме- нить его. Регистры сохраняются в порядке: A,X,Y,P,S: >P A=00 X=60 Y=78 P=B6 S=F0 >:1 2 3 >P A=01 X=02 Y=03 P=B6 S=F0 аG - передача управления по адресу а (запуск программы из памяти); предварительно в регистры процессора записы- ваются запомненные в Отладчике значения. Возвращение управления Отладчику происходит в случаях: - нормального завершения программы (выполнения команды RTS, после которого S совпадает со входным значением при ус- ловии, что стек использовался правильно); - искусственной передачи управления Отладчику из программы (переход по адресу 1000); - останова в программе по команде BRK. В последнем случае срабатывает системная реакция на не- маскируемое прерывание BRK: выдается адрес останова и сос- тояние регистров процессора в момент останова; при этом они сохраняются в ячейках Отладчика. Использование команды BRK позволяет вести простейшую от- ладку программ: вставив команду останова в узловых точках программы или записав ее из Отладчика, можно изучить состо- яние памяти в момент останова, проанализировать результаты работы и при необходимости продолжить выполнение директивой G со следующего адреса. При этом восстановятся запомненные в момент останова регистры, и программа, "не заметив" оста- нова, продолжит работу. Более развитые средства отладки ре- ализованы в отладчике DEBUGGER. 3.9. Переключение режимов экрана и банков памяти Банки памяти переключаются произвольной записью по адре- сам управления памятью или обращением к программам IOSUB (см. "РСП.I.3"). Последнее не требует знания расположения модулей памяти в разъемах ПЭВМ. Стандартный режим экрана Отладчика - 64х32 символа. Y - переключает рабочий экран в режим 32х32 и обратно. ^ - (только в 64-режиме) делит экран на два рабочих окна в половину ширины экрана и перемещает курсор между эти- ми окнами; полноэкранный режим устанавливается директи- вой Y. 3.10. Поблоковый обмен с диском а<т1.т2R - чтение интервала блоков т1.т2 в память по адресу а; а<т1.т2W - запись интервала блоков т1.т2 из памяти с адреса а. Носитель внешней памяти считается линейно упорядоченным по возрастанию номеров блоков. Т1 должно быть не больше т2 (в случае равенства '.т2' можно опускать). Обмен происходит с текущим устройством, которое можно сменить директивой Командера через '['. При переключении банков памяти следует учитывать то, что ДОС не умеет обмениваться информацией с банками памяти, па- раллельными ему (на Агате-7 это ROM2, на Агате-9 - любой банк, подключенный к 5-му сегменту, кроме банка ДОС). Поблоковый обмен с диском требуется при отладке программ, ориентированных на работу с диском, при формировании загру- зочных дисков, при ручной правке диска и т.п. 3.11. Исполнение директив Командера [командная строка - исполнение директивы Командера. Символы, следующие после директивы '[' Отладчика рассма- триваются и исполняются как директива Командного режима. При работе в Отладчике не следует использовать память, занимаемую резидентно Командером, в иных целях: это может повлечь сбои при выполнении его директив, ряда программ, использующих его вызовы и даже самого Отладчика. 3.12. Мини-ассемблер Встроенный мини-ассемблер Отладчика позволяет вводить в память коды машинных команд, заданных в мнемонической форме по следующим правилам: - мнемоника команд и обозначения типов адресации общепри- нятые; - операнды задаются шестнадцатеричными числами без знака $; символические метки и выражения недопустимы; - переходы задаются абсолютными адресами; - пробелы необязательны и могут стоять в любом количестве перед мнемокодом, перед и после операнда; - аккумуляторная адресация в командах сдвига знаком 'А' не обозначается: ASL - это ASL A ASL A - это ASL $0A Директива записи мнемокоманды по адресу а имеет вид: а/команда Отсутствие адреса равносильно записи по текущему адресу. При исполнении этой директивы на экран выдается строка реассемблирования этой команды, как в листинге. Примеры: > 5000/LDY#0/LDA(64),Y 5000- A0 00 @ LDY #00 5002- 91 64 qд LDA (64),Y > /BEQ 5007 5004- F0 02 Пb BEQ 5007 > /RTS 5006- 60 ю RTS Запись мнемокоманд в банки ППЗУ выполняется неверно,т.к. они могут быть открыты только на чтение или только на за- пись, а при записи операнда команды Отладчик читает ее код. 3.13. Отличия от Отладчика ДОК ИКП Ниже приводится сводка отличий Отладчика ДОК от прототи- па в составе ИКП: - допустима работа в 32 и 64 режимах экрана, в последнем - в двух вертикальных окнах; Отличия в листинге: - поля листинга в 32-режиме выделяются различным цветом; - есть поле символьного представления кода команды; - размер порции листинга зависит от размера окна; - в директиве Т допустим интервал адресов. Отличия в дампе: - дамп выдается строками по 8 байтов без выравнивания на- чального адреса к кратному 8; - текстовый дамп (X) выдается строками по 24 символа с символьным представлением всех байтов; Отличия в блоковом обмене: - используется сплошная нумерация блоков носителя с естес- твенным порядком. Отличия в интерфейсе с окружением: - директива '[' позволяет исполнять любую директиву Коман- дера; - выход в среду вызова (Редактор,Командер) - директива 'Q'. 3.14. Особенности взаимодействия с системой Все программы, запускаемые из Отладчика, возвращают управление ему же (0-й вызов ДОС передает его не Командеру, а Отладчику). Командер в памяти затирать не рекомендуется. Сброс и останов программы по BRK также возвращают управ- ление Отладчику (соответствующие системные вектора тоже на- строены на него). Структура используемой памяти Отладчика такова: 0018-001F - рабочие ячейки Отладчика 0020-0044 - рабочие ячейки IOSUB,Отладчика v 0040-007F - буфер параметров входной строки Командера 0100-01FF - аппаратный стек v 0100-011F - буфер ключей входной строки Командера v 0200-02E7 - стандартный буфер ввода строки 02E8-07FF - IOSUB 0800-0FFF - экран Отладчика 1000-16FF - Отладчик (в ДОК восстанавливается из 9500) 1000-17FF - в Редакторе сюда читается каталог файлов * 1800-7CFF - буфер текста Редактора * 7C00-7FFF - буфера Ассемблера и Редактора * 8000-94FF - Редактор * 9500-9BFF - копия Отладчика (->1000 при вызове) A000-BFFF - ДОС с буферами и драйверами * D000-EEFF!(ROM2-D0) - Ассемблер !EC00-FFFF (ROM1) - Командер пометки: ! - адрес может меняться в версиях, * - память занята только в ДОК, v - условно свободно.