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

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 увеличивает размер как положительного, так и отрицательного числа, ни изменяя ни его значения, ни знака.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.