
- •Мови, рівні і віртуальні машини
- •Сучасні багаторівневі машини
- •Поняття архітектури пк
- •1.4. Розвиток комп’ютерної архітектури
- •Розвиток багаторівневих машин
- •Типи сучасних еом
- •Питання до лекції
- •2.1. Принципи розробки сучасних комп'ютерів
- •2.2. Паралелізм на рівні команд
- •2.3. Конвеєри
- •2.4. Суперскалярні архітектури
- •2.5. Паралелізм на рівні процесорів
- •2.6. Векторні комп'ютери
- •Блок управління
- •2.7. Мультипроцессори
- •2.8. Мультикомпьютери
- •Питання до лекції
- •3. Основи комп’ютерної організації : пам’ять
- •3.1. Ієрархічна структура пам'яті
- •3.2. Загальні відомості про пам'ять
- •3.4. Методи звертання до пам'яті
- •3.5. Модулі пам'яті
- •3.6. Ряди і банки пам'яті
- •3.8. Код з виправленням помилок
- •3. 9. Скільки потрібно пам'яті
- •Питання до лекції
- •4. Цифровий рівень побудови ом
- •4.1. Вентилі і булева алгебра
- •4.2. Булева алгебра
- •4.3. Реалізація булевих функцій
- •4.4. Еквівалентність схем
- •Основні цифрові логічні схеми Інтегральні схеми
- •4.5. Комбінаційні схеми
- •3 Входи і 8 виходів
- •4.6. Арифметичні схеми.
- •4.7. Тактові генератори
- •Питання до лекції
- •Цифровий рівень побудови ом.
- •5. Цифровий логічний рівень архітектури: пам’ять, мікропроцесори
- •5.2. Синхронні sr-защіпки
- •5.3. Синхронні d-защіпки
- •5.4. Тригери (flip-flops)
- •5.5. Регістри
- •5.6. Організація пам'яті
- •Тригер (б)
- •Кожний ряд представляє одне з 3-бітних слів. При операції зчитування і запису завжди зчитується або записується ціле слово
- •5.7. Мікросхеми пам'яті
- •5.9. Мікросхеми процесорів
- •Стрілочки указують вхідні і вихідні сигнали. Короткі діагональні лінії вказують на наявність декількох висновків.
- •Питання до лекції
- •6. Шини
- •6.1. Ширина шини
- •6.2. Синхронізація шини
- •6.3. Синхронні шини
- •6.5. Асинхронні шини
- •6.6. Арбітраж шини
- •6.7. Принципи роботи шини
- •Питання до лекції
- •7. Мікроархітектурний рівень
- •7.1. Приклад мікроархітектури
- •7.2. Тракт даних
- •В цьому розділі
- •Табліця 7.1. Деякі комбінації сигналів аллу і відповідні їм функції
- •7.3. Синхронізація тракту даних
- •7.4. Робота пам'яті.
- •7.5. Мікрокоманди
- •7.6. Управління мікрокомандами: Mic-1
- •7.7. Приклад архітектури команд: ijvm
- •7.8. Модель пам'яті ijvm
- •Питання до лекції
- •8. Рівень архітектури команд
- •8.1. Моделі пам'яті
- •8.2. Загальний огляд рівня архітектури команд
- •8.3. Властивості рівня команд
- •8.4. Регістри
- •8.5. Команди
- •8.6. Загальний огляд рівня команд машини Pentium II
- •8.8. Загальний огляд рівня команд системи ultrasparc II
- •8.9. Загальний огляд віртуальної машини Java
- •8.10. Типи даних
- •8.11. Числові типи даних
- •8.12. Нечислові типи даних
- •8.13. Типи даних процесора Pentium II
- •Підтримувані типи відмічені хрестом (х)
- •8.14. Типи даних машини UltraSparc II
- •8.16. Типи даних віртуальної машини Java
- •8.17. Формати команд
- •Питання до лекції
- •9. Адресація
- •9.1. Способи адресації
- •9.2. Безпосередня адресація
- •9.3. Пряма адресація
- •9.4. Регістрова адресація
- •9.5. Непряма регістрова адресація
- •Лістинг 9.1 - Програма на асемблері для обрахунку суми елементів масиву.
- •9.6. Індексна адресація
- •Листинг 9.2. Програма на мові асемблера для обчислення операції або від (Аі і Ві ) для масиву з 1024 елементів.
- •9.7. Відносна індексна адресація
- •9.8. Стекова адресація
- •9.9. Зворотній польський запис
- •9.10. Обчислення формул в зворотнім польськім записі
- •Питання до лекції
7.7. Приклад архітектури команд: ijvm
Щоб продовжити опис нашого прикладу, введемо рівень набору команд, які повинна інтерпретувати мікропрограма машини IJVM (див. рис. 7.5). Для зручності рівень архітектури команд ми іноді називатимемо макроархітектурою, щоб протиставити його мікроархітектурі. Проте перш ніж приступати до опису IJVM, ми трохи почекаємо.
В усіх мовах програмування є поняття процедур з локальними змінними. Ці змінні доступні під година виконання процедури, але перестають бути доступними після закінчення процедури. Виникає питання: де повинні зберігатися такі змінні?
Нажаль, надати кожній змінній абсолютну адресі в пам'яті неможливо. Проблема полягає в тому, що процедура може викликати собі сама. А поки досить сказати, що якщо процедура викликається двічі, те зберігати її змінні під конкретними адресами в пам'яті не можна, оскільки другий виклик руйнувати результати першого.
Замість цього використовується інша стратегія. Для змінних резервується особлива область пам'яті, яка називається стеком, але окремі змінні не одержують на ньому абсолютних адресу. Який-небудь регістр, скажімо, LV, вказує на базову адресі локальних змінних для поточної процедури. Розглянемо рис. 7.7, а. В даному випадку викликається процедура А з локальними змінними а1, а2 і а3, і для цих змінних резервується ділянка пам'яті, що починається з адреси, яка вказується регістром LV. Інший регістр, SP, вказує на старше слово локальних змінних процедури А. якщо значення регістра LV рівно 100, а слова складаються з 4 байтів, то значення SP буде 108. Для звернення до змінної потрібно обчислити її зсув від адреси LV. Структура даних між LV і SP (включаючи обидва вказані слова) називається фреймом локальних змінних.
Рис. 7.7. Стік для зберігання локальних змінних: під година процедури А (а); після того, як процедура А викликає процедуру В (б); після того, як процедура У викликає процедуру З (е); після того, як процедури З і В припиняються, а процедура А викликає процедуру D (г)
А заразом давайте подивимося, що відбувається, якщо процедура А викликає іншу процедуру, В. Де повинні зберігатися 4 локальні змінні процедури В (b1, b2, b3, b4)? Відповідь: біля стечу, розташованому над стеком для процедури А, як показано на рис. 7.7, би. Відзначимо, що після виклику процедури регістр LV вказує вже на локальні змінні процедури В. Звертатися до локальних змінних процедури В можна по їх зміщенню від LV. Якщо процедура У викликає процедуру З, то регістри LV і SP знову перевизначаються і Вказують на місце знаходження локальних змінних процедури З, як показано на рис. 7.7, в.
Колі процедура Із завершується, В знову активізується і стік повертається в колишній стан (див. рис. 7.7, би), так що LV тепер вказує на локальні змінні процедури В. Коли процедура В завершується, стік переходити в початковий стан (див. рис. 7.7, а). За будь-яких розуму LV вказує на базову адресі стекового фрейму для поточної процедури, а SP — на верхнє слово цього фрейму.
Пріпустімо, що процедура А викликає процедуру D яка містить 5 локальних змінних. Відповідний стек свідчень на рис. 7.7, р. Локальні змінні процедури D використовують ділянку пам'яті процедури В і частину стека процедури З. Біля пам'яті з такою організацією розміщуються тільки поточні процедури. Колі процедура завершена, відведена для неї ділянка пам'яті звільняється.
Але стік використовується не тільки для зберігання локальних змінних, а також і для зберігання операндів під годину обчислення арифметичних виразів. Такий стік називається стеком операндів. Припустімо, що перед викликом процедур процедура А повинна провести наступне обчислення:
а1=а2+аЗ
Щоб обчислити цю торбу, можна помістити а2 в стек, як показано на рис. 7.8, а. Тоді значення регістра SP збільшиться на число, рівне кількості байтів в слові (скажімо, на 4), і указуватиме на адресі першого операнда. Потім в стек поміщається змінна a3, як показано на рис. 7.8, б. Відзначимо, що назви процедур і змінних вибираються користувачем, а назви регістрів і кодів операцій вбудовані. Назві процедур і змінних мі виділяємо в тексті курсивом.
Тепер можна провести обчислення, виконавши команду, яка виштовхує два слова із стека, складає їх і поміщає результат назад в стек, як показано на рис. 7.8, в. Після цього верхнє слово можна виштовхнути із стека і помістити його в локальну змінну а1, як показано на рис. 7.8, р.
Рис. 7.8. Використання стека операндів для арифметичних дій.
Фреймі локальних змінних і стеки операндів можуть змішуватися. Напріклад, коли викликається функція f при обчисленні виразу x2+f(x), частина цього виразу (х2) може знаходитися в стечу операндів. Результат обчислення функції залишається в стечу над х2, щоб наступна команда додала їх.
Слід згадати, що всі машини використовують стік для зберігання локальних змінних, але не всі використовують його для операндів. Біля більшості машин немає стека операндів, але біля JVM і IJVM він є.