В. Непосредственный вывод в экранную область
Assume CS: Code, DS: Code
Code SEGMENT org 100h Start: mov ax,cs mov ds,ax ; Установка видеорежима 3 mov ah,0 ; Функция 0 mov al,3 ; Режим 3 int 10h ; Очистка экрана mov ax,0b800h mov es,ax ; ES = B800h xor si,si ; Обнуление регистра-источника xor di,di ; Обнуление регистра назначения mov cx,2000 ; Инициализация счетчика mov ax,0700h ; rep stosw ; Вывод текста lea si,text ; Смещение текста (DS) mov di,2000 ; Начальная ячейка экр. памяти mov ah,8fh ; Атрибут loop2: cmp byte ptr [si],0 ; Проверка на конец текста jz loop1 ; Выход mov al,[si] mov es:[di],ax ; На экран inc si inc di inc di jmp short loop2 ; Ожидание ввода клавиши пробела loop1: mov ah,0 ; Функция 0 int 16h cmp al,' ' ; Пробел ? jnz loop1 ; Нет ! ; Выход из программы int 20h text db 'ТЕКСТ',0 ; Вывод слова на середину Code ENDS END Start
Задача 2.1.2. Используя различные функции прерывания 10 BIOS, перепрограммировать символ знакогенератора с кодом 41Н в какой-нибудь псевдографический символ (например, в виде рожицы), заполнить весь экран этим символом, инициализировать окно, определяемое координатами 2,2 - 10,32, и вывести на всю первую строку этого окна символ с кодом 42Н с повышенной яркостью и с миганием. Выход из программы должен осуществляться по нажатию клавиши пробел.
Assume CS: Code, DS: Code Code SEGMENT org 100h Start: ; Установка видеорежима 3 mov ah,0 ; Функция 0 mov al,3 ; Режим 3 int 10h ; Перепрограммирование буквы А (код 41Н) mov ah,11h ; Функция 11h подфункция 12h mov al,12h ; Загрузка шрифта ПЗУ 8х8 mov bl,0 ; Блок знакогенератора int 10h mov bh,8 ; Высота символа в точках mov bl,0 ; Блок знакогенератора mov cx,1 ; Количество символов, описанных в таблице mov dx,41h ; Код, соотв. первому символу таблицы mov ax,cs mov es,ax ; ES:BP - адрес таблицы mov bp,offset tabl mov ah,11h ; Функция 11h подфункция 10h mov al,10h ; Загрузка шрифта пользователя int 10h ; Установка позиции курсора 0,0 mov ah,2 ; Функция 2 mov bh,0 ; Страница 0 mov dh,0 ; Строка 0 mov dl,0 ; Столбец 0 int 10h ; Запись символа в позицию курсора mov ah,0ah ; Функция 0Аh mov al,41h ; Символ 41h mov bh,0 ; Страница 0 mov cx,2000 ; Коэффициент повторения int 10h ; Инициализация или прокрутка окна вниз (2,2 - 10,32) mov ah,6h ; Функция 6 mov al,0 ; Очистка окна mov bh,8ch ; Атрибут (бит 7 - мигание, бит 3 - интенсивность, ;биты 0-2 - цвет переднего плана, биты 4-6 - цвет заднего плана mov cx,202h ; Верхний левый угол mov dx,0a20h ; Правый нижний угол int 10h ; Установка позиции курсора 2,2 mov ah,2 ; Функция 2 mov bh,0 ; Страница 0 mov dh,2 ; Строка 2 mov dl,2 ; Столбец 2 int 10h ; Запись символа в позицию курсора mov ah,0ah ; Функция 0Аh mov al,42h ; Символ 42h mov bh,0 ; Страница 0 mov cx,30 ; Коэффициент повторения int 10h ; Ожидание ввода клавиши пробела loop1: mov ah,0 ; Функция 0 int 16h cmp al,' ' ; Пробел ? jnz loop1 ; Нет ! ; Выход из программы int 20h ; Таблица перепрограммирования знакогенератора ; (здесь могут быть другие коды) tabl db 0ffh,82h,84h,88h,90h,0a0h,0c0h,0ffh
Code ENDS END Start
Задача 2.1.3. Усовершенствовать предыдущую программу так, чтобы после перепрограммирования символов и вывода сообщения нажатие пробела приводило к выходу из программы, а нажатие любой другой клавиши - циклически - к возврату исходного изображения символов и перепрограммированного. Повторный вывод сообщения следует блокировать.
Assume CS: Code;, DS: Code Code SEGMENT org 100h Start: jmp start1 flag db 0 ; Флаг вывода сообщения ; Установка видеорежима 3 start1: mov ah,0 ; Функция 0 mov al,3 ; Режим 3 int 10h ; Перепрограммирование буквы А (код 41Н) mov ah,11h ; Функция 11h подфункция 11h mov al,11h ; Загрузка шрифта ПЗУ 8х14 mov bl,0 ; Блок знакогенератора int 10h loop2: mov bh,14 ; Высота символа в точках mov bl,0 ; Блок знакогенератора mov cx,2 ; Количество символов, описанных в таблице mov dx,41h ; Код, соотв. первому символу таблицы mov ax,cs mov es,ax ; ES:BP - адрес таблицы mov bp,offset tabl mov ah,11h ; Функция 11h подфункция 10h mov al,10h ; Загрузка шрифта пользователя int 10h ; Вывод сообщения test byte ptr flag,0ffh ; Проверка флага печати jnz m1 ; Пропуск печати, если флаг взведен mov ah,9 ; Функция вывода строки lea dx,text ; Смещение текста int 21h mov byte ptr flag,1 ; Ожидание ввода клавиши пробела m1: mov ah,0 ; Функция 0 int 16h cmp al,' ' ; Пробел ? jz loop1 ; Да ! mov ah,11h ; Функция 11h подфункция 11h mov al,11h ; Загрузка шрифта ПЗУ 8х14 mov bl,0 ; Блок знакогенератора int 10h mov ah,0 ; Функция 0 int 16h cmp al,' ' ; Пробел ? jz loop1 ; Да ! jmp loop2 ; Выход из программы loop1: int 20h ; Таблица перепрограммирования знакогенератора ; (здесь могут быть другие коды) tabl db 3ch,42h,81h,0a5h,81h,99h,99h,99h,81h,0a5h,99h,42h,3ch,0 db 3ch,42h,81h,0a5h,81h,99h,99h,99h,81h,99h,0a5h,42h,3ch,0 text db 0dh,0ah,0ah,'Замена символов произведена:' db 0dh,0ah,'41h = A',0dh,0ah,'42h = B',0dh,0ah,'$' Code ENDS END Start
Задача 2.1.4. Написать программу, которая поместила бы процедуру, выводящую сообщение о своем местонахождении, по адресу 8800h. Выход из пересланной процедуры должен осуществляться по клавише ENTER. После возврата в основную программу должно выводиться сообщение об успешном завершении программы. Выход из основной программы должен осуществляться по нажатию клавиши пробела. После переписывания дальней процедуры в область 8800h следует стереть ее текст в основной программе для демонстрации того, что на исходном месте она не может быть выполнена. Для выполнения дальнего перехода следует использовать команду RETF, поместив предварительно в стек сегмент и смещение желаемого места перехода. Перед переходом в дальнюю процедуру следует позаботиться о правильном значении сегментного регистра DS. О том же следует позаботиться и при возвращении в основную программу. Попробуйте выполнить эту программу с другими адресами места назначения, в частности, в экранной области: B800h, BC00h, B900h.
Популярное: Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (461)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |