2.3.8. Строковые операции

Все команды для работы со строками считают, что строка-источник находится по адресу DS:SI (или DS:ESI), то есть в сегменте памяти, указанном в DS Со сме­щением в SI, а строка-приемник - соответственно в ES:DI (или ES:EDI). Кроме того, все строковые команды работают только с одним элементом строки (байтом, словом или двойным словом) за один раз. Для того чтобы команда выполнялась над всей строкой, необходим один из префиксов повторения операций.

Команда Назначение Процессор

REP

Повторять

8086

REPE

Повторять, пока равно

8086

REPNE

Повторять, пока не равно

8086

REPZ

Повторять, пока ноль

8086

REPNZ

Повторять, пока не ноль

8086

Все перечисленные команды являются префиксами для операций над строка­ми. Любой из префиксов выполняет следующую за ним команду строковой обра­ботки столько раз, сколько указано в регистре ЕСХ (или СХ, в зависимости от разрядности адреса), уменьшая его при каждом выполнении команды на Кроме того, REPZ и REPE прекращают повторения команды, если флаг ZF сброшен в О, a REPNZ и REPNE прекращают повторения, если флаг ZF установлен в L Пре­фикс REP обычно используется с командами INS, OUTS, MOVS, LODS, STOS,

а префиксы REPE, REPNE, REPZ и REPNZ - с командами CMPS и SCAS. Пове­дение префиксов в других случаях не определено.

Команда Назначение Процессор

МОУв приемник.источник Копирование строки 8086

МОУвВ Копирование строки байтов 8086

MOVSW Копирование строки слов 8086

МОУвО Копирование строки двойных слов 80386

Копирует один байт (MOVSB), слово (MOVSW) или двойное слово

из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса) в па­мять по адресу ES:EDI (или ES:DI). При использовании формы записи MOVS

ассемблер сам определяет по типу указанных операндов (принято указывать имена копируемых строк, но можно применять любые два операнда подходящего типа), ка­кую из трех форм этой команды (MOVSB, MOVSW или MOVSD) выбрать. Исполь­зуя MOVS с операндами, разрешается заменить регистр DS другим с помощью пре­фикса замены сегмента (ES:, GS:, FS:, CS:, SS:), регистр ES заменить нельзя. После выполнения команды регистры ESI (или SI) и EDI (или DI) увеличиваются на 1, 2 или 4 (если копируются байты, слова или двойные слова), когда флаг DF = О,ммтмш

и уменьшаются, когда = 1. Команда МОУБ с префиксом ЯЕР выполняет копи­рование строки длиной в ЕСХ (или СХ) байтов, слов или двойных слов.

Команда

Назначение

Процессор

CMPS приемник,источник

Сравнение строк

8086

CMPSB

Сравнение строк байтов

8086

CMPSW

Сравнение строк слов

8086

CMPSD

Сравнение строк двойных слов

80386

Cравнивает один байт (CMPSB), слово (CMPSW) или двойное слово (CMPSD) из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса) с бай­том, словом или двойным словом по адресу ES:EDI (или ES:DI) и устанавливает флаги аналогично команде CMP. При использовании формы записи CMPS ассемб­лер сам определяет по типу указанных операндов (принято указывать имена срав­ниваемых строк, но можно использовать любые два операнда подходящего типа),

какую из трех форм этой команды (CMPSB, CMPSW или CMPSD) выбрать.

Применяя CMPS с операндами, можно заменить регистр DS другим, воспользо­вавшись префиксом замены сегмента регистр ES заменить

нельзя. После выполнения команды регистры ESI (или SI) и EDI (или DI) уве­личиваются на 1, 2 или 4 (если сравниваются байты, слова или двойные слова), когда флаг DF = 0, и уменьшаются, когда DF = 1. Команда CMPS с префиксами REPNE/REPNZ или REPE/REPZ выполняет сравнение строки длиной в ECX (или CX) байтов, слов или двойных слов. В первом случае сравнение продолжает­ся до первого совпадения в строках, а во втором - до первого несовпадения.

Команда

Назначение

Процессор

SCAS приемник

Сканирование строки

8086

SCASB

Сканирование строки байтов

8086

SCASW

Сканирование строки слов

8086

SCASD

Сканирование строки двойных слов

80386

Сравнивает содержимое регистра AL (SCASB), АХ (SCASW) или ЕАХ (SCASD) с байтом, словом или двойным словом из памяти по адресу ES:EDI (или ES:DI, в за­висимости от разрядности адреса) и устанавливает флаги аналогично команде СМР. При использовании формы записи SCAS ассемблер сам определяет по типу указан­ного операнда (принято указывать имя сканируемой строки, но можно использовать любой операнд подходящего типа), какую из трех форм этой команды (SCASE, SCASW или SCASD) выбрать. После выполнения команды регистр EDI (или DI) увеличивается на 1, 2 или 4 (если сканируются байты, слова или двойные слова), когда флаг DF - 0, и уменьшается, когда DF = 1. Команда SCAS с префиксами REPNE/REPNZ или REPE/REPZ выполняет сканирование строки длиной в ЕСХ (или СХ) байтов, слов или двойных слов. В первом случае сканирование продолжа­ется до первого элемента строки, с содержимым аккумулятора, а во втором - до первого отличного.

Процессоры intei в реальном режиме

Команда

Назначение

Процессор

LODSW

LODS источник

LODSB

Чтение из строки Чтение байта из строки Чтение слова из строки Чтение двойного слова из строки

8086 8086 8086

LODSD

80386

Копирует один байт (LODSB), слово или двойное слово (LODSD)

из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса) в регистр AL, AX или EAX соответственно. использовании формы записи LODS ассемблер сам определяет по типу указанного операнда (принято указы­вать имя строки, но можно использовать любой операнд подходящего типа), ка­кую из трех форм этой команды (LODSB, LODSWran LODSD) выбрать. Приме^ няя LODS с операндом, можно заменить регистр DS на другой с префикса замены сегмента (ES:, GS:, FS:, CS:, SS:). После выполнения команды регистр ESI (или SI) увеличивается на І, 2 или 4 (если считывается байт, слово или двойное слово), когда флаг DF = 0, и уменьшается, когда DF - 1. Команда LODS с префиксом REP выполнит копирование строки длиной в ECX (или CX), и в аккумуляторе окажется последний элемент строки. На самом деле LODS ис­пользуют без префиксов, часто внутри цикла в паре с командой STOS, так что

LODS считывает число, другие команды выполняют над ним какие-нибудь дей­ствия, а затем STOS записывает измененное число на прежнее место в памяти.

Команда

Назначение

Процессор

STOS приемник

Запись в строку

8086

STOSB

Запись байта в строку

8086

STOSW

Запись слова в строку

8086

STOSD

Запись двойного слова в строку

80386

Копирует регистр AL (STOSB), АХ (STOSW) или ЕАХ (STOSD) в память по адресу ES.EDI (или ES:DI, в зависимости от разрядности адреса). При использо­вании формы записи STOS ассемблер сам определяет по типу указанного операн­да (принято указывать имя строки, но можно использовать любой операнд под­ходящего типа), какую из трех форм этой команды (STOSB, STOSWran STQSD) выбрать. После выполнения команды регистр EDI (или DI) увеличивается на І, 2 или 4 (если копируется байт, слово или двойное слово), когда флаг DF = О, и уменьшается, когда DF = І. Команда STOS с префиксом REP заполнит строку длиной в ECX (или CX) числом, находящимся в аккумуляторе.

Команда Назначение Процессор

INS DX Чтение строки из порта 80186

INSB Чтение строки байт из порта .80186

INSW Чтение строки слов из порта 80186

INSD Чтение строки двойных слов из порта 80386

Считывает из порта ввода-вывода, номер которого указан в регистре DX, байт (INSB), слово (INSW) или двойное слово (INSD) в память по адресу ES:EDI (или ES:DI, в зависимости от разрядности адреса). При использовании формы записи INS ассемблер определяет по типу указанного операнда, какую из трех форм этой

команды (INSB, INSW или INSD) употребить. После выполнения команды ре­гистр EDI (или DI) увеличивается на 1, 2 или 4 (если считывается байт, слово или двойное слово), когда флаг DF = 0, и уменьшается, когда DF = 1. Команда INS с префиксом REP считывает блок данных из порта длиной в ЕСХ (или СХ)

байтов, слов или двойных слов.

Команда

Назначение

Процессор

OUTS

Запись строки в порт

80186

OUTSB

Запись строки байтов в порт

80186

OUTSW

Запись строки слов в порт

80186

OUTSD

Запись строки двойных слов в порт

80386

Записывает в порт ввода-вывода, номер которого указан в регистре DX, байт

(OUTSB), слово (OUTSW) или двойное слово (OUTSD) из памяти по адресу DS:ESI (или DS:SI, в зависимости от разрядности адреса). При использовании

формы записи OUTS ассемблер определяет по типу указанного операнда, какую

из трех форм этой команды (OUTSB, OUTSW или OUTSD) употребить. Приме­няя OUTS с операндами, также можно заменить регистр DS другим с помощью префикса замены сегмента (ES:, GS:, FS:, CS:, SS:). После выполнения команды регистр ESI (или SI) увеличивается на 1, 2 или 4 (если считывается байт, слово или двойное слово), когда флаг DF = 0, и уменьшается, когда DF = 1. Команда OUTS с префиксом REP записывает блок данных размером в ЕСХ (или СХ) бай­тов, слов или двойных слов в указанный порт. Все процессоры до Pentium не про­веряли готовность порта принять новые данные в ходе выполнения команды REP

OUTS, так что, если порт не успевал обрабатывать информацию с той скорос­тью, с которой ее поставляла эта команда, часть данных терялась.