ати спрощений варіант синтаксису:
<ім'я> PROC <тип>
<тіло процедури>
RET
<ім'я> ENDP
де PROC - директива, що визначає початок процедури, <ім'я> - мітка, що служить ім'ям процедури і задає адресу точки входу в процедуру; <тип> - параметр, що визначає тип процедури і може приймати два значення: near (ближній) і far (далекий). Якщо використовується спрощені форми визначення сегментів, то тип процедури задається обраною моделлю пам'яті і його можна не вказувати. Для моделей tiny, small і compact визначається тип near, а для інших - far; RET (Return) - остання команда підпрограми. Вона здійснює вихід з підпрограми і повернення в основну програму. Тип процедури автоматично задає тип повернення з процедури.
Виклик підпрограми з основної програми здійснюється командою CALL (), яка має наступний синтаксис:
CALL <тип> <ім'я>
де <тип> - параметр, що визначає тип переходу і може приймати значення near або far; <ім'я> - ім'я викликається процедури.
Коли команда CALL викликає процедуру, і зберігає в стек адреса наступної за CALL команди. При ближньому виклик до стек поміщається значення регістра IP, а при дальньому виклику - значення регістрів CS і IP. Після виконання у процедурі команди RET - виконується зворотну дію. p align="justify"> Фрагмент програми виклику процедур
; фрагмент коду програми
main PROC
MOV AX, @ data ​​span> DS, AX MySub
... AX, 4C00h 21 ENDP
MySub PROC
... ENDP
Передача параметрів у процедуру.
Передавати фактичні параметри процедурі можна по-різному. Використовуються кілька способів передачі параметрів. Вибір конкретного способу для певної задачі залежить від кількості використовуваних параметрів і складності їх обробки. p align="justify"> 1 . Передача через регістри : програма перед викликом заносить вхідні параметри до деяких регістри процесора, а після повернення вибирає з регістрів значення результатів. span>
Передача параметрів за значенням: перед зверненням до процедури основна процедура обчислює значення фактичних параметрів і записує їх у регістри. p>
Приклад. 1. Обчислити c = max (a, b) + max (5, al), де всі числа - знакові розміром в слово. Обчислення max (х, у) описати як процедуру. Умови передачі параметрів: перший параметр (х) - через регістр АХ, другий параметр (у) - через регістр ВХ, результат (max) - в регістрі АХ.
За цих умов процедура і відповідний фрагмент основної програми виглядають наступним чином: (для прикладу опишемо процедуру як далеку):
; процедура: АХ = max (АХ, ВХ); основна программаMAXPROCFARMOVAX, А; АХ: = аCMPAX, BXMOVВХ, В; ВХ: = bJGEMAX1CALLMAX; АХ: = mах (а, b) MOVAX, BXMOVС, АХ; зберегти АХМАХ1: RETMOVAX, 5; АХ: = 5MAXENDPMOVВХ, АDECВХ; ВХ: = а-1CALLMAX; AX: = max (5, al) ADDС, АХ; С: = mах (а, b) + мах ( 5, а-1)
Передача параметрів за посиланням означає передачу адреси (імені) осередки, відповідної фактичному параметру, через регістр: основна програма записує в якийсь регістр адреса фактичної змінної, а процедура бере його звідти. Використовують регістри-модифікатори ВХ, ВР, SI або DI, тому що процедури доведеться модифікувати з цього регістру.
Приклад 2. Візьмемо наступну процедуру на мові Паскаль:
procedure D (var x: integer);: = x div 16;
Нехай у програмі є такі звернення до неї: D (A) і D (B), де А і В-імена змінних, значеннями яких є невід'ємні числа. Використовуємо регістр ВХ: до початку виконання процедури в регістрі ВХ повинен знаходитися адресу тієї комірки (А або В), вміст якої вона зраджує. Доступ до комірки в цьому випадку можн...