|
Команди асемблера для Intel: MOVS, MOVSB, MOVSW, 386+ MOVSD, 386+ MOVSX, 386+ MOVZX
ADO в Delphi AJAX Android C++ CakePHP CMS COM CSS Delphi Flash Flex HTML Internet Java JavaScript MySQL PHP RIA SCORM Silverlight SQL UML XML Бази даних Веб-розробка Генетичні алгоритми ГІС Гітара Дизайн Економіка Інтелектуальні СДН Колір Масаж Математика Медицина Музика Нечітка логіка ООП Патерни Подання знань Розкрутка сайту, SEO САПР Сесії в PHP Системне програмування Системний аналіз Тестологія Тестування ПЗ Фреймворки Штучний інтелект
|
Команди асемблера для 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 Пересилка подвійного слова з рядка в рядок
Приклад 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 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 Зверніть увагу на додаткові посиланняГоловний розділСторінки, близькі за змістомзагрузка...
|
Сторінки, близькі за змістом ![]() Асемблер (англ. assembler) — загальноприйнята назва транслятора з автокоду. Асемблер переводить початкову програму, написану на автокоді, в переміщувану програму на мові машинній. Оскільки асемблер здійснює трансляцію на мову завантажувача, при завантаженні програми необхідна налаштування умовних адрес, тобто адрес, значення яких залежать від розташування даної програми в пам'яті ЦВМ і від її зв'язків з іншими незалежно трансльованими програмами. |
|
Copyright © 2008—2026 Портал Знань.
При використанні матеріалів посилання, для інтернет-ресурсів — гіперпосилання, на Znannya.org обов'язкове.
Зв'язок
|
НТУУ "КПІ" Інженерія програмного забезпечення КПІ Лабораторія СЕТ |
|