REP/REPcc – повторение строковой операции
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 и т.д. Если же в результате вычитания содержимое CX обнулилось, операция прекращается. Таким образом, операция может быть повторена от одного до 65536 раз.
Помимо завершения операции по обнулению счётчика, в некоторых инструкциях предусмотрено её завершение при выполнении определённого условия, а именно равенства или неравенства флажка ZF нулю.
Логически имеются три разновидности префикса повторения, которым соответствуют пять мнемоник и два однобайтовых кода операции:
– простое повторение – префикс REP, код операции F3; операция заканчивается, когда содержимое регистра CX обнуляется;
– повторение, пока соблюдается равенство – префикс REPE/REPZ, код операции F3; операция заканчивается, когда содержимое регистра CX обнуляется или когда сбрасывается флажок ZF;
– повторение, пока равенство не соблюдается – префикс REPNE/REPNZ, код операции F2; операция заканчивается, когда содержимое регистра CX обнуляется или когда устанавливается флажок ZF.
С инструкциями MOVS, LODS, STOS
может применяться только обычный префикс повторения REP. Когда он используется, операция продолжает выполняться до тех пор, пока содержимое регистра CX не станет равным нулю.
С инструкциями CMPS и SCAS употребляются префиксы REPE/REPZ
и REPNE/REPNZ. Первый префикс обеспечивает прекращение операции при исчерпании счётчика или при сбросе флажка ZF в нуль; последнее событие имеет место, когда обнаружено неравенство сравниваемых байтов или слов. Второй префикс обеспечивает прекращение операции при исчерпании счётчика или при установке флажка ZF в единицу, что происходит при обнаружении равенства сравниваемых байтов или слов.
Флажки самим префиксом не изменяются, однако инструкции SCAS и CMPS, которые могут употребляться вместе с префиксом повторения, изменяют их.