- •Резидентные программы
- •1.Введение
- •2. Особенности структуры программы типа com
- •3. Требования к структуре резидентной программы, запускаемой с помощью программного прерывания
- •4. Требования к структуре резидентной программы, запускаемой командой call
- •5. Последовательность выполнения работы
- •5.1 Изучение взаимодействия резидентной и транзитной программ через прерывание.
- •5.2. Изучение взаимодействия резидентной и транзитной программ через область межзадачных связей
- •6. Выполнить самостоятельно следующее задание.
- •Тексты программ
Тексты программ
TITLE PRER (COM)
CSEG SEGMENT
ORG 100H
ASSUME CS:CSEG, DS:CSEG, SS:CSEG, ES:CSEG
BEGIN PROC FAR
JMP INIT
MAS DB 'Резидентная программа сработала',0Ah,0Dh,24h
;-------------------------------------------------------------------------------
;Вход в секцию резидентной программы
ENTRY:
PUSH DS ;Программа сохраняет
PUSH AX ;содержимое
PUSH DX ;регистров в стеке.
PUSH CS ;Настройка регистра
POP DS ;сегмента данных.
MOV AH,9 ;Вывод
MOV DX,OFFSET MAS ;сообщения
INT 21H ;на экран.
POP DX ;Восстанавливаем
POP AX ;содержимое
POP DS ; регистров.
IRET ;Возврат в транзитную программу
FINISH: ;Конец резидентной части программы
BEGIN ENDP
;Инициализация резидентной программы
INIT:
MOV DX,OFFSET ENTRY ;адрес точки входа
MOV AL,60h ;номер прерывания
MOV AH,25h ;номер функции
INT 21h ;установить вектор прерывания
; Программа остается резидентной
MOV DX,OFFSET FINISH ;размер резидентной части программы
INT 27h
CSEG ENDS
END BEGIN
Рис. 1. Резидентная программа PRER.ASM
TITLE START (EXE)
SSEG SEGMENT PARA STACK 'STACK'
DB 60 DUP (0)
SSEG ENDS
;------------------------------------------
DSEG SEGMENT
TMAS DB 'О Т Л И Ч Н О !!!!',0AH,0DH,24H
DSEG ENDS
;---------------------------------------
CSEG SEGMENT PARA 'CODE'
BEGIN PROC FAR
ASSUME SS:SSEG, CS:CSEG, DS:DSEG
MOV AX, DSEG
MOV DS, AX
INT 60H ;Вызов резидентной программы
MOV AH,9 ;Вывод сообщения
MOV DX, OFFSET TMAS ;на экран.
INT 21H
MOV AX,4C00h ;Выход в систему
INT 21h
BEGIN ENDP
CSEG ENDS
END BEGIN
Рис. 2. Стартовая программа START.ASM
TITLE PRER1(COM)
CSEG SEGMENT
ORG 100H
ASSUME CS: CSEG,DS: CSEG,SS: CSEG, ES:CSEG
BEGIN PROC FAR
JMP INIT
MAS DB 'РЕЗИДЕНТНАЯ ПРОГРАММА ЗАПУЩЕНА',0ah,0dh,24h
;---------------------------------------------------------------------------------------
;начало резидентной программы
ENTRY:
PUSH DS ;Программа сохраняет
PUSH AX ;содержимое регистров
PUSH DX ;в стеке
PUSH CS ;Загрузка сегментного
POP DS ;регистра данных
;Вывод собственного сообщения mas на экран
MOV AH,9
MOV DX,OFFSET MAS
INT 21H
MOV AX, 40H ;Читаем адрес строки
MOV ES, AX ; TEXT в стартовой программе
MOV DX, ES:0F4H
MOV AX, ES:0F6h
MOV DS, AX ; Вывод строки TEXT
MOV AH, 9 ; на экран
INT 21h
POP DX ;Восстановление
POP AX ;содержимого
POP DS ;регистров
RET ;Выход в транзитную программу
FINISH: ;Конец резидентной части программы
BEGIN ENDP
; Инициализация резидентной части программы
INIT:
MOV AX, 40H ;Начало сегмента области межзадачных связей
MOV ES, AX
MOV ES:0f0h, OFFSET ENTRY ;Загрузка адреса программы
MOV ES:0f2h, CS ;в область межзадачных связей
;-----------------------------------------------------------------------------------------
; Программа остается резидентной
MOV DX, OFFSET FINISH
INT 27h
CSEG ENDS
END BEGIN
Рис. 3. Резидентная программа PRER1.ASM
TITLE START1 (EXE)
SSEG SEGMENT PARA STACK 'STACK'
DB 60 DUP (0)
SSEG ENDS
DSEG SEGMENT
MAST DB ’СТАРТОВАЯ ПРОГРАММА ЗАВЕРШЕНА, $’
TEXT DB ‘ИНФОРМАЦИЯ ИЗ СТАРТОВОЙ ПРОГРАММЫ, $’
DSEG ENDS
;---------------------------------------
CSEG SEGMENT PARA 'CODE'
BEGIN PROC FAR
ASSUME SS:SSEG, CS:CSEG, DS:DSEG
MOV AX, DSEG
MOV DS, AX
MOV AX, 40H ; Адрес сегмента области межзадачных
MOV ES, AX ;связей в регистр ES
MOV AX, OFFSET TEXT
MOV ES: 0F4H, AX ;загружаем адрес
MOV ES: 0F6H, DS ; строки TEXT
CALL DWORD PTR ES: 0F0H ;Вызов резидентной программы
MOV AH, 9 ;Вывод на экран строки MAST
MOV DX, OFFSET MAST
INT 21H
MOV AX, 4C00h ;Выход в систему
INT 21h
BEGIN ENDP
CSEG ENDS
END BEGIN
Рис. 4. Стартовая программа START1.ASM
