Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
01.05.2014
Размер:
43.52 Кб
Скачать

Санкт-Петербургский государственный электротехнический университет

Отчёт по лабораторной работе №9

по дисциплине «Организация и функционирование ЭВМ»

Вариант №6

Проверил:

Выполнил: Юбрин А.Н.

Шин Е.Д.

Санкт-Петербург

2002

Постановка задачи

1) Разработать программу устанавливаемого драйвера символьного типа, реализующую функции:

- инициализация (фиксация границы драйвера и вывод титульной таблички );

- ввод с клавиатуры строки символов, длиной не более Nmax;

- Преобразование всех заглавных латинских букв входной строки в строчные.

2) Разработать на языке С тестирующую программу для проверки функционирования драйвера.

  1. Цель работы

Научиться писать символьные драйвера для операционной системы MS-DOS.

  1. Теоретическая подготовка

Драйвер символьного устройства состоит из 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

Соседние файлы в папке Лабораторная работа №91