На этом шаге мы рассмотрим команду, используемую для записи строки.
Команда STOS записывает (сохраняет) содержимое регистра AL или AX в байте или в слове памяти. Адрес памяти всегда представляется регистрами ES:DI. В зависимости от флага DF команда STOS также увеличивает или уменьшает адрес в регистре DI на 1 для байта или на 2 для слова.
Эту команду с префиксом REP можно использовать для инициализации области данных конкретным значением. Длина области (в байтах или в cловах) загружается в регистр AX.
Команды, эквивалентные команде REP STOSB:
LABEL1: JCXZ LABEL2
MOV [DI],AL
INC/DEC DI ;Инкремент или декремент.
LOOP LABEL1
LABEL2: . . .
Команда STOS бывает полезна для установки в некоторой области определенных значений байтов и слов. Для дублирования образца, длина которого превышает размер слова, можно использовать команду MOVS с небольшой модификацией. Предположим, что необходимо сформировать строку, в которой многократно повторялись символы: '11**'. Сначала определим первые четыре байта, которые расположим непосредственно перед обрабатываемой строкой следующим образом:
PATTERN DB '11**' DISAREA DB 44 DUP(?) . . . CLD MOV CX,22 LEA DI,DISAREA LEA SI,PATTERN REP MOVSW . . .
В процессе выполнения команда MOVSW сначала пересылает первое слово (символы '11') из образца PATTERN в первое слово области DISAREA, затем - второе слово (символы '**'). К этому моменту регистр DI будет содержать адрес DISAREA+4, а pегистр SI - PATTERN+4, который также является адресом DISAREA. Затем команда MOVSW автоматически дублирует образец, пересылая первое слово из DISAREA в DISAREA+4, из DISAREA+2, в DISAREA+6, из DISAREA+4 в DISAREA+8 и т.д. В результате образец будет полностью продублирован по всей области DISAREA.
Данный способ можно использовать для дублирования в области памяти любого образца любой длины, только образец должен быть расположен непосредственно перед принимающей областью.
На следующем шаге мы рассмотрим команду сравнения строк.