19. Организация взаимодействия программ АЭИС на основе ПЭВМ: через прерывания ДОС

Скачать доклад: 19. Организация взаимодействия программ АЭИС на основе ПЭВМ: через прерывания ДОС

Организация взаимодействия программ АЭИС на основе ПЭВМ: через прерывания ДОС; на языке ассемблера; особенности ассемблерных процедур; резидентные программы; связывание программ через потоки ввода/вывода (5.2.).

Часто нужно организовать взаимодействие программ, которые составлены независимо и на разных языках программирования. В этом случае для взаимного вызова программ можно воспользоваться прерываниями ДОС .. В ДОС имеется специальное прерывание с десятичным номером 33 (шестнадцатеричный номер 21 Н), через которое любая прикладная программа может иметь доступ к внутренним функциям операционной системы. В их число входит несколько функций, с помощью которых может быть организован взаимный вызов программ.

Функция 31 Н (символ Н означает, что число является шестнадцатеричным) останавливает данную программу и оставляет ее в оперативной памяти резидентной, что дает возможность позднее вновь обратиться к ней через соответствующую  1точку входа 0.

Функция 4В Н обеспечивает вызов (загрузку с диска и переход на исполнение) другой программы. Когда вызванная программа закончится, управление автоматически передается вызывавшей программе.

Имеется вариант этой функции, когда файл только загружается с диска, но не исполняется; это используется для загрузки перекрывающихся сегментов программ или загрузки данных.

Функция 4С Н оканчивает работающую программу с засылкой в системный регистр AL кода возврата. Этот код может быть взят и проанализирован вызвавшей программой, для чего используется функция 4D. Функция 4D позволяет выяснить, по какой причине окончилась вызванная программа. Причины могут быть следующие: нормальное окончание; окончание в результате нажатия клавиш Ctrl + Break; окончание в результате фатальной ошибки внешнего устройства; окончание в результате применения функции 31.

Функции 48 Н и 49 Н позволяют соответственно запросить у ДОС оперативную память для работы программы и освободить ее. Функция 4А Н позволяет изменить (уменьшить или увеличить) выделенную память. Указанные функции дают возможность прикладной программе Большинство развитых систем программирования на основе ЯВУ обеспечивает обращение к прерываниям ДОС через специальные процедуры. При этом в регистры микропроцессора засылаются необходимые параметры. Например, в TurboPascal обращение к прерыванию ДОС осуществляется процедурой:

  ------------------------------¬
¦INTR (InterruptNo, Registers)¦
L------------------------------

Здесь параметр InterruptNo: INTE- GER - целое десятичное число, указывающее номер прерывания. Параметр Registers - это список базовых регистров микропроцессора:

--------------------------------------------------------¬
¦Registers = RECORD ¦
¦ AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags: INTEGER;¦
¦ END ¦
L--------------------------------------------------------

При обращении к прерыванию ДОС необходимо сначала занести в регистры нужные значения, а после завершения прерывания из них можно извлечь результаты работы.

Каждый из двухбайтовых регистров состоит двух однобайтовых (полу)регистров. Например, двухбайтовый регистр АХ состоит из двух однобайтовых - АН и AL. Однобайтовые регистры используются для передачи информации в ДОС. Так, по принятому в ДОС соглашению регистр АН служит для задания номера функции, вызываемой через любое прерывание.

Если, например, в прикладной программе применяется прерывание 21 Н и через него вызывается функция 4В Н (загрузка и запуск другой программы, то регистры заполняются следующим образом:

АН = 4В - номер вызываемой функции;

AL - признак загрузки программы с исполнением (AL = 0) или без исполнения (AL = 1);

DS : DX - два указанных регистра содержат "длинный" адрес строки с расширенным именем файла;

ES : BX - два этих регистра содержат длинный адрес управляющего блока запускаемой программы, который должен быть оформлен соответствующим образом.

Чтобы пользоваться указанным методом для организации взаимодействия программ, от программиста требуется определенная профессиональная подготовка, в частности, знание архитектуры ПЭВМ и ДОС, умение работать с значениями регистров и др.

Обладание этими приемами открывает доступ к мощным средствам управления программами. Использование разных языков программирования в этом случае не будет препятствием для для сочетания различных программ в рамках одной прикладной системы.

Взаимодействие с программами на языке ассемблера. . При создании сложных прикладных систем возникает необходимость в использовании машинно-ориентированных программ на языке ассемблера. Более того, с целью повышения быстродействия или сокращения требуемых объемов памяти на ассемблере иногда составляются значительные фрагменты программ.

В этих случаях возникает задача организации взаимодействия программ на ЯВУ с ассемблерными программами. Ассекмблерные программы могут объединяться с другими программами на уровне объектных модулей - с помощью компоновщика LINK. Главная проблема состоит во взаимной передаче параметров между такими программами.

Предположим, имеется ассемблерная процедура для установки положения курсора в дисплейном окне, которая должна быть доступна из программ на паскале. Описание соответствующей процедуры в паскаль-программе  может иметь вид:

  -------------------------------------------------¬
¦PROCEDURE CURPOS (LINE : INTEGER; POS; INTEGER);¦
¦ EXTERNAL; ¦
L-------------------------------------------------

Соответственно обращение к этой процедуре в паскальпрограмме может иметь вид:

  ------------------¬
¦ CURPOS (L, P); ¦
L------------------

Вызываемая программа на ассемблере имеет  следующий вид:

-----------------------------------------------------------------¬
¦WINDOW SEGMENT 'CODE' ;начало сегмента с именем WINDOW ¦
¦ PUBlIC CURPOS ;объявление "общедоступной" процедуры¦
¦ ;CURPOS ¦
¦CURPOS PROC FAR ;обеспечение "дальнего" вызова ¦
¦ ;процедуры ¦
¦ PUSH BP ;сохранение старого указателя на ¦
¦ ;"фрейм" ¦
¦ MOV BP, SP ;установка нового положения "фрейма" ¦
¦ PUSH АХ ;сохранение старых значений регистров¦
¦ PUSH ВХ ;АХ и ВХ ¦
¦ MOV BX, [BP+6] ;перенос в регистр ВХ 2-го параметра ¦
¦ MOV AX, [BP+8] ;перенос в регистр АХ 1-го параметра ¦
¦ ..... ¦
¦ (выполнение необходимых действий с использованием ¦
¦ параметров, сохраненных в регистрах АХ и ВХ) ¦
¦ ..... ¦
¦ POP ВХ ;восстановление регистров ВХ ¦
¦ POP АХ ;и АХ ¦
¦ POP ВР ;восстановление старого указателя ¦
¦ ;на стек ¦
¦ RET 8 ;возврат из процедуры со сдвигом ¦
¦ ;указателя стека на 8 байт назад ¦
¦CURPOS ENDP ;конец тела процедуры ¦
¦WINDOW END ;конец сегмента WINDOW ¦
L-----------------------------------------------------------------

В приведенном примере можно отметить несколько характерных деталей. Необходимо пояснить, что передача информации между вызывающей программой и данной процедурой осуществляется через стек - последовательность машинных слов, в которую данные "заталкиваются оператором PUSH и "выталкиваются" оператором POP. В стек автоматически заносятся также адрес возврата из процедуры. На текущую ячейку стека указывается содержание регистра SP. В регистре ВР находится указатель на фрейм, т.е. на ту часть стека, в которой хранятся данные, относящиеся к вызванной процедуре.

Особенности ассемблерных процедур .. В начале процедуры происходит сохранение в стеке старого значения регистра ВР, а также регистров АХ и ВХ, которые далее понадобятся для работы. Затем происходит важная операция - из стека командой MOV извлекаются значения двух параметров (заданных в обращении к паскаль-процедуре CURPOS как значения переменных L и Р). Эти значения заносятся соответственно в регистры АХ и ВХ и используются затем для выполнения основных действий - установки положения курсора в дисплейном окне. Положения параметров в стеке фиксированы относительно начала фрейма, заданного значением указателя ВР. Первые 4 байта заняты адресом возврата и старым значением SP, еще 2 байта - регистром счетчика команд, а параметры занимают по 2 следующих байта и поэтому адресуются конструкциями вида [BP + 6] и [BP + 8].

Следует иметь в виду, что при обращении к данной процедуре из паскаля стек заполняется от старших адресов к младшим, поэтому первый параметр находится дальше всего от позиции, на которую указывает регистр ВР.

Если бы параметров было 4, то они бы адресовались с помощью следующих выражений:

[BP + 6] - адрес 4-го двухбайтового параметра,
[BP + 8] - адрес 3-го двухбайтового параметра,
[BP + 10] - адрес 2-го двухбайтового параметра,
[BP + 12] - адрес 1-го двухбайтового параметра.

Важным моментом является то, что в данном моменте процедура CURPOS не меняет значений указанных параметров. Это позволяет передать их из паскаль-программы по значению  т.е. скопировать в стек. Если же предполагается изменение параметров в ассемблерной процедуре, то их нужно передавать по ссылке. Для этого описание процедуры CURPOS в паскаль-программе должно было бы содержать описания параметров с указателем VAR или VARS, т.е. иметь, например следующий вид:

--------------------------------------¬
¦PROCEDURE CURPOS (VAR LINE : INTEGER;¦
¦ VAR POS : INTEGER); EXTERNAL; ¦
L--------------------------------------

В этом случае и извлечение параметров в ассемблерной процедуре должно быть оформлено по-другому. Сначала нужно извлечь из стека на параметр (его адрес), а затем уже взять по этому адресу значение ячейки.

Резидентные программы .. Часто бывает необходимо, чтобы служебная программа сработала и осталась в памяти для того, чтобы могли позднее обращаться и другие программы. Такую программу называют резидентной, в отличие от обычных программ, которые по окончании работы освобождают занятую память.

ДОС-функция 31 Н осуществляет остановку программы и оставляет ее резидентной в памяти. К этой функции можно обращаться непосредственно из программы на ЯВУ, если в нем обеспечивается доступ к прерываниям ДОС. Можно выполнить те же действия, используя соответствующую подпрограмму на ассемблере.

Фрагмент программы на ассемблере, предназначенной для реализации указанной операции, имеет следующий вид:

----------------------------------------------------------------¬
¦ PUSH ES ;запоминание начала программы в стеке ¦
¦ .... ; ¦
¦ POP АХ ;выталкивание адреса начала ¦
¦ MOV DX, SEG ZZ ;занесение адреса конца программы ZZ в¦
¦ ;регистр DX ¦
¦ SUB DX, AX ;вычисление длины программы ¦
¦ INC DX ;увеличение длины на 1 ¦
¦ MOV АН, 31Н ;задание в регистре АН номера функции ¦
¦ ;31 Н (остановить задачу и сделать ее ¦
¦ ;резидентной) ¦
¦ INT 21Н ;обращение к прерыванию 21 Н ¦
¦ZZ SEGMENT 'ZZ' ;конец программы ZZ ¦
¦ZZ ENDS ¦
L----------------------------------------------------------------

Такая подпрограмма может быть соединена с любой другой программой на ЯВУ и использована для создания резидентной копии задачи.

Связывание программ через потоки ввода вывода .. Существует способ организации взаимодействия программ, основанный на стандартном сервисе, предоставляемом ДОС. В ДОС имеется понятие стандартного входного и стандартного выходного устройства. По умолчанию эти устройства соответствуют клавиатуре и дисплею. Имеется возможность переопределять стандартные устройства (или потоки)  ввода и вывода. Вместо клавиатуры и дисплея в этой роли могут выступать: 1) различные внешние устройства (принтер или коммуникационный канал), 2) любые дисковые файлы, 3) любые программы, работающие со стандартным входом и выходом.

В программе на ЯВУ стандартное входное и стандартное выходное устройства доступны через обычные операторы ввода/вывода (в паскале - READ и WRITE) Известно, что такие операторы позволяют обмениваться с клавиатурой и дисплеем, не задумываясь о том, что здесь кроются более широкие возможности.

В командной строке, обращенной к ДОС и предусматривающей запуск какой-либо программы, можно указать, откуда должен поступать в программу стандартный входной поток и куда должен направляться стандартный выходной поток. Благодаря этой возможности можно, не меняя программ, подключать к ним различные внешние устройства и файлы в качестве источников и приемников информации, а также организовывать взаимную передачу информации между отдельными программами. Если имя программы РР, то изменить ее входной и выходной потоки можно командой следующего вида:

  ----------------¬
¦ PP <from> to ¦
L----------------

Здесь символ "from" соответствует стандартному входному потоку, а символ "to" - стандартному выходному потоку.

Вместо символов from и to могут фигурировать имена файлов или зарезервированные имена внешних устройств (CON:, PRN:, LPT:1, LPT2:, COM:. COM1:, COM2:, AUX:). следует помнить, что одни внешние устройства работают только выходе (принтер), другие только на входе (диджитайзер), но есть и такие устройства, которые способны передавать информацию в обоих направлениях (модемы).

Если источником или приемником информации для данной программы является другая программа, то используется иное обозначение. Пример такого обозначения для трех взаимосвязанных программ: В данном примере стандартный выходной поток программы РР1 связывается со стандартным входным потоком РР2, а ее стандартный выходной поток, в свою очередь, поступает на стандартный вход программы РР3.

----------------¬
¦РР1 ¦ PP2 ¦ PP3¦
L----------------

Для обозначения таких цепочечных связей между программами используют термин "канал" (англ. pipe). В ДОС такой канал реализуется с помощью временного файла, который операционная система сама создает в корневом каталоге и уничтожает после окончания работы программ. В операционной системе Юникс этот же самый механизм реализуется при помощи внутренних файлов, благодаря чему обмен информацией между программами происходит гораздо быстрее.

Программа, которая принимает данные со стандартного входа и передает их (после обработки) на стандартный выход называется фильтром. К фильтрам относятся некоторые системные утилиты ДОС:

SORT, MORE. Программа-фильтр "пропускает" через себя соответствующую информацию, осуществляя ее переработку. Так, фильтр SORT обеспечивает сортировку пропускаемых через него текстовых данных;

MORE пропускает текст порциями по 24 строки с остановками (используется при выводе текстов файлов на экран). Можно составлять собственные программы-фильтры, которые будут осуществлять необходимую переработку последовательных потоков данных. Это может понадобиться, например, при организации связи ПЭВМ с большой ЭВМ, при необходимости перекодировки текстов и при других операциях.

Описанный способ взаимодействия программ имеет недостатки:

- передача информации между программами осуществляется только посредством последовательного потока, а не с помощью параметров, как это имеет место при процедурном взаимодействии;

- у программ занимаются стандартные каналы ввода-вывода;

- обмен происходит сравнительно медленно, поскольку реализуется через обычную файловую систему.