Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
асм.docx
Скачиваний:
16
Добавлен:
27.10.2018
Размер:
644.06 Кб
Скачать

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 Дії команд подвійного зсуву

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]