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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2010, 13:00   #1
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
Лампочка Подмена прерывания 09h

Всем доброго времени суток... мне нужно написать свой обработчик 9 прерывания..из порта 60h берется скан-код клавиши, потом командой XLAT из таблицы выбирается значение ASCII-кода и посылает его в буфер клавиатуры...(например, если скан-код 30h, то из таблицы берется 31 байт, который содержит ASCII-код буквы 'a')...но у меня, почему-то, это не работает...при нажатии на разные клавиши выдает на экране всякую хрень...в чем проблема, подскажите пожалуйста...

Код:
codesg segment
    assume cs: codesg, ds: codesg, es: codesg, ss: codesg
    org 100h
    begin: jmp main 

  klava    db 0,0,49,50,51,52,53,54,55,56,57,58,0,1,0,0
	        db 113,119,101,114,116,121,117,105,111,112,0,0,0,0
		db 97,115,100,102,103,104,106,107,108,0,0,0,0,0
		db 122,120,99,118,98,110,109
      		db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0              ;пропуск до верхнего регистра
        	db 'QWERTYUIOP',0,0,0,0 ;те же символы на верхнем
        	db 'ASDFGHJKL',0,0,0,0,0 ;регистре
        	db 'ZXCVBNM'            ;

key_driver proc far
push ds di es ax bx cx dx

in al,60h
mov ah,0
push ax

in al,61h
mov ah,al
or al,10000000b
out 61h,al
mov al,ah
out 61h,al

mov ax,40h
mov es,ax

mov bx,offset ds:klava
pop ax
xlat
cmp al,0
je @end

mov bx,1ah
mov cx,es:[bx]
mov di,es:[bx]+2
cmp cx,60
je @high_end
add cx,2
cmp cx,di
je @end
jmp @go_ahead

@high_end:
	cmp di,30
	je @end

@go_ahead:
	mov es:[di],al
	cmp di,60
	jne @no_wrap
	mov di,28

@no_wrap:
	add di,2
	mov es:[bx]+2,di

@end:
mov al,20h
out 20h,al
pop dx cx bx ax es di ds
iret               
final equ $
key_driver endp
    

main proc near
;взять адрес 9 прерывания	
		mov ah,35h
		mov al,9h
		int 21h
;записать 9 прерывание по адресу 60h
cli 
push ds
mov dx,bx
mov ax,es
mov ds,ax

mov ah,25h
mov al,60h 
int 21h
pop ds
sti

;записать в 9 прерывание резидентную часть
mov ah,25h
mov al,9h
lea dx,key_driver
int 21h

;передать первый байт за резидентной частью
lea dx, final
int 27h
      ret  

main endp
      codesg ends
      end begin
JeyKip вне форума Ответить с цитированием
Старый 14.10.2010, 13:04   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

JeyKip
грузишь дос с дискетки/флешки или пытаешься работать со своей программой из под Винды? Под Виндовс работа с портами и 21-ым прерыванием только эмулируется и порой не всегда удачно...
Mikl___ вне форума Ответить с цитированием
Старый 14.10.2010, 13:14   #3
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию

работаю с под Винды...недавно писал резидентную процедуру по генерации звука посредством таймера, там тоже необходимо было работать с портами и подменой 9 прерывания...но только там сравнивал определенные символы, а иначе вызывал оригинальное, сохраненное в 60h...и все работало...а в этой программе, вроде, XLAT работает некорректно...пробовал ввести в al 30 перед XLAT, чтобы при каждом нажатии клавиши выводилось на экран a, но выдавал какой-то псевдографический символ...(( уже сломал голову...((
JeyKip вне форума Ответить с цитированием
Старый 14.10.2010, 13:18   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

JeyKip
мой совет -- загрузись под "чистым DOS"
по резидентам есть в книге Зубкова "Assembler для DOS, Windows и UNIX"
Mikl___ вне форума Ответить с цитированием
Старый 14.10.2010, 13:29   #5
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

Код:
mov bx,offset ds:klava
pop ax
xlat
cmp al,0
je @end
риторически: куда смотрит ds в прерывании?
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 14.10.2010, 13:39   #6
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию

вот с этим я тоже запутался...были мысли, что программа просто адрес таблицы не может увидеть...пробовал так же, только через es...то же самое...как мне узнать и загрузить реальный адрес таблицы...?

Последний раз редактировалось JeyKip; 14.10.2010 в 13:42.
JeyKip вне форума Ответить с цитированием
Старый 14.10.2010, 14:25   #7
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

можно адресоваться через CS
Mikl___ вне форума Ответить с цитированием
Старый 14.10.2010, 23:10   #8
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

Код:
push cs
pop ds
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перехват прерывания прямым доступом и 09h Nuander Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 25.04.2010 12:24
подмена порта Bertrance Свободное общение 9 06.02.2010 08:30
подмена клавиши А на B GeneralSan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 23.12.2009 20:28
Блокировка клавиши. Перехват 09h. Порты. Anrih Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 18.09.2009 23:12
Подмена IP ? KAKTYC PHP 2 28.10.2008 00:14