Написал обработчик прерывания таймера, хочу чтобы каждую секунду выводился символ.. Код (Text): .model small .stack 100h .386 .data OldMode db 0 NewMode equ 101h Info db 256 dup(?) Vbuff dw 0A000h Versize dw 480 Horsize dw 640 rez dw 0 VMC dd 0 GrUnit dw 0 Cur_win dw 0 winB db 0 old_INT dd ? count db 0 .code main proc mov ax, @data mov ds, ax push ds pop es mov di, offset Info mov ax, 4F01h mov cx, offset NewMode int 10h mov ax, es:[di+08] mov Vbuff, ax mov ax, es:[di+12h] mov Horsize, ax mov ax, es:[di+14h] mov Versize, ax mov al, es:[di+3] mov winB, al mov cl, es:[di+4] mov ax, 64 div cl mov GrUnit, ax mov eax, es:[di+0Ch] mov VMC, eax ;----------------------- mov ax, 4F03h int 10h push bx ;------------------------- mov bx, offset NewMode mov ax, 4F02h int 10h ;-------------------------- ;************************** push 0 pop es mov eax, dword ptr es:[1Ch*4] ;сохраняю старый обработчик mov dword ptr old_INT, eax pushf cli mov word ptr es:[1Ch*4], offset oclock ;указываю новый mov word ptr es:[1Ch*4+2], seg oclock ;sti popf mov ah, 01h int 21h push 0 pop es pushf cli mov eax, dword ptr old_INT mov dword ptr es:[1Ch*4], eax popf ;************************** ;-------------------------- pop bx mov ax, 4F02h int 10h ;-------------------------- mov ax, 4C00h int 21h main endp oclock proc pushf pusha cld push ds push es mov bh, count ;счетчик, при достижении 18 раз прошла секунда inc bh cmp bh, 18 jne exit mov bh, 0 mov ah, 02h ;вывожу символ mov dl, '>' int 21h exit: mov count, bh pop es pop ds popa popf iret oclock endp end main Если убрать в обработчике эти три команды: Код (Text): mov ah, 02h mov dl, '>' int 21h то всё без ошибок. А если с ними, то программа вылетает В чем может быть проблема?
Попробуй такой вариант обработчика: Код (Text): oclock proc nop mov byte ptr cs:oclock,0cfh ;iret pushf pusha cld push ds push es mov bh, count ;счетчик, при достижении 18 раз прошла секунда inc bh cmp bh, 18 jne exit mov bh, 0 mov ah, 02h ;вывожу символ mov dl, '>' int 21h exit: mov count, bh pop es pop ds popa popf mov byte ptr cs:oclock,90h ;nop iret oclock endp Т.е. обыкновенная защита от повторного вхождения (хотя оно и крайне маловероятно). Если не поможет, то придется отказаться от услуг DOS-сервиса, что не смертельно, поскольку альтернатив хватает - BIOS или прямой вывод в видеопамять.
Проверяй байт In-DOS, чтобы не было проблем. но лучше откажись от сервисов ОС и юзай прямой вывод в видеопамять