Команды строковых примитивов
Команда | Описание | Операнды |
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
ПП заставляет повторять сравнение элементов строк, пока они не равны. Как только будет найдена пара равных элементов, цикл прекращается.
Сканирование строки: SCASB, SCASW
По команде SCASBсодержимое регистра AL сравнивается с байтом памяти, абсолютный адрес которого указывает пара регистров ES:DI, после чего регистр DI автоматически устанавливается на соседний байт памяти.
AL=[ES:DI]? ; DI:=DI+1
Команда SCASWсравнивает слова – из регистра AX и ячейки памяти, абсолютный адрес которого определяется паройES:DI, после чего регистр DI также автоматически устанавливается на соседнее слово памяти.
AX=[ES:DI]? ; DI:=DI+2
Команда SCASиспользуется для поиска в строке элемента, равного заданному (в AL или в AX), или отличного от заданного:
REPE SCASB– найти в строке первый элемент, отличный от AL.
REPNE SCASB –найти в строке первый элемент, равныйAL.
Сохранение строки: STOSB, STOSW
По команде STOSBв байт памяти, абсолютный адрес которого задается парой регистров ES:DI, записывается содержимое регистра AL, после чего значение регистра DI автоматически меняется на +1. Команда STOSWзаписывает содержимое регистра AX в слово памяти, абсолютный адрес которого задается регистрами ES:DI, после чего меняет значение регистра DI на +2.
Перед командой STOSуказывают только префикс REP.
Пример: заполнить пробелами строку S из 40 символов:
MOV AL,’ ‘
CLD
PUSH DS
POP ES
LEA DI, S
MOV CX, 40
REP STOSB
Загрузка строки: LODSB, LODSW
Команда LODSB (LODSW) записывает в регистр AL (AX) содержимое байта (слова) памяти, абсолютный адрес которого задается регистрами DS:SI, после чего меняет значение регистра SI аналогичным образом.
Пример: переписать все числа из X в Y с изменением их знака.
CLD
LEA SI, X
PUSH DS
POP ES
LEA DI, Y
MOV CX, 100
L: LODSB
NEG AL
STOSB
LOOP L
Дата добавления: 2015-10-09; просмотров: 996;