Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
REP
Влияние команды на флаги и форматы команды:
|
|
|
|
|
|
|
|
|
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.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru