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

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


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

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

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

Boriss
Статус: Академик
Рейтинг: 2573
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2143
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1328
∙ повысить рейтинг »

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

Номер выпуска:1395
Дата выхода:10.12.2010, 10:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:223 / 66
Вопросов / ответов:1 / 1

Вопрос № 181103: Здравствуйте, уважаемые эксперты! Прошу Вас помочь в решении следующей задачи: Очистить экран. Вывести несколько строк произвольного текста (ат- рибут 14). Перехватив прерывание печати экрана Print Screen (Int 5h), ме- нять атрибуты всех...



Вопрос № 181103:

Здравствуйте, уважаемые эксперты! Прошу Вас помочь в решении следующей задачи:
Очистить экран. Вывести несколько строк произвольного текста (ат-
рибут 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:08
Вопрос задал: Ivan Afonin (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Ivan Afonin!
Вот Вам программа в формате COM.
Код:

.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
i nc 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

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

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 05.12.2010, 16:25
Номер ответа: 264533
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5
Комментарий к оценке:
Спасибо! =)

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264533 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.24 от 30.11.2010

    В избранное