|
||||||||||||||||||
Пример программы. . ОБЩИЕ ПОЛОЖЕНИЯ6. Пример программы. Title GRAFIC datasg segment para MAS db 0,1,5,8,9,8,5,1,0,-1,-5,-8,-9,-5,-1 FUNC dw -450, -350, 0, 250, 375, 400, 420, 360, dw 325, 300, 285, 200, 0 –200, -275 datasg ends
stacksg segment para stack 'stack' db 128 dup (?) stacksg ends
codesg segment para 'code'
ASSUME SS: stacksg, CS: codesg, DS: datasg
start: MOV AX, DATASG MOV DS, AX ; ЗАДАНИЕ РЕЖИМА ЭКРАНА С ОЧИСТКОЙ MOV AH, 00H MOV AL, 03H ; цветной, 25 Х 80 INT 10H ; ИЗОБРАЖЕНИЕ ВЕРТИКАЛЬНОЙ ОСИ MOV BH, 00H MOV DL, 5 ;координаты верхней точки Х=5, MOV DH, 1 ; Y =1. met1: MOV AH, 02H INT 10H ; установка курсора MOV CX, 1 MOV AL, 7CH; символ вертикальной черточки MOV BL, 07H; яркобелый по черному MOV AH, 09H INT 10H ; вывод символа INC DH ;переход к координате Y+1 CMP DH, 24 ;сравнение с нижней позицией JB met1 ; цикл вывода символа ; ИЗОБРАЖЕНИЕ ГОРИЗОНТАЛЬНОЙ ОСИ MOV BH, 00H MOV DL, 5 ; координаты левой позиции Х=5, MOV DH, 12 ; Y=12. MOV AH, 02H INT 10H ; установка курсора MOV CX, 50 ; длина цепочки символов MOV AL,5FH ; символ горизонтальной черточки MOV BL, 07H; яркобелый по черному MOV AH, 09H INT 10H ; вывод символа ; ВЫВОД ТОЧЕК ГРАФИКА LEA SI, MAS ; адрес массива значений MOV DI, 15 ; счетчик циклов MOV CX, 1 ; вывод по одному символу MOV BH, 00H MOV DL, 5 ; координаты первой точки X=5, cikl: MOV DH, 12 ; Y=12. SUB DH, [SI] ; вычисление Y(i) MOV AH, 02H INT 10H ; установка курсора MOV AL, 2AH; символ (*) MOV BL, 0CH; яркокрасный по черному MOV AH, 09H INT 10H ; вывод символа ADD DL,3 ; следующая координата по Х INC SI ; адрес следующего значения DEC DI ;изменение счетчика циклов JNZ cikl ; цикл вывода ;ЗАВЕРШЕНИЕ ПРОГРАММЫ MOV AX, 4C00H INT 21H CODESG ENDS END start
7. ОБЩИЕ ПОЛОЖЕНИЯ Экран монитора можно представить себе в виде двумерного пространства с адресуемыми позициями, в любой из которых может быть воспроизведен некоторый символ. Количество позиций, возможные цвета фона и символов задаются режимом экрана. Набор воспроизводимых символов определяется используемой системой кодировки символов. Задача создания графических изображений средствами Ассемблера включает в себя следующие процедуры: - очистка экрана с заданием цвета фона и воспроизводимых символов; - установка курсора в нужную позицию; - вывод символа; - вывод горизонтальной цепочки любых символов (в том числе и текстовой строки). Для реализации указанных процедур программы на языке Ассемблера используют команды системных прерываний. Множество функций, связанных с операциями ввода-вывода, реализует команда системного прерывания INT 10H, передающая управление в BIOS (базовая система ввода-вывода), а также INT 21H, передающая управление в DOS. Код требуемой функции загружается в регистр АН. В начале программы следует задать режим экрана. Для этого используется INT 10H с АН=00Н, а в AL помещается код режима. Так, код AL=03Н обеспечивает текстовый цветной режим с набором из 16 цветов и разрешающей способностью 25Х80 (25 строк по 80 элементов в каждой строке). Этот режим рекомендуется использовать при выполнении данной лабораторной работы. Другие режимы см. в [2]. ПРИМЕР 1. Задание режима экрана. MOV AH, 00H MOV AL, 03H INT 10H Данная функция вместе с заданием режима обеспечивает очистку экрана с установкой по умолчанию черного фона и белых символов. Для задания иного цвета фона и изображаемых символов используется байт-атрибут.
Ф О Н С И М В О Л
Отдельные биты кодируют следующие признаки: Бит 7 (BL) при установке в 1 обеспечивает эффект мигания символа. Бит 3 (I) при установке в 1 обеспечивает повышенную яркость символа. Биты 6,5,4 и 2,1,0 определяют цвет фона и символов соответственно. При этом R – красный, G – зеленый, B – синий цвет. Значения 1 обеспечивают наличие соответствующего цвета, 0 - его отсутствие. Можно заметить, что комбинация 000 соответствует черному, а 111 – белому цвету. R+G дает желтый цвет, R+B – пурпурный (сиреневый), G+B – голубой. Примеры байтов – атрибутов: 00000000 (0H) –черный по черному - неотображаемый символ (для пароля), 00000111 (07Н) – белый по черному нормальной яркости, 10001111 (8FН) –ярко белый по черному с миганием; 01110000 (70Н) – черный по белому; 00101110 (2ЕН) – яркожелтые символы на зеленом фоне; 10001100 (8СН)-мигающие яркокрасные символы на черном фоне. Очистка с заданием цвета фона и символов всего экрана или части строк экрана производится так называемой прокруткой вверх или вниз, которая реализуется с помощью INT 10H с АН=06Н (вверх) или АН=07Н (вниз), что для задания цвета равнозначно. ПРИМЕР 2. Очистка экрана прокруткой вверх. MOV AH, 06H; функция прокрутки вверх. MOV AL, 00H; очистка всего экрана. MOV BH, 07H; атрибут пробела-ЧБ нормальной яркости. MOV CX, 0000H; верхняя левая позиция. MOV DX, 184FH; нижняя правая позиция (Y=24, X=79). INT 10H Для задания цвета фона и символов только на нескольких последовательных строках необходимо в AL загрузить количество строк, в СХ – координаты начала первой строки из этой группы , а в DX – координаты конца последней строки. Процедура установки курсора в нужную позицию реализуется командой INT 10H с АН=02Н. В регистр BH заносится номер экранной страницы ( обычно 00Н), а в регистр DX – кординаты курсора: в DH – номер строки, в DL – номер столбца (элемента по строке). ПРИМЕР 3. Установка курсора в заданную позицию. MOV AH, 02H ; функция перемещения курсора. MOV BH, 00H ; страница 0. MOV DH, 05H ; строка 5. MOV DL, 0CH ; столбец 12. INT 10H Вывод отдельного символа реализуется INT 10H с АН=09Н. В регистр AL заносится код символа, в BL- байт-атрибут символа , обычно такой же, какой был определен при очистке этого участка экрана (если он не был по умолчанию черно-белым). Если задать другой атрибут, то он будет определять цвет фона и символов только в пределах прямоугольничка - знакоместа символа. ПРИМЕР 4. Вывод символа на экран. MOV AH, 09H ; функция вывода символа. MOV AL, 2AH ; символ ‘ *’. MOV BH, 00H ; страница 0. MOV BL, 0FH ;белый по черному, яркий. MOV CX, 01H ;один символ. INT 10H Последовательность одинаковых символов в одной строке (горизонтальную цепочку) можно получить, если в Примере 4 задать содержимое СХ отличным от единицы. Для получения вертикальной цепочки одинаковых символов (например, вертикальная сторона рамки) следует организовать цикл, включающий процедуры установки курсора и вывода одиночного символа с меняющейся координатой Y в каждом цикле. Поскольку регистр СХ содержит количество выводимых символов, для организации циклов нельзя использовать команду LOOP , которая по умолчанию обращается к СХ как к счетчику циклов. Для проверки условия окончания циклов необходимо использовать какие-либо другие признаки. Пример реализации этого положения можно найти в примере программы вывода графика (раздел 6). Системное прерывание INT 21H с AH=09H позволяет вывести на экран сразу целую символьную строку (например, текст), заданную как переменная в сегменте данных. В регистр DX загружается смещение этой переменной. ПРИМЕР 5. Вывод символьной строки Пусть в сегменте данных имеется переменная: CITY db ‘SAMARA’, 0DH, 0AH, ‘$’ Следует отметить, что символ $ обязателен и является ограничителем области вывода, а коды 0DH и 0AH обеспечивают перевод строки и возврат каретки печатающего устройства, если следующее сообщение должно начинаться с новой строки. Вывод слова SAMARA на экран реализуется следующим фрагментом программы: LEA DX, CITY MOV AH, 09H INT 21H Цвет фона и выводимой надписи соответствует атрибуту, установленному при очистке этого участка экрана. Прерывание INT 16H c AH=00H обеспечивает ожидание ввода символа с клавиатуры без его отображения на экране и может быть полезно для организации некоторой паузы между фрагментами программы. Никаких других параметров не требуется. ПРИМЕР 6. Формирование паузы MOV AH, 00H INT 16H Если после какого-то фрагмента программы нужна пауза, следует вывести текст «Нажмите любую клавишу», затем вставить две строки программы ожидания. Тогда после нажатия клавиши программа будет продолжена.
|
||||||||||||||||||
|