Принципи організації підпрограм
Підпрограма, у залежності від виконуваних нею функцій, може вимагати передачі з зухвалої програми визначених даних, що прийнято називати аргументами або параметрами і повертати в зухвалу програму результат обчислень. Деякі підпрограми можуть узагалі не приймати ніяких параметрів і не повертати результат. Можна обійтися і без явного визначення процедури, позначивши перший рядок програми деякою міткою (основний спосіб у fasm). Найчастіше підпрограма (процедура) оформляється так, як показано в наступному фрагменті коду: format pe mov AX, 0 mov BX, 0 jmp start ;-і-і-і-і add1 proc add1:; крапка входу в процедуру addl inc AX ret; повернення в зухвалу програму ;-і-і-і-і add1 endp ;-і-і-і-і sub1 proc sub1:; крапка входу в процедуру subl dec BX ret; повернення в зухвалу програму ;-і-і-і-і sub1 endp start: call add1; виклик процедури addl call sub1; виклик процедури subl ret... Для 32-розрядних додатків усі виклики процедур вважаються ближніми. Слід зазначити, що в мові асемблера імена і мітки, описані в процедурі, повинні бути унікальними і не повинні збігатися з іншими іменами в програмі. У мові асемблера мається можливість створювати вкладені процедури, тобто процедури усередині процедур, але особливих переваг це не дає і використовується відносно рідко. Особливе значення в механізмі виклику процедури і повернення з неї має стек. Оскільки в стеці зберігається адреса повернення, то процедура, що використовує його для збереження проміжних результатів, повинна до моменту виконання команди ret відновити стек у тім стані, у якому він знаходився перед її викликом. У цьому випадку говорять, що процедура повинна відновити, або очистити, стік. У момент виклику процедури команда call поміщає в стек адреса команди, що випливає безпосередньо за call, зменшуючи значення покажчика стека SP (ESP). Команда ret викликуваної процедури використовує цю адресу для повернення в зухвалу програму, автоматично збільшуючи при цьому покажчик вершини стека.
Типи адресації (near або far) команд ret і call повинні відповідати один одному. Викликувана процедура може викликати за допомогою команди call наступну процедуру і т. д., тому стік повинний мати достатній розмір для того, щоб зберігати в ньому всі записувані дані. Варто сказати, що команда ret не аналізує стан або вміст стека. Вона витягає з вершини стека слово або подвійне слово, у залежності від типу адресації, думаючи, що це адреса повернення, по якому передається управління. Якщо до моменту виконання команди ret покажчик стека виявиться зміщеним у ту або і сторону, уміст вершини стека може представляти всі що завгодно, тому передача управління по цій адресі приведе до краху програми. Команда call може мати один з перерахованих нижче форматів виклику: • прямий ближній (у межах поточного програмного сегмента); • прямий далекий (виклик процедури, розташованої в іншому програмному сегменті); • непрямий ближній (у межах поточного програмного сегмента з використанням перемінна, утримуюча адреса переходу); • непрямий далекий (виклик процедури, розташованої в іншому програмному сегменті, з використанням перемінна, утримуюча адреса переходу). Тип адресації при виклику процедури залежить від використовуваної моделі пам'яті.
Читайте также: I. ПРИНЦИПИАЛЬНЫЕ СООБРАЖЕНИЯ Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|