Page 48 - 4989
P. 48
цьому до ЕSP додається вказане в команді число n). Значення n
повинно дорівнювати загальному розміру всіх аргументів у
байтах.
Якщо очистка стеку виконується кодом, який викликав
підпрограму, то одразу після команди виклику застосовується
команда, яка корегує вміст регістру ESP. Наприклад:
PUSH А
PUSH В
CALL PP
ADD ESP, 8
5.3.3 Узгодження про виклики
Спосіб передачі аргументів (через регістри, через стек у
прямому порядку, через стек у зворотньому порядку), порядок
очистки стеку від аргументів, а також спосіб повернення
значення із підпрограми визначаються узгодженням про виклики
(call convention). Узгодження про виклики залежать від мови
програмування та інших факторів. Зокрема, узгодження про
виклики функцій Windows API (stdcall, WINAPI) відрізняється від
узгодження про виклики мови С та С++ (cdecl) та мови Паскаль
(pascal). Для прикладу, узгодження про виклики мови Паскаль
передбачає, що:
- аргументи передаються через стек зліва направо (тобто
записуються в стек у тому порядку, в якому фігурують в
оголошенні функції);
- стек очищує викликана підпрограма;
- результат повертається в регістрі AL, AX, або EAX в
залежності від розрядності.
Параметри узгоджень про виклики для мови С++ та функцій
Windows API пропонується визначити в даній лабораторній
роботі.
Якщо в програмі передбачається використовувати функції,
що підтримують інше узгодження про виклики, ніж передбачено
мовою програмування і компілятором (як правило, це функції із
зовнішніх бібліотек, у т.ч. написаних іншою мовою
програмування), слід обов’язково в оголошенні такої функції
вказувати специфікатор узгодження про виклики. Наприклад,
48