Пересылка строки
Пересылка строки
Может показаться удобным использовать команды LODS и STOS для
пересылки данных из одного места в другое, но для этой цели
существует другая команда, пересылка строки MOVS. Эта команда
подобна комбинации команд LODS и STOS. Она берет данные из пары
регистров [DS:SI], помещает их в пару регистров [ES:DI], и изменяет
как регистр SI, так и регистр DI, чтобы они указывали на следующую
ячейку в каждой строке. Команда MOVS делает это одна, и не
загружает аккумулятор во время пересылки. Команда MOVS делает
сочетание LODS и STOS более быстрым и дающим меньше побочных
эффектов.
Команда MOVS указывает два операнда памяти. Только MOVS и еще
одна строковая команда CMPS работают с двумя операндами памяти. Все
остальные команды требуют, чтобы один или оба операнда находились в
регистре микропроцессора. Как и команды LODS и STOS, команда MOVS
работает как с байтами, так и со словами. Поскольку строковые
команды имеют дело с жестко заданными адресами, для определения
типов служат только операнды, написанные программистом. Команда
должна иметь оба операнда, и оба они должны быть одинаковых типов,
иначе программист может указать тип пересылки частью кода операции,
т.е. команда MOVSB и случае байтовых строк или команда MOVSW для
строк, состоящих из слов. Если в программе используется основная
форма, команда MOVS, ассемблер проверяет переменные на правильность
сегментной адресации, а также проверяет их типы.
Комбинация команды MOVS с префиксом REP дает эффективную
команду пересылки блока. Имея счетчик в регистре CX и показывающий
направление пересылки флаг направления, команда REP MOVS пересылает
данные из одного места памяти в другое очень быстро.
Микропроцессор, выполняющий команду REP MOVS, пересылает данные с
максимально возможной скоростью. Он больше не выбирает никакие
команды, поскольку единственное, что делается во время такой
пересылки - это пересылка.
Установка флага направления критична для правильной работы
команды REP MOVS. Различные виды установки флага направления
обсуждались в гл.3 именно на примере команды пересылки, и в
программе необходимо придерживаться рекомендаций, данных в этой
главе, особенно, если поля источника и результата перекрываются.