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

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


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.024 сек.