|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Приклад архітектури команд: 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 він є.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |