Команда STOS бывает полезна для установки в некоторой области oпределенных значений байтов и слов. Для дублирования образца, длина которого превышает размер слова, можно использовать команду MOVS с небольшой модификацией. Предположим, что необходимо сформировать строку следующего вида:
***---***---***---***---***---
...
Вместо того, чтобы определять полностью всю строку, можно определить только первые шесть байтов. Закодируем образец непосредственно перед обрабатываемой строкой следующим образом:
PATTERN DB '***---'
DISAREA DB 42 DUP(?)
.
.
CLD
MOV CX,21
LEA DI,DISAREA
LEA SI,PATTERN
REP MOVSW
В процессе выполнения команда MOVSW сначала пересылает первое слово (**) из образца PATTERN в первое слово области DISAREA, затем — второе слово (*-), потом третье (--).
К этому моменту регистр DI будет содержать адрес DISAREA+6, а pегистр SI — PATTERN+6, который также является адресом DISAREA. Затем команда MOVSW автоматически дублирует образец, пересылая первое слово из DISAREA в DISAREA+6, из DISAREA+2, в DISAREA+8, из DISAREA+4 в DISAREA+10 и так далее. В результате образец будет полностью продублирован по всей области DISAREA.
Данную технику можно использовать для дублирования в области памяти любого образца любой длины. Образец должен быть расположен непосредственно перед принимающей областью.
Важно:
uДля цепочечных команд MOVS, STOS, CMPS и SCAS не забывайте инициализировать регистр ES.
uСбрасывайте (CLD) или устанавливайте (STD) флаг направления в соответствии с направлением обработки.
uНе забывайте устанавливать в регистрах DI и SI необходимые значения. Например, команда MOVS предполагает операнды DI,SI, а команда CMPS — SI,DI.
uИнициализируйте регистр CX в соответствии с количеством байтов или слов, участвующих в процессе обработки.
uДля обычной обработки используйте префикс REP для команд MOVS и STOS и модифицированный префикс (REPE или REPNE) для команд CMPS и SCAS.
uПомните об обратной последовательности байтов в сравниваемых cловах при выполнении команд CMPSW и SCASW.
uПри обработке справа налево устанавливайте начальные адреса на последний байт обрабатываемой области. В случае, если, например, поле NAME1 имеет длину 10 байтов, то для побайтовой обработки данных в этой области справа налево начальный адрес, загружаемый командой LEA, должен быть NAME1+9. Для обработки слов начальный адрес в этом случае — NAME1+8.