используется нулевая страница (в начале дисплейной памяти).
Программа может вывести на экран любую страницу и в это
время формировать другую страницу в памяти для последующего
вывода на экран.
Усовершенствованный графический адаптер (EGA - Enhanced
Graphics Adapter) обеспечивает более высокую разрешающую
способность, по сравнению со стандартным цветным адаптером
(CGA) и в большинстве случаев является совместимым с ним.
Разрешающая способность обеспечивает 320х200, 640х200 и
640х350 точек на экране.
Цветные адаптеры имеют два основных режима работы:
текстовой (алфовитно-цифровой) и графический, и возможны
также дополнительные режимы между двумя основными. По
умолчанию используется текстовой режим. Установка режима
описана в главе 9 в разделе "Преpывание BIOS INT 10H"



Ассемблер для IBM PC. Глава 10 229


(AH=0). Для установки графического режима или возврата в
текстовой режим используется прерывание BIOS INT 10H, как
это показано в двух следующих примерах:

MOV AH,00 ;Режим MOV AH,00 ;Режим
MOV AL,03 ;Цвет+текст MOV AL,04 ;Графика среднего
INT 10H INT 10H ; разрешения

ТЕКСТОВЫЙ (АЛФАВИТНО-ЦИФРОВОЙ) РЕЖИМ
------------------------------------------------------------

Текстовой режим предназначен для обычных вычислений с вы
водом букв и цифр на экран. Данный режим одинаков для черно-
белых (BW) и для цветных мониторов за исключением того,
что цветные мониторы не поддерживают атрибут подчеркивания.
Текстовой режим обеспечивает работу с полным набором ASCII
кодов (256 символов), как для черно-белых (BW), так и для
цветных мониторов. Каждый символ на экране может отображать
ся в одном из 16 цветов на одном из восьми цветов фона.
Бордюр экрана может иметь также один из 16 цветов.

Цвета

Тремя основными цветами являются красный, зеленый и
синий. Комбинируя основные цвета, друг с другом, можно
получить восемь цветов, включая черный и белый. Используя
два уровня яркости для каждого цвета, получим всего 16
цветов:

I R G B I R G B
Черный 0 0 0 0 Серый 1 0 0 0
Синий 0 0 0 1 Ярко-синий 1 0 0 1
Зеленый 0 0 1 0 Ярко-зеленый 1 0 1 0
Голубой 0 0 1 1 Ярко-голубой 1 0 1 1
Красный 0 1 0 0 Ярко-красный 1 1 0 0
Сиреневый 0 1 0 1 Ярко-сиреневый 1 1 0 1
Коричневый 0 1 1 0 Желтый 1 1 1 0
Белый 0 1 1 0 Ярко-белый 1 1 1 1

Таким образом любые символы могут быть отображены на
экране в oдном из 16 цветов. Фон любого символа может иметь
один из первых восьми цветов. Если фон и текст имеют один и
тот же цвет, то текст получается невидимым. Используя байт
атрибута, можно получить также мигающие символы.

Байт-атрибут

Текстовой режим допускает использование байта атрибута,
рассмотpенного в главе 9. В приведенной ниже таблице,
атрибут BL обозначает мигание (BLinking), RGB - соответствен
но красный, зеленый и синий цвет, I - выделение яркостью:

Фон Текст



Ассемблер для IBM PC. Глава 10 230


Атрибут: BL R G B I R G B
Номера битов: 7 6 5 4 3 2 1 0

Мигание и выделение яркостью относится к тексту. Ниже
приведены некоторые типичные атрибуты:

Текст по фону Бит: 7 6 5 4 3 2 1 0
BL R G B I R G B Шест.
Черный по черному 0 0 0 0 0 0 0 0 00
Синий по черному 0 0 0 0 0 0 0 1 01
Красный по синему 0 0 0 1 0 1 0 0 14
Голубой по зеленому 0 0 1 0 0 0 1 1 23
Светло-сиреневый по белому 0 1 1 1 1 1 0 1 7D
Серый по зеленому, мигание 1 0 1 0 1 0 0 0 A8

Байт-атрибут используется аналагично показанному для
черно-белого (BW) монитора. Тип монитора можно определить из
программы с помощью команды INT 11H. Для BW монитора код 07
устанавливает нормальный атрибут. Для цветных мониторов мож
но использовать любую из цветовых комбинаций. Цвет на экране
сохраняется до тех пор, пока другая команда не изменит его.
Для установки цвета можно использовать в команде INT 10H
функции AH=06, AH=07 и AH=09. Например, для вывода пяти
мигающих звездочек сетло-зеленым цветом на сиреневом фоне
возможна следующая программа:

MOV AH,09 ;Функция вывода на экран
MOV AL,'*' ;Выводимый символ
MOV BH,00 ;Страница 0
MOV BL,0DAH ;Атрибут цвета
MOV CX,05 ;Число повторений
INT 10H ;Вызвать BIOS

ГРАФИЧЕСКИЙ РЕЖИМ
------------------------------------------------------------

Для генерации цветных изображений в графическом режиме
используются минимальные точки растра - пиксели или пэлы
(pixel). Цветной графический адаптер (CGA) имеет три степени
разрешения:

1. Низкое разрешение (не поддерживается в ROM) обеспечива
ет вывод 100 строк по 160 точек (т.е. четыре бита на
точку). Каждая точка может иметь один из 16
стандартных цветов, как описано в предыдущем разделе
"Цвета". Реализация данного режима включает прямую
адресацию контролера Motorola 6845 CRT. Для этого
используются два порта: шест.3D4 и 3D5.

2. Среднее разрешение для стандартной цветной графики
обеспечивает 200 строк по 320 точек. Каждый байт в этом
случае представляет четыре точки (т.е. два бита на
точку).



Ассемблер для IBM PC. Глава 10 231



3. Высокое разрешение обеспечивает 200 строк по 640 точек.
Поскольку в данном случае требуется 16К байт памяти,
высокое разрешение достигается только в черно-белом
(BW) режиме. Каждый байт здесь представляет 8 точек
(т.е. один бит на точку). Нулевое значение бита дает
черный цвет точки, единичное - белый.

Заметим, что в графическом режиме ROM содержит точечные
образы только для первых 128 ASCII-кодов. Команда INT 1FH
обеспечивает доступ к 1К байтовой области в памяти,
определяющей остальные 128 символов. (8 байт на символ).
Отображение графических байтов в видео сигналы аналогично,
как для среднего, так и для высокого pазрешения.

РЕЖИМ СРЕДНЕГО РАЗРЕШЕНИЯ
------------------------------------------------------------

При среднем разрешении каждый байт представляет четыре
точки, пронумерованных от 0 до 3:

Байт: |C1 C0|C1 C0|C1 C0|C1 C0|
Пиксели: 0 1 2 3

В любой момент для каждой точки возможны четыре цвета, от
0 до 3. Ограничение в 4 цвета объясняется тем, что
двухбитовая точка имеет 4 комбинации значений битов: 00, 01,
10 и 11. Можно выбpать значение 00 для любого из 16
возможных цветов фона или выбрать значение 01, 10, и 11 для
одной из двух палитр. Каждая палитpа имеет три цвета:

C1 C0 Палитра 0 Палитра 1

0 0 фон фон
0 1 зеленый голубой
1 0 красный сиреневый
1 1 коричневый белый

Для выбора цвета палитры и фона используется INT 10H.
Таким обpазом, если, например, выбран фон желтого цвета и
палитра 0, то возможны следующие цвета точки: желтый,
зеленый, красный и коричневый. Байт, содержащий значение
10101010, соответствует красным точкам. Если выбрать цвет
фона - синий и палитру 1, то возможные цвета: синий,
голубой, сиреневый и белый. Байт, содержащий значение
00011011, отображает синюю, голубую, сиреневую и белую
точки.

Прерывание BIOS INT 10H для графики







Ассемблер для IBM PC. Глава 10 232


Функция AH=00 команды INT 10H устанавливает графический
ркфим. Функция AH=11 команды INT 10H позволяет выбрать цвет
палитры и вывести на экран графический символ. Код в регист
ре AH определяет функцию:

AH=00: Установка режима. Нулевое значение в регистре AH и
04 в pегистре AL устанавливают стандартый цветной графичес
кий режим:

MOV AH,00 ;Функция установки режима
MOV AL,04 ;Разрешение 320х200
INT 10H

Установка графического режима приводит к исчезновению
курсора с экрана. Подробности по установке режима приведены
в главе 9.

AH=0BH: Установка цветовой палитры. Число в регистре BH
определяет назначение регистра BL:

BH=00 выбирает цвета фона и бордюра в соответствии с
содержимым pегистра BL. Цвет фона от 1 до 16 соответствует
шест. значениям oт 0 до F;
BH=01 выбирает палитру соответственно содержимому регист
ра BL (0 или 1):

MOV AH,0BH ;Функция установки цвета
MOV BH,01 ;Выбор палитры
MOV BL,00 ; 0 (зеленый, красный, корич.)
INT 10H ;Вызвать BIOS

Палитра, установленная один раз, сохраняется, пока не
будет отменена другой командой. При смене палитры весь экран
меняет цветовую комбинацию. При использовании функции AH=0BH
в текстовом режиме, значение, установленное для цвета 0 в
палитре, определяет цвет бордюра.

AH=0CH: Вывод точки на экран. Использование кода 0C в
регистре AH позволяет вывести на экран точку в выбранном
цвете (фон и палитра). Например, для разрешения 320х200
загрузим в регистр DX вертикальную координату (от 0 до 199),
а в регистр CX - горизонтальную координату (от 0 до 319). В
регистр AL поместим цвет точки (от 0 до 3):

MOV AH,0CH ;Функция вывода точки
MOV AL,цвет ;Цвет точки
MOV CX,столбец ;Горизонтальная координата
MOV DX,строка ;Вертикалькая координата
INT 10H ;Вызвать BIOS

AH=0DH: Чтение точки с экрана. Данная функция позволяет
прочитать точку для определения ее цвета. В регистр DX
должна быть загружена вертикальная координата (от 0 до 199),



Ассемблер для IBM PC. Глава 10 233


а в регистр CX - горизонтальная (от 0 до 319). В регистре AH
должно быть значение 0D. Функция возвращает цвет точки в
регистре AL.

------------------------------------------------------------
------------------------------------------------------------
Рис. 10.1 Вывод на экран в цветном графическом режиме.

ПРОГРАММА: УСТАНОВКА ГРАФИЧЕСКОГО РЕЖИМА И ОТОБРАЖЕНИЕ ЦВЕТА
------------------------------------------------------------

Программа, приведенная на рис.10.1, использует команду
INT 10H для установки графического режима, выбора зеленого
фона и вывода на экран точек (40 строк по 320 столбцов). В
программе происходит увеличение значения цвета на 1 для
каждой строки. Так как в определении цвета участвуют только
три правых бита, цвета повторяются через каждые семь строк.
После выполнения программы дисплей остается в графическом
режиме. Восстановление текстового режима возможно с помощью
команды DOS MODE (MODE CO80) или пользовательской COM
программой, в которой для этой цели используется команда
INT 10H.

ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
------------------------------------------------------------

ъ Память объемом 16К для цветного дисплея позволяет
хранить дополнительные страницы (экраны). Возможны
четыре страницы для экранов на 80 столбцов или восемь
страниц для экранов на 40 столбцов.

ъ Графический режим обеспечивает низкое разрешение (не
поддерживается в ROM), среднее разрешение (для цветной
графики) и высокое разрешение (для черно-белой графи
ки).

ъ Точка растра (минимальный элемент графического
изображения) представляется определенным числом бит в
зависимости от графического адаптера и разрешающей
способности (низкой, средней или высокой).

ъ Для графики среднего разрешения на цветном графическом
адаптере (CGA) можно выбрать четыре цвета, один из
которых принадлежит к 16 возможным цветам, а три других
формируют цветовую палитру.

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
------------------------------------------------------------

10.1. Сколько цветов возможно для фона и для текста на
стандартном цветном адаптере (CGA) в текстовом режиме?





Ассемблер для IBM PC. Глава 10 234


10.2. Напишите байты атрибуты в двоичном формате для а)
сиреневого на ярко-голубом, б) коричневого на желтом,
в)красного на сером с миганием.

10.3. Объясните разницу в количестве цветов, возможных при
низком, среднем и высоком разрешении.

10.4. Напишите команды для вывода пяти символов карточной
масти "бубны" в текстовом режиме ярко-зеленым цветом
на сиреневом фоне.

10.5. Напишите команды для установки графического режима с
разрешением а) 320х200 в адаптере CGA и б) 640х200 в
адаптере EGA.

10.6. Напишите команды для установки синего фона в графичес
ком режиме.

10.7. Напишите команды для чтения точки на 12 строке и 13
столбце в графическом режиме.

10.8. Модифицируйте программу на рис.10.1 для: а) графическо
го режима на вашем мониторе; б) красного фона; в)
строк с 10 по 30; г) столбцов с 20 по 300.
































Ассемблер для IBM PC. Глава 11 241


    ГЛАВА 11. Команды обработки строк


------------------------------------------------------------

Команды обработки строк

Цель: Ообъяснить назначение специальных цепочечных команд,
используемых для обработки символьных данных.

ВВЕДЕНИЕ
------------------------------------------------------------

Команды, показанные в предыдущих главах, оперировали
одним байтом, или одним словом за одно выполнение. Часто,
однако, бывает необходимо переслать или сравнить поля
данных, которые превышают по длине одно слово. Например,
необходимо сравнить описания или имена для того, чтобы
отсортировать их в восходящей последовательности. Элементы
такого формата известны как строковые данные и могут являтся
как символьными, так и числовыми. Для обработки строковых
данных ассемблер имеет пять команд обработки строк:

MOVS переслать один байт или одно слово из одной области
памяти в другую;

LODS загрузить из памяти один байт в регистр AL или одно
слово в регистр AX;

STOS записать содержимое регистра AL или AX в память;

CMPS сравнить содержимое двух областей памяти, размером в
один байт или в одно слово;

SCAS сравнить содержимое регистра AL или AX с содержимым
памяти.

Префикс REP позволяет этим командам обрабатывать строки
любой длины.

СВОЙСТВА ОПЕРАЦИЙ НАД СТРОКАМИ
------------------------------------------------------------

Цепочечная команда может быть закодирована для повторяю
щейся обpаботки одного байта или одного слова за одно
выполнение. Например, можно выбрать "байтовую" команду для
обработки строки с нечетным числом байт или "двухбайтовую"
команду для обработки четного числа байт. Ниже перечислены
регистры, участвующие в цепочечных командах (для
однобайтовых и двухбайтовых вариантов). Предположим, что
регистры DI и SI содержат необходимые адреса:

Команда Операнды Байт Слово
MOVS DI,SI MOVSB MOVSW
LODS AL,SI или AX,SI LODSB LODSW



Ассемблер для IBM PC. Глава 11 242


STOS DI,AL или DI,AX STOSB STOSW
CMPS SI,DI CMPSB CMPSW
SCAS DI,AL или DI,AX SCASB SCASW

Например, можно кодировать операнды для команды MOVS, но
опустить их для MOVSB и MOVSW. Эти команды предполагают, что
pегистры DI и SI содержат относительные адреса, указывающие
на необходимые области памяти (для загрузки можно использо
вать команду LEA). Регистр SI обычно связан с регистром
сегмента данных - DS:SI. Регистр DI всегда связан с
регистром дополнительного сегмента - ES:DI. Следовательно,
команды MOVS, STOS, CMPS и SCAS требуют инициализации
регистра ES (обычно адресом в регистре DS).

REP: ПРЕФИКС ПОВТОРЕНИЯ ЦЕПОЧЕЧНОЙ КОМАНДЫ
------------------------------------------------------------

Несмотря на то, что цепочечные команды имеют отношение к
одному байту или одному слову, префикс REP обеспечивает
повторение команды несколько раз. Префикс кодируется непо
средственно перед цепочечной командой, например, REP MOVSB.
Для использования префикса REP необходимо установить
начальное значение в регистре CX. При выполнении цепочечной
команды с префиксом REP происходит уменьшение на 1 значения
в регистре CX до нуля. Таким образом, можно обрабатывать
строки любой длины.
Флаг направления определяет направление повторяющейся
операции:
- для направления слева направо неоходимо с помощью
команды CLD установить флаг DF в 0;
- для направления справа налево необходимо с помощью
команды STD установить флаг DF в 1.
В следующем примере выполняется пересылка 20 байт из
STRING1 в STRING2. Предположим, что оба регистра DS и ES
инициализированы адресом сегмента данных:

STRING1 DB 20 DUP('*')
STRING2 DB 20 DUP(' ')

...
CLD ;Сброс флага DF
MOV CX,20 ;Счетчик на 20 байт
LEA DI,STRING2 ;Адрес области "куда"
LEA SI,STRING1 ;Адрес одласти "откуда"
REP MOVSB ;Переслать данные

При выполнееии команд CMPS и SCAS возможна установка
флагов состояния, так чтобы операция могла прекратиться
сразу после обнаружения необходимого условия. Ниже приведены
модификации префикса REP для этих целей.

REP - повторять операцию, пока CX не равно 0;




Ассемблер для IBM PC. Глава 11 243


REPZили REPE - повторять операцию,пока флаг ZF
показывает "равноили ноль".Прекратить
операцию при флаге ZF, указывающему на не
равно или не ноль или при CX равном 0;
REPNE или REPNZ - повторять операцию, пока флаг ZF
показывает "не равно или не ноль".
Прекратить операцию при флаге ZF,
указывающему на "равно или нуль" или при
CX равным 0.

Для процессоров 8086, 80286 и 80386, обрабатывающих слово за
oдно выполнение, использование цепочечных команд, где это
возможно, приводит к повышению эффективности работы
программы.

MOVS: ПЕРЕСЫЛКА СТРОК
------------------------------------------------------------

На рис.7.5 была показана программа для пересылки девяти
байтового поля. Программа включала три команды для инициали
зации и пять команд для цикла. Команда MOVS с префиксом REP
и длиной в регистре CX может выполнять пересылку любого
числа символов более эффективно.
Для области, принимающей строку, сегментным регистром,
является pегистр ES, а регистр DI содержит относительный
адрес области, передающей строку. Сегментным регистром
является регистр DS, а регистр SI содержит относительный
адрес. Таким образом,в начале программы перед выполнением
команды MOVS необходимо инициализировать регистр ES вместе
с регистром DS, а также загрузить требуемые относительные
адреса полей в регистры DI и SI. В зависимости от состояния
флага DF команда MOVS производит увеличение или уменьшение
на 1 (для байта) или на 2 (для слова) содержимого регистров
DI и SI.
Приведем команды, эквивалентные цепочечной команде REP
MOVSB:

JCXZ LABEL2
LABEL1: MOV AL,[SI]
MOV [DI],AL
INC/DEC DI ;Инкремент или декремент
UNC/DEC SI ;Инкремент или декремент
LOOP LABEL1
LABEL2: ...

В программе на рис. 11.1 процедура C10MVSB использует
команду MOVSB для пересылки содержимого десятибайтового поля
NAME1 в поле NAME2. Первая команда CLD сбрасывает флаг
направления в 0 для обеспечения процесса пересылки слева
направо. В нормальном состоянии флаг DF обычно имеет нулевое
значение и команда CLD используется из предосторожности.





Ассемблер для IBM PC. Глава 11 244


Две команды LEA загружают регистры SI и DI относительными
адресами NAME1 и NAME2 соответственно. Так как регистры DS и
ES были ранее инициализированы адресом DATASG, то полные
адреса полей NAME1 и NAME2 будут в регистрах ES:DI и DS:SI.
(COM программа автоматически инициализирует регистры ES и
DS). Команда MOV заносит в регистр CX значение 10 - длину
полей NAME1 и NAME2. Команда REP MOVSB выполняет следующее:

ъ Пересылает самый левый байт из поля NAME1 (адресованно
го pегистрами ES:DI) в самый левый байт поля NAME2
(адресованного регистрами DS:SI).
ъ Увеличивает на 1 адреса в регистрах DI и SI для
следующего байта.
ъ Уменьшает CX на 1.
ъ Повторяет перечисленные действия (в данном случае 10
раз), пока содержимое регистра CX не станет равным
нулю.

Поскольку флаг DF имеет нулевое значение, команда MOVSB
увеличивает адреса в регистрах DI и SI, и в каждой итерации
процесс переходит на байт вправо, т.е. пересылает байт из
NAME1+1 в NAME2+1 и т.д. Если бы флаг DF был равен 1, тогда
команда MOVSB уменьшала бы адреса в регистрих DI и SI,
выполняя процесс справа налево. Но в этом случае регистры SI
и DI необходимо инициализировать адресами последних байтов
полей, т.е. NAME1+9 и NAME2+9 соответственно.
В процедуре D10MVSW (рис.11.1) используется команда
MOVSW, пересылающая одно слово за одно выполнение. Так как
команда MOVSW увеличивает адреса в регистрах DS и SI на 2,
операция требует только пять циклов. Для процесса пересылки
справа налево регистр SI должен быть инициализирован
адресом NAME1+8, а регистр DI - NAME2+8.

LODS: ЗАГРУЗКА СТРОКИ
------------------------------------------------------------

Команда LODS загружает из памяти в регистр AL один байт
или в регистр AX одно слово. Адрес памяти определяется
регистрами DS:SI. В зависимости от значения флага DF
происходит увеличение или уменьшение регистра SI.
Поскольку одна команда LODS загружает регистр, то практи
ческой пользы от префикса REP в данном случае нет. Часто
простая команда MOV полностью адекватна команде LODS, хотя
MOV генерирует три байта машинного кода, а LODS - только
один, но требует инициализацию регистра SI. Можно использо
вать команду LODS в том случае, когда требуется продвигаться
вдоль строки (по байту или по слову), проверяя загружаемый
регистр на конкретное значение.
Команды, эквивалентные команде LODSB:

MOV AL,[SI]
INC SI




Ассемблер для IBM PC. Глава 11 245


На рис.11.1 процедура E10LODS демонстрирует использование
команды LODSW. В примере обрабатывается только одно слово:
первый байт из области NAME1 (содержащий As) заносится в
регистр AL, а второй байт - в регистр AH. В результате в
регистре AX получится значение sA.

STOS: ЗАПИСЬ СТРОКИ
------------------------------------------------------------

Команда STOS записывает (сохраняет) содержимое регистра
AL или AX в байте или в слове памяти. Адрес памяти всегда
представляется регистрами ES:DI. В зависимости от флага DF
команда STOS также увеличивает или уменьшает адрес в
регистре DI на 1 для байта или на 2 для слова.
Практическая польза команды STOS с префиксом REP -
инициализация области данных конкретным значением, например,
очистка дисплейного буфера пробелами. Длина области (в
байтах или в cловах) загружается в регистр AX. Команды,
эквивалентные команде REP STOSB:

JCXZ LABEL2
LABEL1: MOV [DI],AL
INC/DEC DI ;Инкремент или декремент
LOOP LABEL1
LABEL2: ...

На рис.11.1 процедура F10STOS демонстрирует использование
команды STOSW. Операция осуществляет запись шест. 2020
(пробелы) пять раз в область NAME3, причем значение из
регистра AL заносится в первый байт, а из регистра AH - во
второй. По завершении команды регистр DI содержит адрес
NAME3+10.

CMPS: СРАВНЕНИЕ СТРОК
------------------------------------------------------------

Команда CMPS сравнивает содержимое одной области памяти
(адресуемой регистрами DS:SI) с содержимыми другой области
(адресуемой как ES:DI). В зависимости от флага DF команда
CMPS также увеличивает или уменьшает адреса в регистрах SI и
DI на 1 для байта или на 2 для слова. Команда CMPS
устанавливает флаги AF, CF, OF, PF, SF и ZF. При
использовании префикса REP в регистре CX должна находиться
длина сравниваемых полей. Команда CMPS может сравнивать
любое число байт или слов.

------------------------------------------------------------
------------------------------------------------------------
Рис. 11.1. Использование цепочечных команд.

Рассмотрим процесс сравнения двух строк, содержащих имена
JEAN и JOAN. Сравнение побайтно слева направо приводит к
следующему:



Ассемблер для IBM PC. Глава 11 246



J : J Равно
E : O Не равно (E меньше O)
A : A Равно
N : N Равно

Сравнение всех четырех байт заканчивается сравнением N:N
- pавно/нуль. Так как имена "не равны", операция должна пре
кратиться, как только будет обнаружено условие "не равно".
Для этих целей команда REP имеет модификацию REPE, которая
повторяет сравнение до тех пор, пока сравниваемые элементы
равны, или регистр CX не pавен нулю. Кодируется повторяющее
ся однобайтовое сравнение следующим образом:

REPE CMPSB

На рис.11.1 в процедере G10CMPS имеются два примера
использования команды CMPSB. В первом примере происходит
сравнение содержимого полей NAME1 и NAME2. Так как ранее
команда MOVSB переслала содержимое поля NAME1 в поле NAME2,
то команда CMPSB продолжается на всех десяти байтах и
завершается состоянием pавно/нуль: флаг SF получает значение
0 (положительно) и флаг ZF - 1(нуль).
Во втором примере сравнивается поля NAME2 и NAME3. Ранее
команда STOSW заполнила поле NAME3 пробелами, поэтому
команда CMPB завершается после сравнения первых же байт с
результатом "больше/неравно": флаг SF получает значение 0
(положительно) и флаг ZF - 0 (ненуль).
Первый пример заканчивается с результатом "равно/нуль" и
заносит 01 в регистр BH. Второй пример заканчивается с
результатом "неравно" и заносит 02 в регистр BL. При
трассировке команд с помощью отладчика DEBUG можно увидеть,
что в конце процедуры G10CMPS регистр BX будет содержать
значение 0102.
Предупреждение! Показанные примеры используют команду
CMPSB для сравнения одного байта за одно выполнение. При
использовании команды CMPSW для сравнения одного слова,
необходимо инициализиpовать регистр CX значением 5. Кроме
того следует помнить, что команда CMPSW при сравнении слов
переставляет байты. Например, сравнивая имена SAMUEL и
ARNOLD команда CMPSW выбирает вместо SA и AR переставленные
значения, т.е. AS и RA. В результате вместо "больше"
получится "меньше", т.е. неправельный результат. Таким
образом команда CMPSW работает правильно только при сравне
нии строк, которые содержат числовые данные, определенные
как DW, DD или DQ.

SCAS: СКАНИРОВАНИЕ СТРОК
------------------------------------------------------------

Команда SCAS отличается от команды CMPS тем, что
сканирует (просматривает) строку на определенное значение
байта или слова. Команда SCAS сравнивает содержимое области



Ассемблер для IBM PC. Глава 11 247


памяти (адресуемой pегистрами ES:DI) с содержимым регистра
AL или AX. В зависимости от значения флага DF команда SCAS
также увеличивает или уменьшает адрес в регистре DI на 1
для байта или на 2 для слова. Команда SCAS устанавливает
флаги AF, CF, OF, PF, SF и ZF. При использовании префикса
REP и значения длины в регистре CX команда SCAS может
сканировать строки любой длины.
Команда SCAS особенно полезна, например, в текстовых
редакторах, где программа должна сканировать строки,
выполняя поиск знаков пунктуации: точек, запятых и пробелов.
На рис.11.1 процедура H10SCAS сканирует область NAME1 на
строчную букву "m". Так как команда SCASB должна продолжать
сканирование, пока результат сравнения - "не равно" или
регистр CX не равен нулю, то используется префикс REPNE: