Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Принципи організації підпрограм




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

Можна обійтися і без явного визначення процедури, позначивши перший рядок програми деякою міткою (основний спосіб у 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 може мати один з перерахованих нижче форматів виклику:

• прямий ближній (у межах поточного програмного сегмента);

• прямий далекий (виклик процедури, розташованої в іншому програмному сегменті);

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

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

Тип адресації при виклику процедури залежить від використовуваної моделі пам'яті.

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...