В. Непосредственный вывод в экранную область
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.