78172

Драйвер клавиатуры

Лабораторная работа

Информатика, кибернетика и программирование

При выполнении лабораторной работы мы познакомились с механизмом обработки прерываний системыMSDOS, механизмом обработки прерываний от клавиатуры.

Русский

2017-10-18

59 KB

2 чел.

Драйвер клавиатуры

Цель

Разработать обработчик прерываний от клавиатуры для ОСMS-DOS.

Лабораторное задание

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

  • обpаботка пpеpываний от клавиатуpы;
  • упpавление буфеpом (16 знаков по 2 байта на знак) в области адpесов пpогpаммы;
  • pаспознавание 10 цифp и символа <BK> (Enter);
  • контpоль пеpеполнения буфеpа;
  • вывод из буфеpа символов на экpан.

Листингпрограммы

 stseg segment para stack 'stack'

  dw 30h dup(?)

 stseg ends

 dseg segment para public 'data'

 keepcs        dw      0

 keepip        dw      0

 buf_start     dw      0

 buf_end       dw      0

 mybuf         dw      40 dup(0)

 start_mess    db      0dh,0ah,'KeyBoard driver by brigada 7',0dh,0ah,'$'

 kodl          db      0,27,'1234567890-=',8,9

 db      'qwertyuiop[]',13,0

 db      'asdfghjkl;',39,92,0,0

 db      'zxcvbnm,./',0,0,0,32,0,67,66,65

 dseg ends

 cseg segment para public 'code'

  assume cs:cseg,ds:dseg,ss:stseg

 start:

  mov   ax, dseg

  mov   ds, ax

  mov   dx, offset start_mess

  mov   ah,9

  int   21h

cli                    ; Запрещаем прерываение

movax,3509h

int   21h              ; Читаем текущий вектор

movkeepcs,es

movkeepip,bx        ; Сохраняем его

movax,offsetmybuf ; Инициализируем буферPTR

mov   buf_start, ax

  mov   buf_end, ax

  push  ds               ; сохраняем сегмент данных

  mov   ax, seg new_vect ;

  mov   ds, ax

  mov   dx, offset new_vect

  movax,2509h         ;

int   21h              ; устанавливаем новый вектор

popds               ; читаем сегмент данных из стека

sti                    ; разрешаем прерывания

loop1:

movdi,buf_start   ; загрузка начальногоPTR

movdx,buf_end     ; загрузка конечногоPTR

cmpdi,dx          ; сравнениеPTR

jeloop1           ; если равны, то повтор операций

movbx, [di]        ; загрузкаASCII и сканирование

cmp     di, offset mybuf + 40

je      end_reg

adddi, 2           ; изменение начальногоPTR

jmpcont

end_reg:

mov     di, offset mybuf

cont:

movbuf_start,di

moval, ‘/’         ; если введенный символ «/»

cmpal,bl

jepend            ; завершем программу

movdl,bl          ; если введен другой символ, то выводим его

mov     ah, 2

int     21h

jmp     loop1

pend:

pushds               ; Восстановлтваем старый вектор

movdx,keepip

mov   ax, keepcs

  mov   ds, ax

  mov   ax, 2509h

  int   21h

  pop   ds

  movax,4c00h         ; выходим из программы

int   21h

 new_vect PROC FAR

push    ax

push    bx

push    cx

push    dx

push    di

push    es

pushds

;чтение скан-кода

inal,60h            ; чтение скан-кода из порта 60h

mov     bx,ax

in      al,61h

or      al,80h

out     61h,al

and     al,7fh

mov   ax,seg mybuf

moves,ax

; декодирование символа

movax,bx

testal,80h

jnzquit              ; если не ноль, то на выход

mov     bx,seg kodl

mov     ds,bx

mov     bx,offset kodl

xlatb                     ; декодирование

cmpal,0

jequit              ; если код не найден, то на выход

; check buffer

mov     cx, buf_start

mov     di, buf_end

cmp     di,offset mybuf + 40

je      spec

inc     di

inc     di

cmp     cx,di

je      ovflow

dec     di

dec     di

jmp     g_s

 spec:

cmp     cx,offset mybuf

je      ovflow

 g_s:

moves:[di],ax         ; запись отсканированногоASCII в буфер

cmpdi,offsetmybuf + 40

jneno_w               ; если не равны, то наno_w

movdi,offsetmybuf    ; иначеdi присвоить смещениеmybuf

sub     di,2

 no_w: add     di,2

movbuf_end,di       ; изменение смещения конца буфера

quit: pop     ds

pop     es

pop     di

pop     dx

pop     cx

pop     bx

mov     al,20h

out     20h,al

pop     ax

iret

ovflow:

mov ah,02h

mov dl,07h

int 21h

jmp quit

new_vect endp

cseg ends

end start

Вывод

При выполнении лабораторной работы мы познакомились с механизмом обработки прерываний системыMSDOS, механизмом обработки прерываний от клавиатуры.


 

А также другие работы, которые могут Вас заинтересовать

38253. Хозяйственные операции и их влияние на статьи баланса 68.5 KB
  пополнен резервный капитал за счёт прибыли.100 и увеличилась кредиторская задолженность в расчётах с поставщиками в пассиве стр. Уменьшился текущий счёт в активе стр.230 и уменьшилась кредиторская задолженность в расчётах с поставщиком в пассиве стр.
38254. Счета бухгалтерского учета 191.5 KB
  Простейшая форма счёта самолётик. № счёта Дебет Дт Кредит Кт Для любого счёта приемлемы следующие понятия: Дебет это левая часть счёта в переводе с латыни должен; Кредит это правая часть счёта в переводе с латыни верит; Сальдо Сдо это остаток; Сальдо начальное Сдо нач. операций записанных по дебету счёта за отчётный месяц; Обороты по кредиту ОКт это общая сумма всех хоз. операций записанных по кредиту счёта за отчётный месяц;...
38259. Доходы, расходы и результаты деятельности 60 KB
  В течение отчётного периода на счетах классов 7 и 9 накапливаются соответственно доходы и расходы а в конце месяца эти счета закрываются путём списания их Сдо на сч. № 92 Административные расходы предназначен для учёта общехозяйственных расходов связанных с управлением и обслуживанием предпр. № 93 Расходы на сбыт используется для отражения расходов на содержание подразделений занимающихся сбытом ГП товаров учитываются расходы на рекламу доставку товаров покупателю.