Call Instruction — boshqaruvni funksiya yoki protsedura manziliga o‘tkazib, keyinchalik davom etish uchun qaytish manzilini ham saqlaydigan protsessor buyrug‘i. U yuqori darajadagi funksiya chaqiruvining markaziy qismi, ammo argument uzatish, stek freymi va saqlanadigan registrlar tartibi buyruqning o‘zi bilan emas, calling convention bilan belgilanadi.
Qaytish manzili
Call odatda undan keyingi buyruq manzilini stekka suradi yoki maxsus link registriga yozadi. Nishon bevosita nisbiy siljish bilan yoki registr orqali bilvosita berilishi mumkin. Funksiya tugagach Return Instruction saqlangan manzilni program counterga qaytaradi.
Link registrli arxitekturada ichma-ich boshqa funksiya chaqiradigan funksiya o‘z qaytish manzilini stekka yoki boshqa saqlash joyiga ko‘chiradi. Aks holda yangi call link registrini bosib, tashqi chaqiruvga qaytish yo‘lini yo‘qotadi. Leaf funksiya boshqa call qilmasa, bu saqlashdan qochishi mumkin.
Calling convention
ABI qaysi registrlarda argument va natija uzatilishini, qaysi registrlarni chaqiruvchi yoki chaqiriluvchi saqlashini, stek tekislanishini belgilaydi. Call instruction faqat nazorat va qaytish manzilini boshqaradi. Ikki modul bir xil ISA kodidan foydalansa-yu, turli convention bilan tuzilgan bo‘lsa, registr va stekni turlicha talqin qilib xato qiladi.
Prolog mahalliy o‘zgaruvchilar uchun joy ajratadi va kerakli registrlarni saqlaydi; epilog ularni tiklab qaytadi. Optimallashtiruvchi kompilyator kichik funksiyani inline qilib callni butunlay yo‘qotishi yoki oxirgi chaqiruvni tail callga aylantirib joriy freymdan jump bilan chiqishi mumkin.
Dinamik bog‘lash
Tashqi funksiya manzili link vaqtida noma’lum bo‘lsa, relokatsiya yoki Procedure Linkage Table kabi oraliq tuzilma ishlatiladi. Birinchi chaqiruv dinamik yuklagich orqali haqiqiy manzilni topadi, keyingilari keshlangan nishonga o‘tadi. Virtual metod va funksiya ko‘rsatkichi ham bilvosita call yaratadi.
Mikroarxitektura callni tanib, qaytish manzilini return address stackka qo‘yadi. Bu kelajakdagi return nishonini aniqroq bashoratlashga yordam beradi. Stek chuqurligi oshsa yoki call/return tartibi odatiy bo‘lmasa, bashorat xato qilishi mumkin.
Xavfsizlik
Stekdagi qaytish manzili bufer toshishi bilan almashtirilsa, bajarilish hujumchi tanlagan kodga o‘tishi mumkin. Stack canary, shadow stack va control-flow integrity bunday xavfni kamaytiradi. Pointer authentication ayrim platformalarda qaytish yoki bilvosita call manzilini kriptografik teg bilan bog‘laydi.
Call imtiyoz darajasini o‘zi o‘zgartirmaydi. Tizim chaqiruvi yoki himoyalangan domen o‘tishi alohida ISA mexanizmi bo‘lib, qo‘shimcha tekshiruv va kontekst almashtirishni bajaradi.
Rekursiv funksiya har call uchun yangi freym yaratishi sabab stek chegarasiga yetishi mumkin. Til muhiti guard page yoki aniq chuqurlik tekshiruvi bilan toshishni aniqlaydi. Asinxron signal yoki interrupt aynan prolog o‘rtasida kelishi ehtimoli uchun unwind metadata har manzil oralig‘idagi holatni tavsiflaydi. Profil vositasi call stack namunalaridan vaqtni funksiyalarga taqsimlaydi, ammo inline va tail call optimallashtirishlari manba kodidagi chaqiruv tuzilishini fizik freymlar bilan bir xil qoldirmaydi.
Call sayti ABI talab qilgan stek tekislanishini saqlashi kerak. Vektor argumenti yoki o‘zgaruvchan argumentlar uchun qo‘shimcha registrlar va metadata ishlatilishi mumkin; bu qoida buzilsa callee to‘g‘ri manzildan noto‘g‘ri qiymat o‘qiydi.
Variadik funksiya argumentlar soni va turini buyruqdan bilmaydi; format satri yoki alohida son kabi dasturiy kelishuvga tayanadi. Noto‘g‘ri kelishuv callee’ning mavjud bo‘lmagan registr yoki stek joyini o‘qishiga olib keladi.
Bog‘liq tushunchalar
calling convention, stack frame, link register, return address, tail call, shadow stack