На главную Назад
Добро пожаловать, уважаемый посетитель!

Существует специальный случай использования строковых команд.Есть

префикс, специально предназначенный для строковых команд.Также

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

специальной сегментной адресации, он предшествует обычной команде и

модифицирует ее работу.А именно, этот префикс вводит строковую

команду в цикл.Мнемоника префикса 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.001/1/80 04:01:31

Фиг. 4.23 Заполнение области памяти Page 1-1

 

 

PAGE,132

TITLEФиг. 4.23 Заполнение области памяти

0000CODESEGMENT

ASSUMECS:CODE,DS:CODE,ES:CODE

 

;--------------------------------------

; В этом примере область данных BYTE_BLOCK

; заполняется значением 01H

;--------------------------------------

 

00008D 3E 000C R LEADI, BYTE_BLOCK; DI <- адрес области данных

0004B9 0032 90MOVCX, BYTE_BLOCK_LENGTH; CX <- размер заполняемой области

0008B0 01MOVAL, 01H; Символ для заполнения

000AF3/ AAREPSTOSBYTE_BLOCK; Заполнение

 

000C0032[BYTE_BLOCKDB50 DUP(?)

??

]

 

= 0032BYTE_BLOCK_LENGTHEQU$-BYTE_BLOCK

 

003ECODEENDS

END

 

Фиг. 4.23 Заполнение блока

 

В случае команды LODS префикс REP не имеет смысла. Загрузка

непрерывной строки данных в аккумулятор не дает программе

возможности иметь дело с данными по мере их поступления. Однако

префикс REP весьма полезен для работы с другими командами обработки

строк.


 

Mail.ru