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

UptoLike

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

121
Конечно, резидентная программа должна быть объявлена дальней
процедурой и завершаться соответствующей командой дальнего возврата
RET (впрочем, ее можно явно сделать дальней – RETF).
Для передачи резидентной программе адреса таблицы параметров
прикладная программа должна записать в слово 40h:F4h – смещение
начала таблицы параметров в сегменте данных прикладной программы
(offset tabl_param), а в слово 40h:F6h – текущее содержимое сегментного
регистра DS.
Резидентная
программа для получения этих данных должна
поместить в какой-либо регистр, например SI, смещение начала таблицы из
40h:F4h, а в сегментный регистр, например в DS, сегментный адрес из
40h:F6h, после чего резидентная программа получает доступ к самим
данным. Возможная последовательность команд в резидентной программе
может быть такой
mov es,40h ; ES на начало области данных BIOS
mov bx,0F4h
mov si,es:[bx] ; SI = offset tabl_param
mov bx,0F6h
mov ax,es:[bx] ; AX – сегм. адрес tabl_param
mov ds,ax
mov ax,[si] ; Первое слово данных
mov bx,[si+2] ; Второе слово данных и т.д.
Не следует забывать сохранять в резидентной программе все
используемые ею регистры и восстанавливать их перед выходом из
программы. При этом следует осторожно пользоваться стеком для
сохранения регистров, так как системный стек не очень велик, а заводить
собственный стек в резидентной программе не всегда целесообразно.
Можно сохранять регистры в специально отведенных для
этого рабочих
переменных.
Более удобно использовать для вызова резидентной программы
один из свободных векторов прерывания (векторы 60h – 66h, а также F1h –
FFh). Инициализирующая секция резидентной программы должна
поместить свой адрес в один из свободных векторов, например, F1h:
mov ax,0
mov es,ax
mov es:0F1h*4,offset entry ; Адрес вектора F1h
mov es:0F1h*4+2,cs
В результате этой последовательности команд в векторе F1h
окажется адрес точки входа в резидентную программу. Для вызова
резидентной программы в этом случае достаточно использовать команду
int 0F1h. В этом случае резидентная программа, как и все программы
обработки прерывания должна завершаться командой возврата из
                                        121



       Конечно, резидентная программа должна быть объявлена дальней
процедурой и завершаться соответствующей командой дальнего возврата
RET (впрочем, ее можно явно сделать дальней – RETF).
       Для передачи резидентной программе адреса таблицы параметров
прикладная программа должна записать в слово 40h:F4h – смещение
начала таблицы параметров в сегменте данных прикладной программы
(offset tabl_param), а в слово 40h:F6h – текущее содержимое сегментного
регистра DS.
       Резидентная программа для получения этих данных должна
поместить в какой-либо регистр, например SI, смещение начала таблицы из
40h:F4h, а в сегментный регистр, например в DS, сегментный адрес из
40h:F6h, после чего резидентная программа получает доступ к самим
данным. Возможная последовательность команд в резидентной программе
может быть такой
mov   es,40h       ; ES на начало области данных BIOS
mov   bx,0F4h
mov   si,es:[bx]   ; SI = offset tabl_param
mov   bx,0F6h
mov   ax,es:[bx]   ; AX – сегм. адрес tabl_param
mov   ds,ax
mov   ax,[si]      ; Первое слово данных
mov   bx,[si+2]    ; Второе слово данных и т.д.
     Не следует забывать сохранять в резидентной программе все
используемые ею регистры и восстанавливать их перед выходом из
программы. При этом следует осторожно пользоваться стеком для
сохранения регистров, так как системный стек не очень велик, а заводить
собственный стек в резидентной программе не всегда целесообразно.
Можно сохранять регистры в специально отведенных для этого рабочих
переменных.
      Более удобно использовать для вызова резидентной программы
один из свободных векторов прерывания (векторы 60h – 66h, а также F1h –
FFh). Инициализирующая секция резидентной программы должна
поместить свой адрес в один из свободных векторов, например, F1h:
mov   ax,0
mov   es,ax
mov   es:0F1h*4,offset entry    ; Адрес вектора F1h
mov   es:0F1h*4+2,cs

      В результате этой последовательности команд в векторе F1h
окажется адрес точки входа в резидентную программу. Для вызова
резидентной программы в этом случае достаточно использовать команду
int 0F1h. В этом случае резидентная программа, как и все программы
обработки прерывания должна завершаться командой возврата из