Министерство Образования РФ
Новосибирский Государственный Технический Университет
Курсовая работа
Разработка прикладных обработчиков прерываний и резидентных программ в MS-DOS
Группа:
Вариант:
Студент:
Проверил:
Новосибирск — 2004
Задание.
Резидент, выводящий на экран квадрат типа красной дыры. Программа перехватывает прерывание int 1Ch и постоянно подменяет атрибуты символов внутри квадрата. Программа действует только в режиме экрана 3, поэтому вначале проверяется режим экрана. Вывод на экран (подмена атрибутов) реализуется путём непосредственного программирования памяти. Предусмотреть дрейф дыры по экрану в какую-либо сторону с восстановлением прежних атрибутов.
Структура программы.
Программа состоит из 1 модуля: резидентной части, осуществляющей загрузку и выгрузку резидента.
Установка резидента происходит при запуске программы с параметром “i” в командной строке. При этом выполняются следующие шаги:
1. Используя функцию 25h прерывания int 21h, в ES:BX получаем вектор прерывания 1ch.
2. Далее идет проверка на присутствие в памяти копии программы. Для этого в теле резидента предусмотрена метка ‘XOBR’. При наличии в памяти резидента по адресу ES:[BX-8] будет находиться строка ‘RBOX’.
3. Если резидент был установлен ранее, то программа завершается с соответствующим сообщением.
4. Если резидент не был установлен, то, используя функцию 25h прерывания int 21h, происходит установка нового вектора на прерывание 1ch. Старый вектор, полученный на шаге 1, сохраняется в переменной, которая останется в памяти вместе резидентом. Это сделано для того, чтобы позже можно было восстановить старый вектор.
5. Вызывается прерывание int 27h – выйти из программы и оставить резидент в памяти.
Удаление резидента происходит при запуске программы с параметром “u” в командной строке.
Аналогично пункту 1 в процедуре установки резидента. Аналогично пункту 2 в процедуре установки резидента. Если резидент не был установлен ранее, то программа завершается с соответствующим сообщением. Если резидент был установлен, то, используя функцию 25h прерывания int 21h, происходит восстановление старого вектора обработчика прерывания. Старый вектор при установке резидента в память был сохранен в переменной, которая может быть доступна по адресу ES:[BX-4]. Адрес ES:[BX], полученный на шаге 1, является сегментным адресом резидента, то, используя функцию 49h прерывания 21h, резидент удаляется из памяти.В программе резидента можно выделить следующие шаги:
Сохраняются в стеке флаги, регистры общего назначения и сегментные регистры. По адресу 40h:[49h] (область данных BIOS) проверяется текущий видео режим. Если текущий видео режим не 3, тогда переходим на пункт 7 Если резидент выполняется в первый раз, то переходим на пункт 6. Восстанавливается область экрана с измененными атрибутами. Увеличение значения переменной, в которой хранится текущее смещение ‘дыры’ на экране. Если переменная превышает значение, при котором ‘дыра’ выйдет за экран, то переменной присваивается начальное значение. Сохранение атрибутов символов области, где будет нарисована ‘дыра’. Изменение текущих атрибутов на “черный символ на красном фоне”. Изменение атрибутов происходит путем прямой записи в видео память. Восстановление регистров и флагов. Передача управления старому обработчику прерывания.Используемые сервисные функции.
INT 27h
Завершить работу программы и оставить резидент в памяти
INT 21h
- AH = 9h - Вывод строки на экран
DS:DX — адрес строки
- AH = 25h – Установка вектора прерывания
AL = номер вектора
DS:DX = адрес программы обработки прерывания AH = 35h – Получение вектора прерывания
AL = номер вектора
Выход: ES:BX — адрес программы обработки прерывания AH = 49h – Освобождение блока памяти
ES = сегментный адрес блока
INT 16h
- AH = 0 – Чтение символа из буфера
Выход: AL = код символа
AH = скан-код клавиши
Листинг программы.
.model tiny
.386
.code
org 100h
Start:
jmp Begin
Flag DB 0 ;0, если обработчик выполняется в 1 раз
ScrBuf DB 32 dup(0) ;Буфер для сохранения экрана
Xpos DW (10*80+36)*2+1-60 ;Текущее положение на экране
DB 'XOBR' ;Метка резидента(для проверки присутствия)
old_int DD 0 ;Вектор старого обработчика
Resident:
pushf ;Сохраняем флаги
pusha ;и все регистра общего назначения
push es
push ds
push cs
pop ds ;DS = CS
mov ax, 40h ;ES->область данных BIOS
mov es, ax
cmp byte ptr es:[49h], 3 ;Видео режим 3?
jnz ExitTSR ;Если нет - выход
mov ax, 0b800h ;Видео сегмент
mov es, ax
cmp Flag, 0
jz FirstStart
;Восстанавливаем предыдущую область
mov di, XPos ;ES:BX->адрес дыры в видео памяти
mov si, offset ScrBuf
mov cx, 4
RestoreRow:
push cx
mov cx, 8
RestoreCol:
mov al, [si]
inc si
mov es:[di], al
add di, 2
loop RestoreCol
add di, 144
pop cx
loop RestoreRow
;Перемещаем 'дыру' вправо
mov ax, XPos
add ax, 2
cmp ax, (10*80+36)*2+1+60 ;Если достигла края - возвращаем
jne @F ;на начало
mov ax, (10*80+36)*2+1-60
@F:
mov XPos, ax
FirstStart:
mov Flag, 1
;Сохраняем область экрана и рисуем в ней квадрат
mov di, XPos
mov si, offset ScrBuf
mov cx, 4 ;4 строки
NextRow:
push cx ;Сохраняем CX
mov cx, 8 ;8 столбцов
NextCol:
mov al, es:[di] ;
mov [si], al ;Сохраняем область, в которую будем рисовать
inc si ;
mov byte ptr es:[di], b ;Атрибут "черный символ на красном фоне"
add di, 2 ;Пропускаем символ
loop NextCol ;Следующий столбец
add di, 144 ;Строка ниже
pop cx ;Восстанавливаем CX
loop NextRow ;Следующая строка
ExitTSR:
pop ds
pop es ;Восстанавливаем регистры
popa
popf ;Восстанавливаем флаги
jmp dword ptr cs:[old_int] ;Переходим на старый обработчик
EndResident EQU $
Begin:
lea dx, sMsg1
mov bx, 81h ;CS:[BX] = командная строка
ReadCMD:
mov al, ds:[bx] ;Читаем командную строку
inc bx
cmp al, 'i'
jz InstallTSR
cmp al, 'u'
jz UninstallTSR
cmp al, 32
jz ReadCMD
jmp ExitProg
InstallTSR:
lea dx, sMsg3
mov ax, 351ch ;Получаем вектор на 1ch прерывание
int 21h
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем наличие резидента в памяти
jz ExitProg ;Выходим, если был установлен ранее
mov word ptr [old_int], bx ;Сохраняем старый вектор
mov word ptr [old_int+2], es ;
mov dx, offset Resident ;DS:DX = адрес нового обработчика
mov ax, 251ch ;Устанавливаем новый вектор
int 21h
lea dx, sMsg2 ;Выводим сообщение об успешной установке
mov ah, 9
int 21h
lea dx, EndResident ;Оставить обработчик и выйти из программы
int 27h
UninstallTSR:
lea dx, sMsg5
mov ax, 351ch
int 21h ;ES:BX = вектор 1ch прерывания
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем присутствие резидента в памяти
jnz ExitProg ;Выходим, если не установлен
push ds
lds dx, es:[bx-4] ;DS:DX = old_int
mov ax, 251ch
int 21h ;Восстановим старый вектор
pop ds
mov ah, 49h ;Освободить память, занимаемую TSR
int 21h
lea dx, sMsg4
ExitProg:
mov ah, 9 ;Вывод сообщения на экран
int 21h
ret ;Выход из программы
sMsg1 DB "Параметры командной строки:",13,10
DB "i - установить резидент",13,10
DB "u - удалить резидент",13,10,"
Министерство Образования РФ
Новосибирский Государственный Технический Университет
Курсовая работа
Разработка прикладных обработчиков прерываний и резидентных программ в MS-DOS
Группа:
Вариант:
Студент:
Проверил:
Новосибирск — 2004
Задание.
Резидент, выводящий на экран квадрат типа красной дыры. Программа перехватывает прерывание int 1Ch и постоянно подменяет атрибуты символов внутри квадрата. Программа действует только в режиме экрана 3, поэтому вначале проверяется режим экрана. Вывод на экран (подмена атрибутов) реализуется путём непосредственного программирования памяти. Предусмотреть дрейф дыры по экрану в какую-либо сторону с восстановлением прежних атрибутов.
Структура программы.
Программа состоит из 1 модуля: резидентной части, осуществляющей загрузку и выгрузку резидента.
Установка резидента происходит при запуске программы с параметром “i” в командной строке. При этом выполняются следующие шаги:
1. Используя функцию 25h прерывания int 21h, в ES:BX получаем вектор прерывания 1ch.
2. Далее идет проверка на присутствие в памяти копии программы. Для этого в теле резидента предусмотрена метка ‘XOBR’. При наличии в памяти резидента по адресу ES:[BX-8] будет находиться строка ‘RBOX’.
3. Если резидент был установлен ранее, то программа завершается с соответствующим сообщением.
4. Если резидент не был установлен, то, используя функцию 25h прерывания int 21h, происходит установка нового вектора на прерывание 1ch. Старый вектор, полученный на шаге 1, сохраняется в переменной, которая останется в памяти вместе резидентом. Это сделано для того, чтобы позже можно было восстановить старый вектор.
5. Вызывается прерывание int 27h – выйти из программы и оставить резидент в памяти.
Удаление резидента происходит при запуске программы с параметром “u” в командной строке.
Аналогично пункту 1 в процедуре установки резидента. Аналогично пункту 2 в процедуре установки резидента. Если резидент не был установлен ранее, то программа завершается с соответствующим сообщением. Если резидент был установлен, то, используя функцию 25h прерывания int 21h, происходит восстановление старого вектора обработчика прерывания. Старый вектор при установке резидента в память был сохранен в переменной, которая может быть доступна по адресу ES:[BX-4]. Адрес ES:[BX], полученный на шаге 1, является сегментным адресом резидента, то, используя функцию 49h прерывания 21h, резидент удаляется из памяти.В программе резидента можно выделить следующие шаги:
Сохраняются в стеке флаги, регистры общего назначения и сегментные регистры. По адресу 40h:[49h] (область данных BIOS) проверяется текущий видео режим. Если текущий видео режим не 3, тогда переходим на пункт 7 Если резидент выполняется в первый раз, то переходим на пункт 6. Восстанавливается область экрана с измененными атрибутами. Увеличение значения переменной, в которой хранится текущее смещение ‘дыры’ на экране. Если переменная превышает значение, при котором ‘дыра’ выйдет за экран, то переменной присваивается начальное значение. Сохранение атрибутов символов области, где будет нарисована ‘дыра’. Изменение текущих атрибутов на “черный символ на красном фоне”. Изменение атрибутов происходит путем прямой записи в видео память. Восстановление регистров и флагов. Передача управления старому обработчику прерывания.Используемые сервисные функции.
INT 27h
Завершить работу программы и оставить резидент в памяти
INT 21h
- AH = 9h - Вывод строки на экран
DS:DX — адрес строки
- AH = 25h – Установка вектора прерывания
AL = номер вектора
DS:DX = адрес программы обработки прерывания AH = 35h – Получение вектора прерывания
AL = номер вектора
Выход: ES:BX — адрес программы обработки прерывания AH = 49h – Освобождение блока памяти
ES = сегментный адрес блока
INT 16h
- AH = 0 – Чтение символа из буфера
Выход: AL = код символа
AH = скан-код клавиши
Листинг программы.
.model tiny
.386
.code
org 100h
Start:
jmp Begin
Flag DB 0 ;0, если обработчик выполняется в 1 раз
ScrBuf DB 32 dup(0) ;Буфер для сохранения экрана
Xpos DW (10*80+36)*2+1-60 ;Текущее положение на экране
DB 'XOBR' ;Метка резидента(для проверки присутствия)
old_int DD 0 ;Вектор старого обработчика
Resident:
pushf ;Сохраняем флаги
pusha ;и все регистра общего назначения
push es
push ds
push cs
pop ds ;DS = CS
mov ax, 40h ;ES->область данных BIOS
mov es, ax
cmp byte ptr es:[49h], 3 ;Видео режим 3?
jnz ExitTSR ;Если нет - выход
mov ax, 0b800h ;Видео сегмент
mov es, ax
cmp Flag, 0
jz FirstStart
;Восстанавливаем предыдущую область
mov di, XPos ;ES:BX->адрес дыры в видео памяти
mov si, offset ScrBuf
mov cx, 4
RestoreRow:
push cx
mov cx, 8
RestoreCol:
mov al, [si]
inc si
mov es:[di], al
add di, 2
loop RestoreCol
add di, 144
pop cx
loop RestoreRow
;Перемещаем 'дыру' вправо
mov ax, XPos
add ax, 2
cmp ax, (10*80+36)*2+1+60 ;Если достигла края - возвращаем
jne @F ;на начало
mov ax, (10*80+36)*2+1-60
@F:
mov XPos, ax
FirstStart:
mov Flag, 1
;Сохраняем область экрана и рисуем в ней квадрат
mov di, XPos
mov si, offset ScrBuf
mov cx, 4 ;4 строки
NextRow:
push cx ;Сохраняем CX
mov cx, 8 ;8 столбцов
NextCol:
mov al, es:[di] ;
mov [si], al ;Сохраняем область, в которую будем рисовать
inc si ;
mov byte ptr es:[di], b ;Атрибут "черный символ на красном фоне"
add di, 2 ;Пропускаем символ
loop NextCol ;Следующий столбец
add di, 144 ;Строка ниже
pop cx ;Восстанавливаем CX
loop NextRow ;Следующая строка
ExitTSR:
pop ds
pop es ;Восстанавливаем регистры
popa
popf ;Восстанавливаем флаги
jmp dword ptr cs:[old_int] ;Переходим на старый обработчик
EndResident EQU $
Begin:
lea dx, sMsg1
mov bx, 81h ;CS:[BX] = командная строка
ReadCMD:
mov al, ds:[bx] ;Читаем командную строку
inc bx
cmp al, 'i'
jz InstallTSR
cmp al, 'u'
jz UninstallTSR
cmp al, 32
jz ReadCMD
jmp ExitProg
InstallTSR:
lea dx, sMsg3
mov ax, 351ch ;Получаем вектор на 1ch прерывание
int 21h
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем наличие резидента в памяти
jz ExitProg ;Выходим, если был установлен ранее
mov word ptr [old_int], bx ;Сохраняем старый вектор
mov word ptr [old_int+2], es ;
mov dx, offset Resident ;DS:DX = адрес нового обработчика
mov ax, 251ch ;Устанавливаем новый вектор
int 21h
lea dx, sMsg2 ;Выводим сообщение об успешной установке
mov ah, 9
int 21h
lea dx, EndResident ;Оставить обработчик и выйти из программы
int 27h
UninstallTSR:
lea dx, sMsg5
mov ax, 351ch
int 21h ;ES:BX = вектор 1ch прерывания
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем присутствие резидента в памяти
jnz ExitProg ;Выходим, если не установлен
push ds
lds dx, es:[bx-4] ;DS:DX = old_int
mov ax, 251ch
int 21h ;Восстановим старый вектор
pop ds
mov ah, 49h ;Освободить память, занимаемую TSR
int 21h
lea dx, sMsg4
ExitProg:
mov ah, 9 ;Вывод сообщения на экран
int 21h
ret ;Выход из программы
sMsg1 DB "Параметры командной строки:",13,10
DB "i - установить резидент",13,10
DB "u - удалить резидент",13,10,"$"
sMsg2 DB "Резидент был успешно установлен.","$"
sMsg3 DB "В памяти уже есть копия резидента.","$"
sMsg4 DB "Резиден был выгружен.","$"
sMsg5 DB "Резидент не установлен.","$"
END Start
Описание программы.
При запуске программы без указания верных параметров командной строки на экран выводится список параметров с указанием их действий. Для установки резидента в память следует загрузить программу с ключом ‘i’. Чтобы удалить резидент следует использовать ключ ‘u’. После установки резидента на экране появится красный квадрат, который будет перемещаться слева направо. При достижении правого края экрана квадрат переместится в первоначальное положение. Перемещение красного квадрата происходит с восстановлением атрибутов области экрана, в которой прежде находился квадрат. После удаления резидента из памяти квадрат исчезнет.
quot;sMsg2 DB "Резидент был успешно установлен.","
Министерство Образования РФ
Новосибирский Государственный Технический Университет
Курсовая работа
Разработка прикладных обработчиков прерываний и резидентных программ в MS-DOS
Группа:
Вариант:
Студент:
Проверил:
Новосибирск — 2004
Задание.
Резидент, выводящий на экран квадрат типа красной дыры. Программа перехватывает прерывание int 1Ch и постоянно подменяет атрибуты символов внутри квадрата. Программа действует только в режиме экрана 3, поэтому вначале проверяется режим экрана. Вывод на экран (подмена атрибутов) реализуется путём непосредственного программирования памяти. Предусмотреть дрейф дыры по экрану в какую-либо сторону с восстановлением прежних атрибутов.
Структура программы.
Программа состоит из 1 модуля: резидентной части, осуществляющей загрузку и выгрузку резидента.
Установка резидента происходит при запуске программы с параметром “i” в командной строке. При этом выполняются следующие шаги:
1. Используя функцию 25h прерывания int 21h, в ES:BX получаем вектор прерывания 1ch.
2. Далее идет проверка на присутствие в памяти копии программы. Для этого в теле резидента предусмотрена метка ‘XOBR’. При наличии в памяти резидента по адресу ES:[BX-8] будет находиться строка ‘RBOX’.
3. Если резидент был установлен ранее, то программа завершается с соответствующим сообщением.
4. Если резидент не был установлен, то, используя функцию 25h прерывания int 21h, происходит установка нового вектора на прерывание 1ch. Старый вектор, полученный на шаге 1, сохраняется в переменной, которая останется в памяти вместе резидентом. Это сделано для того, чтобы позже можно было восстановить старый вектор.
5. Вызывается прерывание int 27h – выйти из программы и оставить резидент в памяти.
Удаление резидента происходит при запуске программы с параметром “u” в командной строке.
Аналогично пункту 1 в процедуре установки резидента. Аналогично пункту 2 в процедуре установки резидента. Если резидент не был установлен ранее, то программа завершается с соответствующим сообщением. Если резидент был установлен, то, используя функцию 25h прерывания int 21h, происходит восстановление старого вектора обработчика прерывания. Старый вектор при установке резидента в память был сохранен в переменной, которая может быть доступна по адресу ES:[BX-4]. Адрес ES:[BX], полученный на шаге 1, является сегментным адресом резидента, то, используя функцию 49h прерывания 21h, резидент удаляется из памяти.В программе резидента можно выделить следующие шаги:
Сохраняются в стеке флаги, регистры общего назначения и сегментные регистры. По адресу 40h:[49h] (область данных BIOS) проверяется текущий видео режим. Если текущий видео режим не 3, тогда переходим на пункт 7 Если резидент выполняется в первый раз, то переходим на пункт 6. Восстанавливается область экрана с измененными атрибутами. Увеличение значения переменной, в которой хранится текущее смещение ‘дыры’ на экране. Если переменная превышает значение, при котором ‘дыра’ выйдет за экран, то переменной присваивается начальное значение. Сохранение атрибутов символов области, где будет нарисована ‘дыра’. Изменение текущих атрибутов на “черный символ на красном фоне”. Изменение атрибутов происходит путем прямой записи в видео память. Восстановление регистров и флагов. Передача управления старому обработчику прерывания.Используемые сервисные функции.
INT 27h
Завершить работу программы и оставить резидент в памяти
INT 21h
- AH = 9h - Вывод строки на экран
DS:DX — адрес строки
- AH = 25h – Установка вектора прерывания
AL = номер вектора
DS:DX = адрес программы обработки прерывания AH = 35h – Получение вектора прерывания
AL = номер вектора
Выход: ES:BX — адрес программы обработки прерывания AH = 49h – Освобождение блока памяти
ES = сегментный адрес блока
INT 16h
- AH = 0 – Чтение символа из буфера
Выход: AL = код символа
AH = скан-код клавиши
Листинг программы.
.model tiny
.386
.code
org 100h
Start:
jmp Begin
Flag DB 0 ;0, если обработчик выполняется в 1 раз
ScrBuf DB 32 dup(0) ;Буфер для сохранения экрана
Xpos DW (10*80+36)*2+1-60 ;Текущее положение на экране
DB 'XOBR' ;Метка резидента(для проверки присутствия)
old_int DD 0 ;Вектор старого обработчика
Resident:
pushf ;Сохраняем флаги
pusha ;и все регистра общего назначения
push es
push ds
push cs
pop ds ;DS = CS
mov ax, 40h ;ES->область данных BIOS
mov es, ax
cmp byte ptr es:[49h], 3 ;Видео режим 3?
jnz ExitTSR ;Если нет - выход
mov ax, 0b800h ;Видео сегмент
mov es, ax
cmp Flag, 0
jz FirstStart
;Восстанавливаем предыдущую область
mov di, XPos ;ES:BX->адрес дыры в видео памяти
mov si, offset ScrBuf
mov cx, 4
RestoreRow:
push cx
mov cx, 8
RestoreCol:
mov al, [si]
inc si
mov es:[di], al
add di, 2
loop RestoreCol
add di, 144
pop cx
loop RestoreRow
;Перемещаем 'дыру' вправо
mov ax, XPos
add ax, 2
cmp ax, (10*80+36)*2+1+60 ;Если достигла края - возвращаем
jne @F ;на начало
mov ax, (10*80+36)*2+1-60
@F:
mov XPos, ax
FirstStart:
mov Flag, 1
;Сохраняем область экрана и рисуем в ней квадрат
mov di, XPos
mov si, offset ScrBuf
mov cx, 4 ;4 строки
NextRow:
push cx ;Сохраняем CX
mov cx, 8 ;8 столбцов
NextCol:
mov al, es:[di] ;
mov [si], al ;Сохраняем область, в которую будем рисовать
inc si ;
mov byte ptr es:[di], b ;Атрибут "черный символ на красном фоне"
add di, 2 ;Пропускаем символ
loop NextCol ;Следующий столбец
add di, 144 ;Строка ниже
pop cx ;Восстанавливаем CX
loop NextRow ;Следующая строка
ExitTSR:
pop ds
pop es ;Восстанавливаем регистры
popa
popf ;Восстанавливаем флаги
jmp dword ptr cs:[old_int] ;Переходим на старый обработчик
EndResident EQU $
Begin:
lea dx, sMsg1
mov bx, 81h ;CS:[BX] = командная строка
ReadCMD:
mov al, ds:[bx] ;Читаем командную строку
inc bx
cmp al, 'i'
jz InstallTSR
cmp al, 'u'
jz UninstallTSR
cmp al, 32
jz ReadCMD
jmp ExitProg
InstallTSR:
lea dx, sMsg3
mov ax, 351ch ;Получаем вектор на 1ch прерывание
int 21h
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем наличие резидента в памяти
jz ExitProg ;Выходим, если был установлен ранее
mov word ptr [old_int], bx ;Сохраняем старый вектор
mov word ptr [old_int+2], es ;
mov dx, offset Resident ;DS:DX = адрес нового обработчика
mov ax, 251ch ;Устанавливаем новый вектор
int 21h
lea dx, sMsg2 ;Выводим сообщение об успешной установке
mov ah, 9
int 21h
lea dx, EndResident ;Оставить обработчик и выйти из программы
int 27h
UninstallTSR:
lea dx, sMsg5
mov ax, 351ch
int 21h ;ES:BX = вектор 1ch прерывания
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем присутствие резидента в памяти
jnz ExitProg ;Выходим, если не установлен
push ds
lds dx, es:[bx-4] ;DS:DX = old_int
mov ax, 251ch
int 21h ;Восстановим старый вектор
pop ds
mov ah, 49h ;Освободить память, занимаемую TSR
int 21h
lea dx, sMsg4
ExitProg:
mov ah, 9 ;Вывод сообщения на экран
int 21h
ret ;Выход из программы
sMsg1 DB "Параметры командной строки:",13,10
DB "i - установить резидент",13,10
DB "u - удалить резидент",13,10,"$"
sMsg2 DB "Резидент был успешно установлен.","$"
sMsg3 DB "В памяти уже есть копия резидента.","$"
sMsg4 DB "Резиден был выгружен.","$"
sMsg5 DB "Резидент не установлен.","$"
END Start
Описание программы.
При запуске программы без указания верных параметров командной строки на экран выводится список параметров с указанием их действий. Для установки резидента в память следует загрузить программу с ключом ‘i’. Чтобы удалить резидент следует использовать ключ ‘u’. После установки резидента на экране появится красный квадрат, который будет перемещаться слева направо. При достижении правого края экрана квадрат переместится в первоначальное положение. Перемещение красного квадрата происходит с восстановлением атрибутов области экрана, в которой прежде находился квадрат. После удаления резидента из памяти квадрат исчезнет.
quot;sMsg3 DB "В памяти уже есть копия резидента.","
Министерство Образования РФ
Новосибирский Государственный Технический Университет
Курсовая работа
Разработка прикладных обработчиков прерываний и резидентных программ в MS-DOS
Группа:
Вариант:
Студент:
Проверил:
Новосибирск — 2004
Задание.
Резидент, выводящий на экран квадрат типа красной дыры. Программа перехватывает прерывание int 1Ch и постоянно подменяет атрибуты символов внутри квадрата. Программа действует только в режиме экрана 3, поэтому вначале проверяется режим экрана. Вывод на экран (подмена атрибутов) реализуется путём непосредственного программирования памяти. Предусмотреть дрейф дыры по экрану в какую-либо сторону с восстановлением прежних атрибутов.
Структура программы.
Программа состоит из 1 модуля: резидентной части, осуществляющей загрузку и выгрузку резидента.
Установка резидента происходит при запуске программы с параметром “i” в командной строке. При этом выполняются следующие шаги:
1. Используя функцию 25h прерывания int 21h, в ES:BX получаем вектор прерывания 1ch.
2. Далее идет проверка на присутствие в памяти копии программы. Для этого в теле резидента предусмотрена метка ‘XOBR’. При наличии в памяти резидента по адресу ES:[BX-8] будет находиться строка ‘RBOX’.
3. Если резидент был установлен ранее, то программа завершается с соответствующим сообщением.
4. Если резидент не был установлен, то, используя функцию 25h прерывания int 21h, происходит установка нового вектора на прерывание 1ch. Старый вектор, полученный на шаге 1, сохраняется в переменной, которая останется в памяти вместе резидентом. Это сделано для того, чтобы позже можно было восстановить старый вектор.
5. Вызывается прерывание int 27h – выйти из программы и оставить резидент в памяти.
Удаление резидента происходит при запуске программы с параметром “u” в командной строке.
Аналогично пункту 1 в процедуре установки резидента. Аналогично пункту 2 в процедуре установки резидента. Если резидент не был установлен ранее, то программа завершается с соответствующим сообщением. Если резидент был установлен, то, используя функцию 25h прерывания int 21h, происходит восстановление старого вектора обработчика прерывания. Старый вектор при установке резидента в память был сохранен в переменной, которая может быть доступна по адресу ES:[BX-4]. Адрес ES:[BX], полученный на шаге 1, является сегментным адресом резидента, то, используя функцию 49h прерывания 21h, резидент удаляется из памяти.В программе резидента можно выделить следующие шаги:
Сохраняются в стеке флаги, регистры общего назначения и сегментные регистры. По адресу 40h:[49h] (область данных BIOS) проверяется текущий видео режим. Если текущий видео режим не 3, тогда переходим на пункт 7 Если резидент выполняется в первый раз, то переходим на пункт 6. Восстанавливается область экрана с измененными атрибутами. Увеличение значения переменной, в которой хранится текущее смещение ‘дыры’ на экране. Если переменная превышает значение, при котором ‘дыра’ выйдет за экран, то переменной присваивается начальное значение. Сохранение атрибутов символов области, где будет нарисована ‘дыра’. Изменение текущих атрибутов на “черный символ на красном фоне”. Изменение атрибутов происходит путем прямой записи в видео память. Восстановление регистров и флагов. Передача управления старому обработчику прерывания.Используемые сервисные функции.
INT 27h
Завершить работу программы и оставить резидент в памяти
INT 21h
- AH = 9h - Вывод строки на экран
DS:DX — адрес строки
- AH = 25h – Установка вектора прерывания
AL = номер вектора
DS:DX = адрес программы обработки прерывания AH = 35h – Получение вектора прерывания
AL = номер вектора
Выход: ES:BX — адрес программы обработки прерывания AH = 49h – Освобождение блока памяти
ES = сегментный адрес блока
INT 16h
- AH = 0 – Чтение символа из буфера
Выход: AL = код символа
AH = скан-код клавиши
Листинг программы.
.model tiny
.386
.code
org 100h
Start:
jmp Begin
Flag DB 0 ;0, если обработчик выполняется в 1 раз
ScrBuf DB 32 dup(0) ;Буфер для сохранения экрана
Xpos DW (10*80+36)*2+1-60 ;Текущее положение на экране
DB 'XOBR' ;Метка резидента(для проверки присутствия)
old_int DD 0 ;Вектор старого обработчика
Resident:
pushf ;Сохраняем флаги
pusha ;и все регистра общего назначения
push es
push ds
push cs
pop ds ;DS = CS
mov ax, 40h ;ES->область данных BIOS
mov es, ax
cmp byte ptr es:[49h], 3 ;Видео режим 3?
jnz ExitTSR ;Если нет - выход
mov ax, 0b800h ;Видео сегмент
mov es, ax
cmp Flag, 0
jz FirstStart
;Восстанавливаем предыдущую область
mov di, XPos ;ES:BX->адрес дыры в видео памяти
mov si, offset ScrBuf
mov cx, 4
RestoreRow:
push cx
mov cx, 8
RestoreCol:
mov al, [si]
inc si
mov es:[di], al
add di, 2
loop RestoreCol
add di, 144
pop cx
loop RestoreRow
;Перемещаем 'дыру' вправо
mov ax, XPos
add ax, 2
cmp ax, (10*80+36)*2+1+60 ;Если достигла края - возвращаем
jne @F ;на начало
mov ax, (10*80+36)*2+1-60
@F:
mov XPos, ax
FirstStart:
mov Flag, 1
;Сохраняем область экрана и рисуем в ней квадрат
mov di, XPos
mov si, offset ScrBuf
mov cx, 4 ;4 строки
NextRow:
push cx ;Сохраняем CX
mov cx, 8 ;8 столбцов
NextCol:
mov al, es:[di] ;
mov [si], al ;Сохраняем область, в которую будем рисовать
inc si ;
mov byte ptr es:[di], b ;Атрибут "черный символ на красном фоне"
add di, 2 ;Пропускаем символ
loop NextCol ;Следующий столбец
add di, 144 ;Строка ниже
pop cx ;Восстанавливаем CX
loop NextRow ;Следующая строка
ExitTSR:
pop ds
pop es ;Восстанавливаем регистры
popa
popf ;Восстанавливаем флаги
jmp dword ptr cs:[old_int] ;Переходим на старый обработчик
EndResident EQU $
Begin:
lea dx, sMsg1
mov bx, 81h ;CS:[BX] = командная строка
ReadCMD:
mov al, ds:[bx] ;Читаем командную строку
inc bx
cmp al, 'i'
jz InstallTSR
cmp al, 'u'
jz UninstallTSR
cmp al, 32
jz ReadCMD
jmp ExitProg
InstallTSR:
lea dx, sMsg3
mov ax, 351ch ;Получаем вектор на 1ch прерывание
int 21h
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем наличие резидента в памяти
jz ExitProg ;Выходим, если был установлен ранее
mov word ptr [old_int], bx ;Сохраняем старый вектор
mov word ptr [old_int+2], es ;
mov dx, offset Resident ;DS:DX = адрес нового обработчика
mov ax, 251ch ;Устанавливаем новый вектор
int 21h
lea dx, sMsg2 ;Выводим сообщение об успешной установке
mov ah, 9
int 21h
lea dx, EndResident ;Оставить обработчик и выйти из программы
int 27h
UninstallTSR:
lea dx, sMsg5
mov ax, 351ch
int 21h ;ES:BX = вектор 1ch прерывания
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем присутствие резидента в памяти
jnz ExitProg ;Выходим, если не установлен
push ds
lds dx, es:[bx-4] ;DS:DX = old_int
mov ax, 251ch
int 21h ;Восстановим старый вектор
pop ds
mov ah, 49h ;Освободить память, занимаемую TSR
int 21h
lea dx, sMsg4
ExitProg:
mov ah, 9 ;Вывод сообщения на экран
int 21h
ret ;Выход из программы
sMsg1 DB "Параметры командной строки:",13,10
DB "i - установить резидент",13,10
DB "u - удалить резидент",13,10,"$"
sMsg2 DB "Резидент был успешно установлен.","$"
sMsg3 DB "В памяти уже есть копия резидента.","$"
sMsg4 DB "Резиден был выгружен.","$"
sMsg5 DB "Резидент не установлен.","$"
END Start
Описание программы.
При запуске программы без указания верных параметров командной строки на экран выводится список параметров с указанием их действий. Для установки резидента в память следует загрузить программу с ключом ‘i’. Чтобы удалить резидент следует использовать ключ ‘u’. После установки резидента на экране появится красный квадрат, который будет перемещаться слева направо. При достижении правого края экрана квадрат переместится в первоначальное положение. Перемещение красного квадрата происходит с восстановлением атрибутов области экрана, в которой прежде находился квадрат. После удаления резидента из памяти квадрат исчезнет.
quot;sMsg4 DB "Резиден был выгружен.","
Министерство Образования РФ
Новосибирский Государственный Технический Университет
Курсовая работа
Разработка прикладных обработчиков прерываний и резидентных программ в MS-DOS
Группа:
Вариант:
Студент:
Проверил:
Новосибирск — 2004
Задание.
Резидент, выводящий на экран квадрат типа красной дыры. Программа перехватывает прерывание int 1Ch и постоянно подменяет атрибуты символов внутри квадрата. Программа действует только в режиме экрана 3, поэтому вначале проверяется режим экрана. Вывод на экран (подмена атрибутов) реализуется путём непосредственного программирования памяти. Предусмотреть дрейф дыры по экрану в какую-либо сторону с восстановлением прежних атрибутов.
Структура программы.
Программа состоит из 1 модуля: резидентной части, осуществляющей загрузку и выгрузку резидента.
Установка резидента происходит при запуске программы с параметром “i” в командной строке. При этом выполняются следующие шаги:
1. Используя функцию 25h прерывания int 21h, в ES:BX получаем вектор прерывания 1ch.
2. Далее идет проверка на присутствие в памяти копии программы. Для этого в теле резидента предусмотрена метка ‘XOBR’. При наличии в памяти резидента по адресу ES:[BX-8] будет находиться строка ‘RBOX’.
3. Если резидент был установлен ранее, то программа завершается с соответствующим сообщением.
4. Если резидент не был установлен, то, используя функцию 25h прерывания int 21h, происходит установка нового вектора на прерывание 1ch. Старый вектор, полученный на шаге 1, сохраняется в переменной, которая останется в памяти вместе резидентом. Это сделано для того, чтобы позже можно было восстановить старый вектор.
5. Вызывается прерывание int 27h – выйти из программы и оставить резидент в памяти.
Удаление резидента происходит при запуске программы с параметром “u” в командной строке.
Аналогично пункту 1 в процедуре установки резидента. Аналогично пункту 2 в процедуре установки резидента. Если резидент не был установлен ранее, то программа завершается с соответствующим сообщением. Если резидент был установлен, то, используя функцию 25h прерывания int 21h, происходит восстановление старого вектора обработчика прерывания. Старый вектор при установке резидента в память был сохранен в переменной, которая может быть доступна по адресу ES:[BX-4]. Адрес ES:[BX], полученный на шаге 1, является сегментным адресом резидента, то, используя функцию 49h прерывания 21h, резидент удаляется из памяти.В программе резидента можно выделить следующие шаги:
Сохраняются в стеке флаги, регистры общего назначения и сегментные регистры. По адресу 40h:[49h] (область данных BIOS) проверяется текущий видео режим. Если текущий видео режим не 3, тогда переходим на пункт 7 Если резидент выполняется в первый раз, то переходим на пункт 6. Восстанавливается область экрана с измененными атрибутами. Увеличение значения переменной, в которой хранится текущее смещение ‘дыры’ на экране. Если переменная превышает значение, при котором ‘дыра’ выйдет за экран, то переменной присваивается начальное значение. Сохранение атрибутов символов области, где будет нарисована ‘дыра’. Изменение текущих атрибутов на “черный символ на красном фоне”. Изменение атрибутов происходит путем прямой записи в видео память. Восстановление регистров и флагов. Передача управления старому обработчику прерывания.Используемые сервисные функции.
INT 27h
Завершить работу программы и оставить резидент в памяти
INT 21h
- AH = 9h - Вывод строки на экран
DS:DX — адрес строки
- AH = 25h – Установка вектора прерывания
AL = номер вектора
DS:DX = адрес программы обработки прерывания AH = 35h – Получение вектора прерывания
AL = номер вектора
Выход: ES:BX — адрес программы обработки прерывания AH = 49h – Освобождение блока памяти
ES = сегментный адрес блока
INT 16h
- AH = 0 – Чтение символа из буфера
Выход: AL = код символа
AH = скан-код клавиши
Листинг программы.
.model tiny
.386
.code
org 100h
Start:
jmp Begin
Flag DB 0 ;0, если обработчик выполняется в 1 раз
ScrBuf DB 32 dup(0) ;Буфер для сохранения экрана
Xpos DW (10*80+36)*2+1-60 ;Текущее положение на экране
DB 'XOBR' ;Метка резидента(для проверки присутствия)
old_int DD 0 ;Вектор старого обработчика
Resident:
pushf ;Сохраняем флаги
pusha ;и все регистра общего назначения
push es
push ds
push cs
pop ds ;DS = CS
mov ax, 40h ;ES->область данных BIOS
mov es, ax
cmp byte ptr es:[49h], 3 ;Видео режим 3?
jnz ExitTSR ;Если нет - выход
mov ax, 0b800h ;Видео сегмент
mov es, ax
cmp Flag, 0
jz FirstStart
;Восстанавливаем предыдущую область
mov di, XPos ;ES:BX->адрес дыры в видео памяти
mov si, offset ScrBuf
mov cx, 4
RestoreRow:
push cx
mov cx, 8
RestoreCol:
mov al, [si]
inc si
mov es:[di], al
add di, 2
loop RestoreCol
add di, 144
pop cx
loop RestoreRow
;Перемещаем 'дыру' вправо
mov ax, XPos
add ax, 2
cmp ax, (10*80+36)*2+1+60 ;Если достигла края - возвращаем
jne @F ;на начало
mov ax, (10*80+36)*2+1-60
@F:
mov XPos, ax
FirstStart:
mov Flag, 1
;Сохраняем область экрана и рисуем в ней квадрат
mov di, XPos
mov si, offset ScrBuf
mov cx, 4 ;4 строки
NextRow:
push cx ;Сохраняем CX
mov cx, 8 ;8 столбцов
NextCol:
mov al, es:[di] ;
mov [si], al ;Сохраняем область, в которую будем рисовать
inc si ;
mov byte ptr es:[di], b ;Атрибут "черный символ на красном фоне"
add di, 2 ;Пропускаем символ
loop NextCol ;Следующий столбец
add di, 144 ;Строка ниже
pop cx ;Восстанавливаем CX
loop NextRow ;Следующая строка
ExitTSR:
pop ds
pop es ;Восстанавливаем регистры
popa
popf ;Восстанавливаем флаги
jmp dword ptr cs:[old_int] ;Переходим на старый обработчик
EndResident EQU $
Begin:
lea dx, sMsg1
mov bx, 81h ;CS:[BX] = командная строка
ReadCMD:
mov al, ds:[bx] ;Читаем командную строку
inc bx
cmp al, 'i'
jz InstallTSR
cmp al, 'u'
jz UninstallTSR
cmp al, 32
jz ReadCMD
jmp ExitProg
InstallTSR:
lea dx, sMsg3
mov ax, 351ch ;Получаем вектор на 1ch прерывание
int 21h
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем наличие резидента в памяти
jz ExitProg ;Выходим, если был установлен ранее
mov word ptr [old_int], bx ;Сохраняем старый вектор
mov word ptr [old_int+2], es ;
mov dx, offset Resident ;DS:DX = адрес нового обработчика
mov ax, 251ch ;Устанавливаем новый вектор
int 21h
lea dx, sMsg2 ;Выводим сообщение об успешной установке
mov ah, 9
int 21h
lea dx, EndResident ;Оставить обработчик и выйти из программы
int 27h
UninstallTSR:
lea dx, sMsg5
mov ax, 351ch
int 21h ;ES:BX = вектор 1ch прерывания
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем присутствие резидента в памяти
jnz ExitProg ;Выходим, если не установлен
push ds
lds dx, es:[bx-4] ;DS:DX = old_int
mov ax, 251ch
int 21h ;Восстановим старый вектор
pop ds
mov ah, 49h ;Освободить память, занимаемую TSR
int 21h
lea dx, sMsg4
ExitProg:
mov ah, 9 ;Вывод сообщения на экран
int 21h
ret ;Выход из программы
sMsg1 DB "Параметры командной строки:",13,10
DB "i - установить резидент",13,10
DB "u - удалить резидент",13,10,"$"
sMsg2 DB "Резидент был успешно установлен.","$"
sMsg3 DB "В памяти уже есть копия резидента.","$"
sMsg4 DB "Резиден был выгружен.","$"
sMsg5 DB "Резидент не установлен.","$"
END Start
Описание программы.
При запуске программы без указания верных параметров командной строки на экран выводится список параметров с указанием их действий. Для установки резидента в память следует загрузить программу с ключом ‘i’. Чтобы удалить резидент следует использовать ключ ‘u’. После установки резидента на экране появится красный квадрат, который будет перемещаться слева направо. При достижении правого края экрана квадрат переместится в первоначальное положение. Перемещение красного квадрата происходит с восстановлением атрибутов области экрана, в которой прежде находился квадрат. После удаления резидента из памяти квадрат исчезнет.
quot;sMsg5 DB "Резидент не установлен.","
Министерство Образования РФ
Новосибирский Государственный Технический Университет
Курсовая работа
Разработка прикладных обработчиков прерываний и резидентных программ в MS-DOS
Группа:
Вариант:
Студент:
Проверил:
Новосибирск — 2004
Задание.
Резидент, выводящий на экран квадрат типа красной дыры. Программа перехватывает прерывание int 1Ch и постоянно подменяет атрибуты символов внутри квадрата. Программа действует только в режиме экрана 3, поэтому вначале проверяется режим экрана. Вывод на экран (подмена атрибутов) реализуется путём непосредственного программирования памяти. Предусмотреть дрейф дыры по экрану в какую-либо сторону с восстановлением прежних атрибутов.
Структура программы.
Программа состоит из 1 модуля: резидентной части, осуществляющей загрузку и выгрузку резидента.
Установка резидента происходит при запуске программы с параметром “i” в командной строке. При этом выполняются следующие шаги:
1. Используя функцию 25h прерывания int 21h, в ES:BX получаем вектор прерывания 1ch.
2. Далее идет проверка на присутствие в памяти копии программы. Для этого в теле резидента предусмотрена метка ‘XOBR’. При наличии в памяти резидента по адресу ES:[BX-8] будет находиться строка ‘RBOX’.
3. Если резидент был установлен ранее, то программа завершается с соответствующим сообщением.
4. Если резидент не был установлен, то, используя функцию 25h прерывания int 21h, происходит установка нового вектора на прерывание 1ch. Старый вектор, полученный на шаге 1, сохраняется в переменной, которая останется в памяти вместе резидентом. Это сделано для того, чтобы позже можно было восстановить старый вектор.
5. Вызывается прерывание int 27h – выйти из программы и оставить резидент в памяти.
Удаление резидента происходит при запуске программы с параметром “u” в командной строке.
Аналогично пункту 1 в процедуре установки резидента. Аналогично пункту 2 в процедуре установки резидента. Если резидент не был установлен ранее, то программа завершается с соответствующим сообщением. Если резидент был установлен, то, используя функцию 25h прерывания int 21h, происходит восстановление старого вектора обработчика прерывания. Старый вектор при установке резидента в память был сохранен в переменной, которая может быть доступна по адресу ES:[BX-4]. Адрес ES:[BX], полученный на шаге 1, является сегментным адресом резидента, то, используя функцию 49h прерывания 21h, резидент удаляется из памяти.В программе резидента можно выделить следующие шаги:
Сохраняются в стеке флаги, регистры общего назначения и сегментные регистры. По адресу 40h:[49h] (область данных BIOS) проверяется текущий видео режим. Если текущий видео режим не 3, тогда переходим на пункт 7 Если резидент выполняется в первый раз, то переходим на пункт 6. Восстанавливается область экрана с измененными атрибутами. Увеличение значения переменной, в которой хранится текущее смещение ‘дыры’ на экране. Если переменная превышает значение, при котором ‘дыра’ выйдет за экран, то переменной присваивается начальное значение. Сохранение атрибутов символов области, где будет нарисована ‘дыра’. Изменение текущих атрибутов на “черный символ на красном фоне”. Изменение атрибутов происходит путем прямой записи в видео память. Восстановление регистров и флагов. Передача управления старому обработчику прерывания.Используемые сервисные функции.
INT 27h
Завершить работу программы и оставить резидент в памяти
INT 21h
- AH = 9h - Вывод строки на экран
DS:DX — адрес строки
- AH = 25h – Установка вектора прерывания
AL = номер вектора
DS:DX = адрес программы обработки прерывания AH = 35h – Получение вектора прерывания
AL = номер вектора
Выход: ES:BX — адрес программы обработки прерывания AH = 49h – Освобождение блока памяти
ES = сегментный адрес блока
INT 16h
- AH = 0 – Чтение символа из буфера
Выход: AL = код символа
AH = скан-код клавиши
Листинг программы.
.model tiny
.386
.code
org 100h
Start:
jmp Begin
Flag DB 0 ;0, если обработчик выполняется в 1 раз
ScrBuf DB 32 dup(0) ;Буфер для сохранения экрана
Xpos DW (10*80+36)*2+1-60 ;Текущее положение на экране
DB 'XOBR' ;Метка резидента(для проверки присутствия)
old_int DD 0 ;Вектор старого обработчика
Resident:
pushf ;Сохраняем флаги
pusha ;и все регистра общего назначения
push es
push ds
push cs
pop ds ;DS = CS
mov ax, 40h ;ES->область данных BIOS
mov es, ax
cmp byte ptr es:[49h], 3 ;Видео режим 3?
jnz ExitTSR ;Если нет - выход
mov ax, 0b800h ;Видео сегмент
mov es, ax
cmp Flag, 0
jz FirstStart
;Восстанавливаем предыдущую область
mov di, XPos ;ES:BX->адрес дыры в видео памяти
mov si, offset ScrBuf
mov cx, 4
RestoreRow:
push cx
mov cx, 8
RestoreCol:
mov al, [si]
inc si
mov es:[di], al
add di, 2
loop RestoreCol
add di, 144
pop cx
loop RestoreRow
;Перемещаем 'дыру' вправо
mov ax, XPos
add ax, 2
cmp ax, (10*80+36)*2+1+60 ;Если достигла края - возвращаем
jne @F ;на начало
mov ax, (10*80+36)*2+1-60
@F:
mov XPos, ax
FirstStart:
mov Flag, 1
;Сохраняем область экрана и рисуем в ней квадрат
mov di, XPos
mov si, offset ScrBuf
mov cx, 4 ;4 строки
NextRow:
push cx ;Сохраняем CX
mov cx, 8 ;8 столбцов
NextCol:
mov al, es:[di] ;
mov [si], al ;Сохраняем область, в которую будем рисовать
inc si ;
mov byte ptr es:[di], b ;Атрибут "черный символ на красном фоне"
add di, 2 ;Пропускаем символ
loop NextCol ;Следующий столбец
add di, 144 ;Строка ниже
pop cx ;Восстанавливаем CX
loop NextRow ;Следующая строка
ExitTSR:
pop ds
pop es ;Восстанавливаем регистры
popa
popf ;Восстанавливаем флаги
jmp dword ptr cs:[old_int] ;Переходим на старый обработчик
EndResident EQU $
Begin:
lea dx, sMsg1
mov bx, 81h ;CS:[BX] = командная строка
ReadCMD:
mov al, ds:[bx] ;Читаем командную строку
inc bx
cmp al, 'i'
jz InstallTSR
cmp al, 'u'
jz UninstallTSR
cmp al, 32
jz ReadCMD
jmp ExitProg
InstallTSR:
lea dx, sMsg3
mov ax, 351ch ;Получаем вектор на 1ch прерывание
int 21h
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем наличие резидента в памяти
jz ExitProg ;Выходим, если был установлен ранее
mov word ptr [old_int], bx ;Сохраняем старый вектор
mov word ptr [old_int+2], es ;
mov dx, offset Resident ;DS:DX = адрес нового обработчика
mov ax, 251ch ;Устанавливаем новый вектор
int 21h
lea dx, sMsg2 ;Выводим сообщение об успешной установке
mov ah, 9
int 21h
lea dx, EndResident ;Оставить обработчик и выйти из программы
int 27h
UninstallTSR:
lea dx, sMsg5
mov ax, 351ch
int 21h ;ES:BX = вектор 1ch прерывания
cmp dword ptr es:[bx-4-4], 'RBOX' ;Проверяем присутствие резидента в памяти
jnz ExitProg ;Выходим, если не установлен
push ds
lds dx, es:[bx-4] ;DS:DX = old_int
mov ax, 251ch
int 21h ;Восстановим старый вектор
pop ds
mov ah, 49h ;Освободить память, занимаемую TSR
int 21h
lea dx, sMsg4
ExitProg:
mov ah, 9 ;Вывод сообщения на экран
int 21h
ret ;Выход из программы
sMsg1 DB "Параметры командной строки:",13,10
DB "i - установить резидент",13,10
DB "u - удалить резидент",13,10,"$"
sMsg2 DB "Резидент был успешно установлен.","$"
sMsg3 DB "В памяти уже есть копия резидента.","$"
sMsg4 DB "Резиден был выгружен.","$"
sMsg5 DB "Резидент не установлен.","$"
END Start
Описание программы.
При запуске программы без указания верных параметров командной строки на экран выводится список параметров с указанием их действий. Для установки резидента в память следует загрузить программу с ключом ‘i’. Чтобы удалить резидент следует использовать ключ ‘u’. После установки резидента на экране появится красный квадрат, который будет перемещаться слева направо. При достижении правого края экрана квадрат переместится в первоначальное положение. Перемещение красного квадрата происходит с восстановлением атрибутов области экрана, в которой прежде находился квадрат. После удаления резидента из памяти квадрат исчезнет.
quot;END Start
Описание программы.
При запуске программы без указания верных параметров командной строки на экран выводится список параметров с указанием их действий. Для установки резидента в память следует загрузить программу с ключом ‘i’. Чтобы удалить резидент следует использовать ключ ‘u’. После установки резидента на экране появится красный квадрат, который будет перемещаться слева направо. При достижении правого края экрана квадрат переместится в первоначальное положение. Перемещение красного квадрата происходит с восстановлением атрибутов области экрана, в которой прежде находился квадрат. После удаления резидента из памяти квадрат исчезнет.


