Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Повторення рядкової інструкції




Інструкція MOVS

Інструкція STOS

Інструкція STOS – це доповнення інструкції LODS. Вона записує значення розміром у байт чи слово з акумулятора у чарунку пам’яті, на яку вказує пара регістрів ES:DI, а потім зменшує чи збільшує DI. Інструкція STOSB записує байт, який міститься у регістрі AL, у чарунку пам’яті по адресі ES:DI, а потім збільшує чи зменшує регістр DI, в залежності від флагу напрямку. Наприклад, інструкції:

 

std

mov di,0ffffh

mov al,55h

stosb

 

записують значення 55h у байт зі зміщенням 0FFFFh у сегменті, на який вказує регістр ES, а потім зменшує DI до значення 0FFFEh.

Інструкція STOSW працює аналогічно, записуючи значення розміром у слово, яке міститься у регістрі AX, по адресі ES:DI, а потім збільшує чи зменшує значення регістра DI на 2. Наприклад, інструкції:

 

cld

mov di,0ffeh

mov al,102h

stosw

 

записують значення 102h розміром у слово, записане у регістрі AX, по зміщенню 0FFEh у сегменті, на який вказує регістр ES, а потім значення регістра збільшується до 1000h.

Інструкції LODS та STOS можна чудово використовувати разом для копіювання буферів. Однак для переміщення байта чи слова з одного місця на інше є ще кращий спосіб. Це інструкція MOVS.

Інструкція MOVS аналогічна інструкціям LODS та STOS, якщо їх поєднати у одну інструкцію. Ця інструкція зчитує байт чи слово, записане по адресі DS:SI, а потім записує це значення по адресі, яка визначається парою регістрів ES:DI. Слово чи байт не передається при цьому через регістри, тому зміст регістра AX не змінюється. Інструкція MOVSB має мінімально можливу для інструкції довжину. Вона займає тільки один байт, а працює ще швидше, ніж комбінація інструкцій LODS та STOS.

 

mov cx,ARRAY_LENGTH_IN_WORDS

mov si,OFFSET SourceArray

mov ax,SEG SourceArray

mov ds,ax

mov di,OFFSET DestArray

mov ax,SEG DestArray

mov es,ax

cld

CopyLoop:

movsw

loop CopyLoop

Хоча у останньому прикладі код виглядає досить ефективним, непогано було б позбавитися від інструкції LOOP та переміщувати весь масив за допомогою однієї інструкції. Інструкції процесора 8086 являють таку можливість. Це форма рядкових інструкцій з префіксом REP.

Префікс повторення REP – це не інструкція, а префікс інструкції. Префікс інструкції змінює роботу подальшої інструкції. Префікс REP робить наступне: він вказує, що наступну інструкцію треба повторювати доки зміст регістра СХ не буде дорівнювати 0. (якщо регістр СХ дорівнює 0 у початку виконання інструкції, то інструкція виконується 0 разів, іншими словами, ніяких дій не здійснюється.

Використовуючи префікс REP, можна замінити у останньому прикладі інструкції:

 

CopyLoop:

mosw

loop CopyLoop

 

на інструкцію:

 

rep movsb

 

Ця інструкція буде переміщувати блок з 65535 слів (0FFFh) з пам’яті, яка починається з адреси DS:SI у пам’ять, яка починається з адреси, яка визначається регістрами ES:DI.

Звичайно, для виконання інструкції 65535 разів потрібно значно більше часу, ніж для виконання інструкції оди раз, тому що для звертання до усій цієї пам’яті потребується час. Однак кожне повторення (з допомогою префікса) рядкової інструкції виконується скоріше, ніж виконання однієї рядкової інструкції. Це дозволяє отримати дуже швидкий спосіб читання з пам’яті, запису у пам’ять та копіювання.

Префікс REP можна використовувати не тільки з інструкцією MOVS, але також з інструкціями LODS та STOS (та інструкціями SCAS та CMPS – це ми розглянемо пізніше). Інструкцію STOS можна з успіхом повторювати для очистки чи заповнення блоків пам’яті, наприклад:

 

cld

mov ax,SEG WordArray

mov es,ax

mov di,OFFSET WordArray

sub ax,ax

mov cx,WORD_ARRAY_LENGTH

rep stosw

 

тут масив WordArray заповнюється нулями.

 

Префікс REP викликає повторення тільки рядкової інструкції. інструкція типу:

 

rep mov ax,[bx]

 

не має сенсу. У цьому випадку префікс REP ігнорується та виконується інструкція:

 

mov ax,[bx]




Поделиться с друзьями:


Дата добавления: 2015-04-25; Просмотров: 418; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.