نت‌واید اسمبلر

نتواید اسمبلر (به انگلیسی: Netwide Assembler) یا به اختصار نسم (به انگلیسی: NASM) یک اسمبلر و دی‌اسمبلر برای معماری اینتل ایکس۸۶ است. از این اسمبلر می‌توان برای نوشتن برنامه‌های ۱۶-بیتی، ۳۲-بیتی و ۶۴-بیتی استفاده کرد. نسم به عنوان یکی از محبوب‌ترین اسمبلرها برای لینوکس[۱] و دیگر سیستم‌عامل‌های شبه یونیکس مانند بی‌اس‌دی شناخته می‌شود. نسم در ابتدا توسط سیمون تاتام و با همکاری ژولیان هال نوشته شد و در حال حاضر توسط تیم کوچکی به رهبری پیتر انوین[۲] نگه‌داری می‌شود. نسم یک نرم‌افزار آزاد است و تحت پروانه بی‌اس‌دی عرضه می‌شود.[۳] نسم قادر به تولید کردن انواع مختلفی از فایل‌های باینری از جمله COFF, ELF, a.out, Mach-O و پرونده دودویی (دیسک تصویر باینری که برای کامپایل سیستم‌عامل‌ها استفاده می‌شود) است. با این حال، نسم تنها می‌تواند برای قالب ELF کد مستقل از جایگاه (به انگلیسی: position-independent code) تولید کند. همچنین نسم یک قالب باینری مخصوص به خود به نام RDOF دارد.[۴]

نتواید اسمبلر
نویسنده(های)
اصلی
سیمون تاتام، ژولیان هال
توسعه‌دهنده(ها)پیتر انوین
مخزن
سیستم‌عاملمایکروسافت ویندوز، شبه یونیکس، داس، اواس/۲ و مک اواس ده
مجوزپروانه بی‌اس‌دی
وبگاهwww.nasm.us ویرایش این در ویکی‌داده

تنوع قالب‌های خروجی که نسم قادر به تولید آنهاست، به برنامه‌ها اجازه می‌دهد تا تقریباً بر روی همه سیستم‌عامل‌های اکس۸۶ retarget شوند. به علاوه، نسم می‌تواند فایل‌های باینری مسطح تولید کند که این گونه فایل‌ها برای نوشتن بوت لودرها، تصاویر ROM، و دیگر وجوه توسعه سیستم‌عامل استفاده می‌شوند.[۴] نسم می‌تواند بر روی سکوهای غیر اکس۸۶ نظیر پاورپی‌سی و اسپارک هم اجرا شود، هر چند که نمی‌تواند برنامه‌هایی که مخصوص این ماشین‌ها هستند را تولید کند. سینتکس مورد استفاده در نسم، گونه‌ای از سینتکس اسمبلی اینتل است و نسم از سینتکس AT&T استفاده نمی‌کند.

پیوند دادن

نسم تنها فایل‌های مقصود را تولید می‌کند که این فایل‌ها به تنهایی قابل اجرا نیستند. برای تبدیل کردن این فایل‌های مخصوص به برنامه قابل اجرا، باید از یک برنامه خاصی به نام پیوندده استفاده کرد. برای مثال ابزاری به نام LINK در نرم‌افزار ویژوال استودیو یا برنامه ld در سیستم‌عامل‌های شبه یونیکس این کار را انجام می‌دهد.

مثال

یک برنامه Hello World برای سیستم‌عامل ام‌اس-داس:

section .textorg 0x100mov ah, 0x9mov dx, helloint 0x21mov ax, 0x4c00int 0x21section .datahello: db 'Hello, world!', 13, 10, '$'

مثالی مشابه برای مایکروسافت ویندوز:

global _mainextern _MessageBoxA@16extern _ExitProcess@4section code use32 class=code_main:push dword 0 ; UINT uType = MB_OKpush dword title ; LPCSTR lpCaptionpush dword banner ; LPCSTR lpTextpush dword 0 ; HWND hWnd = NULLcall _MessageBoxA@16push dword 0 ; UINT uExitCodecall _ExitProcess@4section data use32 class=databanner: db 'Hello, world!', 0title: db 'Hello', 0

و معادل همین برنامه برای لینوکس:

global _startsection .text_start:mov eax, 4 ; writemov ebx, 1 ; stdoutmov ecx, msgmov edx, msg.lenint 0x80mov eax, 1 ; exitmov ebx, 0int 0x80section .datamsg: db "Hello, world!", 10.len: equ $ - msg

منابع