Вкладені процедури - ~ Різне. :: CodingRUS ::. програмування по-російськи на Delphi, C ++, PHP, Prolog, GPSS

Реклама Виконуємо курсові та лабораторні з різних мов програмування
Детальніше - курсові та лабораторні на замовлення
Delphi, Turbo Pascal, Assembler, C, C ++, C #, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Замовити програму для Windows Mobile, Symbian
Зміни контурів і сортування в двовимірному масиві чисел на Turbo Pasca ...
Файл записів з виведенням зворотного заголовка на Turbo Pascal
Інформаційна система - транспортний парк на Turbo Pascal (База даних) ...
Вкладені процедури Історично склалося так, що стек «росте» від верхніх адрес до нижніх. Ця угода означає, що ви проштовхувати значення в стек, віднімаючи значення від покажчика стека.
Додавання значення до покажчика стека скорочує стек, виштовхуючи тим самим значення з стека.
У попередньому прикладі ми використовували тимчасові регістри, при цьому перед. іагая, що їхні колишні значення повинні бути збережені і відновлені. Щоб до «жати збереження і відновлення регістра, чиє значення ніколи не використовується. що може мати місце у випадку з тимчасовим регістром, програмне забезпечення MIPS ділить 18 з наявних регістрів на дві групи:
• St0- $ t9: десять тимчасових регістрів, які не зберігаються спричиненої програмою при виклику процедури
• SsO- $ s7: вісім зберігаються регістрів, які повинні бути збережені при виклику процедури
Це просте угоду скорочує скидання регістрів. Оскільки в показаному прикладі зухвала програма не припускає, що регістри StO і Stl V будуть збережені в процесі виклику процедури, з коду можна викинути два співвідношення і дві завантаження. Але ми як і раніше повинні зберегти і відновити реєстр JsO, оскільки викликається програма повинна передбачити, що викликає програма потребує його значенні.
Процедури, які не викликають інших процедур, називаються конечни.чі. Якби всі процедури були кінцевими, то життя стало б простіше, але, на жаль, це не так. Точно так само як шпигун для виконання частини своєї місії може найняти інших шпигунів, які в свою чергу можуть скористатися послугами ще більшої кількості шпигунів, процедури викликають інші процедури. Більш того, рекурсивні процедури навіть викликають «клонів», тобто самих себе. Оскільки ми повинні бути уважними при використанні регістрів в процедурах, ще більше уваги потрібно приділяти викликам неконечную процедур.
Припустимо, наприклад, що основна програма викликає процедуру А з аргументом 3, поміщаючи значення 3 в регістр SaO, а потім використовуючи інструкцію jal А. Потім припустимо, що процедура А викликає процедуру В, використовуючи інструкцію jal Нд аргументом 7, також поміщається в регістр SaO. Оскільки процедура А ще не завершила свою задачу, використання регістра $ а0 викликає конфліктну ситуацію. Точно так же виникає конфлікт і з адресою повернення в регістрі Sra. оскільки тепер в ньому знаходиться адресу повернення для процедури В. Якщо ми що-небудь не зробимо для попередження цієї проблеми, що виник конфлікт не дозволить процедурі А повернути управління викликала її програмі
Одним з рішень буде проштовхування всіх інших регістрів, які повинні бути збережені, в стек, точно гак само, як ми це робили з зберігаються регістрами. Зухвала програма проштовхує в стек все регістри аргументів або тимчасові регістри -tt9), які знадобляться їй після виклику. Її викликає процедура проштовхує в стек регістр адреси повернення $ га і все зберігаються регістри, що використовуються нею. Покажчик стека налаштовується відповідно до числа регістрів, які розміщені в стек. Після повернення регістри відновлюються з пам'яті і покажчик стека відповідним чином коригується.
У мові С є два класи пам'яті: автоматичний і статичний. Автоматичні змінні є локальними по відношенню до процедури і анулюються після виходу з процедури. Статичні змінні існують незалежно від входів в процедури і виходів з них. Змінні в мові С, оголошені за межами всіх процедур, вважаються статичними, так само як і всі змінні, оголошені з використанням ключового слова static. Решта всіх змінних вважаються автоматичними. Щоб спростити доступ до статичних даних, програмне забезпечення MIPS виділив інший регістр, названий глобальним покажчиком, або
Раніше представлені відомості про те, що зберігається в процесі виклику процедури. Врахуйте, що ряд схем зберігає сам стек, гарантуючи, що викликає програма отримає ті ж самі дані назад шляхом завантаження їх з стека, оскільки вони в ньому збережені. Стек вище Ssp зберігається просто тим, що вживаються заходи, що не дозволяють спричиненої програмі вести запис вище адреси, що зберігається в Ssp; а значення самого Ssp зберігається викликається програмою шляхом додавання до нього точно такого ж значення, яке було з нього віднято; а всі інші регістри зберігаються за рахунок збереження їх в стеку і відновлення їх звідти.
опублікував katy June 26 2015 10:08:56 · 0 Коментарів · тисячу триста шістьдесят один Прочитаних ·
• Чи не знайшли відповідь на своє питання? Тоді задайте питання в коментарях або на форумі!
рейтинги

Рейтинг доступний тільки для користувачів.
Будь ласка, залогіньтеся або зареєструйтеся для голосування.

Немає даних для оцінки.

завантаження

нові завантаження

випадкові завантаження

Топ завантажень