Министерство Образования РФ

Новосибирский Государственный Технический Университет

Курсовая работа

Разработка прикладных обработчиков прерываний и резидентных программ в 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

Выход: 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

Выход: 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

Выход: 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

Выход: 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

Выход: 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

Выход: 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’. После установки резидента на экране появится красный квадрат, который будет перемещаться слева направо. При достижении правого края экрана квадрат переместится в первоначальное положение. Перемещение красного квадрата происходит с восстановлением атрибутов области экрана, в которой прежде находился квадрат. После удаления резидента из памяти квадрат исчезнет.