Команды строковых примитивов

Команда Описание Операнды
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

ПП заставляет повторять сравнение элементов строк, пока они не равны. Как только будет найдена пара равных элементов, цикл прекращается.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: