КАТЕГОРИИ: Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |