Команди логічних операцій. Команди зсувів 


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



ЗНАЕТЕ ЛИ ВЫ?

Команди логічних операцій. Команди зсувів



Логічні операції зображуються операторами 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  
               

sal/shl   cf  

 

sar cf  

 
 


shr cf  

Рис. 21.1 Дії команд зсувів.

Команди арифметичних зсувів реалізують множення (зсув вліво) і ділення (зсув вправо) чисел на , де – кількість розрядів зсуву. Однак, команда sar не дає такого ж результату, як команда ділення idiv в тому випадку, коли ділене від’ємне, а при зсуві висуваються одиничні біти. Наприклад, зсув на два біти вправо дає результат , а при діленні на 4 одержимо частку . (Увага! Переконайтеся, що це так! Розробіть просту програму мовою асемблера.) Відмінність у тому, що idiv заокруглює всі частки до нуля, а команда sar від’ємні числа до .

Команди подвійних зсувів. У процесорі i486 введено дві нові команди: подвійного зсуву вправо – shrd і подвійного зсуву вліво – shld. Узагальнене зображення цих команд

ShXd dst, src, count

, операнд dst – вміст загального регістра або комірки оперативної пам’яті, операнд src – тільки вміст загального регістра, лічильник зсувів count – вміст регістра cl або imm8.

Форми



Поделиться:


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

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