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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2010, 19:50   #1
zhuk99
 
Регистрация: 25.09.2010
Сообщений: 5
По умолчанию Ошибка с флагами в резиденте

Требуется написать резидент - драйвер преобразования русских букв к верхнему регистру. По нажатию F5 включать и выключать резидент.

Написано все и все работает пока нажимаешь клавиши медленно. Если зажать кнопку, то иногда проскакивает тот регистр, который не нужен. Тоже самое, если нажать ф5, то флаг как-то скачет.

Код:
main proc
    jmp 	init
  
  ; Поля данных резидентной секции
  old_2fh dd 0              ; Ячейка для сохранения системного вектора 2Fh
  old_09h dd 0              ; Ячейка для сохранения системного вектора 09h
	flag	dw	1		;
	flag2	db 	0
  ; Обработчик прерываний от клавиатуры
new_09h proc
	
	pushf	;сохраняем для команды iret
	call	CS:old_09h 	;вызываем старое прерывание,оно читает из порта сканкод
				;нажатой клавиши,переводит в ASKII и записывает 
				;в кольцевой буффер клавиатуры
	
	;jmp		notunload
	cli
notunload:
	push	ax
	push	bx
	push	cx
	push	dx
	push	bp
	push	ds
	push	es
	
	mov		ax,cx	;настройка ds на сегмент
	mov		ds,ax	
	mov		ax,40h	;настройка es на область данных BIOS
	mov		es,ax	
	
	;копируем, но не изымаем из буфера 
	mov 	bx,es:1Ah	;адрес головы буфера
    cmp 	bx,es:1Ch	;если он равен адресу хвоста,
    je  	exit    	        ;значит буфер пуст,на выход 
	mov		cx,es:1ch
	mov 	ax,es:[bx]    	;иначе считываем символ из головы буфера
	;проверка введенного символа   
	
	mov		es:1ch,bx		;;;;;;;;;;;;
	
	cmp 	ah,3Fh		; код f5
	je		f5
	
	
	;jmp 	exit
	cmp 	flag,0
	je		return
	
	
	cmp 	al,0A0h		;'а'=160
    jb 		return        	;<160
	cmp 	al,0B0h		;'п'=175
    jb 		sub1         	;160<=al<=175		
	cmp 	al,0E0h		;'р'=224
    jb 		return        	;175<al<224       
	cmp 	al,0F0h     	;'я'=239
    jb 		sub2   		;>239
	jmp		return

sub1:			;введена буква от 'а' до 'п'
	sub 	al,20h			;изменяем регистр символа(-32) и
	;mov 	byte ptr es:[bx],al	;записываем в буфер новое значение
	
	jmp		print
sub2:			;введена буква от 'р' до 'я'
	sub 	al,50h		  	;изменяем регистр символа(-80) и
	;mov 	byte ptr es:[bx],al	;записываем в буфер новое значение
	jmp		print

print:
;;;;;;;;;;;;;;;;;;;;
	xor		bh, bh
	mov		ah, 03h			; ЮЙФБЕН РПЪ. ЛХТУПТБ 
	int		10h

	mov 	bx, 0002h		; УФБЧЙН ТЕЦЙН ЧЩЧПДБ
	mov		cx, 0001h
	
	;sub		al,20h	
	mov 	ah, 09h
	int 	10h

	inc		dx
	
	mov 	ah, 02h
	int 	10h
	;;;;;;;;;;;;;;;;;;;;;;;;;
	jmp		exit
f5:
	;mov		es:1ch,bx
	
	cmp		flag,0		
	je		flag_is_0
	
	
	mov		al,'1'
	mov 	ah,02h
	mov 	word ptr es:[bx],ax
	
	mov		flag,0
	jmp 	return
flag_is_0:				
	
	mov		al,'0'
	mov 	ah,0bh
	mov 	word ptr es:[bx],ax
	mov		flag,1
	jmp		return

return:
	mov		es:1ch,cx
	
exit:                    
	pop		es
	pop 	ds
	pop		bp
	pop		dx
	pop		cx
	pop 	bx
	pop		ax
	
	sti
	iret

new_09h	endp
Во вложении все необходимое для запуска:
запускаем rkm, нажимаем ctrl , запускаем 88.
ну и экспериментируем с f5 на русском.

Заранее благодарен!
Вложения
Тип файла: rar pack.rar (44.9 Кб, 7 просмотров)

Последний раз редактировалось zhuk99; 26.09.2010 в 16:08.
zhuk99 вне форума Ответить с цитированием
Старый 25.09.2010, 23:43   #2
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

А зачем выводить символ в обработчике 9 прерывания? Нужно его просто подменять в буфере мне кажется. А там, уже вызывающая программа сама разберется, что ей дальше делать - печатать символ или как-то по другому его обработать.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 26.09.2010, 14:59   #3
zhuk99
 
Регистрация: 25.09.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от zhuk99 Посмотреть сообщение
Код:

	flag	dw	1		;
	flag2	db 	0
  ; Обработчик прерываний от клавиатуры
new_09h proc
	
	.........
        .........
	
	mov		es:1ch,bx		;;;;;;;;;;;;
	
	cmp 	ah,3Fh		; код f5
	je		f5
	
	
	;jmp 	exit
	cmp 	flag,0
	je		return
	............................................
.................................................
....................................................
......................................................
	
	
f5:
	;mov		es:1ch,bx
	
	cmp		flag,0		
	je		flag_is_0
	
	
	mov		al,'1'
	mov 	ah,02h
	mov 	word ptr es:[bx],ax
	
	mov		flag,0
	jmp 	return
flag_is_0:				
	
	mov		al,'0'
	mov 	ah,0bh
	mov 	word ptr es:[bx],ax
	mov		flag,1
	jmp		return

return:
	mov		es:1ch,cx
Да с задачей резидента я всяко справлялся. И очищал буфер и заменял там букву. Проблема в том что флаг не корректно себя ведет. То есть:
запускаем программу - флаг равен 1, требуется преобразовывать к верхнему регистру. Нажимаем f5. флаг равен 0. на строках
cmp flag,0
je return
он должен пропускать преобразование, и при медленных нажатиях он это делает. Если начать нажимать клавиши быстро, то он повидимому иногда затирается и становиться равным 1. И вылетают большие буквы.

Еще интересно получается если зажать f5 - прога выводит предыдущее значение флага по нажатию. Так вот если зажать f5 то должна быть последовательность 0101010101010 и тд а вываливается 01011110101101011110001011 - как видно не то что нужно!
cli sti вроде стоят - в чем же проблема!?
zhuk99 вне форума Ответить с цитированием
Старый 26.09.2010, 15:09   #4
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

А, сорри, не увидел что там еще по F5 включается-отключается замена. Мммм.. А можно полный код программы, а то мне так не удобно дебажить..
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 26.09.2010, 18:42   #5
zhuk99
 
Регистрация: 25.09.2010
Сообщений: 5
По умолчанию

или вот тут взять можно.
Вложения
Тип файла: rar rd.rar (30.5 Кб, 4 просмотров)
zhuk99 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nero - ошибка драйвера DMA. ошибка CRC NecRoMat Софт 5 09.05.2012 01:29
ассемблер, возврат управления в резиденте insan00b Помощь студентам 6 25.01.2010 16:26
Работа с флагами!!! Student117 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 19.11.2009 09:27
Это ошибка Delphi или моя ошибка??? bloodeagle Общие вопросы Delphi 3 12.11.2009 15:26