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



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


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




Содержание  Назад  Вперед