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

Оцени полезность:

6   голосов , оценка 3.5 из 5
Похожие ответы