असेंबली से C को कॉल करना
मानक कॉलिंग परंपराओं का पालन करते हुए अपने असेंबली कोड के भीतर से C फ़ंक्शन का आह्वान करना समझें।
असेंबली से C को कॉल करना, CoddyKit पर Assembly भाषा और x86 निम्न-स्तरीय सिस्टम प्रोग्रामिंग का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Assembly भाषा और x86 निम्न-स्तरीय सिस्टम प्रोग्रामिंग सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Assembly भाषा और x86 निम्न-स्तरीय सिस्टम प्रोग्रामिंग पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
असेंबली और C का सेतु
आप C और असेंबली कोड को क्यों मिलाना चाहेंगे? निम्न-स्तरीय और सिस्टम प्रोग्रामिंग में यह एक शक्तिशाली तकनीक है!
- असेंबली: प्रदर्शन-निर्भर कार्यों, सीधे हार्डवेयर एक्सेस और सिस्टम की आंतरिक कार्यप्रणाली समझने के लिए उपयोगी है।
- C: उच्च-स्तरीय संरचना, पोर्टेबिलिटी और विशाल लाइब्रेरी तक पहुँच प्रदान करती है।
असेंबली से C फ़ंक्शन कॉल करके, आप विशिष्ट कार्यों के लिए असेंबली का निम्न-स्तरीय नियंत्रण बनाए रखते हुए C के जटिल तर्क और लाइब्रेरी का लाभ उठा सकते हैं।
कॉलिंग अनुबंध
जब एक फ़ंक्शन दूसरे फ़ंक्शन को कॉल करता है, तो दोनों को कुछ नियमों पर सहमत होना पड़ता है। इस 'अनुबंध' को कॉलिंग परंपरा कहा जाता है।
यह फ़ंक्शन की परस्पर क्रिया के महत्वपूर्ण पहलुओं को निर्धारित करता है:
- तर्क कैसे भेजे जाते हैं (जैसे स्टैक पर या रजिस्टरों में)।
- तर्क किस क्रम में भेजे जाते हैं।
- कॉल के बाद स्टैक साफ़ करने की ज़िम्मेदारी किस फ़ंक्शन की है।
- वापसी मान कॉल करने वाले तक कैसे पहुँचाए जाते हैं।
इन परंपराओं के बिना, आपका असेंबली कोड यह नहीं जान पाएगा कि C फ़ंक्शन के लिए डेटा कैसे तैयार करना है या उसके परिणामों को कैसे समझना है।
सामान्य `cdecl` परंपरा
cdecl (C घोषणा) कॉलिंग परंपरा बहुत सामान्य है, विशेषकर 32-बिट x86 प्रणालियों (जैसे Linux) में।
आइए इसकी प्रमुख विशेषताएँ देखें:
- तर्क क्रम: तर्कों को स्टैक पर दाएँ से बाएँ पुश किया जाता है।
- स्टैक की सफ़ाई: फ़ंक्शन के लौटने के बाद स्टैक साफ़ करने की ज़िम्मेदारी कॉलर (आपके असेंबली कोड) की होती है।
- वापसी मान: पूर्णांक वापसी मान सामान्यतः EAX रजिस्टर में रखे जाते हैं।
आपके असेंबली और C कोड के बीच सफल परस्पर क्रिया के लिए cdecl को समझना मूलभूत है।
`cdecl` तर्क भेजना
32-बिट cdecl में, तर्कों को उलटे क्रम में स्टैक पर पुश किया जाता है। इसका अर्थ है कि अंतिम तर्क पहले पुश होता है और पहला तर्क अंत में।
my_func(arg1, arg2, arg3); जैसे C फ़ंक्शन के लिए, असेंबली कॉल में ये चरण होंगे:
push dword arg3_valuepush dword arg2_valuepush dword arg1_valuecall my_func
इससे arg1 स्टैक पर तर्कों के 'शीर्ष' पर, call द्वारा पुश किए गए वापसी पते के ठीक नीचे रहता है।
कॉलर स्टैक साफ़ करता है
cdecl की प्रमुख विशेषताओं में से एक यह है कि C फ़ंक्शन के लौटने के बाद तर्कों को स्टैक से हटाने की ज़िम्मेदारी कॉलर (आपके असेंबली कोड) की होती है।
यह सामान्यतः ADD ESP, N निर्देश का उपयोग करके स्टैक सूचक (ESP) को समायोजित करने से किया जाता है, जहाँ N पुश किए गए तर्कों का कुल आकार है (जैसे 32-बिट प्रणालियों पर प्रति तर्क 4 बाइट)।
सफ़ाई की यह व्यवस्था C फ़ंक्शन को अलग-अलग संख्या में तर्क स्वीकार करने देती है (जैसे printf), क्योंकि कॉलर को ठीक-ठीक पता होता है कि उसने कितने तर्क पुश किए हैं।
वापसी मानों को संभालना
जब कोई C फ़ंक्शन cdecl का उपयोग करके कोई मान लौटाता है, तो वह उस मान को एक विशिष्ट रजिस्टर में रखता है, ताकि कॉल करने वाला उसे प्राप्त कर सके।
- पूर्णांक प्रकारों (जैसे
int,char,short) के लिए, लौटाया गया मान सामान्यतः EAX रजिस्टर में रखा जाता है (32-बिट x86 पर)। - बड़े या फ़्लोटिंग-पॉइंट प्रकारों के लिए अन्य रजिस्टर या मेमोरी स्थानों का उपयोग किया जा सकता है, लेकिन सरल पूर्णांक परिणामों के लिए EAX सबसे सामान्य है।
CALL निर्देश के लौटने के बाद, आप अपने C फ़ंक्शन का परिणाम प्राप्त करने के लिए सीधे EAX रजिस्टर का उपयोग कर सकते हैं।
बाहरी C फ़ंक्शन घोषित करना
इससे पहले कि आपका असेंबली कोड किसी C फ़ंक्शन को कॉल कर सके, आपको असेंबलर को बताना होगा कि वह फ़ंक्शन मौजूद है, लेकिन कहीं और परिभाषित किया गया है। यह काम extern निर्देश का उपयोग करके किया जाता है।
उदाहरण: extern printf
यह निर्देश असेंबलर को सूचित करता है कि printf एक बाहरी प्रतीक है। लिंक करने के चरण के दौरान, लिंकर (जैसे gcc) इस प्रतीक को वास्तविक C फ़ंक्शन के पते से जोड़ देगा, जिससे आपका असेंबली प्रोग्राम उसे चला सकेगा।
उदाहरण: C फ़ंक्शन को कॉल करना
आइए ऐसे सरल C फ़ंक्शन को कॉल करें, जो कोई तर्क नहीं लेता और कुछ भी वापस नहीं करता। हम 32-बिट x86 असेंबली का उपयोग करेंगे।
पहले, C कोड (c_funcs.c) को कंपाइल करें:
#include <stdio.h>
#include <stdlib.h>
void greet_c() {
printf("Hello from C's greet_c()!\n");
}
// Placeholder for next example
int add_c(int a, int b) {
return a + b;
}
अब, इस असेंबली कोड को चलाकर देखें:
extern greet_c
extern exit
section .text
global _start
_start:
call greet_c ; Call the C function
; Exit the program
push dword 0 ; Exit status 0
call exit
उदाहरण: तर्कों और परिणाम वाला C
अब, आइए ऐसे C फ़ंक्शन को कॉल करें जो तर्क लेता है और एक मान लौटाता है। 32-बिट x86 के लिए cdecl के नियम याद रखें:
- तर्कों को दाएँ से बाएँ पुश किया जाता है।
- स्टैक की सफ़ाई कॉल करने वाला करता है।
- लौटाया गया मान EAX में होता है।
पिछले दृश्य वाली अपनी c_funcs.c फ़ाइल में add_c फ़ंक्शन जोड़ें।
फिर, यह असेंबली कोड चलाएँ:
extern add_c
extern exit
extern printf
section .data
format_str db "Result from C: %d", 0xA, 0
section .text
global _start
_start:
; Call add_c(10, 20)
; Arguments pushed right-to-left on 32-bit stack
push dword 20 ; Push b
push dword 10 ; Push a
call add_c ; Call the C function
; EAX now holds the return value (30)
; Clean up the stack (2 arguments * 4 bytes each = 8 bytes)
add esp, 8
; Now print the result using C's printf
; For 32-bit cdecl, printf args are pushed right-to-left
push eax ; Push result from add_c (in EAX)
push dword format_str ; Push format string address
call printf
add esp, 8 ; Clean up printf's arguments
; Exit the program
push dword 0 ; Exit status 0
call exit
अपनी जानकारी जाँचें
मान लीजिए कि int calculate(int x, int y, int z); नामक एक C फ़ंक्शन है, जिसे आप cdecl कॉलिंग कन्वेंशन का उपयोग करके 32-बिट x86 असेंबली से कॉल करना चाहते हैं।
कौन-सा असेंबली निर्देश-क्रम स्टैक को सही ढंग से तैयार करता है, x=5, y=10, z=15 तर्कों के साथ calculate को कॉल करता है और स्टैक की सही सफ़ाई करता है?
पुनरावलोकन: असेंबली से C को कॉल करना
आपने अपने असेंबली प्रोग्रामों में C फ़ंक्शन को एकीकृत करना सफलतापूर्वक सीख लिया है!
- कॉलिंग कन्वेंशन: ये फ़ंक्शन की परस्पर क्रिया के लिए महत्वपूर्ण नियम होते हैं।
cdecl(32-बिट): तर्कों को स्टैक पर दाएँ से बाएँ पुश किया जाता है।- कॉल करने वाले द्वारा सफ़ाई: असेंबली कोड (कॉल करने वाला)
ADD ESP, Nका उपयोग करके स्टैक से तर्क हटाने के लिए ज़िम्मेदार होता है। - लौटाए गए मान: C फ़ंक्शन से मिले पूर्णांक परिणाम सामान्यतः EAX रजिस्टर में पाए जाते हैं।
externनिर्देश: अपने असेंबलर में C फ़ंक्शन घोषित करने के लिए इसका उपयोग करें।
यह कौशल आपको असेंबली के प्रदर्शन और निम्न-स्तरीय नियंत्रण को C की समृद्ध सुविधाओं और लाइब्रेरी के साथ जोड़ने की अनुमति देता है!
एआई शिक्षक के साथ Assembly सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 12
- पाठ
- 48
अक्सर पूछे जाने वाले प्रश्न
क्या “असेंबली से C को कॉल करना” पाठ निःशुल्क है?
हाँ—“असेंबली से C को कॉल करना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Assembly भाषा और x86 निम्न-स्तरीय सिस्टम प्रोग्रामिंग पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Assembly भाषा और x86 निम्न-स्तरीय सिस्टम प्रोग्रामिंग पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“असेंबली से C को कॉल करना” में मैं क्या सीखूँगा?
मानक कॉलिंग परंपराओं का पालन करते हुए अपने असेंबली कोड के भीतर से C फ़ंक्शन का आह्वान करना समझें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Assembly भाषा और x86 निम्न-स्तरीय सिस्टम प्रोग्रामिंग का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Assembly भाषा और x86 निम्न-स्तरीय सिस्टम प्रोग्रामिंग शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Assembly भाषा और x86 निम्न-स्तरीय सिस्टम प्रोग्रामिंग शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“असेंबली से C को कॉल करना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Assembly भाषा और x86 निम्न-स्तरीय सिस्टम प्रोग्रामिंग पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Assembly भाषा और x86 निम्न-स्तरीय सिस्टम प्रोग्रामिंग पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- C से असेंबली को कॉल करना
- असेंबली से C को कॉल करना
- मिश्रित-भाषा प्रोग्रामिंग तकनीकें
- कॉलिंग कन्वेंशन: cdecl, stdcall और System V