СИСТЕМНЫЙ МОНИТОР
6.6.1. ФУНКЦИИ И СТРУКТУРА
Системное программное обеспечение не только организует управление вводом-выводом, но также должно
предоставлять пользователю элементарные возможности для отладки и контроля выполнения своих программ.
В связи с этим в состав монитора, кроме драйверов, включается обработчик директив (ОД) пользователя. Язык директив позволяет отображать и модифицировать содержимое ячеек памяти и регистров МП системы, а также организовывать выполнение программ с точками останова. Для работы ОД необходимо наличие в составе МП системы консоли. В рассматриваемом случае предполагается, что консоль подключена к ИРПР и работает в системе КОИ-7. Кроме того, имеется еще печатающее устройство, подключенное к МП системе по ИРПС. Перечень директив монитора приведен в табл. 6.1.Табл. 6.1. Директивы монитора
Монитор — неотъемлемая часть МП системы и размещается, как правило, в постоянной памяти. В связи с этим одним из основных требований, предъявляемых к программе монитора, является компактность, которая
Рис. 6.10. Структура ОД монитора
Рис. 6.11. Структура рабочей области монитора
достигается за счет широкого применения подпрограмм. Структура ОД представлена на рис. 6.10. Непосредственно с пользователем взаимодействует программа диспетчера директив, распознающая директиву по первому символу. Диспетчер вызывает соответствующую подпрограмму обработки директивы, которая вводит параметры директивы и выполняет предписанные действия, обращаясь к вспомогательным подпрограммам.
Монитор в процессе своей работы использует определенное пространство оперативной памяти — рабочую область монитора.
В первых пяти ячейках оперативной памяти (начиная с нулевого адреса) размещаются трехбайтная команда перехода на подпрограмму обработки точек останова и двухбайтный адрес последней ячейки оперативной памяти. В старших 28 ячейках оперативной памяти располагаются флаг печати (МЛБ адреса этой ячейки равен 0Е4Н), область сохранения содержимого регистров программы пользователя (МЛБ адресов: 0Е5Н...0ЕСН), последовательность команд для запуска программы пользователя (МЛБ адресов: 0EDH...0F9H) и две трехбайтные структуры, в которых хранятся содержимое и адреса двух точек останова (рис. 6.11). Так как в разных МП системах объем оперативной памяти может быть различным, то для рабочих переменных фиксированными являются значения только МЛБ адресов(указаны на рис. 6.11). СТБ адреса определяется по содержимому четвертой ячейки памяти (равен СТБ адреса верхней границы памяти).
6.6.2. ВСПОМОГАТЕЛЬНЫЕ ПРОГРАММЫ
Вспомогательные программы ОД разделим условно на три группы: 1) программы ввода-вывода символов; 2) программы преобразования шестнадцатеричных чисел из символьного представления в двоичное (и наоборот); 3) программы ввода-вывода шестнадцатеричных чисел. Программы 1-й группы обеспечивают диспетчеру и подпрограммам ОД возможность ввода-вывода различной символьной информации:
вода символа на консоль драйвером ИРПР проверяет состояние флага печати. Если он установлен, вывод символа дублируется на печатающее устройство через драйвер ИРПС. Программа ВЫВС1 выводит на консоль символ, код которого расположен непосредственно за командой вызова данной программы, а возврат осуществляется по адресу, следующему за символом. Такой механизм передачи параметра позволяет вызывающей программе организовать вызов в четырех байтах вместо пяти при использовании программы ВЫВС. Ввод символа с консоли выполняется программой КВВЫ. Эта программа осуществляет также вывод введенного символа — «эхо» — на устройство отображения консоли (после нажатия клавиши).
Программы КОНС и ВЫВП предназначены для вывода на консоль наиболее часто встречающихся символов. Первая выполняет переход на новую строку устройства отображения посредством выдачи ко-дов ВК и ПС, вторая — кода пробела. Программа ТЕКСТ выводит последовательность символов, коды которых расположены в памяти по заданному адресу. Последний байт этой последовательности должен содержать признак конца текста — код ООН.
ОД оперирует только с шестадцатеричными числами. Необходимые операции по преобразованию шестнадцатеричных цифр из символьного представления в двоичное и обратно выполняют программы 2-й группы:
Программа ПРК16 преобразует цифру в системе КОИ-7 в двоичное число (шестандцатеричную цифру). Шестнадцатеричным цифрам 0, 1, ..., 9, А, ..., F в системе КОИ-7 соответствуют коды ЗОН, 31Н, .... 39Н, 41Н, ..., 46Н. Следовательно, для получения двоичных кодов цифр 0...... 9 достаточно вычесть из кода символа константу ЗОН,
а для кодов шестнадцатеричных цифр А,..., F — константу 37Н. Программа, кроме преобразования, производит проверку принадлежности значения входного параметра к множеству шестнадцатеричных цифр. В начале программы проверяется принадлежность кода символа к диапазону 30Н...46Н путем вычитания и сложения с соответствующими константами. При этом в аккумуляторе получается значение, соответствующее двоичному числу со смещением: ЮН — для шестнадцатеричных цифр А, ..., F и 17Н — для цифр 0, ..., 9. Для селекции этих двух типов цифр к содержимому аккумулятора добавляется 6. При этом для цифр 1-го типа возникает переполнение, и флаг S устанавливается в нуль. Для цифр 2-го типа выполняется дополнительная проверка превышения числа 39Н, после чего производится дополнительная коррекция для получения двоичного числа.
Обратное преобразование выполняет программа ПР16К.. Для получения кода символа преобразуемой шестнадцатеричной цифры к ее значению добавляется константа ЗОН, но по правилам десятичной арифметики.
При этом для шестнадцатеричных цифр А, ..., F необходимо к полученной сумме добавить еще единицу. В программе указанное преобразование выполняется по-иному: к двоичным числам добавляется константа 90Н, что позволяет для данных цифр установить флаг CY в единицу, а затем с помощью команды АСІ — константа 40Н.Программы 3-й группы предназначены для ввода- вывода двух- и четырехразрядных шестнадцатеричных чисел:
называются терминаторами. Программа I1PBB выполняет ввод символа с консоли, и если этот символ является терминатором, во флагах процессора Z и CY устанавливаются соответствующие значения. Вторая точка входа ПРА обеспечивает только проверку на терминатор символа, код которого записан в регистре (А).
Программа ВВ2БН производит ввод 4-разрядного числа с консоли в регистровую пару (Н, L). Первые две команды выполняют ввод символа, и если он оказывается терминатором, управление передается в диспетчер по входу «Ошибка» (ВОП). Если ввод и проверку выполнять не обязательно, к данной программе необходимо обращаться по точке входа ВВ2БН1. Накопление вводимого числа в регистровой паре (Н, L) осуществляется с помощью итеративного цикла. Перед началом цикла содержимое регистровой пары (Н, L) обнуляется. На каждой итерации введенный символ с помощью программы ПРК16 преобразуется в двоичное представление шестнадцатеричной цифры и добавляется к предварительно сдвинутому на четыре разряда влево содержимому регистровой пары (Н, L). Сдвиг влево производится с помощью четырех команд DAD Н. Затем посредством
подпрограммы КВВЫ вводится следующий символ, и итерация повторяется. Работа цикла продолжается до тех пор, пока программа ПРК16 не обнаружит, что преобразуемый символ не является шестнадцатеричной цифрой. Если данный символ — терминатор, осуществляется возврат из программы.
В противном случае управление передается в диспетчер на вход «Ошибка». Таким образом, эта программа вводит любое количество цифр, но число формируется только по последним четырем введенным цифрам/Подпрограмма ВВ2Б предназначена для ввода заданного количества 4-разрядных чисел, которые помещаются в стек (в вершине стека хранится последнее число). Если количество введенных чисел меньше заданного или за последним числом нет символа ВК, возврата из программы не происходит, а управление передается в диспетчер на вход «Ошибка». Вывод 2-ра'зрядного числа выполняется подпрограммой ВЫВА: вначале старший полубайт выводимого числа преобразуется подпрограммой ПР16К в символьное представление и выводится на консоль, а затем — младший. В программе с целью экономии памяти последний фрагмент, который преобразует и выводит одну цифру числа, выполняется дважды, причем первый раз в качестве подпрограммы. Подпрограмма ВЫВНЬ обеспечивает вывод на консоль 4-разрядного числа: подпрограммой ВЫВА сначала выводятся старшие разряды, а затем — младшие.
6.6.3. ДИРЕКТИВА ВЫВОДА СОДЕРЖИМОГО ПАМЯТИ
Директива D осуществляет построчный вывод содержимого заданной области памяти. В каждой строке выводится 17 значений: первое является адресом, а остальные— содержимым последовательных ячеек памяти,
Ml
Вначале с помощью программы ВВ2Б производится прием двух параметров: адресов нижней и верхней границ отображаемой области памяти. Дальнейшая работа программы организована в виде двух вложенных итеративных циклов. Вывод одной строки обеспечивает внутренний цикл, на каждой итерации которого с помощью соответствующих подпрограмм выводятся разделители и содержимое очередного байта. Завершение работы внутреннего цикла происходит тогда, когда содержимое младшего полубайта адреса текущей выводимой ячейки памяти становится равным нулю.
Во внешнем цикле выполняются переход на новую строку и вывод текущего значения адреса отображаемого байта. Выход из внешнего цикла осуществляется в том случае, когда значение текущегоадреса достигнет верхней границы отображаемой области памяти. Подпрограмма HHKHD выполняет операции, необходимые для ведения адресных указателей. В этой подпрограмме содержимое регистровой пары (Н, L) инкрементируется и сравнивается с содержимым регистровой пары (D, Е) и нулевым значением. В результате сравнения вырабатываются соответствующие значения выходных параметров.
6.6.4. ДИРЕКТИВА ЗАПОЛНЕНИЯ ОБЛАСТИ ПАМЯТИ
. Директива F заполняет ячейки памяти, адреса нижней и верхней границы которой задаются первым и вторым параметрами директивы, константой, значение которой указывается в третьем параметре:
Вначале программа принимает три параметра, а затем с помощью итеративного цикла организуется заполнение памяти. Благодаря использованию подпрограммы HHKHD тело цикла содержит всего три команды.
6.6.5. ДИРЕКТИВА ПЕРЕМЕЩЕНИЯ СОДЕРЖИМОГО ОБЛАСТИ
ПАМЯТИ
Директива М обеспечивает перемещение содержимого области памяти, границы которой определяются первым и вторым параметрами, в другую область памяти, начиная с адреса, задаваемого третьим параметром:
Структура программы аналогична структуре предыдущей программы. В теле цикла содержатся команды, осуществляющие пересылку текущего байта и модификацию области памяти приемника. Модификация области памяти источника и проверка на достижение им верхней границы выполняются посредством обращения к программе HHKHD.
6.6.6. ДИРЕКТИВА МОДИФИКАЦИИ СОДЕРЖИМОГО ОБЛАСТИ
ПАМЯТИ
Директива S выполняется в диалоговом режиме и совмещает функции отображения и модификации содержимого области памяти. После ввода единственного параметра, который является адресом начала области памяти, на консоль выдаются содержимое первой ячейки этой области и символ «-». В ответ пользователь может ввести число, последние две цифры которого будут записаны в эту ячейку. Ввод числа должен заканчиваться вводом терминатора. Если запись в данную ячейку не требуется, необходимо сразу после вывода символа «-» ввести терминатор. В обоих случаях после ввода терминатора на консоль выводятся содержимое следующего байта и символ «-», затем описанные действия пользователь может повторить. Для прекращения работы директивы S необходимо в качестве терминатора использовать символ ВК. Программа, выполняющая директиву, имеет следующий вид:
Ввод параметра осуществляется подпрограммой ВВ2БН. Если сразу после параметра введен символ ВК, выполняется возврат из программы. Дальнейшая работа программы организована в виде цикла. На каждой итерации выводятся содержимое очередной ячейки памяти и символ «-», затем в зависимости от ответа пользователя выполняется (или не выполняется) запись нового содержимого. Для ввода ответа используются вспомогательные подпрограммы ПРВВ, с помощью которых выполняется ввод первого символа ответа, и ВВ2БН1 (дополнительная точка входа в подпрограмму ВВ2БН), которая вызывается, если первый введенный символ не является терминатором, и обеспечивает ввод нового содержимого в текущую ячейку памяти. В конце итерации значение указателя текущей ячейки инкрементируется. Возврат из программы производится в том случае, если в качестве терминатора введен символ ВК, что фиксируется. установкой в единицу флага CY после возврата из [подпрограммы ПРВВ или ВВ2БН1.
6.6.7. ДИРЕКТИВА ОТОБРАЖЕНИЯ И МОДИФИКАЦИИ РЕГИСТРОВ
При обработке точек разрыва программы пользователя состояние регистров записывается в область сохранения, а при последующем запуске программы восстанавли-
вается. Поэтому с точки зрения пользователя модификация содержимого регистров МП является не чем иным, как модификацией содержимого соответствующих ячеек области сохранения. Если сразу после директивы X вводится символ В К, выполняется только отображение содержимого регистров: на консоль выводится строка, в которой вместе с общепринятыми мнемоническими обозначениями регистров приводится их содержимое. Если после директивы X вводится мнемоническое имя регистра, на консоль выводятся его содержимое и символ «-». Дальнейшая работа данной директивы аналогична работе директивы S (только доступ организуется не к последовательным ячейкам памяти, а к ячейкам области сохранения, соответствующим регистрам, имена которых упорядочены по алфавиту). Программы, выполняющие директиву, имеют вид:
Для обозначения доступа к произвольным ячейкам области сохранения существует специальная таблица ТРЕГ, с помощью которой по мнемоническому имени регистра определяется адрес ячейки области сохранения, где размещается его содержимое. Подпрограмма ВЫВР обеспечивает вывод содержимого ячейки (или ячеек) области сохранения по заданному адресу элемента таблицы. В таблице хранится только значение МЛБ адреса ячейки области сохранения. СТБ адреса потребуется из четвертой ячейки памяти (в ней хранится СТБ адреса верхней границы памяти). После формирования полного адреса на консоль с помощью программы ВЫВА выводится содержимое соответствующей ячейки. Если в третьем байте заданного элемента таблицы установлен признак двухбайтного значения (единица), дополнительно выводится содержимое предыдущей ячейки.
Программа КМХ обработки директивы X начинает работу с ввода параметра. Если в качестве параметра введен символ ВК, выполняется цикл отображений. На каждой итерации этого цикла обрабатывается один элемент таблицы области сохранения ТРЕГ. Вначале первый байт элемента проверяется на код «концевика» таблицы. Если «концевик» обнаруживается, выполняется возврат. В противном случае из таблицы выбирается и выводится на консоль символ мнемонического обозначения регистра, а затем после вывода символа «-» с помощью подпрограммы ВЫВР выводится содержимое этого регистра. Указатель таблицы размещается в регистровой паре (Н, L). После возврата из программы ВЫВР указатель адресует начало следующего элемента, поэтому отдельная модификация указателя не производится.
Если в качестве параметра вводится символ мнемонического обозначения регистра, выполняется фрагмент программы КМХ, реализующий режим модификации области сохранения. Вначале введенный код отыскивается среди первых байтов элементов таблицы. Если поиск неудачен, управление передается на вход ВОП программы
диспетчера. В противном случае выполняется цикл модификации, начиная с того регистра, символ которого введен в качестве параметра. Каждая итерация производит обработку одного элемента области сохранения. После вывода содержимого элемента и символа «-» выполняется ввод первого символа ответа пользователя. Если это символ ВК, осуществляется возврат из программы; если другой терминатор, выполняется переход на окончание цикла итерации; если символ шестнадцатеричной цифры, то подпрограммой ВВ2БН1 с консоли вводится число и в зависимости от содержимого третьего байта элемента таблицы в область сохранения записываются один или два байта введенного числа. В конце итерации первый байт следующего элемента проверяется на код «концевика» таблицы. В зависимости от результата проверки выполняется либо возврат из программы, либо следующая итерация цикла.
6.6.8. ДИРЕКТИВА ЗАПУСКА ПРОГРАММЫ ПОЛЬЗОВАТЕЛЯ
Директива G позволяет выполнить программу пользователя, начиная с заданного адреса, который является первым параметром директивы. Второй и третий параметры определяют адреса точек останова, после достижения которых выполнение программы пользователя прекращается и управление передается программе диспетчера. Все параметры являются необязательными. Если опущен первый параметр, адресом старта является содержимое области сохранения, соответствующее программному счетчику PC. Программа, выполняющая директиву, имеет следующий вид:
В начале программы в вершину стека загружается адрес пусковой последовательности, размещаемой в рабочей области монитора. Это делается для того, чтобы по команде возврата RET управление было передано не программе диспетчера, а на начало пусковой последовательности (см. рис. 6.11), команды которой обеспечивают запись содержимого области сохранения в соответствующие регистры и передачу управления по адресу старта программы пользователя. После этого с помощью подпрограммы ПРВВ вводится первый символ первого параметра. Если символ является шестнадцатеричной цифрой, подпрограммой ВВ2БН1 вводится значение параметра и записывается в область сохранения. Если вводится терминатор, он игнорируется; если же в качестве терминатора вводится символ В К, выполняется команда RET,
которая передает управление на начало пусковой последовательности. После ввода первого параметра выполняется цикл ввода второго и третьего параметров.
Так как эти параметры могут быть опушены, то для подсчета введенных параметров в регистре (D) организуется специальный счетчик. Второй счетчик в регистре (Е) служит для ограничения числа итераций цикла до двух (количество допустимых точек разрыва). На каждой итерации этого цикла через программу ВЫВС1 производится вывод символа «-», а затем с помощью программы ВВ2БН вводится значение параметра и записывается в стек. После этого соответствующим образом модифицируются оба счетчика. Если обнаруживается, что допустимое число параметров исчерпано, управление передается на вход ВОП программы диспетчера. Выход из данного цикла производится в том случае, если после очередного параметра введен символ. ВК, что фиксируется установкой в единицу флага CY после возврата из подпрограммы ВВ2БН. В момент выхода из цикла введенные параметры размещаются в вершине стека, а их количество— в регистре (D).
Следующий цикл обеспечивает формирование точек останова в программе пользователя. На каждой итерации этого цикла значение параметра извлекается из стека и записывается в область сохранения. Затем байт, который адресует данный параметр, также записывается в область сохранения, а вместо него записывается код команды рестарта RST О (0С7Н). Количество итераций цикла определяется содержимым регистра (D). Заключительный фрагмент программы выполняет возврат, перед которым с помощью программы КОНС производится переход на новую строку консоли, что информирует пользователя о запуске его программы.
6.6.8. ОБРАБОТКА ТОЧЕК РАЗРЫВА
При достижении программой пользователя адреса останова, по которому записан код команды RST 0, управление передается программе nRST 0, обеспечивающей запись содержимого регистров в область сохранения и восстановление содержимого точек разрыва:
Первоначально все регистры процессора сохраняются в стеке программы пользователя, из которого затем переписываются в область сохранения. При этом содержимое регистровых пар (PSW), (Н, L), (D, E) и (В, С) переписывается с помощью итеративного цикла, а запись регистровых пар (Н, L), (PC) и (SP) выполняется в отдельных фрагментах программы. Значение PC формируется из значения адреса возврата путем декрементирования его, так как при выполнении команды RST 0 адрес возврата указывает на следующую за ней команду. Содержимое указателя стека SP получается с помощью команды DAD SP при предварительно обнуленной регистровой паре (Н, L).
После записи регистров в область сохранения в регистр (SP) загружается адрес начала стека монитора. Затем определяется, какая из двух точек разрыва «сработала». Для этого значения полученного адреса останова сравниваются с соответствующими элементами области сохранения, заполнение которых производилось при обработке директивы G. Если оба сравнения проходят безуспешно, это интерпретируется как сбой, и управление передается на вход инициализации монитора.
В заключительном фрагменте программы на основании информации, записанной в области сохранения, производится восстановление точек разрыва. Это осуществляется с помощью цикла, тело которого выполняется дважды (для каждой точки разрыва). Нулевое значение элемента области сохранения означает, что соответствующая точка разрыва не была установлена и восстановление содержимого этой точки не производится. Одновременно выполняется обнуление соответствующего элемента области сохранения. После завершения работы программы управление передается в диспетчер монитора.
6.6.10. ДИРЕКТИВА ДОКУМЕНТИРОВАНИЯ
Директива Н позволяет установить или отменить режим копирования консольного вывода на печатающее устройство:
Работа программы сводится к инвертированию флага печати, расположенного в рабочей области монитора. При его установке программа ВЫВС обеспечивает дублирование каждого выводимого на консоль символа выводом его на печатающее устройство.
6.6.11. ДИСПЕТЧЕР ДИРЕКТИВ
Программа диспетчера обеспечивает инициализацию рабочей области, обработку ошибок пользователя, допущенных при вводе директив, ввод символа мнемонического обозначения директивы и вызов соответствующей подпрограммы обработки директивы. Программа диспетчера имеет вид:
Инициализация монитора производится программой ИНМОН. Первая команда выполняет инициализацию счетчика команд МП, что позволяет размещать программу монитора в памяти, начиная с произвольного адреса. Затем выполняется процедура определения верхней границы оперативной памяти. Память просматривается страницами по 256 байт. Просмотр начинается с адреса 0FF00H и производится в сторону уменьшения адресов. Выполняются попытки записи в первый байт каждой страницы нулей и единиц с последующим контролем. Как только очередная попытка оказывается удачной, адрес этой страницы определяет верхнюю границу оперативной памяти. Значение данного адреса записывается в 3-ю и 4-ю ячейки памяти. Затем устанавливается значение указателя стека и вызываются подпрограммы инициализации драйверов, входящих в состав монитора, после чего обнуляется рабочая область, расположенная в верхних адресах памяти, и в нее копируется шаблон пусковой последовательности ПУС, указанный в теле монитора. Вслед за этими операциями в первые три ячейки памяти, начиная с нулевого адреса, записывается код команды безусловного перехода на программу обработки точек разрыва — создается «ловушка» точек разрыва. Инициализация завершается выдачей на консоль текста представления с меткой ТТ.
Основная точка входа в диспетчер имеет метку МОН. В первом фрагменте программы диспетчера выполняется вывод на консоль «побуждающего» символа, который информирует пользователя, что монитор готов к приему директив. Формирование адреса программы обработки введенной директивы осуществляется с помощью таблицы
ТАБК, которая состоит из трехбайтных элементов. Каждый элемент соответствует одной директиве и содержит код ее символа (первый байт) и адрес программы обработки. Код введенного символа сравнивается с содержимым первых байтов всех элементов таблицы. В случае удачного сравнения второй и третий байты элемента таблицы загружаются в регистровую пару (Н, L), после чего в вершину стека помещается адрес точки входа в диспетчер (адрес возврата) и выполняется команда PCHL.
Если код введенного символа в таблице не найден, управление передается в ту часть диспетчера, которая выполняет обработку ошибок. По точке входа ВОП производится обработка ошибок пользователя, которая заключается в установке указателя стека в исходное состояние и выводе на консоль символа «?», который сообщает пользователю о допущенной ошибке. Установка указателя стека необходима, потому что передача управления на метку ВОП производится из подпрограмм ОД различного уровня вложения (при этом значение указателя стека не контролируется).
Рассмотренный монитор является простым и эффективным системным средством, позволяющим пользователю проводить отладку своих программ. Пуск и останов программ с возможностью отображения и модификации регистров МП и рабочих ячеек памяти — основной инструмент контроля и поиска ошибок в программах.