В. Непосредственный вывод в экранную область

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Н с повышенной яркостью и с миганием. Выход из программы должен осуществляться по нажатию клавиши пробел.

х х х х х х х х 0ffh
х           х   82h
х         х     84h
х       х       88h
х     х         90h
х   х           0a0h
х х             0c0h
х х х х х х х х 0ffh

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. Усовершенствовать предыдущую программу так, чтобы после перепрограммирования символов и вывода сообщения нажатие пробела приводило к выходу из программы, а нажатие любой другой клавиши - циклически - к возврату исходного изображения символов и перепрограммированного. Повторный вывод сообщения следует блокировать.

  Символ 41h       Символ 42h  
    х х х х     3ch       х х х х     3ch
  х         х   42h     х         х   42h
х             х 81h   х             х 81h
х   х     х   х 0a5h   х   х     х   х 0a5h
х             х 81h   х             х 81h
х     х х     х 99h   х     х х     х 99h
х     х х     х 99h   х     х х     х 99h
х             х 99h   х             х 99h
х             х 81h   х             х 81h
х   х     х   х 0a5h   х     х х     х 99h
х     х х     х 99h   х   х     х   х 0a5h
  х         х   42h     х         х   42h
    х х х х     3ch       х х х х     3cg
                                 

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.

Наши рекомендации