नेटवाइड असेंबलर: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 17: Line 17:
}}
}}
नेटवाइड असेंबलर (एनएएसएम) [[इंटेल]] x[[86]] आर्किटेक्चर के लिए एक असेंबली भाषा # कोडांतरक और [[disassembler]] है। इसका उपयोग [[16-बिट]], [[32-बिट]] ([[IA-32]]) और [[64-बिट]] ([[x86-64]]) प्रोग्राम लिखने के लिए किया जा सकता है। इसे [[लिनक्स]] के लिए सबसे लोकप्रिय असेंबलरों में से एक माना जाता है।<ref>{{Cite web|url=http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html |title=Linux assemblers: A comparison of GAS and NASM |author=Ram Narayan |website=[[IBM]] |quote=two of the most popular assemblers for Linux, GNU Assembler (GAS) and Netwide Assembler (NASM) |url-status=dead |archive-url=https://web.archive.org/web/20131003180256/http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html |archive-date=3 October 2013}}</ref>
नेटवाइड असेंबलर (एनएएसएम) [[इंटेल]] x[[86]] आर्किटेक्चर के लिए एक असेंबली भाषा # कोडांतरक और [[disassembler]] है। इसका उपयोग [[16-बिट]], [[32-बिट]] ([[IA-32]]) और [[64-बिट]] ([[x86-64]]) प्रोग्राम लिखने के लिए किया जा सकता है। इसे [[लिनक्स]] के लिए सबसे लोकप्रिय असेंबलरों में से एक माना जाता है।<ref>{{Cite web|url=http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html |title=Linux assemblers: A comparison of GAS and NASM |author=Ram Narayan |website=[[IBM]] |quote=two of the most popular assemblers for Linux, GNU Assembler (GAS) and Netwide Assembler (NASM) |url-status=dead |archive-url=https://web.archive.org/web/20131003180256/http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html |archive-date=3 October 2013}}</ref>
यह मूल रूप से [[साइमन टाथम]] द्वारा जूलियन हॉल की सहायता से लिखा गया था। {{As of|2016}}, इसका रखरखाव एच. पीटर एनविन के नेतृत्व वाली एक छोटी टीम द्वारा किया जाता है।<ref name="Homepage">{{Cite web|url=http://nasm.sourceforge.net/|title=The Netwide Assembler|access-date=2008-06-27}}</ref> यह सरलीकृत (2-क्लॉज) बीएसडी लाइसेंस की शर्तों के तहत जारी [[खुला स्रोत सॉफ्टवेयर]] है।<ref name="VersionHistory">{{Cite web|url=https://www.nasm.us/doc/nasmdocc.html|title=NASM Version History|access-date=2019-08-03}}</ref>
यह मूल रूप से [[साइमन टाथम]] द्वारा जूलियन हॉल की सहायता से लिखा गया था। {{As of|2016}}, इसका रखरखाव एच. पीटर एनविन के नेतृत्व वाली एक छोटी टीम द्वारा किया जाता है।<ref name="Homepage">{{Cite web|url=http://nasm.sourceforge.net/|title=The Netwide Assembler|access-date=2008-06-27}}</ref> यह सरलीकृत (2-क्लॉज) बीएसडी लाइसेंस की शर्तों के तहत जारी [[खुला स्रोत सॉफ्टवेयर]] है।<ref name="VersionHistory">{{Cite web|url=https://www.nasm.us/doc/nasmdocc.html|title=NASM Version History|access-date=2019-08-03}}</ref>
== सुविधाएँ ==
== सुविधाएँ ==
NASM [[COFF]], OMF, a.out (फ़ाइल स्वरूप) | a.out, निष्पादन योग्य और लिंक करने योग्य स्वरूप (ELF), [[Mach-O]] और [[बाइनरी फ़ाइल]] (.bin, बाइनरी डिस्क छवि, सहित कई बाइनरी स्वरूपों का उत्पादन कर सकता है, जिसका उपयोग ऑपरेटिंग को संकलित करने के लिए किया जाता है। सिस्टम), हालांकि [[स्थिति-स्वतंत्र कोड]] केवल ईएलएफ [[वस्तु फ़ाइल]]ों के लिए समर्थित है। इसका अपना बाइनरी फॉर्मेट भी है जिसे RDOFF कहा जाता है।<ref name="Manual">{{Cite web|url=http://alien.dowling.edu/~rohit/nasmdoc0.html|title=NASM Manual|access-date=2009-08-15|url-status=dead|archive-url=https://web.archive.org/web/20090223104837/http://alien.dowling.edu/~rohit/nasmdoc0.html|archive-date=23 February 2009}}</ref>
NASM [[COFF]], OMF, a.out (फ़ाइल स्वरूप) | a.out, निष्पादन योग्य और लिंक करने योग्य स्वरूप (ELF), [[Mach-O]] और [[बाइनरी फ़ाइल]] (.bin, बाइनरी डिस्क छवि, सहित कई बाइनरी स्वरूपों का उत्पादन कर सकता है, जिसका उपयोग ऑपरेटिंग को संकलित करने के लिए किया जाता है। सिस्टम), हालांकि [[स्थिति-स्वतंत्र कोड]] केवल ईएलएफ [[वस्तु फ़ाइल|वस्तु फ़ाइलों]]ों के लिए समर्थित है। इसका अपना बाइनरी फॉर्मेट भी है जिसे RDOFF कहा जाता है।<ref name="Manual">{{Cite web|url=http://alien.dowling.edu/~rohit/nasmdoc0.html|title=NASM Manual|access-date=2009-08-15|url-status=dead|archive-url=https://web.archive.org/web/20090223104837/http://alien.dowling.edu/~rohit/nasmdoc0.html|archive-date=23 February 2009}}</ref>
आउटपुट स्वरूपों की विविधता कार्यक्रमों को वस्तुतः किसी भी x86 ऑपरेटिंग सिस्टम (OS) पर पुनः लक्षित करने की अनुमति देती है। यह [[बूटिंग]], [[केवल पढ़ने के लिये मेमोरी]] (ROM) छवियों और OS विकास के विभिन्न पहलुओं में लिखने के लिए उपयोग करने योग्य [[फ्लैट बाइनरी फ़ाइल]]ें भी बना सकता है।<ref name="Manual"/>यह असेंबली लैंग्वेज#क्रॉस असेंबलर जैसे [[पावरपीसी]] और एसपीएआरसी के रूप में गैर-x86 प्लेटफॉर्म पर चल सकता है, हालांकि यह उन मशीनों द्वारा प्रयोग करने योग्य प्रोग्राम उत्पन्न नहीं कर सकता है।
 
आउटपुट स्वरूपों की विविधता कार्यक्रमों को वस्तुतः किसी भी x86 ऑपरेटिंग सिस्टम (OS) पर पुनः लक्षित करने की अनुमति देती है। यह [[बूटिंग]], [[केवल पढ़ने के लिये मेमोरी]] (ROM) छवियों और OS विकास के विभिन्न पहलुओं में लिखने के लिए उपयोग करने योग्य [[फ्लैट बाइनरी फ़ाइल]]ें भी बना सकता है।<ref name="Manual" /> यह असेंबली लैंग्वेज#क्रॉस असेंबलर जैसे [[पावरपीसी]] और एसपीएआरसी के रूप में गैर-x86 प्लेटफॉर्म पर चल सकता है, हालांकि यह उन मशीनों द्वारा प्रयोग करने योग्य प्रोग्राम उत्पन्न नहीं कर सकता है।


NASM AT&T Corporation|AT&T सिंटैक्स के बजाय Intel असेंबली सिंटैक्स के एक प्रकार का उपयोग करता है।<ref name="Hyde">{{Cite web|url=http://webster.cs.ucr.edu/AsmTools/NASM/|title=NASM: The Netwide Assembler|access-date=2008-06-27|author=Randall Hyde|author-link=Randall Hyde|url-status=dead|archive-url=https://web.archive.org/web/20100912172954/http://webster.cs.ucr.edu/AsmTools/NASM/|archive-date=12 September 2010}}</ref> यह [[MASM]] और संगत असेंबलरों द्वारा उपयोग किए जाने वाले [[x86 मेमोरी सेगमेंटेशन]] ओवरराइड्स (और संबंधित ASSUME निर्देश) की स्वचालित पीढ़ी जैसी सुविधाओं से भी बचता है।<ref name="Manual"/>
NASM AT&T Corporation|AT&T सिंटैक्स के बजाय Intel असेंबली सिंटैक्स के एक प्रकार का उपयोग करता है।<ref name="Hyde">{{Cite web|url=http://webster.cs.ucr.edu/AsmTools/NASM/|title=NASM: The Netwide Assembler|access-date=2008-06-27|author=Randall Hyde|author-link=Randall Hyde|url-status=dead|archive-url=https://web.archive.org/web/20100912172954/http://webster.cs.ucr.edu/AsmTools/NASM/|archive-date=12 September 2010}}</ref> यह [[MASM]] और संगत असेंबलरों द्वारा उपयोग किए जाने वाले [[x86 मेमोरी सेगमेंटेशन]] ओवरराइड्स (और संबंधित ASSUME निर्देश) की स्वचालित पीढ़ी जैसी सुविधाओं से भी बचता है।<ref name="Manual"/>
== नमूना कार्यक्रम ==
== नमूना कार्यक्रम ==
एक हैलो, दुनिया! डॉस ऑपरेटिंग सिस्टम के लिए कार्यक्रम:
एक हैलो, दुनिया! डॉस ऑपरेटिंग सिस्टम के लिए कार्यक्रम:
<वाक्यविन्यास प्रकाश लैंग = nasm>
<वाक्यविन्यास प्रकाश लैंग = nasm>
खंड। पाठ
खंड। पाठ
संगठन 0x100
संगठन 0x100
मूव आह, 0x9
मूव आह, 0x9
एमओवी डीएक्स, हैलो
एमओवी डीएक्स, हैलो
इंट 0x21
इंट 0x21


मूव कुल्हाड़ी, 0x4c00
मूव कुल्हाड़ी, 0x4c00
इंट 0x21
इंट 0x21


खंड। डेटा
खंड। डेटा
हैलो: डीबी 'हैलो, दुनिया!', 13, 10, '$'
हैलो: डीबी 'हैलो, दुनिया!', 13, 10, '$'
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
लिनक्स के लिए एक समकक्ष कार्यक्रम:
लिनक्स के लिए एक समकक्ष कार्यक्रम:
<वाक्यविन्यास प्रकाश लैंग = nasm>
<वाक्यविन्यास प्रकाश लैंग = nasm>
ग्लोबल _स्टार्ट
ग्लोबल _स्टार्ट


खंड। पाठ
खंड। पाठ
_शुरू करना:
_शुरू करना:
मूव ईएक्स, 4; लिखना
मूव ईएक्स, 4; लिखना
मूव ईबीएक्स, 1; stout
मूव ईबीएक्स, 1; stout
मूव ईसीएक्स, संदेश
मूव ईसीएक्स, संदेश
Mov edx, msg.len
Mov edx, msg.len
इंट 0x80; लिखें (stdout, संदेश, strlen (संदेश));
इंट 0x80; लिखें (stdout, संदेश, strlen (संदेश));


एक्सोर ईएक्स, संदेश लेन; लिखने से उलटा वापसी मूल्य ()
एक्सोर ईएक्स, संदेश लेन; लिखने से उलटा वापसी मूल्य ()
एक्ससीजी ईएक्स, ईबीएक्स; बाहर निकलने के लिए मूल्य ()
एक्ससीजी ईएक्स, ईबीएक्स; बाहर निकलने के लिए मूल्य ()
मूव ईएक्स, 1; बाहर निकलना
मूव ईएक्स, 1; बाहर निकलना
इंट 0x80; बाहर निकलना(...)
इंट 0x80; बाहर निकलना(...)


खंड। डेटा
खंड। डेटा
संदेश: डीबी हैलो, दुनिया! , 10
संदेश: डीबी हैलो, दुनिया! , 10
.len: equ $ - msg
.len: equ $ - msg
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
Microsoft Windows के लिए समान प्रोग्राम का एक उदाहरण:
Microsoft Windows के लिए समान प्रोग्राम का एक उदाहरण:
<वाक्यविन्यास प्रकाश लैंग = nasm>
<वाक्यविन्यास प्रकाश लैंग = nasm>
वैश्विक _मुख्य
वैश्विक _मुख्य
बाहरी _MessageBoxA@16
बाहरी _MessageBoxA@16
बाहरी _ExitProcess@4
बाहरी _ExitProcess@4


खंड कोड use32 वर्ग = कोड
खंड कोड use32 वर्ग = कोड
_मुख्य:
_मुख्य:
पुश डवर्ड 0; यूआईएनटी यूटाइप = एमबी_ओके
पुश डवर्ड 0; यूआईएनटी यूटाइप = एमबी_ओके
धक्का शब्द शीर्षक; LPCSTR lpCaption
धक्का शब्द शीर्षक; LPCSTR lpCaption
धक्का बैनर; एलपीसीएसटी एलपीटेक्स्ट
धक्का बैनर; एलपीसीएसटी एलपीटेक्स्ट
पुश डवर्ड 0; एचडब्ल्यूएनडी एचडब्ल्यूएनडी = न्यूल
पुश डवर्ड 0; एचडब्ल्यूएनडी एचडब्ल्यूएनडी = न्यूल
_MessageBoxA@16 पर कॉल करें
_MessageBoxA@16 पर कॉल करें


पुश डवर्ड 0; यूआईएनटी यूएक्सिटकोड
पुश डवर्ड 0; यूआईएनटी यूएक्सिटकोड
_ExitProcess@4 पर कॉल करें
_ExitProcess@4 पर कॉल करें


सेक्शन डेटा यूज़32 क्लास=डेटा
सेक्शन डेटा यूज़32 क्लास=डेटा
बैनर: db 'Hello, World!', 0
बैनर: db 'Hello, World!', 0
शीर्षक: डीबी 'हैलो', 0
शीर्षक: डीबी 'हैलो', 0
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
Apple [[OS X]] के लिए एक 64-बिट प्रोग्राम जो [[की]]स्ट्रोक इनपुट करता है और इसे स्क्रीन पर दिखाता है:
Apple [[OS X]] के लिए एक 64-बिट प्रोग्राम जो [[की]]स्ट्रोक इनपुट करता है और इसे स्क्रीन पर दिखाता है:
<वाक्यविन्यास प्रकाश लैंग = nasm>
<वाक्यविन्यास प्रकाश लैंग = nasm>
ग्लोबल _स्टार्ट
ग्लोबल _स्टार्ट


Line 87: Line 130:


query_string: db एक वर्ण दर्ज करें:
query_string: db एक वर्ण दर्ज करें:
query_string_len: बराबर $ - query_string
query_string_len: बराबर $ - query_string
out_string: db आपके पास इनपुट है:
out_string: db आपके पास इनपुट है:
out_string_len: बराबर $ - out_string
out_string_len: बराबर $ - out_string


Line 100: Line 146:


मूव रैक्स, 0x2000004; राइट-सिस्टम-कॉल-कोड को रजिस्टर रैक्स में डालें
मूव रैक्स, 0x2000004; राइट-सिस्टम-कॉल-कोड को रजिस्टर रैक्स में डालें
मूव आरडीआई, 1; स्टडआउट का उपयोग करने के लिए कर्नेल को बताएं
मूव आरडीआई, 1; स्टडआउट का उपयोग करने के लिए कर्नेल को बताएं
मूव आरएसआई, query_string; आरएसआई वह जगह है जहां कर्नेल संदेश का पता खोजने की अपेक्षा करता है
मूव आरएसआई, query_string; आरएसआई वह जगह है जहां कर्नेल संदेश का पता खोजने की अपेक्षा करता है
एमओवी आरडीएक्स, query_string_len; और rdx वह जगह है जहाँ कर्नेल संदेश की लंबाई खोजने की अपेक्षा करता है
एमओवी आरडीएक्स, query_string_len; और rdx वह जगह है जहाँ कर्नेल संदेश की लंबाई खोजने की अपेक्षा करता है
syscall
syscall


; चरित्र में पढ़ें
; चरित्र में पढ़ें
मूव रैक्स, 0x2000003; सिस्टम कॉल पढ़ें
मूव रैक्स, 0x2000003; सिस्टम कॉल पढ़ें
मूव आरडीआई, 0; stdin
मूव आरडीआई, 0; stdin
मूव आरएसआई, in_char; भण्डारण के लिए पता, खंड .bss में घोषित
मूव आरएसआई, in_char; भण्डारण के लिए पता, खंड .bss में घोषित
मूव आरडीएक्स, 2; कर्नेल के बफर से 2 बाइट प्राप्त करें (कैरिज रिटर्न के लिए एक)
मूव आरडीएक्स, 2; कर्नेल के बफर से 2 बाइट प्राप्त करें (कैरिज रिटर्न के लिए एक)
syscall
syscall


; उपयोगकर्ता को आउटपुट दिखाएं
; उपयोगकर्ता को आउटपुट दिखाएं
मूव रैक्स, 0x2000004; सिस्टम कॉल लिखें
मूव रैक्स, 0x2000004; सिस्टम कॉल लिखें
मूव आरडीआई, 1; stout
मूव आरडीआई, 1; stout
मूव आरएसआई, आउट_स्ट्रिंग
मूव आरएसआई, आउट_स्ट्रिंग
एमओवी आरडीएक्स, out_string_len
एमओवी आरडीएक्स, out_string_len
syscall
syscall


मूव रैक्स, 0x2000004; सिस्टम कॉल लिखें
मूव रैक्स, 0x2000004; सिस्टम कॉल लिखें
मूव आरडीआई, 1; stout
मूव आरडीआई, 1; stout
मूव आरएसआई, in_char
मूव आरएसआई, in_char
मूव आरडीएक्स, 2; दूसरा बाइट स्ट्रिंग में अपेक्षित कैरिज रिटर्न लागू करना है
मूव आरडीएक्स, 2; दूसरा बाइट स्ट्रिंग में अपेक्षित कैरिज रिटर्न लागू करना है
syscall
syscall


; सिस्टम कॉल से बाहर निकलें
; सिस्टम कॉल से बाहर निकलें
मूव रैक्स, 0x2000001; सिस्टम कॉल से बाहर निकलें
मूव रैक्स, 0x2000001; सिस्टम कॉल से बाहर निकलें
एक्सोर आरडीआई, आरडीआई
एक्सोर आरडीआई, आरडीआई
syscall
syscall
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


== लिंकिंग ==
== लिंकिंग ==
एनएएसएम मुख्य रूप से ऑब्जेक्ट फाइलों को आउटपुट करता है, जो आम तौर पर स्वयं निष्पादन योग्य नहीं होते हैं। इसका एकमात्र अपवाद फ्लैट बायनेरिज़ हैं (उदा., .COM)<ref name="Manual"/>जो आधुनिक उपयोग में स्वाभाविक रूप से सीमित हैं। ऑब्जेक्ट फ़ाइलों को निष्पादन योग्य प्रोग्राम में अनुवाद करने के लिए, एक उपयुक्त [[लिंकर (कंप्यूटिंग)]] का उपयोग किया जाना चाहिए, जैसे कि विंडोज़ के लिए [[विजुअल स्टूडियो]] लिंक यूटिलिटी या यूनिक्स जैसी प्रणालियों के लिए [[जीएनयू लिंकर]]।
एनएएसएम मुख्य रूप से ऑब्जेक्ट फाइलों को आउटपुट करता है, जो आम तौर पर स्वयं निष्पादन योग्य नहीं होते हैं। इसका एकमात्र अपवाद फ्लैट बायनेरिज़ हैं (उदा., .COM)<ref name="Manual"/> जो आधुनिक उपयोग में स्वाभाविक रूप से सीमित हैं। ऑब्जेक्ट फ़ाइलों को निष्पादन योग्य प्रोग्राम में अनुवाद करने के लिए, एक उपयुक्त [[लिंकर (कंप्यूटिंग)]] का उपयोग किया जाना चाहिए, जैसे कि विंडोज़ के लिए [[विजुअल स्टूडियो]] लिंक यूटिलिटी या यूनिक्स जैसी प्रणालियों के लिए [[जीएनयू लिंकर]]।


== विकास ==
== विकास ==
NASM संस्करण 0.90 अक्टूबर 1996 में जारी किया गया था।<ref name="VersionHistory"/>
NASM संस्करण 0.90 अक्टूबर 1996 में जारी किया गया था।<ref name="VersionHistory"/>


संस्करण 2.00 को 28 नवंबर 2007 को जारी किया गया था, जिसमें x86-64 एक्सटेंशन के लिए समर्थन जोड़ा गया था।<ref name="Homepage"/>विकास संस्करण SourceForge.net पर अपलोड नहीं किए गए हैं, लेकिन प्रोजेक्ट वेब पेज से उपलब्ध बाइनरी स्नैपशॉट के साथ गिटहब में चेक किए गए हैं।
संस्करण 2.00 को 28 नवंबर 2007 को जारी किया गया था, जिसमें x86-64 एक्सटेंशन के लिए समर्थन जोड़ा गया था।<ref name="Homepage"/> विकास संस्करण SourceForge.net पर अपलोड नहीं किए गए हैं, लेकिन प्रोजेक्ट वेब पेज से उपलब्ध बाइनरी स्नैपशॉट के साथ गिटहब में चेक किए गए हैं।


NASM प्रलेखन के लिए एक खोज इंजन भी उपलब्ध है।<ref name="ManualSearch">{{Cite web|url=http://alien.dowling.edu/~rohit/search/srch/search.php|title=NASM Doc Search Engine|access-date=2009-09-14|url-status=dead|archive-url=https://web.archive.org/web/20100123001130/http://alien.dowling.edu/~rohit/search/srch/search.php|archive-date=23 January 2010}}</ref>
NASM प्रलेखन के लिए एक खोज इंजन भी उपलब्ध है।<ref name="ManualSearch">{{Cite web|url=http://alien.dowling.edu/~rohit/search/srch/search.php|title=NASM Doc Search Engine|access-date=2009-09-14|url-status=dead|archive-url=https://web.archive.org/web/20100123001130/http://alien.dowling.edu/~rohit/search/srch/search.php|archive-date=23 January 2010}}</ref>
जुलाई 2009 में, संस्करण 2.07 के अनुसार, NASM को सरलीकृत (2-खंड) BSD लाइसेंस के तहत जारी किया गया था। पहले, क्योंकि इसे [[जीएनयू लेसर जनरल पब्लिक लाइसेंस]] के तहत लाइसेंस दिया गया था, इसने Yasm के विकास का नेतृत्व किया, BSD लाइसेंस # 3-क्लॉज के तहत एक पूर्ण पुनर्लेखन। Yasm ने NASM से पहले x86-64 के लिए समर्थन की पेशकश की। इसने GNU असेंबलर सिंटैक्स के लिए समर्थन भी जोड़ा।
जुलाई 2009 में, संस्करण 2.07 के अनुसार, NASM को सरलीकृत (2-खंड) BSD लाइसेंस के तहत जारी किया गया था। पहले, क्योंकि इसे [[जीएनयू लेसर जनरल पब्लिक लाइसेंस]] के तहत लाइसेंस दिया गया था, इसने Yasm के विकास का नेतृत्व किया, BSD लाइसेंस # 3-क्लॉज के तहत एक पूर्ण पुनर्लेखन। Yasm ने NASM से पहले x86-64 के लिए समर्थन की पेशकश की। इसने GNU असेंबलर सिंटैक्स के लिए समर्थन भी जोड़ा।


Line 146: Line 212:


अक्टूबर 1996 में संस्करण 0.90 जारी होने तक, NASM ने केवल फ्लैट-प्रारूप निष्पादन योग्य फ़ाइलों (जैसे, DOS COM फ़ाइलें) के आउटपुट का समर्थन किया। संस्करण 0.90 में, साइमन टैथम ने ऑब्जेक्ट-फ़ाइल आउटपुट इंटरफ़ेस के लिए और केवल 16-बिट कोड के लिए DOS .OBJ फ़ाइलों के लिए समर्थन जोड़ा।<ref name="CVS">{{cite web|url=http://nasm.cvs.sourceforge.net/nasm/nasm/CHANGES?revision=1.48&view=markup|title=NASM CVS|date=2008-06-08|access-date=2008-06-27}}</ref>
अक्टूबर 1996 में संस्करण 0.90 जारी होने तक, NASM ने केवल फ्लैट-प्रारूप निष्पादन योग्य फ़ाइलों (जैसे, DOS COM फ़ाइलें) के आउटपुट का समर्थन किया। संस्करण 0.90 में, साइमन टैथम ने ऑब्जेक्ट-फ़ाइल आउटपुट इंटरफ़ेस के लिए और केवल 16-बिट कोड के लिए DOS .OBJ फ़ाइलों के लिए समर्थन जोड़ा।<ref name="CVS">{{cite web|url=http://nasm.cvs.sourceforge.net/nasm/nasm/CHANGES?revision=1.48&view=markup|title=NASM CVS|date=2008-06-08|access-date=2008-06-27}}</ref>
NASM में इस प्रकार 32-बिट ऑब्जेक्ट प्रारूप का अभाव था। इस कमी को दूर करने के लिए, और ऑब्जेक्ट-फाइल इंटरफ़ेस सीखने के अभ्यास के रूप में, डेवलपर जूलियन हॉल ने RDOFF के पहले संस्करण को एक साथ रखा, जिसे NASM संस्करण 0.91 में जारी किया गया था।<ref name="CVS"/>
 
NASM में इस प्रकार 32-बिट ऑब्जेक्ट प्रारूप का अभाव था। इस कमी को दूर करने के लिए, और ऑब्जेक्ट-फाइल इंटरफ़ेस सीखने के अभ्यास के रूप में, डेवलपर जूलियन हॉल ने RDOFF के पहले संस्करण को एक साथ रखा, जिसे NASM संस्करण 0.91 में जारी किया गया था।<ref name="CVS" />


इस प्रारंभिक संस्करण के बाद से, RDOFF प्रारूप में एक प्रमुख अद्यतन किया गया है, जिसमें प्रत्येक हेडर रिकॉर्ड पर एक रिकॉर्ड-लंबाई संकेतक जोड़ा गया है,<ref>{{cite web|url=http://nasm.cvs.sourceforge.net/nasm/nasm/rdoff/doc/v1-v2.txt?revision=1.1&view=markup|title=V1-V2.txt|date=2002-12-04|access-date=2008-06-27}}</ref> कार्यक्रमों को उन रिकॉर्डों को छोड़ने की अनुमति देना जिनके प्रारूप को वे नहीं पहचानते हैं, और कई खंडों के लिए समर्थन करते हैं; RDOFF1 केवल तीन खंडों का समर्थन करता है: पाठ, डेटा और bss (जिसमें गैर-प्रारंभिक डेटा शामिल है)।<ref name = "manual"/>
इस प्रारंभिक संस्करण के बाद से, RDOFF प्रारूप में एक प्रमुख अद्यतन किया गया है, जिसमें प्रत्येक हेडर रिकॉर्ड पर एक रिकॉर्ड-लंबाई संकेतक जोड़ा गया है,<ref>{{cite web|url=http://nasm.cvs.sourceforge.net/nasm/nasm/rdoff/doc/v1-v2.txt?revision=1.1&view=markup|title=V1-V2.txt|date=2002-12-04|access-date=2008-06-27}}</ref> कार्यक्रमों को उन रिकॉर्डों को छोड़ने की अनुमति देना जिनके प्रारूप को वे नहीं पहचानते हैं, और कई खंडों के लिए समर्थन करते हैं; RDOFF1 केवल तीन खंडों का समर्थन करता है: पाठ, डेटा और bss (जिसमें गैर-प्रारंभिक डेटा शामिल है)।<ref name = "manual"/>

Revision as of 23:44, 24 February 2023

NASM
Original author(s)Simon Tatham, Julian Hall
Developer(s)H. Peter Anvin, Chang Seok Bae, Jim Kukunas, Frank B. Kotler, Cyrill Gorcunov
Initial releaseOctober 1996; 27 years ago (1996-10)
Stable release
Script error: The module returned a nil value. It is supposed to return an export table. / Script error: The module returned a nil value. It is supposed to return an export table.; Error: first parameter cannot be parsed as a date or time. (Script error: The module returned a nil value. It is supposed to return an export table.)

नेटवाइड असेंबलर (एनएएसएम) इंटेल x86 आर्किटेक्चर के लिए एक असेंबली भाषा # कोडांतरक और disassembler है। इसका उपयोग 16-बिट, 32-बिट (IA-32) और 64-बिट (x86-64) प्रोग्राम लिखने के लिए किया जा सकता है। इसे लिनक्स के लिए सबसे लोकप्रिय असेंबलरों में से एक माना जाता है।[2]

यह मूल रूप से साइमन टाथम द्वारा जूलियन हॉल की सहायता से लिखा गया था। As of 2016, इसका रखरखाव एच. पीटर एनविन के नेतृत्व वाली एक छोटी टीम द्वारा किया जाता है।[3] यह सरलीकृत (2-क्लॉज) बीएसडी लाइसेंस की शर्तों के तहत जारी खुला स्रोत सॉफ्टवेयर है।[4]

सुविधाएँ

NASM COFF, OMF, a.out (फ़ाइल स्वरूप) | a.out, निष्पादन योग्य और लिंक करने योग्य स्वरूप (ELF), Mach-O और बाइनरी फ़ाइल (.bin, बाइनरी डिस्क छवि, सहित कई बाइनरी स्वरूपों का उत्पादन कर सकता है, जिसका उपयोग ऑपरेटिंग को संकलित करने के लिए किया जाता है। सिस्टम), हालांकि स्थिति-स्वतंत्र कोड केवल ईएलएफ वस्तु फ़ाइलोंों के लिए समर्थित है। इसका अपना बाइनरी फॉर्मेट भी है जिसे RDOFF कहा जाता है।[5]

आउटपुट स्वरूपों की विविधता कार्यक्रमों को वस्तुतः किसी भी x86 ऑपरेटिंग सिस्टम (OS) पर पुनः लक्षित करने की अनुमति देती है। यह बूटिंग, केवल पढ़ने के लिये मेमोरी (ROM) छवियों और OS विकास के विभिन्न पहलुओं में लिखने के लिए उपयोग करने योग्य फ्लैट बाइनरी फ़ाइलें भी बना सकता है।[5] यह असेंबली लैंग्वेज#क्रॉस असेंबलर जैसे पावरपीसी और एसपीएआरसी के रूप में गैर-x86 प्लेटफॉर्म पर चल सकता है, हालांकि यह उन मशीनों द्वारा प्रयोग करने योग्य प्रोग्राम उत्पन्न नहीं कर सकता है।

NASM AT&T Corporation|AT&T सिंटैक्स के बजाय Intel असेंबली सिंटैक्स के एक प्रकार का उपयोग करता है।[6] यह MASM और संगत असेंबलरों द्वारा उपयोग किए जाने वाले x86 मेमोरी सेगमेंटेशन ओवरराइड्स (और संबंधित ASSUME निर्देश) की स्वचालित पीढ़ी जैसी सुविधाओं से भी बचता है।[5]

नमूना कार्यक्रम

एक हैलो, दुनिया! डॉस ऑपरेटिंग सिस्टम के लिए कार्यक्रम:

<वाक्यविन्यास प्रकाश लैंग = nasm>

खंड। पाठ

संगठन 0x100

मूव आह, 0x9

एमओवी डीएक्स, हैलो

इंट 0x21

मूव कुल्हाड़ी, 0x4c00

इंट 0x21

खंड। डेटा

हैलो: डीबी 'हैलो, दुनिया!', 13, 10, '$'

</वाक्यविन्यास हाइलाइट>

लिनक्स के लिए एक समकक्ष कार्यक्रम:

<वाक्यविन्यास प्रकाश लैंग = nasm>

ग्लोबल _स्टार्ट

खंड। पाठ

_शुरू करना:

मूव ईएक्स, 4; लिखना

मूव ईबीएक्स, 1; stout

मूव ईसीएक्स, संदेश

Mov edx, msg.len

इंट 0x80; लिखें (stdout, संदेश, strlen (संदेश));

एक्सोर ईएक्स, संदेश लेन; लिखने से उलटा वापसी मूल्य ()

एक्ससीजी ईएक्स, ईबीएक्स; बाहर निकलने के लिए मूल्य ()

मूव ईएक्स, 1; बाहर निकलना

इंट 0x80; बाहर निकलना(...)

खंड। डेटा

संदेश: डीबी हैलो, दुनिया! , 10

.len: equ $ - msg

</वाक्यविन्यास हाइलाइट>

Microsoft Windows के लिए समान प्रोग्राम का एक उदाहरण:

<वाक्यविन्यास प्रकाश लैंग = nasm>

वैश्विक _मुख्य

बाहरी _MessageBoxA@16

बाहरी _ExitProcess@4

खंड कोड use32 वर्ग = कोड

_मुख्य:

पुश डवर्ड 0; यूआईएनटी यूटाइप = एमबी_ओके

धक्का शब्द शीर्षक; LPCSTR lpCaption

धक्का बैनर; एलपीसीएसटी एलपीटेक्स्ट

पुश डवर्ड 0; एचडब्ल्यूएनडी एचडब्ल्यूएनडी = न्यूल

_MessageBoxA@16 पर कॉल करें

पुश डवर्ड 0; यूआईएनटी यूएक्सिटकोड

_ExitProcess@4 पर कॉल करें

सेक्शन डेटा यूज़32 क्लास=डेटा

बैनर: db 'Hello, World!', 0

शीर्षक: डीबी 'हैलो', 0 </वाक्यविन्यास हाइलाइट>

Apple OS X के लिए एक 64-बिट प्रोग्राम जो कीस्ट्रोक इनपुट करता है और इसे स्क्रीन पर दिखाता है:

<वाक्यविन्यास प्रकाश लैंग = nasm>

ग्लोबल _स्टार्ट

खंड। डेटा

query_string: db एक वर्ण दर्ज करें:

query_string_len: बराबर $ - query_string

out_string: db आपके पास इनपुट है:

out_string_len: बराबर $ - out_string

अनुभाग .बीएसएस

in_char: resw 4

खंड। पाठ

_शुरू करना:

मूव रैक्स, 0x2000004; राइट-सिस्टम-कॉल-कोड को रजिस्टर रैक्स में डालें

मूव आरडीआई, 1; स्टडआउट का उपयोग करने के लिए कर्नेल को बताएं

मूव आरएसआई, query_string; आरएसआई वह जगह है जहां कर्नेल संदेश का पता खोजने की अपेक्षा करता है

एमओवी आरडीएक्स, query_string_len; और rdx वह जगह है जहाँ कर्नेल संदेश की लंबाई खोजने की अपेक्षा करता है

syscall

चरित्र में पढ़ें

मूव रैक्स, 0x2000003; सिस्टम कॉल पढ़ें

मूव आरडीआई, 0; stdin

मूव आरएसआई, in_char; भण्डारण के लिए पता, खंड .bss में घोषित

मूव आरडीएक्स, 2; कर्नेल के बफर से 2 बाइट प्राप्त करें (कैरिज रिटर्न के लिए एक)

syscall

उपयोगकर्ता को आउटपुट दिखाएं

मूव रैक्स, 0x2000004; सिस्टम कॉल लिखें

मूव आरडीआई, 1; stout

मूव आरएसआई, आउट_स्ट्रिंग

एमओवी आरडीएक्स, out_string_len

syscall

मूव रैक्स, 0x2000004; सिस्टम कॉल लिखें

मूव आरडीआई, 1; stout

मूव आरएसआई, in_char

मूव आरडीएक्स, 2; दूसरा बाइट स्ट्रिंग में अपेक्षित कैरिज रिटर्न लागू करना है

syscall

सिस्टम कॉल से बाहर निकलें

मूव रैक्स, 0x2000001; सिस्टम कॉल से बाहर निकलें

एक्सोर आरडीआई, आरडीआई

syscall

</वाक्यविन्यास हाइलाइट>

लिंकिंग

एनएएसएम मुख्य रूप से ऑब्जेक्ट फाइलों को आउटपुट करता है, जो आम तौर पर स्वयं निष्पादन योग्य नहीं होते हैं। इसका एकमात्र अपवाद फ्लैट बायनेरिज़ हैं (उदा., .COM)[5] जो आधुनिक उपयोग में स्वाभाविक रूप से सीमित हैं। ऑब्जेक्ट फ़ाइलों को निष्पादन योग्य प्रोग्राम में अनुवाद करने के लिए, एक उपयुक्त लिंकर (कंप्यूटिंग) का उपयोग किया जाना चाहिए, जैसे कि विंडोज़ के लिए विजुअल स्टूडियो लिंक यूटिलिटी या यूनिक्स जैसी प्रणालियों के लिए जीएनयू लिंकर

विकास

NASM संस्करण 0.90 अक्टूबर 1996 में जारी किया गया था।[4]

संस्करण 2.00 को 28 नवंबर 2007 को जारी किया गया था, जिसमें x86-64 एक्सटेंशन के लिए समर्थन जोड़ा गया था।[3] विकास संस्करण SourceForge.net पर अपलोड नहीं किए गए हैं, लेकिन प्रोजेक्ट वेब पेज से उपलब्ध बाइनरी स्नैपशॉट के साथ गिटहब में चेक किए गए हैं।

NASM प्रलेखन के लिए एक खोज इंजन भी उपलब्ध है।[7]

जुलाई 2009 में, संस्करण 2.07 के अनुसार, NASM को सरलीकृत (2-खंड) BSD लाइसेंस के तहत जारी किया गया था। पहले, क्योंकि इसे जीएनयू लेसर जनरल पब्लिक लाइसेंस के तहत लाइसेंस दिया गया था, इसने Yasm के विकास का नेतृत्व किया, BSD लाइसेंस # 3-क्लॉज के तहत एक पूर्ण पुनर्लेखन। Yasm ने NASM से पहले x86-64 के लिए समर्थन की पेशकश की। इसने GNU असेंबलर सिंटैक्स के लिए समर्थन भी जोड़ा।

आरडीओएफएफ

एनएएसएम की ऑब्जेक्ट फ़ाइल आउटपुट क्षमताओं की अखंडता का परीक्षण करने के लिए डेवलपर्स द्वारा पुनर्निधारणीय गतिशील ऑब्जेक्ट फ़ाइल स्वरूप (आरडीओएफएफ) का उपयोग किया जाता है। यह काफी हद तक NASM की आंतरिक संरचना पर आधारित है,[8] अनिवार्य रूप से आउटपुट ड्राइवर फ़ंक्शन कॉल के क्रमांकन वाले हेडर से युक्त होता है, जिसके बाद निष्पादन योग्य कोड या डेटा वाले अनुभागों की एक सरणी होती है। एनएएसएम वितरण में लिंकर और लोडर सहित प्रारूप का उपयोग करने के लिए उपकरण शामिल हैं।

अक्टूबर 1996 में संस्करण 0.90 जारी होने तक, NASM ने केवल फ्लैट-प्रारूप निष्पादन योग्य फ़ाइलों (जैसे, DOS COM फ़ाइलें) के आउटपुट का समर्थन किया। संस्करण 0.90 में, साइमन टैथम ने ऑब्जेक्ट-फ़ाइल आउटपुट इंटरफ़ेस के लिए और केवल 16-बिट कोड के लिए DOS .OBJ फ़ाइलों के लिए समर्थन जोड़ा।[9]

NASM में इस प्रकार 32-बिट ऑब्जेक्ट प्रारूप का अभाव था। इस कमी को दूर करने के लिए, और ऑब्जेक्ट-फाइल इंटरफ़ेस सीखने के अभ्यास के रूप में, डेवलपर जूलियन हॉल ने RDOFF के पहले संस्करण को एक साथ रखा, जिसे NASM संस्करण 0.91 में जारी किया गया था।[9]

इस प्रारंभिक संस्करण के बाद से, RDOFF प्रारूप में एक प्रमुख अद्यतन किया गया है, जिसमें प्रत्येक हेडर रिकॉर्ड पर एक रिकॉर्ड-लंबाई संकेतक जोड़ा गया है,[10] कार्यक्रमों को उन रिकॉर्डों को छोड़ने की अनुमति देना जिनके प्रारूप को वे नहीं पहचानते हैं, और कई खंडों के लिए समर्थन करते हैं; RDOFF1 केवल तीन खंडों का समर्थन करता है: पाठ, डेटा और bss (जिसमें गैर-प्रारंभिक डेटा शामिल है)।[8]

RDOFF प्रारूप को दृढ़ता से बहिष्कृत किया गया है और इसे NASM 2.15.04 से अक्षम कर दिया गया है।[11]

यह भी देखें

  • सभा की भाषा
  • कोडांतरकों की तुलना

संदर्भ

  1. "NASM, the Netwide Assembler". GitHub. 25 October 2021.
  2. Ram Narayan. "Linux assemblers: A comparison of GAS and NASM". IBM. Archived from the original on 3 October 2013. two of the most popular assemblers for Linux, GNU Assembler (GAS) and Netwide Assembler (NASM)
  3. 3.0 3.1 "The Netwide Assembler". Retrieved 2008-06-27.
  4. 4.0 4.1 "NASM Version History". Retrieved 2019-08-03.
  5. 5.0 5.1 5.2 5.3 "NASM Manual". Archived from the original on 23 February 2009. Retrieved 2009-08-15.
  6. Randall Hyde. "NASM: The Netwide Assembler". Archived from the original on 12 September 2010. Retrieved 2008-06-27.
  7. "NASM Doc Search Engine". Archived from the original on 23 January 2010. Retrieved 2009-09-14.
  8. 8.0 8.1 "NASM Manual Ch. 6". Retrieved 2008-06-27.
  9. 9.0 9.1 "NASM CVS". 2008-06-08. Retrieved 2008-06-27.
  10. "V1-V2.txt". 2002-12-04. Retrieved 2008-06-27.
  11. "Relocatable Dynamic Object File Format (deprecated)".

अग्रिम पठन

बाहरी संबंध