Описание
компьютера Радио-86РК
|
Журнал
РАДИО
|
"Отладчик" для "Радио-86РК".
Интерпретатор языка БЕЙСИК, редактор и ассемблер для компьютера "Радио-86РК" входят в состав так называемого системного (точнее инструментального) программного обеспечения. Они предназначены для более удобной и быстрой разработки прикладных программ (расчетных, учебных, игровых и т. п.). К одной из обязательных программ инструментального обеспечения компьютера можно отнести и программу отладчик, предназначенную для отладки программ в машинных кодах, хранящихся в памяти компьютера.
Необходимость иметь отладчик в инструментальном ПО обусловлена тем, что практически все вновь разрабатываемые программы на языке АССЕМБЛЕРА (за исключением самых простых) содержат, как правило, различные ошибки. Синтаксические ошибки выявляются на этапе трансляции, и исправить их не составляет большого труда. Логические же ошибки выявляются только при "мысленном" выполнении программы или на этапе выполнения программы компьютером. Первый выпуск разработанной программы обычно заканчивается разрушением программы в ОЗУ и срывом индикации на экране. Поэтому и приходится начинать поэтапное, с многочисленными промежуточными выводами и остановами выявление ошибок. Отладчики позволяют в значительной степени избавиться от этих неприятностей, облегчить неизбежный и трудоемкий процесс отладки программы и значительно сократить время на разработку программ, особенно программистам невысокой квалификации.
Предлагаемая вниманию читателей программа ОТЛАДЧИК (DP) разработана для компьютера "Радио-86РК" с МОНИТОРОМ, рассчитанным на объем ОЗУ 32 Кбайт и имеющим стандартные точки входа. Отладчик работает в диалоговом режиме и предоставляет программисту следующие возможности:
Несмотря на обилие и кажущуюся сложность выполняемых отладчиком функций и директив, работу с ним можно начать, освоив всего две из них - А и G, а по мере накопления опыта программирования и отладки программ расширять круг используемых директив и режимов работы ОТЛАДЧИКа.
Программа ОТЛАДЧИК отличается от многих других подобных программ и директивы G МОНИТОРа тем, что она даже временно не модифицирует отлаживаемую программу, т. е. не вставляет в нее коды команд RST и JMP и, по возможности, не портит стек. Это позволяет отлаживать программы любой сложности (независимо от того находятся они в ОЗУ или ПЗУ), не изменяющие область ОЗУ, занятую отладчиком, сам ОТЛАДЧИК располагается в старших адресах памяти: до области, используемой обычно в качестве стека.
Формат директив ОТЛАДЧИКа совпадает с форматом директив МОНИТОРа, т. е. после односимвольной директивы можно задать до трех параметров в виде шестнадцатеричных чисел. Исключение - директива U, параметром которой является символьная метка. Значения параметров многих директив можно не задавать. В этом случае их значение будет взято по умолчанию. Нажатие клавиши <ВК> без ввода директивы приводит к повторному выполнению последней введенной директивы. Например, после ввода директивы G последовательным нажатием клавиши <ВК> осуществляется пошаговое выполнение программы, после ввода директивы D без параметров нажатие <ВК> приводит к выводу на экран дампа последовательных фрагментов памяти, начиная с текущего адреса отлаживаемой программы и т. д.
Работа с отладчиком начинается с его запуска директивой МОНИТОРа G6400 (к этому моменту отлаживаемая программа должна находиться в ОЗУ). На экран выводится идентификатор отладчика "DP*STF*V2.0" и символ : ">", приглашающий к вводу директив. Это состояние ОТЛАДЧИКа будем называть состоянием или режимом приема директив в отличие от режима выполнения программы, в котором каждая команда отлаживаемой программы моделируется или выполняется под контролем ОТЛАДЧИКа.
ДИРЕКТИВЫ РАБОТЫ С ПАМЯТЬЮ
Формат директив F, Т, X, S, L и выполняемые ими действия почти полностью совпадают с соответствующими директивами МОНИТОРа. Директива М дополнительно выводит символьное представление байта или точку. Директива L с одним параметром похожа на директиву М, но в память заносится код символа нажатой клавиши. Выполнение директив прекращается нажатием клавиши ".". По директиве D, кроме шестнадцатеричного, второй строкой выводится и символьное представление памяти. Значением первого параметра по умолчанию является текущий адрес отлаживаемой программы (PC), вторым параметром задается число выводимых строк по 16 байт в строке (по умолчанию выводится восемь строк). Директива Z приводит к выводу на дисплей представление области памяти в виде программы на языке ассемблера. Ее первый параметр задает начало области памяти (умолчание то же, что и для директивы D), второй - число выводимых строк (по умолчанию 22). Директива S так же, как и в МОНИТОРе, осуществляет поиск байта в области ОЗУ. Директива W предназначена для поиска слова. По директиве К можно вычислить контрольную сумму области ОЗУ. Форматы директив приведены в табл. 1.
ДИРЕКТИВЫ ЗАПУСКА И ОТЛАДКИ ПРОГРАММ.
Для запуска отлаживаемой программы необходимо ввести директиву А. Ее первый параметр задает адрес программы (PC), с которого необходимо начать отладку, второй (необязательный) - скорость выполнения программы (число от 0 до 7). Он имеет смысл только при отключенном пошаговом режиме или режиме однострочного вывода информации. Выполнение программы начинается по директиве G, не имеющей параметров, а только переводящей ОТЛАДЧИК в состояние выполнения программы. Теперь его работа будет определяться байтом флажков, задающих различные режимы выполнения программы и отображения отладочной информации. Значение флажков можно оперативно менять. Из состояния выполнения программы в режим приема директив отладчик переходит после нажатия клавиши "." (точка) или при срабатывании ловушки.
Аппарат ловушек предназначен для обнаружения определенных ситуаций, возникающих при выполнении программы. Такими ситуациями могут быть выполнение команды по заданному адресу, попытка записи или чтения из определенной ячейки, код выполняемой команды, определенное значение аккумулятора и другие. В зависимости от значения флажка F6 объектом ловушки может быть либо только адрес команды и адрес ячейки, либо, кроме этого, еще и операнд трехбайтной команды, значения регистровой пары и указателя стека. ОТЛАДЧИК позволяет одновременно установить до восьми ловушек. Устанавливают ловушки директивой О. Первый параметр определяет номер ловушки (число 0 до 7), второй - ее значение. Директива О без параметров отменяет (обнуляет) все ловушки. Для того чтобы снять только одну ловушку, выполняют директиву, указав только ее первый параметр - номер ловушки. Ловушки с номерами 6 и 7 проверяются перед выполнением каждой команды независимо от значения флажка F6.
Ловушку с номером 6 устанавливают на код выполняемой команды. Она всегда срабатывает перед выполнением искомой команды. На команду HLT (код 76Н) ловушку можно не устанавливать, так как по умолчанию она всегда вызывает срабатывание ловушки перед ее выполнением. Благодаря этому команду HLT можно использовать в программе для установки контрольных точек, но из отлаженной программы их необходимо обязательно исключить.
Ловушку с номером 7 устанавливают на ненулевое значение аккумулятора. Она сработает, когда после выполнения очередной команды в аккумулятор загрузится установленное в ловушке значение. При установке ловушек с номерами 6 и 7 вторым параметром директивы О должно быть двухразрядное шестнадцатеричное число.
Кроме ловушек на отдельные значения, имеется возможность установить одну ловушку на интервал значений. Интервальная ловушка устанавливается директивой 1, имеющей два параметра - начальное и конечное значения интервала. Ловушка срабатывает, когда значение объекта ловушки попадет в интервал ее значений. По умолчанию интервальная ловушка устанавливается на область ОЗУ, занятую ОТЛАДЧИКОМ (чтобы отлаживаемая программа случайно не изменила ее). Отменяет интервальную ловушку директива I без параметров.
При срабатывании любой ловушки на дисплей выводится информационное сообщение, и в зависимости от значения флажка F7 ОТЛАДЧИК либо продолжает выполнение программы, либо переходит в состояние ввода директив. Сообщение о срабатывании ловушки состоит из слова "ловушка" и кода сработавшей ловушки. Коды ловушек приведены в табл. 2.
Чтобы продолжить выполнение программы после срабатывания ловушки, необходимо либо ее отменить и продолжить выполнение программы по директиве G, либо не отменяя, по директиве J. Директива J отличается от директивы G только тем, что перед выполнением первой команды не производится проверка на срабатывание ловушки.
Следующие четыре директивы, обрабатываемые только а режиме выполнения программы, позволяют управлять ходом ее выполнения. При нажатии на УС -@ или клавишу <F1> инвертируется значение бита 0 регистра F микропроцессора, т. е. признак "ПЕРЕНОС", при нажатии на УС+A или клавишу <F2> инвертируется бит 6, т. е. признак "НУЛЬ", а при нажатии на УС+В или клавишу <F3> инвертируется бит 7, т. е. признак "ЗНАК". Четвертая директива-УС+С или клавиша <F4> предназначена для выполнения отлаженных подпрограмм,
ТАБЛИЦА 2.Для того чтобы выполнить подпрограмму в обычном режиме без контроля ОТЛАДЧИКа, а после возврата из подпрограммы продолжить отладку, достаточно после выполнения команды CALL нажать на клавишу - <F4>. ОТЛАДЧИК передаст управление отлаживаемой программе по текущему адресу, записав в стек адрес возврата в ОТЛАДЧИК. Во избежание ошибок необходимо до выполнения директивы проконтролировать содержимое вершины стека, установив значение флажка F2=1. В вершине стека должен обязательно находиться адрес возврата из подпрограммы. После любой операции со стеком передавать управление подпрограмме нельзя. Выполнение подпрограмм в обычном режиме позволяет резко ускорить процесс отладки, так как скорость выполнения программы под отладчиком с трассировкой команд составляет всего 10-15 команд в секунду.
В любой момент можно выйти из ОТЛАДЧИКа, передав управление отлаживаемой программе по текущему адресу, для этого надо выполнить директиву R, не имеющую параметров.
ДИРЕКТИВЫ ИЗМЕНЕНИЯ РЕЖИМОВ
Режим работы ОТЛАДЧИКА определяется байтом флажков, значение которых может быть изменено директивами 1 - 8. Директивы параметров не имеют. Выполнение директивы заключается в инвертировании соответствующего разряда в байте флажков, поэтому повторное выполнение директивы восстанавливает первоначальное состояние флажка (триггер - эффект). Вводить директивы изменения режима можно в любой момент работы ОТЛАДЧИКа. В состоянии выполнения программы директивы обрабатываются сразу после нажатия на клавиши 1, 2, ..., 8, в режиме приема директив - после нажатия на клавишу <ВК>.
Директива 1 задает режим вывода на дисплей сообщения о значениях регистровых пар и мнемоники выполняемой команды (текущем состоянии отлаживаемой программы. см. пример в табл. 3). При значении флажка F1=1 информация выводится, при F1=0 - не выводится.
Директива 2 управляет форматом вывода сообщения о текущем состоянии программы: при F2=0 сообщение выводится в одну строку, при F2=1 - в две строки. Во второй строке выводится значение указателя стека и три слова из его вершины. При F1=0 вторая строка не выводится независимо от значения флажка F2.
Директива 3 управляет выводом информации о выполнении подпрограмм. Информация выводится в структурированном виде: отображается вложенность подпрограмм (в отдельных случаях это условие не выполняется). Переход на подпрограмму обозначается символом "стрелка вправо", возврат из подпрограммы - символом "стрелка влево".
Директива 4 управляет выводом информации о командах перехода PCHL, JMP, JM и др. Эта информация выводится только при F3=1. Команды перехода отличаются от обращений к подпрограммам тем, что между адресами вместо символа "стрелка вправо", стоит символ ">".
Директива 5 задает режим пошагового выполнения программы. При F5=1 после ввода директивы G или J на дисплей выводится сообщение о текущем состоянии программы без выполнения отображаемой команды. Для выполнения команды необходимо нажать на клавишу - <ВК>. При каждом нажатии на клавишу <ВК> выполняется только одна команда. Нажатие на клавишу <^ПРОБЕЛ> отменяет пошаговый режим на время нажатия клавиши. При F5*0 слаживаемая программа выполняется непрерывно. Скорость выполнения можно задать в директиве А. Нажатие на любую клавишу, кроме <<ПРОБЕЛА^>, временно приостанавливает выполнение программы.
Директива 6 управляет выбором объекта ловушек. При F6=0 ловушка срабатывает при попытке выполнить как команду, прочитать или записать в ячейку с адресом, совпадающим с ловушкой или попадающим в интервал значений ловушки. Например, в качестве интервала значений ловушки удобно задавать границы памяти, в которые ваша программа заведомо не должна обращаться. Срабатывание этой ловушки будет происходить в случае действительной ошибки в программе. При F6=1 со значениями ловушек сравниваются значения всех регистровых пар, адреса и операнды трехбайтных команд.
В этом режиме могут появиться многочисленные незапланированные срабатывания ловушек, поэтому интервальную ловушку желательно отменить.
Необходимо помнить, что проверка на срабатывание ловушки проводится перед выполнением команды, так, например, если установить ловушку на адрес текущей команды и начать выполнение программы директивой G, то очередная команда выполняться не будет, так как сработает ловушка. Похожая ситуация возникает и после срабатывания ловушки. Для дальнейшего выполнения программы часто достаточно выполнить директиву J, не изменяя значений ловушек. Если после выполнения команды условие, вызвавшее срабатывание ловушки, не исчезнет, то придется явно повторять ввод директивы J до изменения условия или отмены ловушки. Ввод последней директивы по умолчанию, т. е. просто нажатием на - <ВК>, на директиву J не распространяется.
Директива 7 управляет режимом прохождения ловушек. При F7=1 срабатывание ловушки приводит к выдаче соответствующего сообщения, выполнение программы прекращается и ОТЛАДЧИК переходит в состояние приема директив. При F7=0 сообщение о срабатывании ловушки выдается, но отлаживаемая программа продолжает работу без прерываний.
Директива 8 задает режим однострочной выдачи, когда почти вся информация ОТЛАДЧИКа выводится последовательно в верхнюю строку экрана. Такой режим удобен для отладки программ, формирующих "картинки" на экране дисплея. Так как содержимое строки постоянно обновляется, стирая предыдущие сообщения, то для контроля информации нужно либо установить пошаговый режим выполнения программы, либо подобрать удобную скорость в директиве А, либо управлять выполнением программы нажатием на клавиши <ВК> и <ПРОБЕЛ>. При каждом выполнении директивы 8 экран дисплея очищается, отладочную информацию можно выводить в любую строку экрана - для этого надо соответственно увеличить значение ячейки по адресу 642ВН.
ДОПОЛНИТЕЛЬНЫЕ ДИРЕКТИВЫ
Справочную информацию о мнемонике и функциях всех директив вы можете получить по директиве H, не имеющей параметров. Текст справки располагается в памяти компьютера перед отладчиком и занимает 768 байт. После того как необходимость в нем отпадет или при записи отладчика в ПЗУ, вы можете подготовить себе вариант отладчика без справки или изменить ее содержание и объем.
Директива ! выдает информацию о текущем состоянии ОТЛАДЧИКа и отлаживаемой программы. Параметром директивы является число К от 0 до 2. При К=0 выдается информация о текущем состоянии отлаживаемой программы. При К=1 дополнительно выводится текущее значение байта флажков. При К>1 дополнительно выдается информация о значениях ловушек.
Директива U особенно полезна при разработке собственных программ. Она возвращает адрес или значение любой метки, определенной в исходном тексте программы, а также содержимое ОЗУ по этому адресу в формате слова. У директивы U один параметр - имя метки. Директива U очень удобна при отладке фрагментов разрабатываемой программы, например подпрограмм. Определив по директиве U адрес начала подпрограммы в ОЗУ, вы можете по директиве Х задать соответствующие значения регистров и выполнить подпрограмму в пошаговом режиме. По директиве U можно также определять текущее значение переменных, не пользуясь директивами D и М. При выполнении директивы используются подпрограмма АССЕМБЛЕРа "ПОИСК МЕТКИ В ТАБЛИЦЕ МЕТОК" и таблица меток, построенная им во время трансляции программы. Описание каждой метки в таблице занимает восемь байт; 6 байт на метку и 2 байта на значение метки. Признаком конца таблицы служит нулевой байт в области метки. Таблица меток расположена в ОЗУ сразу же после текста программы. Директива U выполняется только с ассемблером (assM) "МИКРОН", загруженным с адреса 800Н.
Нажатие на клавишу - <СТР> в режиме приема директив приводит к передаче управления МОНИТОРу по адресу, записанному в ячейках 640АН, 640ВН (по умолчанию F86CH). При нажатии на клавишу <АР2> управление передается по адресу, записанному в ячейках 640DH, 640ЕН (по умолчанию 0000Н, например, РЕДАКТОРу).
ОТЛАДЧИК перехватывает обращения к трем подпрограммам МОНИТОРа: ввод символа с клавиатуры (0F803H), вывод кода нажатой клавиши (0F81ВН) и опрос состояния клавиатуры (0F812Н). При обнаружении обращений к этим подпрограммам ОТЛАДЧИК выдает звуковой сигнал, выводит на экран символ ? и ждет нажатия клавиши. Код нажатой клавиши передается отлаживаемой программе. Для моделирования ситуации не нажатой клавиши при обращении к подпрограммам 0F81ВН и 0F812Н необходимо нажать клавишу <ЗАБОЙ>. В аккумулятор будет загружен соответственно код 0FFH или 00Н. Для моделирования нажатия клавиши <РУС/ЛАТ> необходимо нажать УС+О. В аккумулятор будет загружен код 0FEH. Если после вывода на дисплей запроса? на ввод кода клавиши требуется вернуться в ОТЛАДЧИК, надо ввести код УС+D или нажать клавишу <F5>. ОТЛАДЧИК перейдет в режим ввода директив. Продолжить выполнение программы можно по директиве G, но повторной выдачи звукового сигнала и символа? при этом не будет. В пошаговом режиме всегда можно вернуться в режим приема директив и изменить значение аккумулятора директивой X.
ОТЛАДЧИК не гарантирует правильного выполнения программы при обращении к подпрограммам МОНИТОРа помимо стандартных точек входа. Команды перехода на стандартные подпрограммы МОНИТОРа, необходимые для работы ОТЛАДЧИКа, расположены в области ОЗУ с 640FH по 6427Н.
Рассмотрим наиболее простые приемы работы с ОТЛАДЧИКом. Пусть необходимо проверить работу фрагмента подпрограммы на языке АССЕМБЛЕРа, приведенного в табл. 4. Директивой А устанавливают начальный адрес программы. Директивой 2 задают режим вывода информации о выполняемой команде в 2 строки. Директивой G запускают выполнение программы в пошаговом (по умолчанию) режиме. В первой строке информации после значения аккумулятора в удобном для анализа виде выводятся признаки переноса ("С" или "ТОЧКА"), нуля ("Z" или "ТОЧКА"), знака ("М" или "Р"), вспомогательного переноса ("А" или "ТОЧКА") и паритета ("Е" или "О").
После нажатия на <ВК> текущая команда выполняется и выводится информация о следующей команде. Директива 2 отменяет вывод второй строки информации. Нажатие на клавишу <ТОЧКА> переводит ОТЛАДЧИК а режим приема директив. В конце протокола приведен пример выполнения директивы U.
Кроме основной точки входа 6400Н, ОТЛАДЧИК имеет дополнительную точку входа с адресом 6403Н, позволяющую входить в него не по директиве G МОНИТОРа, а из отлаживаемой программы, и выполнять под управлением ОТЛАДЧИКа не всю программу, а лишь отдельные ее фрагменты. В этом случае в начале отлаживаемого фрагмента в программу вставляют команду CALL 6403Н, по которой ОТЛАДЧИК получит управление, и уже следующая за вызовом ОТЛАДЧИКа команда будет выполняться под его управлением. ОТЛАДЧИК принудительно установит пошаговый режим (F5=1) и вывод текущей информации о программе (F1=1 ). Вернуться в вызываемую программу можно в любой момент, нажав на клавишу R или выполнив директиву R. Управление передается программе по текущему адресу PC. Таким образом, можно неоднократно входить в ОТЛАДЧИК из разных точек программы. Для того чтобы войти в ОТЛАДЧИК по директиве G МОНИТОРа, без очистки рабочих полей, предусмотрена точка входа по адресу 6406Н.
ОТЛАДЧИК не изменяет адрес верхней границы ОЗУ, но такая возможность в нем предусмотрена. Для этого в три последовательные ячейки, начиная с адреса 65D5H, нужно занести коды 21Н, 0FFH, 60Н, т. е. оттранслированную команду LXI Н,60FFH. При работе отладчика периодически обнуляется ячейка по адресу 7605Н служебной области ОЗУ МОНИТОРа. Это вызвано особенностями реализации в МОНИТОРе подпрограмм ввода символа с клавиатуры (0F803H) и подпрограммы ввода кода нажатой клавиши (0F81BH).
Перечень всех директив отладчика приведен в табл.5, формат директив, имеющих параметры, - в табл. 1. Машинные коды ОТЛАДЧИКа при размере ОЗУ 32К располагаются в памяти с адреса 6400Н до 73FFH. Информация о директивах ОТЛАДЧИКа, выдаваемая по директиве Н, расположена в памяти с адреса 6100Н до 63FFH. Адрес начала текста справки (6103Н) находится в ячейках 6428Н, 6429Н. При необходимости его можно изменить или заменить адресом текста-заглушки 64F7H. Рабочая область занимает ОЗУ с адреса 7400Н no 749FH. Область ОЗУ с адреса 74АОН по 75FFH доступна программам и может использоваться, например, под область стека. Машинные коды отладчика вместе с поблочными контрольными суммами приведены соответственно в табл. 6 и 7.
Таблица 7.
БЛОК |
КОНТРОЛЬНАЯ СУММА |
||
6100 |
61FF |
A5C0 |
|
6200 |
62FF |
8969 |
|
6300 |
63FF |
2069 |
|
6400 |
64FF |
CA6B |
|
6500 |
65FF |
F86A |
|
6600 |
66FF |
FC08 |
|
6700 |
67FF |
3614 |
|
6800 |
68FF |
D4BC |
|
6900 |
69FF |
EBB8 |
|
6A00 |
6AFF |
F63E |
|
6B00 |
6BFF |
4A42 |
|
6C00 |
6CFF |
Е2D4 |
|
6D00 |
6DFF |
9840 |
|
6E00 |
6EFF |
EFCA |
|
6F00 |
6FFF |
8604 |
|
7000 |
70FF |
C367 |
|
7100 |
71FF |
0AE1 |
|
7200 |
72FF |
D1A6 |
|
7300 |
73FF |
17D6 |
|
6100 |
73FF |
A68D |
Г. ШТЕФАН
г. Москва
Описание
компьютера Радио-86РК
|
Журнал
РАДИО
|