
12.10.2009, 20:42
|
|
Новичок
Регистрация: 29.07.2007
Сообщений: 4
С нами:
9887230
Репутация:
0
|
|
Помогите найти ошибку
Необходимо перехватить прерывание 5h
Но процедура Int_05h не выполняется
Код:
data segment
old_cs dw ?; для хранения «старого» вектора
old_ip dw ?; прерываний с номером 5h
Ubdate db 0; Что нажал пользователь
data ends
code segment
assume cs:code, ds:data
start:
mov ax,data
mov ds,ax
call clrscr
; Запомним текущий вектор 5h
mov ax, 3505h
int 21h
mov old_ip, bx
mov old_cs, es
; Подменим обработчик
push ds ; DS:DX <- Новый обработчик
mov dx, offset Int_05h
;mov ax, seg Int_05h
;mov ds, ax
mov ax, 2505h
int 21h ; Установили его
pop ds
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov bx,0
make_delay:
mov ah,0
mov al,ubdate
test ax,ax
jnz ekran
jmp nenado
ekran:
mov ubdate,0
;действия
nenado:
jmp make_delay
q:
; Восстановливаем все назад
push ds
mov dx, old_ip
mov ax, old_cs
mov ds, ax
mov ah, 25h
mov al, 9h
int 21h
pop ds
mov ax, 4C00h ; И выходим
int 21h
jmp konec
;////////////////////////////////////////////////////////////////////////////////////////////////////
Int_05h proc
cli ;Запрещаем прерывания
push ax
push bx
push cx
push dx
push si
push di
push es ;и сегментные регистры
push ds
mov ubdate,1
pop ds ;Восстановим сохраненные регистры
pop es
pop di
pop si
pop dx
pop cx
pop bx
pop ax
sti ;Разрешим прерывания
iret ;Выход (возврат в прерванное место)...
Int_05h endp
CLRSCR proc naer ;Очищает экран
push ax
mov ax, 03
int 10h
pop ax
ret
CLRSCR endp
konec:
code ends
end start
Последний раз редактировалось Prototype; 12.10.2009 в 21:19..
|
|
|