Справочник по языку Ассемблера IBM PC

       

Команда movs:


адрес_приемника,адрес_источника


Команда копирует байт, слово или двойное слово из цепочки, адресуемой операндом адрес_источника, в цепочку, адресуемую операндом адрес_приемника.


Размер пересылаемых элементов ассемблер определяет, исходя из атрибутов идентификаторов, указывающих на области памяти приемника и источника. К примеру, если эти идентификаторы были определены директивой 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.asm MASM MODEL   small STACK   256 .data source  db      'Тестируемая строка','$' ;строка-источник dest    db      19 DUP (' ')    ;строка-приёмник .code         assume  ds:@data,es:@data main:   ;точка входа в программу         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     21h exit:         mov     ax,4c00h         int     21h end     main


Содержание раздела