Ubuntu में GNU as कमांड गाइड: असेंबलर और कोड निष्पादन

परिचय

इस ट्यूटोरियल में हम GNU Assembler यानी as यूटिलिटी की कार्यप्रणाली को गहराई से समझेंगे और असेंबली भाषा में लिखे कोड को मशीन-पठनीय ऑब्जेक्ट फाइल में बदलने की संपूर्ण प्रक्रिया का अध्ययन करेंगे। इसमें आवश्यक टूलचेन पैकेज सेटअप करने से लेकर मुख्य कमांड फ्लैग्स के उपयोग, ld द्वारा बाइनरी लिंकिंग और निष्पादन कोड की जांच तक का व्यावहारिक अभ्यास शामिल है।

1. binutils पैकेज की स्थापना और as परिवेश की जांच

असेंबली प्रोग्रामिंग और कंपाइलेशन का व्यावहारिक अभ्यास शुरू करने के लिए सिस्टम पर binutils तथा gcc का मौजूद होना अनिवार्य है।

binutils और gcc पैकेज स्थापित करते हुए

सिस्टम टूलचेन में शामिल as यूटिलिटी वास्तव में GNU Assembler (GAS) का मुख्य इंटरफ़ेस है, जो निम्न-स्तरीय असेंबली कोड को ऑब्जेक्ट प्रारूप में बदलता है।
सिस्टम में मौजूद असेंबलर की रिलीज स्थिति और लक्षित प्रोसेसर आर्किटेक्चर की पुष्टि करने के लिए --version फ्लैग का उपयोग किया जाता है।
⚙️ [महत्वपूर्ण कमांड विकल्प]

-o : बनने वाली आउटपुट ऑब्जेक्ट फ़ाइल का कस्टम नाम निर्धारित करता है।
-g : सोर्स-लेवल डिबगर्स के लिए ऑब्जेक्ट कोड में डिबग सिंबल्स अंतर्निहित करता है।
-a : असेंबल किए गए कोड के साथ संबंधित मशीन कोड बाइट्स की विस्तृत लिस्टिंग दिखाता है।
--32 : 32-बिट प्रोसेसर आर्किटेक्चर के अनुकूल ऑब्जेक्ट फ़ाइल तैयार करता है।
--64 : 64-बिट प्रोसेसर आर्किटेक्चर के अनुकूल ऑब्जेक्ट फ़ाइल तैयार करता है।
-v अथवा --version : असेंबलर का संस्करण और बिल्ड विवरण स्क्रीन पर दिखाता है।

as वर्जन की जांच

2. असेंबली सोर्स फाइल का निर्माण और ऑब्जेक्ट कोड जनरेशन

प्रक्रिया को व्यवहार में देखने के लिए x86-64 आर्किटेक्चर हेतु एक प्राथमिक असेंबली फाइल exit_code.s तैयार करते हैं, जो निष्पादन समाप्ति पर कर्नेल को स्टेटस कोड 42 लौटाएगी।

exit_code.s असेंबली कोड तैयार करते हुए

लिखित सोर्स कोड को मशीन बाइनरी में बदलने के लिए as टूल के साथ -o विकल्प निर्दिष्ट करके exit_code.o ऑब्जेक्ट फाइल संकलित की जाती है।
सिंटैक्स में कोई त्रुटि न होने की स्थिति में असेंबलर बिना किसी स्क्रीन आउटपुट के प्रक्रिया को चुपचाप पूर्ण कर लेता है।

exit_code.s को exit_code.o में असेंबल करते हुए

ऑब्जेक्ट फ़ाइल के सही तरीके से उत्पन्न होने और उसके आकार की पुष्टि करने के लिए ls -l exit_code.o रन करके फाइल विवरण देखा जा सकता है।

निर्मित ऑब्जेक्ट फ़ाइल का सत्यापन

3. डिबग सिंबल्स (-g) शामिल करना और असेंबली लिस्टिंग (-a) देखना

GDB जैसे डिबगिंग टूल्स की मदद से कोड की लाइन-दर-लाइन ट्रेसिंग संभव बनाने के लिए -g फ्लैग का उपयोग किया जाता है, जिससे सिंबल-युक्त exit_code_debug.o फ़ाइल निर्मित होती है।
सफल निष्पादन पर टर्मिनल पर कोई अतिरिक्त संदेश प्रदर्शित नहीं होता।

डिबग सिंबल्स के साथ असेंबल करते हुए

यदि आप यह देखना चाहते हैं कि प्रत्येक असेंबली निर्देश किस हेक्साडेसिमल मशीन बाइट में अनुवादित हुआ है, तो -a=exit_code.lst पैरामीटर पास करके लिस्टिंग फ़ाइल तैयार की जा सकती है।
इस कमांड से मुख्य ऑब्जेक्ट फाइल exit_code.o के साथ-साथ संदर्भ डेटा वाली exit_code.lst फाइल भी तैयार हो जाती है।

लिस्टिंग फ़ाइल जनरेट करते हुए

उत्पन्न लिस्टिंग संरचना का अवलोकन करने के लिए head -n 20 exit_code.lst का उपयोग करके प्रारंभिक 20 पंक्तियाँ देखी जा सकती हैं।
इस आउटपुट में कोड की प्रत्येक पंक्ति संख्या, संबंधित मेमोरी ऑफसेट और समकक्ष हेक्साडेसिमल मशीन कोड को समानांतर रूप से स्पष्ट देखा जा सकता है।

लिस्टिंग फ़ाइल की प्रारंभिक पंक्तियाँ देखते हुए

4. ld लिंकर द्वारा निष्पादन योग्य बाइनरी बनाना और आउटपुट सत्यापन

तैयार की गई exit_code.o ऑब्जेक्ट फाइल अभी स्वतंत्र रूप से निष्पादन योग्य नहीं होती; इसे निष्पादन योग्य बाइनरी में बदलने के लिए GNU लिंकर ld -o exit_program exit_code.o का प्रयोग किया जाता है।
लिंकिंग प्रक्रिया बिना किसी अवरोध के पूरी होने पर exit_program नामक निष्पादन योग्य बाइनरी फाइल बन जाती है।

ऑब्जेक्ट फ़ाइल को लिंक करके बाइनरी बनाते हुए

निर्मित प्रोग्राम को चलाने के लिए टर्मिनल में सीधे ./exit_program कमांड निष्पादित की जाती है।
चूंकि यह प्रोग्राम स्क्रीन पर कुछ प्रिंट किए बिना सीधे समाप्त होता है, इसलिए कंसोल पर कोई टेक्स्ट नहीं दिखेगा।

तैयार बाइनरी प्रोग्राम का निष्पादन

प्रोग्राम द्वारा लौटाए गए एग्जिट कोड की पुष्टि करने के लिए तुरंत echo "종료 코드: $?" चलाकर अंतिम प्रोसेस का रिटर्न मान देखा जाता है।
टर्मिनल पर परिणाम प्रदर्शित होने से यह सिद्ध होता है कि सिस्टम कॉल ठीक से निष्पादित हुआ और प्रोसेस सामान्य रूप से समाप्त हो गया।

एग्जिट कोड की जांच

इस प्रकार हमने Ubuntu वातावरण में GNU as यूटिलिटी का उपयोग करके असेंबली कोड को ऑब्जेक्ट फाइल में बदलने, डिबग जानकारी प्रबंधित करने और अंतिम निष्पादन योग्य फ़ाइल तैयार करने की पूरी तकनीक सीखी। यह प्रक्रिया लिनक्स में सिस्टम-लेवल प्रोग्रामिंग और बाइनरी निर्माण के आंतरिक सिद्धांतों को समझने के लिए अत्यंत उपयोगी है।