| NASM(1) | The Netwide Assembler Project | NASM(1) |
نام (NAME)
nasm - اسمبلر Netwide، یک اسمبلر قابلحمل 80x86
خلاصه دستور (SYNOPSIS)
nasm [-@ response file] [-f format] [-o outfile] [-l listfile] [options...] filename
توضیحات (DESCRIPTION)
دستور nasm فایل filename را اسمبل کرده و در صورت مشخص شدن، خروجی را به فایل outfile هدایت میکند. اگر outfile مشخص نشده باشد، nasm نام فایل خروجی پیشفرض را از نام فایل ورودی خود به دست میآورد، معمولاً با افزودن «.o» یا «.obj»، یا با حذف تمامی پسوندها برای فایل باینری خام. در غیر این صورت، نام فایل خروجی «nasm.out» خواهد بود.
گزینهها (OPTIONS)
-@ filename
-a
-D|-d macro[=value]
-E|-e
-f format
-F format
-g
-gformat
-h
-hf
-I|-i directory
-l listfile
-M
-MG file
-MF file
-MD file
-MT file
-MQ file
-MP
-O number
-o outfile
-P|-p file
-s
-t
-U|-u macro
-v
*-W[no-]foo'
-w[+-]foo
-X format
-y
-Z filename
--prefix, --postfix
سینتکس (SYNTAX)
این صفحه راهنما نحو زبان اسمبلی 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» تعریف کرده است.
رهنمودها (DIRECTIVES)
دستور 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 به انتهای آن الصاق شده است.
رهنمودهای وابسته به قالب (FORMAT-SPECIFIC DIRECTIVES)
دستور ORG address توسط قالب خروجی باینری خام bin استفاده میشود و آدرسی را که کد خروجی در نهایت در آن بارگذاری خواهد شد مشخص میکند.
دستور GROUP grpname seg1 seg2... توسط قالب خروجی obj (مایکروسافت ۱۶ بیتی) استفاده میشود و گروههای سگمنت را تعریف میکند. این قالب همچنین از UPPERCASE استفاده میکند که دستور میدهد تمام نامهای سگمنت، گروه و نمادهای خروجی به فایل شیء باید با حروف بزرگ باشند. توجه داشته باشید که عمل اسمبل واقعی همچنان به بزرگی و کوچکی حروف حساس است.
دستور LIBRARY libname توسط قالب خروجی rdf استفاده میشود و باعث میشود یک رکورد وابستگی در فایل خروجی نوشته شود که نشان میدهد برنامه برای اجرا به یک کتابخانه خاص نیاز دارد.
پیشپردازنده ماکرو (MACRO PREPROCESSOR)
ماکروهای تکخطی با استفاده از دستورات %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 نیز پشتیبانی میشوند.
اشکالات (BUGS)
لطفاً گزارش اشکالات را از طریق بخش ردیاب باگ در http://nasm.us ارسال کنید.
همچنین ببینید (SEE ALSO)
| 06/28/2026 | NASM |