Му арх 2012

81
В. А. Лахно АРХІТЕКТУРА КОМПЮТЕРА

Upload: -

Post on 20-Mar-2016

256 views

Category:

Documents


11 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Му арх 2012

В. А. Лахно

АРХІТЕКТУРА КОМП’ЮТЕРА

Page 2: Му арх 2012

2

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ ДЕРЖАВНИЙ ЗАКЛАД

«ЛУГАНСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ ІМЕНІ ТАРАСА ШЕВЧЕНКА»

КАФЕДРА ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ ТА СИСТЕМ

В. А. Лахно

АРХІТЕКТУРА КОМП’ЮТЕРА

ПРОГРАМНА МОДЕЛЬ МІКРОПРОЦЕСОРА

Методичні вказівки до лабораторних занять для студентів спеціальності

6.0050103 “Програмна інженерія”

Луганськ ДЗ «ЛНУ імені Тараса Шевченка»

2010

Page 3: Му арх 2012

3

УДК 004.2.075 ББК 32.973.2-02 Л29 Рецензенти: Петров О. С. – доктор технічних наук, професор, завідувач

кафедри комп’ютерних систем та мереж Східноукраїнського національного університету імені Володимира Даля.

Могильний Г. А. – кандидат технічних наук, завідувач кафедри інформаційних технологій та систем Луганського національного університету імені Тараса Шевченка.

Лахно В. А. Архітектура комп’ютера: метод. вказівки до лабораторних занять для студ. спец. 6.0050103 “Програмна інженерія”; Держ. закл. “Луган. нац. Ун-т імені Тараса Шевченка”.-Луганськ: Вид-во ДЗ «ЛНУ імені Тараса Шевченка», 2010. – 81 с.

Л29

Методичні вказівки містять програмні питання курсу «Архітектура комп’ютера», лабораторні роботи, варіанти завдань та зразки їх виконання. Призначені для студентів усіх форм навчання спеціальності 6.0050103 “Програмна інженерія”.

УДК 004.2.075 ББК 32.973.2-02

Рекомендовано до друку навчально-методичною радою

Луганського національного університету імені Тараса Шевченка

(протокол № від листопада 2010 р.)

© Лахно В. А., 2010 © ДЗ «ЛНУ імені

Тараса Шевченка», 2010

Page 4: Му арх 2012

4

Зміст

Вступ…………………………………………………………………... Теоретичні відомості. Програмна модель мікропроцесора……. Лабораторна робота № 1. Системи числення…………………… Лабораторна робота 2. Перевід чисел з одної позиційної системи числення в іншу…………………………….. Лабораторна робота 3. Форми представлення чисел у ЕОМ….. Лабораторна робота 4. Операції складання та віднімання у Assembler……………………………………………………………. Лабораторна робота 5. Операції множення та ділення у Assembler……………………………………………………………. Лабораторна робота 6. Адресація та команди пересилки даних у Assembler……………………………………………………… Лабораторна робота 7. Робота із стеком………………………….. Лабораторна робота 8. Маніпуляція над бітами………………… Лабораторна робота 9. Операції з рядками……………………… Лабораторна робота 10. Використовування команд математичного сопроцесора………………………………………….

5 7 20 26 32 46 51 55 60 63 68 72

Список літератури……………………………………………………………... Додатки…………………………………………………………………………..

76 77

Page 5: Му арх 2012

5

ВСТУП

Матеріал, пов’язаний з вивченням мови асемблер, складає

значну частину курсу «Архітектура комп’ютера». Це пояснюється тим, що доки існують процесори, буде існувати й мова асемблер. До вивчення мови асемблер має сенс приступати тільки після з'ясування того, яка частина комп'ютера є видимою і доступною для програмування на цій мові. Це так звана програмна модель комп'ютера, частиною якої є програмна модель мікропроцесора. Зважаючи на важливість і обширність матеріалу, пов’язаного з мовою асемблер, його вивчення в сучасній методиці викладання дисципліни «Архітектура комп’ютера», займає провідну позицію.

У даних методичних вказівках, у відповідності до навчального плану, містяться п’ятнадцять лабораторних робіт, які у певній мірі ілюструють використання програмної моделі мікропроцесора, а також, засоби програмного керування елементами архітектури персонального комп’ютера.

Ціль методичних вказівок – з метою сприяння вирішенню завдань підготовки спеціалістів у галузі комп’ютерних технологій, допомогти студентам оволодіти практичними навиками роботи на мові асемблер, а також ознайомити з деякими сучасними підходами програмного керування елементами архітектури комп’ютера.

Спробою досягти цієї цілі й визначається структура даних методичних вказівок. Перед лабораторними роботами надано стислий теоретичний матеріал, знання якого є необхідним для виконання робіт. Частина лабораторних робот виконується у відповідності до індивідуальних варіантів, а частина робот виконується студентом у відповідності до завдання, яке міститься у розділі – хід роботи. Більшість зразків лабораторних робот які наведені у якості прикладів виконання, місять розгорнуті пояснення до одержаних результатів. Лабораторні роботи виконуються за допомогою блоків на асемблері у найбільш поширених середовищах програмування - C++Builder 6 (або C++Builder 2007/2009), Visual Studio C++2005/2008.

Після виконання лабораторної роботи кожен студент повинен

оформити звіт на аркуші формату А4 якій містить наступні пункти: - мета роботи; - варіант завдання;

Page 6: Му арх 2012

6

- листінг програми; - висновок по роботі. При захисті роботи студент відповідає на питання, які наведені

після кожної лабораторної роботи (питання для самоперевірки). Методичні вказівки призначені для виконання лабораторних

робіт студентами всіх форм навчання спеціальності 6.0050103 “Програмна інженерія”.

Наведемо перелік тем лекційних занять, а також розбивку лабораторних робіт за модулями.

Згідно з планованим розподілом навчального часу дисципліну поділено на 4 модулі.

Модуль 1. Багаторівнева комп'ютерна організація. Мови, рівні і віртуальні машини.

Модуль 2. Структура мікропроцесорної системи. Структура і робота мікропроцесора. Організація команд процесора. Архітектура МП. Введення в мову асемблера. Формат оператора в мові асемблер. Директиви. Макроси. Макроси з параметрами. Процес асемблювання. Скріплення і завантаження. Задачі компонувальника. Структура об'єктного модуля. Час ухвалення рішення і динамічний перерозподіл пам'яті. Динамічне скріплення.

Модуль 3. Чипсети системних плат. Форм фактор - загальні відомості. Компонування системних плат. Локальні шини. Переферийні шини. Шини розширень. Інтерфейси SATA, SAS, IrDa, Bluetooth, WUSB, WiFi, WiMax та ін. Фізична структура пам’яті DIP, SIP, SIPP, SIMM, DIMM, RIMM.

Модуль 4. Магнітні диски. Компакт-диски. CD-R. CD-RW. DVD. Шини. Миші. Принтери. Модеми.

Відповідно, лабораторні роботи з першої по третю – перший модуль. Лабораторні роботи з четвертої по десяту – другий модуль.

Page 7: Му арх 2012

7

Теоретичні відомості. Програмна модель мікропроцесора

Сучасні ЕОМ можуть вирішувати найрізноманітніші задачі. Для

цього треба за допомогою програми «навчити» ЕОМ алгоритму рішення тієї або іншої задачі і ввести в неї початкові дані. Програма записується на алгоритмічній мові (наприклад, Паскаль, С++ або Бейсік), яка достатньо близька до природної мови (особливо англійської).

Проте ЕОМ не розуміє не тільки природної мови, але і алгоритмічної. Для розшифровки тексту програми, написаної на Паскалі або С++, в машині повинна знаходитися спеціальна програма – компілятор (транслятор), яка перекладає текст початкової програми з С++ або Паскаля на мову ЕОМ. Таким чином, обчислювальна машина - це технічний пристрій, в якому інформація про початкові дані вирішуваної задачі, правила її рішення (алгоритмі) і результати обчислень повинна задаватися у вигляді зміни яких-небудь фізичних величин:

- намагніченості матеріалу (як, наприклад, для відтворення мелодії за допомогою магнітофона або збереження даних про атестацію студентів по дисциплінах учбового плану на магнітному диску);

- освітленості екрану (дисплей) і ін. По-справжньому розв'язати проблеми, пов'язані з апаратурою (або

навіть, більш того, залежні від апаратури як, наприклад, підвищення швидкодії програми), неможливо без знання асемблера. Програміст або будь-який інший користувач може використовувати будь-які високо рівневі засоби, і, можливо, навіть не підозрювати, що насправді комп'ютер виконує не команди мови, на якій написана його програма, а їх трансформоване уявлення у формі послідовності команд зовсім іншої мови — машинної. Яким би розумним не був програміст, якою б не була мова, на якій він написав свою програму, без знання асемблера йому не обійтися. І не випадково практично всі компілятори мов високого рівня містять засоби зв'язку своїх модулів з модулями на асемблері або підтримують вихід на асемблерний рівень програмування. Звичайно, час комп'ютерних універсалів вже пройшов. Як мовиться не можна обійняти неосяжне. Але є щось загальне, свого роду фундамент, на якому будується будь-яка комп'ютерна освіта. Це знання про принципи роботи комп'ютера, його архітектуру і мову асемблера як віддзеркалення і втілення цих знань.

Це так звана програмна модель комп'ютера, частиною якої є програмна модель мікропроцесора, яка містить 32 регістри в тій чи іншій

Page 8: Му арх 2012

8

мірі, доступних для використовування програмістом. Дані регістри можна розділити на дві великі групи:

Будь-якій програмі на асемблері для її виконання виділяється певний набір ресурсів комп'ютера. Здебільшого це ресурси, що надаються процесором. Вони необхідні програмі для обробки і зберігання в пам'яті команд і даних, а також отримання інформації про власний поточний стан і стан процесора.

Програмну модель процесора в архітектурі IA-32 (Intel Architecture) процесорів Intel складає наступний набір ресурсів (рис. 1):

• простір пам'яті, що адресується, до 232 байт (4 Гбайт), для Pentium II і вище – 236 байт (64 Гбайт);

• сегментні регістри; • регістри стану і управління; • регістри пристрою обчислень з плаваючою комою

(співпроцесора); • набір регістрів цілочисельного ММХ – розширення,

відображених на регістри співпроцесора (вперше з'явилися в архітектурі процесора Pentium ММХ);

• набір регістра ММХ – розширення з плаваючою крапкою (вперше з'явилися в архітектурі процесора Pentium III);

• програмний стек – спеціальна інформаційна структура, для роботи з якою передбачені спеціальні машинні команди.

Крім того, до ресурсів, які підтримуються архітектурою IA-32, необхідно віднести порти введення-виведення, лічильники моніторингу продуктивності.

Програмні моделі більш ранніх процесорів (і486, перші Pentium до Pentium ММХ включно) відрізняються меншим розміром простору оперативної пам'яті (максимально 232 адресів, оскільки розрядність їх шини адреси складає 32 біти), що адресується, і відсутністю деяких груп регістрів. Тому на рис. 1 для кожної групи регістрів в дужках показано, починаючи з якою моделлю вона з'явилася в програмній моделі процесорів Intel. Якщо такого позначення немає, то це означає, що дана група регістрів була присутня у процесорах і386 і і486. Якщо взяти ще більш ранні процесори і8086/88, то насправді вони теж повністю відрекомендовані на схемі, але складають лише невелику її частину. В програмну модель цих процесорів входять 8- і 16- розрядні регістри загального призначення, сегментні регістри, регістри FLAGS, IP і адресний простір пам'яті розміром до 1 Мбайт.

Page 9: Му арх 2012

9

Рис. 1. Програмна модель процесора ІА-32

AX

AH AL

DX

DH DL

CX

CH CL

BX

BH BL

EAX

EDX

ECX

EBX

BP

SI

DI

SP

EBP ESI

EDI ESP

Адресний

простір пам’яті Стек

236 -1 (232 -1)

Pentium II/III/IV

I486, Pentium

Сегментні регістри

C3

D3

S3

E3

F3

G3

31 15 7 0

31 15 0

15 0

ST(0)

ST(1)

ST(2)

ST(3)

ST(4)

ST(5)

ST(6)

ST(7)

MMX1

MMX2

MMX3

MMX4

MMX5

MMX6

MMX7

MMX0

79 0

63 0

Регістри цілочисельного ММХ-розширення

Регістри пристроїв із плаваючою комою (сопроцесора)

FLAGS EFLAGS

31 15 0

Регістр прапорців

ІР

Регістр показник команд

EІР

Регістри ХММ- розширенняХММ

0..ХХМ

7

Page 10: Му арх 2012

10

Набір регістрів Регістрами називаються елементи високошвидкісної пам'яті,

розташовані в середині процесора в безпосередній близькості від його виконавчого ядра. Доступ до них здійснюється незрівнянно швидше, ніж до елементів оперативної пам'яті. Більшість регістрів має певне функціональне призначення. З погляду програміста, їх можна розділити на дві великі групи.

Першу групу утворюють призначені для користувача регістри, до яких відносяться:

- регістри загального призначення ЕАХ/АХ/АН/AL, EBX/BX/BH/BL, EDX/DX/DH/DL, ЕСX/CX/CH/CL, EBP/BP, ESI/SI, EDI/DI, ESP/SP призначені для зберігання даних і адрес, програміст може їх використовувати (з певними обмеженнями) для реалізації своїх алгоритмів;

- сегментні регістри CS, DS, SS, ES, FS, GS слугують для зберігання значень, інтерпретація яких залежить від режиму роботи процесора. В реальному режимі сегментні регістри містять адресу параграфа початку сегменту в пам'яті. В захищеному режимі сегментні регістри містять індекс входу в одну з системних таблиць дескрипторів – GDT або LDT;

- регістри співпроцесора ST(0), ST(1), ST(2), ST(3), ST(4), ST(5), ST(6), ST(7), призначені для написання програм, що оперують даними з плаваючою комою;

- цілочисельні регістри цілочисельного ММХ – розширення ММХ0, ММХ1, ММХ2, ММХ3, ММХ4, ММХ5, ММХ6, ММХ7;

- регістри ХММ – розширення з плаваючою комою ХММ0, ХММ1, ХММ2, ХММ3, ХММ4, ХММ5, ХММ6, ХММ7;

- регістри стану і управління (регістр прапорів EFLAGS/FLAGS і регістр покажчика команди EIP/IP) містять інформацію про стан процесора, виконуваної програми і дозволяють змінити цей стан.

До другої групи входять системні регістри, тобто призначені для забезпечення різних режимів роботи, сервісних функції, а також регістри, специфічні для певної моделі процесора. До системних регістрів, які підтримує IA-32, відносяться:

- управляючі регістри CRO – CR4 – визначають режим роботи процесора і характеристики поточної виконуваної задачі;

- регістри управління пам'яттю GDTR, IDTR, LDTR, і TR використовуються в захищеному режимі роботи процесора для локалізації управляючих структур цього режиму;

- налагоджувальні регістри DR0/DR7 призначені для контролю і управління різними аспектами відладки;

Page 11: Му арх 2012

11

- регістри типів областей пам'яті MTRR використовуються для апаратного управління кешуванням в цілях призначення відповідних властивостей областям пам'яті;

- машинно-залежні регістри MSR задіються для управління процесором, контролю за його продуктивністю, отримання інформації про помилки.

Регістри загального призначення Регістри загального призначення використовуються для

зберігання: • операндів команд цілочисельного пристрою; • адресів і компонентів адресів. На зберігання операндів не накладаються особливі обмеження,

але в певних умовах деякі з регістрів мають жорстке функціональне призначення, закріплене на рівні логіки роботи машинних команд. В зв'язку з цим серед всіх регістрів загального призначення особливо слід виділити регістр ESP. В ньому зберігаються покажчик на вершину стека програми, і зберігати тут які-небудь операнди не розумно і небезпечно.

Перерахуємо регістри, що відносяться до групи регістрів загального призначення і фізично знаходяться в арифметично-логічному пристрої (регістри АЛУ):

• регістр – акумулятор (асcumulator register) EAX/AX/AH/AL застосовується для зберігання проміжних даних, в деяких командах його використовування обов'язкове;

- базовий регістр (base register) EBX/BX/BH/BL задуманий як місце зберігання базової адреси деякого об'єкту в пам'яті;

- регістр – лічильник (сount register) ЕСX/CX/CH/CL застосовується в командах, що проводять деякі багатократні дії;

- регістр даних (data register) EDX/DX/DH/DL, так само як і регістр EAX/AX/AH/AL, який зберігає проміжні дані (в деяких командах його явне використовування обов'язкове, в інших його участь мається на увазі неявно).

Наступні два регістри призначено для підтримки так званих цілочисельних операцій, тобто операцій, що проводять послідовну обробку ланцюжків елементів, кожний з яких може мати довжину 32, 16 або 8 біт:

- регістр індексу джерела (source index register) ESI/SI в цілочисельних операціях містить поточну адресу в ланцюжку – джерелі;

- регістр індексу приймача (destination index register) EDI/DI в цілочисельних операціях поточна адреса в ланцюжку – приймачі.

Page 12: Му арх 2012

12

Для роботи з текстом в системі команд процесора є спеціальні команди, а в програмній моделі процесора для цього існують спеціальні регістри:

- регістр покажчика стека (stack pointer register) EBP\BP призначений для організації довільного доступу до даних в середині стека.

Сегментні регістри Процесори Intel апаратно підтримують сегментну організацію

програми. Це означає, що будь-яка програма складається як мінімум з трьох сегментів: кода, даних і стека. Логічні машинні команди в архітектуру ІA – 32 побудовані так, що при вибірці кожної команди для доступу до даних програми або до стека неявно використовується інформація з цілком певних сегментних регістрів. Залежно від режиму роботи процесора по їх вмісту визначаються адреси пам'яті, з яких починаються відповідні сегменти. В програмній моделі IA – 32 є шість сегментних регістрів CS, SS, DS, ES, GS, FS, призначених для доступу до чотирьох типів сегментів.

Сегмент коду. Містить команди програми. Для доступу до цього сегменту служить регістр сегменту коду (code segment register) CS. Він містить значення, яке по-різному інтерпретується процесором, залежно від поточного режиму роботи. В реальному режимі – це адреса першого параграфа сегменту, в захищеному – індекс елемента в таблиці дескрипторів (глобальної GDT або локальної LDT ).

Сегмент даних. Зберігає оброблювані програмою дані. Для доступу до цього сегменту слугує регістр сегменту даних (data segment register ) DS, в який поміщена адреса сегменту даних поточної програми.

Сегмент стека. Роботу із стеком процесор організовує за наступним принципом: останній записаний в цю область елемент вибирається першим. Доступ до області стека виконується через регістр стека (stack segment register ) SS, що містить адресу сегменту стека.

Додатковий сегмент даних. Неявно алгоритми виконання більшості машинних команд припускають, що оброблювані ними дані розташовані в сегменті даних, адреса якого знаходиться в регістрі сегменту даних DS. Якщо програмі недостатньо одного сегменту даних, то вона має нагоду одночасно задіювати ще три додаткові сегменти даних, адреси яких повинна міститися в регістрах додатково сегменту даних (extension data segment register ) ES, GS, FS. Серед них слід особливо виділити регістр ES. Він використовується для забезпечення цілочисельних команд процесора, адресуючи собою операнд – джерело.

Page 13: Му арх 2012

13

Регістри стану і управління В процесор Intel включено два регістри (див. рис. 1), що постійно

містять інформацію про стан як самого процесора, так і програми, команди якої він в даний момент обробляє:

- регістр покажчика команди EIP/IP; - регістр прапорів EFLAGS/FLAGS. За допомогою цих регістрів можна також обмеженим чином

управляти станом процесора. Регістр покажчика команд (instruction pointer register) EIP/IP має

розрядність 32/16 біт і містить зсув наступної належної виконанню команди відносно початку сегменту коду. Цей регістр безпосередньо недоступний програмісту, тобто його не можна вказувати як операнд команд. Але до нього можливий непрямий доступ, так завантаження і зміна його вмісту проводяться в результаті роботи різних команд управління програмним потоком, до яких відносяться команди умовних і безумовних переходів, виклику процедур і повернення з процедур. Виникнення переривань також приводить до модифікації вмісту регістра.

Регістр покажчика команд EIP/IP (FLAG register) EFLAGS/FLAGS рівна 32/16 біт. Окремі біти даного регістра мають функціональне призначення і називаються прапорами. Молодша частина регістра EFLAGS/FLAGS повністю аналогічно регістру FLAGS процесора i8086.

Виходячи з особливостей використовування, прапори регістра EFLAGS/FLAGS діляться на три групи:

1. Прапори стану – відображають особливості результату виконання арифметичних або логічних операцій і можуть змінюватися свідомо:

- прапор перенесення (carry flag). Якщо CF=1, то арифметична операція виконала перенесення із старшого біта результату (або перенесення ініційовано командою зсуву) або в старший біт результату. Старшим є 7-й, 15-й або 31-й біт залежно від розмірності операнда; якщо CF рівний 0 – перенесення не було. Цей прапор показує умови переповнювання для беззнакової арифметики.

- прапор парності (parity flag). Якщо PF=1, то 8 молодших розрядів (цей прапор дійсний тільки для 8 молодших розрядів операнда будь-якого розміру) результату містять парне число одиниць; якщо рівний 0 – серед 8 молодших розрядів результату кількість одиниць непарний.

- допоміжний прапор перенесення (auxiliary carry flag) AF – застосовується тільки для команд, що працюють з BCD – числами. Фіксує факт позичання з тетради результату: якщо AF=1 – в результаті операції складання був проведено перенесення з розряду 3 в старший розряд або

Page 14: Му арх 2012

14

при відніманням була позика в розряд при молодшій тетради із значення в старшій тетраді; якщо AF=0 – перенесень і позичань третій розряд (з третього розряду) молодшої тетради результату не було;

- прапор нуля (zero flag). Коли ZF = 1 – результат «0»; при ZF =0 – результат «0».

- прапор знака (sign flag) SF - відображає стан старшого біта результату (біти 7, 15 або 31 для 8, 16 або 32-розрядних операндів відповідно): якщо SF=1 — старший біт результату рівний 1; якщо SF =0 - старшин біт результату також 0.

- прапор переповнювання (overflow flag) OF — використовується для фіксації факту втрати значущого біта при арифметичних операціях із знаком: якщо OF=1 — в результаті операції відбувається перенесення в старшин знаковий біт результату або заїм із старшого знайомого біта результату (біти 7,15 або 31 для 8, 16 або 32-розрядних операндів відповідно); нульове значення говорить про відсутність перенесення або позичання.

2. Прапор напряму (directory flag) DF — десятий біт регістра EFLAGS. Прапор DF використовується цілочисельними командами і визначає напрям по елементної обробки даних цими командами: DF = 0 — від початку ланцюжка до її кінця, тобто від молодших адрес до старших: DF = 1 — від кінця ланцюжка до її початку, тобто від старших адрес до молодших. Стан прапора DF можна змінити командами CLD (зняти прапор DF) і STD (встановити прапор DF).

3. Системні прапори і поле IOPL — управляють введенням - виведенням, маскованими перериваннями, відладкою, перемиканням між задачами і режимом віртуального процесора 8086:

- прапор трасування (trace flag) TF — призначений для організації покрокової роботи процесора: якщо TF=1 — процесор генерує переривання з номером 1 після виконання кожної машинної команди (може використовуватися при відладці програм); якщо TF =0 — звичайна робота.

- прапор переривання (interrupt enable flag) IF — призначений для дозволу або заборони (маскування) апаратних переривань (переривань по входу 1NTR): коли IF=1 — апаратні переривання дозволені; при IF=0 — апаратні переривання заборонені.

Рівень привілейованого введення - виведення IOPL — використовується в захищеному режимі роботи процесора для контролю доступу до команд введення-виведення залежно від призначеного пріоритету задачі.

Прапор вкладеності задачі (nested task) NT — використовується в захищеному режимі роботи процесора для запам'ятовування того факту,

Page 15: Му арх 2012

15

що одна задача пов'язана з іншою по ланцюжку викликів. Робота ланцюжка зв'язаних задач організовується за допомогою команд CALL, IRET, регістра задач TR і сегменту TSS.

Прапор відновлення (resume flag) RF — застосовується при обробці переривань від регістрів відладки.

Прапор віртуального режиму процесора 8086 (virtual 8086 mode) VM - ознака поточного режиму процесора: якщо VM=1 — процесор функціонує в режимі віртуального процесора 8086; VM=0 – робота в реальному або захищеному режимі.

Прапор контролю вирівнювання (alignment check) АС — призначений для дозволу контролю вирівнювання при зверненнях до пам'яті. Використовується спільно з бітом AM в системному регістрі CR0. Процесори IА-32 (починаючи з i80486) дозволяють розміщувати команди і дані, починаючи з будь-якої адреси. Установка даних бітів (при рівні привілеїв CPL=3), як правило, приводитиме до виникнення виняткової ситуації при спробах звернення до даних і команд за адресами, некратними 2 або 4.

Прапор віртуального переривання (virtual interrupt flag) VIF (тільки Pentium) за певних умов, одне з яких – робота процесора в V– режимі, є аналогом прапора IF. Прапор VIF використовується спільно з прапором VIP (при CR4.VME=1).

Прапор відкладеного віртуального переривання (virtual interrupt реnding flag) VIP (тільки Pentium) встановлюється в 1 для індикації відкладеного переривання. Застосовується при роботі в режимі віртуального процесора i8086 спільно з прапором VIF (при CR4.VME=1). Може бути встановлений тільки програмно, процесор лише читає його.

Прапор ідентифікації (identification flag) ID – використовується для того, щоб показати факт підтримки процесором інструкції CPUID. Якщо програма може встановити або скинути цей прапор, то це означає, що модель процесора підтримує інструкцію CPUID.

Системні регістри процесора Сама назва говорить про те, що ці регістри виконують специфічні

функції в системі. Використання їх жорстко регламентовано. Саме вони забезпечують роботу захищеного режиму. Їх також можна розглядати як частина архітектури процесора, яка навмисно залишена видимою для того, щоб дозволити кваліфікованому системному програмісту виконати самі низькорівневі операції.

Системні регістри можна розділити на три групи: - чотири регістри управління; - чотири регістри системних адрес;

Page 16: Му арх 2012

16

- вісім регістрів відладки; До складу системних регістрів процесорів ряду Pentium введені

наступні зміни: - задіяний раніше зарезервований регістр управління CR4; - додана група MSR – регістрів (MSR- Model Specific Register,

модельний, – залежні регістри процесора) призначення і можливості яких підкоряються архітектурі конкретної моделі процесора. Раніше їх функції частково виконували тестові регістри, що увійшли тепер до складу MSR, – групи. Для доступу до цих регістрів передбачені спеціальні команди.

Регістри управління До групи регістрів управління входять п'ять регістрів CR0, CR1,

CR2, CR3, CR4. Вони призначені для загального управління системою. Регістри управління доступні тільки програмам з рівнем привілеїв 0. З їх загальної кількості доступними є тільки чотири регістри; виключається CR1, функції якого поки не визначені (він зарезервований для майбутнього застосування).

Регістр CR0 містить системні прапори, які керують режимами роботи процесора і відображають стан глобально, незалежно від конкретних завдань. Регістр CR0 використовується при сторінковій моделі організації пам'яті. Призначення системних прапорів:

- PE (protect enable), біт 0 – дозвіл захищеного режиму роботи. Стан цього прапора показує, в якому з двох режимів – реальному (PE=0) або захищеному (PE=1) – працює процесор в даний момент часу.

- MP (math present ), біт 1 – наявність процесора. Завжди 1. - TS (talk switched), біт 3 – перемикання завдань. Процесор

автоматично встановлює цей біт при перемиканні на виконання іншого завдання.

- AM (alignment mask), біт 18 – маска вирівнювання. Даний біт вирішує (AM = 1) або забороняє (AM = 0) контроль вирівнювання.

- CD (cache disable), біт 30 – блокування кеш – пам'яті. За допомогою цього біта можна заборонити (CD=1) або вирішити (CD=0) використання внутрішньої кеш - пам'яті (першого рівня).

- PG (paging), біт 31 – дозвіл (PG=1) або заборона (PG=0) сторінкового перетворення.

Регістр CR2 використовується при сторінковій організації оперативної пам'яті для реєстрації ситуації, коли поточна команда звернулася за адресою, що належить сторінці пам'яті, яка відсутня в даний момент часу в пам'яті. У такій ситуації в процесорі виникає виняткова ситуація з номером 14, і лінійний 32 – бітова адреса команди, що викликала виключення, записується в регістр CR2. Маючи цю

Page 17: Му арх 2012

17

інформацію, обробник виключення 14 визначає потрібну сторінку, здійснює її підвантаження в пам'ять і відновлює нормальну роботу програми.

Регістр CR3 також актуальний при сторінковій організації пам'яті. Це так званий регістр каталогу сторінок першого рівня. Він містить 20 – бітову фізичну базову адресу каталогу сторінок поточного завдання. Даний каталог містить 1024 32 – бітових дескриптора, кожний з яких зберігає адресу таблиці сторінок другого рівня. У свою чергу, кожна з таблиць сторінок другого рівня містить 1024 32 – бітових дескриптора, що адресує сторінкові кадри в пам'яті. Розмір сторінкового кадру – 4 Кбайт.

Регістр CR4 є сукупність ознак, в основному дозвільного характеру, які характеризують ті або інші архітектурні елементи, що вперше з'явилися в різних моделях процесорів Pentium. Як приклади таких властивостей можна привести наступні: підтримка 36 – розрядній адресації, використання відкладених переривань в режимі віртуального процесора i 8086, підтримка сторінок розміром 4 Мбайт і т.д. Встановлюючи в регістрі CR4 ті або інші біти, можна включати або відключати підтримку цих властивостей.

Регістри системних адрес Ці регістри ще називають регістрами управління пам'яттю. Вони

призначені для захисту програм і даних в мультизадачному режимі роботи процесора. При роботі в захищеному режимі процесора адресний простір ділиться на:

- глобальне – загальне для всіх завдань; - локальне – окреме для кожного завдання. Цим розділенням і пояснює те, що в архітектурі процесора

присутні системні регістри: - регістр таблиці глобальних дескрипторів GDTR (Global

Descriptor Table Register) має розмір 48 біт і містить 32 – бітову (біти 16 - 47) базову адресу глобальної таблиці дескрипторів (GDT) і 16 – бітове (біти 0 - 15) значення бокового розміру, що є розміром в байтах таблиці GDT;

- регістр таблиці локальних дескрипторів LDTR (Local Descriptor Table Register) має розмір 16 біт і містить так званий селектор дескриптора локальної таблиці дескрипторів. Цей селектор є покажчиком в таблиці GDT, який і описує сегмент, в якому знаходиться локальна таблиця дескрипторів (LDT).

- регістр таблиці дескрипторів переривань LDTR (Interrupt Descriptor Table Register) має розмір 48 біт і містить 32 – бітову (біти 16 –

Page 18: Му арх 2012

18

47) базову адресу таблиці дескрипторів переривань (IDT) і 16 – бітове (біти 0 - 15) значення межі, що є розміром в байтах таблиці IDT;

- 16 – бітовий регістр завдання TR (Task Register), подібно до регістра LDTR, містить селектор, тобто покажчик на дескриптор в таблиці GDT. Цей дескриптор описує поточний сегмент стану завдання (TSS – Task Segment Status). Останній створюється для кожного завдання в системі, має жорстко регламентовану структуру і зберігає контекст (поточний стан) завдання. Основне призначення сегментів TSS – запам'ятовувати поточний стан завдання у момент перемикання на інше завдання.

Регістр відладки Дуже цікава група регістрів, призначених для апаратного

контролю виконання програм. Засоби апаратної відладки вперше з'явилися в моделі i486. Процесор містить вісім регістрів відладки, але реально з них використовуються тільки шість.

Регістри DRO, DR1, DR2, DR3 мають розрядність 32 біта і призначені для завдання лінійних адрес чотирьох точок переривання. При цьому діє наступний механізм: будь-яка формована поточною програмою адреса порівнюється з адресами в регістрах DRO – DR3, і при збігу генерується виключення відладки з номером 1.

Регістр DR6 називається регістром стану відладки. Біти цього регістра встановлюються відповідно до причин, які викликали виникнення останнього виключення з номером 1. Перерахуємо ці біти і їх призначення:

- В0 – якщо встановлений в 1, то останньою виключенням (переривання) виникла в результаті досягнення в контрольній точці, визначеній в регістрі DR0;

- В1 – аналогічно В0, але для контрольної точки в регістрі DR1; - В2 – аналогічно В0, але для контрольної точки в регістрі DR2; - В3 – аналогічно В0, але для контрольній точки в регістрі DR3; - BD (біт 13) служить для захисту регістрів відладки; - BS (біт 14) – встановлюється в 1, якщо виключення 1 було

викликано станом прапора TF = 1 в регістрі EFLAGS; - ВТ (біт 15) – встановлюється в 1, якщо виключення 1 було

викликано перемиканням на завдання зі встановленим бітом в пастці (Т = 1) в TSS.

Решта всіх біт в цьому регістрі заповнюється нулями. Обробник виключення 1 по вмісту DR6 повинен визначити причину, по якій відбулося виключення, і виконати необхідні дії.

Page 19: Му арх 2012

19

Регістр DR7 називається регістром управління відладкою. У ньому для кожного з чотирьох регістрів контрольних точок відладки відводяться поля, за допомогою яких можна уточнити наступні умови, при яких слід згенерувати переривання:

- місце реєстрації контрольної точки – тільки в поточному завданні або в будь-якому завданні. Відповідні ознаки займають молодші вісім бітів регістра DR7: по два біта на кожну контрольну точку (фактично точку переривання), що задається регістрами DR0 DR1 DR2 DR3. Перший біт з кожної пари – це так званий локальний дозвіл, його установка говорить про те, що точка переривання діє, якщо вона знаходиться в межах адресного простору поточного завдання. Другий біт в кожній парі визначає глобальний дозвіл, тобто дана контрольна точка діє в межах адресних просторів всіх завдань, запущених в системі;

- тип доступу, по якому ініціюється переривання: тільки при вибірці команди, при записі або при записі/читанні даних. Біти, що визначають природу переривання, зосереджені в старшій частині даного регістра.

Більшість з системних регістрів програмно доступні. Не всі з них знадобляться в подальшому викладі, але проте ми коротко пройшлися по ним з метою викликати інтерес до подальшого дослідження архітектури процесора.

Розглянута вище частина програмної моделі процесора не є повною. Її досить для обговорення цілочисельних команд процесора. Складові програмної моделі, що мають відношення до співпроцесора, до пристроїв ММХ – і ХММ – розширення, будуть розглянуті у відповідних місцях довідника разом з командами, які перераховані пристрої реалізують.

В програмах на мові асемблера регістри використовуються дуже інтенсивно. Більшість регістрів має певне функціональне призначення.

Лабораторні роботи першого модуля та другого модуля виконуються за допомогою блоків на асемблері у C++Builder або Visual Studio C++.

Page 20: Му арх 2012

20

Лабораторна робота № 1. Системи числення

Мета роботи: вивчення систем числення, принципів організації арифметичних дій з двійковими і двійково-десятковими числами.

Загальні теоретичні відомості

Під системою числення прийнято розуміти спосіб запису чисел цифровими знаками (цифрами). Числа можна зображувати або комбінацією символів якого-небудь алфавіту, або стійкими станами рівноваги одного чи кількох пристроїв. Основою системи числення звичайно є спосіб зображення цілих чисел. Розрізняють позиційні й непозиційні системи числення.

Система числення називається позиційною, якщо значення кожної цифри, що входить у запис числа, залежить від її положення (позиції) у ряді цифр, що зображують це число.

Непозиційною називається така система числення, в якій значення цифри не залежить від її положення в ряді цифр, що зображують число.

У цифрових обчислювальних машинах використовуються тільки позиційні системи числення, тому що непозиційні системи незручні для обчислень.

У даний час загальноприйнята десяткова система числення. Названа вона так тому, що для запису чисел у ній використовуються десять різних цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8 і 9, що зображують цілі числа від нуля до дев’яти.

Крім десяткової, існують і інші позиційні системи числення. Приймаючи за основу системи різні числа: два, три, вісім і інші, можна одержати відповідно двійкову, трійкову, восьмеричну й інші системи. При цьому в кожній з них, як і в десятковій системі, число буде являти собою суму ступенів основи системи з відповідними коефіцієнтами:

m-q

m-a ... 1-q

1-a 0q

0a kq

ka ...2-nq

2-na1-nq

1-na

qA , (1)

де Aq — число в q-й системі числення; q — основа системи; п — номер розряду.

У восьмеричній системі для запису чисел використовуються вісім цифр (0,1,2,3,4,5,6,7), що позначають цілі числа від нуля до семи. Число вісім (основа системи) записується двома цифрами у вигляді 10.

Page 21: Му арх 2012

21

Приклад. Запишемо у восьмеричній системі число А=26610. Відповідно до виразу (1) ці числа необхідно розкласти по ступенях вісімок, тому що основа системи — вісім.

)(08

4

)(148

33

)(2338

266

СЗБзалишок

МЗБзалишок

МЗБзалишок

26610 = 4 1 28 Приклад. Запишемо восьмеричне число А=3728 у десятинній

системі числення. 3728 = 382 + 781 + 280 =364 + 78 + 31=25010,

Зараз у техніці найбільш поширена двійкова система числення у

зв’язку з порівняно легким створенням пристрою з двома стійкими станами рівноваги. Двійкова система числення має тільки дві цифри: 0 і 1.

Відповідно до виразу (1) двійкове число N2 являє собою суму: А2 = xп • 2

n + xп - 1 • 2 n - 1 + .... + x1• 2

1 + x0•20 + …

Тут коефіцієнти xі можуть приймати тільки два значення: 0 і 1. Приклад. Запишемо число 6910 у двійковій системі: 6910 =1•26 + 0•25 + 0•24 + 0•23+ 1•22+ 0•21 +1•2°.

1 0 0 0 1 0 1 Таким чином отримаємо, 6910=10001012.

У порівнянні з іншими позиційними системами числення двійкова система примітна тим, що в ній арифметичні дії найбільш прості.

В двійковій системі арифметичні операції особливо прості. В двійковій системі не існує «таблиці складання», яку потрібно б було запам'ятовувати, оскільки перенесення в старший розряд починається з 1+1=10. При складанні великих чисел необхідно лише складати по стовпцях або розрядах, як в десятковій системі, пам'ятаючи лише про те, що як тільки сума в стовпці досягне числа 2, двійка переноситися в наступний стовпець (вліво) у вигляді одиниці старшого розряду. Віднімання проводиться так само, як в десятковій системі, не

Page 22: Му арх 2012

22

замислюючись про те, що тепер у разі потреби потрібно займати із стовпця зліва 2, а не 10.

Проте за цю легкість доводиться платити великим числом знаків при множенні навіть невеликих чисел.

В таблиці 1.1 приведені правила складання, віднімання і множення двійкових чисел.

Таблиця 1.1

Правила складання, віднімання і множення двійкових чисел

Складання Віднімання Множення 0 + 0 = 0 0 - 0 = 0 0 х 0 = 0 1 + 0 = 1 1 - 0 = 1 1 х 0 = 0 0 + 1 = 1 1 - 1 = 0 0 х 1 = 0 1 + 1 = 10 10 - 1 = 1 1 х 1 = 1

В загальному випадку процедури складання і віднімання двох

чисел в будь-кому позиційної системи числення починаються з молодших розрядів.

Код суми кожного i-того розряду сi виходить у результаті складання ai+bi+1, де одиниця відповідає перенесенню з молодшого (i-1) - розряду в i-й, якщо в молодшому розряді код суми вийшов більше або рівним основі системи числення.

Код різниці кожного i-го розряду виходить в результаті віднімання ai-bi-1, де одиниця відповідає «займу», якщо він був, в молодші розряди величини, рівної підставі системи числення.

Отже, правила і методи складання і відіймання у будь-якій позиційній системі числення залишаються такими ж, як у десятковій системі.

Віднімання також проводиться порозрядно, починаючи з молодшого розряду. При відніманні у даному розряді з нуля одиниці необхідно зайняти одиницю із сусіднього старшого розряду, яка рівна двом одиницям даного розряду.

Підсумовування двійкових чисел у комп'ютерах здійснюється за допомогою двійкових суматорів. Віднімання можна організувати за допомогою процедури складання, тобто за допомогою двійкових суматорів, якщо від'ємник представити у додатковому або зворотному коді.

Page 23: Му арх 2012

23

Приклади.

Приклад 1. знайдемо суму двох чисел 1010 та 1011. Запишемо ці числа в стовпчик і складемо за загальним правилом:

0.0010 (210) +0.0100 (410)

0.0110 (610)

+1010 (1010) 1011 (1110)

10101 (2110)

0.100111 (3910) +0.001101 (1310) 0.110100 (5210)

а) б) в)

Приклад 2. Визначимо різницю наступних двох чисел: 10101 та 1010. _ 10101 (2110) 1010 (1010) 1011 (1110).

При знаходженні різниці необхідно пам’ятати, що зайнята в найближчому старшому розряді одиниця дає двох одиниць молодшого розряду. Якщо в сусідніх старших розрядах містяться нулі, то доводиться займати одиницю через кілька розрядів. При цьому одиниця, зайнята в найближчому значущому старшому розряді, дає двох одиниць молодшого розряду й одиниці у всіх нульових розрядах, що містяться між молодшим і тим старшим розрядом, у якого бралася позика.

Приклад 3.

0111 + 1 після позики одиниці Зменшуване 1000 (810) Від'ємник 11 (310) Різниця 101 (510).

Приклад 4.

0.0101 (510) x 0.0011 (310) 0101 + 0101

0.1111 = 1510 Ділення двійкових чисел. При діленні двійкових чисел

використовуються двійкові таблиці множення й віднімання.

Page 24: Му арх 2012

24

Приклад 5. х=43010=1101011102;

у=1010=1010; х/у=4310 _ 110101110 | 1010 1010_____ 101011 . 1101 1010 _1111 1010 1010 1010 0000

х=20410=110011002, у=1210=11002 , х/у=1710

11001100 | 1100 1100 | 10001

залишок 00001 - 0 11 - 0 110 - 0 1100 - 1100

0000 а) б)

Як видно з приведених вище прикладів, правила виконання арифметичних дій у десятковій і двійковій системах однакові. Однак у двійковій системі арифметичні дії набагато простіші. Особливо просте множення й ділення.

Дробові числа в позиційних системах числення зображуються таким чином: як і в цілих числах, вага двох сусідніх розрядів відрізняється в q-разів; вага зменшується зліва направо. Різниця полягає тільки в тому, що вага старшого розряду дорівнює q-1 , молодшого (при n-розрядах) q-n.

Хід виконання роботи 1. Повторити конспект (теоретичні відомості). 2. Отримати допуск до роботи. 3. Отримати варіант завдання (табл. 1.2. Завдання під номером у

таблиці). 4. Виконати операцію x+y. 5. Виконати операцію x-y. 6. Виконати операцію x*y. 7. Виконати операцію x/y. 8. Скласти звіт по лабораторній роботі. 9. Зробити висновки по роботі. 10. Відповісти на запитання для самоперевірки.

Запитання для самоперевірки 1. Дати визначення поняттю “система числення”. 2. Що являє собою двійкова система числення? 3. Що являє собою позиційна система числення? 4. Що являє собою непозиційна система числення?

Page 25: Му арх 2012

25

5. Навести правила виконання арифметичних операцій у двійковій системі числення?

6. Якого порядку слід дотримуватись при розташуванні цифр та літер шістнадцятирічної системи числення?

7. Чому шістнадцятирічна система числення вважається більш економічною та використовується для розташування даних у пам’яті комп’ютера?

8. Які недоліки вносить позиційність в запис числа у порівнянні з використанням його непозиційного подання?

Таблиця 1.2 Початкові дані

Число Варіант

1 2 3 4 5

x 010101 011011 011010 010010 010000 y 000011 000011 000010 000011 000100 Число Варіант

6 7 8 9 10

X 001111 001010 001000 001001 001010 Y 000101 000101 000100 000011 000010 Число Варіант

11 12 13 14 15

X 010010 010000 001111 001110 001100 Y 000110 000010 000011 000111 000110 Число Варіант

16 17 18 19 20

X 000110 100000 011110 000110 010100 Y 000011 000100 000101 000010 000010 Число Варіант

21 22 23 24 25

X 001110 001110 001100 001001 001110 Y 000101 000101 000100 0000001 000011

Page 26: Му арх 2012

26

Лабораторна робота 2. Перевід чисел з одної позиційної системи числення в іншу

Мета роботи: закріплення знань по переводу чисел з однієї системи в іншу та форм представлення ЕОМ.

Загальні теоретичні відомості

Загальне правило переводу цілих чисел. Для переводу цілого числа з однієї позиційної системи в іншу його треба послідовно поділити на основу q тієї системи, у яку воно переводиться, доти, доки не вийде частка менше q. Число в новій системі запишеться у вигляді залишків ділення, починаючи з останнього. Остання частка дає старшу цифру числа. Пояснимо це правило на прикладі.

Приклад 1. Перевести число 118 з десяткової системи числення у двійкову.

118 2 118 59 2 0 58 29 2 1 28 14 2 1 14 7 2 0 6 3 2 1 2 1 1

Приклад 2. Десяткове число 83 перевести у двійкову систему

числення:

8382

2414011

220200

210100

2541

2220

21Напрямок

читання

Останнячастка

Page 27: Му арх 2012

27

Приклад 3. Число 3728 із восьмеричної системи числення у десяткову.

3728 = 3 х (82) +7 х (81) + 2 х (80) = =3 х 64 + 7 х 8 + 2х 64 =25010 Приклад 4. Переведемо число 1358 в десяткову систему числення. 1358 128

128 118

158 128 38

Одержали неподільне – 118 і залишок 38, які представляють

значення цифр десяткового числа. Враховуючи, що 38=310, а 118=910, одержимо 1358=9310.

Приклад 5. Переведемо число 24,68 в десяткову систему числення. 24,68 = 2 х (81) + 4 х (80) + 6 х (8-1)=2 х 8 +4 х 1 + 6 х 0,8 =

= 16 + 4 +0,75 = 20,7510 . Загальне правило переводу правильних дробів. Для переводу

правильного дробу з однієї позиційної системи в іншу його потрібно послідовно множити на основу тієї системи, у яку він переводиться. Перемножуються тільки дробові частини; дріб у новій системі запишеться у вигляді цілих частин добутків, що виходять, починаючи з першого.

Приклад 6. Десятковий дріб 0,3125 перевести у двійкову систему

числення:

0,3125 20,6250 21,2500 20,5000 21,0000

Напрямокчитання

х

х

х

х

Отже, 0,312510 = 0,01012.

Page 28: Му арх 2012

28

Двійкове число може бути розкладене по ступенях 2 в будь-якій системі числення.

Приклад 7. Перевести ціле число з двійкової системи числення в десяткову:

100111= 1•2 5 +0•2 4 +0•2 3 +1•2 2 +1•2 1 +1•2 0 =32+4+2+1=39. Перевід дробу з двійкової системи числення в іншу проводиться за

допомогою послідовного множення дробу на основу системи. Приклад 8. Перевести дробове число з двійкової системи числення

в десяткову: 1011,01101=

1•2 3 +0•2 2 +1•2 1 +1•2 0 +0•2 1 +1•2 2 +1•2 3 +0•2 4 +1•2 5 =8+2+1+4

1

+8

1+

32

1=11

32

13.

Перевід двійкового числа в десятковий його еквівалент можна

виконати за допомогою наступного дуже простого способу. Перетворення здійснюється шляхом підсумовування значень ступенів числа 2, відповідних тим розрядам двійкового числа, що переводиться, в яких містяться одиниці. Наприклад, переведемо 101110102 в десяткове число.

Розряди числа що переводиться

7 6 5 4 3 2 1 0

Число 1 0 1 1 1 0 1 0 Ступінь числа 2

27

26

25

24

23

22

21

20

Результат 128 0 32 16 8 0 2 0

Шістнадцятирічна система числення – це система числення з

основою 16, в якій для зображення чисел служать наступні символи: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Буквені позначення введені тому, що незручно зображувати одну цифру двома символами. Для полегшення переводу чисел з однієї позиційної системи числення у іншу можна скористатися таблицею 2.1.

Page 29: Му арх 2012

29

Таблиця 2.1 Перевод десяткових чисел у шістнадцятирічні числа

Множ

ник

1 2 3 4 5 6 7 8 9

1 1 2 3 4 5 6 7 8 9

10 А 14 1E 28 32 3C 46 50 5A

102 64 C8 12C 190 1F4 258 2BC 320 384

103 3E8 7D0 BB8 FA0 1388 1770 1B58 1F40 2328

104 2710 4E20 7530 9C40 C350 EA60 11170 13880 15F90

105 186A0 30D40 493E0 61A80 7A120 927C0 AAE60 C3500 DBBA0

Приклад: 1234=1000+200+30+4=(3E8) 16+(C8) 16+(1E) 16+(4) 16=(4D2) 16

Приклад 9. Шістнадцятирічне число IFA,C2416 переводиться у двійкове число:

I F A, C 2 4

0001 1111 1010, 1100 0010 0100

7 6 3, 2 2 4

111 110 011, 010 010 100

Остаточно одержимо IFA,C2416=111111010,11000012. Для переводу чисел з двійкової системи числення у

шістнадцятирічну (восьмеричну) слідує двійкові цифри числа, що переводиться, згрупувати по чотири (три) в обидві сторони від коми. При необхідності неповні групи цифр доповнити 0. Кожну з одержаних груп

Page 30: Му арх 2012

30

двійкових цифр замінити відповідною їй цифрою в новій системі числення, а одержані шістнадцятирічні (восьмеричні) цифри розташувати на місцях замінюваних двійкових кодів.

Наприклад, переведемо число 111111010,11000012 у шістнадцятирічне. 0001 1111 1010 1100 0010 0100 I F А С 2 4

Приклад 10. Перевести з шістнадцятирічної системи числення

число ВА в десяткову : ВА=В•16 1 +А•16 0 =11•16+10•1=186. Перевід з десяткової системи в шістнадцятирічну проводиться за

загальним правилом переводу цілих чисел. Приклад 11. Перевести число 165 з десяткової системи числення в

шістнадцятирічну:

165160

5

1610 Остання частка

Напрямокчитання

(А)

Для того, щоб перевести з двійкової системи числення в

шістнадцятирічну, достатньо подати це число у вигляді умовно поділеного на чотирьох розрядні двійкові коди (тетради).

Приклад 12. Перевести число 10110110001101 з двійкової системи числення в шістнадцятирічну: 10110110001101(2)= 0010 1101 1000 1101 = 2D8D(16).

Хід виконання роботи

1. Вивчити теоретичні відомості. 2. Отримати допуск до роботи. 3. Вибрати за методичними вказівками варіант завдання. 4. Зробити перевід десяткового числа (х) у шістнадцятирічну та

двійкову системи числення. Виконати перевірку переводу із допомогою інженерного калькулятора.

5. Перевести шістнадцятирічне число (у) у десяткову систему числення.

6. Перевести правильний десятковий дріб (число z) у двійкову систему числення

7. Скласти звіт по лабораторній роботі. 8. Зробити висновки по роботі. 9. Відповісти на запитання для самоперевірки.

Page 31: Му арх 2012

31

Запитання для самоперевірки 1. Привести загальне правило переводу цілих чисел. 2. Привести загальне правило переводу правильних дробів. 3. Як перевести число з двійкової в будь-яку систему числення? 4. Що являє собою шістнадцятирічна система числення? 5. Як проводиться перевід з шістнадцятирічної в будь-яку систему

числення? 6. З якою метою у запису чисел використовуються тетради? 7. Яке значення для сприйняття числа має напрямок читання його

розрядів при виконанні переводу з іншої системи числення? 8.

Таблиця 2.2

Початкові дані Число Варіант

1 2 3 4 5 6

x 68104 31508 76312 11127 29315 86114 y F4A1 AF7B D3AA EEA7 BC61 73AF z 0,3287415 0,0231578 0,4403212 0,5401117 0,2213454 0,00245963

Число Варіант

7 8 9 10 11 12

x 44801 76503 20422 14711 12312 96433

y A21D BC1D A1BD DA01 F34A DC23

z 0,5585937 0,4325212 0,3387423 0,1218973 0,2631874 0,1591979

Число Варіант

13 14 15 16 17 18

x 82040 43561 75423 67141 45806 54302

y 4D18 AFC7 A38C A38C BF7C EF6A

z 0,2610195 0,2101489 0,2912201 0,0801234 0,1504484 0,3405401

Число Варіант

19 20 21 22 23 24

x 15919 84432 24611 18441 32412 54716

y AE76 1EBA E3F7 A02B B1AE AEF1

z 0,2203445 0,7442612 0,3214572 0,8431454 0,3071629 0,9261413

Page 32: Му арх 2012

32

Лабораторна робота 3. Форми представлення чисел у ЕОМ

Мета роботи: закріплення знань по використанню чисел з плаваючою та фіксованою комою у ЕОМ.

Загальні теоретичні відомості

Формою представлення чисел у цифрових автоматах називається

сукупність правил, що дозволяють установити взаємну відповідність між записом числа та його кількісним еквівалентом.

Машинне (автоматне) зображення числа – це представлення числа в розрядній сітці цифрового автомата. Умовну позначку машинного зображення числа, наприклад, A будемо представляти як [A].

Необхідність в указівці положення коми відпадає, якщо місце коми в розрядній сітці машини заздалегідь фіксовано. У формі представлення з фіксованою комою всі числа зображуються у вигляді послідовності цифр з постійним для всіх чисел положенням коми, яка відділяє цілу частину від дробової. Наприклад, у десятковій системі числення є п’ять розрядів у цілій частині числа й п’ять розрядів – у дробовій. Числа, записані в таку розрядну сітку, матимуть вигляд: +00567,22100; +00000,00044; -23501,20450.

Припустимо, що в розрядній сітці необхідно розмістити двійкове число, яке містить цілу й дробову частини. Якщо для розміщення цілої частини відводиться r гнізд n – розрядної сітки, то (без урахування знака) для розміщення дробової частини залишиться n-r вільних гнізд. Якщо кількість розрядів у дробовій частині розміщуваного числа перевищує n-r, то деякі молодші розряди виявляться за межами розрядної сітки. Отже, будь-яке двійкове число, менше ніж 0. 0…1 (n-r нулів) сприймається як нульове й називається машинним нулем.

Оскільки числа бувають додатні й від’ємні, то формат (розрядна сітка) машинного зображення розбивається на знакову частину й поле числа. У полі числа розміщується саме зображення числа, яке ми умовно називатимемо мантисою числа. Для кодування знака числа використовується найстарший розряд розрядної сітки, відведеної для зображення двійкового числа, а інші розряди відводяться під мантису числа. Положення коми в розрядній сітці суворо фіксується, зазвичай або правіше наймолодшого розряду мантиси, або лівіше найстаршого. У першому випадку число представляється як ціле, у другому – як

Page 33: Му арх 2012

33

правильний дріб. У комп’ютерах у форматі з фіксованою точкою представляються цілі числа.

У знакову частину записується інформація про знак числа. Прийнято, що знак додатного числа „+” зображується символом 0, а знак від’ємного числа „-” – символом 1. Наприклад, у двійковому коді, використовуючи 6-розрядну сітку, число 7 у формі з фіксованою комою можна представити у вигляді – 0.001112. Цифра лівіше точки – це знак числа, а п’ять цифр правіше точки – мантиса числа в прямому коді. Тут мається на увазі, що кома фіксована правіше молодшого розряду, а точка в зображенні числа в цьому випадку просто розділяє знаковий біт від мантиси числа.

Можна використати й іншу форму представлення числа в машинній формі – [0]001112. Знаковий розряд виділяється квадратними дужками.

Кількість розрядів у розрядній сітці, відведена для зображення мантиси числа, визначає діапазон і точність представлення числа з фіксованою комою. Максимальне за абсолютною величиною двійкове число зображується одиницями в усіх розрядах, за винятком знакового, тобто для цілого числа:

1), - (2 |A| 1)-(nmax

де n – повна довжина розрядної сітки. У випадку 16-розрядної сітки 1) - (2 |A| 1)-(16

max 3276710,

тобто діапазон представлення цілих чисел у цьому випадку буде від +3276710 до -3276710 .

Для випадку, коли кома фіксується правіше молодшого розряду мантиси, тобто для цілих чисел, числа, у яких модуль більше, ніж

1) - 1)-(n(2 і менше одиниці, не представляються у формі з фіксованою

комою. Числа, за абсолютною величиною менше одиниці молодшого розряду розрядної сітки, називаються в цьому випадку машинним нулем. Від’ємний нуль заборонений.

У деяких випадках, коли можна оперувати лише модулями чисел, усю розрядна сітка, включаючи найстарший розряд, відведено для представлення числа, що дозволяє розширити діапазон зображення чисел.

У комп’ютерах з метою спрощення виконання арифметичних операцій застосовують спеціальні двійкові коди для представлення від’ємних чисел: обернений і додатковий. За допомогою цих кодів спрощується визначення знака результату операції при алгебраїчному додаванні. Операція віднімання (або алгебраїчного додавання) зводиться

Page 34: Му арх 2012

34

до арифметичного додавання операндів, полегшується вироблення ознак переповнення розрядної сітки. Як наслідок спрощуються пристрої комп’ютера, які виконують арифметичні операції.

Одним із способів віднімання є заміна знака числа, що віднімається, на протилежний і додавання його до зменшуваного числа А–В =А + (-В).

Таким чином, операцію арифметичного віднімання заміняють операцією алгебраїчного додавання, яку можна виконати за допомогою двійкових суматорів.

Для машинного представлення від’ємних чисел використовують прямий, додатковий і обернений коди.

Доповнивши запис числа у двійковому коді знаковим розрядом, який дорівнює нулю для додатних чисел й одиниці – для від’ємних, отримаємо запис знака й модуля числа в прямому коді, наприклад, +6=0.110, -6=1.110.

Обернений двійковий код від’ємного числа утворюється з прямого коду рівного йому за модулем додатного числа інвертуванням значень усіх його розрядів, наприклад, обернений код числа -6 дорівнює 1.001.

Додатковий код від’ємного числа утворюється з його оберненого коду додаванням одиниці до молодшого розряду, наприклад, додатковий код числа -6 дорівнює 1.010.

У загальному випадку справедливими є такі вирази: Прямий код числа А-[A]пр. Нехай А=а1, а2,…аm; Якщо А>0, то [A]пр =0, а1, а2,…аm; Якщо А<0, то [A]пр =1, а1, а2,…аm; Якщо А=0, то є неоднозначність: [0]пр =0,0 або =1,0… Узагальнюючи результати, отримаємо: [A]пр= A, якщо А≥0, 1-А, якщо А<0. Обернений код числа А-[A]об. Позначка a означає величину,

обернену а (інверсію а), тобто якщо а=1, то a =0, і навпаки: Якщо А>0, то [A]об =[A]пр =0, а1, а2,…аm; Якщо А<0, то [A]об =1, a 1, a 2,… a m; Якщо А=0, то є неоднозначність: [0] об =0,0..0 або =1,11…1. Узагальнюючи результати, отримаємо: [A]об= A, якщо А≥0, 10-1·10-n+А, якщо А≤0.

Page 35: Му арх 2012

35

Додатковий код числа А-[A]дод: Якщо А≥0, то [A]дод =[A]пр = 0, а1, а2,…аm; Якщо А<0, то [A]дод=1, a 1, a 2,… a m +0,000…1; Узагальнюючи результати, отримаємо: A, якщо А≥0, [A]дод= 10+А, якщо А<0. Уявімо, що ми маємо лише два розряди для представлення чисел

у десятковій системі числення. Тоді максимальне число, яке можна зобразити, буде 99, а вага третього неіснуючого старшого розряду буде 102, тобто 100. У такому випадку для числа 20 додатковим буде число 80, яке доповнює 20 до 100 (100 – 20 = 80). Розглянемо схожий приклад для чисел, представлених 4-розрядним двійковим кодом. Знайдемо додаткове число для 00102 = 210. Треба від [1]0000 відняти [0]0010, отримаємо число [0]1110, яке і є додатковим кодом 2. Розряд, зображений у квадратних дужках, насправді не існує. Але оскільки в нас 4-розрядна сітка, то виконати таке віднімання в принципі неможливо, а тим більше ми стараємось позбутися віднімання. Тому додатковий код числа отримують способом, описаним раніше, тобто спочатку отримують обернений код числа, а потім додають до нього 1. Проробивши все це з нашим числом (2), неважко переконатися, що вийде аналогічна відповідь.

Додатковий і обернений коди використовують лише для представлення від’ємних двійкових чисел у формі з фіксованою комою. Додатні числа в цих кодах не змінюють свого зображення й представляються, як у прямому коді.

Таким чином, цифрові розряди від’ємного числа в прямому коді залишаються незмінними, а в знаковій частині записується одиниця.

Розглянемо прості приклади (див. табл. 3.1).

Таблиця 3.1 Представлення числа в прямому, оберненому й додатковому

кодах Число Прямий код Обернений код Додатковий код

-7 [-7]пр= 1.0001112

[-7]об=1.1110002

[-7]доп = 1.1110012

Розглянемо ще раз, як процедура віднімання за допомогою

представлення від’ємника в додатковому коді зводиться до процедури додавання. Віднімемо від 10 число 7. Якщо обидва операнди представлені в прямому коді, то процедура віднімання виконується так (див. табл.3.2):

Page 36: Му арх 2012

36

Таблиця 3.2 Процедура віднімання в прямому й оберненому кодах

Дія Прямий код Обернений код 10-7=3 0.001010

-1.000111 0.000011= 310

0.001010 + 1.111001

1 0.000011= 310.

У наш час у комп’ютерах для представлення від’ємних чисел у

форматі з фіксованою комою зазвичай використовується додатковий код. Показова форма, або форма з плаваючою комою, застосовується

для розширення діапазону й зменшення відносної похибки представлення чисел в обчислювальних пристроях.

У загальному випадку число у формі з плаваючою комою представляється у вигляді:

,pqmA

де m – мантиса числа; q – основа системи числення; p – порядок числа, який для спрощення в прикладах будемо

іноді зображувати як ±р (не плутайте з перенесенням у старший розряд). Тоді очевидно, що p – це показник ступеня порядку, який

зазвичай називають просто порядком числа, оскільки в основному завжди q = 2. Отже, попередній вираз можна записати в такому вигляді:

,A

pA

mA

маючи на увазі, що в комп’ютерах зазвичай q = 2. Так, число 1964 у формі з плаваючою комою в десятковій системі

числення можна записати так: 1964,0100; 0,1964104; 19,64102; 19640010-2 і т. д.

Неоднозначність запису полягає в тому, що мантиса може приймати безкінечну кількість різних значень, менших за одиницю, при відповідних значеннях порядку (тобто кома в мантисі може плавати).

Число з плаваючою комою прийнято представляти в так званому нормалізованому вигляді для максимально точного представлення числа. Якщо виконується нерівність

,1||1 mq

а у випадку двійкової системи числення:

,1||5.0 m

Page 37: Му арх 2012

37

то вважається, що число представлено в нормалізованому вигляді. Наприклад, 0,1964·104 є нормалізованим виглядом числа 1964 у формі з плаваючою комою в десятковій системі числення. Аналогічні міркування застосуємо й до двійкових чисел. Наприклад, нормалізована форма запису двійкового числа 1110110,0112 має такий вигляд: 0,1110110011·10111.

Таким чином, у двійкового нормалізованого числа у формі з плаваючою комою мантиса – правильний дріб і в старшому розряді мантиси завжди стоїть 1. Операція приведення числа до нормалізованого вигляду називається нормалізацією. Нормалізація чисел у комп’ютері виконується або автоматично, або ж за спеціальною програмою.

Оскільки система числення для заданого цифрового автомата (комп’ютера) залишається постійною, то при представленні числа у форматі з плаваючою комою немає необхідності вказувати її основу, достатньо лише представити показник ступеня порядку числа.

Сумування двійкових чисел, представлених у формі з фіксованою комою, здійснюється аналогічно сумуванню цілих чисел. Номери розрядів визначаються їх розташуванням у числі відносно коми, яка відділяє цілу частину від дробової. Так, прямий код числа +118,37510 може бути представлений як 1.0001001,1012= - 118,37510.

Порядок сумування не залежить від положення коми. Якщо обидва операнди представлені в прямому коді й мають

однакові знаки, то над такими операндами виконують процедуру додавання й результату присвоюють знак вихідних операндів.

Розглянемо приклади. Сумування двох додатних чисел.

+39 +13 +52

0.100111 +0.001101 0.110100

Результат сумування не виходить за межі розрядної сітки. Отже, він правильний. Ще один приклад.

+52 +13 -63

0.110100 +0.001101 1.000001

У результаті сумування вийшло від’ємне число -63, тобто сумування неправильне, оскільки правильна відповідь 65 виходить за межі розрядної сітки.

Page 38: Му арх 2012

38

При додаванні двох чисел, представлених в оберненому або додатковому коді, їх знакові розряди додаються, причому можливий перенос одиниці із старшого цифрового розряду в знаковий.

Прямий код Додатковий код Обернений код

210 + 410 = 610 -210 - 410 = -610 -210 - 410 = -610 0.0010 +0.0100 0.0110 = 610

1.1110 + 1.1100 11.1010 = -610

1.1101 + 1.1011 1 1.1000 +1 корекція 11001 = -610

Якщо ж операнди мають різні знаки, то повинна виконуватися

процедура віднімання. Але, як уже було відзначено, процедуру віднімання заміняють процедурою додавання, від’ємний операнд (від’ємник) представляють в оберненому або додатковому коді, а додатний операнд – у прямому коді.

Розглянемо приклади. Сумування двох чисел з різними знаками.

- 52 +13 - 39

1.001100 0.001101 1.011001

Результат сумування правильний і має знак більшого за модулем числа. При сумуванні чисел з різними знаками модуль результату завжди не перевищує модуля будь-якого з вихідних операндів. Тому переповнення розрядної сітки не відбувається. Розглянемо ще кілька прикладів.

410 - 210 = 210 410 - 210 = 210 0.0100

+ 1. 1110 10. 0010 = 210

0.0100 + 1.1101 10.0001 +1 корекція 0.0010 = 210

Використання чисел зі знаком (прямого коду представлення

чисел) ускладнює архітектуру цифрового автомата. У деяких ЕОМ від’ємні числа представлено у вигляді так званих доповнень. Це дозволяє замінити віднімання чисел додаванням.

Доповненням H n-розрядного числа A називається різниця H=qn-А,

де q – основа системи числення.

Page 39: Му арх 2012

39

У табл. 3.3. показано приклади різноманітних випадків додавання чисел зі знаком.

Таблиця 3.3

Приклади додавання чисел зі знаком

Прик-лад

Доданки й результат Примітка

1 A>0, B> 0, C<215 0 000 0110 0011 1010 A=+ 1594 +0 100 0100 1001 1011 B=+17563 0 100 1010 1101 0101 C=+19157

Результат коректний

2 A>0, B>0, C>=215 0 100 0100 1001 1011 A=+17563 +0 100 1010 1101 0101 B=+19157 1 000 1111 0111 0000 C=-28816

Переповнення розрядної сітки.

Результат некоректний

3 A<0, B<0, │A│+│B│< 215 1 111 1001 1100 0110 A=- 1594 +1 011 1011 0110 0101 B=-17563 1 1 011 0101 0010 1011 C=-19157

Перенесення із старшого розряду не враховано. Результат коректний

4 A<0, B<0, │A│+│B│> 215 1 011 1011 0110 0101 A=-17563 +1 011 0101 0010 1011 B=-19157 1 0 111 0000 1001 0000 C=+28816

Переповнення розрядної сітки.

Результат некоректний

5 A>0, B<0, │A│>│B│ 0 100 0100 1001 1011 A=+17563 +1 111 1001 1100 0110 B= - 1594 1 0 011 1110 0110 0001 C=+15969

Перенесення із старшого розряду не враховано. Результат коректний

6 A>0, B<0, │A│<│B│ 0 000 0110 0011 1010 A=+1594 +1 011 1011 0110 0101 B= -17563 1 100 0001 1001 1111 C= -15969

Результат коректний

Резюме: Відповідно до таблиці правило перевірки формулюється так: якщо знак операндів однаковий, а знак суми йому протилежний, то результат буде некоректним; у всіх інших випадках результат сумування правильний.

Під час виконання будь-яких арифметичних дій над операндами,

представленими у формі з плаваючою комою, операції, виконувані над мантисами й порядками (або характеристиками) цих чисел, різні. Тому

Page 40: Му арх 2012

40

перед початком будь-якої арифметичної процедури кожен з операндів розбивається на частини. Порядок (характеристика) відділяється від мантиси операнда, щоб можна було виконувати над ними окремі процедури. Після виконання арифметичної дії й процедури нормалізації результату його порядок і мантиса перетворюються у звичайний формат з плаваючою комою.

Таблиця 3.4 Приклади додавання чисел зі знаком у модифікованому коді

Прик-лад

Доданки й результат

Примітка

1 A=510= 00. 01012 B=310 = 00. 00112 A + B = 510 + 310 = 810

00. 0101 + 00. 0011

00. 1000 = 810

Результат коректний

2 А= -510 = - 01012 = 11. 0101 В = -810 = -10002 = 11. 1000 А + В = -1310

11. 1011 + 11. 1000

1 11. 0011 = -1310

Результат коректний

3 А =1310 = 0.1101 В =1310 = 0.1101 А + В = 2610

00. 1101 + 00. 1101

1010

Переповнення розрядної сітки

4 А =-1310 = -1101 В =- 910 = - 1001 А + В = -2210

11.0011 + 11.0111

10.1010 Після зсуву вправо отримаємо 11,01010 або - 10110

Переповнення розрядної сітки

У випадку алгебраїчного додавання порядки операндів

обов’язково мають бути однаковими. Тому на початку процедури додавання й віднімання чисел здійснюють (за необхідності) вирівнювання

Page 41: Му арх 2012

41

характеристик операндів. Для цього мантиса операнда з меншою характеристикою зсувається в розрядній сітці вправо з додаванням одиниці до його характеристики при кожному зсуві на один розряд. Ця процедура триває до тих пір, поки характеристики обох операндів не стануть рівними. Отримана таким чином характеристика, однакова для обох операндів, присвоюється як попередня результату операції. Далі здійснюють додавання або віднімання мантис за правилами, аналогічними для чисел з фіксованою комою, зокрема мантиса одного з операндів перетворюється в додатковий код, для того щоб процедуру віднімання звести до додавання. Якщо відповідь отримано в додатковому коді, то його перетворюють у прямий, оскільки мантиса числа з плаваючою комою – це модуль числа. Далі, за необхідності, виконують нормалізацію й округлення відповіді. У процесі нормалізації мантиса порозрядно зсувається вліво або вправо. При зсуві вліво на кожний розряд віднімається одиниця з характеристики, попередньо присвоєної відповіді. При кожному зсуві вправо – до неї додається одиниця. Зсув мантиси вправо необхідний у тих випадках, коли під час додавання мантис відбулося переповнення розрядної сітки. У ході цих операцій визначаються остаточні значення характеристики й мантиси відповіді.

Можливі два випадки денормалізації: 1) денормалізація вліво, яка відповідає переповненню розрядної

сітки; 2) денормалізація вправо, яка виникає, коли в прямому коді

мантиси після коми є один або кілька нульових розрядів. Наявність денормалізації вліво визначається тими самими

способами, що й переповнення розрядної сітки. Для денормалізації вправо характерне однакове значення розрядів мантиси по обидва боки від коми.

Спочатку розглянемо приклад додавання двох чисел, представлених у показовій формі A = (+ 0,10101·10101)2, B = (-0,11001·10011)2. Зрівняємо порядок другого числа до порядку першого – B = (-0,0011001·10101)2.

Далі сумуємо мантиси: + 0.1010100 - 0.0011001 + 0.0111011

Результат отримали в денормалізованій формі, оскільки в мантисі розряд, який іде за комою, має нульове значення. Прямий код додатної мантиси результату 0.0111011 має однакові, рівні 0, розряди по обидва боки від коми. Для нормалізації необхідно зсунути всі розряди мантиси вліво на один розряд і зменшити на одиницю значення порядку. Остаточно отримаємо +0.1110110·10100.

Page 42: Му арх 2012

42

Для двійкової системи числення найбільш відомими є такі основні способи виконання операції множення:

1) множення починаючи з молодших розрядів множника; 2) множення починаючи зі старших розрядів множника. У табл. 3.5 показано приклади.

Таблиця 3.5 Способи виконання операції множення

Множення починається з молодших розрядів множника

Множення починається зі старших розрядів множника

А=1101 (множене) В=1101 (множник) 1101

X 1101 1101 + 0000 1101 1101 (часткові добутки) 10101001 Результат

А=1101 (множене) В=1101 (множник)

1101 X 1101 1101 + 1101

0000 1101

10101001

Слід зазначити, що деколи при складанні програми слід дуже уважно відноситися до вибору типу даних, оскільки деколи внутрішнє представлення комп'ютера для абсолютно різних чисел виглядає однаковим.

Розглянемо найпростіший приклад вимагається виконати операцію складання двох змінних L1+L2=R. Подивіться, що вийти якщо L1=-1607 і L1=4294965689. L2=0. Тобто з погляду комп'ютера числа -1607 і 4294965689 мають одне і теж внутрішні уявлення – 0xFFFFF9b9, див. відповідно рис. 3.1 а і 3.1 б. Для порівняння на рис. 3.1 в показаний результат L1+L2=R для L1=489.

Внутрішні представлення чисел в комп'ютері можна подивитися запустивши відладчик, див. мал. 3.2. Результати внутрішнього представлення чисел -1607, 4294965689 і 489 можна подивитися на рис. 3.3. На рис. 3.3 г показано число 4294965689 у інженерному калькуляторі. Для -1607 Ви отримуєте той самий результат.

Листінг програми #include <vcl.h> #include <windows.h> #include <conio.h> #include <stdio.h>

Page 43: Му арх 2012

43

#pragma hdrstop #pragma argsused long int L1, L2, R; void main () { L1=-1607; L2=0; __asm{ MOV EAX, L1 ADD EAX, L2 MOV R, EAX } printf("%d", R); getch (); }

L1=-1607

L1=4294965689

L1=489

а) б) в) Рис. 3.1. Результат виконання програми

Рис. 3.2. Визів видладчика View -> Debug Windows -> CPU

Page 44: Му арх 2012

44

a) L1=-1607

б) L1=4294965689

в) L1=489

г)

Рис. 3.3. Результати внутрішнього представлення чисел

Зверніть увагу

Page 45: Му арх 2012

45

Хід виконання роботи 1. Повторити конспект (теоретичні відомості). 2. Задане базове число .4567,60.. YXYX

3. Додати та відняти від нього номер свого варіанта для цілої та дрібної частини відповідно.

4. Зробити протокол отримання внутрішнього представлення сля отриманих чисел. Див. приклади.

5. Скласти звіт по лабораторній роботі. Зробити висновки по роботі. Приклад. Задано. .4567,60.. YXYX Варіант №45.

Отримаємо 60.4567 Зробимо протокол для

+45 45=105.4612 105.4612 60.4567

-45 45=15.4522 -60.4567

+45 45= -15.4522 -60.4567

-45 45=105.4612

Крок 1. 105d -> 1101001b

04612d -> 0.01110110000100010011010000b Крок 2. 105.4612 ->1101001. 01110110000100010011010000b Крок 3. Нормалізоване число 105d -> 1101001b=1.101001b*26

04612d -> 0.01110110000100010011010000b= 1.110110000100010011010000b*2-2

105.4612 ->1101001. 01110110000100010011010000b= 1.101001.01110110000100010011010000b*26

Крок 4. Розпишімо отриману дріб по бітам. Характеристика = 7F+6=85 0 1000 0101 10100101110110000100010011010000 S 1 Далі розпишемо по тетрадам та у HEX коді. 0100. 0010. 1101. 0010. 1110. 1100. 0010. 0010. 0110. 1000.0 4 2 D 2 E C 2 2

Page 46: Му арх 2012

46

Лабораторна робота 4. Операції складання та віднімання у Assembler

Мета роботи: Вивчити команди складання та відіймання мови асемблер. Навчитися програмувати на асемблері із використовуванням команд складання.

Команди складання достатньо прості. Команда INC здійснює інкремент, тобто збільшення змісту операнда на одиницю, наприклад INC EAX або INC DWORD PTR [EBX]. Команда INC встановлює прапори, SF, ZF, AF, PF залежно від результату складання.

Команда ADD здійснює складання двох операндів. Результат складання поміщається в перший операнд (приймач). Наприклад, при виконанні команди ADD EBX,100 до вмісту регістра EBX додається число 100. після виконання команди результат знаходитиметься в регістрі EBX . Перший операнд може бути регістром або змінною. Другий операнд (джерело) – регістром, змінною або числом. Неможливо здійснювати операцію складання одночасно над двома змінними. Команда діє на прапори CF, SF, ZF, AF, PF. Її можна використовувати як для знакових, так і для беззнакових чисел. Все насправді залежить від нашої інтерпретації (який тип змінної ми розглядаємо), яка до речі, залежить від значень прапорів (див. приклад 1).

Команда XADD схожа на команду ADD, але з деякою відмінністю: вона заздалегідь переносить операнд - приймач в операнд - джерело, а потім результат складання поміщає в результат-приймач. Перший операнд може бути регістром і змінною, другої – тільки регістром. Дія на прапори аналогічна команді ADD.

Команда ADС здійснює складання двох операндів подібно команді ADD і прапора (біта) перенесення CF. За допомогою цієї команди можна здійснювати складання чисел, коли результат перевищує 32 біти або спочатку довжина операндів перевищує 32 біти. Припустимо, що перше число міститься в парі регістрів EDX:EAX, а друге число – в парі ЕСX:EBX. Тоді складання цих чисел можна представити парою команд: ADD EAX, EBX ADC EDX, ECX

Результат складання міститиметься в парі регістрів EDX:EAX. Для першої лабораторної роботи ми детально розглянемо

виконання прикладу у C++Builder 6(2007/2009) та Visual Studio 2008. Далі у роботах першого модулю ви можете обирати компілятор самостійно із урахуванням його особливостей.

Page 47: Му арх 2012

47

У якості компілятора обрано Visual Studio 2008. Відкриваємо Visual Studio 2008. Далі у вікні New Project оберемо Win32 Console Application (див. рис. 4.1).Далі оберемо ім’я для проекту, наприклад Ki.

Натисніть кнопку OK. У вікні Win32 Application Wizard натисніть кнопку Next (див. рис. 4.2).

Рис. 4.1. Вікно New Project

Рис. 4.2. Вікно Win32

Application Wizard

Дали у вікні Win32 Application Wizard оберіть Console Application

натисніть кнопку Finish (див. рис. 4.3). У вікні кодів (див. рис. 4.4) введіть наступні коди приклада.

Рис. 4.3. Вікно Win32

Application Wizard

Рис. 4.4. Вікно кодів

На рис. 4.5, 4.6 показані результати виконання програм відповідно у Visual Studio 2008 та C++Buildеr 2009.

Page 48: Му арх 2012

48

Зразок листінгу операцій додавання (VC++) #include "stdafx.h" #include <windows.h> #include <conio.h> #include <stdio.h>

int a,b,c; DWORD d,e,f; void main () { a=100; b=-200; f=0; d=0xffffffff; e=0x10; __asm{ MOV EAX, a ADD EAX, b MOV c, EAX MOV EAX, e ADD d, EAX ADC f,0 } printf("%d %x %x", c,f,d); getch (); }

Рис. 4.5. Результат виконання програми у Visual Studio 2005

Зразок листінгу операцій відіймання (C++Buildеr 2009) #include <vcl.h> #include <stdio.h> #include <iostream.h> #include <conio.h> #pragma hdrstop #pragma argsused int a,b,c; __int64 i,j,k; void main () { a=100; b=-200; i=0x1ffffffff; j=0x1fffffffb; _asm { //відіймання 32 - бітних чисел MOV EAX, a SUB EAX, b MOV c, EAX //відіймання 64 - бітних чисел MOV EAX, DWORD PTR i MOV EDX, DWORD PTR i+4 MOV EBX, DWORD PTR j MOV EСX, DWORD PTR j+4 SUB EAX,EBX SBB EDX,ECX MOV DWORD PTR k,EAX MOV DWORD PTR k+4,EDX } printf("%d %I64x",c,k); getch(); }

Рис. 4.6. Результат виконання програми

Page 49: Му арх 2012

49

Пояснення до одержаних результатів. На початку асемблерного коду виконується складання двох чисел

із знаком. При цьому b<0. Результат поміщуємо в змінну с і виводимо як знакове число – результат -100.

Друга дія – складання великих чисел. Значення d і e не перевищують 32-бітової межі, але результат не поміщається в ній. Тобто ми вимушені враховувати перенесення біта за 32-бітову межу. Це здійснюється за допомогою команди ADС f,0. Другий операнд рівний 0, і значення змінної f також спочатку рівне 0. Ми виводимо окремо старшу і молодшу частині 64-бітового числа, що вийшло. В результаті на екрані бачимо 1 f.

Команда декремент DEC зменшує вміст операнда (регістра або змінної) на 1. Вона впливає так само, як і інкремент на прапори, SF, ZF, AF, PF.

Команда SUB віднімає з лівого операнда правий і впливає на прапори CF, SF, ZF, AF, PF. Лівий операнд може бути регістром або змінною, правий – регістром, або числовою константою. Для команди байдуже, чи є числа знаковими чи ні.

Команда SBB аналогічна SUB, але додатково віднімає з приймача прапор CF. Її використовують для роботи з числами, довжина яких перевищує 32 біти.

Припустимо, що перше число міститься в парі регістрів EDX:EAX, а друге число в парі ЕСX:EBX. Тоді віднімання цих чисел можна представити парою команд: SUB EAX,EBX SBB EDX,ECX

Результат віднімання міститиметься в парі EDX:EAX. В першій частині діємо аналогічно операціям, виконаним в

першій лабораторній роботі. В другій частині прикладу (лістингу) використовуємо змінні,

мають тип __int64. Вони займають 8 байт, і компілятор С++ підтримує дії з ними. Для операцій на асемблері необхідно використовувати пари регістрів EDX:EAX і EСX:EBX. Таким чином, для того, щоб одержати результат віднімання, ми використовуємо пару команд – SUB/SBB.

Результат поміщається в змінну, що має тип __int64. Для завантаження 64-бітового числа доводиться використовувати

дві команди MOV, завантажуючи на початку молодшу, а потім старшу частину числа.

Хід виконання роботи 1. Повторити конспект (теоретичні відомості). 2. Отримати допуск до роботи.

Page 50: Му арх 2012

50

3. Отримати варіант завдання (табл. 4.1. Завдання під номером у таблиці).

4. Виконати операції x+y та x-y. 5. Скласти звіт по лабораторній роботі. 6. Зробити висновки по роботі. 7. Відповісти на запитання для самоперевірки.

Запитання для самоперевірки

1. Навести правила виконання операції складання у асемблері? 2. Поясніти призначення команд MOV, ADD, ADC. 3. У чому полягає відмінність програм у C++Builder та VС. 4. Навести правила виконання операції віднімання у асемблері? 5. Поясніти призначення команд SBB, SUB, DEC.

Таблиця 4.1

Варіанти завдань та початкові дані для лабораторної роботи Число Варіант

1 2 3 4 5

x 23 45 67 29 123 y 3 4 10 14 67 Число Варіант

6 7 8 9 10

X 223 225 145 67 29 Y 45 34 67 21 3 Число Варіант

11 12 13 14 15

X 89 99 112 45 35 Y 76 65 56 7 13 Число Варіант

16 17 18 19 20

X 67 341 455 234 809 Y 23 34 134 142 231 Число Варіант

21 22 23 24 25

X 76 234 223 467 534 Y 12 112 189 456 234

Page 51: Му арх 2012

51

Лабораторна робота 5. Операції множення та ділення у Assembler

Мета роботи: Вивчити команди множення та ділення мови асемблер. Навчитися програмувати на асемблері із використовуванням команд множення та ділення.

У відмінності від складання і віднімання множення чутливе до знака числа, тому існують дві команди множення: MUL – для множення без знакових чисел, IMUL – для множення чисел із знаком. В табл. Д.1 (додаток) описані формати цих команд. Розберемо їх докладніше.

Команда MUL. Єдиним операндом цієї команди може бути регістр або змінна. Тут важливий розмір цього операнда (джерела). Якщо операнд однобайтовий, то він множиться на AL, відповідно результат буде поміщений в регістр АХ, залежно від того, перевершує він один байт чи ні. Якщо результат не перевищує один байт, то прапори ОF і CF будуть рівні нулю, інакше 1. Якщо операнд двобайтовий, то він множиться на АХ, а результат буде поміщений в пару регістрів DX:AX (а не в EAX, як могло б показатися логічним). Відповідно якщо результат поміститься цілком в АХ, тобто вміст DX буде рівний 0, то нулю будуть рівні і прапори CF і ОF. Нарешті, якщо операнд - джерело матиме довжину чотири байти, то він множиться на EAX, а результат повинен бути поміщений в пару регістрів EDX:EAX. Якщо вміст EDX після виконання множення виявиться рівним нулю, то нульове значення буде і у прапорів ОF і CF. До речі, значення решти прапорів після виконання цієї команди не визначені.

Команда IMUL має три різні формату. Перший формат повністю аналогічний формату команди MUL. Зупинимося на двох інших форматах.

IMUL operand1,operand2 Operand1 повинен бути регістром, operand2 може бути числом, регістром або змінною. В результаті операції множення (operand1*operand2 і результат розміщається у operand1) можемо отримати число яке не поміститься у приймачі. У даному випадку прапори CF та OF будуть рівнятися 1, або 0 у противному випадку. IMUL operand1,operand2, operand3

У даному випадку operand2 (регістр або зміна) множиться на operand3 і результат розміщається у operand1. Якщо при виконанні множення виникає переповнення, то встановлюються прапори CF та OF.

Розглянемо наступні приклади. У якості компілятора обрано C++Builder.

Page 52: Му арх 2012

52

Зразок листінгу #include <vcl.h> #include <stdio.h> #include <iostream.h> #include <conio.h> #pragma hdrstop #pragma argsused DWORD a; __int64 b; int c,e; void main( ) { a=100000; c= -1000; __asm { //без знакове множення MOV EAX, 100000 MUL DWORD PTR a; MOV DWORD PTR b,EAX MOV DWORD PTR b+4, EDX //множення із знаком IMUL EAX, c, 1000 MOV e, EAX } printf(“%I64d %d” ,b,e); getch(); }

Рис. 5.1. Результат виконання програми

Пояснення до одержаного результату. При виконанні без знакового множення ми обрали два 32-бітних

числа. Результат операції повинен розміститися у парі регістрів EDX: EАX. Далі розмістимо значення цієї пари регістрів у 64-бітній змінній.

При виконанні знакового множення ми обрали формат з трьома операндами. Зміст змінної с множиться на 1000 та розміщається у регістрі EАX.

Ділення беззнакових чисел здійснюється за допомогою команди DIV. Команда має всього один операнд - дільник. Дільник може бути

Page 53: Му арх 2012

53

регістром або елементом пам'яті. Залежно від розміру дільника вибирається і ділиме 5

Дільник має розмір 1 байт. В цьому випадку ділиме поміщається в регістр АХ. Результат ділення (приватне) опиниться в регістрі AL, в регістрі ж АН буде залишок від ділення.

Дільник має розмір 2 байти. Результат операції буде поміщений в регістр АХ. Залишок від ділення – в регістр DX.

Команда знакового ділення IDIV повністю аналогічна команді DIV, і ми її окремо розглядати не будемо. Істотно, що для команд ділення значення прапорів арифметичних операцій не визначені. В результаті ділення може виникнути або переповнювання, або ділення на 0. В цьому випадку виникає так зване виключення - буде викликана спеціальна процедура, яка і повинна обробити виниклу ситуацію. Таку обробку повинна забезпечити операційна система.

Розглянемо наступний приклад. У якості компілятора обрано C++Builder. Зразок листінгу #include <vcl.h> #include <stdio.h> #include <iostream.h> #include <conio.h> #pragma hdrstop #pragma argsused DWORD a,b,c; void main( ) { a=100000; __asm{ //без знакове ділення MOV EAX, a MOV EDX, 0 MOV EBX, 20 DIV EBX MOV b, EAX; //частка MOV c, EDX; //залишок } printf(“% d % d ”,b,c); getch(); }

Page 54: Му арх 2012

54

Рис. 5.2. Результат виконання програми

Хід виконання роботи 1. Отримати варіант завдання (табл. 5.1. Завдання під номером у

таблиці). 2. Виконати операції x*y та x/y. 3. Скласти звіт по лабораторній роботі. Зробити висновки по роботі. 4. Відповісти на запитання для самоперевірки.

Запитання для самоперевірки 1. Навести правила виконання операції множення та ділення у

асемблері? 2. Поясніти призначення команд MUL, IMUL.

Таблиця 5.1. Варіанти завдань та початкові дані для лабораторної роботи

Число Варіант

1 2 3 4 5

x 100 1000 2000 2500 100 y -4 -2 -100 -10 5 Число Варіант

6 7 8 9 10

X 2400 2200 440 160 300 Y -4 4 4 -8 -5 Число Варіант

11 12 13 14 15

X 280 210 1000 2450 2350 Y -40 -3 -50 -2 -50 Число Варіант

16 17 18 19 20

X 16700 2400 1354 2140 111 Y -10 4 2 -2 -11 Число Варіант

21 22 23 24 25

X 760 5234 930 27 7000 Y -20 -20 -30 -3 -70

Page 55: Му арх 2012

55

Лабораторна робота 6. Адресація та команди пересилки даних у Assembler

Мета роботи: Вивчити команди адресації та пересилки даних. Навчитися програмувати на асемблері із використовуванням команд адресації та пересилки даних.

Основне навантаження при роботі комп'ютера лягає на два пристрої: процесор і пам'ять. Процесор виконує команди, що зберігаються в пам'яті. Окрім цього в пам'яті ж зберігаються і дані. Між процесором і пам'яттю відбувається безперервний обмін інформацією. Процесор має свою невелику пам'ять, що складається з регістрів. Команда процесора, що використовує дані, що знаходяться в регістрах, виконується багато швидше за аналогічні команди над даними в пам'яті. Тому часто, для того, щоб виконати яку-небудь команду, дані для неї заздалегідь поміщають в регістри. Результат команди при необхідності можна помістити назад в пам'ять. Обмін даними між пам'яттю і регістрами здійснюють команди пересилки. Окрім цього можна обмінюватися даними між регістрами, посилати і одержувати дані від зовнішніх пристроїв. Нарешті, в регістр і елемент пам'яті можна посилати безпосередній операнд – число. Окрім цього є команди, за допомогою яких можна поміщати і витягувати дані із стека.

У наступному прикладі представлені команди пересилки даних. У якості компілятора обрано C++Builder. Зразок листінгу #include <vcl.h> #include <stdio.h> #include <conio.h> #include <iostream.h> #include <windows.h> #pragma hdrstop DWORD a, b, c, d, e, f, g, h; void main() { f = 200; __asm { MOV a,100 MOV EAX,100 MOV b,EAX

Page 56: Му арх 2012

56

//застосування косвеної адресації LEA EBX,c MOV DWORD PTR [EBX],EAX //застосовуємо стек //зміст EAX – опиняється в е, число 100 в d PUSH EAX PUSH 100 POP d POP e //команда XCHG (обмін змісту операндів), //зміст f перейде в g XCHG EAX,f XCHG g,EAX //складання з попереднім обміном операндів MOV EBX,50 MOV EAX,20 XADD EAX,EBX MOV DWORD PTR h,EBX // сума в EAX, а число 20 в h } printf("%u %u %u %u %u %u %u %u", a, b, c, d, e, f, g, h); } //--------------------------------------------------------------------------- //---------------------------------------------------------------------------

Рис. 6.1. Результат виконання програми

Пояснення до одержаного результату. Як видно з програми, командою пересилки даних є MOV. Ця

команда багатолика. За допомогою неї можна обмінюватися даними між регістрами, наприклад, так MOV EAX,EDI (вміст регістра EDI посилається в регістр EAX). Можна безпосередньо передати дані в регістр або елемент пам'яті. Команда MOV а,100 посилає елемент пам'яті, визначуваний змінній а, число 100.

В прикладі використовується непряма адресація пам'яті. Якщо адреса елемента пам'яті міститься в регістрі, наприклад EDX, то, для того, щоб послати туди число, потрібно просто записати MOV BYTE PTR

Page 57: Му арх 2012

57

[EDX],100. Префікс BYTE PTR указує, що в операції бере участь однобайтовий елемент пам'яті. Можна використовувати також префікси WORD PTR, для слова DWORD PTR для подвійного слова. Чи є різниця між командами MOV BYTE PTR [EDX],100 або MOVWORD PTR [EDX],100? В першому випадку число поміщається в однобайтовий елемент пам'яті. В другому адреса, вказана в EDX, розглядається як адреса подвійного осередку — слова. Адресою слова і подвійного слова вважається адреса його молодшого байта. Число 100 в цьому випадку сприймається асемблером як двобайтове число, у якого молодший байт рівний 100, а старший 0. Таким чином, остання команда посилає в молодший байт слова число 100, а в старший — число 0. Префікс опускається в тому випадку, якщо для транслятора і так ясно, з яким числом він має справу. Наприклад, команду MOV EAX,DWORD PTR mem (mem —адрес елементи пам'яті) можна замінити на команду MOVEAX, mem, оскільки лівий операнд має цілком однозначно чотирьох байтову довжину. Якщо ви збираєтеся використовувати операнд, вказуючий на деяку область пам'яті, згідно його визначенню (наприклад, якщо операнд заданий як BYTE), то явну вказівку типу операнда в команді також можна опустити. Проте якщо враховувати читаність програми, то краще завжди указувати в команді, який тип операнда мається на увазі.

У фрагменті де використовується стек команда PUSH поміщає в стек чотирьохбайтове число, а команда РОР дістає число звідти. А оскільки стек побудований за принципом «першим прийшов — останнім пішов», те число, що міститься в регістрі ЕАХ, опиниться в змінній е, а число 100 опиниться в змінній d.

Команда LEA використовується в програмі для отримання адреси змінної. В загальному випадку вона має формат LEA reg,mem, де reg — це деякий 16- або 32-бітовий регістр, а mem —это вираз, який визначає деяку адресу пам'яті. В нашому прикладі як цей операнд виступала просто змінна, адреса якої завантажувалася в регістр.

У наступному прикладі розглянуті способи адресації пам’яті . У якості компілятора обрано Visual Studio 2008. Зразок листінгу #include "stdafx.h" #include <windows.h> #include <conio.h> #include <stdio.h> BYTE ar[6] = {1,12,128,50,200,10}; BYTE a,b,c,d; WORD e;

Page 58: Му арх 2012

58

DWORD f; void main() { __asm { MOV AL,BYTE PTR ar MOV a,al LEA EBX,ar MOV AL,BYTE PTR[ EBX] MOV b,AL MOV AL,BYTE PTR [EBX]+3 MOV c,AL MOV EDX,1 MOV AL,BYTE PTR [EBX][EDX]+2 MOV d,AL MOV AX,WORD PTR [EBX]+2 MOV e,AX MOV EAX,DWORD PTR [EBX]+2 MOV f,EAX } printf("%u %u %u %u %u %u",a,b,c,d,e,f); getch (); }

Рис. 6.2. Результат виконання програми

Пояснення до одержаного результату. Весь приведений приклад побудований в основному на непрямій

адресації. В непрямій адресації використовується один з регістрів загальної назви. В даному випадку застосовується регістр ЕВХ, але може бути використаний будь-який інший регістр (див. додаток 1). Формат команди такий, що можна міняти адресу елемента пам'яті, не міняючи вміст самого регістра: [EBX]+2. В даному випадку результуюча адреса виходить шляхом складання адреси, що зберігається в регістрі ЕВХ, і числа 2. Для зміни адреси обігу можна використовувати і інший регістр: [EBX] [EDX]+2. В цьому випадку результуюча адреса виходить шляхом складання вмісту регістра ЕВХ, регістра EDX, а також числа 2. До речі, вираз [EBX] [EDX]+2 можна замінити і на [EBX+EDX+2].

Page 59: Му арх 2012

59

Слід зазначити наступне: той адресний простір і пам'ять, яку ми охоплюємо, є власністю

тільки нашої програми. Тут немає місця для інших програм. Але і ми не можемо вийти за рамки відведеної нам області і звернеться до коду іншої програми або області пам'яті, зайнятої ядром операційної системи;

реальна адреса формулюється не тільки з 32-бітової величини, яку ми використовуємо, але і за допомогою сегментних регістрів. Сегментні регістри містять так звані селектори сегментів. За допомогою цих селекторів і спеціальної таблиці визначається адреса сегменту, при цьому та адреса, яку використовуємо ми, відіграє роль зсуву в цьому сегменті. Але все це для нас залишається за кадром, і, програмуючи в Windows, ми і не підозрюємо про те, як реально формується адреса. Непряму адресацію, наприклад, в команді МОV ЕАХ, [EBX]

називають ще адресацією по базі. База в даному випадку зберігається в регістрі ЕВХ. Далі адресація в команді МОV ЕАХ [EBX]+10 називається адресацією по базі із зсувом. Адресація з використанням другого регістра, наприклад MOV EAX, [EBX] [EDI], називається адресацією по базі з індексацією. У принципі, роль індексного регістра в даному випадку може грати і регістр EDI і регістр EBX.

Завдання. Застосовуючи непряму адресацію

здійснити обмін даних між регістрами EDI та ЕАХ.

Хід виконання роботи 1. Повторити конспект (теоретичні відомості). 2. Отримати допуск до роботи. 3. Вивчити команди пересилки даних. 4. Скласти звіт по лабораторній роботі. 5. Зробити висновки по роботі. 6. Відповісти на запитання для самоперевірки.

Запитання для самоперевірки

1. Навести правила виконання операції пересилки даних у асемблері?

2. Поясніти призначення команд MOV, PUSH, POP, LEA.

Page 60: Му арх 2012

60

Лабораторна робота 7. Робота із стеком

Мета роботи: Вивчити команди для роботи із стеком.

Стек – це структура даних. Вона підтримується на рівні процесора, по-перше, наявністю двох регістрів ESP і EPB, по-друге, наявністю двох команд PUSH (покласти в стек), POP (дістати із стека). Окрім цього, безпосередньо стек використовують команди CALL (виклик процедури), REТ (повернення з процедури), ENTER (організація стека при вході в процедуру), LEAVE (відновлення стека після команди ENTER), а так само команда INT (виклик переривання) і IRET (повернення з переривання). Розглянемо як функціонують команди PUSH і POP.

Розглянемо схему надану на рис. 7.1. Як видно з рисунка, за один раз за допомогою команди PUSH в стек можна помістити чотирьохбайтовий операнд (див. приклад і коментар до нього), при цьому вміст регістра ESP зменшується на 4. Регістр ESP називають ще покажчиком стека, він вказує на останній поміщений в стек елемент.

На рис. 7.2 представлена схема функціонування команди POP. Команда дістає із стека чотирьохбайтову величину, при цьому вміст регістра ESP збільшується на 4.

Рис. 7.1. Дія команди PUSH Рис. 7.2. Дія команди POP

4 байта

Команда PUSH поміщає в стек 4 байта

Стек зростає у бік менших адрес

Вершина стеку

після

PUSH

Вершина стеку

до

команди

PU

SH

4 байта

Команда POP витягує із стеку 4 байта

Стек зменшується у бік менших адрес

Вершина стеку

до P

OP

Вершина

стеку

після

ком

анди

PO

P

Page 61: Му арх 2012

61

Приклад. У якості компілятора обрано Visual Studio 2008. Зразок листінгу #include "stdafx.h" #include <windows.h> #include <conio.h> #include <stdio.h> DWORD a,b,c,d,e; WORD f; void main () { _asm { MOV EAX, 10001H MOV a, ESP //розмістимо у стеку чотири байта PUSH EAX MOV d, ESP POP c // розмістимо у стеку два байта PUSH AX

MOV d, ESP POP f

//доступ к стеку через регістр ESP PUSH 200002H //додамо у стек константу MOV EAX, [ESP] MOV e, EAX POP EAX }; printf("%u %x %u %u %x", a-b, c, a-d, f, e); getch (); }

Рис. 7.3. Результат виконання програми

Пояснення до одержаного результату. Отже, виходячи з програмного коду, можна зробити висновок, що

за допомогою команд POUSH/POP можна маніпулювати операндами, розташованими в пам'яті. Окрім цього, в стек можна поміщати і

Page 62: Му арх 2012

62

безпосередньо чотирьохбайтове число (сподіваюся, ви розумієте, що, скажімо, команда PUSH 30H в дійсності означає PUSH 00000030H, іншими словами, в стек буде поміщено чотири байти, з яких тільки молодший містить ненульове значення).

Як видно з прикладу, доступ до операнда, знаходиться в стеку, можна дістати не тільки за допомогою стандартної команди POP, але і використовуючи регістр ESP, при цьому сама структура стека не буде змінена.

За допомогою нашого прикладу бачимо, що при відправці в стек двобайтових регістрів (наприклад, АХ) значення стекового регістра змінюється тільки на 2. При цьому ми повинні самі відстежувати чотирьох байтові і двобайтові операції із стеком, щоб не привести до краху нашу програму (наприклад, так PUSH АХ.../...POP EBX) Можливо використовування ще двох дуже важливих команд: PUSHAD і POPAD. Перша команда поміщається в стек відразу всі основні регістри процесора (EAX, ЕСX, EDX,EBX, ESP, EBP, EBI, EDI) у вказаному порядку. Відповідно POPAD витягує звідти значення вказаних регістрів в зворотному порядку. Що стосується ESP, те значення регістра поміщається до того, як воно буде змінено командою (зменшено на 8*4=32). Завдання. Нижче наведено листінг програми яка ілюструє роботу із стеком, виводячи на екран літери А - Z. Знайдіть помилку. #include <vcl.h> #pragma hdrstop #include <iostream.h> #pragma argsused #include <vcl.h> #pragma hdrstop #include <iostream.h> #pragma argsused int main(int argc, char* argv[]) { char letter='A'; char stop='Z'; start: asm { mov ah, letter mov al, stop

Page 63: Му арх 2012

63

cmp aс, al jle print jmp exit } print: cout<<letter; letter++; cout<<""; goto start; exit: cout<<"r"; cin>>"r"; return 0; }

Хід виконання роботи 1. Повторити конспект (теоретичні відомості). 2. Отримати допуск до роботи. 3. Вивчити команди для роботи із стеком. 4. Застосовуючи команди роботи зі стеком виконати завдання. 5. Скласти звіт по лабораторній роботі. 6. Зробити висновки по роботі. 7. Відповісти на запитання для самоперевірки.

Запитання для самоперевірки 1. Навести правила виконання операції зі стеком у асемблері? 2. Поясніти призначення команд PUSH, POP, PUSHAD і POPAD.

Лабораторна робота 8. Маніпуляція над бітами

Мета роботи: Вивчити команди для роботи з бітами. Навчитися писати програми для роботи з окремими бітами на мові програмувати асемблер.

Більшість команд процесора впливають на окремі біти або

залежить від них. Наприклад, команда множення IMUL враховує біт знака, а команда складання ADD впливає на біт перенесення регістру прапорів (CF). В даній лабораторній роботі ми розглянемо команди, які безпосередньо діють на біти.

Page 64: Му арх 2012

64

Біт може приймати два значення: 0 або 1. Процесор Intel має чотири команди, відповідні логічним операціям.

Команда AND має наступний формат AND operand1, operand2. Обидва операнди команди повинні бути однакового розміру і не можуть одночасно бути змінними. Спочатку операція здійснюється над кожною парою відповідних бітів операндів, а потім результат операції поміщається в operand1. Основне призначення команди AND — вибіркове обнуління бітів. Після виконання команди AND прапори OF і CF завжди рівні 0, SF, ZF і PF встановлюються згідно результату операції, а прапор AF не визначений.

Формат команди OR аналогічний формату команди AND. Команда використовується для вибіркової установки окремих бітів. Наприклад, OR AL, 1 встановлює нульовий біт регістра AL і не зачіпає інші. Дія на прапори даної команди така ж, як і у команди AND.

Команда XOR цікавіше двох попередніх. По-перше, помітимо, що в результаті операції XOR ЕАХ, ЕАХ в регістрі ЕАХ виявляється 0. Багато програмістів вважають за краще саме так обнулювати регістри, оскільки це діє швидше за команду MOV. По-друге, за допомогою команди XOR можна здійснювати найпростіше шифрування рядка. Дійсно, легко показати, що в результаті двох команд XOR ЕАХ, ЕВХ і XOR ЕАХ, ЕВХ зміст регістру ЕAX не зміниться — перша команда XOR шифрує дані, друга розшифровує.

Команда NOT- це унарна команда. Вона інвертує кожний біт єдиного операнду. Дана команда ніяк не впливає па прапори.

До чотирьох перерахованих команд слід додати команду TEST, яка повністю еквівалентна команді AND, але вона не міняє змісту операндів. Ця команда використовується для визначення наявності в операнді тих або інших бітів.

Команда ВТ має наступний формат - ВТ operandl,operand2. В загальному випадку ця команда бере біт з operand1 з номером з

operand2 і переносить його в CF. Якщо operand1 є регістром, тоді номер біта не може перевищувати розмір регістру. Інакше береться залишок від ділення номера на розмір регістру. Якщо operand1 є змінною, то його розмір може не братися в розрахунок і номер визначається вмістом operand2.

Група команд BTS, BTR, BTC. BTS operand1, operand2 — установка біта. BTR operand1,operand2 — скидання біта. BTC operand1,operand2 — інверсія біта. Всі три команди перед зміною біта зчитують їх в CF. Команди сканування бітів BSF і BSR мають наступний формат:

Page 65: Му арх 2012

65

BSF operand1, operand2 — прямий пошук біта (починаючи з молодшим).

BSR operand1, operand2 — зворотний пошук біта (починаючи із старшим).

Команди сканують operand2 (регістр або змінна) і записують в operand1 (регістр) номер першого одиничного біта. Якщо джерело рівне 0, то встановлюється прапор ZF, інакше він завжди скидається.

Операції зсуву Всі операції зсуву здійснюють зсув бітів в операнди на певне

число двійкових розрядів, див рис. 8.1. SHR operand1, operand2 – логічний зсув праворуч. SHL operand1, operand2 – логічний зсув вліво. SAL operand1, operand2 – арифметичний зсув вліво. SAR operand1, operand2 – арифметичний зсув праворуч. Зсув здійснюється в operand1, який може бути регістром або

зміною (розрядність 8, 16, 32), в operand2 міститься кількість розрядів, на яку потрібно здійснити зсув. Як operand2 може бути конкретне число, або регістр CL, в якому враховується тільки 5 перших розрядів.

Рис. 8.1. Команди зсуву

Як видно з рис. 8.1, команди SAL і SHR виконують фактично одну

і ту ж операцію зсуву вліво. При цьому старші біти заносяться в CF, а молодші біти заміщаються нулями. Команда SHR аналогічна SHL, але реалізує зсув праворуч, відповідно заміщення нулями відбувається, починаючи із старшими бітами, а молодші біти проходять через прапор

0

CF

SHR

SHL/SAL

SAR

CF0

0

0 CF

0

Page 66: Му арх 2012

66

CF. Команда SAR дещо відрізняється від попередніх команд. Зсув відбувається праворуч, але при цьому здійснюється дублювання старшого біта.

Приклад використовування операцій зсуву для знаходження значення функції (Visual Studio 2008). Зразок листінгу // обчислення значення функції а*5+b/8 #include <windows.h> #include <conio.h> #include <stdio.h> DWORD a,b,c; void main () { a=55; b=1000; __asm { SHR b,3 ; обчислюємо b/8 MOV EAX,a SHL EAX,2 ; обчислюємо a*4 ADD EAX, a ; обчислюємо a*4+a ADD EAX, b MOV c, EAX } printf ("%d", c); getch( ); }

Рис. 8.2. Результат виконання програми

Пояснення до одержаного результату. Зсув на один біт праворуч еквівалентний беззнаковому діленню

на 2, а зсув на один біт вліво – беззнаковому множенню на 2. Зсув на n біт еквівалентний множенню або діленню на 2n.

В тих випадках, коли множення відбувається на число, що не представляється ступенем двійки, то воно зводиться до складання і зсуву. Наприклад, в нашому випадку множення на 5 можна представити сумою цього числа і числа, помноженого на 4, тобто на квадрат двійки.

Як ми бачили, основним прапором в перерахованих командах є прапор CF. Окрім цього, прапори SF, ZF, PF змінюється відповідно до результату. Прапор AF не визначений. Прапор ОF не визначений для зсувів на кількість біт, більших 1. При зсуві на один розряд: команди

Page 67: Му арх 2012

67

SAL/SHL встановлюють ОF в 1, якщо після зсуву старший біт змінився, і в 0, якщо старший біт не змінився. SAR встановлює ОF в 0, SHR в значенні старшого біта початкового числа.

Хід виконання роботи 1. Отримати варіант завдання (табл. 8.1. Завдання під номером у

таблиці). Знайти значення функції. 2. Скласти звіт по лабораторній роботі. Зробити висновки по роботі.

Таблиця 8.1 Варіанти завдань та початкові дані для лабораторної роботи

Вираз Варіант

1 2 3 4 5

а*4+b/7 а=5 b=700

а*4+b/3 а=50 b=900

а*4-b/7 а=50 b=70

а*9-b/6 а=50 b=600

а*2+b/2 а=500 b=100

Вираз Варіант

6 7 8 9 10

а*2-b/2 а=500 b=200

а*6+b/2 а=100 b=100

а*9-b/2 а=50 b=100

а*4-b/2 а=600 b=100

а*3+b/5 а=500 b=100

Вираз Варіант

11 12 13 14 15

а*10-b/5 а=5 b=100

а*6+b/10 а=50 b=100

а*4-b/10 а=50 b=200

а*6-b/7 а=500 b=70

а*8+b/10 а=5 b=700

Вираз Варіант

16 17 18 19 20

а*4-b/5 а=100 b=500

а*3+b/2 а=100 b=200

а*7-b/5 а=50 b=100

а*2-b/2 а=50 b=100

а*а-b/2 а=60 b=100

Вираз Варіант

21 22 23 24 25

а*а+b/2 а=6 b=10

а*а+b/а а=6 b=60

2*а*а+b/а а=8 b=80

а+b/а а=6 b=600

b/а + а а=7 b=70

Page 68: Му арх 2012

68

Лабораторна робота 9. Операції з рядками

Мета роботи: Вивчити команди асемблера для роботи з рядками. Навчитися виконувати на асемблері операції над ланцюжками байтів.

Операції з рядками називають ще цілочисельніми або операціями

над ланцюжками байтів. Ці операції працюють з одним елементом рядка: байтом, словом, подвійним словом. Для того, щоб команда маніпулювала послідовністю таких елементів, використовуються команди-префікси. Всього є п'ять таких префіксів:

REP – повторювати, доки зміст ЕСX не звернеться у 0; REPE/REPZ – повторювати доки рівно/нуль. Даний префікс

примушує виконувати рядкову команду до тих пір, поки зміст ЕСX не звернеться у 0 або поки прапор ZF=1;

REPNE/REPZ – повторювати доки не рівно/не нуль. Даний префікс примушує виконувати рядкову команду до тих пір, поки вміст ЕСX не звернеться в 0 або поки прапор ZF=0.

Команди для роботи з рядками вважають, що рядок-джерело знаходиться за адресою DS:ESI (або просто ESI), а рядок-приймач (якщо вона передбачається в команді) за адресою ES:EDI (EDI). (В плоскій моделі пам'яті сегментні регістри явно не беруть участь в адресації.)

Всі команди для роботи з рядками можна розділити на шість груп. Команди пересилки MOVSB – копіювання рядка байтів. MOVSW – копіювання рядка слів. MOVSD – копіювання рядка подвійних слів. Команди порівняння CMPSB – порівняння рядків байтів. CMPSW – порівняння рядків слів. CMPSD – порівняння рядків подвійних слів. Команди пошуку (сканування) SCASB – сканування рядка байтів. SCASW – сканування рядка слів. SCASD – сканування рядка подвійних слів. Команди читання з рядка LODSB – читання байта з рядка. LODSW – читання слова з рядка. LODSD – читання подвійного слова з рядка.

Page 69: Му арх 2012

69

Команди запису в рядок STOSB – запис байта в рядок. STOSW – запис слова в рядок. STOSD – запис подвійного слова в рядок. Команди читання/запису рядка з порту IN AL(AX,EAX), Port – запис у порт. OUT port, AL – вивід з порту

Розглянемо наступний приклад (C++Builder). #include <vcl.h> #include <stdio.h> #include <iostream.h> #include <conio.h> #pragma hdrstop #pragma argsused DWORD lens (char *); void cats (char *, char *, char *); char a [] = "abcwwdfdfsdf"; char b [] = "1234"; //рядок-буфер char c [] =" "; void main ( ) { __asm { //виклик функції для злиття двох рядків LEA EAX, c PUSH EAX LEA EAX, b PUSH EAX LEA EAX, a PUSH EAX CALL cats //звільняємо стек від трьох параметрів ADD ESP, 12 } printf ("%s\n",c); getch(); } //функція визначення довжини рядка DWORD lens (char * s)

Page 70: Му арх 2012

70

{ DWORD l=0; __asm { //задати напрям сканування (скинути прапор DF) CLD //адреса рядка в EDI MOV EDI, s //запам'ятати початок рядка MOV ESI, EDI //довжина рядка обмежується максимальним 32-бітовим числом MOV ECX, 0FFFFFFFFH //шукатимемо 0 XOR AL, AL //сканувати, поки не зустрівся 0 REPNE SCASB //довжина рядка в EDI SUB EDI, ESI //виключити з довжини термінальний символ DEC EDI MOV l, EDI } return l; } // функція злиття рядків s1+s2->s3 void cats (char * s1, char * s2, char * s3) { __asm { //задати напрям копіювання CLD MOV EDI, s3 MOV EDI, s1 //визначити довжину рядка s1 PUSH ESI CALL lens //звільняємо стек ADD ESP,4 //довжина рядка в ЕСX MOV ECX, EAX

Page 71: Му арх 2012

71

//скопіювати s1->s3 REP MOVSB MOV ESI,s2 //визначити довжину рядка s2 PUSH ESI CALL lens //звільняємо стек ADD ESP,4 //довжина рядка і ЕСХ MOV ECX, EAX //скопіювати s2->s3 REP MOVSB //фіксуємо кінець рядка MOV BYTE PTR [EDI], 0 } getch(); }

Пояснення до одержаного результату. Ця програма - приклад застосування цілочисельних команд для

створення двох функцій, що виконують операції над рядками lens і cats. Перша визначає довжину рядка, друга здійснює злиття двох рядків. Використовуються дві цілочисельні команди: SCANSB – для пошуку кінця рядка у функції lens, MOVSB – для копіювання одного рядка в іншу у функції cats. З командою SCANSB вживається префікс REPNE, який дозволяє шляхом порівняння елементів рядка з AL (в даному випадку) знайти її кінець, тобто нульовий байт. Зміст ЕСХ ми беремо найбільший, щоб він не перешкоджав знайти кінець навіть у найдовшого рядка. У випадку з командою MOVSB ми використовуємо префікс REP, оскільки єдиним критерієм закінчення операції повинне бути повне копіювання рядка, довжина якої поміщена в ЕСХ. Завдання. Використовуючи команди для роботи з рядками визначити довжину рядка який складається з прізвища та ім’я студента вашої групи.

Хід виконання роботи 1. Повторити конспект (теоретичні відомості). 2. Отримати допуск до роботи. 3. Вивчити команди для роботи з рядками. 4. Застосовуючи команди роботи з рядками виконати завдання. 5. Скласти звіт по лабораторній роботі.

Page 72: Му арх 2012

72

6. Зробити висновки по роботі. 7. Відповісти на запитання для самоперевірки.

Запитання для самоперевірки

1. Навести правила виконання операції з рядками у асемблері? 2. Поясніти призначення команд CMPSB, CMPSW, CMPSD, SCASB,

SCASW, SCASD,LODSB,LODSW.

Лабораторна робота 10. Використовування команд математичного сопроцесора

Мета роботи: Вивчити команди асемблера для роботи з математичним сопроцесором.

Базові команди математичного сопроцесора наведені у таблиці додатку 2. Нижче наведено приклади програм які відповідно допомагають знайти квадратний корінь числа, вивести таблицю функції, та розв’язати квадратне рівняння.

Приклад 1. (Знайти 0.55 ). У якості компілятора обрано Visual Studio 2008. #include "stdafx.h" #include <windows.h> #include <conio.h> #include <stdio.h> double x,y; void main() { x=55.0; __asm{ //Ініціалізуемо сопроцесор FINIT // Розміщуємо число у стек FLD x // Знаходимо корінь FSQRT // Результат розмістимо у змінній у FST y }

Page 73: Му арх 2012

73

printf ("%f\n", y); getch (); }

Рис. 10.1. Результат виконання програми

Пояснення до одержаного результату. Робочі регістри сопроцесора мають стекову структуру. Усі

однооперандні команди виконуються над числом яке знаходиться на вершині стеку (ST(0)). При цьому результат цієї операції розміщують у цієї же вершині стеку. Двохоперандні команди використовують зміст двох верхніх елементів стеку (ST(0) та ST(1)), а результат розміщують замість одного із них.

Приклад 2. Розв’язання квадратного рівняння. У якості

компілятора обрано Visual Studio 2008. Зразок листінгу #include "stdafx.h" #include <windows.h> #include <conio.h> #include <stdio.h> double a,b,c, x1,x2,k1,k2; void main() { a=1; b=2; c=-3; k1=2; k2=4; __asm { //Ініціалізуемо сопроцесор FINIT // Переверяємо коеф. а FLD a // Розмістимо "0" на вершині стеку FLDZ //Порівняння FCOMP

Page 74: Му арх 2012

74

FSTSW AX SAHF //Якщо "0", то кінець JZ finish //Знаходимо дискрімінант квадратного рівняння FMUL k2 FMUL c FCHS FLD b FMUL b FADD FLDZ //Переверяємо чи дискрімінант рівняння не є мешьшим за "0" FCOMP FSTSW AX SAHF //Якщо дискрімінант меньше "0", то кінець JNC finish //Квадратний корень дискрімінанту FSQRT FST k2 //Обчислюємо а*2 FLD a FMUL k2 FST k1 //Знаходимо х1 FLD b FCHS FADD k2 FDIV k1 FST x1 //Знаходимо х2 FLD b FCHS FSUB k2 FDIV k1 FST x2 } printf ("x1=%f x2=%f", x1,x2); __asm finish: getch(); }

Page 75: Му арх 2012

75

Рис. 10.2. Результат виконання програми

Хід виконання роботи

1. Отримати варіант завдання (табл. 10.1. Завдання під номером у таблиці). Знайти значення функції.

2. Скласти звіт по лабораторній роботі. Зробити висновки по роботі. Запитання для самоперевірки

1. Застосування команд математичного сопроцесора. 2. Поясніть призначення команд FINIT, FLD, FST, FMUL, FSIN,

SAHF, FCOMP.

Таблиця 10.1 Варіанти завдань та початкові дані для лабораторної роботи

Варіант

1 2 3 4 5

Вираз

sin(а*4) +b/7 а=5.1 b=70.2

а*4 +sin (b)/3 а=50.2 b=9.3

sin(а*4) -b/7 а=50.3 b=70.1

cos(а*9)-b/6 а=1.2 b=6.2

а*2+ cos(b/2) а=5.1 b=1.3

6 7 8 9 10 Вираз

cos(а*2) -b/2 а=5.34 b=2.1

sin(а*6) +b/2 а=1.2 b=10.2

а*9- cos(b/2) а=50.1 b=10.3

а*4-sin(b/2) а=6.1 b=11.2

sin(а*3)+ b/5 а=5.3 b=11.2

11 12 13 14 15 Вираз

а*10-sin(b/5) а=51.2 b=10.2

cos (а*6) +b/10 а=50.1 b=10.2

а*4 - sin b/10) а=1.5 b=6.2

а*6 - cos (b/7) а=3.5 b=4.7

sin(а*8) +b/10 а=5.2 b=7.5

16 17 18 19 20 Вираз

а*4- cos (b/5) а=1.3 b=2.5

sin(а*3) +b/2 а=10.2 b=-20.1

sin(а*7)- b/5 а=5.2 b=1.2

а*2- cos(b/2) а=-5.2 b=10.1

а*а - cos (b/2) а=6.2 b=10.12

21 22 23 24 25 Вираз

а*cos(а)+ b/2 а=6.2 b=10.1

а*sin(а)+b/а а=6.4 b=6.03

2*а*а+ sin(b/а) а=8.09 b=80.12

а+ sin(b/а) а=6.89 b=600.3

b/а + sin(а) а=7.09 b=70.1

Page 76: Му арх 2012

76

СПИСОК ЛІТЕРАТУРИ

1. Пройдо В.Л., Ильина О.П. Архитектура ЭВМ и систем: Учебник для вузов. - СПб.: Изд-во "Питер", 2006. - 718 с. 2. Мюллер С., Зекер К. Модернизация и ремонт ПК. Пер. с англ. - К.; М.; СПб.: Издательский дом "Вильямс", 2002. - 992 с. 3. Рудометов Е., Рудометов В. Аппаратные средства и мультимедиа: Справочник. - СПб.: Питер-Ком, 2003. - 352 с. 4. Гук М. Интерфейсы ПК: Справочник. - СПб.: Питер-Ком, 1999. - 416 с. 5. Борзенко А. IBM PC: устройство, ремонт, модернизация. - М.: ТОО "КомпьютерПресс", 1996. - 344 с. 6. Нортон П. Программно-аппаратная реализация IBM PC: Пер. с англ. - М.: "Радио и связь", 1991. - 328 с. 7. М.А. Карцев. Арифметика цифровых машин. М.: Наука. 1969.- 134 с. 8. Пирогов В.Ю. Программирование на Visual C++. – СПб.: БХВ-2003.-424 с. 9. Архангельский А.Я. Программирование в C++Builder 6.-M.:ЗАО «Издательство БИНОМ», 2004.-1156 с. 10. Брябин В.М. Программное обеспечение персональных компьютеров. - М.: Наука, 1988.- 190 с.

Page 77: Му арх 2012

77

Додаток 1 Команда Опис ADD dest, src Складання двох операндів. Перший операнд

може бути регістром або елементом пам'яті, другий – регістром, елементом пам'яті, константою. Операція неможлива, коли обидва операнди є елементами пам'яті.

X ADD dest,src Дана операція проводить спочатку обмін операндами ADD. Команда введена починаючи з 486 процесора.

ADC dest,src Складання з урахуванням прапора перенесення – в молодший біт додається біт (прапор) перенесення.

INC r/m Інкремент операнда. SUB dest, src Віднімання двох операндів. Перший операнд

може бути регістром або елементом пам'яті, другий – регістром, елементом пам'яті, константою. Операція неможлива, коли обидва операнди є елементами пам'яті.

SBB dest, src Віднімання з урахуванням біта перенесення. З молодшого біта віднімається біт (прапор) перенесення.

DEC r/m Декремент операнда. CMP r/m, r/m Віднімання без зміни операндів (порівняння). CMPX CHG r,m,a

Порівняння з обміном. Сприймає три операнди (регістр – операнд – джерело, елемент пам'яті – операнд – одержувач, акумулятор, тобто AL, АХ або EAX). Якщо значення в операнді – одержувача і акумуляторі рівні, операнд – одержувач замінюється операндом – джерелом, початкове значення операнда – одержувача завантажується в акумулятор (починаючи з 486 процесора).

CMPX CHG8B r,m,a

Порівняння і обмін 8 байтами. Починаючи з Pentium. Порівнюється число, що знаходиться в парі регістрів EDX:EAX з 8 байтним числом

Page 78: Му арх 2012

78

в пам'яті. NEG r/n Зміна знака операнда. AAA Корекція після ASCII – складання. Корекція

результату двійкового складання двох не упакованих двійкових – десяткових чисел. Наприклад, АХ містить число 9H. Пара команд ADD AL, 8/AAA призводить до того, що АХ міститиметься 0107 - ASCII число 17.

AAS Корекція після ASCII віднімання. Корекція результату двійкового віднімання двох не упакованих двійково - десяткових чисел. Наприклад: MOV АХ, 205H; завантажити ASCII – число 25 SUB AL, 8; двійкове віднімання AAS В результаті АХ містить код 107Н тобто не упаковане двійково-десяткове число 17.

ААМ Корекція після ASCII - множення. Для цієї команди передбачається, що в регістрі АХ знаходиться результат двійкового множення двох десяткових чисел (Діапазон від 1 до 81).

AAD Корекція перед ASCII – діленням. Передбачається що молодша цифра знаходиться в AL, а старша в – АН.

DAA Корекція після BCD - складання. DAS Корекція після BCD – віднімання.

MUL r/m Множення AL (АХ, EAX) на ціле беззнакове число. Результат відповідно, буде містяться в АХ, DX: АХ, EDX, EAX.

IMUL r/m Знакове множення (аналогічно MUL) всі операнди вважаються знаковими. Команда IMUL має також двооперандний і трьохоперандний вигляд.

DIV r/m (src) Без знакове ділення. Аналогічно беззнаковому множенню. Здійснює ділення акумулятора і його розширення (AH: AL, DX:AX, EDX: EAX) на дільник src. Частка поміщається в

Page 79: Му арх 2012

79

акумуляторі, а залишок – в розширення акумулятора.

IDIV r/m Знакове ділення. Аналогічно без знаковому.

CBW Розширення байта (AL) в слово з копіювання знакового біта.

CWD Розширення слова (АХ) в подвійне слово (DX: АХ) з копіюванням знакового біта.

CWDE Розширення слова (АХ) в подвійне слово (EAX) з копіюванням знакового біта.

CDQ Перетворення подвійного слова (EAX) в збільшене учетверо слово (EDX: EAX).

Page 80: Му арх 2012

80

Додаток 2 Команда Опис FLD src Завантажити дійсне число у ST(0) вершину

стеку із пам’яті. FІLD src Завантажити ціле число у ST(0). FST dest Запис дійсного числа із пам’яті у ST(0) INC r/m Інкремент операнда. FCOM Порівняння дійсних чисел ST(0) та ST(1) SBB dest, src Віднімання з урахуванням біта перенесення. З

молодшого біта віднімається біт (прапор) перенесення.

FTST Перевірка ST(0) на нуль. FADD src Складання дійсних чисел. FSUB src Відіймання дійсних чисел.. FMUL Множення двох операндів. FDIV Ділення ох операндів. FSQRT Знайти корінь з ST(0) та розмістити у ST(0). FABS Знайти абсолютне значення. FSIN Знаходження SIN. FCOS Знаходження COS. FSINCOS Знаходження SIN та COS.

F2XM1 Обчислення 2^X-1.

FYL2X Обчислення Y*LOG2(x). FINIT Ініціалізація сопроцесора.

FNINIT Ініціалізація сопроцесора без очікування.

FCLEX Скидання виключень.

FINCSTR Інкремент покажчика стеку.

FDECSTR Декремент покажчика стеку.

Page 81: Му арх 2012

81

Навчально-методичне видання

ЛАХНО Валерій Анатолійович

АРХІТЕКТУРА КОМП’ЮТЕРА

ПРОГРАМНА МОДЕЛЬ МІКРОПРОЦЕСОРА

Методичні вказівки до лабораторних занять для студентів спеціальності

6.0050103 “Програмна інженерія”

За редакцією автора Комп’ютерний макет – Лахно В. А. Коректор – Пилипенко А. І.

_________________________________________________________ Підп. до друку . .200 р. Формат 60x84 1/16. Папір офсет.

Гарнітура Times New Roman. Друк ризографічний. Ум. друк. арк. 5,8. Наклад 50 прим. Зам. № 111.

________________________________________________________________

Видавництво Державного закладу «Луганський національний університет

імені Тараса Шевченка» вул. Оборонна, 2, м. Луганськ, 91011. Тел./факс: (0642) 58-03-20