ПРОСТОЕ ФОРМИРОВАНИЕ МАССИВА
Формирование массива в МП системе, как правило, производится заполнением информацией, поступающей из внешних источников. Обслуживание этих внешних источников осуществляется специальными программами, которые назовем программами генерации кодов.
При фор-, мировании массива может производиться некоторая дополнительная обработка поступающей информации.Приведенная ниже программа выполняет простое формирование массива — без предварительной обработки (предполагается, что внешняя программа генерации кодов осуществляет при каждом своем вызове побайтную передачу очередного кода символа в регистр (А) и обеспечивает сохранение значений остальных регистров):
Структура программы представляет собой итеративный цикл. На каждой итерации выполняется запись в массив одного байта. Вызов подпрограммы генерации кодов выполняется командой PCHL. Так как эта команда
не обеспечивает сохранения адреса возврата в исходную программу, то он предварительно загружается в вершину стека командой PUSH В. После возврата из подпрограммы генерации кодов осуществляется запись полученного кода в формируемый массив по адресу (В, С), содержимое регистровой пары (В, С) увеличивается, а содержимое регистровой пары (D, Е), равное .количеству незаписанных байтов в формируемом массиве, уменьшается на единицу. Возврат из описываемой программы выполняется, когда количество незаписанных байтов становится равным нулю. Проверка содержимого регистровой пары (D, Е) на нулевое значение производится путем логического сложения содержимого регистров этой пары.
5.2.1. ФОРМИРОВАНИЕ МАССИВА С КОНТРОЛЕМ КОДОВ ОКОНЧАНИЯ И ЗАБОЯ
Состав функций предварительной обработки данных, возлагаемых на программы формирования массива, определяется в основном спецификой работы внешнего источника информации. Рассмотрим в качестве примера программу формирования буфера консольного ввода, данные для которого вводятся со стандартной клавиатуры.
Необходимо обеспечить ввод в буфер одной строки, представляющей цепочку символов, ограниченную кодом «ВК» — «Возврат каретки» (0DH), с возможностью коррекции вводимой строки посредством стирания последнего введенного символа консольной командой «ЗБ» — «Забой» (7FH). Программа имеет следующий вид:крементируется) указатель и проверяется достижение верхней границы буфера путем сравнения с нулем содержимого счетчика незаписанных байтов. При достижении этой границы осуществляется возврат из данной программы с установкой признака (флага) Z в единицу. Если полученный код является кодом «ВК», возврат выполняется с установкой флага Z в нуль. Если же полученный код является кодом «ЗБ», производится удаление из буфера последнего введенного символа посредством уменьшения на единицу (декрементирования) значения указателя. При этом контролируется достижение нижней границы буфера: текущее значение указателя сравни-
мы генерации кода, проверяется на равенство кодам ішн и 7FH. Если он не равен ни одному из них, то записывается в буфер, после чего увеличивается на единицу (ин-
вается с адресом начала буфера, который запоминается в стеке в начале работы программы. Коды «ВК» и «ЗБ» в буфер не записываются.
5.2.2. ФОРМИРОВАНИЕ МАССИВА С КОНТРОЛЕМ ПРОИЗВОЛЬНЫХ УПРАВЛЯЮЩИХ КОДОВ
Для унификации программ формирования массивов целесообразно предварительную обработку информации возложить на внешние подпрограммы, каждая из которых обрабатывает отдельный управляющий символ. Взаимодействие между программой формирования массива и подпрограммами обработки управляющих кодов можно осуществить с помощью специальной таблицы, структура которой приведена на рис. 5.2. Каждый элемент таблицы состоит из трех байтов и содержит значение управляющего кода, а также адрес подпрограммы его обработки. Последним байтом таблицы всегда является код 0FFH, что позволяет сделать таблицу переменной длины.
Ниже приведена программа формирования буферного массива, которая селектирует управляющие коды и в случае их обнаружения вызывает соответствующую подпрограмму обработки:
В этой программе в отличие от предыдущих программ проверка на достижение границы заполняемого массива выполняется не в конце итерации, а в начале. Этот прием позволяет корректно анализировать ситуацию, когда во входном параметре задается длина заполняемого массива, равная нулю. После вызова подпрограммы генерации кода полученный код сравнивается со всеми управляющими кодами, содержащимися в таблице. Если очередное сравнение оказывается успешным, то следующие два байта таблицы помещаются в регистровую пару (Н, L), в вершину стека загружается адрес начала итерации (адрес возврата) и выполняется команда PCHL. Тем самым осуществляется вызов подпрограммы обработки найденного управляющего символа. Параметры, передаваемые в подпрограммы обработки управляющих символов,
Рис. 5.2. Структура таблицы управляющих кодов
такие же, как и в программе ЗАПЗ, но в регистровых парах- (В,С) и (D, Е) содержатся не начальные, а текущие значения соответствующих переменных. Если ни одно из сравнений полученного кода с управляющими кодами таблицы не дает положительного результата, полученный код записывается в заполняемый массив, значения указателя и счетчика длины массива модифицируются и выполняется следующая итерация.
5.4.