NASM(1) The Netwide Assembler Project NASM(1)

nasm - اسمبلر Netwide، یک اسمبلر قابل‌حمل 80x86

nasm [-@ response file] [-f format] [-o outfile] [-l listfile] [options...] filename

دستور nasm فایل filename را اسمبل کرده و در صورت مشخص شدن، خروجی را به فایل outfile هدایت می‌کند. اگر outfile مشخص نشده باشد، nasm نام فایل خروجی پیش‌فرض را از نام فایل ورودی خود به دست می‌آورد، معمولاً با افزودن «.o» یا «.obj»، یا با حذف تمامی پسوندها برای فایل باینری خام. در غیر این صورت، نام فایل خروجی «nasm.out» خواهد بود.

-@ filename

باعث می‌شود nasm گزینه‌ها را از filename به‌گونه‌ای پردازش کند که گویی مستقیماً در خط فرمان وارد شده‌اند.

-a

باعث می‌شود nasm فایل ورودی داده‌شده را بدون اعمال اولیه پیش‌پردازنده ماکرو اسمبل کند.

-D|-d macro[=value]

یک ماکروی تک‌خطی را از پیش تعریف می‌کند.

-E|-e

باعث می‌شود nasm فایل ورودی داده‌شده را پیش‌پردازش کرده و خروجی را در stdout (یا نام فایل خروجی مشخص‌شده) بنویسد، و عملاً فرایند اسنبل را انجام ندهد.

-f format

قالب فایل خروجی را مشخص می‌کند. برای مشاهده فهرستی از قالب‌های خروجی معتبر، از گزینه -hf استفاده کنید.

-F format

قالب اطلاعات اشکال‌زدایی (دیباگ) را تعیین می‌کند. برای مشاهده فهرستی از قالب‌های معتبر، از گزینه -y استفاده کنید (به عنوان مثال -felf -y).

-g

باعث می‌شود nasm اطلاعات اشکال‌زدایی تولید کند.

-gformat

معادل گزینه -g -F format است.

-h

باعث می‌شود nasm پس از نمایش خلاصه‌ای از گزینه‌های فراخوانی، بلافاصله خارج شود.

-hf

مشابه -h است، اما تمامی قالب‌های خروجی معتبر را نیز فهرست می‌کند.

-I|-i directory

یک پوشه را به مسیر جستجوی فایل‌های گنجانده‌شده (include) اضافه می‌کند. مشخصات پوشه باید شامل اسلش پایانی باشد، زیرا مستقیماً به ابتدای نام فایل گنجانده‌شده الصاق می‌شود.

-l listfile

باعث هدایت فهرست اسمبل به فایل مشخص‌شده می‌شود، که در آن سورس اصلی در سمت راست (به علاوه سورس فایل‌های گنجانده‌شده و بسط ماکروهای چندخطی) و کد تولیدشده به صورت هگزادسیمال در سمت چپ نمایش می‌یابد.

-M

باعث می‌شود nasm وابستگی‌ها را به سبک Makefile در خروجی استاندارد بنویسد؛ خروجی معمولی غیرفعال می‌شود.

-MG file

مشابه -M است، اما فرض می‌کند که وابستگی‌های ناموجود در Makefile تولید شده و بدون پیشوند به فهرست وابستگی‌ها اضافه می‌شوند.

-MF file

وابستگی‌ها را به سبک Makefile در فایل مشخص‌شده خروجی می‌دهد.

-MD file

مشابه ترکیبی از گزینه‌های -M و -MF عمل می‌کند.

-MT file

نام پیش‌فرض هدف وابستگی را بازنویسی می‌کند. این نام معمولاً همان نام فایل خروجی مشخص‌شده توسط گزینه -o است.

-MQ file

مشابه -MT است، با این تفاوت که تلاش می‌کند نویسه‌های دارای معنای خاص در نحو Makefile را در گیومه قرار دهد. این کار بی‌نقص نیست، زیرا همه نویسه‌های دارای معنای خاص در Make قابل قرارگیری در گیومه نیستند.

-MP

یک هدف ساختگی (phony target) منتشر می‌کند.

-O number

بهینه‌سازی آفست‌های انشعاب (branch offsets).
•-O0: بدون بهینه‌سازی
•-O1: حداقل بهینه‌سازی
•-Ox: بهینه‌سازی چندگذره (پیش‌فرض)

-o outfile

نام دقیقی برای فایل خروجی مشخص می‌کند، و روش پیش‌فرض تعیین نام توسط nasm را بازنویسی می‌نماید.

-P|-p file

فایلی را برای گنجاندن اولیه، پیش از شروع پردازش فایل منبع اصلی، مشخص می‌کند.

-s

باعث می‌شود nasm پیام‌های خطای خود و/یا متن راهنما را به جای stderr به stdout بفرستد.

-t

باعث می‌شود nasm در حالت سازگار با SciTech TASM اسمبل کند.

-U|-u macro

تعریف یک ماکروی تک‌خطی را حذف و لغو می‌کند.

-v

باعث می‌شود nasm پس از نمایش شماره نسخه خود، بلافاصله خارج شود.

*-W[no-]foo'

باعث می‌شود nasm دسته‌های خاصی از پیام‌های هشدار را به سبک gcc فعال یا غیرفعال کند، برای مثال -Wlabel-orphan یا -Wno-orphan-labels.

-w[+-]foo

باعث می‌شود nasm دسته‌های خاصی از پیام‌های هشدار را فعال یا غیرفعال کند، برای مثال -w+label-orphan یا -w-macro-params.

-X format

قالب گزارش خطا را مشخص می‌کند (gnu یا vc).

-y

باعث می‌شود nasm قالب‌های اشکال‌زدایی پشتیبانی‌شده را فهرست کند.

-Z filename

باعث می‌شود nasm پیام‌های خطا را به filename تغییر مسیر دهد. این گزینه برای پشتیبانی از سیستم‌عامل‌هایی است که تغییر مسیر stderr در آن‌ها به آسانی انجام نمی‌گیرد.

--prefix, --postfix

آرگومان داده‌شده را (به ترتیب) به ابتدای تمامی متغیرهای سراسری (global) یا خارجی (extern) اضافه می‌کند یا به انتهای آن‌ها می‌افزاید.

این صفحه راهنما نحو زبان اسمبلی nasm را به‌طور کامل تشریح نمی‌کند، اما خلاصه‌ای از تفاوت‌های آن با سایر اسمبلرها را ارائه می‌دهد.

برخلاف gas، ثبات‌ها (رجیسترها) علامت «%» در ابتدا ندارند و به ثبات‌های پشته ممیز شناور با عنوان‌های st0، st1 و غیره اشاره می‌شود.

دستورالعمل‌های ممیز شناور می‌توانند از قالب تک‌عملوندی یا دو‌عملوندی استفاده کنند. کلمه کلیدی TO ارائه شده است؛ بنابراین، می‌توان به این صورت نوشت:

fadd st0,st1
fadd st1,st0

یا می‌توان از قالب‌های تک‌عملوندی جایگزین استفاده کرد:

fadd st1
fadd to st1

حافظه مقداردهی‌نشده با استفاده از شبه‌دستورهای RESB، RESW، RESD، RESQ، REST و RESO رزرو می‌شود که هرکدام یک پارامتر برای تعیین تعداد بایت‌ها، کلمه‌ها (words)، دابل‌وردها، کوادوردها یا کلمات ده‌بایتی جهت رزرو دریافت می‌کنند.

تکرار اقلام داده مانند اسمبلرهای DOS با کلمه کلیدی DUP انجام نمی‌شود، بلکه با استفاده از پیشوند TIMES به این صورت صورت می‌گیرد:

message: times 3 db 'abc'
         times 64-$+message db 0

که رشته abcabcabc را تعریف می‌کند و در ادامه آن تعداد مناسبی بایت صفر قرار می‌دهد تا طول کل به ۶۴ بایت برسد.

ارجاع به نمادها همواره به عنوان مقادیر بی‌واسطه (یعنی آدرس نماد) تلقی می‌شود، مگر اینکه از قلاب‌ها (کروشه‌ها) استفاده شود که در آن صورت محتوای آن مکان حافظه استفاده خواهد شد. بنابراین:

mov ax,wordvar

آدرس متغیر wordvar را در AX بارگذاری می‌کند، در حالی که:

mov ax,[wordvar]
mov ax,[wordvar+1]
mov ax,[es:wordvar+bx]

همگی به محتوای مکان‌های حافظه اشاره دارند. نحوهای زیر:

mov ax,es:wordvar[bx]
es mov ax,wordvar[1]

به هیچ وجه مجاز نیستند، هرچند استفاده از نام ثبات سگمنت به عنوان پیشوند دستور معتبر است و می‌توان از آن با دستوراتی مانند LODSB که به هیچ روش دیگری نمی‌توان آن‌ها را بازنویسی کرد استفاده نمود.

ثابت‌ها را می‌توان از نظر عددی در اکثر قالب‌ها بیان کرد: پسوند H، Q یا B به ترتیب نشان‌دهنده هگزادسیمال، هشت‌هشتی (octal) یا دودویی (باینری) است، و پیشوند «0x» یا «$» نیز نشان‌دهنده هگزادسیمال است. با صفرهای ابتدایی به هیچ وجه به شکل خاصی رفتار نمی‌شود. ثابت‌های نویسه‌ای می‌توانند در گیومه تکی یا دوتایی محصور شوند؛ هیچ نویسه گریزی (escape) وجود ندارد. ترتیب بایت‌ها به صورت کم‌ارزش‌ترین‌بایت‌اول (little-endian) است، به طوری که ثابت نویسه‌ای 'abcd' نشان‌دهنده مقدار 0x64636261 است نه 0x61626364.

برچسب‌های محلی با یک نقطه آغاز می‌شوند و «محلی بودن» آن‌ها توسط اسمبلر با افزودن نام نماد غیرمحلی قبلی به ابتدای آن‌ها اعمال می‌شود. بنابراین اعلان یک برچسب «.loop» پس از برچسب «label» در واقع نمادی به نام «label.loop» تعریف کرده است.

دستور SECTION name یا SEGMENT name باعث می‌شود nasm تمام کدهای بعدی را به بخش (section) نام‌برده هدایت کند. نام بخش‌ها با توجه به قالب فایل خروجی متفاوت است، هرچند بیشتر قالب‌ها از نام‌های .text، .data و .bss پشتیبانی می‌کنند. (استثنا قالب obj است که در آن تمام سگمنت‌ها توسط کاربر قابل تعریف هستند.)

دستور ABSOLUTE address باعث می‌شود nasm نقطه اسمبل فرضی خود را در یک آدرس مطلق قرار دهد: بنابراین هیچ کد یا داده‌ای تولید نمی‌شود، اما می‌توانید از RESB، RESW و RESD برای جلو بردن نقطه اسمبل استفاده کنید، و می‌توانید برچسب‌ها را تعریف نمایید. بنابراین از این رهنمود می‌توان برای تعریف ساختارهای داده استفاده کرد. هنگامی که اسمبل مطلق را به پایان رساندید، برای بازگشت به اسمبل عادی باید یک رهنمود SECTION دیگر صادر کنید.

دستور BITS 16، BITS 32 یا BITS 64 حالت پیش‌فرض پردازنده را که nasm برای آن کد تولید می‌کند تغییر می‌دهد: این معادل با USE16 یا USE32 در اسمبلرهای DOS است.

دستورهای EXTERN symbol و GLOBAL symbol به ترتیب تعاریف نمادها را از سایر ماژول‌ها وارد (import) یا به آن‌ها صادر (export) می‌کنند. توجه داشته باشید که رهنمود GLOBAL باید قبل از تعریف نمادی که به آن ارجاع دارد ظاهر شود.

دستورهای STRUC strucname و ENDSTRUC هنگامی که برای احاطه کردن تعدادی از دستورات RESB، RESW یا مشابه آن‌ها استفاده شوند، یک ساختار داده را تعریف می‌کنند. این سازه علاوه بر تعریف آفست‌های اعضای ساختار، نمادی نیز برای اندازه ساختار تعریف می‌کند که به سادگی همان نام ساختار است که کلمه size به انتهای آن الصاق شده است.

دستور ORG address توسط قالب خروجی باینری خام bin استفاده می‌شود و آدرسی را که کد خروجی در نهایت در آن بارگذاری خواهد شد مشخص می‌کند.

دستور GROUP grpname seg1 seg2... توسط قالب خروجی obj (مایکروسافت ۱۶ بیتی) استفاده می‌شود و گروه‌های سگمنت را تعریف می‌کند. این قالب همچنین از UPPERCASE استفاده می‌کند که دستور می‌دهد تمام نام‌های سگمنت، گروه و نمادهای خروجی به فایل شیء باید با حروف بزرگ باشند. توجه داشته باشید که عمل اسمبل واقعی همچنان به بزرگی و کوچکی حروف حساس است.

دستور LIBRARY libname توسط قالب خروجی rdf استفاده می‌شود و باعث می‌شود یک رکورد وابستگی در فایل خروجی نوشته شود که نشان می‌دهد برنامه برای اجرا به یک کتابخانه خاص نیاز دارد.

ماکروهای تک‌خطی با استفاده از دستورات %define یا %idefine به شیوه‌ای مشابه پیش‌پردازنده C تعریف می‌شوند. آن‌ها را می‌توان با توجه به تعداد پارامترها سربارگذاری (overload) کرد، هرچند تعریف یک ماکرو بدون پارامتر مانع از تعریف هر ماکروی هم‌نام دیگری با پارامتر می‌شود، و بالعکس. دستور %define ماکروهایی را تعریف می‌کند که تطبیق نام آن‌ها حساس به حروف کوچک و بزرگ است، در حالی که %idefine ماکروهای غیرحساس به بزرگی و کوچکی حروف را تعریف می‌نماید.

ماکروهای چندخطی با استفاده از %macro و %imacro تعریف می‌شوند (تفاوت آن‌ها دقیقاً مانند تفاوت بین %define و %idefine است) که نحوه نگارش آن‌ها به صورت زیر است:

%macro name minprm[-maxprm][+][.nolist] [defaults]
        <some lines of macro expansion text>
%endmacro

مجدداً، این ماکروها را نیز می‌توان سربارگذاری کرد. علامت مثبت انتهایی نشان می‌دهد که هر پارامتری پس از آخرین مورد، همراه با کاماهای جداکننده در آخرین پارامتر ادغام می‌شود. بخش defaults می‌تواند برای تعیین مقادیر پیش‌فرض برای پارامترهای مشخص‌نشده ماکرو بعد از minparam استفاده شود. دستور %endm مترادفی معتبر برای %endmacro است.

برای ارجاع به پارامترهای ماکرو درون بسط ماکرو، از %1، %2 و غیره استفاده می‌کنید. شما همچنین می‌توانید با استفاده از %+1 اجبار کنید که یک پارامتر ماکرو باید حاوی یک کد شرطی باشد، و می‌توانید کد شرط را با استفاده از %-1 معکوس کنید. همچنین می‌توانید با قرار دادن دو علامت «%» در ابتدا، برچسبی اختصاصی برای یک فراخوانی ماکرو تعریف نمایید.

فایل‌ها را می‌توان با استفاده از رهنمود %include اضافه کرد که عملکردی مشابه C دارد.

پیش‌پردازنده دارای یک «پشته بافت» (context stack) است که می‌تواند توسط یک ماکرو برای ذخیره اطلاعاتی که ماکروهای بعدی بازیابی خواهند کرد استفاده شود. می‌توانید با استفاده از %push یک بافت را روی پشته قرار دهید، با %pop آن را بردارید، و با استفاده از %repl نام بافت بالایی را (بدون دستکاری تعاریف مرتبط) تغییر دهید. برچسب‌ها و ماکروهای %define مخصوص بالاترین بافت را می‌توان با افزودن %$ به ابتدای نام آن‌ها تعریف کرد، و موارد مربوط به بافت بعدی را با %$$، و به همین ترتیب.

اسمبل شرطی به وسیله %ifdef، %ifndef، %else و %endif مشابه C انجام می‌شود. (با این تفاوت که %ifdef می‌تواند چندین نام ماکروی مفروض را بپذیرد، و در صورت تعریف هر یک از آن‌ها مقدار TRUE را ارزیابی کند.) علاوه بر این، می‌توان از رهنمودهای %ifctx و %ifnctx برای شرط‌گذاری بر اساس نام بالاترین بافت موجود در پشته بافت استفاده کرد. مجموعه مشخصی از رهنمودهای «else-if» شامل %elifdef، %elifndef، %elifctx و %elifnctx نیز پشتیبانی می‌شوند.

لطفاً گزارش اشکالات را از طریق بخش ردیاب باگ در http://nasm.us ارسال کنید.

as(1), ld(1).

06/28/2026 NASM