Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л.р.1-12.СПРГ-1(40, укр).doc
Скачиваний:
5
Добавлен:
27.08.2019
Размер:
2.33 Mб
Скачать

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

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

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

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

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]