Обработка строк
Пусть по ходу программы необходимо вывести в нижнюю строку экрана предупреждающее сообщение. Для этого в программу надо включить следующие предложения:
Пример 3.7. Вывод на экран прямой записью в видеопамять.
;В полях данных, адресуемых через DS msg db 'Измерения закончены' msg_len=$-msg; Длина строки ;В программном сегменте mov SI,offset msg; DS:31 › выводимая строка mov AX,OB800h; Сегментный адрес видеобуфера mov ES,AX; Будем адресовать через ES mov DI,25*80*2; Смещение к последней строке экрана mov CX,msg_len; Счетчик цикла вывода символов eld; DF=0, движение по строке ; и по экрану вперед mov AH,31h; Атрибут символов-синий по голубому outher: lodsb; Взять символ из строки в AL show; Вывод на экран символа ; из AL и его атрибута из AH loop outser; Цикл
Регистры DS:SI настраиваются на адрес начата выводимой строки; регистры ES:DI – на адрес требуемой позиции в видеобуфере. В регистр СХ надо поместить длину строки в байтах, а флаг DF сбросить, чтобы двигаться по строке вперед. На экран будет выводиться содержимое регистра АХ, в младшем байте которого должен находиться код ASCII выводимого символа, а в старшем байте – атрибут символа, т.е. код цвета символа (в младшем полубайте) и код цвета фона (в старшем полубайте). В примере число 31h образует синие символы по бирюзовому фону. При желании можно выбрать другую комбинацию цветов, выбрав ее с помощью табл. 3.1.
Таблица 3.1. Коды цветов стандартной цветовой палитры.
Код | Цвет | Код | Цвет |
---|---|---|---|
0h | Черный | 8h | Серый |
1h | Синий | 9h | Голубой |
2h | Зеленый | 10h | Салатовый |
3h | Бирюзовый | 11h | Светло-бирюзовый |
4h | Красный | 12h | Розовый |
5h | Фиолетовый | 13h | Светло-фиолетовый |
6h | Коричневый | 14h | Желтый |
7h | Белый | 15h | Ярко-белый |
Выбирая цвета, следует иметь в виду, что при стандартной настройке видеосистемы для цвета фона можно использовать лишь значения из левого столбца таблицы; выбор любого яркого цвета из правого столбца приведет в выводу мерцающего символа. Например, атрибут символа Bill образует синий мерцающий символ на бирюзовом фоне (а не синий символ на светло-бирюзовом фоне).
Содержательную часть цикла вывода образуют две команды lodsb и stosw. Первая команда загружает в регистр AL код очередного символа, вторая выводит его вместе с атрибутом, хранящемся в АН, на экран. При этом после каждого выполнения команды lodsb содержимое SI увеличивается процессором на 1, смещая адресацию к следующему символу строки; в то же время каждое выполнение команды stosw увеличивает DI на 2 (потому что команда stosw работает со словами), смещая адресацию на экране на 2 байт, т.е. как раз к позиции следующего символа.
Примеры использования команд cmps и seas можно найти в Приложении.