Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_2011.doc
Скачиваний:
65
Добавлен:
09.12.2018
Размер:
1.15 Mб
Скачать

Запись адреса резидентной программы в область межзадачных связей

Резидентную программу можно оформить так, что адрес её будет находиться в области межзадачных связей, начало которой 40h:0f0h.

Размер области 16 байт.

В резидентной программе следует предусмотреть:

  • Исполняемую часть надо закончить директивой RET

  • Вызов программы с помощью команды CALL

Для записи адреса процедуры в область межзадачных связей используются следующие команды:

Setup:

mov ax, 40h

mov es,ax

mov es:0f0h, offset routine ;смещение в сегменте

mov es:0f2h, cs ;адрес сегмента

mov dx, finish ; оставляем программу резидентной

int 27h

Шаблон резидентной программы в таком случае имеет вид:

cseg segment

org 100h

assume cs:cseg, ds:cseg, ss:cseg

begin: jmp short setup

routine proc far ;начало процедуры

push ds ; сохранение регистров

; здесь тело процедуры

pop ds ; восстановление регистров

Iret ;возврат из процедуры

finish equ $ ; определение размера программы

routine endp

Setup:

mov ax, 40h

mov es,ax

mov es:0f0h, offset routine ;смещение в сегменте

mov es:0f2h, cs ;адрес сегмента

;оставляем программу резидентной

mov dx, finish ; размер программы

Int 27h ; оставляем программу резидентной

cseg ends

end begin

  1. Вызов резидентной программы через область межзадачных связей

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

mov ax, 40h

mov es,ax

call dword ptr es:0f0h

Передача параметров в резидентную программу

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

Перед записью параметров транзитная программа должна загрузить в регистр es адрес области межзадачных связей, затем записать в выбранные ячейки области межзадачных связей адрес массива параметров и содержимое регистра ds (адрес сегмента данных).

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

Примеры

В транзитной программе:

mov ax, 40h

mov es, ax

mov es:0f4h, offset mas ; адрес массива

mov es:0f6h, ds ; адрес сегмента данных

В резидентной программе:

mov ax, 40h

mov es, ax

mov si, es:0f4h ; загружаем адрес массива

mov ds, es:0f6h ; загружаем адрес сегмента данных

mov ax, [si] ; в ax – первое слово массива

mov bx, [si+2]

…….

;и так далее

  1. Замена существующего вектора прерывания

Программист должен обеспечить следующее:

  1. выделить буфер для временного хранения существующего вектора прерывания

  2. в установочной части резидентной программы записать вектор в эту буферную память

  3. при выходе из процедуры предусмотреть восстановление старого вектора прерывания

Пример:

В примере рассмотрена замена существующего вектора прерывания с номером 1ch другим вектором с последующим восстановлением после вызова резидентной программы.

cseg segment

org 100h

assume cs:cseg, ds:cseg, ss:cseg

begin:

jmp setup

routine proc far

jmp m1

p_cs dw 0 ; буфер для хранения

p_ip dw 0 ; существующего вектора

m1:

push ds

; здесь тело процедуры

cli ; запрещение прерываний на время выполнения операторов

; восстановление старого вектора прерывания

mov dx, p_ip ; загружаем старый вектор

mov ax, p_cs ; из памяти в регистры dx

mov ds,ax ; и ds

mov al,1ch ; прерывание 1ch в регистр al

mov ah, 25h ;

int 21h

sti ; разрешение прерываний

pop ds

iret

finish equ $

routine endp

setup:

mov al,1ch ; получение

mov ah,35h ; вектора

int 21h ; прерывания в регистры es и bx

mov p_ip, bx ; запоминаем старый

mov p_cs, es ; вектор 1ch

mov bx, offset routine

mov al, 1ch ; установка нового

mov ah, 25h ; вектора

int 21h ;1ch

mov dx, finish ; оставляем

int 27h ; программу резидентной

cseg ends

end begin

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]