Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 3

Команды и алгоритмы

133

Для выполнения команды niovs нам пришлось настроить сегментный регистр DS на сегмент BIOS. Если в дальнейшем предполагается обраще­ние к полям данных программы, как это имеет место в примере 3-6, в регистр DS следует занести сегментный адрес сегмента данных. После этого, настроив остальные регистры для вызова функции 40h, прочитанную из BIOS строку можно вывести на экран.

В рассмотренном примере неявно предполагалось, что программа бу­дет в дальнейшем как-то использовать полученную из BIOS информацию, Если задача программы заключается просто в выводе на экран даты вы­пуска BIOS, то нет необходимости сначала копировать эту дату из BIOS в поля данных программы, а потом выводить ее на экран. Можно было по­ступить гораздо проще: настроив регистр DS на сегмент BIOS, а регистр DX на адрес строки с датой, вызвать функцию 40h и вывести на экран текст непосредственно из сегмента BIOS. Тогда содержательная часть про­граммы сократится в два раза и примет такой вид:

mov mov mov mov mov mov hit

AX.OFOOOh

DS,AX

AH,40h

BX,1

CX,8

DX,OFFF5h

21h

;Настроим DS ;на сегмент BIOS ;Функция вывода ;Дескриптор экрана ;Вывести 8 байт ;Смещение к дате ;Вызов DOS

Приведенный фрагмент не имеет отношения к данному разделу, так как в нем уже нет команд обработки строк. В то же время он подчеркивает важность сегментных регистров и гибкость сегментной адресации. Функ­ция 40h ожидает найти адрес выводимой на экран строки в регистрах DS:DX, и никакие другие регистры в этом случае использовать нельзя. С другой стороны, эти регистры можно настроить на любой участок памяти и вывести на экран (а также и на принтер, в файл или в последователь­ный порт) данные откуда угодно.

Рассмотрим теперь пример работы с командами lods и stos, которые можно использовать как по отдельности, так и в паре друг с другом. Эти команды очень удобны, в частности, для прямого обращения к видеопамяти.

К экрану, как и к любому другому устройству, входящему в состав компьютера, можно обращаться тремя способами: с помощью функций DOS (прерывание 21h), с использованием прерывания BIOS (для управ­ления экраном используется прерывание 10h) и, наконец, путем прямо­го программирования аппаратуры, в данном случае видеобуфера (видео­памяти). Функции DOS позволяют выводить только черно-белый текст и имеют ряд других ограничений (нельзя очистить экран, нет средств пози­ционирования курсора); при использовании прерывания BIOS все эти ограничения снимаются, однако программирование с помощью средств BIOS весьма трудоемко; наконец, прямая запись в видеопамять, предос­тавляя возможность вывода цветного текста в любую точку экрана, явля­ется процедурой очень простой и, к тому же, повышает скорость вывода (по сравнением с использованием системных средств) в десятки и сотни

раз. Прямое обращение к видеобуферу удобно использовать, например, в обработчиках прерываний, где запрещен вызов функций DOS и имеются ограничения на обращение к средствам BIOS.

Пусть по ходу программы необходимо вывести в нижнюю строку эк­рана предупреждающее сообщение. Для этого в программу надо включить следующие предложения:

;Пример 3-7. Вывод на экран прямой записью в видеопамять ;В полях данных, адресуемых через DS . msg db 'Измерения закончены'

msg_len=S-msg

;В программном сегменте mov SI,oflset msg AX,OB800h ES,AX DI,25*80*2 CX,msg_len

;Длина строки

;О5:51->выводимая строка

mov mov mov mov eld

;Сегментный адрес видеобуфера

; Будем адресовать через ES

;Смещение к последней строке экрана

;Счетчик цикла вывода символов

;DF=0, движение по строке

;и по экрану вперед

mov AH,3 Ih

;Атрибут символов — синий по

; голубому

outscr:

lodsb

;Взятъ символ из строки в AL

stosw

;Вывод на экран символа

;из AL и его атрибута из АН

;Цикл

loop outscr

Регистры DS:SI настраиваются на адрес начала выводимой строки; ре­гистры ES:DI — на адрес требуемой позиции в видеобуфере. В регистр СХ надо поместить длину строки в байтах, а флаг DF сбросить, чтобы двигать­ся по строке вперед. На экран будет выводиться содержимое регистра АХ, в младшем байте которого должен находиться код ASCII выводимого симво­ла, а в старшем байте — атрибут символа, т.е. код цвета символа (в млад­шем полубайте) и код цвета фона (в старшем полубайте). В примере число 31h образует синие символы по бирюзовому фону. При желании можно выбрать другую комбинацию цветов, выбрав ее с помощью табл. 3.1.

Таблица 3.1. Коды цветов стандартной цветовой палитры

Код

Цвет

Код

Цвет

Oh

Черный

8U

Серый

Ш

Синий

9U

Голубой

2h

Зеленый

Ah

Салатовый

3h

Бирюзовый

Bh

Светло-бирюзовый

4h

Красный

Ch

Розовый

5h

Фиолетовый

Dh

Светло-фиолетовый

6h

Коричневый

Eh

Желтый

7h

Белый

Fh

Ярко-белый

134

Глава j

Команды и алгоритмы

135

Выбирая цвета, следует иметь в виду, что при стандартной настройке видеосистемы, для цвета фона можно использовать лишь значения из ле­вого столбца таблицы; выбор любого яркого цвета из правого столбца приведет в выводу мерцающего символа. Например, атрибут символа Blh образует синий мерцающий символ на бирюзовом фоне (а не синий сим­вол на светло-бирюзовом фоне).

Содержательную часть цикла вывода образуют две команды lodsb и stosw. Первая команда загружает в регистр AL код очередного символа, вторая выводит его вместе с атрибутом, хранящемся в АН, на экран. При этом после каждого выполнения команды lodsb содержимое SI увеличи­вается процессором на 1, смещая адресацию к следующему символу стро­ки; в то же время каждое выполнение команды stosw увеличивает DI на 2 (потому что команда stosw работает со словами), смещая адресацию на экране на 2 байт, т.е. как раз к позиции следующего символа.

Примеры использования команд cmps и seas можно найти в Приложении.