Время между нажатиями клавиш - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д