Шаг 49.
Запись строки (команда STOS)

    На этом шаге мы рассмотрим команду, используемую для записи строки.

    Команда 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.

    Данный способ можно использовать для дублирования в области памяти любого образца любой длины, только образец должен быть расположен непосредственно перед принимающей областью.

    На следующем шаге мы рассмотрим команду сравнения строк.




Предыдущий шаг Содержание Следующий шаг