Код
|
Инструкция
|
Описание
|
F3 A4
|
REP MOVSB
|
Пересылка CX байтов из DS:SI в ES:DI.
|
F3 A5
|
REP MOVSW
|
Пересылка CX слов из DS:SI в ES:DI.
|
F3 AC
|
REP LODSB
|
Загрузка CX байтов из DS:SI в AL.
|
F3 AD
|
REP LODSW
|
Загрузка CX слов из DS:SI в AX.
|
F3 AA
|
REP STOSB
|
Запись CX байтов из AL в ES:DI.
|
F3 AB
|
REP STOSW
|
Запись CX слов из AX в ES:DI.
|
F3 A6
|
REPE CMPSB
|
Сравнение CX байтов в DS:SI и ES:DI до несовпадения.
|
F3 A7
|
REPE CMPSW
|
Сравнение CX слов в DS:SI и ES:DI до несовпадения.
|
F3 AE
|
REPE SCASB
|
Поиск байта, отличающегося от AL, в CX байтах в ES:DI.
|
F3 AF
|
REPE SCASW
|
Поиск слова, отличающегося от AX, в CX словах в ES:DI.
|
F2 A6
|
REPNE CMPSB
|
Сравнение CX байтов в DS:SI и ES:DI до совпадения.
|
F2 A7
|
REPNE CMPSW
|
Сравнение CX слов в DS:SI и ES:DI до совпадения.
|
F2 AE
|
REPNE SCASB
|
Поиск байта, совпадающего с AL, в CX байтах в ES:DI.
|
F2 AF
|
REPNE SCASW
|
Поиск слова, совпадающего с AX, в CX словах в ES:DI.
|
Счётчик должен находиться в регистре CX. После каждого выполнения инструкции, совместно с префиксом повторения, содержимое CX уменьшается на единицу и проверяется на равенство нулю. Инструкция повторяется до тех пор, пока в результате вычитания содержимое CX не обнулится. Помимо завершения операции по обнулению счётчика, в некоторых инструкциях предусмотрено её завершение при равенстве или неравенства флага ZF нулю.
Существует три разновидности префикса повторения, которым соответствует пять мнемоник:
Префикс простого повторения REP (код операции F3). Операция заканчивается, при обнулении содержимого регистра CX.
Префикс повторения, пока соблюдается равенство REPE/REPZ (код операции F3). Операция заканчивается, при обнулении содержимого регистра CX или сбросе флаг ZF.
Префикс повторения, пока равенство не соблюдается REPNE/REPNZ (код операции F2). Операция заканчивается, при обнулении содержимого регистра CX или установлении флага ZF.
В синтаксисе языка Паскаль действие префиксов REPE/REPZ/REP можно записать так:
L: if CX = 0 then goto L1;
CX:=CX-1;
{ строковая команда }
if ZF = 1 then goto L;
L1:...
Действие префиксов REPNE/REPNZ отличается проверкой флага нуля ZF = 0. С инструкциями MOVS, LODS и STOS может применяться только обычный префикс повторения REP. Когда он используется, операция продолжает выполняться до тех пор, пока регистр CX не обнулится.
С инструкциями CMPS и SCAS используются префиксы REPE/REPZ и REPNE/REPNZ. Первый префикс обеспечивает прекращение операции при обнулении счётчика или при сбросе флага ZF (при обнаружении неравенства сравниваемых байтов или слов). Второй префикс обеспечивает прекращение операции при обнулении счётчика или при установке флага ZF (при обнаружении равенства сравниваемых байтов или слов).
Пример сравнения двух строк с помощью префикса повторения REPE может быть записан в более компактной форме:
CLD ; DF=0 просмотр вперед
LEA SI, A ; DS:SI = начало A
LEA DI, B ; ES:DI = начало B
MOV CX, N ; CX = длина строки
REPE CMPSB ; сравнивать пары символов, пока элементы равны (пока ZF=1)
JE L ; выход по метке L, если A = B (ZF=1)
... ; A<>B (ZF=0)
Команда SCAS (сканирование строки) производит поиск байта или слова, содержащегося в регистре AL или AX, в строке по адресу ES:DI (табл. 55). Сегментный регистр ES не может быть заменён другим сегментным регистром с помощью префикса замены сегмента. Флаги изменяются в соответствии с результатами выполнения сравнения. После загрузки байта или слова в аккумулятор содержимое регистра DI увеличивается (DF=0) или уменьшается (DF=1) на 1 или 2 в зависимости от размера операнда.
Табл. 55. Команда SCAS.
Do'stlaringiz bilan baham: |