Page 47 - 4989
P. 47
Тоді для виклику підпрограми слід застосувати послідовність
команд:
PUSH А
PUSH В
CALL PP
а в самій підпрограмі звертання до аргументів реалізується
так:
PUSH EBP
MOV EBP, ESP
MOV EAX, [EBP+8] ; звертання до В
MOV EBX, [EBP+12] ; звертання до А
Тут перші дві команди – стандартний код «прологу»
підпрограми, призначений для зберігання значення регістра ЕВР
(який може використовуватись основною програмою, див. вище)
та ініціалізації його адресою верхівки стеку, у якому знаходяться
аргументи. Зміщення 8 для першого аргументу пояснюється тим,
що крім аргументів у стеку присутні також адреса повернення та
регістр ЕВР. Зміщення кожного наступного аргументу
утворюються шляхом додавання 4. Оскільки стек зростає в
напрямі менших адрес (при записі даних у стек значення ESP
зменшується), то аргумент, який був записаний у стек першим,
має більше зміщення.
При наявності такого «прологу» підпрограма повинна
закінчуватись таким «епілогом»:
MOV ESP, EBP
POP EBP
для відновлення вмісту регістрів ESP, EBP.
У вікні дизасемблера Microsoft Visual Studio звертання до
операндів типу [EBP+8] заміняються на назви аргументів
підпрограми з метою полегшення сприйняття. При написанні
програм мовою асемблера також існують синтаксичні засоби, що
дозволяють використовувати назви аргументів у тексті
підпрограми.
Після виконання підпрограми слід очистити стек від
аргументів. Очистку може виконувати як код, який викликав
підпрограму, так і сама підпрограма.
Якщо очистка стеку виконується підпрограмою, для
повернення використовується команда повернення RET n (при
47