Рассмотренных групп команд вполне достаточно для реализации алгоритмов обработки строк. Однако система команда микропроцессора 8086 имеет специальные команды, т.к. они позволяют выполнить операцию сразу над всей строкой.
Во всех строковых командах под строкой понимается последовательность байтов (символов) или последовательность слов. Поэтому каждая команда представлена двумя вариантами – для обработки строк из байтов и из слов. Мнемокоды команд различаются только последней буквой – B (Byte) или W (Word) соответственно.
Команда CMPS (сравнение строк) сравнивает между собой байты или слова источника и приёмника (табл. 53). Флаги устанавливаются в соответствии с результатами выполнения операции сравнения. Оба операнда должны быть расположены в памяти. Адрес источника задаётся регистровой парой DS:SI, адрес приёмника – ES:DI. Сегментный регистр DS может быть заменён другим сегментным регистром с помощью префикса замены сегмента. Сегментный регистр ES не может быть заменён другим.
Табл. 53. Команда CMPS.
Код
|
Инструкция
|
Описание
|
A6
|
CMPSB
|
Сравнение байтов [DS:SI] и [ES:DI].
|
A7
|
CMPSW
|
Сравнение слов [DS:SI] и [ES:DI].
|
После выполнения операции содержимое регистров SI и DI автоматически увеличивается или уменьшается на размер операнда, т.е. на 1 или на 2 байта. Увеличение (инкремент) имеет место, если флаг направления DF в регистре флагов сброшен, а уменьшение (декремент) – если флаг DF установлен. Изменить флаг направления можно с помощью команд CLD и STD (см. раздел 5.11).
Сравнение, как и в команде CMP, выполняется вычитанием значения приёмника из значения источника. Эти значения рассматриваются как двоичные числа со знаком. Результат вычитания не сохраняется, и исходные операнды не изменяются. По результатам вычитания устанавливаются соответствующие признаки в регистре флагов. Инструкция CMPS выполняет сравнение только одной пары байтов или слов.
Рассмотрим пример сравнения двух байтовых строк A и B. Предположим, строка A расположена в сегменте данных DS, а строка B – в дополнительном сегменте ES. Длина обеих строк одинакова и равна N. Для организации побайтного сравнения от начала к концу строк необходимо сбросить флаг DF и организовать цикл. В регистр счетчика следует поместить число N, а выход из цикла выполнять по условию JNE.
CLD ; DF=0 просмотр вперед
LEA SI, A ; DS:SI = начало A
LEA DI, B ; ES:DI = начало B
MOV CX, N ; CX = длина строки
L: CMPSB ; сравнение пары символов
JNE L1 ; выход по метке L1, если A<>B
LOOP L ; переход к проверке следующей пары
... ; A=B
L1:... ; A<>B
Команда CMPSB сама изменяет значения индексных регистров SI и DI. Однако система команд предоставляет дополнительные средства, еще упрощающие приведенную конструкцию с помощью специальных префиксов повторения REP/REPxx (табл. 54). Префикс повторения обеспечивает многократное повторение одной и той же операции до обнуления счётчика или до выполнения заданного условия.
Табл. 54. Префикс повторения REP.
Do'stlaringiz bilan baham: |