Время между нажатиями клавиш - 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