Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 643 / 18 | Оценка: 4.00 / 5.00 | Длительность: 17:30:00
Специальности: Программист
Лекция 3:

Прямой ввод-вывод: Часть II

< Лекция 2 || Лекция 3: 12 || Лекция 4 >
Аннотация: На данной лекции Вы познакомитесь с операциями позиционирования курсора на экране дисплея.

3.1. Очистка экрана

Очистку всего экрана можно осуществить с помощью специальной команды или с помощью escape - последовательности Esc[2J. Рассмотрим эти способы поподробнее.

3.1.1. Реализация на ассемблере

1-ый метод: использование функции 6 прерывания 10H

Функция 6 прерывания 10H очищает определённую прямоугольную область экрана. Число строк, на которое надо сдвинуть экран, заносится в регистр AL. Если установлено значение 0, то экран очищается. Строка для верхнего левого угла очищаемой области заносится в регистр CH, столбец для левого верхнего угла - в регистр CL, а значения для правой нижней строки и столбца - в регистры DH и DL соответственно. Атрибут, которым должен чиститься экран, записывается в регистр BH. Он подробно описан в таблице 3.1.

Примечание: нумерация позиций экрана начинается с точки (0, 0) в верхнем левом углу экрана!

Таблица 3.1. Числовое значение атрибутов символов (цвет и фон)
Числ. Значение Цветовой атрибут Символ или фон?
0 Чёрный Символ
1 Синий Символ
2 Зелёный Символ
3 Циан (голубой) Символ
4 Красный Символ
5 Пурпурный Символ
6 Коричневый Символ
7 Светло-серый Символ
8 Тёмно-серый Символ
9 Светло-синий Символ
10 Светло-зелёный Символ
11 Светло-голубой Символ
12 Светло-красный Символ
13 Светло-пурпурный Символ
14 Жёлтый Символ
15 Белый Символ
0 Чёрный Фон
16 Синий Фон
32 Зелёный Фон
48 Циан (голубой) Фон
64 Красный Фон
80 Пурпурный Фон
96 Коричневый Фон
112 Светло-серый Фон
128 Мигание Символ
Примечание: Атрибут = Символ+Фон (+ Мигание)

Пример 3.1

; --- Очистка экрана между координатами 0, 0 и 24, 79,
; --- нормальное заполнение символов.

	MOV AH, 6	; используемая функция.
	MOV AL, 0	; очищается весь диапазон
	MOV BH, 007H	; белые символы на чёрном фоне
	MOV CH, 0	; левый верхний
	MOV CL, 0	; угол
	MOV DH, 24	; правый нижний
	MOV DL, 79	; угол
	INT 10H
2-й метод: использование функции 9 прерывания 10H

Функция 9 прерывания 10H выводит символ и атрибут столько раз, сколько указано в CX. Значение 2000 чистит весь экран, если курсор установлен в позицию 0, 0. AL должен содержать символ пробела (код 020H), BL - байт атрибутов, а BH - номер страницы дисплея.

Пример 3.2.

; --- установка курсора в левый верхний угол экрана
	MOV AH, 2	; номер функции
	MOV BH, 0	; номер экранной страницы
	MOV DX, 0	; обнуляем координату позиции курсора
	INT 10H
; --- вывод символа 'пробел' 2000 раз
	MOV AH, 9 	; номер функции
	MOV CX, 2000	; число повторений вывода
	MOV AL, 020H	; символ пробела
	MOV BL, 7	; атрибут 'белый по чёрному'
	INT 10H

Дополнительную информацию смотрите [Абель, Джордейн]

3.1.2. Реализация на языке Си

Реализация очистки экрана средствами языка Си возможна только посредством использования escape-последовательности:

Пример 3.3.

…
puts( "\x1B[2J" );
…

3.1.3. Реализация на Бейсике

В бейсике для очистки экрана применяется оператор CLS

ОПЕРАТОР CLS
СИНТАКСИС: CLS
НАЗНАЧЕНИЕ: Данный оператор очищает текущий экран вывода программы Basic и переносит экранную позицию вывода (курсор) в координаты (0, 0).
Оператор не принимает и не возвращает никаких значений.

3.1.4. Реализация в Command Shell

Очистку экрана в MS-DOS Command Shell можно осуществить следующим способом:

  • команда CLS, очищающая экран дисплея и устанавливающая курсор в левый верхний угол. Её синтаксис:
    CLS

Дополнительную информацию смотри [Финогентов II]

3.1.5. Реализация в языках Перл, Питон и Пролог

Реализация очистки экрана средствами языков Перл, Питон и Турбо Пролог не предусмотрена.

3.2. Управление курсором

Помимо цвета выводимых символов, гораздо чаще Вам придётся изменять положение курсора на экране дисплея. При этом может потребоваться:

  1. Абсолютное позиционирование курсора;
  2. Относительное позиционирование (относительно текущей позиции);
  3. Запоминание или чтение позиции курсора.

Этим операциям мы научимся в этом разделе.

3.2.1. Абсолютное позиционирование курсора

Курсор служит двум целям. Во-первых, он служит указателем места на экране, в которое операторы программы посылают свой ввод. Во-вторых, он обеспечивает видимую точку отсчёта на экране для пользователя программы. Только для второго применения курсор должен быть видимым. Но даже невидимый курсор указывает на позицию на экране. Это важно, поскольку любой вывод на экран начинается с текущей позиции курсора (который может быть выключен).

Для курсора могут быть установлены абсолютные координаты или координаты относительно текущей позиции. Абсолютные координаты могут меняться в пределах 25 (изредка 50) строк и 80 (иногда 40) столбцов. В языках высокого уровня обычно отсчитывают координаты экрана, начиная с единицы. Таким образом, позиция левого верхнего угла - 1, 1. В ассемблере отсчёт всегда начинается с нуля и позиция левого верхнего угла - 0, 0.

Рассмотрим функции абсолютного позиционирования курсора, реализованные на разных языках.

3.2.1.1. Реализация на ассемблере

1-ый метод.

Функция 2 прерывания 10H устанавливает курсор, относящийся к указанной странице видео памяти.

ФУНКЦИЯ 2 ПРЕРЫВАНИЯ 10H
Входные значения:
  • AH = 2 - номер функции
  • BH - номер видеостраницы (обычно 0):
  • DH - строка дисплея. Отсчёт строк начинается с 0;
  • DL - столбец дисплея. Отсчёт столбцов начинается с 0;

Пример установки графического курсора в центре экрана:

Пример 3.4.

; --- установка курсора в строку 12, столбец 39.
	MOV AH, 2	; номер функции
	MOV BH, 0	; номер страницы
	MOV DH, 12
	MOV DL, 39
	INT 10H

Подробнее смотри [Абель, Джордейн]

2-ой метод.

Второй метод позиционирования курсора состоит в применении escape-последовательностей драйвера ANSI.SYS. В этом случае можно пользоваться функцией 9 прерывания 21H, выводя escape-последовательность как обычную строку.

Пример 3.5.

; --- установка курсора в строку 12, столбец 39.

; --- в сегменте данных
DOS_CENTER	DB 	27,'[12;39H$'	; строка позиции курсора
; --- в сегменте кода
	MOV AH, 9	; номер функции вывода строки.
	LEA DX, DOS_CENTER	; загрузка адреса строки
	INT 21H

Подробнее см. [MS_DOS 6.0, Финогентов I]

3.2.1.2. Реализация в языках Си

Не смотря на то, что на языке Си есть свои функции управления позицией курсора, предпочтительней использовать средства, предоставляемые драйвером ANSI.SYS (примеры см. ниже).

Пример 3.6.

1.	Реализация в Turbo C/C++

const char POS_CENTER[] = "\x1b[12;39H";
…
puts( POS_CENTER);

2.	Реализация в SPHINX C--

WRITESTR( "\x1b[13;39H" );

Подробнее см. [Бочков, Финогентов I]

Другие функции задания абсолютной позиции курсора в Си:

Функции Turbo C++

ФУНКЦИЯ GOTOXY
ОПИСАНА В: <conio.h> (содержит прототип функции)
СИНТАКСИС:
void gotoxy( x, y );
int x;
int y:
НАЗНАЧЕНИЕ: Позиционирует курсор в текстовом окне.
ОПИСАНИЕ: gotoxy перемещает курсор в текстовом окне в указанную позицию. Если координаты указаны неверно, вызов данной функции игнорируется. Например, это произойдёт при вызове gotoxy(80,30) когда окно имеет размеры 40 столбцов на 25 строк.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.
ПЕРЕНОСИМОСТЬ: Работает только на системах, совместимых с IBM PC. Аналогичная функция есть в Turbo Pascal.

Функции SPHINX C--

ФУНКЦИЯ GOTOXY
СИНТАКСИС:
void GOTOXY ()
AL = xloc; BL = yloc;
НАЗНАЧЕНИЕ: Устанавливает текстовый курсор в позицию, заданную xloc и yloc. Отсчёт позиций начинается с нуля.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: AX, BX и DX не определены.
ФУНКЦИЯ GOTOXYZ
СИНТАКСИС:
void GOTOXYZ ()
AL = xloc; BL = yloc; CL = page;
НАЗНАЧЕНИЕ: Устанавливает текстовый курсор в позицию, заданную xloc и yloc для указанной "page" видео страницы дисплея. Отсчёт значений начинается с нуля.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: AX,BX,CX и DX не определены.
< Лекция 2 || Лекция 3: 12 || Лекция 4 >
Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород
Олег Корсак
Олег Корсак
Латвия, Рига