Використання префіксів в ланцюжкових командах. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Використання префіксів в ланцюжкових командах.



Нехай ланцюжковій команді передує префікс повторення. Тоді після кожного її виконання здійснюється декремент регістра лічильника cx/ecx (без впливу на прапорці). Тому лічильник cx/ecx перед використанням ланцюжковою командою потрібно відповідно ініціювати на потрібну кількість повторення цієї команди.

Префікси повторення позначаються rep, repe/repz, repne/repnz. Їх можна використовувати з певними ланцюжковими командами. Окремий префікс діє тільки на одну команду. Наведемо алгоритм дії префікса повторення:

2.1. Якщо атрибут розміру адреси AddresSize=16, то як лічильник використати регістр cx, інакше (атрибут адреси AddresSize=32) як лічильник використати регістр ecx.

2.2. Перевірити регістр-лічильник. Якщо він дорівнює 0, то вийти з ітерації і перейти до наступної команди.

2.3. Здійснити обробку всіх переривань, які очікують.

2.4. Виконати ланцюжкову команду один раз.

2.5. Зменшити регістр-лічильник на 1. Прапорці без зміни.

2.6. Перевірити прапорець zf, якщо ланцюжкова команда scas або cmps. Якщо умова не справджується, то вийти з ітерації і перейти до наступної команди. (Вийти з ітерації, якщо префіксом є repe і zf=0, або якщо префікс repne і zf=1).

2.7. Повернутися до кроку 2.2. для наступної ітерації.

Префікс rep може використовуватися з командами movs і stos, які не впливають на прапорці. Він означає: повторювати, поки не досягнуто кінця ланцюжка, тобто до тих пір, поки (cx/ecx) не досягне 0.

Префікси repe/repz діють однаково і застосовуються з командами cmps і scas, враховуючи прапорець zf, на який впливають ці команди: операція повторюється, якщо (cx/ecx) не дорівнює 0 і zf=1.

Префікси repne/repnz діють аналогічно, але для повторення операції вимагається ненульовий стан (cx/ecx) і zf=0.

Команда movs.

Загальний вигляд команди movs dst,src. Передає байт, слово або подвійне слово з ланцюжка src, який адресується регістрами ds і si/esi, в ланцюжок dst, який адресується регістрами es і di/edi, і змінює значення регістрів-індексів si/esi та di/edi для адресації наступних елементів ланцюжків. Якщо використовується префікс rep – movs передає блок елементів з пам’яті в пам’ять. Можна використовувати явну специфікацію розміру елемента ланцюжків в мнемоніках movsb (byte), movsw (word), movsd (double word), тобто писати команди без операндів.

Команда cmps.

Загальний вигляд команди cmps dst,src. Порівнюються елементи байт, слово або подвійне слово з ланцюжка src, який адресується регістрами ds і si/esi, та відповідно байт, слово або подвійне слово з ланцюжка dst, який адресується регістрами es і di/edi, і змінює значення регістрів-індексів si/esi та di/edi для адресації наступних елементів ланцюжків. Порівняння елементів здійснюється за алгоритмом: (src) – (dst), модифікуються прапорці, змінюється значення регістра di/edi.

Як префікс можна використовувати repe/repz або repne/repnz. Якщо використати один з перших префіксів, то операція інтерпретується так: порівнювати до тих пір, поки або не досягнуто кінець ланцюжка, або елементи виявляться не рівними. При наявності одного з префіксів repne/repnz, операція інтерпретується: порівнювати, або поки не досягнуто кінця ланцюжка, або поки елементи виявляться рівними. Можна використовувати явну специфікацію розміру елемента ланцюжків в мнемоніках cmpsb (byte), cmpsw (word), cmpsd (double word).

Отже команду зручно використовувати для пошуку однакових або різних елементів ланцюжків.

Команда scas.

Загальний вигляд команди scas dst; (acc) – (dst), модифікуються прапорці, змінюється значення регістра di/edi. Операнди не змінюються. Команда забезпечує віднімання елемента ланцюжка (b, w, d) від вмісту акумулятора (al/ax/eax).

З префіксом repe/repz команду можна використати для пошуку елемента ланцюжка зі значенням, відмінним від значення в акумуляторі. Префікс repne/repnz дозволяє знайти в ланцюжку елемент, який збігається зі значенням в акумуляторі.

Явні мнемоніки: scasb, scasw, scasd.

Команда lods.

Загальний вигляд команди lods src; acc=(src), змінюється значення регістра si/esi. Елемент ланцюжка src (b, w, d) завантажується в акумулятор (al/ax/eax) і si/esi просувається на наступний елемент. Стани прапорців не змінюються. Як правило, команда з префіксом повторення не використовується, але її зручно використовувати в програмних циклах замість двох команд:

mov acc,src; inc si/esi (або dec si/esi)

Явні мнемоніки: lodsb, lodsw, lodsd.

Команда stos.

Загальний вигляд команди stos dst; dst=(acc), змінюється значення регістра di/edi. Вміст акумулятора (al/ax/eax) запам’ятовується в елемент ланцюжка dst (b, w, d) і di/edi просувається на наступний елемент. Стани прапорців не змінюються. Зручно використовувати з префіксом повторення для ініціювання елементів ланцюжка сталим значенням, наприклад, для очищення текстового екрану в дисплейний буфер потрібно помістити код пробілу.

Явні мнемоніки: stosb, stows, stosd.



Поделиться:


Последнее изменение этой страницы: 2017-01-27; просмотров: 240; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.230.35.103 (0.06 с.)