Лекція 4 1

Один операнд. Звернемося до команди, яка визначає єдність-ний операнд, наприклад до команди INC. Зазвичай вона застосовується для інкремента вказівного або індексного регістра при обчисленні зсувів, а також

- 16-бітного Рона в арифметичних операціях. З такими операндами команда приймає дуже просту однобайтном форму, показану на рис. 2.8. Вона має 3-бітове поле reg, що визначає один з восьми 16-бітних регістрів. Кодування регістрів в поле reg показано в перших двох стовпчиках табл. 2.1.

Таблиця 2.1 Кодування регістрів

У найбільш загальній формі команда INC може призвести інкремент вмісту будь-якого Рона, вказівного або індексного регістра (8 або 16 біт) і будь-якого байта або слова пам'яті. Ця форма довжиною в два байта показана на рис. 2.10. Тепер поле КОП розщеплено на дві частини: сім біт його знаходяться в першому байті, а три - в другому. Код операції команди INC в такій формі дорівнює 1111111 000. однобітний поле w визначає довжину операнда: якщо w = 0, операнда має 8 біт, а при w = 1 - 16 біт. Поле mod показує, чи знаходиться операнд в регістрі або пам'яті. Якщо mod = 11, операнд міститься в регістрі, а три інші комбінації поля mod відносяться до пам'яті. Коли операнд - в регістрі, поле r / т показує конкретний регістр; а якщо операнд - в пам'яті, це ж поле визначає, де саме він знаходиться (скорочення r / т позначає регістр / пам'ять).

Таблиця 2.3 Базовий і індексний регістри, які визначаються полем r / т для операндів в пам'яті (mod ¹ 11)

Як приклад розглянемо команду, показану на рис. 2.12. Поле коду операції містить 1111111 000 і визначає команду INC. Поле w = 1 показує довжину операнда 16 біт. Поле mod = 01 і операнд, отже, знаходиться в пам'яті; крім того, зміщення в команді з наступного байта необхідно розширити зі знаком до 16 біт 0000 0000 0101 1100.

Поле r / т = 100, тому зі зміщенням в команді слід підсумувати вміст регістра SI (нехай воно дорівнює 1010 0000 1000 0110);

+ 1010 0000 1000 0110 (вміст SI)

0000 0000 0101 1100 (зміщення в команді)

1010 0000 1110 0010 (результат)

+ 1111 0000 1111 0000 (сегмент)

1010 0000 1110 0010 (зміщення в сегменті)


Операнд не обов'язково повинен знаходитися тільки в поточних сегментах даних і стека. Його можна зчитувати з будь-якого сегмента, ввівши перед командою однобайтном префікс, що позначає сегментний регістр (рис. 2.13). На рис. 2.14 показана та ж команда, що і на рис. 2.12, але тепер операнд знаходиться в поточному додатковому сегменті.

Два операнда. Розібравшись з однооперанднимі командами, звернемося до команд, що мають два операнда, наприклад ADD. Ми вже говорили, що ця команда бере значення одного операнда, додає його до значення другого операнда і запам'ятовує результат на місці будь-якого операнда. Якщо дозволити перебування обох операндів в пам'яті, в команді потрібні були б поля mod і r / т для кожного з них. Щоб скоротити довжину команд, було вирішено, що, по крайней мере, один з операндів має бути в регістрі. Тоді в команді будуть потрібні поля mod і r / т тільки для одного операнда, а для іншого досить поля reg (рис. 2.16).

Поле w показує, є операнди байтами (w = 0) або словами (w = 1). В команді з'явилося також нове поле d (приймач); якщо d = 0, результат запам'ятовується в операнде, який визначається полями mod і r / т, a якщо d - 1 - в операнде, який визначається полем reg. Операнд, в якому запам'ятовується результат, називається приймачем, а інший операнд називається джерелом.

Як приклад розглянемо команду ADD, показану на рис. 2.17. Вона має код операції 000000. Поле w = 0 показує, що обидва операнда є байтами. Визначеним полем reg операндом виявляється регістр СН. Поле mod = 11 означає, що поля mod і r / т визначають регістр, а поле r / т конкретизує регістр BL. Поле d = 1 показує запис результату в операнд, який визначається полем reg, тобто в регістр СН. Отже, команда додає вміст регістра BL (джерела) до вмісту регістра СН (приймача) і поміщає результат в СН.


Прикладом команди з безпосереднім операндом служить команда MOV (переслати). Вона часто застосовується для завантаження константи в регістр. Тут безпосередній операнд можна визначити полем reg, і команда набуває просту форму, показану на рис. 2.18. Поле w як і раніше задає довжину операнда 8 (w = 0) або 16 (w = 1) біт; в першому випадку безпосередній операнд займає один байт в команді, а в другому - два байта. Як приклад, на рис. 2.19 представлена ​​команда, яка передає значення 1111 0000 0000 1111 в регістр DI.


У кілька більш складною команді операнд-приймач визначається полями mod і r / т замість поля reg, тому в команді з'являється додатковий байт (рис. 2.20). Показана на рис. 2.21 команда передає значення 1111 0000 0000 1111 в слово, що знаходиться в сегменті даних зі зміщенням з регістра DI.

Так як двох операндная команда має тільки одне поле w, обидва операнди повинні мати довжину 8 або 16 біт. Однак часто безпосередні операнди є невеликими числами і не вимагають 16 біт. Це твердження особливо справедливо для команд додавання, віднімання і порівняння, хоча для операндів логічних команд воно зазвичай не витримується. Отже, можна зменшити розмір команд з безпосередніми операндами, якщо не відводити 16 біт для зберігання невеликих чисел. Тому в деяких командах (додавання, віднімання і порівняння) введений біт s (s означає "з розширенням знака"). Він займає місце біта d, так як в командах з безпосередніми операндами можливо тільки один напрямок. Поле s має сенс тільки для 16-бітових операндів (w = 1) і показує, чи містяться в команді все 16 біт безпосереднього операнда (s = 0) або тільки 8 біт (s = 1), які повинні розширюватися зі знаком до 16 біт для освіти 16-бітного операнда. Така форма команди ілюструється рис. 2.22. Відповідний приклад показаний на рис. 2.23. Тут до вмісту слова в пам'яті додається значення 0000 0000 0000 1111 і результат поміщається в цей же слово. Слово знаходиться в сегменті даних, а зміщення його береться з регістра DI. Відзначимо, що завдяки біту s економиться один байт.

Схожі статті