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

       

MOVS Пересылка данных из строки в строку


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

MOVSW Пересылка слова данных из строки в строку

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

(DS:SI) -> (ES:DI)

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

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

В этом случае байты или слова из строки строка_2 пересылаются на место строки строка_]. Размер пересылаемых элементов определяется описанием строк (с помощью директив 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) надписи 'АВАРИЯ!'

Пример 3

;В полях данных сегмента данных, адресуемого через DS:

datal dw 10000 dup(') ;Массив произвольных данных

data2 dw 5000 dup(') ;Массив-приемник

;В программном сегменте

push DS ;Настроим

pop ES ;ES на тот же сегмент данных

mov SI,offset datal;SI -> datal

add SI,5000 ;Сместим SI к середине

;массива

mov DI,offset data2;DI -> data2

mov CX,2500 ;Размер половины массива (в

;словах)

сld ;Движение вперед

rep movsw ;Перешлем вторую половину

;массива datal на место data2

Пример 4

;В полях данных сегмента, адресуемого через DS

file db 'MYFILE.01.DAT1,0 ;Строка-источник

fname db 128 dup(?) ;Строка-приемник

;В программном сегменте

push DS

pop ES ;Теперь ES=DS

mov SI,offset file;DS:SI -> strl

mov SI,128 ;Максимальная длина имени

;файла

сld ;Движение по строке вперед

null: lodsb ;Загрузим в AL очередной

; символ

cmp AL, 0 ;Ищем 0 в конце имени файла

loopne null

;DS:SI ® Первый символ за концом имени файла (за

;завершающим нулем)

dec SI ;SI -> байт с 0 std ;Движение по строке назад

mov ВХ,128 ;Из начального значения СХ

sub BX,CX ;вычтем то, что в СХ осталось

mov СХ,ВХ ;СХ=число символов в имени (с 0)

dec ВХ ;Смещение к 0 от начала имени файла



lea DI,fname[ВХ] ;Смещение завершающего 0

rep movsb ;Перешлем все имя (от конца к началу)

386+ MOVSD Пересылка двойного слова из строки в строку

Команда аналогична командам МП 86 movsb и movsw, но позволяет скопировать двойное слово из строки, адресуемой через регистры DS:ESI, в строку, адресуемую через регистры ES:EDI.

Пример 1

;В полях данных сегмента, адресуемого через DS

strl db '01234567890ABCDEF' ;Строка-источник

str2 db 16 dup(?) ;Строка-приемник

;B программном сегменте

push DS

pop ES ;Теперь ES=DS

mov SI,offset strl ;DS:SI ®strl

mov DI,offset str2 ;ES:DI -> str2

сld ;Движение по строке вперед

mov CX,4 ;Коэффициент повторения

rep movsd ;Копирование по 4*4 байт

386+ MOVSX Пересылка с расширением знака

Команда пересылает байт в слово или двойное слово, а также слово в двойное слово с расширением знака. В качестве первого операнда (приемника) может использоваться 16- или 32-разрядный регистр общего назначения, в качестве второго - 8- или 16-разрядный регистр общего назначения или ячейка памяти такого же размера. Недопустима пересылка из памяти в память, в или из сегментного регистра, а также непосредственного значения. Фактически команда movsx увеличивает размер как положительного, так и отрицательного числа, ни изменяя ни его значения, ни знака.

Пример 1

mov CL,-5 ;CL=FBh

movsxAX,CL ;AX=FFFBh

Пример 2

mov CL,+5 ;CL=05h

movsxAX,CL ;AX=0005h

Пример 3

mov BL,-128 ;BL=80h

movsxECX,BL ;ECX=FFFFFF80h

Пример 4

; В полях данных

mem dw -3 ;mem=FFFDh

;В программном сегменте

movsxEB-X,mem ; EBX=FFFFFFFDh

386+ MOVZX Пересылка с расширением нуля

Команда пересылает байт в слово или двойное слово, а также слово в двойное слово с заполнением старших разрядов нулями. В качестве первого операнда (приемника) может использоваться 16- или 32-разрядный регистр общего назначения, в качестве второго - 8- или 16-разрядный регистр общего назначения или ячейка памяти такого же размера. Недопустима пересылка из памяти в память, в или из сегментного регистра, а также непосредственного значения. Фактически команда movzx увеличивает размер числа, считая его числом без знака.

Пример 1

mov CL,5 ;CL=05h

movsxAX,CL ;AX=0005h

Пример 2

mov CL,-5 ;CL=FBh

movsxAX,CL ;AX=00FBh

Пример 3

mov BL,80h ;BL=80h

movsxECX,BL ;ECX=00000080h

Пример 4

;B полях данных

mem dw 0FFFFh ;mem=FFFFh

;B программном сегменте

movsxEBX,mem ;EBX=0000FFFFh


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