Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
;+----------------------------------------------------------------------------+
;¦ ОСНОВНЫЕ ИНСТРУКЦИИ ПРОГРАММЕ ASSEMBLER ¦
;+----------------------------------------------------------------------------+
;************************* Программа Простой Драйвер *************************
;Col.1 _____________________________ - Поле меток и имен переменных
; ¦ Col.2 ______________________ - Поле (псевдо)оператора (директивы)
; ¦ ¦ Col.3 ______________ - Поле операндов
; ¦ ¦ ¦ Col.4 ______ - Поле комментариев
;+------+ +-------+ +-------+ +------------+
cseg SEGMENT PARA PUBLIC 'CODE'
; ¦ ¦ ¦ ¦ +-- Сообщает ASSM, что сегмент содер-
; ¦ ¦ ¦ ¦ жит команды.
; ¦ ¦ ¦ +---------- Директива, означает возможность
; ¦ ¦ ¦ обращения к сегменту кода из дру-
; ¦ ¦ ¦ гой программы.
; ¦ ¦ +---------------------- Предписывает ASSM выровнять этот
; ¦ ¦ сегмент на границу параграфа (16
; ¦ ¦ байт).
; ¦ +------------------------------- Директива сообщает ASSM об опре-
; ¦ делении блока памяти до 64 Кб,
; ¦ размер которого ASSM вычислит.
; +----------------------------------------- Метка, назначенная сегменту, вы-
; бирается произвольно.
;_____________________________________________________________________________
simple PROC FAR
; ¦ ¦ ¦
; ¦ ¦ +---------------------- Сообщает ASSM, что процедура мо-
; ¦ ¦ жет находиться в любой области
; ¦ ¦ памяти.
; ¦ +------------------------------- Директива, означающая начало ос-
; ¦ новной процедуры.
; +----------------------------------------- Имя процедуры, выбирается произ-
; вольно.
;_____________________________________________________________________________
ASSUME CS:CSEG,DS:CSEG,ES:CSEG
; ¦ +-----------------------+ Регистры КОДА, ДАННЫХ,
; ¦ +-------------- и ДОПОЛНИТЕЛЬНОГО СЕГМЕНТА
; ¦ проц. X86 в одном сегменте
; +------------------------------- этой директивой адресуют эле-
; менты внутри означенного сег-
; мента CSEG.
;_____________________________________________________________________________
; ORG 100H
; ¦ +-----+ 256 (100H) или другое количест-
; ¦ +-------------------------- во байт резервируются перед
; ¦ началом программы...
; +--------------------------------- этой директивой, она же связы-
; вает метку с абсолютным адресом
; (100Н - для .COM-файла)
;_____________________________________________________________________________
;+---------------------------------------------------------------------------+
;¦ Начало основной процедуры ¦
;+---------------------------------------------------------------------------+
;
begin:
; ¦ Метка (произвольна), сообщает
; +----------------------------------------- ASSM о начале выполнения прог-
; раммы с данного адреса или
; просто фиксирует начальный ад-
; рес при написании .SYS - прог.
;_____________________________________________________________________________
;+---------------------------------------------------------------------------+
;¦ Объявление и инициализация данных ¦
;+---------------------------------------------------------------------------+
;¦ DB (Размер: 1 байт, байты) ¦
;¦ DW (Размер: 1 слово) ¦
;¦ DD (Размер: 1 двойное слово) ¦
;¦ DQ (Размер: 2 двойных слова) ¦
;¦ DF (Размер: 6 байт, дальний указатель для 80386) ¦
;¦ DP (Размер: 6 байт, дальний указатель для 80386) ¦
;¦ DT (Размер: 10 байт) ¦
;+---------------------------------------------------------------------------+
;
;******** Заголовок устройства для DOS *****************************
next_dev DD -1 ;Других драйверов нет (Размер: 1 двойное слово)
attribute DW 8000H ;Символьное устройство (Размер: 1 слово)
strategy DW dev_strat ;Адрес 1-го вызова DOS (Размер: 1 слово)
interrupt DW dev_int ;Адрес 2-го вызова DOS (Размер: 1 слово)
dev_name DB 'SIMPLE$ ' ;Имя драйвера - точно (Размер: 1 байт, байты)
; +12345678+- 8 символов (если меньше добавить пробелы)
;******** Рабочее пространство для драйвера **************************
rh_off DW ?; Смещение заголовка запроса
rh_seg DW ?; Сегмент заголовка запроса
msg_1 DB 07H;---------- Заголовок запроса --------+
DB 'SIMPLE SYMBOL DRIVER !'
DB 0DH,0AH,07H,'$'
;******** Процедура стратегия ***************************************
dev_strat: ; Первый вызов из DOS: сохранить
MOV CS:rh_seg,ES; СЕГМЕНТ и
MOV CS:rh_off,BX; СМЕЩЕНИЕ заголовка запроса
RET +---------------+ !!!
;******** Процедура прерывание ***************************************
dev_int: ; Второй вызов из DOS: сохранить
CLD ; состояние регистров процессора
PUSH DS ; при входе в процедуру
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
;_______________________________; Переход по команде, переданной в
; заголовке запроса:
MOV AL,ES:[BX]+2; получить код команды,
CMP AL,0 ; проверить на 0 (инициализация),
JNZ exit_3 ; нет - выход по ошибке.
ROL AL,1 ; Получить смещение в таблице,( Х 2)
LEA DI,cmdtab ; адрес таблицы команд,
MOV AH,0 ; сбросить старшие разряды AH,
ADD DI,AX ; прибавить сдвиг в таблице.
JMP WORD PTR [DI]; Косвенный переход.
+----------------- (Обращение к слову, а не к байту)
;________________________________ Таблица команд _____________________________
; Поле команд статического поля запроса
; содержит выполняемую функцию
cmdtab LABEL BYTE;--- символьное имя типа байт (байты)
DW init ; Инициализация (адрес процедуры)
;_____________________________________________________________________________
;+---------------------------------------------------------------------------+
;¦ Локальные процедуры ¦
;+---------------------------------------------------------------------------+
;________________________________ Инициализация ______________________________
initial PROC NEAR ;--- ближняя процедура
;
LEA DI,msg_1 ; Загрузить адрес сообщения,
MOV AH,0EH ; Функция BIOS - ТЕЛЕТАЙП
get_sym:
MOV AL,[DI]
CMP AL,24H ; проверка на конец строки"$"
JZ SHORT ex_ini
INT 10H ; вызвать функцию BIOS,
INC DI
JMP SHORT get_sym
;
ex_ini: ; В заголовок запроса поместить адрес
LEA AX,fin ; конца нашей резидентной программы !
MOV ES:WORD PTR [BX]+0EH,AX; - по смещению 0ЕН offset
MOV ES:WORD PTR [BX]+10H,CS; - по смещению 10Н segment
RET ; возврат.
;
initial ENDP ;
;_____________________________________________________________________________
;____________________________ Обработка команд DOS ___________________________
; Команда = 0 , инициализация.
init: CALL initial ; Вывод сообщения
JMP exit_2 ; Выход
;_____________________________________________________________________________
;+---------------------------------------------------------------------------+
;¦ Выход по ошибке ¦
;+---------------------------------------------------------------------------+
; Установить флаги СДЕЛАНО=1,ОШИБКА=1,
exit_3: ; неизвестная команда: КОД ОШИБКИ=3
MOV ES:WORD PTR 3[BX],8103H;
JMP exit_1 ; Восстановить среду
;_____________________________________________________________________________
;+---------------------------------------------------------------------------+
;¦ Обычный выход из драйвера ¦
;+---------------------------------------------------------------------------+
; Реализует 3 действия:
; 2 - состояние СДЕЛАНО без ошибки;
; 1 - восстановление ES:BX;
; 0 - восстановление регистров и выход.
exit_2: MOV ES:WORD PTR 3[BX],0100H; СДЕЛАНО=1 без ошибки;
exit_1: MOV BX,CS:rh_off ;
MOV ES,CS:rh_seg ;
exit_0: POP SI
POP DI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
RET
;_____________________________________________________________________________
;+---------------------------------------------------------------------------+
;¦ Секция конца программы ¦
;+---------------------------------------------------------------------------+
;
simple ENDP
; ¦ +--------------------------------- Директива конца процедуры
; ¦
; +----------------------------------------- Метка закрываемой процедуры
;
cseg ENDS
; ¦ +--------------------------------- Директива конца сегмента
; ¦
; +------------------------------------------ Метка закрываемого сегмента
;
END begin
; ¦ +--------------------------- Метка основной процедуры
; ¦
; +--------------------------------- Директива конца основной
; процедуры (сообщает ASSM, что
; программа начинает выполняться
; с адреса, определяемого меткой
; begin.
;********************************* END_DRIVER ********************************