В програмуванні, погодження виклику або угода про виклики це схема за якою підпрограми отримують параметри від викликових підпрограм і як вони повертають результат і управління, погодження викликів можуть різнитися:
- місцем розташування параметрів і значень до повернення (в регістрах; у стеку; в обох)
- порядком в якому передаються параметри (або частини одного параметра)
- розподілом завдань з встановлення і очистки після виклику підпрограми між викликальною і викликаною підпрограмами
- регістри які може прямо використовувати викликана підпрограма також іноді різняться
Різні мови програмування використовують різні погодження викликів і, таким чином, можуть виконуватися на різних платформах. Іноді це призводить до проблем коли спільно використовуються модулі написані із використанням різних мов, або коли викликається операційна система чи API з мови відмінної від тої на якій вона/він написаний. Навіть програма, яка використовує одну мову програмування може використати декілька погоджень викликів, або вибраних компілятором з метою оптимізації, або вказаних програмістом.
Архітектури майже завжди мають більш ніж одне можливе погодження викликів. З багатьма регістрами загального призначення та іншими можливостями, можлива кількість погоджень викликів досить велика, хоча деякі архітектури надають можливість використовувати лише одне погодження викликів.
IA-32
IA-32, 32-розрядний варіант архітектури x86, підтримує багато погоджень викликів. Через малу кількість регістрів, погодження викликів на IA-32 здебільшого передають аргументи через стек, в той час як значення до повернення (або вказівник на нього) передається в регістрі. Деякі погодження викликів передають в регістрах декілька перших аргументів, що може збільшити видатність для маленьких і листових часто викликаних підпрограм (тобто підпрограм, які не викликають інші підпрограми і, таким чином, не мають бути повторновикористовними).
Приклад виклику:
push eax ; передати зміст регістра push byte [ebp+20] ; передати деяку змінну в пам'яті (синтаксис FASM/TASM) push 3 ; передати деяку константу call calc ; результат виконання знаходиться в eAX
Типова структура викликаної підпрограми: (деякі або всі (окрім ret) інструкції нижче можуть бути оптимізовані видаленням в простих підпрограмах)
calc: push ebp ; зберегти старий вказівник кадра mov ebp, esp ; отримати новий вказівник кадра sub esp, localsize ; зарезервувати місце для локальних змінних . . ; виконати обчислення, залишити результат в EAX . mov esp, ebp ; звільнити пам'ять локальних змінних pop ebp ; відновити старий вказівник кадра ret paramsize ; звільнити міце параметрів і повернутись
cdecl
Cdecl- тип викликів, який походить з мови програмування C і використовується за умовчанням в компіляторах С/С++ на архітектурі x86. Параметри в підпрограму передаються через стек, куди поміщаються у зворотному порядку (справа наліво). 32-бітний результат повертається в регістрі процесора EAX. Чисткою стека займається зовнішня підпрограма.
pascal
Тип викликів, що використовується в основному в мові програмування Pascal. Параметри в підпрограму поміщаються в стек в прямому порядку (зліва направо, тобто протилежно до Cdecl), чисткою стека займається внутрішня підпрограма (та що викликається за допомогою цього виклику). Цей тип викликів був поширений в наступних 16-розрядних інтерфейсах: (OS/2) 1.x, Microsoft Windows 3.x, і Borland Delphi версії 1.x.
stdcall
stdcall є стандартним типом виклику для Microsoft Win32 API і Open Watcom C++. Являє собою своєрідний гібрид двох попередніх типів. Викликана підпрограма залишається відповідальною за очищення стека, але параметри поміщаються в стек у зворотному (справа-наліво, як і в cdecl). Регістри EAX, ECX, EDX призначені для використання в межах функції. Значення, що повертається, зберігається в регістрі ЕАХ.
fastcall
fastcall — тип викликів при якому параметри передаються через регістри центрального процесора. Це зазвичай найшвидша модель виклику, особливо якщо всі параметри і проміжні результати вміщаються в регістрах, тоді маніпуляції зі стеком взагалі не потрібні. Але цей тип виклику не стандартизований, різні компілятори реалізують його по різному. Тому він використовується тільки у функціях, які програма не експортує і не імпортує.
x86-64
Розробники системи команд x86-64 значно розширили набір регістрів процесора. Це дозволило використати передавання параметрів в регістрах процесора як новий стандарт для 64-бітної архітектури.
- Передавання параметрів
- Перші 4 параметри передаються в регістрах, наступні через стек.
- 1-й параметр у RCX або XMM0.
- 2-й параметр у RDX або XMM1.
- 3-й параметр у R8 або XMM2.
- 4-й параметр у R9 або XMM3.
- Ціле число (англ. Integer) (8, 16, 32, 64 бітні, включаючи __m64) передається через регістри RCX, RDX, R8, R9.
- Число з рухомою комою (англ. Floating Point) передається в регістрах XMM0-XMM3.
- Інші типи включаючи структури та __m128 передаються через вказівник у регістрах RCX, RDX, R8, R9.
- Повернення результату
- Для (8, 16, 32, 64 бітних типів включаючи __m64 та вказівники) результат повертається у регістрі RAX.
- Для усіх інших типів (float, double, __m128) результат повертається у регістрі XMM0.
- Стан незадіяних бітів у регістрах RAX та XMM0 невизначений.
Приклад передавання параметрів x64:
int func(__m64 arg1, _m128 arg2, struct arg3, float arg4, int arg5); // arg1 у RCX, // вказівник на arg2 у RDX, // вказівник на arg3 у R8, // arg4 у XMM3 // arg5 через стек // результат повертається у регістрі RAX
ARM
Цей розділ потребує доповнення. (вересень 2010) |
RISC-V
Цей розділ потребує доповнення. (січень 2022) |
Джерела
- __cdecl (англ.).
{{}}
: Проігноровано|website=
() - __stdcall (англ.).
{{}}
: Проігноровано|website=
() - x64 calling convention (англ.).
{{}}
: Проігноровано|website=
()
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V programuvanni pogodzhennya vikliku abo ugoda pro vikliki ce shema za yakoyu pidprogrami otrimuyut parametri vid viklikovih pidprogram i yak voni povertayut rezultat i upravlinnya pogodzhennya viklikiv mozhut riznitisya miscem roztashuvannya parametriv i znachen do povernennya v registrah u steku v oboh poryadkom v yakomu peredayutsya parametri abo chastini odnogo parametra rozpodilom zavdan z vstanovlennya i ochistki pislya vikliku pidprogrami mizh viklikalnoyu i viklikanoyu pidprogramami registri yaki mozhe pryamo vikoristovuvati viklikana pidprograma takozh inodi riznyatsya Rizni movi programuvannya vikoristovuyut rizni pogodzhennya viklikiv i takim chinom mozhut vikonuvatisya na riznih platformah Inodi ce prizvodit do problem koli spilno vikoristovuyutsya moduli napisani iz vikoristannyam riznih mov abo koli viklikayetsya operacijna sistema chi API z movi vidminnoyi vid toyi na yakij vona vin napisanij Navit programa yaka vikoristovuye odnu movu programuvannya mozhe vikoristati dekilka pogodzhen viklikiv abo vibranih kompilyatorom z metoyu optimizaciyi abo vkazanih programistom Arhitekturi majzhe zavzhdi mayut bilsh nizh odne mozhlive pogodzhennya viklikiv Z bagatma registrami zagalnogo priznachennya ta inshimi mozhlivostyami mozhliva kilkist pogodzhen viklikiv dosit velika hocha deyaki arhitekturi nadayut mozhlivist vikoristovuvati lishe odne pogodzhennya viklikiv IA 32IA 32 32 rozryadnij variant arhitekturi x86 pidtrimuye bagato pogodzhen viklikiv Cherez malu kilkist registriv pogodzhennya viklikiv na IA 32 zdebilshogo peredayut argumenti cherez stek v toj chas yak znachennya do povernennya abo vkazivnik na nogo peredayetsya v registri Deyaki pogodzhennya viklikiv peredayut v registrah dekilka pershih argumentiv sho mozhe zbilshiti vidatnist dlya malenkih i listovih chasto viklikanih pidprogram tobto pidprogram yaki ne viklikayut inshi pidprogrami i takim chinom ne mayut buti povtornovikoristovnimi Priklad vikliku push eax peredati zmist registra push byte ebp 20 peredati deyaku zminnu v pam yati sintaksis FASM TASM push 3 peredati deyaku konstantu call calc rezultat vikonannya znahoditsya v eAX Tipova struktura viklikanoyi pidprogrami deyaki abo vsi okrim ret instrukciyi nizhche mozhut buti optimizovani vidalennyam v prostih pidprogramah calc push ebp zberegti starij vkazivnik kadra mov ebp esp otrimati novij vkazivnik kadra sub esp localsize zarezervuvati misce dlya lokalnih zminnih vikonati obchislennya zalishiti rezultat v EAX mov esp ebp zvilniti pam yat lokalnih zminnih pop ebp vidnoviti starij vkazivnik kadra ret paramsize zvilniti mice parametriv i povernutis cdecl Cdecl tip viklikiv yakij pohodit z movi programuvannya C i vikoristovuyetsya za umovchannyam v kompilyatorah S S na arhitekturi x86 Parametri v pidprogramu peredayutsya cherez stek kudi pomishayutsya u zvorotnomu poryadku sprava nalivo 32 bitnij rezultat povertayetsya v registri procesora EAX Chistkoyu steka zajmayetsya zovnishnya pidprograma pascal Tip viklikiv sho vikoristovuyetsya v osnovnomu v movi programuvannya Pascal Parametri v pidprogramu pomishayutsya v stek v pryamomu poryadku zliva napravo tobto protilezhno do Cdecl chistkoyu steka zajmayetsya vnutrishnya pidprograma ta sho viklikayetsya za dopomogoyu cogo vikliku Cej tip viklikiv buv poshirenij v nastupnih 16 rozryadnih interfejsah OS 2 1 x Microsoft Windows 3 x i Borland Delphi versiyi 1 x stdcall stdcall ye standartnim tipom vikliku dlya Microsoft Win32 API i Open Watcom C Yavlyaye soboyu svoyeridnij gibrid dvoh poperednih tipiv Viklikana pidprograma zalishayetsya vidpovidalnoyu za ochishennya steka ale parametri pomishayutsya v stek u zvorotnomu sprava nalivo yak i v cdecl Registri EAX ECX EDX priznacheni dlya vikoristannya v mezhah funkciyi Znachennya sho povertayetsya zberigayetsya v registri EAH fastcall fastcall tip viklikiv pri yakomu parametri peredayutsya cherez registri centralnogo procesora Ce zazvichaj najshvidsha model vikliku osoblivo yaksho vsi parametri i promizhni rezultati vmishayutsya v registrah todi manipulyaciyi zi stekom vzagali ne potribni Ale cej tip vikliku ne standartizovanij rizni kompilyatori realizuyut jogo po riznomu Tomu vin vikoristovuyetsya tilki u funkciyah yaki programa ne eksportuye i ne importuye x86 64Rozrobniki sistemi komand x86 64 znachno rozshirili nabir registriv procesora Ce dozvolilo vikoristati peredavannya parametriv v registrah procesora yak novij standart dlya 64 bitnoyi arhitekturi Peredavannya parametriv Pershi 4 parametri peredayutsya v registrah nastupni cherez stek 1 j parametr u RCX abo XMM0 2 j parametr u RDX abo XMM1 3 j parametr u R8 abo XMM2 4 j parametr u R9 abo XMM3 Cile chislo angl Integer 8 16 32 64 bitni vklyuchayuchi m64 peredayetsya cherez registri RCX RDX R8 R9 Chislo z ruhomoyu komoyu angl Floating Point peredayetsya v registrah XMM0 XMM3 Inshi tipi vklyuchayuchi strukturi ta m128 peredayutsya cherez vkazivnik u registrah RCX RDX R8 R9 Povernennya rezultatu Dlya 8 16 32 64 bitnih tipiv vklyuchayuchi m64 ta vkazivniki rezultat povertayetsya u registri RAX Dlya usih inshih tipiv float double m128 rezultat povertayetsya u registri XMM0 Stan nezadiyanih bitiv u registrah RAX ta XMM0 neviznachenij Priklad peredavannya parametriv x64 int func m64 arg1 m128 arg2 struct arg3 float arg4 int arg5 arg1 u RCX vkazivnik na arg2 u RDX vkazivnik na arg3 u R8 arg4 u XMM3 arg5 cherez stek rezultat povertayetsya u registri RAXARMCej rozdil potrebuye dopovnennya veresen 2010 RISC VCej rozdil potrebuye dopovnennya sichen 2022 Dzherela cdecl angl a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Proignorovano website dovidka stdcall angl a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Proignorovano website dovidka x64 calling convention angl a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Proignorovano website dovidka