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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2010, 09:14   #1
Kastaneda
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 22
По умолчанию Не могу найти ошибку в перехвате int 9

Смысл перехвата прерывания в том, что при нажатии ESC - выход из программы, при нажатии Alt+буква - вызвать процедуру. Написал вот такой код:
Код:
init: mov ax,3509h            ; принимаем аддрес обработчика int 9
      int 21h
      mov word ptr oldint9+2,es ; сохраняем аддрес
      mov word ptr oldint9,bx
      mov ax,2509h
      mov dx,offset int9
      int 21h          ; устанавливаем свой обработчик
	  jmp start
int9:push ax
     push es
     xor ax,ax 
     mov es,ax
     mov al,es:0417h  ; берем байт статуса клавиатуры
     test al,00001000b  ; проверяем не нажат ли Alt
     jnz @
     in al,60h
     cmp al,01h ;сравниваем со скан кодом ESC
     jne no
     mov ax,20h ; разблокируем клавиатуру
     out 20h,al
     mov ax,2509h    ;здесь я возвращаю старый адрес обработки INT 9
     mov dx,word ptr[oldint9]  ; но я не уверен, что это правильно
     int 21h
     mov ax,4c00h
     int 21h 
@: in al,60h ; принимаем скан-код с клавиатуры
	 cmp al,3Eh ; сравниваем со скан кодом C
	 jne Zkl
	 call Cflag ;
	 jmp Ras
Zkl: cmp al,2Ch ; 	 сравниваем со скан кодом Z
	 jne Skl
	 call Zflag
	 jmp Ras
Skl: cmp al,1Fh ;сравниваем со скан кодом S
     jne Okl
     call Sflag	
     jmp Ras
;далее подобные проверки на каждую нужную клавишу	 
	 
Ras: pop es
     pop ax
     mov ax,20h ; разблокируем клавиатуру
     out 20h,al
     iret ; завершаем прерывание
no: pop es
    pop ax
      jmp dword ptr cs:[oldint9] ; передаем управление старому обработчику

start:...
Этот код у меня в самом начале программы, проблема вот в чем: выход по ESC работает, но при повторном запуске из Cmd клавиатура заблокирована или выходит ошибка типа "Процессор обнаружил не допустимую инструкцию" . А вот Alt+буква не работают вообще, т.е. при нажатии просто ни чего не происходит. Помогите найти ошибку, я что-то не могу
Kastaneda вне форума Ответить с цитированием
Старый 21.03.2010, 09:53   #2
Kastaneda
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 22
По умолчанию

Кому не лень, посмотрите под отлачиком. Там почему-то какие-то левые строки появились, и вообще что-то не понятное происходит.
Kastaneda вне форума Ответить с цитированием
Старый 21.03.2010, 20:31   #3
Kastaneda
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 22
По умолчанию

С "Alt+ буква" разобрался, ошибки в вызываемых процедурах, но при нажатии этой комбинации клавиатура блокируется и работают только эти клавиши.
Kastaneda вне форума Ответить с цитированием
Старый 21.03.2010, 20:40   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

давайте скину код своего обработчика, может поможет чем то
Код:
model tiny
.code
org 100h
main:
;============================================
;яюыучхэшх трсышцы тхътюЁют
        push es
        xor ax,ax
        mov es,ax

;==========================================
;яюыучхэшх тхътюЁр 9 яЁхЁытрэшя
        mov ax,word ptr es:[09h*4]
        mov word ptr old_handler,ax
        mov ax,word ptr es:[09h*4+2]
        mov word ptr old_handler+2,ax

;=========================================
;чрьхэр тхътюЁр
        mov ax,cs
        mov word ptr es:[09h*4+2],ax
        mov ax,offset handler
        mov word ptr es:[09h*4],ax

;=======================================
;юётртшть Ёхчхфхэтэю
        pop es
        mov bx,offset last_byte
        int 27h

;=====================================
;ёюсёттхээыщ юсЁрсютчшъ
handler:
      push es ds si di cx bx dx ax
      xor ax,ax
      mov ah,02h
      int 16h
      test al,00000100b
      jz standart_handler	;если не нажата клавиша ctrl переход на стандартный обработчик
	in al,60h	      
      cmp al,1eh	;если нажата клавиша "a" то выводим на экран hello world в противном случае проверяем "s"
	jne ctrl_s

	mov ax, cs
     mov ds, ax
     mov ax, 0B800h
     mov es, ax
     mov si, offset message
     xor di, di
     mov cx, msg_len
     rep movsb
	
;	push es
;	mov ax,cs
;	mov es,ax
;	
;	mov ah,13h
;	mov cx,11
;	mov dh,3
;	mov dl,3
;	mov bp,offset message
;	int 10h
;	pop es
;	jmp end_handler
ctrl_s:
	cmp al,1fh	;если нажата клавиша "s" то выводим на экран hello world в противном случае переходим на стандартный обработчик
	jne standart_handler
	
;=================================================
;чртхЁшхэшх юсЁрсютъш
end_handler:
        mov al,20h      ;яюёырть ёшуэры "ъюэхц яЁхЁытрэшя"
        out 20h,al  ; ъюэтЁюыыхЁу яЁхЁытрэшщ
        pop ax dx bx cx di si ds es
        iret


;==================================================
;тючтЁрт ётрэфрЁтэюую яЁхЁытрэшя
standart_handler:
        pop ax dx bx cx di si ds es
        jmp dword ptr cs:old_handler
	  iret

        old_handler dd ?
        t db ?
        message db 'H',0Ch,'E',0Ch,'L',0Ch,'L',0Ch,'O',0Ch,' ',0Ch
    		db ' ',0Ch,'W',0Ch,'O',0Ch,'R',0Ch,'L',0Ch,'D',0Ch
        msg_len = $ - message
last_byte:
end main
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 22.03.2010, 08:08   #5
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

Код:
     mov ax,2509h    ;здесь я возвращаю старый адрес обработки INT 9
     mov dx,word ptr[oldint9]  ; но я не уверен, что это правильно
     int 21h
что у вас в DS в данном случае
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 22.03.2010, 08:29   #6
Kastaneda
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 22
По умолчанию

В DS слово по адресу oldint9+2, т.е. адрес сегмента обработки INT 9h. В коде из первого поста этого нет, там в DS что попало, но я вчера это заметил и сделал, чтоб правильно было. Но это все равно не решило проблемы.
Kastaneda вне форума Ответить с цитированием
Старый 22.03.2010, 08:42   #7
Kastaneda
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 22
По умолчанию

Сам код теперь выглядет не так, вот выкладываю архив, там прога и код перехвата. Прогу закинул, чтоб всех ошибок здесь не описывать. Если кому не лень, в проге воспользуйтесь Alt+буква, а потом попробуйте ввести то, что там просят. Или запустите из CMD выйдете по ESC, а потом еще раз запустите. В коде все вызываемые процедуры проверены, в них точно ошибок нет. Ошибка где-то в самой обработке перехваченого прерывания.
flags.rar

Заранее спасибо!
Kastaneda вне форума Ответить с цитированием
Старый 22.03.2010, 09:54   #8
Kastaneda
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 22
По умолчанию

Sparky, ваш код понятен, у меня по моему все анологично, а можете объяснить, что за фишка:
Код:
 msg_len = $ - message
Я пользуюсь TASM'ом, знаю что у MASM'a есть какие-то свои примудрости, это одна из них?
Kastaneda вне форума Ответить с цитированием
Старый 22.03.2010, 14:39   #9
Kastaneda
Пользователь
 
Регистрация: 26.02.2010
Сообщений: 22
По умолчанию

Все, нашел ошибку! Как только не переписывал код, в итоге дело оказалось в одной строке, всего то нужно было заменить
Код:
iret
на
Код:
jmp dword ptr cs:[oldint9]
Но 3 дня проведенные в отладчике не прошли даром, +100 к навыку "отладка"
Kastaneda вне форума Ответить с цитированием
Старый 22.03.2010, 16:11   #10
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Я тоже пользуюсб TASM, получение размера строки
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку Tesmont Помощь студентам 2 20.05.2009 21:00
Не могу найти ошибку(С++) Yura_n Помощь студентам 8 20.01.2009 12:36
Не могу найти ошибку . KVANTOM Общие вопросы Delphi 2 08.01.2009 17:15
Не могу найти ошибку! Эдуард Общие вопросы C/C++ 7 27.02.2008 16:34