|
|||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
MOVS Пересилка даних з рядка в рядок MOVSB Пересилка байта даних з рядка в рядок MOVSW Пересилка слова даних з рядка в рядок
Після кожної операції пересилки регістри SI і DI отримують позитивний (якщо прапор Df=0) або негативний (якщо прапор Df=1) приріст. Величина приросту складає 1 або 2 залежно від розміру елементів, що пересилаються. Варіант команди movs має формат:
В цьому випадку байти або слова з рядка строка_2 пересилаються на місце рядка строка_]. Розмір елементів, що пересилаються, визначається описом рядків (за допомогою директив db або dw). Це не позбавляє від необхідності ініціалізувати регістри Es:di і Ds:si адресами рядків рядок _1 і строка_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 Пересилка подвійного слова з рядка в рядок
Приклад 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 Пересилка з розширенням знаку
Приклад 1 mov CL-5 ;CL=FBh movsxax,cl ;AX=FFFBh Приклад 2
Приклад 3
Приклад 4
386+ 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
|
|
|||||||||||||||||||||||||||||||||||||||||||||
|