فلگ های بدرد بخور NASM

در این پست می خواهم فلگ هایی مهمی را که از سایت nasm پیدا کردم را خلاصه کنم.البته ، این به معنی این نیست که تمام flag های اسمبلر محبوب nasm را در اینجا ذکر کردم (البته می توانید از طریق اینجا مستندات سایت رسمی درباره تمام flag های این اسمبلر را ببینید) ، و یا تمامی برنامه های nasm تنها از این آپشن ها استفاده می کنند و یا تمام آپشن های در این لیست مهم و بدردبخور هستند (بدرد بخور درست هست یا بدرد بخور - فاصله دارد یا نه؟؟ لطفا کامنت کنید)نکته : در اسمبلر nasm پیش پردازنده ها با % یا percent شروع می شوند برعکس اسمبلر gnu یا gas که با . یا dot شروع می شوند و برعکس زبان محبوب C/C++ که با # یا sharp شروع می شوند.گفتم که تعجب نکنید چرا از % به جای # استفاده شده .-h و --helpتوضیحاتی کوچکی را درباره ی برنامه می دهد.nasm --help nasm -h # shorter-fاین فلگ برای تشخیص format فایل خروجی استفاده می شود. برای مثالnasm -f bin hello.asmو یا nasm -f elf hello.asmاگر می خواهید لیست کامل و خلاصه شده ای از فرمت های موجود داشته باشید ، قسمت -hf را ببینید.-hfبا این آپشن می توانید فرمت های خروجی قابل دسترس را ببینید. help formatusr@dev:~ $ nasm -hf usage: nasm [-@ response file] [-o outfile] [-f format] [-l listfile] [options...] [--] filename or nasm -v (or --v) for version info Response files should contain command line parameters, one per line. -t assemble in SciTech TASM compatible mode -E (or -e) preprocess only (writes output to stdout by default) -a don't preprocess (assemble only) -M generate Makefile dependencies on stdout -MG d:o, missing files assumed generated -MF file set Makefile dependency file -MD file assemble and generate dependencies -MT file dependency target name -MQ file dependency target name (quoted) -MP emit phony target -Z file redirect error messages to file -s redirect error messages to stdout -g generate debugging information -F format select a debugging format -gformat same as -g -F format -o outfile write output to an outfile -f format select an output format -l listfile write listing to a listfile -Ipath add a pathname to the include file path -Oflags... optimize opcodes, immediates and branch offsets -O0 no optimization -O1 minimal optimization -Ox multipass optimization (default) -Ov display the number of passes executed at the end -Pfile pre-include a file (also --include) -Dmacro[=str] pre-define a macro -Umacro undefine a macro -Xformat specifiy error reporting format (gnu or vc) -w+foo enable warning foo (equiv. -Wfoo) -w-foo disable warning foo (equiv. -Wno-foo) -w[+-]error[=foo] promote [specific] warnings to errors -h show invocation summary and exit (also --help) --pragma str pre-executes a specific %pragma --before str add line (usually a preprocessor statement) before the input --prefix str prepend the given string to all the given string to all extern, common and global symbols (also --gprefix) --postfix str append the given string to all the given string to all extern, common and global symbols (also --gpostfix) --lprefix str prepend the given string to all other symbols --lpostfix str append the given string to all other symbols --keep-all output files will not be removed even if an error happens --no-line ignore %line directives in input --limit-X val set execution limit X passes total number of passes (default unlimited) stalled-passes number of passes without forward progress (default 1000) macro-levels levels of macro expansion (default 1000000) rep %rep count (default 1000000) eval expression evaluation descent (default 1000000) lines total source lines processed (default 2000000000) Warnings for the -W/-w options: (default in brackets) macro-params macro calls with wrong parameter count [on] macro-selfref cyclic macro references [off] macro-defaults macros with more default than optional parameters [on] orphan-labels labels alone on lines without trailing `:' [on] number-overflow numeric constant does not fit [on] gnu-elf-extensions using 8- or 16-bit relocation in ELF32, a GNU extension [off] float-overflow floating point overflow [on float-denorm floating point denormal [off] float-underflow floating point underflow [off] float-toolong too many digits in floating-point number [on] user %warning directives [on] lock lock prefix on unlockable instructions [on] hle invalid hle prefixes [on] bnd invalid bnd prefixes [on] zext-reloc relocation zero-extended to match output format [on] ptr non-NASM keyword used in other assemblers [on] bad-pragma empty or malformed %pragma [off] unknown-pragma unknown %pragma facility or directive [off] not-my-pragma %pragma not applicable to this compilation [off] unknown-warning unknown warning in -W/-w or warning directive [off] negative-rep regative %rep count [on] phase phase error during stabilization [off] label-redef label redefined to an identical value [off] label-redef-late label (re)defined during code generation [error] other any warning not specifially mentioned above [on] all all possible warnings valid output formats for -f are (`*' denotes default): * bin flat-form binary files (e.g. DOS .COM, .SYS) ith Intel hex srec Motorola S-records aout Linux a.out object files aoutb NetBSD/FreeBSD a.out object files coff COFF (i386) object files (e.g. DJGPP for DOS) elf32 ELF32 (i386) object files (e.g. Linux) elf64 ELF64 (x86_64) object files (e.g. Linux) elfx32 ELFX32 (x86_64) object files (e.g. Linux) as86 Linux as86 (bin86 version 0.3) object files obj MS-DOS 16-bit/32-bit OMF object files win32 Microsoft Win32 (i386) object files win64 Microsoft Win64 (x86-64) object files rdf Relocatable Dynamic Object File Format v2.0 ieee IEEE-695 (LADsoft variant) object file format macho32 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files macho64 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files dbg Trace of all info passed to output stage elf ELF (short name for ELF32) macho MACHO (short name for MACHO32) win WIN (short name for WIN32) -oبرای فایل خروجی نامی انتخاب کنید. outputبه صورت پیش فرض nasm نام فایل اسمبلی را بدون .asm به عنوان خروجی پیش فرض در نظر می گیرد.برای واضح تر شدن موضوع$ nasm -f elf hello.asm $ ls hello.asm hello.oشما می توانید با آپشن -o نامی را برای output انتخاب کنید$ nasm -f elf hello.asm -o output.o $ ls hello.asm output.o-ZZ بزرگبردن خروجی به یک فایل. به عنوان مثال$ ls hello.s $ nasm -f bin hello.asm -Z nasm_errors_file $ cat nasm_errors_file nasm: fatal: unable to open input file `hello.asm`-s هدایت جریان به stdout به جای stderr.توضیح نمی دهم چون خیلی کاربردی نیست.-iدقیقا کاربر -I درc|gcc را دارد . البته -i در nasm با حروف کوچک نوشته می شود ، برعکس gccاگر بخواهید با %include فایلی را وارد برنامه کنید . و فایل شما در مسیر ~/asm قرار داشته باشد شما برای دسترسی به ~/asmlib باید به صورت زیر از این پیش پردازنده استفاده کنید%include &quot../asmlib/file.asm&quotاما اگر از این آپشن استفاده کنیم می توانیم مسیری را که به آن می دهیم اضافه کنیم ، یعنی nasm علاوه بر جایی که هست ، مسیری که این آپشن داده را هم جستجو می کند.برای مثال من می خواهم در ~/asm یک کتابخانه و در ~/asmlib دو ماژول داشته باشم ، اگر فایل اصلی من در مسیر ~/asm باشد . و من بخواهم بدون آپشن -i انها را وارد برنامه کنم باید به صورت زیر عمل کنم :%include &quotlib1.asm&quot %include &quot../asmlib/lib2.asm&quot %include &quot../asmlib/lib۳.asm&quotاین که مدام به صورت relative مسیر (path) فایل ها را بدهیم خسته کننده هست و احتمال خطا را بالا می آورد ، اینجا آپشن/ flag ای به نام -i به داد ما می رسد و به nasm می گوید ، علاوه بر جایی که فایل هست ، جایی که این flag اعلام می کند را می گردد ، مثلا کد بالا را با این flag بازسازی می کنیم%include &quotlib1.asm&quot %include &quotlib2.asm&quot ; without -i flag %include &quot../asmlib/lib2.asm&quot %include &quotlib3.asm&quot ; without -i flag %include &quot../asmlib/lib3.asm&quotو در هنگام اسمبل کردن به جایnasm -f <format> file.asmاز روش زیر استفاده می کنیمnasm -f <format> -i ../asmlib file.asm-pاین flag برگرفته از نام pre include هست ، با این آپشن شما فایلی را بدون این که در فایل وارد کنید ، در برنامه include می کند.برای درک بهتر ، کد زیر را در نظر بگیرید.%include &quotfile.s&quot global _start _start: همانطور که در کد می بینید ، ما با استفاده از %include فایلی به نام file.s را قبل از اسمبل کردن برنامه ، وارد برنامه می کنیم ، اما ما می توانیم به جای کد بالا از کد زیر استفاده کنیم/از %include استفاده نکنیم . و در هنگام اسمبل کردن نیزglobal _start _start: و در هنگام اسمبل کردن نیز به جای روش معمول ، مثل زیر عمل کنیم :nasm -p file.s -f <format> source.asmهمانطور که دیدید ، با استفاده از آپشن -p توانستیم بدون استفاده از پیش پردازنده %include فایلی را در برنامه include کنیم .یعنی این آپشن قبل همانند پیش پردازنده %include کار می کند.-dاین flag همانند آپشن -p کار می کند ، اما آپشن -p کاربر %include دارد ، در حالی که این آپشن کابرد %define را دارد . به معنی آنکه .وقتی شما در هنگام اسمبل کردن ، در کنسول می نویسید.nasm file.asm -f <format> -d ONE=1بخش -d ONE=1 حکم اضافه کردن کد زیر به source را دارد .%define ONE 1-uاین هم همانند -d و -p یک پیش پردازنده ای را در خط فرمان به کد اضافه می کند. این پیش پردازنده %undef را به کد اضافه می کند.nasm -d XC=1 -u XCدستور بالا ، هیچ اثری ندارد :| چون که کد زیر را به برنامه اضافه می کند.%define XC 1 %undef XCکه در عمل هیچ تاثیری در کد ندارد.عکسی از این اسمبلر محبوب ، برای این که پست بی عکس نماند.پی نوشت ۰ : من خیلی کم اسمبلی یاد دارم ، خواستم اسمبلی یاد بگیرم ، رفتم سر مستندات سایت رسمی که این دستگیرم شد ، گفتم بد نیست ترجمه کنم .پی نوشت i : اسمبلی زبان سختی نیست ، فقط یکم حال به هم زن هست . همین .پی نوشت ii : پی نوشتی نمانده که بخواهم بگم ، فقط خواستم بدونید از سیستم اعداد رومی استفاده کردم اما چون اعداد رومی صفر ندارند ، صفر بد بخت رو عربی نوشتم :|