Директиви виклику процедур 1

Сторінка 1 з 2

У чому відмінності, коли і які треба застосовувати, які переваги і недоліки?

Різниця в способі передачі параметрів у функцію і повернення параметрів з функції.

stdcall - юзается (на кшталт) а ВІНАП. Передача аргументів справа наліво. Стек очищає викликається процедура. Повертає разультате в EAX (помойму)

pascal - юзалось в він16апі. Передача в аргументів зліва направо. Стек очищає викликається. У Паскалі результат повертався в al, ax або в dx: ax. Як в Дельфи - не пам'ятаю, ймовірно а EAX.

register - передача всього через регістри процесора. Як саме - залежить від компілятора.

cdecl - не пам'ятаю. Начебто теж, що і stdcall, тільки стек чистить викликає процедура

sdecl - виклики в стилі С (для звернення до DLL використовує угоди про виклики в стилі С). Параметри в сет з права на ліво. Очищення - викликає процедурою. Забезпечують обслуговування змінного числа параметрів.

Взято з Vingrad

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

Так, наприклад в DOS СІ використовували свої види реалізацій (зазвичай звані C-call), а Паскаль - свій. У win32 також відрізняються реалізації для цих мов, але поступово відбувається запозичення фрагментів реалізацій один у одного і їх симбіози (stdcall).

Якщо ти пишеш тільки на одній мові і не підключаєш зовнішніх бібліотек, створених іншим компілятором (в іншому форматі), то тобі, в принципі, все одно, яка реалізація використовується - компілятор сам прийме вірне рішення і погодить виклики підпрограм в своєму стилі. Виняток, мабуть, становить лише опція "registers" - за змістом це означає пріоритетне використання регістрів процесора для передачі (отримання) даних процедурі. Як правило, це прискорює виклик процедури і повернення з неї: може бути використання для підвищення швидкодії. Однак це зазвичай роблять установкою глобального прапора проекту в момент створення Файнал Реліз, застосовуючи це відразу до всіх підпрограм.

Однак якщо тобі необхідно підключити зовнішню бібліотеку (наприклад, написаний на СІ dll, що викликає в свою чергу апі sql-сервера), то буде необхідно врахувати спосіб передачі параметрів саме цій бібліотеці.

Або при явному виклику win api з коду також потрібно врахувати спосіб їх виклику (stdcall).

Взято з Vingrad

Схожі статті