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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2010, 16:35   #1
TAUREN
 
Регистрация: 06.10.2007
Сообщений: 5
Вопрос Проблемный вывод строки из резидента

Здравствуйте.
Суть такова, нужно в резидентной программе при нажатии CTRL+S вывести сообщение, допустим "Hello". Возвращаем старый обработчик прерывания, выводим сообщение и вновь записываем адрес нашего обработчика.
Однако, вместе с "Hello" выводятся восклицательные знаки (что соответствует если в мс-досе понажимать CTRL+S).
Не пойму в чем проблема.
Код под MS-DOS.
Код:
.model tiny
MAIN segment
ASSUME cs:MAIN, ds:MAIN, ss:MAIN, es:MAIN
org 100h

start:
jmp transit

label_tsr dw 4376h

;Tsr next
vect09_new proc
	pushf
	push ax
	push bx
	push cx
	push dx
	push ds
	push es
	
	pushf
	call dword ptr cs:vect09_old
	
;проверяем не нажат ли ctrl+x: тестируем второй бит состояния клавиатуры
unload_key:
	mov ah,02
	int 16h
	test al,04h
	jz iret_l
;если он выставлен в 1, проверяем не нажата ли X
	in al,60h
	cmp al,2Dh
	je unload
	cmp al,1Fh
	je next_step
	jmp iret_l
	
next_step:
		
 	mov ax,2509h
	mov dx,word ptr cs:[vect09_old]
	mov ds,word ptr cs:[vect09_old+2]
	int 21h
	push cs
	pop ds
	
	pushf
	call dword ptr cs:vect09_old
	
	call set_time

	
	mov ax,2509h
	lea dx,vect09_new
	int 21h
	

	jmp iret_l
	
;выгружаем из памяти: восстанавливаем старые обработчики
unload:
	mov ax,2509h
	mov dx,word ptr cs:[vect09_old]
	mov ds,word ptr cs:[vect09_old+2]
	int 21h
	
	mov ax,251Ch
	mov dx,word ptr cs:[vect1c_old]
	mov ds,word ptr cs:[vect1c_old+2]
	int 21h

;настраиваем на текущий сегмент и выгружаемся
	push cs
	pop  es
	mov ah,49h
	int 21h
	
iret_l:

	pop   es
	pop   ds
	pop   dx
	pop	  cx
	pop	  bx
	pop	  ax
	popf
	iret

;Память
vect09_old dd ?
;================
vect09_new endp

;Процедура вывода времени
set_time proc


	mov ah,09h
	lea dx,hello
	int 21h

	ret
hello db 'Hello!','$'
set_time endp

;================
;Транзитная часть
;================

transit:
;получаем вектор прерывания
	mov ax,3509h
	int 21h
;проверяем загружен ли уже резидент
	mov ax,es:[bx-2]
	cmp ax,cs:label_tsr
	je warning_msg
;сохраним старые значения векторов
	mov word ptr vect09_old,bx
	mov word ptr vect09_old[2],es
;запишем адрес нового обработчика клавиатуры
	mov ax,2509h
	lea dx,vect09_new
	int 21h
;выгрузим блок psp
	mov ah,49h
	mov es,word ptr cs:[2Ch]
	int 21h
;Выводим сообщение о загрузке
hello_msg:
	lea dx,msg_hello
	mov ah,9
	int 21h
;оставляем транзитную часть
	lea dx,transit
	int 27h
	jmp exit
;сообщение о загруженном резиденте
warning_msg:
	lea dx, msg_bye
	mov ah,9
	int 21h
exit:
	mov ax,4C00h
	int 21h
;Messages
msg_hello db 'Dlya pokaza nazhmite CTRL+S, dlya vigruzki nazhmite CTRL+X',13,10,'$'
msg_bye db 'Rezident uzhe zagruzhen!',13,10,'$'
MAIN ends
end start
TAUREN вне форума Ответить с цитированием
Старый 11.12.2010, 12:51   #2
dmitradze
 
Регистрация: 06.12.2010
Сообщений: 8
По умолчанию

Это нормально
dmitradze вне форума Ответить с цитированием
Старый 11.12.2010, 14:22   #3
TAUREN
 
Регистрация: 06.10.2007
Сообщений: 5
По умолчанию

Цитата:
Сообщение от dmitradze Посмотреть сообщение
Это нормально
всё бы ничего, но в моем случае это не приемлемо.
в основной программе нужно будет по CTRL+S вызывать еще и ввод с клавиш.
"Введите время: !!" и два восклицательных, которые нужно стирать, это нехорошо.
TAUREN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод строки mansp Общие вопросы C/C++ 3 08.11.2010 21:30
вывод строки на экран veter_s_morya Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 20.06.2010 18:25
Indy или проблемный код? garyanikin Работа с сетью в Delphi 3 18.01.2010 16:21
Создать резидента в Паскале Иллидан Паскаль, Turbo Pascal, PascalABC.NET 8 29.02.2008 18:53