Системное программное обеспечение. Рощин А.В. - 120 стр.

UptoLike

Составители: 

120
3. В тексте резидентной секции должна быть предусмотрена команда
возврата в вызывающую прикладную программу. Это может быть
команда IRET, если резидентная программа вызывается при помощи
программного прерывания int, это может быть просто RET, если
резидентная программа вызывается, как подпрограмма командой CALL,
это может быть и что-нибудь более экзотическоефантазии
программистов нет предела.
4. Процедура
init объявлена как ближняя, так как вызывающая процедура
находится в том же сегменте.
4.3 Обращение к резидентной программе
Для обращения к резидентной программе, как уже было сказано,
можно использовать область данных BIOS, предназначенную для связи
между процессами (40h:F0h – 40h:FFh). Эта область не используется
операционной системой, поэтому использование ее для вызова
резидентной программы вроде бы
не предвещает ничего неожиданного.
Так оно и есть, если разработчик одной (или не одной) резидентной
программы, уже находящейся в памяти, не использовал ту же область для
тех же целей. (Кстати, это относится и ко всем другим способам
обращения к резидентной программе.) Мы не будем рассматривать такую
возможность, хотя и в этом
случае есть простор для творчества.
Итак, имеется область размером 16 байтов, которая может быть
использована по желанию. Так как полный адрес, необходимый для
дальнего вызова или перехода требует четырех байтов, в этой области
можно разместить 4 таких адреса. Это может быть адрес входа в
резидентную секцию и 3 адреса, указывающих на таблицы данных,
расположенных где-то еще в памяти. Можно использовать эту область так
адрес точки входа в резидентную секцию (4 байта) и 12 байтов
непосредственных данных. Возможны различные промежуточные
варианты.
Рассмотрим вариант с двумя адресамиадресом точки входа в
резидентную секцию и адресом таблицы параметров (tabl_param) в
сегменте данных прикладной программы, которая должна быть передана
резидентной программе. Для обеспечения взаимодействия
инициализирующая секция резидентной программы записывает в слово
40h:F0h – смещение точки входа в резидентную секцию (например, offset
entry), в слово 40h:F2h – содержимое сегментного регистра CS.
Прикладная программа для вызова резидентной программы должна,
например, настроить сегмент расширения на начало области данных BIOS
(ES = 40h) и выполнить команду дальнего вызова call dword ptr es:0F0h
                                  120



3. В тексте резидентной секции должна быть предусмотрена команда
   возврата в вызывающую прикладную программу. Это может быть
   команда IRET, если резидентная программа вызывается при помощи
   программного прерывания int, это может быть просто RET, если
   резидентная программа вызывается, как подпрограмма командой CALL,
   это может быть и что-нибудь более экзотическое – фантазии
   программистов нет предела.
4. Процедура init объявлена как ближняя, так как вызывающая процедура
   находится в том же сегменте.

     4.3 Обращение к резидентной программе
       Для обращения к резидентной программе, как уже было сказано,
можно использовать область данных BIOS, предназначенную для связи
между процессами (40h:F0h – 40h:FFh). Эта область не используется
операционной системой, поэтому использование ее для вызова
резидентной программы вроде бы не предвещает ничего неожиданного.
Так оно и есть, если разработчик одной (или не одной) резидентной
программы, уже находящейся в памяти, не использовал ту же область для
тех же целей. (Кстати, это относится и ко всем другим способам
обращения к резидентной программе.) Мы не будем рассматривать такую
возможность, хотя и в этом случае есть простор для творчества.
       Итак, имеется область размером 16 байтов, которая может быть
использована по желанию. Так как полный адрес, необходимый для
дальнего вызова или перехода требует четырех байтов, в этой области
можно разместить 4 таких адреса. Это может быть адрес входа в
резидентную секцию и 3 адреса, указывающих на таблицы данных,
расположенных где-то еще в памяти. Можно использовать эту область так
– адрес точки входа в резидентную секцию (4 байта) и 12 байтов
непосредственных данных. Возможны различные промежуточные
варианты.
       Рассмотрим вариант с двумя адресами – адресом точки входа в
резидентную секцию и адресом таблицы параметров (tabl_param) в
сегменте данных прикладной программы, которая должна быть передана
резидентной       программе.     Для     обеспечения      взаимодействия
инициализирующая секция резидентной программы записывает в слово
40h:F0h – смещение точки входа в резидентную секцию (например, offset
entry), в слово 40h:F2h – содержимое сегментного регистра CS.
       Прикладная программа для вызова резидентной программы должна,
например, настроить сегмент расширения на начало области данных BIOS
(ES = 40h) и выполнить команду дальнего вызова call dword ptr es:0F0h