Команда копирует байт, слово или двойное слово из цепочки, адресуемой операндом адрес_источника, в цепочку, адресуемую операндом адрес_приемника.
Размер пересылаемых элементов ассемблер определяет, исходя из атрибутов идентификаторов, указывающих на области памяти приемника и источника. К примеру, если эти идентификаторы были определены директивой db, то пересылаться будут байты, если идентификаторы были определены с помощью директивы dd, то пересылке подлежат 32-битовые элементы, то есть двойные слова.
Ранее уже было отмечено, что для цепочечных команд с операндами, к которым относится и команда пересылки movs адрес_приемника,адрес_источника, не существует машинного аналога.
При трансляции в зависимости от типа операндов транслятор преобразует ее в одну из трех машинных команд:
movsb, movswилиmovsd.
Сама по себе команда movs пересылает только один элемент, исходя из его типа, и модифицирует значения регистров esi/si и edi/di. Если перед командой написать префикс rep, то одной командой можно переслать до 64 Кбайт данных (если размер адреса в сегменте 16 бит — use16) или до 4 Гбайт данных (если размер адреса в сегменте 32 бит - use32).
Число пересылаемых элементов должно быть загружено в счетчик — регистр cx (use16) или ecx (use32).
Перечислим набор действий, которые нужно выполнить в программе для того, чтобы выполнить пересылку последовательности элементов из одной области памяти в другую с помощью команды movs.
В общем случае этот набор действий можно рассматривать как типовой для выполнения любой цепочечной команды:
- Установить значение флага df в зависимости от того, в каком направлении будут обрабатываться элементы цепочки — в направлении возрастания или убывания адресов.
- Загрузить указатели на адреса цепочек в памяти в пары регистров ds:(e)si и es: (e)di.
- Загрузить в регистр ecx/cx количество элементов, подлежащих обработке.
- Выдать команду movs с префиксом rep.
На примере листинга 1 рассмотрим, как эти действия реализуются программно. В этой программе производится пересылка символов из одной строки в другую. Строки находятся в одном сегменте памяти. Для пересылки используется команда-примитив movs с префиксом повторения rep.
Листинг 1 Пересылка строк командой movs;prg_11_1.asmMASMMODEL smallSTACK 256.datasource db 'Тестируемая строка','$';строка-источникdest db 19 DUP (' ') ;строка-приёмник.code assume ds:@data,es:@datamain: ;точка входа в программу mov ax,@data ;загрузка сегментных регистров mov ds,ax ;настройка регистров DS и ES ;на адрес сегмента данных mov es,ax cld ;сброс флага DF — обработка строки от начала к концу lea si,source ;загрузка в si смещения строки-источника lea di,dest ;загрузка в DS смещения строки-приёмника mov cx,20 ;для префикса rep — счетчик повторений (длина строки)rep movs dest,source ;пересылка строки lea dx,dest mov ah,09h ;вывод на экран строки-приёмника int 21hexit: mov ax,4c00h int 21hend main |