- •2. Структура регістра eflags
- •3. Організація оперативної пам’яті. Сегментована модель оперативної пам’яті. Формування адреси в реальному режимі
- •4. Формати і типи даних. Формат машинних команд. Система переривань
- •5. Десяткова арифметика. Форми зображення десяткових чисел
- •7. Ділення ascii-чисел.
- •6. Директиви сегментації. Директиви proc і endp
- •7. Опис простих типів мовою асемблера
- •10. Синтаксис команд мовою асемблера
- •11. Команди передач даних
- •Xchg ax, data1; (data2) в data1, (ax) – початковий стан
- •12. Стекові передачі даних
- •13. Передачі адресних об’єктів, команди введення-виведення і передачі прапорців
- •14. Команди передачі даних movXx. Команда setCc. Команда xlat
- •15. Команди додавання, віднімання і порівняння
- •Inc reg/mem; Розмір 8/16/32.
- •16. Команди множення і ділення
- •20. Команди логічних операцій. Команди зсувів
- •22. Команди операцій з двійковими ланцюжками
- •23. Команди передачі керування (безумовні переходи)
- •24. Команди умовних переходів і команди керування циклами
- •26. Команди переривань і повернення з переривань
- •Загальні поняття.
- •Використання префіксів в ланцюжкових командах.
- •Команда movs.
- •Команда cmps.
- •Команда scas.
- •Команда lods.
- •Команда stos.
- •Команди введення/виведення ланцюжків.
- •29. Команди керування процесором
- •Команди, які впливають на прапорці.
- •Команди синхронізації.
- •Системні команди
- •31. Формати даних, які підтримуються fpu
- •Параметри для трьох форматів в таблиці
- •32. Програмна модель fpu
- •33. Слово стану sw і слово керування cw пристрою fpu.
- •Відповідність між кодом умови і прапорцями
- •34. Команди передач даних fpu: завантаження, збереження, збереження з вибором зі стека, обміну, завантаження сталих.
- •35. Арифметичні команди fpu: додавання, віднімання, множення, ділення.
- •36. Додаткові арифметичні команди fpu.
- •37. Команди порівняння fpu
- •38. Команди трансцендентних функцій. Алгоритми обчислення значень функцій і та логарифмів за будь-якою основою.
- •39. Команди керування пристроєм fpu
- •40. Спеціальні числові значення та особливі обчислювальні ситуації
22. Команди операцій з двійковими ланцюжками
В мікропроцесорі i486 введено дві підгрупи ефективних команд для роботи з двійковими ланцюжками (bit string). Ці типи даних широко використовуються в комп’ютерній графіці, для табличного подання секторів дискового простору і т.п.
Команда перевірки біта bt (bit test) вибирає певний біт у двійковому ланцюжку і передає його в прапорець перенесення cf. Подібні до неї команди перевірки та інвертування біта btc (bit test and complement), перевірки й установлення біта в 1 bts (bit test and set), перевірки й установлення біта в нуль btr (bit test and reset). Тому надалі говоритимемо про узагальнену команду
btX dst, index,
де , dst – задає двійковий ланцюжок в оперативній пам’яті або загальному регістрі, index – вибирає конкретний біт у ланцюжку. Припустимі форми
btX reg/mem16, reg16, btX reg/mem16, imm8,
btX reg/mem32, reg32, btX reg/mem32, imm8.
Отже, dst визначає слово або подвійне слово в регістрі або в комірці оперативної пам’яті, а значення index знаходиться в регістрі або задається як безпосередній операнд. Діапазон для imm8 від 0 до 15 або 31 (тобто безпосереднє значення тільки восьми бітове і береться за модулем 16 або 32 в залежності від вибраного типу сегмента use16 або use32).
Якщо ланцюжок знаходиться в регістрі, то виконання команди зводиться до вибору відповідного біта з регістра, запису його значення в прапорець cf і, якщо це команда:
bt – завершити її виконання;
btc – знайдений біт інвертувати та завершити її виконання;
bts – знайдений біт установити в 1 та завершити її виконання;
btr – знайдений біт установити в 0 та завершити її виконання.
Якщо ланцюжок знаходиться в оперативній пам’яті, то нумерація бітів здійснюється відносно біта з номером 0 (нуль) – наймолодший біт байта з ефективною адресою EA (визначається операндом mem16 або mem32) команди btX. Старші біти мають додатні номери, а молодші – від’ємні. Номер шуканого біта (значення index в регістрі reg16 або reg32) вважається знаковим цілим числом, яке змінюється від до (use16) або від до (use32). При доступі до оперативної пам’яті процесор визначає адресу слова (use16) або подвійного слова (use32), в якому знаходиться шуканий біт з номером index. Тобто, звертається до двох байтів (use16) за адресою
EA+(2*(BitOffset DIV 16),
або до чотирьох байтів (use32) відповідно за адресою
EA+(4*(BitOffset DIV 32),
де EA (ефективна адреса ланцюжка) – визначається операндом dst (mem16 або mem32); BitOffset – значення операнда index (тобто вміст регістра reg16 або reg32); DIV – операція ділення (a DIV b – ціла частина від ділення a на b із заокругленням до . Далі, визначається номер біта у знайденому слові або подвійному слові, якщо , то відповідно так:
Якщо ж , то відповідно так:
Тут – означає операцію знаходження остачі від ділення першого операнда за модулем другого.
Після виконання команди btX значення всіх прапорців, крім cf, не визначені.
Зауваження. Команди bts і btr можуть застосовуватися для перевірки і модифікації семафорів в оперативній пам’яті, які показують стани розділюваних ресурсів у мультипроцесорній системі. Тоді перед ними потрібно записувати префікс lock для того, щоб процесор сформував апаратний сигнал блокування шини.
Команди сканування бітів. Сканування бітів вперед bsf (Bit Scan Forward) bsr (Bit Scan Reverse) використовуються для пошуку в слові або подвійному слові позиції першого біта установленого в 1. Загальне зображення bsX dst, src. Тут dst 16- або 32-бітовий регістр, а src – регістр або комірка оперативної пам’яті. Форми команд такі:
bsX reg16, reg/mem16; dsX reg/mem32
Якщо виконується команда bsf, то операнд src проглядається з молодших бітів до старших, а в команді bsr – зі старших розрядів до молодших. Номер розряду (index) першого зустрінутого біта в стані 1, розміщується в dst і zf=0.
Якщо операнд src нульовий, то прапорець zf установлюється в 1 і команда закінчується та вміст регістра dst не визначений.
Команди bsf і bsr впливають тільки на стан прапорця zf.