4.8.2. Префикс 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.

LODS EXBYTE

порождает команду загрузки строк байтов, так же как и команда LODSB.


Microsoft (R) Macro Assembler Version 5.00                1/1/80 04:00:49
Фиг. 4.23 Заполнение области памяти                             Page  1-1
                         PAGE     ,132
                         TITLE    Фиг. 4.23 Заполнение области памяти
0000                     CODE     SEGMENT
                         ASSUME   CS:CODE,DS:CODE,ES:CODE
                         ;--------------------------------------
                         ; В этом примере область данных BYTE_BLOCK
                         ; заполняется значением 01H
                         ;--------------------------------------
0000    AC                        LODS      EXBYTE      ; Загрузка AL из DS:SI
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 весьма полезен для работы с другими командами обработки строк.