Перехват прерывания от таймера

Тема в разделе "WASM.BEGINNERS", создана пользователем Buggy, 15 сен 2007.

  1. Buggy

    Buggy New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2007
    Сообщения:
    3
    Написал обработчик прерывания таймера, хочу чтобы каждую секунду выводился символ..
    Код (Text):
    1. .model small
    2. .stack 100h
    3. .386
    4. .data
    5. OldMode db 0
    6. NewMode equ 101h
    7. Info db 256 dup(?)
    8. Vbuff dw 0A000h
    9. Versize dw 480
    10. Horsize dw 640
    11. rez dw 0
    12. VMC dd 0
    13. GrUnit dw 0
    14. Cur_win dw 0
    15. winB db 0
    16.  
    17. old_INT dd ?
    18. count db 0
    19.  
    20. .code
    21. main proc
    22.  
    23.     mov ax, @data
    24.     mov ds, ax
    25.    
    26.     push ds
    27.     pop es
    28.     mov di, offset Info
    29.     mov ax, 4F01h
    30.     mov cx, offset NewMode
    31.     int 10h
    32.  
    33.     mov ax, es:[di+08]
    34.     mov Vbuff, ax
    35.     mov ax, es:[di+12h]
    36.     mov Horsize, ax
    37.     mov ax, es:[di+14h]
    38.     mov Versize, ax
    39.    
    40.     mov al, es:[di+3]
    41.     mov winB, al
    42.     mov cl, es:[di+4]
    43.     mov ax, 64
    44.     div cl
    45.     mov GrUnit, ax
    46.     mov eax, es:[di+0Ch]
    47.     mov VMC, eax
    48.     ;-----------------------
    49.    
    50.     mov ax, 4F03h
    51.     int 10h
    52.     push bx
    53.    
    54.     ;-------------------------
    55.     mov bx, offset NewMode
    56.     mov ax, 4F02h
    57.     int 10h
    58.     ;--------------------------
    59.     ;**************************
    60.     push 0
    61.     pop es
    62.    
    63.     mov eax, dword ptr es:[1Ch*4] ;сохраняю старый обработчик
    64.     mov dword ptr old_INT, eax
    65.    
    66.     pushf
    67.     cli
    68.     mov word ptr es:[1Ch*4], offset oclock  ;указываю новый
    69.     mov word ptr es:[1Ch*4+2], seg oclock
    70.     ;sti
    71.     popf
    72.        
    73.     mov ah, 01h
    74.     int 21h
    75.    
    76.     push 0
    77.     pop es
    78.     pushf
    79.     cli
    80.     mov eax, dword ptr old_INT
    81.     mov dword ptr es:[1Ch*4], eax
    82.     popf
    83.     ;**************************
    84.     ;--------------------------
    85.     pop bx
    86.     mov ax, 4F02h
    87.     int 10h
    88.     ;--------------------------
    89.     mov ax, 4C00h
    90.     int 21h
    91. main endp
    92.  
    93. oclock proc
    94.     pushf
    95.     pusha
    96.     cld
    97.     push ds
    98.     push es
    99.    
    100.     mov bh, count ;счетчик, при достижении 18 раз прошла секунда
    101.     inc bh
    102.     cmp bh, 18
    103.     jne exit
    104.     mov bh, 0
    105.     mov ah, 02h ;вывожу символ
    106.     mov dl, '>'
    107.     int 21h
    108. exit:
    109.     mov count, bh
    110.    
    111.     pop es
    112.     pop ds
    113.     popa
    114.     popf
    115.    
    116.     iret
    117. oclock endp
    118. end main
    Если убрать в обработчике эти три команды:
    Код (Text):
    1. mov ah, 02h
    2.     mov dl, '>'
    3.     int 21h
    то всё без ошибок.
    А если с ними, то программа вылетает
    В чем может быть проблема?
     
  2. AndNot

    AndNot New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2007
    Сообщения:
    49
    Попробуй такой вариант обработчика:
    Код (Text):
    1. oclock proc
    2.         nop                                            
    3.         mov     byte ptr cs:oclock,0cfh        ;iret    
    4.     pushf
    5.     pusha
    6.     cld
    7.     push ds
    8.     push es
    9.    
    10.     mov bh, count ;счетчик, при достижении 18 раз прошла секунда
    11.     inc bh
    12.     cmp bh, 18
    13.     jne exit
    14.     mov bh, 0
    15.     mov ah, 02h ;вывожу символ
    16.     mov dl, '>'
    17.     int 21h
    18. exit:
    19.     mov count, bh
    20.    
    21.     pop es
    22.     pop ds
    23.     popa
    24.     popf
    25.    
    26.         mov     byte ptr cs:oclock,90h         ;nop    
    27.         iret                                          
    28. oclock endp
    Т.е. обыкновенная защита от повторного вхождения (хотя оно и крайне маловероятно). Если не поможет, то придется отказаться от услуг DOS-сервиса, что не смертельно, поскольку альтернатив хватает - BIOS или прямой вывод в видеопамять.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Проверяй байт In-DOS, чтобы не было проблем.
    но лучше откажись от сервисов ОС и юзай прямой вывод в видеопамять