ВУЗ:
Составители:
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. В этом случае резидентная программа, как и все программы
обработки прерывания должна завершаться командой возврата из
Страницы
- « первая
- ‹ предыдущая
- …
- 119
- 120
- 121
- 122
- 123
- …
- следующая ›
- последняя »
