б) DI:= <DI> ± 2, SI:= <SI> ± 2, если переслали
слово.
Примечания
а) инкремент («+») происходит в том случае, если флаг DF был
сброшен (DF = 0 — нормальное направление) ;
б) декремент («-») происходит в том случае, если флаг DF был
установлен (DF = 1 — обратное направление; D — DOWN — вниз).
Установка флага DF производится с помощью специальных команд:
а) установка флага (DF = 1) производится командой STD, КОП
= FD ;
б) сброс флага (DF = 0) производится командой CLD, КОП = FС.
Пример – необходимо переслать 5 байт, начиная с адреса 015ЗС,
на место, начиная с адреса 35000.
Выделяем, с учетом команды типа MOVS, по своему усмотрению
значения сегментов и адреса в сегментах источника и приемника.
Адрес источника (src): 015ЗС = 0000:15ЗС;
Адрес приемника (dst): 35000 = 3000:5000.
Составляем программу:
CLD ; Сбросить DF (инкремент адресов dst и src);
MOV AX, 0000 ; загрузить в
MOV DS, AX ; DS значение сегмента источника;
MOV AX, 3000 ; загрузить в
MOV ES, AX ; ES значение сегмента приемника;
MOV SI, 15ЗС ; загрузить адрес источника;
MOV DI, 5000 ; загрузить адрес приемника;
MOVSW ; переслать два байта;
MOVSW ; переслать два байта;
MOVSB ; переслать байт.
Команда очень удобная для перемещения массивов в памяти. Но если
число цепочки не 5 байтов, и 5000? Очевидно, что нужно организовать цикл.
Как это делается, уже рассматривалось в главе 9. Но фирма Intel усилила
цепочные команды встроенным циклом, который запускается префиксом
повторения. Команда префикса:
а) ассемблер: REP (REPEAT — повторение);
б) КОП = F2 или F3 (любой).
Префикс повторения ставится перед цепочной командой и по умолчанию
использует счетчик в CX; прекращает повторение при CX = 0. Применим в
рассмотренном выше примере префикс повторения:
CLD ; Сбросить DF (инкремент адресов dst и src);
MOV AX, 0000 ; загрузить в
MOV DS, AX ; DS значение сегмента источника;
MOV AX, 3000 ; загрузить в
60