Assembler для начинающих


Префикс REP



Префикс REP


    Существует специальный случай использования строковых команд.  Есть
    префикс, специально предназначенный для строковых команд.  Также
    как префикс подавления сегментации, используемый для порождения
    специальной сегментной адресации, он предшествует обычной команде и
    модифицирует ее работу.  А именно, этот префикс вводит строковую
    команду в цикл.  Мнемоника префикса REP происходит от английского
    слова Repeat - повторить.  Микропроцессор 8088 использует этот
    префикс в тесной связи с регистром CX, который указывает число
    повторений команды.
 
      Примером является команда STOSB. Команда
 


      REP STOSB
 
      есть специальная форма команды записи байта. Эта команда
    повторяется до тех пор, пока содержимое регистра CX не уменьшится
    до 0. Команда STOSB записывает байт из регистра AL в ячейку памяти,
    которая указывается парой регистров ES:DI, а затем увеличивает или
    уменьшает регистр DI на единицу так же, как и обычная команда
    STOSB. Затем префикс REP уменьшает регистр CX, и если он теперь не
    нуль, повторяет всю команду целиком. Запись строки повторяется до
    тех пор, пока регистр CX не достигнет нуля.
 
      Такая возможность превращает команду STOS в команду заполнения.
    Программа помещает заполнитель в регистр AL, счетчик байта в
    регистр CX, адрес блока в пару регистров ES:DI и сбрасывает флаг
    направления. Затем команда REP STOSB заполняет блок памяти
    значением из регистра AL. Такой фрагмент кода показан на Фиг. 4.23.

          Microsoft (R) Macro Assembler Version 5.00              1/1/80 04:01:31
          Фиг. 4.23 Заполнение области памяти               Page  1-1
 
 
                                        PAGE    ,132
                                        TITLE   Фиг. 4.23 Заполнение области памяти
           0000                   CODE    SEGMENT
                                        ASSUME  CS:CODE,DS:CODE,ES:CODE
 
                                  ;--------------------------------------
                                  ; В этом примере область данных BYTE_BLOCK
                                  ; заполняется значением 01H
                                  ;--------------------------------------
 
           0000  8D 3E 000C R                 LEA     DI, BYTE_BLOCK        ; DI <- адрес области данных
           0004  B9 0032 90                   MOV     CX, BYTE_BLOCK_LENGTH   ; CX <- размер заполняемой области
           0008  B0 01                  MOV     AL, 01H               ; Символ для заполнения
           000A  F3/ AA           REP     STOS    BYTE_BLOCK                ; Заполнение
 
           000C  0032[            BYTE_BLOCK        DB          50 DUP(?)
                  ??
                             ]
 
           = 0032                 BYTE_BLOCK_LENGTH       EQU     $-BYTE_BLOCK
 
           003E                   CODE    ENDS
                                        END
 
            Фиг. 4.23 Заполнение блока
 
      В случае команды LODS префикс REP не имеет смысла. Загрузка
    непрерывной строки данных в аккумулятор не дает программе
    возможности иметь дело с данными по мере их поступления. Однако
    префикс REP весьма полезен для работы с другими командами обработки
    строк.




Содержание раздела