Команда | Описание | Операнды |
MOVS | Перемещает строки данных: копирует байт или слово из одного участка памяти в другой | MOVS [DI], [SI] |
CMPS | Сравнивает строки: сравнивает в памяти байты или слова | CMPS [SI], [DI] |
SCAS | Сканирует строки: сравнивает регистры AL или AXс содержимым памяти, изменяя регистр флагов | SCAS [DI], AL SCAS [DI], AX |
STOS | Сохраняет строку данных: сохраняет содержимое регистров AL или AXв памяти | STOS [DI], AL STOS [DI], AX |
LODS | Загружает аккумулятор из строки: загружает байт или слово в AL или AXиз памяти | LODS AL, [SI] LODS AX, [SI] |
Операнд-отправитель размещается по адресу, указанному в регистрах DS:SI. Адрес операнда-получателя указан в регистрах ES:DI. В регистрах DS и ES необходимо указать начало сегмента данных до того, как будут использоваться команды работы со строками.
Пример:
MOV AX, DATA; установить адрес сегмента данных
MOV DS, AX; инициализировать DS
MOV ES, AX; инициализировать ES
Команда | Размер | Описание | Шаг инкрементации для SI и DI |
MOVS | MOVSB | Перемещает (копирует) байт | |
MOVSW | Перемещает (копирует) слово | ||
CMPS | CMPSB | Сравнивает байты | |
CMPSW | Сравнивает слова | ||
SCAS | SCASB | Сканирует байт | |
SCASW | Сканирует слово | ||
STOS | STOSB | Сохраняет байт | |
STOSW | Сохраняет слово | ||
LODS | LODSB | Загружает байт | |
LODSW | Загружает слово |
В регистрах SI и DI должны быть установлены смещения операндов.
Пример:
MOV SI, offset source; SI указывает на отправителя
MOV DI, offset dest; DI указывает на получателя
MOVSB; копирует отправитель в получатель
(Оператор OFFSET возвращает смещение метки или переменной от начала сегмента).
Использование префикса повторения
REP; повторять, пока СХ>0
REPZ, REPE; повторять, пока флаг нуля установлен и СХ>0
REPNZ, REPNE; повторять, пока флаг нуля сброшен и СХ>0
ПП заставляет многократно повторяться следующую за ним строковую команду. При этом данная пара команд выполняется значительно быстрее, чем организованный цикл.
Число повторений должно быть записано в регистр CX до выполнения этой пары команд.
Для выхода из цикла в этом случае есть две причины: либо строки просмотрены полностью и все их элементы оказались равными (CX=0 и ZF=1), либо нашлась пара неравных элементов (ZF=0, CX - любое). По какой причине произошел выход, надо устанавливать после выхода из цикла.
Флаг направления DF
Значение флага | Действие на SI или DI | Направление |
Инкрементируется | Снизу вверх | |
Декрементируется | Сверху вниз |
Значение флага направления задает автор программы.
Флаг направления изменяется командами CLD и STD.
CLD; сбросить флаг направления, направление – вверх
STD; установить флаг направления, направление вниз
Команда MOVS (Пересылка строки)
Команда MOVSB пересылает байт, а команда MOVSW – слово, абсолютный адрес которого задается парой регистров DS:SI, в ячейку, абсолютный адрес которой задается парой ES:DI, после чего значения регистров SI и DI автоматически меняются.
[DS:SI]=>[ES:DI]; SI:=SI+d; DI:=DI+d, где величина d определяется согласно состоянию флага DF (флаг направления).
Выход из цикла пересылки всей строки из одного места памяти в другое возможен тогда, когда будут переписаны все элементы строки. Для этого перед командой MOVS указывается префикс с названием REP.
REP MOVSB; повторять пересылку байтов CX раз
Пример: содержимое массива Y переписать в массив X
CLD
LEA SI, Y; ОТКУДА
PUSH DS
POP ES; УСТАНОВКА ES НА СЕГМЕНТ ДАНЫХ
LEA DI, X; КУДА
MOV CX, 100; СКОЛЬКО БАЙТ ПЕРЕПИСАТЬ
REP MOVSB
Команды сравнения строк
CMPSB – сравнение строк из байтов
CMPSW – сравнение строк из слов
[DS:SI]=[ES:DI]?; SI:=SI+d; DI:=DI+d
Команды сравнивают пару элементов – элемент из одной строки с элементом из другой строки. Абсолютный адрес элемента из первой строки должен задаваться регистрами DS и SI, а абсолютный адрес элемента из второй строки – регистрами ES и DI.
После выполнения данных команд меняются значения регистров SI и DI. В них записываются адреса соседних элементов строк. При DF=0 значения регистров увеличиваются, то есть происходит переход вперед. При DF=1 значения регистров уменьшаются, происходит переход назад.
Пример:
Пусть строка S1 из N байтов расположена в сегменте памяти, на начало которого установлен сегментный регистр DS, а строка S2 из того же числа байтов находится в сегменте, на начало которого установлен регистр ES. Проверить равенство строк.
Просмотр вперед для проверки равенства строк:
CLD; DF=0
LEA SI, S1; DS:SI=начало S1
LEA DI, S2; ES:DI=начало S2
MOV CX, N; длина строк
L: CMPSB; сравнить пару элементов
JNE NOEQ; S1<> S2 переход на NOEQ
LOOP L; к следующей паре
EQ: …; S1= S2
CLD; DF=0
LEA SI, S1; DS:SI=начало S1
LEA DI, S2; ES:DI=начало S2
MOV CX, N; длина строк
REPE CMPSB; сравнить пока элементы равны (пока ZF=1)
JE EQ; ZF=1 (S1=S2) переход на EQ
NOEQ: …; ZF=0 (S1<> S2)
REPNE CMPSB
ПП заставляет повторять сравнение элементов строк, пока они не равны. Как только будет найдена пара равных элементов, цикл прекращается.