→ Пошук по сайту       Увійти / Зареєструватися

Команди асемблера для Intel: MOVS, MOVSB, MOVSW, 386+ MOVSD, 386+ MOVSX, 386+ MOVZX

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

загрузка...
Сторінки, близькі за змістом