Время между нажатиями клавиш - Assembler
Формулировка задачи:
Добрый день, есть программа, выводящая время, прошедшее между нажатиями клавиш "я" и "A"(лат.), нужно немножко поределать, что бы выводил время между нажатиями
любой цифры
илюбой буквы
, не понимаю как это сделать, возможно как-то диапазоном. Процессор 8086, компилировать через TASM, TLINK. Буду благодарен!
Листинг программы
- .model small
- .stack 100h
- .data
- ascval db '000.0','$'
- mili db 0
- sec db 0
- old_int09h dd 0
- old_int08h dd 0
- key db 0
- met db 0
- counter dw 0
- soob db 'Привет, уважаемый пользователь!!!',0ah,0dh
- db 'Эта программа измеряет время между нажатием клавиши "я" и "A"(лат.)',0ah,0dh,'$'
- .code
- assume cs:@code,ds:@data,ss:@stack,es:@data
- begin proc far
- push ds
- xor ax,ax
- push ax
- mov ax,@data
- mov ds,ax
- start: mov ax,0600h ;\ |al=00 (весь экран), ah=06 (прокрутка)
- mov bh,07 ; \ |чёрно-белый
- mov cx,0000 ; очистка экрана |левая верхняя позиция
- mov dx,314fh ; / |правая нижняя позиция
- int 10h ;/ |передача управления в BIOS
- mov ah,02 ; \ |установка курсора
- mov bh,00 ; \ |номер экрана
- mov dh,00 ; установка курсора |номер строки
- mov dl,00 ; / |номер столбца
- int 10h ; / |передача управления в BIOS
- mov ah,09h
- lea dx,soob
- int 21h
- mov ax,3509h ; \
- int 21h ; \
- mov word ptr old_int09h,bx ; \
- mov word ptr old_int09h+2,es ; сохраняем старые адреса
- ; обработчиков прерываний
- mov ax,3508h ; клавиатуры и системного таймера
- int 21h ; /
- mov word ptr old_int08h,bx ; /
- mov word ptr old_int08h+2,es ; /
- push ds ; \
- push cs ; \
- pop ds ; \
- mov ax,2509h ; \
- mov dx,offset int09h ; устанавливаем свои
- int 21h ; обработчики
- mov ax,2508h ; /
- mov dx,offset int08h ; /
- int 21h ; /
- pop ds ; /
- input: cmp met,1 ; \
- je zda ;
- cmp key,2Ch ; /*** -ожидание нажатия "я"
- jge zda
- jmp input
- zda: mov met,1
- cmp key,0bh ;
- jle zda2
- jmp zda
- zda2: mov met,1
- cmp key,1Eh ; /*** -ожидание нажатия "A"
- je p
- jmp zda2
- p: mov met,0
- mov ax,counter
- xor dx,dx
- mov bx,100 ; \
- mul bx ; \
- xor bx,bx ; \
- ; \
- div_18: cmp dx,0 ; \
- jnz m1 ; деление
- cmp ax,182 ; счётчика
- jb m2 ; прерываний таймера
- m1: sub ax,182 ; на 18,2
- sbb dx,0 ;
- inc bx ;
- jmp div_18 ;
- m2: ; получаем:
- mov ax,bx ; в al десятые доли
- xor bx,bx ; в bx секунды
- div_10: cmp ax,10 ; /
- jb above ; /
- sub ax,10 ; /
- inc bx ; /
- jmp div_10 ; /
- above: or al,30h
- lea si,ascval[4]
- mov [si],al
- mov ax,bx
- call bin_ascii
- mov ah,09h
- lea dx,ascval
- int 21h
- push ds ; \
- ; \
- mov ax,2509h ; \
- lds dx,old_int09h ; восстанавливаем
- int 21h ; старые
- mov ax,2508h ; обработчики
- lds dx,old_int08h ; /
- int 21h ; /
- pop ds ; /
- ret
- begin endp
- int09h proc far ; \
- in al,60h ; обработчик | считываем скан-код
- mov key,al ; прерываний клавиатуры | сохраняем его в переменную
- jmp old_int09h ; / | переходим на старый обработчик
- int09h endp
- int08h proc far
- cmp met,1 ; \
- jne old ; обработчик прерываний
- inc counter ; системного таймера
- old: jmp old_int08h ; /
- int08h endp
- bin_ascii proc ; процедура перевода двоичного числа
- lea si,ascval[2] ; в ASCII
- xor bx,bx ; вход: АХ выход: ASCVAL
- met1: cmp ax,10
- jb met2
- met5: sub ax,10
- add bx,1
- jmp met1
- met2: or al,30h
- mov [si],al
- dec si
- cmp bx,0
- je met3
- met4: mov ax,bx
- xor bx,bx
- jmp met1
- met3: ret
- bin_ascii endp
- end begin
Решение задачи: «Время между нажатиями клавиш»
textual
Листинг программы
- input: cmp met,1 ; \
- je zda ;
- cmp key,'0'
- jb input
- cmp key,'9'
- jbe zda
- cmp key,'A'
- jb input
- cmp key,'Z'
- jbe zda
- cmp key,'a'
- jb input
- cmp key,'z'
- jbe zda
- jmp input
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д