logo

Главная Система команд x86 Базовая система команд CPU REP

Система команд x86

Программирование - Архитектура и система команд микропроцессоров x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

REP

Повторить следующую строковую операцию

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

 

 

 

 

 

 

 

 

 

 

Код

Команда

Описание

Проц.

Пример

F3 6C

REP INS r/m8,DX

Загрузить (E)CX байт из порта в/в DX в память по адресу ES:(E)DI

Intel286

rep insb

F3 6D

REP INS r/m16,DX

Загрузить (E)CX  слов из порта в/в DX в память по адресу ES:(E)DI

Intel286

rep insw

F3 6D

REP INS r/m32,DX

Загрузить (E)CX  двойных слов из порта в/в DX в память по адресу ES:(E)DI

Intel386

rep insd

F3 A4

REP MOVS m8,m8

Записать по адресу ES:(E)DI блок из (E)CX байт, считываемый по адресу DS:(E)SI

8086

rep movsb

F3 A5

REP MOVS m16,m16

Записать по адресу ES:(E)DI блок из (E)CX  слов, считываемый по адресу DS:(E)SI

8086

rep movsw

F3 A5

REP MOVS m32,m32

Записать по адресу ES:(E)DI блок из (E)CX  двойных слов, считываемый по адресу DS:(E)SI

Intel386

rep movsd

F3 6E

REP OUTS DX,r/m8

Вывести блок из (E)CX байт из памяти по адресу DS:(E)SI в порт в/в по адресу в DX

Intel286

rep outsb

F3 6F

REP OUTS DX,r/m16

Вывести блок из (E)CX слов из памяти по адресу DS:(E)SI в порт в/в по адресу в DX

Intel286

rep outsw

F3 6F

REP OUTS DX,r/m32

Вывести блок из (E)CX  двойных слов из памяти по адресу DS:(E)SI в порт в/в по адресу в DX

Intel386

rep outsd

F3 AC

REP LODS AL

Считать блок из (E)CX байт по адресу DS:(E)SI в AL

8086

rep lodsb

F3 AD

REP LODS AX

Считать блок из (E)CX слов по адресу DS:(E)SI в AX

8086

rep lodsw

F3 AD

REP LODS EAX

Считать блок из (E)CX двойных слов по адресу DS:(E)SI в EAX

Intel386

rep lodsd

F3 AA

REP STOS m8

Заполнить блок из (E)CX байт по адресу ES:(E)DI содержимым AL

8086

rep stosb

F3 AB

REP STOS m16

Заполнить блок из (E)CX слов по адресу ES:(E)DI содержимым AX

8086

rep stosw

F3 AB

REP STOS m32

Заполнить блок из (E)CX двойных слов по адресу ES:(E)DI содержимым EAX

Intel386

rep stosd

F3 A6

REPE CMPS m8,m8

Найти неравные байты в блоках из (E)CX байт по адресам DS:(E)SI и ES:(E)DI

8086

repe cmpsb

F3 A7

REPE CMPS m16,m16

Найти неравные слова в блоках из (E)CX слов по адресу DS:(E)SI и ES:(E)DI

8086

repe cmpsw

F3 A7

REPE CMPS m32,m32

Найти неравные двойные слова в блоках из (E)CX двойных слов по адресу DS:(E)SI и ES:(E)DI

Intel386

repe cmpsd

F3 AE

REPE SCAS m8

Найти байт не равный AL в блоке из (E)CX байт по адресу ES:(E)DI

8086

repe scasb

F3 AF

REPE SCAS m16

Найти слово не равное AX в блоке из (E)CX слов по адресу ES:(E)DI

8086

repe scasw

F3 AF

REPE SCAS m32

Найти двойное слово не равное EAX в блоке из (E)CX двойных слов по адресу ES:(E)DI

Intel386

repe scasd

F2 A6

REPNE CMPS m8,m8

Найти равные байты в блоках из (E)CX байт по адресам DS:(E)SI и ES:(E)DI

8086

repne cmpsb

F2 A7

REPNE CMPS m16,m16

Найти равные слова в блоках из (E)CX слов по адресу DS:(E)SI и ES:(E)DI

8086

repne cmpsw

F2 A7

REPNE CMPS m32,m32

Найти равные двойные слова в блоках из (E)CX двойных слов по адресу DS:(E)SI и ES:(E)DI

Intel386

repne cmpsd

F2 AE

REPNE SCAS m8

Найти байт равный AL в блоке из (E)CX байт по адресу ES:(E)DI

8086

repne scasb

F2 AF

REPNE SCAS m16

Найти слово равное AX в блоке из (E)CX слов по адресу ES:(E)DI

8086

repne scasw

F2 AF

REPNE SCAS m32

Найти двойное слово равное EAX в блоке из (E)CX двойных слов по адресу ES:(E)DI

Intel386

repne scasd

 

Описание:

Префиксы REP (F3h), REPE (F3h) и REPNE (F2h) применяются со строковыми операциями. Каждый префикс заставляет строковую команду, которая следует за ним, повторяться указанное в регистре счетчике (E)CX количество раз или, кроме этого, (для префиксов REPE и REPNE) пока не встретится указанное условие во флаге ZF.

Мнемоники REPZ и REPNZ являются синонимами префиксов REPE и REPNE соответственно и имеют одинаковые с ними коды. Префиксы REP и REPE/REPZ также имеют одинаковый код F3h, конкретный тип префикса задается неявно той командой, перед которой он применен. Если префикс повторения применяется с командой или в комбинации, которая не представлена в таблице 6.100, то результат выполнения такой команды неопределен (обычно этот префикс просто игнорируется).

Все описываемые префиксы могут применяются только к одной строковой команде за один раз. Чтобы повторить блок команд, используется команда LOOP или другие циклические конструкции.

Полный список действий, предпринимаемых процессором, при исполнении команды с префиксом повторения выглядит следующим образом:

  • если атрибут размера адреса команды равен 16 бит, то в качестве регистра счетчика используется регистр CX, если атрибут размера адреса равен 32 бита — регистр ECX;
  • проверка регистра счетчика, если он равен 0, то выйти из цикла и перейти к следующей команде;
  • обработка любых поступивших запросов на прерывание;
  • однократное исполнение заданной строковой операции;
  • уменьшение регистра счетчика на 1 (флаги не изменяются);
  • если обрабатываемая строковая операция — команда SCAS или CMPS, то осуществляется проверка флага ZF, если условие повторения, задаваемое префиксом (флаг ZF равен 1 для префикса REPE/REPZ или флаг ZF равен 0 для префикса REPNE/REPNZ), не сохранилось, то выйти из цикла и перейти к следующей команде;
  • вернуться к началу цикла для следующего повторения.

Команды CMPS и SCAS с префиксами условного повторения могут завершаться по двум причинам: если счетчик повторений (E)CX исчерпан и если флаг ZF не отвечает условию повторения. Эти два случая могут различаться при помощи команды JCXZ или команд условных переходов, которые проверяют флаг ZF (команды JZ, JNZ и JNE).

Операция:

IF AddresSize = 16

  THEN Использовать CX для CountReg;

  ELSE (* AddresSize = 32 *) Использовать ECX для CountReg;

FI;

WHILE CountReg ¹ 0

DO

  Обслуживание прерываний (если они поступили);

  Выполнение основной строковой команды;

  CountReg = CountReg - 1;

  IF (Основная команда CMPSB, CMPSW, CMPSD, SCASB, SCASW или SCASD)

  THEN

     IF (команда REP/REPE/REPZ) AND (ZF = 0)

     THEN exit WHILE loop;

     ELSE

        IF (Команда REPNZ или REPNE) AND (ZF = 1)

        THEN exit WHILE loop;

        FI;

     FI;

  FI;

OD;

Особые ситуации защищенного режима:

Нет.

Особые ситуации режима реальной адресации:

Нет.

Особые ситуации режима V86:

Нет.

Замечание:

Не все порты ввода/вывода могут поддерживать скорость, на которой выполняются команды REP INS и REP OUTS.

Когда происходит ошибка во время выполнения команд CMPS или SCAS с префиксом REPNE, значение EFLAGS восстанавливается в состояние предшествующее выполнению команды. Поскольку SCAS и CMPS не используют EFLAGS в качестве входного значения, то процессор может возобновить команду после обработки ошибки.

Использование префикса REP (F3h) с SIMD-командами ANDPS, ANDNPS, COMISS, FXRSTOR, FXSAVE, ORPS, LDMXCSR, MOVAPS, MOVHPS, MOVLPS, MOVMSKPS, MOVNTPS, MOVUPS, SHUFPS, STMXCSR, UCOMISS, UNPCKHPS, UNPCKLPS и XORPS. является зарезервированной недокументированной функцией. Различные модели процессоров по разному реагируют на эту ситуацию. Не рекомендуется применять в программах комбинацию этих команд и префикса REP, т.к. в дальнейших моделях процессоров эта функция может быть изменена или исключена.

В некоторых моделях процессоров AMD при совпадении большого количества условий (т.е. очень редко) возможна некорректная работа команды REP MOVS с префиксом изменения размера адреса и начальным значением ECX =6.


Входит в группу команд: Базовая система команд CPU




Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Top.Mail.Ru       Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники