Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 3383
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2581
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2052
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1501
Дата выхода:26.12.2011, 21:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:181 / 63
Вопросов / ответов:1 / 1

Консультация # 184907: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Задание. Разработать программу переопределения прерывания 05h (клавиша PrintScreen). Замечания: 1. перед загрузкой нового вектора прерывания необходимо сохра-нить старый вектор (функция 35h прерывания 21h); 2. для проверки, новая процедура обработки прерывания 05h...


Консультация # 184907:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Задание. Разработать программу переопределения прерывания 05h (клавиша PrintScreen).
Замечания:
1. перед загрузкой нового вектора прерывания необходимо сохра-нить старый вектор (функция 35h прерывания 21h);
2. для проверки, новая процедура обработки прерывания 05h должна выполнять действия в соответствии с вариантом задания. В основной программе необходимо организовать большой цикл, в течении которого можно будет проверить работы прерывания (прерывание 21h в этом цикле использовать нельзя, если оно будет использоваться в подпрограмме обработки прерывания;
3. вывод на экран в из подпрограммы обработки прерывания, можно выполнять, используя функции прерывания 21h, но лучше непо-средственно оперируя с видеопамятью;
4. перед выгрузкой программы из памяти восстановить старый вектор прерывания (функция 25h прерывания 21h).
Таблица. Варианты заданий
Подпрограмма обработки прерыван ия должны выводить на экран свой адрес в шестнадцатеричной системе счисления в форме «сегмент:смещение». (Эти данные можно прочитать из 5 ячейки таблицы векторов прерывания).
Ассемблер-Tasm.exe Исполняемый файл в формате EXE.

Дата отправки: 21.12.2011, 20:45
Вопрос задал: Дмитрий (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Дмитрий!
Вот Вам программа, которая устанавливает на время своей работы свой обработчик вектора 5
Для вывода на экран использовал прерывание БИОС-а.
Это лучше, чем прерывание ДОС-а, которое крайне нежелательно использовать в прерывании.
Да и проще варианта с прямой записью в память. smile

Обратите внимание, что если ее просто так запустить под ХР, то программа не будет работать, как надо!!!
Это связано с тем, что система некоторые комбинации клавиш и просто клавиши, в том числе PrintScreen,
считает служебными и не желает отдавать их программам.
Но клавишу PrintScreen можно попросить у системы, если создать PIF-файл для EXE-программы.
И там, в свойствах, на вкладке "Разное" выключить checkbox "PrtSc".
Запускать программу надо будет с помощью PIF-файла.

Код :
	.model	small

assume	cs:code, ds:data, ss:Stk

Stk	segment stack
	dw	1024 dup (?)
Stk	ends

data	segment
sPress	db	0dh,0ah,'Press ESC for exit...$'
Off_05	dw	?		;указатель на старый обработчик вектора 05h
Seg_05	dw	?
data	ends

code	segment
main	proc
	mov	ax, data
	mov	ds, ax		;ds = data

	mov	ax, 3505h
	int	21h		;узнаем вектор 05h в es:bx

	mov	Off_05, bx	;сохраним старый адрес в сегменте данных
	mov	Seg_05, es

	push	ds
	lea	dx, new_05	;установим новый адрес
	push	cs		;обработчика прерывания 05h
	pop	ds		;ds:dx
	mov	ax, 2505h
	int	21h
	pop	ds

	lea	dx, sPress	;выведем приглашение нажать ESC
	mov	ah, 9
	int	21h

wait_ESC:
	mov	ah, 0		;ждем
	int	16h
	cmp	al, 1bh		;выходим по ESC
	jne	wait_ESC

				;воcстановим старый обработчик вектора 05h
	push	ds		;ds
	lds	dx, dword ptr Off_05	;ds:dx - адрес старого вектора
	mov	ax, 2505h
	int	21h		;восстановим!
	pop	ds 		;ds = data
	sti

	mov	ax, 4c00h
	int	21h		;выход в ДОС
main	endp

new_05	proc	far		;подпрограмма отработки 05h
	push	ax
	push	ds
	mov	al, 0dh		;на новую строку
	int	10h
	mov	al, 0ah
	int	10h
	xor	ax, ax
	mov	ds, ax		;сегмент векторов
	mov	ax, ds:[5*4+2]	;сегмент вектора 5
	call	PrintHex	;в hex
	mov	al, ':'
	int	10h
	mov	ax, ds:[5*4]	;смещение вектора 5
	call	PrintHex	;в hex
	pop	ds
	pop	ax		;восстановим регистры
	iret			;возврат из прерывания
new_05	endp

PrintHex	proc		;вывод ax в hex
	push	ax
	mov	al, ah		;старший байт
	call	PutHexByte
	pop	ax		;младший байт
PutHexByte:
	push	ax
	shr	al, 4		;старшая тетрада
	call	PutHexDigit
	pop	ax
	and	al,0fh		;младшая
PutHexDigit:			;вывод hex-цифры
	add	al,90h
	daa
	adc	al,040h
	daa
	mov	ah, 0eh		;ф-я вывода al на экран БИОС-а
	int	10h
	ret
PrintHex	endp

code	ends

	end	main

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 21.12.2011, 23:22
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное