Пользовательский обработчик прерываний клавиатуры.Ассамблея.8086 - PullRequest
1 голос
/ 21 мая 2019

Я пишу резидентную программу, которая устанавливает исправления в обработчике прерывания клавиатуры, и при каждом нажатии клавиши ищет слово в видеопамяти.Когда слово найдено, оно напишет строку с этим словом в файле.Я вызываю старый обработчик прерываний в моем новом обработчике, но когда я запускаю программу в DOSBox, клавиатура не работает.Я думаю, что проблема в том, что я делаю прерывания DOS в моем прерывании, но я не уверен.Я тестировал нерезидентную часть программы, а также функцию-обработчик, когда она была просто функцией.Поэтому приведенный ниже код не является разделом для анализа командной строки и обработки ошибок.

     .model tiny
    .code   
    org 100h              
    jmp start
start_resident:    
new_int9 proc far                   ;must be far + iret  
    pushf 
    call cs:old_int9
    pusha          
    push ds
    push es
    push cs
    pop ds
    mov ax, 0b800h
    mov es, ax         
    cld                       
    mov bx, -2d
    mov si, [bx]
    lea di, parameters
    ;si is used for locating video buffer
    ;di is used for locating pattern
    page_iteration:        
        add bx, 2d
        cmp bx, 16d                        ;16 = 2 * 8 is number of pages       
        je findPattern_exit
        mov si, video_pages[bx]
        lea di, parameters       
        cmp_str_iteration:
            mov ax, video_pages[bx + 2]              ;check pages' intervals
            cmp si, ax
            je page_iteration
            mov ax, es:[si]
            mov ah, ds:[di]
            add si, 2
            inc di
            ;equ
            cmp ah, al
            je cmp_str_iteration
            ;nequ
            mov ax, di          ;ax holds fst not equ char
            lea di, parameters
            sub ax, di 
            cmp ax, n
            jnz cmp_str_iteration
            ;equ_words
            mov video_offset, si
            mov ax, bx         
            cwd
            div two
            mov npage, ax                                                     
            add al, '0'                         
            mov file_name[1], al    ;al - page number 

            mov ah, 3dh             ;open a file 
            mov al, 1               ;write only
            lea dx, file_name
            int 21h            
            jc create_and_open_file
            mov fd, ax

            mov ah, 42h
            mov al, 2
            mov bx, fd
            mov cx, 0               ;upper portion of offset
            mov dx, 0               ;lower portion of offset      
            int 21h
            mov errno, 2
            jc findPattern_error
            mov errno, -1
            jmp write_file
        create_and_open_file:
            mov ah, 3ch
            mov cx, 0
            lea dx, file_name
            int 21h                
            mov errno, 1                
            jc findPattern_error    ;pop from stack ret?
            mov errno, -1
            mov fd, ax       
        write_file:
            mov bx, npage
            mov ax, video_pages[bx]     ;ax holds current video page offset
            mov bx, video_offset
            sub bx, ax                  ;[0..24][0..80]
            mov ax, bx
            cwd
            div row_size                ;ax holds column
            cwd
            mul row_size                ;bottom round 
            mov bx, npage
            add ax, video_pages[bx]     ;ax holds address of current column

            mov dx, ax

            mov ah, 40h
            mov bx, fd
            mov cx, 160d
            push ds
            push es
            pop ds          ;ds - b800h
            int 21h 
            mov errno, 3        
            jc findPattern_error    ;write error
            mov errno, -1
            pop ds                    
            mov ah, 3eh
            mov bx, fd      ;close file
            int 21h                    

            mov bx, npage            
            jmp cmp_str_iteration 
findPattern_error:      
findPattern_exit:       
    pop es
    pop ds
    popa
    iret
new_int9 endp     

    cmd_length db 0

    execErr db "Can't execute Can't specified program execute Can't execute Can't specified program execute", 10,13,'$' 
    errno   dw 0                          
    errLen  db 27
    errorStr db "Invalid usage.",10,13,"$$$$$$$$$$$"         
             db "Create file error.",10,13,"$$$$$$$"  
             db "Move file pointer error.",10,13,'$'
             db "Write error.",10,13,"$$$$$$$$$$$$$"
    ;variables used to parse commandline
    ibord dw 0
    borders dw 3 dup(0)
    left equ 0
    right equ 2    
    iparam dw -1
    parameters db 256 dup(0)  
    pos dw 0                  
    n   dw 0
    nstr equ 128               
    fisrt equ 0
    second equ 128          

    old_int9 dd 0  

    file_name db "FX.TXT", 0    
    fd dw 0                

    video_pages dw 0h, 1000h, 2000h, 3000h, 4000h, 5000h, 6000h, 7000h, 8000h
    video_offset dw 0
    npage  dw 0 

    com_tail_size db 0
    com_tail db 127 dup(0Dh)             

    two dw 2d
    row_size dw 160d
start:              
    ;code to parse command line
jmp install_handler                        
install_handler:
    mov ah, 35h         
    mov al, 09h  
    int 21h
    mov word ptr old_int9, bx
    mov word ptr old_int9 + 2, es

    mov ah, 25h
    mov al, 09h               
    mov dx, offset new_int9
    int 21h                

    mov ax, 3100h
    mov dx, (start - start_resident + 10Fh) / 16
    int 21h                                
end start

Итак, пожалуйста, скажите, что не так с моим обработчиком прерываний клавиатуры?

...