Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2012, 19:51   #1
корица
Новичок
Джуниор
 
Регистрация: 29.03.2012
Сообщений: 1
По умолчанию Некорректный выход из прерывания 09h

Добрый день! Проблема поставила в тупик, помогите кто может))

Задача состоит в том, чтобы заменить обработчик 09h на свой, с определенными функциями. Обработчик написан, вызывается при нажатии клавиш и работает, но ожидание клавиш происходит не ограниченное циклом число раз, а бесконечно. Код после ожидания нажатия клавиши не выполняется. Все это осложняется тем, что при нажатии первой клавиши отладчик вылетает.
Вопрос в том, как исправить программу, чтобы прерывание завершалось корректно и выполнение программы продолжалось с того же момента, откуда вызывалось. Должно вводиться и отображаться не более 5 символов, завершаемых Enter (тоже с символом), а затем они же повторно печатаются из Buf.

Модуль обработчика:
Код:

Code_seg SEGMENT PUBLIC
ASSUME  CS:code_seg
Public IntObr
Extrn s:byte
Extrn Print:near
Extrn Tabl:byte

IntObr PROC near
	push ax	
	push bx
	push cx
	push dx
	push es 
	push di
	push ds 
	mov ax,0h
	in al,60h	;получен scan-код нажатой клавиши
	mov di,ax
	and al,80h	;проверка, что клавиша нажата (не отпущена)
	cmp al,80h		;если отпущена, не выводить на экран
	je escape		;
	mov ax,di
	cmp al,3Ah
	je caps
	mov al,Tabl[di] ;перекодировка scan-кода в ASCII-код
	mov s,al
	call Print	;печать символа
	jmp escape
	caps:	mov ax,40h
	mov es,ax
	mov ax,017h
	mov si,ax
	mov al,byte ptr es:[si]
	push ax
	and al,01000000b
	cmp al,0h	;0-статус клавиатуры
	jne caps0
	pop ax
	or al,01000000b
	mov byte ptr es:[si],al
	jmp escape
	caps0: pop ax	;1-статус клавиатуры
	and al,10111111b
	mov byte ptr es:[si],al
	escape: in al,61h
	push ax
	or al,80h
	out 61h,al
	pop ax
	out 61h,al
	mov al,20h      
	out 20h,al
	pop ds
	pop di
	pop es
	pop dx
	pop cx
	pop bx
	pop ax
	iret
IntObr ENDP
Code_seg ENDS
	END
Модуль основной программы
Код:
Code_seg SEGMENT PUBLIC
ASSUME  CS:code_seg
	ORG 100h
	Extrn IntObr:near
	Public s
	Public Print
	Public Tabl
;
;    Основная процедура, содержащая вызовы процедур
;              и выводимый на экран текст
;-----------------------------------------------------------------------
Buf DB 5 DUP (?)
	x db 0h
	y db 0h
	N db 0h
	u db 0h
	x0 equ 0h	
	y0 equ 0h
	NMax equ 05h
	m equ 0Ah
	f equ 70h
	s db 0h
	Old09 DD 0h	;ячейка для хранения исходного вектора прерываний 09h
Tabl     DB 0,0,'1234567890-='
         DB 0,0,'qwertyuiop[]',0Dh	 
         DB 0,'asdfghjkl;',27h,60h 
         DB 0,'\zxcvbnm,./'
         DB  3 DUP (0),20h
         DB  44 DUP (0)
         DB '!@#$%^&*()_+'
         DB 0,0,'QWERTYUIOP{}',0DH
         DB 0,'ASDFGHJKL:',22h,7Eh,0
         DB '|ZXCVBNM<>?',3 DUP (0),20h
         DB  31 DUP (0)

Print PROC near		;процедура обработки основного символа строки
	[текст процедуры]
Print ENDP

InitScr PROC near          ;процедура инициализации экрана
	[текст процедуры]
InitScr ENDP

InitKB PROC near		;процедура установки прерывания 09h и возврата 
	cmp u,1h
	je step
	cli
	mov ax,3509h		;получение содержимого вектора 09h
	int 21h
	mov word ptr Old09,bx	;сохранение содержимого в переменной Old09
	mov word ptr Old09+2h,es
	push DS
	push CS
	pop DS
	mov ax,2509h		;установка нового обработчика прерываний
	mov dx,offset IntObr
	int 21h      
	sti
	jmp exitKB
step:	cli
	mov ax,2509h		;установка старого обработчика прерываний
	mov dx,word ptr Old09
	mov ds,word ptr Old09+2h	
	int 21h
	sti
exitKB: pop ds	
	ret
InitKB ENDP

mainprog PROC
 	call InitScr	;процедура Инициализация экрана
	mov u,0h
	call InitKB	;замена прерывания 09h на процедуру IntObr
	mov N,0h	;счетчик текущего номера в буфере
next:	mov ax,0h	;ожидание нажатия клавиши
	int 16h
	cmp N,04h	;НАЧИНАЯ ОТСЮДА КОД НЕ ВЫПОЛНЯЕТСЯ
	ja bufover
	push ax
	mov dx,0h
	mov dl,N
	mov di,dx
	pop ax
	mov Buf[di],al	
	add N,1h
	bufover:cmp ah,1Ch	
	jne next
exit:	mov cx,0h	
	mov cl,N		
	mov di,0h		
outbuf:	mov al,Buf[di]
	mov s,al
	push di
	call Print
	pop di
	inc di
	cmp di,cx
	jne outbuf  
	mov u,1h
	call InitKB	;возврат прерывания 09h
	mov ax,4C00h	
	int 21h
mainprog ENDP
Code_seg ENDS
	END mainprog

Последний раз редактировалось Stilet; 07.05.2012 в 21:13.
корица вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кнопка Выход(на выход Из программы)С++ Напишите код ProGec4 Общие вопросы C/C++ 3 19.02.2012 15:36
Некорректный перенос символов Елена Гох Microsoft Office Word 9 27.12.2010 00:31
Подмена прерывания 09h JeyKip Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 14.10.2010 23:10
перехват прерывания прямым доступом и 09h Nuander Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 25.04.2010 12:24
Блокировка клавиши. Перехват 09h. Порты. Anrih Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 18.09.2009 23:12