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

M

MOVS Пересылка данных из строки в строку. MOVSB Пересылка байта данных из строки в строку. MOVSW Пересылка слова данных из строки в строку.

Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они пересылают по одному элементу строки, который может быть байтом или словом. Первый операнд (приемник) адресуется через ES:DI, второй (источник) – через DS:SI. Операцию пересылки можно условно изобразить следующим образом:

(DS:SI) › (ES:DI)

После каждой операции пересылки регистры SI и DI получают положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1 или 2 в зависимости от размера пересылаемых элементов. Вариант команды movs имеет формат:

movs строка_1, строка_2

В этом случае байты или слова из строки строка_2 пересылаются на место строки строка_1. Размер пересылаемых элементов определяется описанием строк (с помощью директив db или dw). Это не избавляет от необходимости инициализировать регистры ES:DI и DS:SI адресами строк строка _1 и строка_2. В этом формате возможна замена сегмента второй строки (источника):

movs строка_1, ES:строка_2

Рассматриваемые команды могут предваряться префиксом повторения rep (повторять СХ раз). После выполнения рассматриваемых команд регистры SI и DI указывают на ячейки памяти, находящиеся за теми (если DF=0) или перед теми (если DF=1) элементами строк, на которых закончились операции пересылки. Если флаг DF сброшен, то пары регистров DS:SI и ES:DI следует инициализировать начальными адресами строк-операндов; строка-источник будет пересылаться от се начала, в порядке возрастания номеров ее байтов. Если флаг DF установлен, то пары регистров DS:SI и ES:DI следует инициализировать конечными адресами строк-операндов; строка-источник будет пересылаться от ее конца, в порядке уменьшения номеров ее байтов. Команды не воздействует на флаги процессора.

Пример 1:

;В полях данных основного сегмента данных,
;адресуемого через DS:
txt db 'Урок 1'; Пересылаемая строка
txt_len equ S-txt; Ee длина
;В 'полях данных дополнительного сегмента данных,
;адресуемого через ES:
string db 80 dup (' ')
;В программном сегменте:
lea SI,txt; DS:SI › txt
lea DI,string+10.; ES:DI › string+10
сld; Движение по строке вперед
mov CX,txt_len; Столько байтов переслать
rep movsb; Пересылка

Пример 2:

;В полях данных сегмента данных, адресуемого через DS:
txt db 'А',84h, 'В',84h, 'A',84h, 'P',
db 84h,'И',84h,'Я',84h,'!',84h
txt_len=$-txt; B программном сегменте:
mov AX,0B800h; Сегментный адрес видеобуфера
mov ES,AX; Инициализируем ES
;Выведем на экран текст
mov DI,1672; Смещение к середине экрана
lea SI,txt; DS:SI ® txt
сld; Движение по строке вперед
mov CX,txt_len/2; Столько слов переслать
rep movsw; Пересылка в середину экрана
;красной мерцающей (атрибут 84h) надписи 'АВАРИЯ!'
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.