![](/user_photo/2706_HbeT2.jpg)
- •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. Спеціальні числові значення та особливі обчислювальні ситуації
20. Команди логічних операцій. Команди зсувів
Логічні операції зображуються операторами and (кон’юнкція), or (диз’юнкція), xor (виняткове або (додавання за модулем два)), not (логічне заперечення), test, яка виконує операцію кон’юнкції і не змінює значення операндів. Усі логічні операції є порозрядними. Їх виконання можна узагальнено зобразити так:
OP dst, src; dst = (dst) OP (src) і формуються прапорці,
test dst, src; (dst) test (src) і формуються прапорці,
not dst; dst= not (dst).
де
.
У кожній з команд припустимий будь-який розмір операндів і режим адресації
OP reg/mem, imm; 8| 16| 32
OP reg/mem, reg; 8| 16| 32
OP reg, reg/mem; 8| 16| 32
test reg/mem, imm; 8| 16| 32
test reg/mem, reg; 8| 16| 32
test reg, reg/mem ; 8| 16| 32
Бінарні команди and, or, xor, test так впливають на арифметичні прапорці:
-
прапорці of і cf завжди встановлюються в нуль, оскільки між розрядні зв’язки відсутні;
-
стан прапорців sf, zf і pf визначається за результатом команди;
-
стан прапорця af не визначений.
Унарна операція not на стан прапорців не впливає.
Застосування логічних команд.
Команда end застосовується для установки в нуль бітів операнда , які відповідають бітам другого операнда – маски, де вони дорівнюють нулеві.
Команда or використовується для установки певних бітів в 1 за допомогою маски. Наприклад, установка в 1 парних бітів регістра al: or al,55h
Команда xor використовується для інвертування певних бітів за маскою (маска в цих бітах дорівнює 1), порівняти операнди на абсолютну рівність, забезпечити нульове значення певного регістра: xor al, 0aah; інвертує непарні біти регістра al, xor si, si; забезпечує нульовий стан регістра si.
Команда test часто використовується для перевірки стану одного біта. Використовується маска, в якій відповідний біт дорівнює 1. Прапорець zf показує стан потрібного біта (якщо біт у стані 1, то zf=0).
Команди зсувів. Однаково діють на всі біти операнда, передаючи вміст i-го біта в (i-1)-й при зсуві вправо (right) або в (i+1)-й при зсуві вліво (left). Відмінності тільки щодо крайніх бітів, один з яких вивільняється, а інший висувається за межі розрядної (бітової) сітки. Останній висунений біт за межі розрядної сітки завжди знаходиться в прапорці перенесення cf.
Розрізняють:
-
логічні зсуви (shift): висунений біт втрачається, в звільнений біт записується 0;
-
циклічні зсуви (rotation): висунений біт записується на місце звільненого;
-
арифметичні зсуви (arithmetic shift): в операції арифметичного зсуву вправо знаковий біт не змінюється (копіюється в старших бітах), зберігаючи знак числа, а висунений біт втрачається; арифметичний зсув вліво аналогічний логічному зсуву вліво;
-
циклічні зсуви через перенесення (rotate through carry): в ланцюг зсуву приєднується прапорець перенесення cf.
Усі команди зсуву мають однакове узагальнене зображення
op dst, count; зсув (dst) на count бітів,
де op – означає код відповідної операції зсуву: (rcl – циклічний зсув вліво через перенесення; rcr – циклічний зсув вправо через перенесення; rol – циклічний зсув вліво; ror – циклічний зсув вправо; sal/shl – арифметичний/логічний зсув вліво; sar – арифметичний зсув вправо; shr – логічний зсув вправо), count – можна вказати як безпосереднє значення imm8 (статичний зсув) або як регістр cl (динамічний зсув). Вміст регістра cl вважається цілою без знаковою сталою. Якщо count є imm=1, то довжина всіх команд зменшується на один байт.
Команди допускають різні розміри операндів і всі можливі режими адресації:
op reg/mem, count; розмір 8| 16 | 32 бітів.
Прапорці модифікуються так:
-
стан прапорця af завжди не визначений;
-
прапорець cf дорівнює значенню останнього висуненого біта;
-
в одно бітових зсувах of=1, якщо операція змінила значення знакового біта операнда; при зсувах на декілька бітів значення of не визначено;
-
у звичайних зсувах прапорці sf, zf, pf модифікуються у відповідності до одержаного результату.
Наведемо схеми виконання команд зсуву. 31|15|7 1 0
rcl |
|
cf |
|
|
|
|
rcr |
|
cf |
|
|
|
|
rol |
|
cf |
|
|
|
|
|
ror |
|
cf |
|
|
|
|
0
sal/shl |
|
cf |
|
|
|
|
sar |
|
cf |
|
|
|
|
|
shr |
|
cf |
|
|
|
|
0
Рис. 21.1 Дії команд зсувів.
Команди арифметичних
зсувів реалізують множення (зсув вліво)
і ділення (зсув вправо) чисел на
,
де
– кількість розрядів зсуву. Однак,
команда sar
не дає такого ж результату, як команда
ділення idiv
в тому випадку, коли ділене від’ємне,
а при зсуві висуваються одиничні біти.
Наприклад, зсув
на два біти вправо дає результат
,
а при діленні
на 4 одержимо частку
.
(Увага!
Переконайтеся, що це так! Розробіть
просту програму мовою асемблера.)
Відмінність у тому, що idiv
заокруглює всі частки до нуля, а команда
sar
від’ємні числа до
.
Команди подвійних зсувів. У процесорі i486 введено дві нові команди: подвійного зсуву вправо – shrd і подвійного зсуву вліво – shld. Узагальнене зображення цих команд
shXd dst, src, count
,
операнд dst
– вміст загального регістра або комірки
оперативної пам’яті, операнд src
– тільки вміст загального регістра,
лічильник зсувів count
– вміст регістра cl
або imm8.
Форми
shXd reg/mem16, reg16, count
shXd reg/mem32, reg32, count
В процесорі операнди dst і src об’єднуються в проміжному регістрі подвійної довжини, вміст якого зсувається логічно вліво або вправо на count бітів. Після зсуву в dst розміщуються відповідні біти проміжного регістра (рис. 21.2). Можна вважати, що в цих командах зсувається операнд dst і в його звільнені біти записуються біти вмісту операнда src. Прапорці sf, zf, pf установлюються за результатом операції подвійного зсуву, прапорець cf дорівнює значенню останнього біта, висунутого за межі розрядної сітки, а прапорці of і af – не визначені.
shld |
|
dst |
|
src |
cf |
|
|
|
0 |
dst |
shrd |
|
src |
|
dst |
0 |
|
|
|
cf |
dst |
Рис. 21.2 Дії команд подвійного зсуву