Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Написание драйверов, Для символьных устройств

5.2K
28 июня 2004 года
JumpingJack
7 / / 07.01.2004
Написал досовский драйвер символьного устройства. В нем обрабатывается только функция Ввода (4, на сколько я понимаю), эта функция, по идее, должна выводить только цифры, т.е., ей на вход подается строка с буквами и цифрами, а она выводит на экран только цифры.

Гружу Win98, запускаю NC, ввожу COPY CON JJ, и ввожу символы, жму ctrl+z, и ничего у меня не выводится, хотя файл JJ тоже не создается.. подскажите, плз, где тут ошибка?

Текст драйвера:

code segment
driv proc far
ASSUME CS:code

dd -1
dw 8000h
dw strategy
dw interrupt
db 'JJ '


strategy proc far

mov CS:req_off,BX
mov CS:req_seg,ES
retf

req label dword
req_off DW ?
req_seg DW ?

strategy endp


interrupt proc far

push ES
push DS
push AX
push BX
push CX
push DX
push SI
push DI
push BP

mov AX,CS:req_seg
mov ES,AX
mov BX,CS:req_off

mov AL, ES:[BX]+2
shl AL, 1

sub AH, AH
mov DI, AX
jmp CS:[TABLE+DI]

TABLE dw init
dw check_media
dw make_bpb
dw ioctl_in
dw input
dw nondestruct_in
dw input_status
dw clear_input
dw output_data
dw output_verify
dw output_status
dw clear_output
dw ioctl_out
dw Device_open
dw Device_close
dw Removable_media
dw 8 dup(exit)

output_data:
check_media:
make_bpb:
ioctl_in:
nondestruct_in:
input_status:
clear_input:
output_verify:
output_status:
clear_output:
ioctl_out:
Removable_media:
Device_open:
Device_close:
exit:

or ES:word ptr [BX]+3,8003h
jmp quit

input:
mov cx,[bx+18] ;сохранение в сх числа байт для ввода
push ds
lds si,[bx+14] ;в DS:SI - указатель на буфер данных

;вывод на экран символов (кроме цифр), переданных в устройство MYDRV
end_lp: ;начало цикла
lodsb ;загрузить в al байт, на
;который указывает si и увеличить si на единицу
push ax ;сохранение ах в стеке
sub al,30h ;значение в al уменьшается на 30h
cmp al,9 ;выбираются ASCII коды, превышающие 39h
jle m2 ;переход к m2 если это условие не выполняется
add al,30h ;восстановление прежнего значения в al
mov dl,al ;ASCII код символа из а1 в dl
mov ah,2 ;номер функции (2) в ah
int 21h ;вызов прерывания 21h
m2:рор ах ;восстановление значения ах из стека
loop end_lp ;конец очередной итерации цикла
;при наличии в al символа возврата каретки осуществляется
;переход па новую строку
cmp al,13 ;сравнение значения в al с числом 13
jne m3 ;если не равно, то переход к метке тЗ
mov dl,10 ;в dl число 10 - перевод строки
mov ah,2 ;номер функции (2) в ah
int 21h ;вызов прерывания 21h

m3: ;метка m3
pop ds
jmp quit

quit:
or ES:word ptr [BX]+3,100h
pop BP
pop DI
pop SI
pop DX
pop CX
pop BX
pop AX
pop DS
pop ES

retf


enddrv:
init:
mov word ptr ES:[BX+14],offset enddrv
mov word ptr ES:[BX+16],CS

push CS
pop DS
mov AH, 9
mov DX, offset initstr
int 21h

mov ax, 0
int 16h

jmp quit

initstr db 'Press Any Key...', 10,13,'$'

interrupt endp
driv endp
code ends
end
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог