Префикс 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 весьма полезен для работы с другими командами обработки
строк.