Иллюстрированный самоучитель по Turbo Pascal

Система команд

Строковые команды

Мнемоника Формат Комментарий
Пересылка строк
MOVSB MOVSB Пересылать байты
MOVSW MOVSW Пересылать слова
Сравнение строк
CMPSB CMPSB Сравнивать байты
CMPSW CMPSW Сравнивать слова
Сканирование
SCASB SCASB Искать байт
SCASW SCASW Искать слово
Загрузка и сохранение
LODSB LODSB Загружать байты
LODSW LODSW Загружать слова
STOSB STOSB Сохранять байты
STOSW STOSW Сохранять слова

Строковые команды рассчитаны на обработку строк. Замечу, что термин "строка" здесь отнюдь не эквивалентен аналогичному термину Турбо Паскаля и означает произвольную цепочку байт или слов длиной до 64 Кбайт. Эти команды оперируют пятью примитивами, каждый из которых обрабатывает лишь один байт или одно слово за раз. Перед примитивом обычно указывается префикс повторения REP/REPE/REPNE, заставляющий выполняться примитив до тех пор, пока не обнулится счетчик повторений СХ или не будет нарушено соответствующее условие.

При использовании строковых команд важно помнить два обстоятельства. Во-первых, эти команды всегда берут адрес строки-источника из пары DS:SI, а строки-приемника – из пары ES:DI. Таким образом, перед исполнением строковой команды необходимо инициировать сегментные регистры нужным образом. Во-вторых, строковые команды используют индексную адресацию с автоматическим изменением смещения в SI/DI после однократного исполнения примитива. Содержимое этих регистров изменяется на 1 при обработке байтов и на 2 при обработке слов, причем наращивается, если флаг направления DF сброшен, и уменьшается, если он равен 1.

Вот как можно осуществить пересылку массива А в массив В:

var
А,В: array [1..250] of Integer;
…….
asm
lea si, A {Смещение А – в SI (источник)'}
push ds pop es {Инициируем ES: = DS}
lea di,B {Смещение В – в DI (приемник)}
mov ex,250 {Счетчик – переноса}
сld {Направление переноса – наращивать}
rep movsw {Переносим 500 байт}
end;

В программе на Турбо Паскале регистр DS всегда содержит сегмент данных, поэтому инициировать его необязательно. Что касается регистра дополнительного сегмента ES, такого правила нет, и хотя в большинстве случаев он также ссылается на сегмент данных, рекомендуется проводить его инициацию перед использованием строковой команды (см. выше команды push ds, popes).

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.