Консультация № 181103
04.12.2010, 17:08
55.00 руб.
0 2 1
Здравствуйте, уважаемые эксперты! Прошу Вас помочь в решении следующей задачи:
Очистить экран. Вывести несколько строк произвольного текста (ат-
рибут 14). Перехватив прерывание печати экрана Print Screen (Int 5h), ме-
нять атрибуты всех строк экрана циклически от 1 до 15. Каждое нажатие
клавиши Print Screen вызывает изменение атрибута.
Для решения использовать Tasm, операционная система ДОС. Задача взята из "Программирование на Ассемблере для персональных компьютеров: учебно-методическое пособие"http://window.edu.ru/window_catalog/redir?id=45305&file=dstu08.pdf (стр. 79, вар. 24).
Спасибо.

Обсуждение

Неизвестный
04.12.2010, 17:13
общий
По возможности добавьте блок-схему пожалуйста.
давно
Посетитель
7438
7205
05.12.2010, 16:25
общий
это ответ
Здравствуйте, Ivan Afonin!
Вот Вам программа в формате COM.
[code h=200]
.model tiny
.code
.startup

mov ax,0003h ;1)необходимо для прямой записи в память под ХР
int 10h ;2)очистим экран

mov cx, 2000h ;скроем курсор
mov ah, 1
int 10h

;заполним экран текстом
mov ax, 0b800h ;сегмент видео
mov es, ax
xor di,di ;с начала 0 страницы экрана

mov al, 'A' ;в каждой строке свой символ
mov ah, attr ;атрибут начинаем с 0eh
mov cx, 25 ;25 строк
PrintLoop:
push cx
mov cx, 80 ;в строке 80 символов
rep stosw ;пишем
pop cx
inc al ;инкремент символа
loop PrintLoop ;по всем строкам

mov ax, 3505h ;прочитаем адрес вектора 05
int 21h
mov seg_05, es ;сохраним сегмент
mov off_05, bx ;смещение

lea dx, new_05 ;установим новый вектор 05 в ds:dx
mov ax, 2505h
int 21h
wait_esc:
mov ah, 0 ;ждем клавишу
int 16h
cmp ah, 37h ;PrintScreen?
je wait_esc ;все кроме PrintScreen - выход

lds dx, old_05 ;восстановим старый вектор 05
mov ax, 2505h
int 21h

.exit 0

new_05: ;PrintScreen
push ds cx di ;сохраним используемые регистры
mov cx, 0b800h
mov ds, cx ;будем использовать видеосегмент
mov di, 1 ;смещение атрибута первого символа

mov cx, 25*80 ;число симаолов на экране

mov al, cs:attr ;атрибут
inc al ;инкремент
and al, 0fh ;attr должен быть <= 15
jnz SaveAttr ; и не равен 0
inc al ;если = 0, то 1
SaveAttr:
mov cs:attr, al ;сохраним атрибут
IncAttrLoop: ;пропишем новый атрибут по всем позициям
mov [di], al
inc di
inc di
loop IncAttrLoop
pop di cx ds
iret

.data
old_05 label dword ;адрес вектора для использования в lds
off_05 dw ? ;смещение
seg_05 dw ? ;сегмент
attr db 0eh ;атрибут

end[/code]
Под чистым ДОС-ом будет работать на ура
А вот под XP не сработает...
Дело в том, что ОС перехватывает некоторые клавиши и сочетания клавиш
и до программы под ДОС они просто не доходят.
Но не все потеряно...
Есть выход! Необходимо создать в папке с COM-программой PIF-файл!
Надеюсь, Вы знаете, как это делать...
А вот в свойствах этого PIF-файла на вкладке "Разное" (см. изображение)
необходимо убрать "птичку" около PrtSc,
Т.о., кнопка PrintScreen станет доступной в нашей программе
5
Спасибо! =)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа