Лабораторная работа №91 / lab9 EVM
.docСанкт-Петербургский государственный электротехнический университет
Отчёт по лабораторной работе №9
по дисциплине «Организация и функционирование ЭВМ»
Вариант №6
Проверил:
Выполнил: Юбрин А.Н.
Шин Е.Д.
Санкт-Петербург
2002
Постановка задачи
1) Разработать программу устанавливаемого драйвера символьного типа, реализующую функции:
- инициализация (фиксация границы драйвера и вывод титульной таблички );
- ввод с клавиатуры строки символов, длиной не более Nmax;
- Преобразование всех заглавных латинских букв входной строки в строчные.
2) Разработать на языке С тестирующую программу для проверки функционирования драйвера.
-
Цель работы
Научиться писать символьные драйвера для операционной системы MS-DOS.
-
Теоретическая подготовка
Драйвер символьного устройства состоит из 18-и байтного заголовка.
Первые 4 байта содержат адрес следующего загружаемого драйвера ДОС – так как в момент загрузки драйвер будет последним в цепочке, адрес должен быть равен 0ffff:0ffff. Следующие 2 байта атрибуты драйвера. Затем идут смещение процедуры стратегий (отвечающей за получение адреса буфера запроса) и прерываний (которая выполняет требуемые команды). В следующих 8-ми байтах содержится название драйвера.
За заголовком следует код процедур стратегии и прерывания с используемыми ими подпрограммами.
В лабораторной работе требуется вместо всех вводимых букв вывести его номер в алфавите, остальные буквы выводятся нормально.
Для компиляции драйвера для данной лабораторной работы используется файл Make.bat, в результате его работы получится файл lab9.sys путь к данному файлу записываем в файл CONFIG.SYS и перезагружаем компьютер.
Device=[path\]lab9.sys
Если файл загружается как exe, то выводится сообщение о том, что нужно загружать его из config.sys
Для проверки работоспособности драйвера используем файл test.bat, в результате его работы на экране вместо введенной строки:
1233456574aaabbbzzzaaabbbzzzаааАААбббвввёёёЁЁЁпппррр
должна отобразиться следующая строка:
1233456574 01 01 01 02 02 02 26 26 26 01 01 01 02 02 02 26 26 26 01 01 01 01 01 01 бббвввёёёЁЁЁпппррр
Текст программы:
.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
include convert.inc ; подключение процедуры конвертирования числа в символьную форму
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
crypt:
lodsb
cmp al,'A'
jl print
cmp al,'z'
jg print
cmp al,'Z'
jle p
cmp al,'a'
jge p
jmp print
p:
or al,20h
sub al,'a'-1
mov si,offset prnt+1
call byte_to_dec
mov si,offset prnt
mov al,cs:[si]
int 29h
mov al,cs:[si+1]
int 29h
mov al,' '
print:
int 29h
loop crypt
jmp jump
prnt db '00'
jump:
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
convert.inc
BYTE_TO_DEC PROC far
; перевод в 10с/с , AL - содержит исходный байт,
; SI - адрес поля младшей цифры строки-приемника,
; используемые регистры AX,CX,DX
push AX
push CX
push DX
cbw
xor DX,DX
mov CX,10
loop_bd: idiv CX
or DL,30h
mov cs:[SI],DL
dec SI
xor DX,DX
cmp AX,10
jae loop_bd
cmp AL,00h
je end_l
or AL,30h
mov cs:[SI],AL
end_l: pop DX
pop CX
pop AX
push AX
xor ah,ah
cmp al,9
jg endal
mov byte ptr cs:[si],'0'
endal:
pop AX
ret
BYTE_TO_DEC ENDP
Файл make.bat
tasm lab9.asm
tlink lab9.obj,lab9.sys
Файл test.bat
type dt >drvcon