Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






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





Хоча у останньому прикладі код виглядає досить ефективним, непогано було б позбавитися від інструкції 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]

Інструкція SCAS

Інструкція SCAS використовується для перегляду пам’яті та пошуку збігів чи незбігів з конкретним значенням розміром у байт чи слово. Як і всі рядкові інструкції, інструкції SCAS має дві форми – SCASB та SCASW.

Інструкція SCASB порівнює зміст регістру AL з байтовим значенням по адресу ES:DI, встановлюючи при цьому флаги, які відображують результат порівняння (як при виконанні інструкції CMP). Як і при виконанні інструкції STOSB, при виконанні інструкції SCASB збільшується чи зменшується значення регістру DI.

Рядкові інструкції ніколи не встановлюють флаги таким чином, щоб вони відображали зміни значень регістрів SI, DI і/чи СХ. Інструкції STOS та MOVS взагалі не змінюють ніяких флагів, а інструкції SCAS та CMPS змінюють флаги тільки у відповідності з результатом виконаного їм порівняння.

Префікс REPE (який також має назву префікс REPZ) також вказує процесору 8086, що інструкцію SCAS (чи CMPS) треба повторювати доколи регістр СХ не буде дорівнювати нулю, чи допоки не станеться незбіг. Префікс REPE можна розглядати, як префікс, який означає “повторювати, допоки дорівнює”. Аналогічно, префікс REPNE (REPNZ) вказує процесору 8086, що інструкцію SCAS (CMPS) треба повторювати, допоки СХ не буде дорівнювати 0 чи допоки не станеться збіг. Префікс REPNE можна розглядати, як префікс “повторювати допоки не дорівнює”.

Як і всі рядкові інструкції, інструкція SCAS збільшує регістр-показчик DI, якщо флаг напрямку дорівнює 0 (очищений за допомогою інструкції STD).

Інструкція SCASW – це форма інструкції SCASB для роботи зі словом. Вона зрівнює зміст регістру АХ зі змістом пам’яті по адресі ES:DI та збільшує чи зменшує значення регістру DI у кінці кожного виконання на 2, а ні на 1.

Інструкція CMPS

Інструкція CMPS дозволяє виконувати зрівняння двох байт чи слів. При одному виконанні інструкції CMPS зрівнюються дві чарунки пам’яті, а потім збільшуються регістри SI та DI. Інструкцію CMPS можна розглядати, як аналог інструкції MOVS, який замість копіювання однієї чарунки пам’яті у іншу зрівнює дві чарунки пам’яті.

Інструкція CMPSB порівнює байт по адресі DS:SI з байтом по адресі ES:DI, встановлюючи відповідним чином флаги та збільшуючи чи зменшуючи регістри SI та DI (у відповідності від флагу напрямку). Регістр АХ при цьому не змінюється.

Як і всі рядкові інструкції, інструкція CMPS має дві форми (для роботи з байтами та для роботи зі словами), може збільшувати чи зменшувати регістри SI та DI та буде повторюватися при наявності префікса REP.

Date: 2016-05-14; view: 293; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию