M
Пример 3:
;В полях данных сегмента данных, адресуемого через DS: data1 dw 10000 dup('); Массив произвольных данных data2 dw 5000 dup('); Массив-приемник ;В программном сегменте push DS; Настроим pop ES; ES на тот же сегмент данных mov SI,offset datal; SI › data1 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 str1 db '01234567890ABCDEF'; Строка-источник str2 db 16 dup(?); Строка-приемник ;B программном сегменте push DS pop ES; Теперь ES=DS mov SI,offset str1; DS:SI ®str1 mov DI,offset str2; ES:DI › str2 сld; Движение по строке вперед mov CX,4; Коэффициент повторения rep movsd; Копирование по 4*4 байт
386+ MOVSX Пересылка с расширением знака
Команда пересылает байт в слово или двойное слово, а также слово в двойное слово с расширением знака. В качестве первого операнда (приемника) может использоваться 16- или 32-разрядный регистр общего назначения, в качестве второго – 8- или 16-разрядный регистр общего назначения или ячейка памяти такого же размера. Недопустима пересылка из памяти в память, в или из сегментного регистра, а также непосредственного значения. Фактически команда movsx увеличивает размер как положительного, так и отрицательного числа, ни изменяя ни его значения, ни знака.