Лабораторная работа №91 / Lab9_max
.docСанкт-Петербургский государственный университет
Кафедра МО-ЭВМ
Отчёт по лабораторной работе №9
по дисциплине «Организация и функционирование ЭВМ»
Выполнил: Добряков М.М.
Ст. гр. 0341
Проверил:
Санкт-Петербург
2002
-
Постановка задачи
1) Разработать программу устанавливаемого драйвера символьного типа, реализующую функции:
- инициализация (фиксация границы драйвера и вывод титульной таблички );
- ввод с клавиатуры строки символов, длиной не более Nmax;
- Преобразование всех заглавных латинских букв входной строки в строчные.
2) Разработать на языке С тестирующую программу для проверки функционирования драйвера.
-
Цель работы
Научиться писать символьные драйвера для операционной системы MS-DOS.
-
Теоретическая подготовка
Драйвер символьного устройства состоит из 18-и байтного заголовка.
Первые 4 байта содержат адрес следующего загружаемого драйвера ДОС – так как в момент загрузки драйвер будет последним в цепочке, адрес должен быть равен 0ffff:0ffff. Следующие 2 байта атрибуты драйвера. Затем идут смещение процедуры стратегий (отвечающей за получение адреса буфера запроса) и прерываний (которая выполняет требуемые команды). В следующих 8-ми байтах содержится название драйвера.
За заголовком следует код процедур стратегии и прерывания с используемыми ими подпрограммами.
Для компиляции драйвера для данной лабораторной работы используется файл Make.bat, в результате его работы получится файл lab9.sys путь к данному файлу записываем в файл CONFIG.SYS и перезагружаем компьютер. Для проверки работоспособности драйвера используем файл test.bat, в результате его работы на экране должна отобразиться следующая строка:
аaabbbzzzaaabbbzzzаааАААбббвввёёёЁЁЁпппррр
Lab9.asm
.model small
.code
.186
org 0
dd -1
dw 0a800h
dw offset strategy
dw offset interrupt
db "DRVCON "
request dd ?
command_table label
dw offset init
dw offset unsupported
dw offset unsupported
dw offset unsupported
dw offset read
dw offset read
dw offset unsupported
dw offset unsupported
dw offset write
dw offset write
dw offset unsupported
dw offset unsupported
dw offset unsupported
dw offset unsupported
dw offset unsupported
dw offset unsupported
dw offset write
dw offset invalid
dw offset invalid
dw offset unsupported
dw offset invalid
dw offset invalid
dw offset invalid
dw offset unsupported
dw offset unsupported
dw offset unsupported
strategy proc far
mov word ptr cs:request,bx
mov word ptr cs:request+2,es
ret
strategy endp
interrupt proc far
pushf
pusha
push ds
push es
push cs
pop ds
les si,dword ptr request
xor bx,bx
mov bl,byte ptr es:[si+2]
cmp bl,19h
jbe command_ok
call invalid
jmp short interrupt_end
command_ok:
shl bx,1
call word ptr command_table[bx]
interrupt_end:
cmp al,0
je no_error
or ah,80h
no_error:
or ah,01h
mov word ptr es:[si+3],ax
pop es
pop ds
popa
popf
ret
interrupt endp
unsupported proc near
xor ax,ax
ret
unsupported endp
read proc near
mov al,0bh
ret
read endp
invalid proc near
mov ax,03h
ret
invalid endp
write proc near
push si
mov cx,word ptr es:[si+12h]
jcxz write_finished
lds si,dword ptr es:[si+0eh]
cld
comment @
crypt:
lodsb
cmp al,'A' ; < A
jl no_print
cmp al,'z'
jg no_print ; > z
cmp al,'Z'
jle print
cmp al,'a'
jge print
jmp no_print
print:
int 29h
no_print:
loop crypt
@
crypt:
lodsb
cmp al,'A'
jl ex
cmp al,'Z'
jg ex
xor al,20h
int 29h
ex:
loop crypt
write_finished:
xor ax,ax
pop si
ret
write endp
init proc near
mov ah,9
mov dx,offset load_msg
int 21h
mov word ptr es:[si+0eh],offset init
mov word ptr es:[si+10h],cs
xor ax,ax
ret
init endp
load_msg db "Драйвер загружен",13,10,'$'
start:
push cs
pop ds
mov dx,offset exe_msg
mov ah,9
int 21h
mov ah,4ch
int 21h
exe_msg db "Загружать из CONFIG.SYS",13,10,'$'
.stack
end start
Файл: Make.bat
cls
tasm lab9.asm
tlink lab9.obj,lab9.sys
Файл: dt
аaabbbzzzAAABBBZZZаааАААбббвввёёёЁЁЁпппррр
Файл: test.bat
type dt >drvcon
Файл: CONFIG.SYS
…
DEVICE=lab9.sys
…