СОВЕТСКО-БОЛГАРСКИЙ НАУЧНО-ИССЛЕДОВАТЕЛЬСКИЙ И ПРОЕКТНЫЙ ИНСТИТУТ "ИНТЕРПРОГРАММА" УТВЕРЖДЕН 1.И.00291-01 94 01-1-ЛУ 1.А0А3.02117-01 37 СРЕДСТВА АВТОМАТИЗАЦИИ ПРОЦЕССА ОСВОЕНИЯ ГОТОВЫХ ПРОГРАММНЫХ ПРОДУКТОВ ДЛЯ МИКРО-ЭВМ ОСВОЕНИЕ МИКРО РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ ЧАСТЬ 4 ПОЛНОЭКРАННЫЙ ОТЛАДЧИК ДЛЯ МИКРО-ЭВМ 1.И.00291-01 94 01-4 1.А0А3.02117-01 37-4 НА 60 ЛИСТАХ 1988 Литера 1.И.00291-01 94 01-4 1.А0А3.02117-01 37-4 - 2 - С О Д Е Р Ж А Н И Е Стр. 1. ВВЕДЕНИЕ 3 2.НАЗНАЧЕНИЕ ПРОГРАММЫ 4 3. УСЛОВИЯ ПРИМЕНЕНИЯ 5 3.1. Требования к составу технических средств 5 3.2. Требования к программному обеспечению 5 4. ОБРАЩЕНИЕ К ПРОГРАММЕ 5 5. ХАРАКТЕРИСТИКИ ПРОГРАММЫ 9 6. ОПИСАНИЕ ОСНОВНЫХ ФУНКЦИЙ 11 6.1. Разрешение или запрещение команд 11 6.2. Использование встроенного ассемблера 11 6.3. Разрешение/запрещение звукового сигнала 13 6.4. Загрузка определений точек останова из файла 13 6.5. Запись определений точек останова в файл 13 6.6. Сравнение двух областей памяти 13 6.7.Koпирование данных из одной области памяти в другую 14 6.8. Определение начального адреса дисассемблирования 14 6.9. Заполнение области памяти 15 6.10. Команда G (выполнить) 16 6.11. Ввод из порта 17 6.12. Загрузка файла в память 18 6.13. Установка адреса окна памяти 18 6.14. Выбор режима отображения 19 6.15. Вывод данных в порт 20 6.16. Kорректировка содержимого памяти 21 6.17. Печать дисассемблированного кода 21 6.18. Печать данных в шестнадцатеричном виде 22 6.19. Распечатка записей трассировки 22 6.20. Завершение работы и возврат в ДОС 23 6.21. Команда установки регистра 24 6.22. Команда поиска 24 6.23. Отображение данных трассировки 25 6.24. Запись данных в файл 26 6.25.Загрузка буфера клавиатуры (загрузка макрокоманды) 26 6.26. Режим обучения (генерация макроопределения) 27 6.27. Запись информации о нажатых клавишах в файл 27 6.28. Выполнение записанных нажатий клавиш 27 7. ЭКСПЛУАТАЦИЯ ПРОГРАММЫ 29 7.1. Описание языка запросов пользователя 29 7.2. Входные и выходные данные 37 7.3. Описание способа работы с программой 38 8. СООБЩЕНИЯ ПРОГРАММЫ 55 . - 3 - 1. ВВЕДЕНИЕ Полноэкранный отладчик AFD обеспечивает режим интерактив- ного доступа ко всем ресурсам микро-ЭВМ и удобный интерфейс для отладки программ. Во время работы AFD на экране отображается содержимое всех регистров процессора, четыре верхних элемента стека и до девяти строк дисассемблированного кода. Кроме того, име- ется два независимых окна на память, которые позволяют ото- бражать содержимое ячеек оперативной памяти в шестнадцате- ричном виде и в коде КОИ-8. Дисассемблированный код или дан- ные в шестнадцатеричном виде или в коде КОИ-8 могут быть вы- ведены на печать или в файл. Интерфейс с пользователем орга- низован очень продуманно, обеспечивая максимальное удобство в работе. Наиболее часто используемые функции могут быть выполнены с помощью функциональных клавиш. Команды имеют длину от од- ного до двух символов и для проверки их синтаксиса можно, не прерывая работы, вызывать вывод на экран справочной инфор- мации. Шаг выполнения программы может быть выполнен нажатием единственной клавиши. Даже процедуры, которые вызываются отлаживаемой программой с помощью CALL или INT, могут быть выполнены нажатием единственной клавиши. Любая ошибка ввода вызывает печать сообщения об ошибке и курсор позиционируется на символ, где во время разбора команды была обнаружена ошибка. Введенные команды могут быть повторно извлечены из стека команд для повторения операции с помощью функциональной кла- виши. Команды и другая информация могут быть записаны в файл или во внутренний буфер для выполнения в качестве макроко- манды. Это позволяет выполнять запуск AFD из командного фай- ла для установки точек останова по условям или просто для выполнения последовательности команд с помощью макроопреде- ления. Код загруженой программы дается на экране в дисассем- блированном виде, при этом поддерживается мнемоника всех ко- манд микропроцессора типа I8088 и I80286, что позволяет чи- тать код так же легко, как и исходный код с помощью экранно- го редактора текстов. Машинные инструкции в коде программы могут быть легко из- менены с помощью встроенного в AFD ассемблера. Для трансля- ции новой инструкции курсор устанавливается в окне дисассем- блированного текста на инструкцию, которую нужно заменить, инструкция может быть изменена вводом новых символов поверх дисассемблированного текста. Прикладные программы, использующие вывод данных на экран, могут использовать для этого другой дисплейный адаптер и эк- ран, чтобы избежать смешения выходных данных программы с вы- водом на экран, выполняемым AFD. Это возможно, если на микро -ЭВМ установлены как монохромный, так и цветной графический адаптеры. При работе на ЭВМ с одним экраном пользователь мо- жет выбрать режим альтернативного экрана для разделения дан- - 4 - ных, выводимых AFD и прикладной программой. Переключение между экранами выполняется с помощью нажатия единственной клавиши. Набор функций AFD в настоящий момент полностью не реали- зован ни в одном другом отладчике. Программисты, однажды по- работавшие с AFD, никогда не откажутся больше от его исполь- зования в повседневной работе. 2.НАЗНАЧЕНИЕ ПРОГРАММЫ Полноэкранный отладчик AFD существенно облегчает отладку и анализ программного обеспечения для микро-ЭВМ типа ЕС1840. Эта программа предназначена в первую очередь для отладки программ, написанных на языке ассемблера, но может быть ис- пользована и для отладки программ, написанных на языках вы- сокого уровня. AFD рекомендуется использовать при изучении системы ко- манд и программирования на языке ассемблера, так как он предоставляет возможность иметь в интерактивном режиме пол- ный доступ ко всем регистрам процессора и ячейкам памяти. Посредством AFD могут быть загружены для отладки файлы типа EXE или СОМ. На пошаговое выполнение или трассировку процедур ДОС или процедур обработки прерываний BIOS не накладывается никаких ограничений. Широкие возможности определения точек останова позволяют прерывать выполнение программы по заданному адресу, а также обеспечивают проверку указанных условий и, в случае их ис- тинности, выполнение определенных действий, таких как трас- сировка, останов или сброс счетчика проходов точки останова. Можно определять до восьми точек останова, указывая их адре- са, несколько условий выполнения заданных действий, объеди- ненных операцией логического "И" (AND), а также определяя значение счетчика проходов через точку останова и сами дейс- твия, которые необходимо выполнить. Определения точек останова могут быть сохранены в файле и впоследствии вновь использованы. Отладчик предоставляет возможность трассировки программы. Режим трассировки может быть задан так, чтобы не протоколи- ровались инструкции, выполняемые в процедурах обработки пре- рываний. Записи трассировки содержат выполненные инструк- ции, текущее содержимое регистров и содержимое верхних четырех элементов стека. Записанные данные трассировки могут быть просмотрены в полноэкранном режиме, либо выведены в файл или на печать. При работе отладчика в резидентном режиме он может быть вызван по запросу пользователя с клавиатуры или нажатием кнопки немаскируемого прерывания (NMI), если она установлена аппаратно. Это позволяет получить управление даже, если от- лаживаемая программа зависла, установив флаг запрещения пре- рываний, и система не воспринимает ввод с клавиатуры. - 5 - Если AFD больше не используется, память, занятая AFD, мо- жет быть возвращена системе при условии, что выше AFD в памяти нет других резидентных программ. 3. УСЛОВИЯ ПРИМЕНЕНИЯ Условия, необходимые для выполнения программы, определя- ются требованиями к составу технических средств и программ- ному обеспечению. 3.1. Требования к составу технических средств ППП ОСВОЕНИЕ-МИКРО предназначен для функционирования на 16-разрядных микро-ЭВМ на базе микропроцессорного набора К1810ВМ86 (или эквивалентного), таких как ЕС-1840, ЕС-1839 ("Правец-16") и др. Минимальная конфигурация должна включать: - 16-разрядный центральный процессор; - оперативную память объемом не менее 256 Кбайт; - 1 накопитель на жестком диске (необязательно); - 1 накопитель на гибком магнитном диске (или 2 в случае от- сутствия накопителя на жестком диске); - алфавитно-цифровой дисплей. 3.2. Требования к программному обеспечению ППП ОСВОЕНИЕ-МИКРО можно эксплуатировать под управлением операционной системы MS-DOS версии 3.10 и выше или совмести- мой с ней. 4. ОБРАЩЕНИЕ К ПРОГРАММЕ Для запуска AFD его необходимо загрузить в память с по- мощью ввода команды: {устр:} AFD {фспец} {парам} {"команда AFD} в ответ на подсказку ДОС (Например,'C:>'). В фигурных скобках указаны необязательные параметры. Па- раметр 'устр:' должен быть указан и определять дисковод, на котором находится AFD.COM, если он отличен от дисковода, ис- пользуемого по умолчанию. Если указан параметр 'фспец.', то для указанного файла после запуска AFD выполняется команда загрузки 'L' (подробнее она описана в п.6.11). После спецификации файла, если нужно, могут быть заданы параметры, которые помещаются в префиксный сегмент (PSP) от- лаживаемой программы. Используя двойную кавычку (") отладчи- ку могут быть переданы дополнительные команды. Если в AFD передается более одной дополнительной команды, они должны быть разделены двойной кавычкой ("). Обычно таким образом передается команда выполнения макрокоманды для автоматичес- кой установки параметров отладки (подробнее описание команды 'ХХ' дано в подразд. 6.28). - 6 - Для того, чтобы передать в AFD указание об использовании функциональной клавиши, нужно ввести '#n', где n - это номер выбранной функциональной клавиши. После указания функцио- нальной клавиши не должно следовать знака двойной кавычки ("), так как (") транслируется в код клавиши Enter. Соответствующие функциональные клавиши вводятся в следую- щем виде: F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 #1 #2 #3 #4 #5 #6 #7 #8 #9 #10 Если AFD запускается без перечисленных необязательных па- раметров, то выводится экран с названием программы. Для про- должения работы необходимо нажать какую-нибудь клавишу, после чего появляется основной экран AFD. В случае, если необязательные параметры заданы, экран с названием программы не выводится, а сразу появляется основ- ной экран AFD, общий вид которого приведен на рис. 1. Основной экран AFD  AX 0032 SI 0652 CS 37D6 IP 0198 Stack +0 0223 Flags 0200 BX 0000 DI 0000 DS 37D6 +2 0652 CX 0423 BP 0045 ES 3051 HS 2064 +4 5AC1 OF DF IF SF ZF AF PF CF DX 2053 SP FEE0 SS 37D6 FS 37D6 +6 3981 0 0 1 0 0 0 0 0 ┌───────────────────────────────────────────┬─────────────────────────────────── │CMD> g,CS:236 │ 1 8 9 A B C D E F └───────────────────────────────────────░08░┤ HS:[DI] 2A C8 80 F9 28 72 06 8A *** E X E C U T I N G *** │ HS:0008 0E 24 02 EB DF 89 3E 20 0198░2E88260601░░░░░MOV░░░░CS:[0106],AH░░░░░│ HS:0010 02 80 26 21 02 80 89 3E 019D EBE8 JMP 0187 │ HS:0018 22 02 30 36 23 02 81 CF 019F 0AC0 OR AL,AL │ HS:0020 00 80 80 CE 80 80 F9 10 01A1 CB RET Far │ HS:0028 72 0B 8A E7 8B DA 33 D2 01A2 803ECA0302 CMP [03CA],02 │ HS:0030 80 E9 10 EB F0 80 F9 08 01A7 750B JNZ 01B4 │ HS:0038 72 0D 8A E3 8A DF 8A FA 01A9 803ECB031B CMP [03CB],1B │ HS:0040 8A D6 32 F6 80 E9 08 0A 01AE 7504 JNZ 01B4 │ HS:0048 C9 74 0A D1 EA D1 DB D0 ────────────────────────────────────────────┴────────────────┬────────────────── 2 0 1 2 3 4 5 6 7 8 9 A B C D E F │ DS:0390 00 92 A5 AA B1 B2 20 A2 AA AE A4 A5 2E 2E 2E 2E │.Текст вкоде.... DS:03A0 00 00 00 8A 8E 88 2D 38 AE AA AD AE 20 32 00 00 │...КОИ-8окно 2. DS:03B0 00 00 00 00 00 14 2E 2E 2E 2E 2E 20 BD AA B0 A0 │...........экра. DS:03C0 20 53 44 54 20 77 69 6E 64 6F 77 20 32 FF FF 0F │ AFD window 2... DS:03D0 07 07 70 0F 07 07 70 0A 07 07 4F 2E 8A 27 0A E4 │..p...p...O.К'.. ─────────────────────────────────────────────────────────────┴────────────────── 1 Step 2ProcStep 3Retrieve 4Help ON 5BRK Menu6TogSc 7 up 8 dn 9 le 0 ri  Рис. 1 Если при запуске AFD не передано ни одной команды переме- щения курсора, то курсор устанавливается в поле командной строки, помеченной знаком 'CMD>'. (Курсор - это полностью заполненное мерцающее знакоместо, если редактирование экрана AFD выполняется в режиме замены, а не в в режиме вставки). - 7 - Все команды вводятся в этом окне. В дальнейшем мы будем ссы- латься на эту часть экрана как на командную строку. Поле над командной строкой показывает содержимое всех ре- гистров процессора и четыре верхних элемента стека. Эту часть экрана в дальнейшем будем называть областью регистров. Имеются два регистра сегмента - HS и FS, которые не реализо- ваны в процессоре аппаратно. Эти два регистра могут служить как вспомогательные. Они используются также для идентифика- ции сегмента после выполнения команд поиска или сравнения. Регистр HS (вспомогательный регистр сегмента) использует- ся в командах поиска и сравнения. FS (фиксированный регистр сегмента) используется только в команде сравнения, если для адресации не может быть использовано содержимое никакого другого сегментного регистра. Кроме того, эти регистры могут использоваться при опреде- лении значения регистра сегмента для адресации окна в памя- ти, которое не должно меняться даже, если отлаживаемая прог- рамма изменяет содержимое регистров сегментов. Пользователь может обращаться к ним так же, как к другим регистрам. Показанные флаги процессора имеют два представления. Пер- вое - в виде 16-разрядного слова и второе, когда каждый из восьми флаговых разрядов (OF, DF, IF, SF, ZF, AF, PF и CF) представлен двоичным значением. Все неиспользуемые разряды слова флагов установлены в ноль для облегчения интерпретации 16-разрядного слова флагов. Флаг трассировки используется AFD и поэтому он недоступен пользователю. Флаги NT и IOPL в случае микропроцессора типа I80286 не имеют значения при ра- боте с реальными адресами, используемыми операционной систе- мой ДОС. Поэтому их содержимое не показано отдельными значе- ниями, а может быть проконтролировано только при интерпрета- ции флагового регистра, представленного в виде 16-разрядного слова. Область ниже командной строки содержит текст отлаживае- мой программы в дисассемблированном виде, начиная с ячейки CS:IP. Самое левое поле в каждой строке содержит смещение адреса, следующие шестнадцатеричные значения представляют объектный код каждой инструкции. Дисассемблированный текст выглядит аналогично ассемблерному листингу, за исключением того, что не используются символические имена. Вторая строка дисассемблированной области показана на эк- ране в обратном фоне. Инструкция в этой строке называется текущей инструкцией, которая выполняется следующей по коман- де 'G' или 'Step' (функциональная клавиша F1). При выполне- нии команды 'Step' выполненная инструкция сдвигается на одну строку вверх. Строка над строкой в обратном фоне называется строкой предыдущей команды. Эта верхняя строка дисассемблированной области (строка предыдущей команды) перекрывается выводимыми сообщениями о состоянии системы и сообщениями об ошибках, когда они появ- ляются. Поэтому на эту строку в зависимости от информации, которая в ней представлена, ссылаются также, как на строку - 8 - состояния. Дисассемблируемая область может быть сдвинута вверх и вниз с помощью клавиш 'курсор вверх' и 'курсор вниз', клавиш PgUp и PgDn. При сдвиге дисассемблируемойобласти для отобра- жения кода с соответствующего адреса используются все 9 строк (включая строку предыдущей команды). При сдвиге дисас- семблируемой области с помощью клавиш 'курсор вверх' или PgUp назад в область, не содержащую кода программы, может появляться сообщение: 'Can't disassemble backward' Если это сообщение выводится при использовании режима ав- топовтора клавиатуры, буфер клавиатуры может быть очищен с помощью ввода Ctrl/Break. В случае, если текущая инструкция ссылается на ячейку па- мяти, содержимое этой ячейки показывается в обратном фоне в конце строки, расположенной после командной строки. В зави- симости от типа инструкции может быть показано значение сло- ва или байта. Область справа от командной строки - это окно памяти но- мер 1, а область под дисассемблируемой областью - окно памя- ти номер 2. Каждое окно в первой колонке содержит адреса, а содержимое памяти выводится в шестнадцатеричном виде. Смеще- ние от начального адреса каждой строки показано в верхней строке каждого окна. В каждой строке окна 1 в шестнадцатеричном виде показаны восемь байтов. Окно 2 разделено на две области, которые используют одни и те же адреса. Левая часть отображает содержимое памяти так же, как и окно 1, но по 16 байтов в строке. Правая часть по- казывает содержимое той же области памяти, что и левая, но в коде КОИ-8. Адреса окон могут отличаться друг от друга. Все символы, выведенные с повышенной яркостью, могут быть изменены пользователем вводом на их место новых значений. Курсор можно свободно передвигать в каждом окне. Для перехо- да из одного окна в другое нужно использовать клавиши F7-F10, как это описано в п.п. 7.3.7 - 7.3.10. Если в команде вызова AFD указано имя файла, то выполня- ется загрузка этого файла, а если есть дополнительные коман- ды, они передаются в AFD в порядке, указанном пользователем. Эти команды, а также команда загрузки остаются в стеке сох- раненных команд, что позволяет выполнить их последующий просмотр для проверки. При загрузке AFD по умолчанию вывод сообщения об ошибке сопровождается звуковым сигналом. Он может быть выключен с помощью команды ВЕЕР OFF. AFD проверяет также тип процессора, на котором он выпол- няется. В соответствии с этим устанавливается режим дисас- семблера и ассемблера, определяющий используемое подмножест- во мнемоники машинных инструкций. Этот режим может быть из- менен с помощью команды '286'. - 9 - Если по включению питания AFD нужно резидентно установить в системе, то в качестве последней команды в файл AUTOEXEC.BAT должна быть включена команда: AFD "QUIT R Эта команда загружает AFD и немедленно завершает его ра- боту, оставляя загруженным в резидентном режиме. Все другие резидентные программы должны загружаться перед AFD для того, чтобы впоследствии позволить освободить память, используемую отладчиком. 5. ХАРАКТЕРИСТИКИ ПРОГРАММЫ AFD представляет собой СОМ-файл, загружаемый для выполне- ния операционной системой ДОС. После запуска AFD резервирует память, начиная с последнего используемого адреса, для заг- рузки тестируемой прикладой программы. Управление передается прикладной программе либо по команде, либо по нажатию функ- циональной клавиши. Если не включена трассировка, прикладная программа выполняется в реальном времени, до тех пор пока управление не возвращается в AFD. Выполнение программы может быть прервано пользователем нажатием клавиш Ctrl/Esc, нажа- тием кнопки немаскируемого прерывания (NMI) (если она аппа- ратно установлена) или посредством определения точки остано- ва. Точки останова определяются пользователем с помощью меню определения точек останова или включением инструкции INT3 в код отлаживаемой программы. При обнаружении точки остано- ва, определенной вне AFD, после останова программы выводится сообщение 'BRx'. Koгда работа AFD завершается по команде 'QUIT', вся па- мять возвращается в общесистемный пул свободной памяти, кро- ме случая, когда AFD запущен в резидентном режиме по команде 'QUIT RESIDENT'. В этом случае только область памяти после AFD возвращается в систему. Для возвращения управления об- ратно в отладчик может быть использована кнопка NMI, клавиши Ctrl/Esc или активные точки останова. Примечание. Процедуры ДОС не являются реентерабельными (повторно входимыми).При отладке или прерывании процедур ДОС не должно запускаться никаких функций AFD для работы с фай- лами или функций печати, так как AFD использует для выполне- ния файловых операций некоторые из функций ДОС, что в этом случае может привести к непредсказуемым результатам. При работе в резидентном режиме отлаживаемая программа не может быть загружена с помощью команды загрузки AFD. Загруз- ка может быть выполнена с помощью загрузчика ДОС или пос- редством повторной загрузки AFD, пока одна копия выполняет- ся в резидентном режиме. Если после AFD нет загруженных резидентных программ, то отладчик может быть выгружен из ре- зидентого режима по команде 'QUIT'. Используемая память при этом возвращается в систему. - 10 - Примечание. Для передачи управления клавиатуре исполь- зуется вектор прерывания 9. Поэтому драйвер клавиатуры, ис- пользуемый, например, для поддержки символов кириллицы, дол- жен быть загружен перед AFD. В общем случае вектора прерыва- ний 1, 2, 3 и 9 не должны изменяться, пока AFD активен. Ниже приводится краткий список функций и возможностей AFD. Подробнее они описаны в соответствующих разделах данно- го руководства: - легкость использования и высокая функциональность; - полноэкранное отображение всей необходимой информа- ции; - изменение содержимого регистров и памяти в режиме полноэкранного редактирования; - автоматическая установка параметров и выполнение по командам из командного файла; - поддержка клавиатурных макрокоманд; - возможность получения справочной информации без пре- рывания отладки; - функция извлечения ранее введенных команд; - дисассемблирование машинных инструкций; - встроенный ассемблер машинных инструкций; - поддержка теневого или альтернативного экрана для вы- вода данных отлаживаемой программой; - поддержка как монохромного, так и цветного адаптера; - пошаговое выполнение программы и возможность выполне- ния за один шаг целиком процедуры или подпрограммы; - резидентный режим работы и возможность последующего освобождения используемой памяти. - возможность прерывания программы посредством: - ввода с клавиатуры Ctrl/Esc; - условных точек останова; - программных прерываний (INT3); - сигнала немаскируемого прерывания (NMI); - определение до 8 точек останова по условиям. Действия, выполняемые в случае истинности условий: - останов; - включение/выключение трассировки; - обнуление счетчика проходов; - возможность подавления трассировки процедур INT; - быстрая трассировка по условиям, во время которой за- писываются инструкции и содержимое регистров; - одна дополнительная точка останова по указанному адресу; - команды корректировки содержимого памяти и поиска заданных строк; - команды копирования и сравнения областей данных; - вывод дисассемблированного кода, данных или записей трассировки на печать или в файл; - вычисление шестнадцатеричных арифметических выраже- ний. - 11 - 6. ОПИСАНИЕ ОСНОВНЫХ ФУНКЦИЙ К основным функциям AFD пользователь может обратиться с помощью функциональных клавиш и указывая в командной строке соответствующие команды полноэкранного отладчика. В данном разделе описываются все команды AFD, которые можно вводить в командной строке. Все 28 команд описываются в алфавитном порядке. Большинство команд имеют длину 1 или 2 символа и могут быть введены как строчными, так и прописны- ми буквами. Команду QUIT необходимо вводить полностью, что позволяет избежать нежелательного завершения программы. Все символы, показанные в описании команд большими буква- ми, должны быть введены. Некоторые команды допускают сокра- щение, например, команда BEEP. Символы, которые можно опус- кать, заключены в скобки (), например, BE(EP). Параметр OFF можно задавать и с одним F. Параметры, задаваемые в командах, описаны в п.7.1.1. 6.1. Разрешение или запрещение команд микропроцессора типа I80286 Формат команды: 286 (ON) (OFF) Примеры: 286 286 ОN 286 OFF Команда '286' может быть использована для разрешения или запрещения дисассемблирования дополнительных команд микро- процессора типа I80286. Ассемблер находится всегда в том же режиме, что и дисассемблер. При запуске AFD проверяет тип процессора, на котором он выполняется и соответственно выби- рает режим работы. Для определения режима работы AFD команда 286 вводится без параметров. AFD указывает состояние (ON-включен, OFF-вы- ключен) в командной строке и подсказывает пользователю о не- обходимости нажать клавишу для продолжения работы. Примечание. Когда режим 286 разрешен при работе на микро- ЭВМ с процессором, не поддерживающим дополнительные команды, эти команды только отображаются на экране. Они не могут быть выполнены. Особое внимание следует обратить на привилегированные ко- манды, которые выполняются на микро-ЭВМ на базе микропроцес- сора типа I80286. Большинство этих команд должны использо- ваться только в защищенном режиме, IOPL=0. AFD подразумева- ет, что работа идет в режиме реальных адресов. Изменение этого режима может привести к непредсказуемым результатам. 6.2. Использование встроенного ассемблера Формат команды: А {адрес} Пример: А А CS:100 - 12 - Aссемблер может быть вызван с помощью команды 'А'. Если параметр 'адрес' не указан, то ассемблирование начинается с текущей команды. В противном случае - с указанного адреса. Выбранная ячейка должна находиться в оперативной памяти. После ввода этой команды AFD переходит в режим ассембли- рования. Курсор устанавливается на строку дисассемблирован- ного кода, выведенную в обратном фоне, и символы в этой строке выводятся с повышенной яркостью, как во всех входных полях AFD. Командная строка заменяется на сообщение о том, что AFD находится в режиме ассемблера и для выхода из этого режима необходимо нажать Ctrl/Home. В дополнение к обычным клавишам, поддерживающим редакти- рование командной строки, Tab может использоваться для пере- мещения курсора с поля мнемоники на поле операнда и обратно. Клавиши 'курсор вверх' и 'курсор вниз' используются для сдвига дисассемблируемого окна как и во время обычного ввода команды. Все введенные символы преобразуются в символы верх- него регистра. Все функциональные клавиши поддерживаются так же, как в обычном режиме ввода команд. Все изменения в ассемблируемой строке игнорируются, если они не были закончены нажатием клавиши Enter. Команды могут быть изменены или заменены как в поле мнемоники, так и в поле операндов. Введенная команда ассемблируется и, если ошибок не обнаружено, содержимое ячейки памяти изменяется на новое значение. Кроме того, окно дисассемблера перемещается, устанавливая курсор на следующую команду. Примечание. Заменяемая команда может иметь длину в бай- тах, отличную от длины новой команды. Это может привести к тому, что следующие инструкции будут интерпретироваться ина- че. В зависимости от режима, заданного командой '286' может быть использована мнемоника всех команд или только мнемоника основных команд. Если дополнительные команды не поддержива- ются, выдается сообщение об ошибке: 'Unknown mnemonic' Поддерживается полная мнемоника инструкций, даже синонимы (такие как JB/JC). Для синонимов генерируется одинаковый код. Однако дисассемблер отображает только одно представле- ние синонимов. Из-за ограниченной длины строки для представления указа- телей выбрана специальная мнемоника. Индикатор "WORD PTR" отображается как "W/", а "BYTE PTR" - как "В/". Eсли для од- нооперандной команды, которая указывает на ячейку памя- ти (например INC[1234]), не задан указатель, то по умолча- нию подразумевается операция над словами. - 13 - 6.3. Разрешение/запрещение звукового сигнала Формат команды: BE(ep) (ON) (OFF) Пример: BE BE ON BEEP OFF Эта команда разрешает и запрещает звуковой сигнал, сопро- вождающий вывод сообщений об ошибках. По умолчанию после за- пуска AFD выдача звукового сигнала разрешена. Для ввода команды достаточно ввести первые два символа команды и параметр. При вводе команды без параметров в командой строке выво- дится текущее состояние и подсказка о том, что для продолже- ния работы нужно нажать какую-либо клавишу. 6.4. Загрузка определений точек останова из файла Формат команды: BL фспец Пример: BL A:TEST.SET Эта команда используется для чтения с диска файла опреде- лений точек останова. Может быть использовано любое имя файла, но рекомендуется в качестве расширения имени исполь- зовать ".SET". Во время выполнения дисковых операций в стро- ке состояния выводится сообщение: 'Reading' и курсор исчезает. С именем файла нельзя указывать маршрут. Файл должен на- ходиться в текущем каталоге или на указанном диске. 6.5. Запись определений точек останова в файл Формат команды: BW фспец Пример: BW TEST.SET Эта команда используется для записи текущих определений точек останова в дисковый файл. Может быть использовано лю- бое имя файла, но рекомендуется в качестве расширения имени использовать ".SET". Во время выполнения дисковых операций в строке состояния выводится сообщение: 'Writing' и курсор исчезает. С именем файла нельзя указывать маршрут. Файл должен на- ходиться в текущем каталоге или на указанном диске. 6.6. Сравнение двух областей памяти Формат команды: С адр.1, адр.2, длина Пример: С DS:100,FOOO:123,%100 С 100, HS:0123, CХ*2 Эта команда сравнивает две области памяти. Для обоих ад- ресных параметров в качестве умолчания используется текущий - 14 - сегмент данных - DS. Количество байтов, которые нужно срав- нить, определяется параметром 'длина'. Если указанная длина выходит за границы сегмента, адрес не изменяется циклически на первый адрес этого сегмента, а переходит на следующий сегмент. Если все байты указанных областей совпадают, то в строке состояния выводится сообщение: 'All bytes equal' и командная строка очищается. В случае различия между двумя областями для вывода содер- жимого используются оба окна памяти. В окне 1 выводятся дан- ные, адресуемые первым параметром, начиная с первого несов- падающего байта. Окно 2 используется для отображения второй области. Если задано абсолютное значение сегментного регист- ра, которое отличается от всех текущих значений сегментных регистров, то для адресации окна 1 будет использоваться ре- гистр HS. Если HS и регистры сегмента процессора не могут быть использованы для адресации окна 2, то будет использо- ваться регистр FS и модифицироваться для второго окна. Командная строка не очищается и курсор указывает на нача- ло второго операнда. Это позволяет в случае неправильного ввода изменить указанный адрес. Для ввода новой команды строка должна быть очищена нажатием клавиши Esc. 6.7.Koпирование данных из одной области памяти в другую Формат команды: CO исх.адр., пр.адр., длина Примеры: CO DS:100, 5023:123, %100 CO 100, HS:0123, CX*2 Содержимое ячеек памяти, указанных исходным адресом (исх.адр.), копируeтся в область, определенную адресом при- емника (пр.адр.). Направление такое же, как для команды COPY операционной системы - из первого параметра во второй. Пара- метр 'длина' определяет количество байтов, которые нужно скопировать. Если указанная длина выходит за границы сегмен- та, адрес не изменяется циклически на первый адрес этого сегмента, а переходит на следующий сегмент. Во время выполнения команды курсор исчезает, а командная строка содержит введенную команду. Если все байты успешно скопированы, командная строка очищается и выводится сообще- ние: 'All bytes copied' Если адрес приемника находится не в оперативной памяти, то в строке состояния выводится соответствующее сообщение об ошибке, а командная строка не очищается. 6.8. Определение начального адреса дисассемблирования Формат команды: D адр. Примеры: D 120 D * - 15 - D FS:100 D 123:AX+SI D IP Команда 'D' используется для установки адреса начала ди- сассемблируемой области. Этот адрес может быть задан как сегмент и смещение. Для указания сегмента или смещения могут быть использова- ны арифметические выражения. Если значение сегмента не ука- зано, то по умолчанию используется значение регистра сег- мента кода, отображаемого в данный момент. Если сегмент ука- зан, то это значение будет использовано для установки ре- гистра CS, который показан в области регистров. Однако, если сегмент кода был изменен какой-либо командой, инструкция, которая должна выполняться после последней выполненной инструкции, может быть повторно выведена на экран командой 'D *'. Указатель команд - регистр IP не изменяется командой D. Значение указателя команд может быть использовано для опре- деления смещения в виде 'IP' или '*'. Указанный адрес должен быть началом инструкции. AFD не выполняет никакого автоматического выравнивания. После ука- зания адреса, который не содержит первый байт допустимой инструкции, последующий код интерпретируется так, как если бы эта ячейка была началом инструкции. Неизвестный код инст- рукции представляется в виде псевдооперации определения бай- та (DB xx). При вводе команды D, верхняя строка в дисассемблируемой области (строка предыдущей команды) очищается. В дисассемб- лируемой области отображаются 8 дисассемблированных инструк- ций, начиная с указанного адреса. Первая инструкция отобра- жается в поле текущей инструкции. При сдвиге дисассемблируемой области вверх или вниз используются все 9 строк окна дисассемблера. 6.9. Заполнение области памяти Формат команды: F адр, повтор, строка Примеры: F 1234,1B,23 456A 'текст' 11 'еще текст' F CS:DI+SI, %100, 20 Команда заполнения используется для заполнения области памяти указанной строкой. Начальный адрес может быть задан с указанием сегмента или без него. Для обеих частей могут при- меняться арифметические выражения. Если значение сегмента не указано, то в качестве сегмента по умолчанию используется текущее содержимое регистра сегмента данных. Параметр 'повтор' указывается с помощью четырех шестнад- цатеричных цифр или десятичного значения. Он определяет, сколько раз нужно повторить в памяти указанную строку. 'Строка' может быть любой комбинацией байтов, слов или строк в KOИ-8. Строки в коде KOИ-8 заключаются в одиночные кавычки. Если нет закрывающей кавычки, то все символы до конца строки считаются символами строки. Слова хранятся в - 16 - оперативной памяти в таком порядке: младший байт, затем старший. Во время выполнения команды курсор становится невидимым и в строке состояния выводится информационное сообщение. С по- мощью этой команды можно изменить очень большие области па- мяти, что может потребовать определенного времени. Операция заполнения немедленно прекращается при нажатии любой клави- ши. Если в качестве адреса указана область не оперативной па- мяти, то выводится сообщение об ошибке и курсор устанавлива- ется на параметр 'адр.'. Нужно исправить адрес и выполнить команду снова или использовать клавишу Esc для очистки ко- мандной строки. 6.10. Команда G (выполнить) Формат команды: G {нач.адр.} {адр.ост} Пример: G G * G CS:100 G 123, 1100 G ,1200 Команда G (выполнить) используется для запуска отлаживае- мой программы или для выхода обратно в прерванную программу, если AFD выполняется в резидентном режиме. Необходимо, чтобы адресные параметры ссылались на ячейки, которые содержат первый байт допустимых инструкций, в противном случае ре- зультат выполнения команды непредсказуем. Начальный адрес 'нач.адр.' может быть указан как сегмент и смещение. Если значения сегмента не указано, то используется значение ре- гистра сегмента кода, отображаемого в данный момент. Если CS: указан явно, то значением кода сегмента становится то, которое использовала последняя выполненная инструкция. Оно может отличаться от того, которое показано в области регист- ров экрана, если была использована команда 'D' для отобра- жения другого сегмента. Команда 'G' без указания начального адреса начинает выполнение с инструкции, которая отображена в дисассемблируемой области в обратном фоне. Кроме восьми точек останова, определенных с помощью меню точек останова, может быть непосредственно указана дополни- тельная точка останова. Если указанный адрес останова нахо- дится не в оперативной памяти, выводится сообщение об ошибке и запуск программы не выполняется. Адрес точки останова мо- жет равняться начальному адресу. Это часто используется для проверки циклов. Выполнение программы прекращается, ког- да указанный адрес достигается во второй раз. При запуске в строке состояния выводится сообщение: '*** E X E C U T I N G ***' и курсор становится невидимым. Все установленные точки оста- нова активизируются. При прохождении одной из 8 отдельно оп- ределенных точек останова в первой позиции строки состояния выводится номер данной точки останова. При каждом прохожде- нии точки останова интенсивность вывода этого номера изменя- - 17 - ется с повышенной яркости на нормальную и наоборот. Если до- стигнута точка останова, включающая трассировку, то в конце строки состояния выводится сообщение 'TRACE'. Этот текст удаляется из строки состояния, когда трассировка снова вы- ключается. Выполнение отлаживаемой программы прекращается, когда до- стигается дополнительная точка останова, определенная в ко- манде 'G' (BR0), или какая-либо из восьми точек останова, определенных через меню, в которой задано действие STOP. Но- мер точки останова, в которой прекратилось выполнение прог- раммы, указывается в строке состояния. Выполнение программы прекращается также по запросу поль- зователя с клавиатуры или (если имеется) с помощью кнопки, вызывающей немаскируемое прерывание (NMI). Для останова программы с клавиатуры нужно одновременно нажать клавиши Ctrl и Esc. Если в отлаживаемой программе встречается инструкция INT3, выполнение также останавливается в этой точке. AFD со- общает об этом событии, выдавая сообщение: 'Stop by BRx' Tекущей инструкцией является инструкция INT3. Ее необхо- димо пропустить или заменить перед тем, как выполнение прог- раммы может быть продолжено. Когда управление возвращается в AFD, все области экрана корректируются и отображают текущие значения. Могут быть введены новые команды или старые команды могут быть извлече- ны из стека команд. Если AFD выполняется в резидентном режи- ме, это указывается в строке над командной строкой. Когда отлаживаемая программа, загруженная с помощью AFD, завершается и возвращает управление в DOS с помощью прерыва- ния, все регистры сбрасываются в их первоначальное состояние и все ячейки точек останова восстанавливаются и содержат свои исходные коды инструкций. В дисассемблируемой области выводится начало программы и появляется сообщение. 'Program terminated OK' Примечание. Указатель стека и сегмент стека должны быть допустимыми и по крайней мере 6 байтов должны быть доступны для команды G. В противном случае результаты будут непред- сказуемы. 6.11. Ввод из порта Формат команды: I адр. Примеры: I 3EC I 3EC+SI I DX I DX-AX Команда 'I' используется для чтения любого 8-разрядного порта ввода/вывода и отображения текущего значения на экра- не. Адрес 'адр.' может быть арифметическим выражением. После выдачи команды курсор исчезает и командная строка завершается знаком равенства, за которым следует шестнадца- - 18 - теричное значение из порта ввода/вывода. В строке состояния выводится сообщение: 'Press any key to continue' После нажатия клавиши командная строка и строка состояния очищаются и курсор устанавливается на начало командной стро- ки. Примечание. Допустимый диапазон адресов 0-3FF. 6.12. Загрузка файла в память Формат команды: L фспец {парам.}, {aдр.} Примеры: L TEST L TEST.COM L DATA.DAT, DS:1234 Команда загрузки используется для загрузки в память фай- лов любого типа. Если расширение имени файла не указано, по умолчанию используется расширение ".EXE". Если имя файла, который нужно загрузить, не имеет расширения, то имя должно заканчиваться точкой (.), чтобы избежать генерации расшире- ния по умолчанию. Когда параметры вводятся после имени фай- ла, эти данные помещаются в префиксный сегмент программы (PSP). По умолчанию адрес, с которого загружаются эти файлы, CS:0100. Если адрес указан без сегмента, по умолчанию ис- пользуется текущее значение сегмента кода. Во время дисковых операций курсор становится невидимым и в строке состояния выводится сообщение: 'Reading' Примечание. Файлы EXE и COM не могут быть загружены ко- мандой 'L', когда AFD работает в резидентном режиме, так как это может привести к противоречиям с диспетчером памяти опе- рационной системы. Программы должны загружаться обычным заг- рузчиком ДОС, либо AFD может быть вызван повторно, пока одна копия AFD уже резидентна в памяти. Если отлаживаемая программа скомпонована программой LINK с ключом HIGH, она не может быть загружена загрузчиком AFD. Для проверки таких программ AFD должен быть запущен в рези- дентном режиме, после чего нужно использовать загрузчик опе- рационной системы. Для доступа к указанной точке кода прог- раммы пользователь может поместить в эту точку инструкцию INT3. Примечание. После загрузки программы SS:SP должен ука- зывать на допустимую ячейку памяти перед тем, как программа будет запущена. AFD использует при передаче управления отла- живаемой программе для ее выполнения 3 верхних слова в сте- ке. 6.13. Установка адреса окна памяти Формат команды: Mn адр. Примеры: М1 DS:1230 M1 ES - 19 - M2 FS:SI+1000-DI М1 2340:[SI] M2 SI+AX+10 M1 [SI] Эта команда используется для установки начального адре- са для обoих окон памяти. 'n' может быть 1 или 2 (номер окна). Если введено имя регистра, за которым следует двоето- чие (:), текущее имя регистра, отображенное в указанном окне заменяется на вновь введенное имя. Если для определения сегмента адреса используется выраже- ние или значение, то регистр HS устанавливается равным этому значению и вместо имени сегмента в указанной области окна записывается HS. Если HS уже используется для другого окна, данная область также будет указана с помощью HS. Если это не желательно, то для окна, которое не должно изменяться, сле- дует использовать регистр FS. Koманда 'М' может быть использована и для изменения толь- ко сегмента. В этом случае никакого смещения вводить не нуж- но. Если значение сегмента пропущено, изменяется только смещение в указанном окне. Смещение может быть любым выраже- нием или одним значением, которое не выходит из диапазона 16-ти разрядного слова. Для указания смещения можно также использовать имя любо- го 16-ти разрядного регистра в квадратных скобках (например, [DI]). Когда используется этот способ, окно памяти корректи- руется в соответствии с текущим значением указанного регист- ра. Когда проверяются строковые операции, этот режим очень удобен, так как адрес окна всегда равен содержимому исполь- зуемого регистра. Этот режим будет сброшен в нормальный, когда область памяти сдвигается вверх и вниз с помощью кла- виш 'курсор вверх' и 'курсор вниз' или указано другое окно. Адрес окна памяти может быть также изменен прямой заменой символов в поле адреса окна. 6.14. Выбор режима отображения Формат команды: МО(de) МО(de) M(ono) МО(de) C(olor) МО(de) A(lternative) ON МО(de) A(lternative) OFF Команда MODE используется для выбора одного из 4 режимов отображения или для получения информации о том, куда выво- дятся данные отлаживаемой программой. Если команда MODE вво- дится без параметров, текущий режим указывается в строке состояния. При вводе команды могут использоваться любые сокращения слов, указанных в скобках. Первоначально при запуске AFD отлаживаемая программа и AFD используют один и тот же экран. Текущий экран системы, с - 20 - которого запускается AFD, используется обеими программами. Вэтом режиме вывод на экран, выполняемый отлаживаемой программой, будет смешиваться с информацией экрана AFD. Это означает, что любые данные, выводимые отлаживаемой програм- мой, будут тут же заменяться данными с экрана AFD при каждом возврате управления. Однако этот режим очень полезен, когда отлаживаемая программа не выполняет операций отображения на экране, так как выполнение программы по шагам не вызывает переключения на альтернативный экран. Независимо от текущего режима экрана при использовании параметра MONO в команде MODE, AFD переключается в режим мо- нохромного отображения. Команды выбора режима не влияют на использование экрана отлаживаемой программой. Параметр COLOR заставляет AFD использовать цветной экран в режиме 80х25 символов. Если выбранный адаптер не установлен, выводится сообщение об ошибке и режим экрана не изменяется. В системах, которые оборудованы только одним монитором, монохромным или цветным, альтернативный или теневой экран назначается для использования отлаживаемой программой. Когда введена команда ALTERNATE ON, AFD и отлаживаемая программа используют один и тот же экран. Содержимое экрана и состояние курсора сохраняются и восстанавливаются каждый раз, когда управление передается в отлаживаемую программу. Вместе с разрешением использования альтернативного экрана может использоваться функциональная клавиша F6 для переклю- чения основного экрана AFD на дополнительный и наоборот, ес- ли управление находится в AFD. Примечание. Когда альтернативный режим используется с цветным графическим адаптером, AFD для обработки альтерна- тивной функции использует страницу 3 этого адаптера. Для запрещения альтернативного экрана введите команду MODE с параметром ALTERNATE OFF. Когда для AFD и отлаживаемой программы используются раз- ные экраны и выполняемая программа переключается на экран, который используется AFD, альтернативный режим включается автоматически и, когда AFD получает управление, выводится информационное сообщение. Когда AFD запущен в резидентном режиме, альтернативный режим экрана включается автоматически. 6.15. Вывод данных в порт Формат команды: О адр., знач. Пример: О 3ЕС, 12 О 3EC+SI,1230 O DX, AL O DX-AX, AX+BX*2 Эта команда используется для посылки байта в порт ввода/ вывода. Адрес 'адр.' и значение 'знач.' могут быть заданы aрифметическим выражением или просто значением, не выходящим из диапазона 16-ти разрядного слова. - 21 - Значение, посылаемое в порт ввода/вывода, может быть бай- том или словом. Когда значение выражения может быть пред- ставлено как байт, выполняется вывод байта, в противном слу- чае - слова. Примечание. Диапазон адресов портов ввода/вывода 0-3FF. 6.16. Kорректировка содержимого памяти Формат команды: Р адр., строка Примеры: Р 110, 12 3ЕС 'текст' SI P DS:1103, AX 1234 P *, 90 Команда корректировки используется для изменения содержи- мого памяти. Адрес 'адр.' ячейки, которую нужно изменить, может состоять из сегмента и смещения. Если значение сегмен- та пропущено, то по умолчанию используется текущее значение сегмента кода (обычно команда корректировки используется для модификации области кода). 'Строка' может быть любой комбинацией байтов, слов и строк в KOИ-8. Примечание. Строка в KOИ-8 заключаетсяв одиночные кавычки ('). Если закрывающей кавычки нет, то все символы до конца командной строки считаются символами строки в KOИ-8. При выполнении команды корректировки все области экрана (регистров, памяти и дисассемблируемая область) корректиру- ются. При любом изменении содержимого ячеек памяти верхняя строка дисассемблируемой области (строка предыдущей команды) очищается. При попытке изменить ячейку, которая находится в ПЗУ, в строке состояния выводится сообщение об ошибке и курсор устанавливается на параметр адреса в команде. 6.17. Печать дисассемблированного кода Формат команды: PD адр., длина {,фспец.} Примеры: PD*, %100 PD DS:1103, СХ, А:TST.PRT С помощью этой команды дисассемблированный код может быть распечатан на бумаге. Если в команде не указан сегмент в па- раметре 'адр.' по умолчанию используется содержимое регистра CS. Этот адрес определяет начало текста для вывода на пе- чать. Параметр 'длина' определяет число инструкций, которые нужно распечатать. Длина может быть любым значением, которое можно представить с помощью 16-ти разрядного слова. Когда достигается конец сегмента, адрес циклически изменяется на адрес начала сегмента. Задавая дополнительно спецификацию файла, вывод может быть направлен в файл для последующей проверки или распечат- ки. Для обращения к другим каталогам в спецификации файла можно указывать маршрут. Распечатка начинается с текста '> AFD print out', затем печатается текущие дата и время. - 22 - Если принтер не готов или попытка создать файл закончи- лась неудачей, в строке состояния выводится сообщение, но введенная строка команды не стирается. Команда может быть отредактирована или выдана повторно после приведения в го- товность устройства печати. После запуска печати на экран выводится информационное сообщение. Печать может быть прервана нажатием клавиши Esc. В случае возникновения ошибки в процессе вывода, операция завершается. 6.18. Печать данных в шестнадцатеричном виде и в коде KOИ-8 Формат команды: PH адр., длина {,фспец} Примеры: PH *, %100 PH DS:1103, CX, A:TST.PRT Эта команда распечатывает данные из памяти в том же фор- мате, в котором они выводятся в окне 2 основного экрана. Формат команды и ее действие аналогичны команде PD, описан- ной в подразд. 6.17. Единственная разница состоит в том, что 'длина' в этой команде определяет количество байтов, которые нужно распечатать, и в качестве сегмента по умолчанию ис- пользуется содержимое регистра сегмента данных. 6.19. Распечатка записей трассировки Формат команды: PT {начало, длина {,фспец}} Примеры: PT PT 10, %20 PT %10,5\WORK\TST.PRT Эта команда используется для распечатки предварительно записанных записей трассировки. Формат печати аналогичен формату печати команды'TB', описанной в подразд. 6.23. Ко- манда может быть введена без параметров для распечатки всех записей трассировки, находящихся в данный момент в буфере. Если данных трассировки нет, операция завершается и в строке состояния выводится сообщение об ошибке. Параметр 'начало' может быть указан для определения сме- щения до первой записи трассировки, которую нужно распеча- тать. Если это значение больше максимального номера записей в буфере, операция завершается. Количество записей, которое нужно распечатать, определя- ется параметром 'длина'. Если это значение указывает номер записи больше максимального из записанных, выдается сообще- ние об ошибках. Печать прекращается, когда достигнут конец буфера трассировки. Указывая спецификацию файла, вывод можно направить в дис- ковый файл. Для размещения файла в другом каталоге в специ- фикацию файла можно включить информацию о маршруте. В начале операции печати основной экран заменяется отоб- ражением информации о трассировке. После печати каждой - 23 - записи изображение сдвигается вверх на одну запись. Печать может быть прервана пользователем нажатием клавиши Esc. 6.20. Завершение работы и возврат в ДОС или переход в резидентный режим Формат команды: QUIT {R{ESIDENT}} Эта команда используется для завершения работы AFD или для перевода его в резидентный режим. В любом случае опреде- ление всех точек останова сбрасывается и управление переда- ется обратно в операционную систему. Память, занятая AFD, освобождается, только когда в команде не указан параметр 'R(esident)'. Команда QUIT должна быть введена полностью для того, что- бы избежать непреднамеренного завершения работы AFD. Пара- метр может быть сокращен до одного символа. При завершении работы AFD перед возвратом управления в ДОС восстанавливается состояние курсора и экрана прикладных программ. При переходе в резидентный режим включается режим использования дополнительного экрана (см. подразд. 6.14.) для того, чтобы при следующем вызове AFD сохранить экран прикладной программы. После того, как AFD сделан резидентным с помощью команды QUIT, он остается активным, даже если выполняется другая программа. В этом случае AFD может быть вызван в любой мо- мент для отладки пользовательской программы. Если AFD ис- пользуется в резидентном режиме, то около 64 Кбайтов памяти, которые он занимает, становятся недоступны для операционной системы. В резидентном режиме программы не могут загружаться с по- мощью AFD. Если необходимо загрузить программу с помощью AFD, пользователь может запустить AFD еще раз, в то время как резидентный вариант AFD по-прежнему будет находиться в памяти. Если память выше резидентного AFD не используется другой программой, то резидентный вариант AFD может быть "выгружен" с помощью команды QUIT. Это позволяет освободить используе- мую память. При работе в резидентном режиме AFD может быть вызван по запросу пользователя с помощью одновременного нажатия кла- виш'Ctrl' и 'Esc' или нажатия кнопки немаскируемого прерыва- ния (NMI), если она установлена. Если в отлаживаемой про- грамме выполняется инструкция INT3, управление также пере- дается AFD. Возможность определения условий для точек останова явля- ется очень полезной для отладки прикладных программ. При ра- боте в резидентном режиме эта возможность должна использо- ваться с большой осторожностью. Если прикладная программа выполняется и AFD вызывается для установки точек останова, то оригинальный код по адресу точки останова запоминается. Эти байты будут восстановлены, когда AFD передает управление обратно. Если управление передается в прикладную программу, точки ос- - 24 - танова остаются активны. Если текущая программа заменяется на другую и вызывается AFD, то AFD пытается восстановить байты кода по адресам, указанным для точек останова. Это может изменить код новой прикладной программы, что вызовет непредсказуемые результаты при ее выполнении. AFD может помочь пользователю даже в той ситуации, когда AFD определяет, что код был изменен после последней команды "G", но сохраненный код не будет восстановлен по данному ад- ресу и точка останова будет запрещена. Когда это происходит, выводится сообщениe: 'Code changed in BRn' и поле счетчика для данной точки останова сбрасывается в 0. В сообщении указывается наибольший номер точки останова. 6.21. Команда установки регистра Формат команды: {R} регистр=значение Примеры: R AX=1250 DS=AX+SI CF=1 BX=AL*3+D-CX/AH CX=%20 Команда установки регистров используется для установки в регистры процессора указанных значений. Для упрощения ввода команды 'R' может быть пропущена. Можно изменить содержимое 16-ти, 8-ми или 1-но разрядного регистра. Тип регистра и данных с другой стороны знака ра- венства должны совпадать, в противном случае выводится сооб- щение об ошибке и содержимое регистра не изменяется. Однако содержимое 16-ти разрядного регистра может быть заменено на байт. В этом случае старший байт заменяется на нулевой. В 1-но разрядные регистры можно устанавливать только зна- чения 0 или 1. Любые другие назначения вызывают ошибку. Для арифметических выражений справа от знака равенства могут быть использованы знаки плюс, минус, умножение и деле- ние ("+", "-", "*" и "/"). Все вычисления выполняются строго слева направо над 16-разрядными беззнаковыми числами. Пере- полнение игнорируется. Два регистра HS и FS, не реализованные аппаратно, тракту- ются так же, как все остальные 16-тиразрядные регистры. Они могут быть использованы для хранения результата присвоения или преобразования десятичного числа в шестнадцатeричное. 6.22. Команда поиска Формат команды: S {адр., строка} Примеры: S 0:0,12 3EC 'текст в KOИ-8' SI S DS:1103, AX 1234 S Команда поиска используется для нахождения указанной строки в памяти. Начальный адрес может быть задан в виде сегмента и смещения. Оба могут быть заданы любым арифмети- - 25 - ческим выражением. Если значение сегмента не введено, то ис- пользуется текущее значение сегмента кода. 'Строка' может быть любой комбинацией байтов, слов и строк в KOИ-8. Примечание. Строки КОИ-8 заключаются в одиночные кавыч- ки ('). Если строка KOИ-8 не заканчивается одиночной кавыч- кой, все остальные символы в командной строке считаются сим- волами строки в KOИ-8. При выполнении команды курсор становится невидимым и в строке состояния выводится сообщение: 'Searching. Abort with any key' Просматривается все адресное пространство, начиная с ука- занного адреса, до последней адресуемой ячейки пока строка не найдена или операция не прервана пользователем. Когда строка обнаружена, значение HS устанавливается рав- ным значению сегмента, а смещение до начала строки использу- ется для отображения области памяти в окне 2. Если строка не обнаружена, то в строке состояния выводит- ся сообщение об ошибке и курсор устанавливается в командной строке на первый символ указанной строки. Для повторения операции поиска той же строки достаточно ввести команду 'S' без указания параметров. Команда поиска продолжается, начиная с байта перед тем, который был найден в последней операции поиска. Если перед командой 'S' без па- раметров не было указано никакого адреса и строки, то в строке состояния выводится сообщение об ошибке. 6.23. Отображение данных трассировки Формат команды: Т ТВ Эта команда используется для отображения данных трасси- ровки. Данные трассировки могут быть отображены только, если данные были записаны во время выполнения прикладной програм- мы. Каждая команда 'G' сбрасывает указатель буфера трасси- ровки. Если в буфере трассировки нет сохраненных данных, то в строке состояния выводится сообщение об ошибке и курсор устанавливается на команду. Для отображения данных трассировки можно использовать два варианта. Когда используется команда TB, отображается буфер трассировки. Формат буфера трассировки приведен в подразд. 7.2. С помощью команды Т данные трассировки выводятся на ос- новной экран. В командной строке выводится сообщение: 'Trace data display active' и дисассеамблированная область заменяется на записанные инс- трукции. Верхнее поле области дисассемблера выводится в об- ратном фоне. Содержимое всех регистров и 4 верхних элемента стека такое же, каким оно было перед выполнением инструкции. Начальная точка останова помечается как ">BRn" (n - равно номеру точки останова). Точка останова, которая прекращает - 26 - трассировку, помечается с помощью "┬──┤ Условие ├──>───│ , │──┬──>── ^ └─────────┘ └──────┘ │ │ │ └────────────<────────────────┘ Рис. 2 Условия разделяются пробелом, либо запятой. Могут быть использованы два типа условных элементов, как показано на рис. 3. Первый тип - это входная точка останова, а второй - это равенство или отношение. Допустимые условия ┌───────────────────────┐ ┌──┤ Входная точка останова├────┐ │ └───────────────────────┘ │ ───>─┤ ├──>─ │ ┌───────────────────────┐ │ └──┤ Равенство/Отношение ├────┘ └───────────────────────┘ Рис. 3 Входная точка останова указывается в следующем формате: BRn, где Oi (i - номер определяемой точки останова) В данном случае n - номер входной точки останова. Если указана входная точка останова, условие BRn становится исти- ной только тогда, когда счетчик проходов равен заданному для этой точки останова счетчику. Точка останова n должна быть активной, иначе BRn никогда не станет истиной. Второй тип условия состоит из двух операторов, связанных знаком отношения. Синтаксис условия этого типа показан на рис. 4. Равенство/Отношение ┌───┐ ┌───────────┐ │ > │ ┌───────────┐ ───>──┤ Операнд 1 ├──>─┤ = ├──>─│ Операнд 2 ├──> └───────────┘ │ < │ └───────────┘ └───┘ Рис. 4 Условие становится истиной, когда равенство или отношение истина. На рис. 5 показан синтаксис определения первого операнда. - 34 - Операнд 1 ┌─────────┐ ┌───────────────────────────┤ Регистр ├───────────┐ │ └─────────┘ │ │ ┌─────>─────────┐ │ │ │ ┌───────────┐ │ ┌─────────┐ │ │ ├─┤ Сегмент : ├─┴─>┤ Регистр ├─┐ │ │ │ └───────────┘ └─────────┘ │ │ │ │ │ │ │ ┌───┐ │ ┌───────┐ │ ┌───┐ │ ─>─┴─┤ [ ├─>┴──────────>─┤ Адрес ├─────────┴─>─┤ ] ├─┴──> └───┘ └───────┘ └───┘ Рис. 5 Если первый операнд это имя регистра, то используется значение указанного регистра. Если операнд начинается с ква- дратной скобки '[', то текущее значение ячейки памяти может адресоваться прямо или косвенно. При косвенной адресации указывется какой-либо из 16-ти разрядных регистров, перед которым может быть указан регистр сегмента. Если регистр сегмента не указан, то по умолчанию используется DS. Если указан, 'сегмент' должен быть именем регистра сегмента и не может быть абсолютным значением сегмента. Для прямой адресации памяти используется обычная форма записи адреса - 'сегмент:смещение'. Если спецификация сег- мента пропущена, то по умолчанию используется DS. Для второго операнда, синтаксис которого показан на рис. 6, нужно рассмотреть некоторые дополнительные варианты. Ко второму операнду можно добавлять маску или смещение до зна- чения, на которое выполняется ссылка. Операнд 2 ┌───────┐ ┌──────────────────────┤Регистр├────────┐ │ ┌─────────────┐ └───────┘ │ ┌─────────┐ │ │ ┌─────────┐ │ ┌───────┐ │+ │ │ │ ├─┤Сегмент :├─┴─│Регистр├─┐ ├─>┤ Смещение├┐ │ ^ └─────────┘ └───────┘ │ │- │ ││ │ │ │ │ └─────────┘│ │ ┌─┐ │ ┌─────┐ │ ┌─┐ │ ┌───────┐ │ ─>┼─┤[├─>┴──────────────>┤Адрес├───┴─>┤]├─┼─>┤& Маска├──┼─> │ └─┘ └─────┘ └─┘ │ └───────┘ │ │ └────────────>┤ │ ┌──────────┐ ^ └───────────────────>┤ Значение ├─────────────────────┘ └──────────┘ Рис. 6 Кроме содержимого регистра или ячейки пaмяти, в качестве второго операнда, можно указывать непосредственное значение. - 35 - Значение - это шестнадцатеричное число из 4-х цифр. Внутри шестнадцатеричного числа вместо цифры может стоять 'X' для указания того, что значение этой цифры не играет роли. Такая замена может быть только для непосредственных значений. Зна- чение может быть задано как десятичное, если перед ним ука- зан символ '%'. Например:12X5 А2XX %1234 Если непосредственное значение не используется, то второй операнд может быть задан вместе со смещением или с маской. Для непосредственного значения в этом способе нет необходи- мости, так как и смещение, и маска могут быть включены в са- мо непосредственное значение. Синтаксис указания адреса и непосредственного значения показан на рис. 7 и 8 соответственно. Когда для оперaнда задана маска, над каждым из двух опе- рандов выполняется операция логического "И" (AND) с указан- ной маской перед тем, как выполняется проверка на равенст- во/отношение. Это позволяет использовать для сравнения толь- ко отдельные разряды. В случае, если дано смещение (со знаком "+" или "-"), то оно прибавляется ко второму операнду перед проверкой равенс- тва/отношения. Маска и смещение определяются как четырехзначные шестнад- цатеричные значения, где задаются все четыре цифры. В специ- фикации адреса должен быть использован регистр сегмента. По умолчанию - это DS. Адрес ┌───────────┐ ┌───┐ ┌──────────┐ ───>─┬─┤ Регистр ├──┤ : ├─┬─┤ Смещение ├───> │ │ сегмента │ └───┘ ^ └──────────┘ │ └───────────┘ │ └──────────────────────┘ по умолчанию DS: Рис. 7 Значение ┌───────────────<─────────────────────┐ │ ┌─────────────────────────┐ │ ───>─┼──────│ Шестнадцатеричная цифра ├──>─┼──> │ └─────────────────────────┘ │ │ ┌───┐ ^ └────┤ X ├──────>─────────────────────┘ └───┘ не играет роли Рис. 8 - 36 - 7.1.2.3. Поле счетчика Поле счетчика определяет, сколько раз должна быть прой- дена точка останова с истинным условием перед тем, как будет выполнено действие. Счетчик задается в десятичном виде. Мак- симальное значение - 65535. В этом поле можно вводить только цифры. Нулевой счетчик запрещает использование связанной с ним точки останова, даже если действие указано. Чтобы точка ос- танова была активной, необходимо, чтобы и поле счетчика, и поле действия одновременно содержали допустимую информацию. После определенияи выхода из этого поля значение выравни- вается по правому краю поля. Если поле очищается нажатием клавиши Esc, счетчик устанавливается равным нулю. 7.1.2.4. Поле действия Вполе действия пользователь определяет действие, которое выполняется, если счетчик прохождений через данную точку ос- танова становится равным значению счетчика. В поле действия может быть указано до четырех различных действий, если длина поля достаточна для их определения. Каждое действие может быть задано своим полным названием или любым его сокращением. При вводе сокращения оно должно быть отделено от параметра или от следующего действия хотя бы одним пробелом или запятой. Действия могут быть заданы в следующем виде: Count Trace ON {NI} Trace OFF Rst n,m.... Stop Действие COUNT используется для того, чтобы сделать точку останова активной, и не выполняет ничего, кроме подсчета ко- личества прохождений точки останова перед тем, как она деак- тивируется при достижении равенства значений поля счетчика и счетчика прохождения. Это действие обычно используется вмес- те с условиями для входных точек останова в поле другой точ- ки останова. Действие COUNT можно считать фиктивным, так как увеличе- ние счетчика выполняется неявно для всех других действий. Действие TRACE включает (ON) и выключает (OFF) трассиров- ку для данной точки останова. Если указан параметр NI для действия TRACE ON, то информация о выполнении процедуры, вы- зываемой прикладной программой с помощью команды прерывания INT, не записывается в буфер трассировки. Это бывает необхо- димо, когда программа делает много обращений к ДОС или BIOS. Однако, если TRACE ON указана без параметра NI, то воз- можно, что в буфер трассировки не записывается команда IRET. Конец процедуры прерывания легко определить, так как после возврата счетчик команд (IP) меняет свое значение. ДействиеRst используется для перезапуска точек останова. - 37 - Список перезапускаемых точек останова определяется с помощью параметров n, m... Независимо от значения счетчика прохожде- ний через точку останова, счетчик прохождений сбрасывается в ноль и точка становится активной, если она активной не была. Это действие позволяет выполнять очень сложные проверки оши- бок и операции трассировки. Например, точка останова с действием TRACE ON может пере- запускаться каждый раз, когда выполнена процедура восстанов- ления прикладной программы после ошибки. Выполнение будет остановлено только, если восстановление после ошибки невоз- можно. В этом случае структурная схема программы может быть проверена по выведенной информации о трассировке. Действие Stop выполняет останов прикладной программы по указанному адресу и передает управления обратно в AFD. 7.2. Входные и выходные данные Входными данными для программы отладчика является загру- зочный программный модуль в формате EXE или COM. А также вспомогательные файлы макрокоманд и определения точек оста- нова, которые могут быть подготовлены с помощью самого AFD. Подробно команды создания этих вспомогательных файлов описа- ны в разд. 6. Выходнымиданными программы могут быть данные о структуре отлаживаемой программы, информация об обнаруженных ошибках, распечатка дисассемблированного кода, расположенного по ука- занному адресу памяти, и данных, содержащихся в указанных областях памяти, а также листинг трассировки выполнения от- дельных участков программы. Первая колонка такого листинга показывает смещение запи- санных инструкций от начала сегмента кода. Следующая колонка показывает дисассемблируемую инструкцию по этому адресу. Ос- таток строки используется для отображения содержимого ре- гистров и верхних элементов стека. Все значения выводятся такими, какими они были перед выполнением инструкции. Для каждой инструкции используется 4 строки. На рис. 9 показан пример отображения трассировки с по- мощью команды ТВ. - 38 - Формат отображения трассировки командой ТВ ОТОБРАЖЕНИЕ БУФЕРА ТРАССИРОВКИ Смещение буфера: 0  *** Begin of TRACE buffer *** 1686 RET AX=0006 SI=FFE2 CS=022B ZF0 OF0 Stack +0 3974 BX=000B DI=0023 DS=7000 AF0 DF0 +2 000C CX=000C BP=0000 ES=1ED8 PF1 IF1 +4 58C3 DX=0000 SP=0878 SS=022B CF1 SF1 +6 0ECA 3974 POP CX AX=0006 SI=FFE2 CS=022B ZF0 OF0 Stack +0 000C BX=000B DI=0023 DS=7000 AF0 DF0 +2 58C3 CX=000C BP=0000 ES=1ED8 PF1 IF1 +4 0ECA DX=0000 SP=087A SS=022B CF1 SF1 +6 04ED 3975 LOOP 396D AX=0006 SI=FFE2 CS=022B ZF0 OF0 Stack +0 58C3 BX=000B DI=0023 DS=7000 AF0 DF0 +2 0ECA CX=000C BP=0000 ES=1ED8 PF1 IF1 +4 04ED DX=0000 SP=087C SS=022B CF1 SF1 +6 0ECA 396D MOV BX,CX AX=0006 SI=FFE2 CS=022B ZF0 OF0 Stack +0 58C3 BX=000B DI=0023 DS=7000 AF0 DF0 +2 0ECA CX=000B BP=0000 ES=1ED8 PF1 IF1 +4 04ED DX=0000 SP=087C SS=022B CF1 SF1 +6 0ECA 396F PUSH CX AX=0006 SI=FFE2 CS=022B ZF0 OF0 Stack +0 58C3 BX=000B DI=0023 DS=7000 AF0 DF0 +2 0ECA * CX=000B BP=0000 ES=1ED8 PF1 IF1 +4 04ED DX=0000 SP=087C SS=022B CF1 SF1 +6 0ECA ░░ Для сдвига данных вверх и вниз исп.стрелки ░░░░ ░░ F1 или '<─┘' - возврат ░░  Рис. 9 Начало буфера трассировки помечается словом "Top" около соответствующей инструкции. "End" указывает последнюю запи- санную инструкцию. Точки останова, которые запускают и пре- кращают трассировку, также указываются с соответствующими инструкциями. Если первая инструкция в буфере не помечена точкой останова, которая запустила трассировку, это значит, что произошло циклическое использование буфера трассировки и в буфере остались только последние оттрассированные инструк- ции. 7.3. Описание способа работы с программой Наиболее часто используемые функции могут быть вызваны нажатием функциональных клавиш. Это упрощает их использова- ние, так как для выполнения операции достаточно нажатия единственной клавиши. В данном подразделе описываются функ- ции всех функциональных клавиш, используемых при работе с основным экраном AFD. Меню для определения точек останова также описывается в данном подразделе, так как доступ к это- му меню выполняется с помощью функциональной клавиши F5. - 39 - Для того, чтобы показать, какие функции доступны в теку- щем состоянии, назначение каждой функциональной клавиши все- гда указано в последней строке экрана. Соответствие клавиш командам выбрано так, чтобы клавиши наиболее часто использу- емых функций можно было нажимать, не глядя на клавиатуру. Поэтому F1, наиболее часто используемая клавиша, предназна- чена для функции пошагового выполнения программы. Ниже пере- числены функциональные клавиши и функции, которые они вызы- вают при работе с основным экраном: F1 - один шаг программы; F2 - шаг, выполняющий процедуру; F3 - извлечение последней команды из стека команд; F4 - вывод экрана справочной информации; F5 - вход в меню определения точек останова; F6 - переключение на альтернативный экран и обратно; F7 - курсор на поле вверх; F8 - курсор на поле вниз; F9 - курсор на поле влево; F10 - курсор на поле вправо. Все функциональные клавиши поддерживаются как клавиши с возможностью автоповтора ввода. Это означает, что когда кла- виша нажата и не отпускается, вызываемая функция будет пов- торяться в темпе приблизительно 10 раз в секунду. 7.3.1. Выполнение одного шага программы (F1) При нажатии F1, независимо от текущего значения указателя инструкции (IP), выполняется инструкция, показанная в дисас- семблируемой области в обратном фоне. Все точки останова, определенные пользователем, игнорируются для того, чтобы разрешить неограниченное пошаговое выполнение программ обра- ботки прерываний ДОС и BIOS. После выполнения одиночного шага все регистры, включая указатель инструкции, корректируются и в строке с обратным фоном выводится следующая инструкция. Строка предыдущей ко- манды показывает инструкцию, выполненную перед этим. Eсли выбранный режим поддержки экрана (команда MODE опи- сана в подразд. 6.14) использует альтернативный экран или микро-ЭВМ поддерживает два монитора, то режим экрана, используемый отлаживаемой программой, восстанавливается пе- ред выполнением каждого шага. Если и отлаживаемая программа, и AFD используют один и тот же экран, то никаких действий для восстановления режима или содержимого экрана не предпри- нимается. Выполнение одиночного шага корректирует регистр сегмента кода и указатель текущей инструкции. Это очень удобно в слу- чае, когда нужно пропустить одну или несколько инструкций. Перед тем, как нажать F1, инструкция, которую нужно выпол- нить, передвигается в поле текущей инструкции с помощью кла- виш 'курсор вверх' или 'курсор вниз.' - 40 - Удерживая F1 в нажатом состоянии, одиночные шаги можно повторять в темпе автоповтора клавиатуры. Примечание. Для сохранения адреса возврата в отлаживае- мую программу AFD использует три слова в стеке пользователя. Поэтому в момент запуска стек отлаживаемой программы должен быть допустимым. Инструкции, которые изменяют сегмент или указатель стека, не должны выполняться в пошаговом режиме. Они должны выполняться с помощью установки непосредственной точки останова после последней инструкции, изменяющей ре- гистр стека. 7.3.2. Шаг выполнения процедуры (F2) Шаг выполнения процедуры используется для выполнения це- лой подпрограммы как одиночного шага. Эта функция может быть выполнена для любой инструкции и наиболее полезна при выпол- нении инструкций CALL, INT и LOOP. Функция работает так же, как и функция выполнения одиноч- ного шага, за исключением того, что так как AFD устанавлива- ет программные точки останова, ее нельзя использовать,когда выполняемый код не находится в оперативной памяти. В этом случае должен использоваться пошаговый режим. При попытке использовать F2 в области кода, который не находится в оперативной памяти, выводится сообщение: 'Code must be in RAM' Всегда при нажатии F2 выводится сообщение: '*** E X E C U T I N G ***' Если время выполнения подпрограммы очень мало, это сооб- щение немедленно исчезает. Выполнение процедуры отлаживаемой программы может быть завершено пользователем с помощью нажа- тия Ctrl/Esc или клавиши NMI. 7.3.3. Извлечение последней команды (F3) Эта функциональная клавиша позволяет извлечь в командную строку последнюю введенную команду из стека хранения команд, имеющего размер, достаточный для хранения шести последних команд. После нажатия F3 команда извлекается из стека, а на- жатие Enter вызывает выполнение этой команды. Затем команда снова сохраняется в стеке хранения команд. 7.3.4. Вывод справочной информации (F4) Эта функция обеспечивает возможность получения справочной информации непосредственно на экране, когда выполняется ввод команды и использование документации невозможно. Пользователю доступны четыре экрана со справочной инфор- мацией, объясняющей синтаксис и действие команд, которые можно задавать в командной строке. Вид этих экранов приведен на рис. 10 - 13 соответственно. Символы, введенные в командной строке основного экрана, - 41 - не стираются при нажатии F4 и при возврате к основному экра- ну курсор устанавливается на то же место в строке, где он располагался перед вызовом справочной информации. Команды на экране справочной информации расположены не в алфавитном порядке, а по мере их важности. Вторая часть чет- вертого экрана объясняет общие для различных команд правила задания параметров. Переход от одного справочного экрана к другому выполняет- ся нажатием клавиши пробела или цифры (1-4), определяющей номер экрана. Для возврата к основному экрану нужно нажать клавишу Enter или F4. Нажатие других клавиш недопустимо и вызывает звуковой сигнал. Первый экран справочной информации КОМАНДЫ AFD М Е Н Ю 1 L фспец {парам.}{,адр.} Загрузка файла в память. Задав 'адр.' можно определить место загрузки. По умолчанию CS:0100. После выполнения функции в BX,CX указано число загруженных байтов. W фспец,адр.,длина Запись данных в файл. Сегмент 'адр.' по умолчанию DS. 'длина' указывает число байтов - четыре 16-ные цифры. {R} рег=знач. Установка регистра. FL=знач. устанавливает регистр флаго как 16-ти битовый регистр. Дос- туп к отдельным битам по их именам : OF,DF,IF,SF,ZF,AF,PF,CF. D адр. Вывод кода на экран. Начальный адрес дисассемблируе- мой области равен 'адр'. По умолчанию 'Сегмент'- CS. CS:n определяет CS последней выполненой команды. M n адр. Вывод окна памяти (n=1 или n=2). По умолчанию 'Сегмент' [рег] тот же, что в окне. Для вывода фиксирован- ного окна можно использовать FS. Для косвенной адресации можно указать содержимое регистра (например, [SI]). G {старт.адр}{,адр.BRK} Запуск программы с текущей ячейки или со 'старт.адр'. Может быть определена дополнительная точка останова. По умолчанию 'сегмент' для BR - текущее значение CS. Запущенную программу можно прервать по Ctrl/Esc. QUIT {R{ESIDENT}} Конец и возврат в ДОС. Вариант 'R' делает AFD резидентным. В этом случае AFD можно вызвать по Ctrl/Esc. Пробел - следующая страница или номер страницы 1 ... 4 F4 или <─┘ продолжение определения BR Рис. 10 - 42 - Второй экран справочной информации КОМАНДЫ AFD М Е Н Ю 2 A {адр.} Режим ассемблирования. Если адрес не указан выбира- ется текущая команда. Ввод Enter - ассемблирование команды. Для перемещения по коду вверх и вниз можно использовать клавиши управления курсором. P адр.,строка Замена в памяти. По умолчанию сегмент - CS. F адр.,повор,строка Заполнение памяти указанной строкой. По умолчанию сегмент адреса - DS. 'Повтор' определяет сколько раз строку нужно поместить в память. S {{адр.},строка} Поиск данных в памяти. Если 'адр.' не ука- зан, поиск начинается с CS:0. Сегмент по умолчанию - CS. Когда данные найдены, M2 отображает эту область используя HS. Команда S без параметров запускает повтореный поиск. C адр.,адр.,длина Сравнение двух областей памяти. При несов- падении М1 отображает область, заданную первым параметром, М2 - область, заданную вторым (Сегмент по умолчанию - DS:) CO ис.адр,пр.адр,длина Копирование данных из области, задан- ний 1-м параметром в область 2-го (Сегмент по умолчанию - DS:) I адр. Ввод и отображение данных из порта В/В. 'Адр.'- 8 или 16 битовый адр. или содержимое регистра. O адр.,знач. Вывод значения в порт В/В. Если 'знач.' слово, то выполняется словная операция Пробел - следующая страница или номер страницы 1 ... 4 F4 или <─┘ продолжение определения BR Рис. 11 Третий экран справочной информации КОМАНДЫ AFD М Е Н Ю 3 T{B} Вывод на экран буфера трассировки. При пропуске 'B' вы- вод идет на основной экран. В противном случае выбирается отдельный формат вывода. BW фспец Запись точек останова в файл. BL фспец Загрузка точек останова из файла. PH адр.,длина{,фспец} Печать данных в КОИ-8 и 16-м виде. По умолчанию: вывод на принтер, сегмент- DS. 'Длина' определя- - 43 - ет число байт. PD адр.,длина{,фспец} Печать дисассемблированного кода. По умолчанию сегмент - CS. 'Длина' - число команд. PT {старт,длина{,фспец}} Печать содержимого буфера трасси- ровки. 'Старт' - смещение до 1-ой распечатываемой команды. Количество выводимых команд определяется по 'длине' или по числу действительно записанных команд. По умолчанию - все. 286 ON Включение/выключение режима для процессора 286. OFF Первоначально установлен режим для процессора типа 86. MO{DE} Установка режима экрана. M{ONO} 'М' - монохромный адаптор, C{OLOR} 'C' - цветной; A{LTERN} ON 'A ON' OFF - включение возможности использования при выполнении дополнительный экран. F6 пе- реключает основной и дополнительный экраны. Без параметров показывает текущие характерис- тики прикладного экрана. BE{EP} ON Вкл/Выкл звуков. сигнала OFF Пробел - следующая страница или номер страницы 1 ... 4 F4 или <─┘ продолжение определения BR Рис. 12 Четвертый экран справочной информации КОМАНДЫ AFD М Е Н Ю 4 XT Запуск режима обучения. Все введенные коды сохраняются в буфере и могут быть выведены в файл или выполнены. Конец режима - заполнение буфера или по Ctrl/Break. XX {фспец} Выполнение сохраненных кодов. Если указана 'фспец', то данные читаются из файла и затем выполняются. XW фспец Запись сохраненных кодов в файл. XL фспец Загрузка данных файла в буфер клавиатуры. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - фспец Спецификация файла в ДОС. Для команды 'L' расширение по умолчанию - '.EXE' адр. Задается как {сег:}смещен. Если 'сег' не указан, ис- пользуются умолчания. 'Смещен' м.б. любым значением. На- пример, DS:SI+BX-123 или * (*=адрес следующей команды) рег Любой 8 или 16 битовый регистр с основного экрана. На- пример, AX или BL или SI ... - 44 - знач. Содержимое регистра или 16-ные байт или слово. '*' за- меняется содержимым IP. Десятичные значения с % (%123) Арифметические выражения допустимы (например,AX+BX*3/2) и вычисляются строго слева направо! строка Список значений или строк КОИ-8 (в кавычках), разде- ленных пробелами или запятыми,напр,1234 BX,'ASCII' FF. Пробел - следующая страница или номер страницы 1 ... 4 F4 или <─┘ продолжение определения BR Рис. 13 7.3.5 Вход в меню определения точек останова (F5) При нажатии F5 на экране отображается меню определения точек останова. Вид этого меню показан на рис. 14. С его по- мощью пользователь может задать достаточно сложные определе- ния точек останова. Правила задания отдельных полей даны в п.п. 7.1.2.1 - 7.1.2.4. Меню определения точек останова  B R E A K P O I N T E N T R Y M E N U BR# Break ADR Condition Count Occur Action 1 37D6:0200 ................................ 1 0 TRACE ON NI 2 37D6:023E ................................ 1 0 TRACE OFF 3 37D6:0244 SI>100.......................... 10 0 T ON 4 37D6:0245 SI=600 BR3...................... 1 0 T OFF 5 37D6:0245 SI=1000......................... 1 0 RST 2345 6 37D6:0247 ................................ 2 0 STOP 7 37D6:0000 ................................ 0 0 8 CS:0 ................................ 0 0 ╔══════════════════════════════════════════════════════════════════════════════╗ ╟ Disassembler window address > ║ ╟──────────────────────────────────────────────────────────────────────────────╢ ║ 37D6:0198 2E882606 MOV CS:[0106],AH ║ ║ 019D EBE8 JMP 0187 ║ ║ 019F 0AC0 OR AL,AL ║ ║ 01A1 CB RET Far ║ ║ 01A2 803ECA0302 CMP [03CA],02 ║ ║ 01A7 750B JNZ 01B4 ║ ║ 01A9 803ECB031B CMP [03CB],1B ║ ║ 01AE 7504 JNZ 01B4 ║ ║ 01B0 381ECC03 CMP [03CC],BL ║ ╚══════════════════════════════════════════════════════════════════════════════╝ 1View Trace 3Read Setup 4 Help 5Main Menu 7Save Setup 8Disas.Window 9Clear  Рис. 14 - 45 - Верхняя половина экрана содержит поля для определения то- чек останова, а нижняя показывает дисассемблированный код, начиная с текущей команды. Для восьми точек останова можно определить их адрес, условие, значение счетчика прохождений и выполняемое действие. Как и на основном экране, все поля, выведенные с повышенной яркостью, могут быть заполнены или изменены. На цветном мониторе введенные символы отображаются желтым цветом до тех пор, пока они не будут проверены и при- няты отладчиком. В последней строке экрана показано, какие функциональные клавиши поддерживаются и указаны назначенные им функции. 7.3.5.1. Ввод точек oстанова и редактирование При первоначальном входе в меню определения точек остано- ва курсор указывает на первый символ (отличный от пробела) в поле адреса первой точки останова. Каждый раз при перемеще- нии курсора на следующее или предыдущее поле, курсор будет указывать на первый непустой символ нового поля. Введенные символы преобразуются в символы верхнего регистра. В этом режиме можно использовать все клавиши редактирова- ния и управления курсором, кроме PgUp и PgDn. Курсор можно свободно передвигать между полями определения точек остано- ва. Когда курсор достигает конца строки, он пeрeходит на на- чало следующей. Если эта строка последняя, то - на начало первой. Переход от одного поля к другому может быть выполнен с помощью нажатия клавиш Enter или Tab. С помощью Tab возможен переход на следущее поле, а с помощью Shift/Tab - на преды- дущее. Для стирания всего поля нужно нажать клавишу Esc. Каждое поле (условия, действия и др.) обрабатывается отдельно. Для стирания символа в текущей позиции курсора нажмите клавишу Del. Все символы справа от курсора сдвигаются влево каждый раз при нажатии клавиши Del. Для того, чтобы удалить только что введенный символ или символ слева от курсора, ис- пользуйте клавишу BackSpace. Клавиша Ins используется для переключения между режимами вставки и замены. В режиме вставки курсор имеет вид яркого прямоугольника размером в половину знакоместа. При вводе символов в режиме вставки все символы справа от курсора сдвигаются вправо. Последний символ строки при сдвиге вправо теряется. Для перемещения курсора на позицию после последнего сим- вола в строке используется клавиша End. Если поле полностью заполнено, курсор будет указывать на последний символ поля. Нажатие клавиши Home устанавливает курсор на первую позицию текущего поля. При одновременном нажатии Ctrl и Home курсор перемещается на поле адреса первой точки останова. Клавиши PgUp и PgDn используются для перемещения вверх и вниз окна дисассемблированного кода в нижней половине экра- на. - 46 - При работе с меню определения точек входа поддерживаются следующие функциональные клавиши: Enter - переход на следующее поле; Home - курсор в начало поля; End - курсор после последнего непустого символа поля; Ins - переключение режима ввода; Del - удаление символа над курсором; Esc - очистка текущего поля; BackSpace - удаление символа слева от курсора; Ctrl/F6 - стирание до конца поля; Ctrl/Home - курсор в поле адреса BR1; Курсор вправо - на место следующего символа или на следующее поле, если символ последний; Курсор влево - на место предыдущего символа или на предыдущее поле, если символ первый; Курсор вверх - вверх на строку или переход на последнюю, если строка первая; Курсор вниз - вниз на строку или переход на верхнюю строку в поле адреса; Tab - следующее поле; Shift/Tab - предыдущее поле; PgUp - сдвиг дисассемблируемой области вверх на 8 строк; PgDn - сдвиг дисассемблируемой области вниз на 8 строк; F1 - вывод записей трассировки F3 - чтение с диска файла AFD.SET; F4 - вывод справочной информации; F5 - возврат к основному экрану; F7 - сохранение текущих определений точек останова в файле на диске; F8 - курсор в окно дисассемблера; F9 - сброс всех определений точек останова; PrtSc - печать текущего дисассемблируемого экрана. Данные проверяются и интерпретируются в момент выхода из заполненного поля (после нажатия Enter, какой-либо клавиши перемещения курсора либо клавиш F1, F5 или F7. При ошибке курсор устанавливается на первый неверный символ и выводится сообщение об ошибке. Покинуть поле, в определении которого обнаружена ошибка, нельзя. Если нужно выйти из этого поля, следует либо испра- вить ошибку, либо очистить поле, нажав Esc перед тем, как курсор будет сдвинут на другое поле экрана. Текущее назначение команд функциональным клавишам всегда - 47 - указано в последней строке экрана. При работе в меню опреде- ления точек останова функции назначены клавишам F1, F3, F4, F5, F7 и F9. При нажатии других функциональных клавиш выво- дится сообщение об ошибке. 7.3.5.2. Просмотр записей трассировки (F1) Нажатие клавиши F1 вызывает отображение содержимого буфе- ра трассировки. Если записей нет, выводится сообщение об ошибке. Формат информации в буфере трассировки подробно опи- сан в подразд. 7.2. 7.3.5.3. Чтение определений точек останова из файла (F3) С помощью функциональной клавиши F3 можно восстановить предварительно сохраненные определения точек останова. AFD пытается прочитать файл AFD.SET из текущего каталога. Это позволяет в каждом каталоге иметь свои определения точек ос- танова, используемые по умолчанию. Вслучае неудачи чтения выводится сообщение о том, что файл не найден. Другой файл определения точек останова можно загрузить с помощью команды BL, допускающей указание имени файла из те- кущего каталога. 7.3.5.4. Вывод справочной информации (F4) Справочная информация об определении точек останова пере- крывает нижнюю половину экрана. Выход из текущего определя- емого поля не происходит и следовательно оно не обязательно должно быть определено без ошибок. Для продолжения определения точек останова после вывода справочной информации достаточно нажать любую клавишу. На рис. 15 приведен вид экрана справочной информации этого типа. Справочная информация для определения точек останова  B R E A K P O I N T E N T R Y M E N U BR# Break ADR Condition Count Occur Action 1 37D6:0200 ................................ 1 0 TRACE ON NI 2 37D6:023E ................................ 1 0 TRACE OFF 3 37D6:0244 SI>100.......................... 10 0 T ON 4 37D6:0245 SI=600 BR3...................... 1 0 T OFF 5 37D6:0245 SI=1000......................... 1 0 RST 2345 6 37D6:0247 ................................ 2 0 STOP 7 37D6:0000 ................................ 0 0 8 CS:0 ................................ 0 0  Break ADR Адрес точки останова. Должен быть установлен на начало команды. {Сегмент:}Смещение. Сегмент - регистр сег- мента или значение. Если пропуск - проверка условия в каж- - 48 - дой точке останова. Condition Условия для проверки в точках останова. Объединя- ются логическим И(&). РЕГ=знач., [РЕГ]=знач., СМЕЩЕН=знач., BRn. Перед 'адр.'можно указать регистр сегмента. BRn = ис- тина, в случае равенства OCCUR=COUNT. Значение - число до 4х 16-х цифр, 'x' - символ маскирования. Count Десятичное число проходов перед выполнением действия. '0' запрещает BR Occur Десятичное число проходов, сделанных после команды 'G'. Action Действие, выполняемое, если условие - истина. T{RACE} ON {NI} или OFF - трассировка программы. NI запрещает трассировку процедур INT. C{OUNT}, S{TOP}, R{ST}n,m...'RST' сбрасывает OCCUR для точки BRn в 0 Press any key to resume breakpoint editing Рис. 15 7.3.5.5. Возврат к основному экрану (F5) Определение точек останова может быть закончено нажатием функциональной клавиши F5 и возврата к основному экрану. Все введенные поля не должны содержать ошибок. Если введенное поле содержит ошибку, то функция клавиши F5 не будет отраба- тываться до тех пор, пока не будет исправлена ошибка или по- ле не будет очищено нажатием Esc. Текущее положение курсора в последнем введенном поле меню сохраняется, что позволяет быстрое переключение с одного эк- рана на другой. 7.3.5.6. Сохранение в файле определений точек останова (F7) При нажатии F7 отображаемые в данный момент определения точек останова записываются в файл AFD.SET в текущем катало- ге. При выполнении дисковых операций курсор исчезает и выво- дится информационное сообщение. Для выполнения этой функции необходима правильность опре- деления всех точек останова. Если в текущем вводимом поле имеется ошибка, она должна быть исправлена или поле должно быть очищено перед сохранением определений в файле. 7.3.5.7. Установка курсора на окно дисассемблера (F8) Нажатие клавиши F8 перемещает курсор на окно дисассембле- ра. Он устанавливается на поле адреса первой дисассемблиро- ванной команды. Для определения нового положения окна может быть указан любой адрес. Для перехода со строки на строку можно использовать кла- виши 'курсор вверх' и 'курсор вниз'. Клавиши PgUp и PgDn ра- - 49 - ботают так же, как в основном меню определения точек остано- ва. 7.3.5.8. Сброс всех точек останова (F9) Все определения точек останова сбрасываются при нажатии клавиши F9. Это наиболее быстрый способ запретить использо- вание всех точек останова. 7.3.6. Переключение экрана (F6) После разрешения использования дополнительного экрана для отлаживаемой программы (команда MO A ON) с помощью клавиши F6 можно выполнять переключение между основным экраном AFD и альтернативным экраном. Если клавиша F6 нажата, а использо- вание дополнительного экрана не разрешено командой MODE, то выводится сообщение об ошибке: 'Unsupported function key' Признаком разрешения использования этой клавиши служит подсказка 'TogSc', указывающая назначение клавиши F6 в пос- ледней строке экрана. При переключении с помощью клавиши F6 на дополнительный экран выводятся все данные этого экрана. Курсор помещается туда, где он был установлен отлаживаемой программой. Если AFD использовал точки останова в режиме трассировки, то ин- формация, которая выводилась во время выполнения трассиров- ки, добавляется к данным альтернативного экрана. Последняя строка дополнительного экрана не используется или перекрывается справочной информацией AFD для того, чтобы избежать смешения информации, выводимой AFD, с выводом дан- ных на дополнительный экран. Для возврата к основному экрану AFD достаточно нажать лю- бую клавишу. 7.3.7. Перемещение курсора на одно поле вверх (F7) Курсор может быть перемещен на область вверх по экрану нажатием клавиши F7. Из командной строки с помощью F7 курсор может быть перемещен на область регистров. После перехода из командной строки и последующего возврата положение курсора в командной строке сохраняется. Введенные символы в командной строке остаются без изменений. В области регистров курсор устанавливается на том же мес- те, где он находился в момент выхода из этой области. Перво- начально - это верхнее левое поле регистра AX. Когда курсор находится в области регистров, нажатие клавиши F7 передвига- ет курсор в адресное поле окна 2. Когда курсор находится в шестнадцатеричной области окна 2, нажатие F7 перемещает кур- сор обратно на командную строку. Если он находится в области данных в коде KOИ-8 (правая нижняя часть экрана), нажатие клавиши F7 перемещает курсор на предыдущее поле - окно 1. Из окна 1 нажатие F7 перемещает курсор в область регист- ров. - 50 - 7.3.8. Перемещение курсора на одно поле вниз (F8) При нажатии клавиши F8 курсор перемещается на одно поле вниз относительно текущего. Если курсор находится в команд- ной строке, он перемещается на адресное поле окна 2. Если текущее положение курсора - нижнее поле, то F8 помещает кур- сор на область регистров. Это означает, что перемещение кур- сора выполняется циклически - с нижнего поля экрана на верх- нее и т.д. Если курсор находится в шестнадцатеричной области окна 2, нажатие F8 помещает курсор на область данных в коде KOИ-8 окна 2. 7.3.9. Перемещение курсора на одно поле влево (F9) Эта функциональная клавиша перемещает курсор на окно, расположенное слева от того, где в данный момент находится курсор. Также реализовано циклическое перемещение курсора, что позволяет перемещать курсор с крайнего левого поля на правое нажатием клавиши F9. 7.3.10. Перемещение курсора на одно поле вправо (F10) Эта клавиша выполняет те же функции, что и F9, только в обратном направлении. Когда курсор находится в области ре- гистров, клавиша F10 может быть использована для перехода к полю флагов. 7.3.11. Перемещение курсора и редактирование данных основного экрана Курсор может быть перемещен с одной области экрана на другую нажатием клавиш F7-F10. Все символы с повышенной яр- костью (или ярко зеленого цвета) могут быть изменены, если курсор указывает на них. При переходе в режим ассемблирова- ния единственной строкой с повышенной яркостью, которую мож- но изменять, является дисассемблированная строка, выводимая на обратном фоне. 7.3.11.1. Область регистров Когда курсор перемещается на область регистров, содержа- ние регистров может быть изменено заменой отображаемого зна- чения. Курсор сдвигается на одну позицию вправо после ввода каждого символа или с помощью клавиши 'курсор вправо'. В случае изменения содержимого регистров допустимы только шестнадцатеричные цифры, а для изменения значения отдельных флаговых разрядов регистра флагов допустимы только цифры 0 или 1. Символы нижнего регистра при вводе преобразуются в символы верхнего регистра. Чтобы покинуть область регистров, можно нажать какую-либо - 51 - из десяти функциональных клавиш (F1-F10) или клавишу Enter для перехода на командную строку. Текущее положение курсора сохраняется и при следующем переходе в область регистров курсор помещается в данное положение. При нажатии клавиши End курсор помещается на последний символ данного поля, при нажатии Home - на первый. Для пере- хода на следующее поле можно использовать клавишу Тab или клавишу 'курсор вправо', если курсор указывает на последний символ поля. В конце каждой строки положение курсора меняет- ся, он циклически переходит на начало следующей строки об- ласти регистров. Перемещение курсора на предыдущее левое по- ле может выполняться с помощью одновременного нажатия клавиши Shift и Tab или с помощью клавиши 'курсор влево', если курсор указывает на первый символ поля. Циклическое пе- ремещение курсора выполняется так же, в случае Тab, только в обратном направлении. Клавиши 'курсор вверх', и 'курсор вниз' могут использоваться для перехода с одной строки на другую в соответствующем направлении. С помощью нажатия Сtrl/Home курсор перемещается на начало первого поля в левом верхнем углу области регистров. Другие функциональные и управляющие клавиши не поддержи- ваются и их нажатие вызывает печать сообщения об ошибке. При работе в области регистров можно использовать следую- щие клавиши: Enter - возврат в командную строку; О-9, А-F - замена содержимого регистров (для фла- говых разрядов только О или 1); Home - на первый символ поля; End - на последний символ поля; Курсор вправо - на следующий символ; Курсор влево - на предыдущий символ; Курсор вверх - на предыдущую строку; Курсор вниз - на следующую строку; Тab - на следующее поле; Shift/Tab - на предыдущее поле; Ctrl/Home - на поле в левом верхнем углу (AX); F1-F10 - выход из области регистров и выполнение соответствующей функции; PrtSc - печать текущего экрана. 7.3.11.2. Окна памяти Когда с помощью одной из функциональных клавиш F7-F10 курсор перемещается на область окна памяти, он позициониру- ется на сегментный регистр адреса. Чтобы выйти из области окна, нужно использовать функциональные клавиши или клавишу Enter. Нажатие Enter перемещает курсор в командную строку. При нажатии функциональной клавиши выполняется соответствую- щая функция, а затем курсор помещается в командную строку. Первый символ в поле адреса окна имеет повышенную яркость и может быть заменен на первый символ любого допустимого ад- - 52 - ресного регистра (C,D,E,S,F,H). Символы нижнего регистра ав- томатически преобразуются в символы верхнего. После замены имени сегментного регистра или нажатия клавиши 'курсор впра- во' курсор перемещается на начало поля смещения, пропуская символы, не имеющие повышенной яркости. Попытка переместить курсор влево с имени сегментного регистра вызывает вывод в строке состояния сообщения об ошибке. Поле смещения может быть изменено на любое шестнадцате- ричное значение. Изменение любой цифры вызывает изменение адресов в последующих строках и корректировку содержимого отображаемого окна памяти. Так как все поля данных в окне повышенной яркости, они могут быть заменены на шестнадцатеричные цифры. Их замена приводит к немедленному изменению содержимого соответствую- щих ячеек памяти. После ввода каждого символа курсор сдвига- ется вправо на следующий символ и строка предыдущей команды в окне дисассемблера очищается, так как это изменение может изменить код программы. В случае, если данная ячейка памяти не может быть изменена, так как она не находится в оператив- ной памяти, выводится сообщение об ошибке. С помощью клавиши Home курсор перемещается в левый верх- ний угол данной области. Правая половина окна 2, область КОИ-8 показывает содержи- мое того же диапазона адресов, что и левая. В этой части все байты памяти могут быть изменены на любой символ. Однако, символы, шестнадцатеричные коды которых не находятся в диа- пазоне 20 - FF, будут отображаться в виде точек. Примечание. Это поле отделено от левой части окна 2 и на него можно перейти только с помощью функциональных клавиш F7-F10. Для перехода к следующему символу в окне могут быть ис- пользованы клавиши 'курсор вправо' и 'курсор влево'. Пробелы при перемещении курсора пропускаются. Для перемещения курсо- ра с поля на поле можно использовать Тab и Shift/Tab. В конце строки при перемещении вправо выполняется циклическое перемещение курсора. В конце правого нижнего поля каждого окна дальнейший сдвиг вправо не выполняется. В случае такой попытки выводится сообщение об ошибке: 'End of input field' С помощью клавиш 'курсор вверх' и 'курсор вниз' курсор перемещается в указанном направлении, если он находится в области, выделенной повышенной яркостью. 7.3.11.3. Сдвиг окна по памяти вверх и вниз Если курсор находится в верхней строке и нажата клавиша 'курсор вверх', то курсор остается в верхней строке, но ад- рес уменьшается на количество байтов в строке и содержимое окна корректируется, чтобы показать новую область. То же са- мое выполняется в противоположном направлении, когда курсор находится в нижней строке или в поле адреса окна, выделенном - 53 - повышенной яркостью, и нажата клавиша 'курсор вниз'. Это позволяет построчно перемещать окно по памяти. Клавиши PgUp и PgDn могут быть использованы для сдвига окна на одну стра- ницу, соответственно вверх или вниз. Длина страницы опреде- ляется числом строк в соответствующем окне. Эти клавиши мо- гут быть использованы всегда, когда курсор находится в одном из окон памяти. Если курсор находится в области окна, можно использовать следующие клавиши: Enter - возврат в командную строку; 0-9, А-F - замена адресов или данных в окне; Home - курсор на начало поля адреса окна; Курсор вправо - на следующий символ; Курсор влево - на предыдущий символ; Курсор вверх - на предыдущую строку или сдвиг окна, если курсор на верхней строке или в поле адреса; Курсор вниз - на следующую строку или сдвиг окна, если курсор на последней строке или в поле адреса; Тab - вперед на следующее поле; Shift/Tab - назад на предыдущее поле; F1-F10 - выход из области окна и запуск соответ- ствующей функции; PrtSc - печать текущего содержимого экрана. 7.3.12. Ввод командной строки и ее редактирование Команды AFD могут вводиться, когда курсор установлен в командной строке. Большинство команд имеют длину 1 или 2 символа. При интерпретации команд ведущие пробелы игнориру- ются. Для ввода команд и параметров можно использовать как прописные, так и строчные буквы. При вводе лишних параметров выводится сообщение об ошиб- ке, указывающее на наличие в строке лишних символов. Эти символы должны быть удалены перед выполнением команды. Они могут быть удалены нажатием клавиш Ctrl/F6, которое удаляет все символы от текущей позиции курсора до конца строки. Когда курсор находится в командной строке, клавиши 'кур- сор вверх' и 'курсор вниз' используются для сдвига дисас- семблируемой области. Клавиши PgUP и PgDn используются для "листания страниц" дисассемблируемой области. При попытке "листания" в обратном направлении (с помощью PgUp или 'кур- сор вверх') в области, которая не может быть верно дисассем- блирована, выдается сообщение об ошибке и сдвиг области не выполняется. 7.3.12.1. Редактирование команд Когда курсор находится в командной строке, он может пере- мещаться для редактирования команды только в горизонтальном - 54 - направлении. При попытке выйти из командной строки в гори- зонтальном направлении выводится сообщение об ошибке: 'End of input field' Клавиши 'курсор вверх' и 'курсор вниз' используются для сдвига дисассемблированной области и не изменяют положения курсора. Команды могут вводиться символами как верхнего, так и нижнего регистра. Для очистки всей командной строки и поме- щения курсора на начало вводимого поля достаточно нажать клавишу Esc. Клавиша Del используется для удаления символа в текущей позиции курсора. С помощью клавиши Backspace удаля- ется символ слева от текущей позиции курсора. Одновременное нажатие Ctrl и F6 удаляет символы от текущего положения кур- сора до конца строки. Для вставки символов AFD должен находиться в режиме вставки. Переключение между режимами вставки и замены выпол- няется нажатием клавиши Ins. Когда AFD находится в режиме вставки, курсор имеет вид половины закрашенного знакоместа. В режиме замены в качестве курсора используется полностью окрашенное знакоместо. Когда команда введена без ошибок или когда курсор перемещается на другой экран или другую область экрана, восстанавливается режим замены - режим редактирова- ния, используемый по умолчанию. Клавиша End используется для установки курсора на послед- ний символ строки, отличный от пробела. Если командная стро- ка заполнена, нажатие клавиши End устанавливает курсор на последний символ в строке. Клавиша Home устанавливает курсор на начало командной строки. После нажатия Enter команда передается AFD для интерпре- тации и выполнения. Для редактирования командной строки можно использовать следующие нефункциональные клавиши: Enter - выполнить команду; Home - курсор в начало поля; End - курсор после последнего символа в строке, отличного от пробела; Ins - переключение режима ввода; Del - удаление символа в текущей позиции курсора; Esc - очистка командной строки; Baсkspace - удаление символа слева от курсора; Ctrl/F6 - очистка до конца строки; Курсор вправо - позиция следующего символа; Курсор влево - позиция предыдущего символа; Kурсор вверх - сдвиг дисассемблируемой области вниз на одну строку; Kурсор вниз - сдвиг дисассемблируемой области вверх на одну строку; PgUp - сдвиг дисассемблируемой области вверх на 8 строк; - 55 - PgDn - сдвиг дисассемблируемой области вниз на 8 строк; PrtSc - печать содержимого текущего экрана. 7.3.12.2. Обработка ошибок при вводе команд Если во время ввода команды обнаруживается ошибка, то в верхней строке дисассемблируемой области выводится сообщение об ошибке или указание пользователю. В дальнейшем эту строку будем называть строкой состояния. Она временно перекрывает строку предыдущей команды в окне дисассемблера. Дисассембли- рованная команда, которую замещает строка состояния, выво- дится вновь после нажатия любой клавиши. Вывод сообщений об ошибке сопровождается звуковым сигна- лом, который может быть разрешен или запрещен с помощью команд BEEP ON и OFF. По умолчанию при запуске AFD звуковой сигнал разрешен. При обнаружении ошибки ввода курсор указывает на первый ошибочный символ. Если пропущен параметр или ограничитель, то курсор устанавливается там, где он должен быть введен. Соответствующее сообщение указывает пользователю, что нужно ввести. В случае затруднений с помощью клавиши F4 на экран может быть выведена справочная информация. При запуске дисковой операции, которая не может быть ус- пешно завершена из-за каких-либо ошибок, курсор помещается на имя файла. Это позволяет после изменения имени повторить данную команду для другого файла. 8. СООБЩЕНИЯ ПРОГРАММЫ В данном разделе приводятся тексты сообщений, выдаваемых программой, возможные причины возникновения ошибочных ситуа- ций, предусмотренное действие программы и требуемый ответ пользователя (если вмешательство пользователя необходимо). При работе с основным экраном AFD сообщения об ошибках выво- дятся в строке состояния, а при работе с меню определения точек останова в строке, разделяющей введенные определения и окно дисассемблируемого кода. '*** E X E C U T I N G ***' Это сообщение выводится всегда при выполнении процедуры за один шаг (при нажатии F2). Если время выполнения подпрог- раммы очень мало, это сообщение немедленно исчезает. Выпол- нение процедуры отлаживаемой программы может быть завершено пользователем с помощью нажатия Ctrl/Esc или клавиши NMI. 'Адаптер в режиме 80х25' или 'Display mode changed' Эти сообщения выводятся в строке состояния, если отлажи- ваемая прикладная программа, использующая тот же дисплейный адаптер, что и AFD, изменяет его текущий режим работы. 'Адаптер не установлен' Независимо от текущего режима экрана при использовании - 56 - параметра MONO в команде MODE, AFD переключается в режим мо- нохромного отображения. Параметр COLOR заставляет AFD ис- пользовать цветной экран в режиме 80х25 символов. Если выб- ранный адаптер не установлен, выводится данное сообщение об ошибке и режим экрана не изменяется. 'Адрес-приемник не в ОП' Если адрес приемника находится не в оперативной памяти, то командная строка не очищается, в строке состояния выво- дится сообщение: 'Байты скопированы' Во время выполнения команды копирования содержимого одной области памяти в другую курсор исчезает, а командная строка содержит введенную команду. Если все байты успешно скопиро- ваны, командная строка очищается и выводится это сообщение. 'Буфер полон. Прекращение записи' В режиме генерации макрокоманд это сообщение появляется, когда буфер макрокоманды заполнен и дальнейшего протоколиро- вания нажатий клавиш не выполняется. 'Буфер пуст' Это сообщение выводится при попытке выполнить макрокоман- ду, если буфер команд пуст. 'В буфере трассировки не хватает записей' Это сообщение выдается, если значение параметрa 'длина,' указывающее количество записей, которое нужно распечатать по команде 'TB', определяет номер записи больше максимального из записанных. 'Все байты равны' Сообщение появляется после выполнения команды сравнения двух областей памяти, если все байты указанных областей сов- падают. 'Дважды указано' При определении точки останова в поле действия дважды указано одно и то же действие. 'Для возврата в DOS введите QUIT' Команда QUIT - единственная команда, которую необходимо вводить без сокращений, это позволяет избежать нежелательно- го завершения программы. 'Загрузка HIGH без поддержки' Если отлаживаемая программа скомпонована программой LINK с ключом HIGH, она не может быть загружена загрузчиком AFD. Для проверки таких программ AFD должен быть запущен в рези- дентном режиме, после чего нужно использовать загрузчик опе- рационной системы. Для доступа к указанной точке кода про- граммы пользователь может поместить в эту точку инструкцию - 57 - INT3. 'Запись' Это сообщение выводится в строке состояния во время вы- полнения вывода данных на диска. 'Заполнение. Конец - нажатие клавиши' Это сообщение выводится во время выполнения команды за- полнения заданной области указанной строкой. Нажатие любой клавиши прекращает выполнение операции. 'Изменяемая ячейка не в ОП' Во время выполнения команды корректировки при попытке из- менить ячейку, которая находится не в оперативной памяти, в строке состояния выводится это сообщение об ошибке и курсор устанавливается на параметр адреса в команде. 'Код должен быть в ОП' При выполнении процедуры за один шаг (F2), так как AFD устанавливает программные точки останова, то ее нельзя ис- пользовать, когда выполняемый код не находится в оперативной памяти. В этом случае должен использоваться пошаговый режим (F1). 'Код изменен в BRn:' AFD может помочь пользователю даже в той ситуации, когда AFD определяет, что код был изменен после последней команды "G". Сохраненный код не будет восстановлен по данному адресу и точка останова будет запрещена, поле счетчика для данной точки останова сбрасывается в 0. 'Конец входного поля' При редактировании команды курсор может перемещаться только в горизонтальном направлении. Это сообщение об ошибке выводится при попытке выйти за границы командной строки. Кроме того, для перехода к следующему символу в окне или с одного поля на другое можно использовать клавиши 'курсор вправо' и 'курсор влево', Тab и Shift/Tab. В конце строки при перемещении вправо выполняется циклическое перемещение курсора на ее начало. В конце правого нижнего поля каждого окна дальнейший сдвиг вправо не выполняется. В случае такой попытки также выводится это сообщение об ошибке. 'Лишние символы в строке' Сообщение указывает на присутствие в командной строке лишних символов. Эти символы должны быть удалены перед вы- полнением команды. Они могут быть удалены нажатием клавиш Ctrl/F6, которое удаляет все символы от текущей позиции кур- сора до конца строки. 'Нажатие клавиши - продолжение' После выдачи команды ввода данных из порта ввода/вывода курсор исчезает и в командной строке после знака '=' показы- вается шестнадцатеричное значение из порта ввода/вывода. После нажатия любой клавиши командная строка и строка состо- - 58 - яния очищаются. 'Не найден' Это сообщение указывает, что при выполнении команды поис- ка при просмотре всего адресного пространства, начиная с указанного адреса, до последней адресуемой ячейки аргумент поиска не был обнаружен. 'Неверная точка останова' Задан номер точки останова, которая в данный момент не имеет определения. 'Нельзя дисассемблировать назад - данные' Это сообщение может появляться при сдвиге с помощью кла- виш 'курсор вверх' или PgUp окна дисассемблера назад в об- ласть, не содержащую кода программы. Если это сообщение выводится при использовании режима ав- топовтора клавиатуры, буфер клавиатуры может быть очищен с помощью ввода Ctrl/Break. 'Несовпадение - см. M1 и M2' Сообщение появляется после выполнения команды сравнения двух областей памяти, в случае обнаружения различия между ними. Вместе с сообщением в окне 1 выводятся данные, адресу- емые первым параметром, начиная с первого несовпадающего байта. Окно 2 используется для отображения данных второй области. 'Нет записей трассировки' Команда TB может быть введена без параметров для распе- чатки всех записей трассировки, находящихся в данный момент в буфере. Если данных трассировки нет, операция завершается и в строке состояния выводится сообщение об ошибке. 'Нет номера точки останова для Restart' В случае указания действия Restart при вводе определения точки останова необходимо указать номер точки останова, для которой нужно восстановить счетчик проходов. 'Нет такой команды' Указанная в командной строке команда введена неверно. Не- обходимо скорректировать название команды, а затем снова на- жать клавишу Enter. 'Останов на BRn' В случае, если в отлаживаемой программе встречается инс- трукция INT3, выполнение в этой точке останавливается. Tекущей инструкцией является инструкция INT3. Ее необходимо пропустить или заменить перед тем, как выполнение программы может быть продолжено. 'Ошибка мнемоники' В зависимости от режима, заданного командой '286' может - 59 - быть использована мнемоника всех машинных инструкций или только мнемоника основных. Это сообщение об ошибке выдается, если указана мнемоника дополнительных машинных инструкций, которые в данный момент не поддерживаются. 'Печать. Прерывается по 'Esc' Это справочное сообщение выводится на экран при запуске печати. Печать может быть прервана нажатием клавиши Esc. 'Поиск.Нажатие клавиши - конец' Это сообщение выводится во время выполнения команды поис- ка. Нажатие любой клавиши прекращает выполнение операции. 'Программа окончена нормально' Это сообщение указывает, что отлаживаемая программа, заг- руженная с помощью AFD, завершена и возвращает управление в ДОС с помощью прерывания. Все регистры сбрасываются в их первоначальное состояние и все ячейки точек останова восста- навливаются и содержат свои исходные коды инструкций. 'Путь не найден' Это сообщение выводится, если с именем файла указан ката- лог, который программа не может найти на данном диске. 'Режим резидентный - используйте команду 'G' Это сообщение выдается при попытке повторно ввести команду 'QUIT R', если AFD уже находится в резидентном режи- ме. 'Резидентный режим - загрузка запрещена' Файлы EXE и COM не могут быть загружены командой 'L', когда AFD работает в резидентном режиме, так как это может привести к противоречиям с диспетчером памяти операционной системы. Программы должны загружаться обычным загрузчиком ДОС, либо AFD может быть вызван повторно, пока одна копия AFD уже резидентна в памяти. 'Синтаксис неверен' Это сообщение об ошибке указывает на неверный синтаксис введенной команды. Курсор устанавливается на то место в ко- манде, где обнаружена ошибка. После редактирования команды для ее выполнения нужно снова нажать клавишу Enter. 'Типы операндов (BYTE/WORD) не совпадают' В команде установки в регистры процессора указанных зна- чений типы регистров с обеих сторон знака равенства должны совпадать. При выводе этого сообщении об ошибке содержимое указанного регистра не изменяется. 'Точка останова не в ОП' Это сообщение об ошибке выводится, если в качестве точки останова указан адрес вне оперативной памяти. В этом случае курсор устанавливается на параметр 'адр.' в командной стро- - 60 - ке. Нужно исправить адрес и выполнить команду снова или ис- пользовать клавишу Esc для очистки командной строки. 'Чтение' Это сообщение выводится встроке состояния во время выпол- нения ввода данных с диска. 'Эта клавиша без функции' или 'Пустая клавиша' В данный момент нажатая функциональная клавиша не имеет назначенной ей служебной функции. Текущее назначение команд функциональным клавишам всегда указано в последней строке экрана. 'C-счетчик, S-стоп, R[n]-рестарт, T-трассировка,' ' - действия нет' Это сообщение содержит справочную информацию. Сообщение выводится в случае, если при вводе определения точки остано- ва в поле действия допущена ошибка. 'AFD не верхний процесс, используйте 'G' Это сообщение появляется при попытке выгрузить резидент- ный вариант AFD с помощью команды QUIT для того, чтобы осво- бодить используемую память, если память выше резидентного AFD используется другой резидентной программой. Другие сообщения об ошибках являются подсказками пользо- вателю о том, каким образом следует скорректировать команду и не требуют специальных объяснений. После вывода таких со- общений курсор устанавливается в то место команды, где нужно ввести недостающий элемент или изменить введенный неправиль- но.