| \C{running} Running NASM |
| |
| \H{syntax} NASM \i{Command-Line} Syntax |
| |
| To assemble a file, you issue a command of the form |
| |
| \c nasm -f <format> <filename> [-o <output>] |
| |
| For example, |
| |
| \c nasm -f elf myfile.asm |
| |
| will assemble \c{myfile.asm} into an 32-bit ELF object file |
| \c{myfile.o}. And |
| |
| \c nasm -f bin myfile.asm -o myfile.com |
| |
| will assemble \c{myfile.asm} into a raw binary file \c{myfile.com}. |
| |
| To produce a listing file, with the hex codes output from NASM |
| displayed on the left of the original sources, use the \c{-l} option |
| to give a listing file name, for example: |
| |
| \c nasm -f coff myfile.asm -l myfile.lst |
| |
| To get further usage instructions from NASM, try typing |
| |
| \c nasm -h |
| |
| The option \c{--help} is an alias for the \c{-h} option. |
| |
| Like Unix compilers and assemblers, NASM is silent unless it |
| goes wrong: you won't see any output at all, unless it gives error |
| messages. |
| |
| |
| \S{opt-o} The \i\c{-o} Option: Output File Name |
| |
| NASM will normally choose the name of your output file for you; |
| precisely how it does this is dependent on the object file format. |
| For Microsoft object file formats (\c{obj}, \c{win32} and \c{win64}), |
| it will remove the \c{.asm} \i{extension} (or whatever extension you |
| like to use - NASM doesn't care) from your source file name and |
| substitute \c{.obj}. For Unix object file formats (\c{aout}, \c{as86}, |
| \c{coff}, \c{elf32}, \c{elf64}, \c{elfx32}, \c{ieee}, \c{macho32} and |
| \c{macho64}) it will substitute \c{.o}. For \c{dbg}, \c{ith} |
| and \c{srec}, it will use \c{.dbg}, \c{.ith} and \c{.srec}, |
| respectively, and for the \c{bin} format it will simply remove the |
| extension, so that \c{myfile.asm} produces the output file \c{myfile}. |
| |
| If the output file already exists, NASM will overwrite it, unless it |
| has the same name as the input file, in which case it will give a |
| warning and use \i\c{nasm.out} as the output file name instead. |
| |
| For situations in which this behaviour is unacceptable, NASM |
| provides the \c{-o} command-line option, which allows you to specify |
| your desired output file name. You invoke \c{-o} by following it |
| with the name you wish for the output file, either with or without |
| an intervening space. For example: |
| |
| \c nasm -f bin program.asm -o program.com |
| \c nasm -f bin driver.asm -odriver.sys |
| |
| Note that this is a small o, and is different from a capital O , which |
| is used to specify the number of optimization passes required. See \k{opt-O}. |
| |
| |
| \S{opt-f} The \i\c{-f} Option: \i{Output File Format} |
| |
| If you do not supply the \c{-f} option to NASM, it will choose an |
| output file format for you itself. In the distribution versions of |
| NASM, the default is always \i\c{bin}; if you've compiled your own |
| copy of NASM, you can redefine \i\c{OF_DEFAULT} at compile time and |
| choose what you want the default to be. |
| |
| Like \c{-o}, the intervening space between \c{-f} and the output |
| file format is optional; so \c{-f elf} and \c{-felf} are both valid. |
| |
| A complete list of the available output file formats can be given by |
| issuing the command \i\c{nasm -h}. |
| |
| |
| \S{opt-l} The \i\c{-l} Option: Generating a \i{Listing File} |
| |
| If you supply the \c{-l} option to NASM, followed (with the usual |
| optional space) by a file name, NASM will generate a |
| \i{source-listing file} for you, in which addresses and generated |
| code are listed on the left, and the actual source code, with |
| expansions of multi-line macros (except those which specifically |
| request no expansion in source listings: see \k{nolist}) on the |
| right. For example: |
| |
| \c nasm -f elf myfile.asm -l myfile.lst |
| |
| If a list file is selected, you may turn off listing for a |
| section of your source with \c{[list -]}, and turn it back on |
| with \c{[list +]}, (the default, obviously). There is no "user |
| form" (without the brackets). This can be used to list only |
| sections of interest, avoiding excessively long listings. |
| |
| \S{opt-L} The \i\c{-L} Option: Additional or Modified Listing Info |
| |
| Use this option to specify listing output details. |
| |
| Supported options are: |
| |
| \b \c{-Lb} show builtin macro packages (standard and \c{%use}) |
| |
| \b \c{-Ld} show byte and repeat counts in decimal, not hex |
| |
| \b \c{-Le} show the preprocessed input |
| |
| \b \c{-Lf} ignore \c{.nolist} and force listing output |
| |
| \b \c{-LF} ignore \c{[LIST]} directives (see \k{LIST}) |
| |
| \b \c{-Lm} show multi-line macro calls with expanded parameters |
| |
| \b \c{-Lp} output a list file in every pass, in case of errors |
| |
| \b \c{-Ls} show all single-line macro definitions |
| |
| \b \c{-Lw} flush the output after every line (very slow, mainly useful |
| to debug NASM crashes) |
| |
| \b \c{-L+} enable \e{all} listing options except \c{-Lw} (very verbose) |
| |
| These options can be enabled or disabled at runtime using the |
| \c{%pragma list options} directive: |
| |
| \c %pragma list options [+|-]flags... |
| |
| For example, to turn on the \c{d} and \c{m} flags but disable the |
| \c{s} flag: |
| |
| \c %pragma list options +dm -s |
| |
| For forward compatility reasons, an undefined flag will be |
| ignored. Thus, a new flag introduced in a newer version of NASM can be |
| specified without breaking older versions. Listing flags will always |
| be a single alphanumeric character and are case sensitive. |
| |
| \S{opt-M} The \i\c{-M} Option: Generate \i{Makefile Dependencies} |
| |
| This option can be used to generate makefile dependencies on stdout. |
| This can be redirected to a file for further processing. For example: |
| |
| \c nasm -M myfile.asm > myfile.dep |
| |
| |
| \S{opt-MG} The \i\c{-MG} Option: Generate \i{Makefile Dependencies} |
| |
| This option can be used to generate makefile dependencies on stdout. |
| This differs from the \c{-M} option in that if a nonexisting file is |
| encountered, it is assumed to be a generated file and is added to the |
| dependency list without a prefix. |
| |
| |
| \S{opt-MF} The \i\c\{-MF} Option: Set Makefile Dependency File |
| |
| This option can be used with the \c{-M} or \c{-MG} options to send the |
| output to a file, rather than to stdout. For example: |
| |
| \c nasm -M -MF myfile.dep myfile.asm |
| |
| |
| \S{opt-MD} The \i\c{-MD} Option: Assemble and Generate Dependencies |
| |
| The \c{-MD} option acts as the combination of the \c{-M} and \c{-MF} |
| options (i.e. a filename has to be specified.) However, unlike the |
| \c{-M} or \c{-MG} options, \c{-MD} does \e{not} inhibit the normal |
| operation of the assembler. Use this to automatically generate |
| updated dependencies with every assembly session. For example: |
| |
| \c nasm -f elf -o myfile.o -MD myfile.dep myfile.asm |
| |
| If the argument after \c{-MD} is an option rather than a filename, |
| then the output filename is the first applicable one of: |
| |
| \b the filename set in the \c{-MF} option; |
| |
| \b the output filename from the \c{-o} option with \c{.d} appended; |
| |
| \b the input filename with the extension set to \c{.d}. |
| |
| |
| \S{opt-MT} The \i\c{-MT} Option: Dependency Target Name |
| |
| The \c{-MT} option can be used to override the default name of the |
| dependency target. This is normally the same as the output filename, |
| specified by the \c{-o} option. |
| |
| |
| \S{opt-MQ} The \i\c{-MQ} Option: Dependency Target Name (Quoted) |
| |
| The \c{-MQ} option acts as the \c{-MT} option, except it tries to |
| quote characters that have special meaning in Makefile syntax. This |
| is not foolproof, as not all characters with special meaning are |
| quotable in \c{make}. The default output (if no \c{-MT} or \c{-MQ} option |
| is specified) is automatically quoted. |
| |
| |
| \S{opt-MP} The \i\c{-MP} Option: Emit Phony Makefile Targets |
| |
| When used with any of the dependency generation options, the \c{-MP} |
| option causes NASM to emit a phony target without dependencies for |
| each header file. This prevents \c{make} from complaining if a header |
| file has been removed. |
| |
| |
| \S{opt-MW} The \i\c{-MW} Option: Watcom \c{make} quoting style |
| |
| This option causes NASM to attempt to quote dependencies according to |
| Watcom \c{make} conventions rather than POSIX \c{make} conventions (also used |
| by most other \c{make} variants.) This quotes \c{#} as \c{$#} rather than |
| \c{\\#}, uses \c{&} rather than \c{\\} for continuation lines, and |
| encloses filenames containing whitespace in double quotes. |
| |
| |
| \S{opt-F} The \i\c{-F} Option: \i{Debug Information Format} |
| |
| This option is used to select the format of the debug information |
| emitted into the output file, to be used by a debugger (or \e{will} |
| be). Prior to version 2.03.01, the use of this switch did \e{not} enable |
| output of the selected debug info format. Use \c{-g}, see \k{opt-g}, |
| to enable output. Versions 2.03.01 and later automatically enable \c{-g} |
| if \c{-F} is specified. |
| |
| A complete list of the available debug file formats for an output |
| format can be seen by issuing the command \c{nasm -h}. Not |
| all output formats currently support debugging output. |
| |
| This should not be confused with the \c{-f dbg} output format option, |
| see \k{dbgfmt}. |
| |
| |
| \S{opt-g} The \i\c{-g} Option: Enabling \i{Debug Information}. |
| |
| This option can be used to generate debugging information in the specified |
| format. See \k{opt-F}. Using \c{-g} without \c{-F} results in emitting |
| debug info in the default format, if any, for the selected output format. |
| If no debug information is currently implemented in the selected output |
| format, \c{-g} is \e{silently ignored}. |
| |
| |
| \S{opt-X} The \i\c{-X} Option: Selecting an \i{Error Reporting Format} |
| |
| This option can be used to select an error reporting format for any |
| error messages that might be produced by NASM. |
| |
| Currently, two error reporting formats may be selected. They are |
| the \c{-Xvc} option and the \c{-Xgnu} option. The GNU format is |
| the default and looks like this: |
| |
| \c filename.asm:65: error: specific error message |
| |
| where \c{filename.asm} is the name of the source file in which the |
| error was detected, \c{65} is the source file line number on which |
| the error was detected, \c{error} is the severity of the error (this |
| could be \c{warning}), and \c{specific error message} is a more |
| detailed text message which should help pinpoint the exact problem. |
| |
| The other format, specified by \c{-Xvc} is the style used by Microsoft |
| Visual C++ and some other programs. It looks like this: |
| |
| \c filename.asm(65) : error: specific error message |
| |
| where the only difference is that the line number is in parentheses |
| instead of being delimited by colons. |
| |
| See also the \c{Visual C++} output format, \k{win32fmt}. |
| |
| \S{opt-Z} The \i\c{-Z} Option: Send Errors to a File |
| |
| Under \i{MS-DOS} it can be difficult (though there are ways) to |
| redirect the standard-error output of a program to a file. Since |
| NASM usually produces its warning and \i{error messages} on |
| \i\c{stderr}, this can make it hard to capture the errors if (for |
| example) you want to load them into an editor. |
| |
| NASM therefore provides the \c{-Z} option, taking a filename argument |
| which causes errors to be sent to the specified files rather than |
| standard error. Therefore you can \I{redirecting errors}redirect |
| the errors into a file by typing |
| |
| \c nasm -Z myfile.err -f obj myfile.asm |
| |
| In earlier versions of NASM, this option was called \c{-E}, but it was |
| changed since \c{-E} is an option conventionally used for |
| preprocessing only, with disastrous results. See \k{opt-E}. |
| |
| \S{opt-s} The \i\c{-s} Option: Send Errors to \i\c{stdout} |
| |
| The \c{-s} option redirects \i{error messages} to \c{stdout} rather |
| than \c{stderr}, so it can be redirected under \i{MS-DOS}. To |
| assemble the file \c{myfile.asm} and pipe its output to the \c{more} |
| program, you can type: |
| |
| \c nasm -s -f obj myfile.asm | more |
| |
| See also the \c{-Z} option, \k{opt-Z}. |
| |
| |
| \S{opt-i} The \i\c{-i}\I\c{-I} Option: Include File Search Directories |
| |
| When NASM sees the \i\c{%include} or \i\c{%pathsearch} directive in a |
| source file (see \k{include}, \k{pathsearch} or \k{incbin}), it will |
| search for the given file not only in the current directory, but also |
| in any directories specified on the command line by the use of the |
| \c{-i} option. Therefore you can include files from a \i{macro |
| library}, for example, by typing |
| |
| \c nasm -ic:\macrolib\ -f obj myfile.asm |
| |
| (As usual, a space between \c{-i} and the path name is allowed, and |
| optional). |
| |
| Prior NASM 2.14 a path provided in the option has been considered as |
| a verbatim copy and providing a path separator been up to a caller. |
| One could implicitly concatenate a search path together with a filename. |
| Still this was rather a trick than something useful. Now the trailing |
| path separator is made to always present, thus \c{-ifoo} will be |
| considered as the \c{-ifoo/} directory. |
| |
| If you want to define a \e{standard} \i{include search path}, |
| similar to \c{/usr/include} on Unix systems, you should place one or |
| more \c{-i} directives in the \c{NASMENV} environment variable (see |
| \k{nasmenv}). |
| |
| For Makefile compatibility with many C compilers, this option can also |
| be specified as \c{-I}. |
| |
| |
| \S{opt-p} The \i\c{-p}\I\c{-P} Option: \I{pre-including files}Pre-Include a File |
| |
| \I\c{%include}NASM allows you to specify files to be |
| \e{pre-included} into your source file, by the use of the \c{-p} |
| option. So running |
| |
| \c nasm myfile.asm -p myinc.inc |
| |
| is equivalent to running \c{nasm myfile.asm} and placing the |
| directive \c{%include "myinc.inc"} at the start of the file. |
| |
| \c{--include} option is also accepted. |
| |
| For consistency with the \c{-I}, \c{-D} and \c{-U} options, this |
| option can also be specified as \c{-P}. |
| |
| |
| |
| \S{opt-d} The \i\c{-d}\I\c{-D} Option: \I{pre-defining macros}Pre-Define a Macro |
| |
| \I\c{%define}Just as the \c{-p} option gives an alternative to placing |
| \c{%include} directives at the start of a source file, the \c{-d} |
| option gives an alternative to placing a \c{%define} directive. You |
| could code |
| |
| \c nasm myfile.asm -dFOO=100 |
| |
| as an alternative to placing the directive |
| |
| \c %define FOO 100 |
| |
| at the start of the file. You can miss off the macro value, as well: |
| the option \c{-dFOO} is equivalent to coding \c{%define FOO}. This |
| form of the directive may be useful for selecting \i{assembly-time |
| options} which are then tested using \c{%ifdef}, for example |
| \c{-dDEBUG}. |
| |
| For Makefile compatibility with many C compilers, this option can also |
| be specified as \c{-D}. |
| |
| |
| \S{opt-u} The \i\c{-u}\I\c{-U} Option: \I{Undefining macros}Undefine a Macro |
| |
| \I\c{%undef}The \c{-u} option undefines a macro that would otherwise |
| have been pre-defined, either automatically or by a \c{-p} or \c{-d} |
| option specified earlier on the command lines. |
| |
| For example, the following command line: |
| |
| \c nasm myfile.asm -dFOO=100 -uFOO |
| |
| would result in \c{FOO} \e{not} being a predefined macro in the |
| program. This is useful to override options specified at a different |
| point in a Makefile. |
| |
| For Makefile compatibility with many C compilers, this option can also |
| be specified as \c{-U}. |
| |
| |
| \S{opt-E} The \i\c{-E}\I{-e} Option: Preprocess Only |
| |
| NASM allows the \i{preprocessor} to be run on its own, up to a |
| point. Using the \c{-E} option (which requires no arguments) will |
| cause NASM to preprocess its input file, expand all the macro |
| references, remove all the comments and preprocessor directives, and |
| print the resulting file on standard output (or save it to a file, |
| if the \c{-o} option is also used). |
| |
| This option cannot be applied to programs which require the |
| preprocessor to evaluate \I{preprocessor expressions}\i{expressions} |
| which depend on the values of symbols: so code such as |
| |
| \c %assign tablesize ($-tablestart) |
| |
| will cause an error in \i{preprocess-only mode}. |
| |
| For compatibility with older version of NASM, this option can also be |
| written \c{-e}. \c{-E} in older versions of NASM was the equivalent |
| of the current \c{-Z} option, \k{opt-Z}. |
| |
| \S{opt-a} The \i\c{-a} Option: Suppress Preprocessing |
| |
| If NASM is being used as the back end to a compiler, it might be |
| desirable to \I{suppressing preprocessing}suppress preprocessing |
| completely and assume the compiler has already done it, to save time |
| and increase compilation speeds. The \c{-a} option, requiring no |
| argument, instructs NASM to replace its powerful \i{preprocessor} |
| with a \i{stub preprocessor} which does nothing. |
| |
| |
| \S{opt-O} The \i\c{-O} Option: \i{Multipass Optimization} |
| |
| Using the \c{-O} option, you can tell NASM to carry out different |
| levels of optimization. Multiple flags can be specified after the |
| \c{-O} options, some of which can be combined in a single option, |
| e.g. \c{-Oxv}. |
| |
| \b \c{-O0}: No optimization. All operands take their long forms, |
| if a short form is not specified, except conditional jumps. |
| This is intended to match NASM 0.98 behavior. |
| |
| \b \c{-O1}: Minimal optimization. As above, but immediate operands |
| which will fit in a signed byte are optimized, |
| unless the long form is specified. Conditional jumps default |
| to the long form unless otherwise specified. |
| |
| \b \c{-Ox} (where \c{x} is the actual letter \c{x}): Multipass optimization. |
| Minimize branch offsets and signed immediate bytes, |
| overriding size specification unless the \c{strict} keyword |
| has been used (see \k{strict}). For compatibility with earlier |
| releases, the letter \c{x} may also be any number greater than |
| one. This number has no effect on the actual number of passes. |
| |
| \b \c{-Ov}: At the end of assembly, print the number of passes |
| actually executed. |
| |
| The \c{-Ox} mode is recommended for most uses, and is the default |
| since NASM 2.09. \e{Any other mode will generate worse quality |
| output.} Use \c{-O0} or \c{-O1} only if you need the finer |
| programmer-level control of output and \c{strict} is not suitable for |
| your use case. |
| |
| Note that this is a capital \c{O}, and is different from a small \c{o}, which |
| is used to specify the output file name. See \k{opt-o}. |
| |
| |
| \S{opt-t} The \i\c{-t} Option: \i{TASM} Compatibility Mode |
| |
| NASM includes a limited form of compatibility with Borland's TASM. |
| When NASM's \c{-t} option is used, the following changes are made: |
| |
| \b local labels may be prefixed with \c{@@} instead of \c{.} |
| |
| \b size override is supported within brackets. In TASM compatible mode, |
| a size override inside square brackets changes the size of the operand, |
| and not the address type of the operand as it does in NASM syntax. E.g. |
| \c{mov eax,[DWORD val]} is valid syntax in TASM compatibility mode. |
| Note that you lose the ability to override the default address type for |
| the instruction. |
| |
| \b unprefixed forms of some directives supported (\c{arg}, \c{elif}, |
| \c{else}, \c{endif}, \c{if}, \c{ifdef}, \c{ifdifi}, \c{ifndef}, |
| \c{include}, \c{local}) |
| |
| \S{opt-w} The \i\c{-w} and \i\c{-W} Options: Enable or Disable Assembly \i{Warnings} |
| |
| NASM can observe many conditions during the course of assembly which |
| are worth mentioning to the user, but not a sufficiently severe |
| error to justify NASM refusing to generate an output file. These |
| conditions are reported like errors, but come up with the word |
| `warning' before the message. Warnings do not prevent NASM from |
| generating an output file and returning a success status to the |
| operating system. |
| |
| Some conditions are even less severe than that: they are only |
| sometimes worth mentioning to the user. Therefore NASM supports the |
| \c{-w} command-line option, which enables or disables certain |
| classes of assembly warning. Such warning classes are described by a |
| name, for example \c{label-orphan}; you can enable warnings of |
| this class by the command-line option \c{-w+label-orphan} and |
| disable it by \c{-w-label-orphan}. |
| |
| Since version 2.15, NASM has group aliases for all prefixed warnings, |
| so they can be used to enable or disable all warnings in the group. |
| For example, -w+float enables all warnings with names starting with float-*. |
| |
| Since version 2.00, NASM has also supported the \c{gcc}-like syntax |
| \c{-Wwarning-class} and \c{-Wno-warning-class} instead of |
| \c{-w+warning-class} and \c{-w-warning-class}, respectively; both |
| syntaxes work identically. |
| |
| The option \c{-w+error} or \i\c{-Werror} can be used to treat warnings |
| as errors. This can be controlled on a per warning class basis |
| (\c{-w+error=}\e{warning-class} or \c{-Werror=}\e{warning-class}); |
| if no \e{warning-class} is specified NASM treats it as |
| \c{-w+error=all}; the same applies to \c{-w-error} or |
| \i\c{-Wno-error}, |
| of course. |
| |
| In addition, you can control warnings in the source code itself, using |
| the \i\c{[WARNING]} directive. See \k{asmdir-warning}. |
| |
| See \k{warnings} for the complete list of warning classes. |
| |
| \IR{-v} \c{-v} option |
| \IR{--v} \c{--v} option |
| |
| \S{opt-v} The \i\c{-v} Option: Display \i{Version} Info |
| |
| Typing \c{NASM -v} will display the version of NASM which you are using, |
| and the date on which it was compiled. |
| |
| You will need the version number if you report a bug. |
| |
| For command-line compatibility with Yasm, the form \i\c{--v} is also |
| accepted for this option starting in NASM version 2.11.05. |
| |
| |
| \IR{--prefix} \c{--prefix} option |
| \IC{--prefix}{--gprefix} \c{--gprefix} option |
| \IC{--prefix}{--lprefix} \c{--lprefix} option |
| \IC{--prefix}{--gpostfix} \c{--gpostfix} option |
| \IC{--prefix}{--lpostfix} \c{--lpostfix} option |
| \IC{--prefix}{--suffix} \c{--suffix} option |
| \IC{--prefix}{--gsuffix} \c{--gsuffix} option |
| \IC{--prefix}{--lsuffix} \c{--lsuffix} option |
| |
| \S{opt-pfix} The \I{--prefix}\c{--[gl]prefix} and \c{--[gl]postfix} Options |
| |
| The \c{--gprefix} option prepends the given argument |
| to all \c{extern}, \c{common}, \c{static}, and \c{global} symbols, and the |
| \c{--lprefix} option prepends to all other symbols. Similarly, |
| \c{--gpostfix} and \c{--lpostfix} options append |
| the argument, in a manner similar to the \c{--[gl]prefix} options. |
| |
| Running this: |
| |
| \c nasm -f macho --gprefix _ |
| |
| is equivalent to placing the directive \c{%pragma macho gprefix _} |
| at the start of the file (\k{mangling}). It will prepend the underscore |
| to all global and external variables, as C requires it in some, but not all, |
| system calling conventions. |
| |
| \c{--prefix} is an alias for \c{--gprefix}. |
| |
| See \k{mangling} for the equivalent directives and pragmas. |
| |
| Earlier versions of NASM called the pragmas \i\c{suffix} and the |
| options \i\c{--postfix}, and did not implement directives at all |
| despite being so documented. Since NASM 3.01, the directive forms are |
| implemented, and directives, pragmas and options all support all |
| spellings. |
| |
| |
| \IR{--pragma} \c{--pragma} option |
| |
| \S{opt-pragma} The \i\c{--pragma} Option |
| |
| NASM accepts an argument as \c{%pragma} option, which is like placing |
| a \c{%pragma} preprocess statement at the beginning of the source. |
| Running this: |
| |
| \c nasm -f macho --pragma "macho gprefix _" |
| |
| is equivalent to the example in \k{opt-pfix}. See \k{pragma}. |
| |
| |
| \IR{--before} \c{--before} option |
| |
| \S{opt-before} The \i\c{--before} Option |
| |
| Insert a statement (usually, but not necessarily) a preprocess |
| statement before the input file. The example shown in \k{opt-pragma} |
| is the same as running this: |
| |
| \c nasm -f macho --before "%pragma macho gprefix _" |
| |
| |
| \IR{--bits} \c{--bits} option |
| |
| \S{opt-bits} The \i\c{--bits} Option |
| |
| Set the processor mode by inserting a \c{BITS} directive (kee |
| \k{bits}) before the input file. The following two statements are |
| exactly equivalent: |
| |
| \c nasm -f bin --bits 16 file.asm |
| \c nasm -f bin --before "BITS 16" file.asm |
| |
| The \c{--bits} option was introduced in NASM 3.01; the \c{--before} |
| form can be used for compatibility with older versions of NASM. |
| |
| \IR{--limit-} \c{--limit-} options |
| |
| \S{opt-limit} The \i\c{--limit-} Options |
| |
| These options allows user to setup various maximum values after which |
| NASM will terminate with a fatal error rather than consume arbitrary |
| amount of compute time. Each limit can be set to a positive number or |
| \c{unlimited}. |
| |
| \b\c{--limit-passes}: Number of maximum allowed passes. Default is |
| \c{unlimited}. |
| |
| \b\c{--limit-stalled-passes}: Maximum number of allowed unfinished |
| passes. Default is 1000. |
| |
| \b\c{--limit-macro-levels}: Define maximum depth of macro expansion |
| (in preprocess). Default is 10000 |
| |
| \b\c{--limit-macro-tokens}: Maximum number of tokens processed during |
| single-line macro expansion. Default is 10000000. |
| |
| \b\c{--limit-mmacros}: Maximum number of multi-line macros processed |
| before returning to the top-level input. Default is 100000. |
| |
| \b\c{--limit-rep}: Maximum number of allowed preprocessor loop, defined |
| under \c{%rep}. Default is 1000000. |
| |
| \b\c{--limit-eval}: This number sets the maximum allowed |
| expression length. Default is 8192 on most systems. |
| |
| \b\c{--limit-lines}: Total number of source lines allowed to be |
| processed. Default is 2000000000. |
| |
| For example, set the maximum line count to 1000: |
| |
| \c nasm --limit-lines 1000 |
| |
| Limits can also be set via the directive \c{%pragma limit}, for |
| example: |
| |
| \c %pragma limit lines 1000 |
| |
| \IR{--keep-all} \c{--keep-all} option |
| |
| \S{opt-keep-all} The \i\c{--keep-all} Option |
| |
| This option prevents NASM from deleting any output files even if an |
| error happens. |
| |
| \IR{--no-line} \c{--no-line} option |
| |
| \S{opt-no-line} The \i\c{--no-line} Option |
| |
| If this option is given, all \i\c{%line} directives in the source code |
| are ignored. This can be useful for debugging already preprocessed |
| code. See \k{line}. |
| |
| \IR{--reproducible} \c{--reproducible} option |
| |
| \S{opt-reproducible} The \i\c{--reproducible} Option |
| |
| If this option is given, NASM will not emit information that is |
| inherently dependent on the NASM version or different from run to run |
| (such as timestamps) into the output file. |
| |
| |
| \S{nasmenv} The \i\c{NASMENV} \i{Environment} Variable |
| |
| If you define an environment variable called \c{NASMENV}, the program |
| will interpret it as a list of extra command-line options, which are |
| processed before the real command line. You can use this to define |
| standard search directories for include files, by putting \c{-i} |
| options in the \c{NASMENV} variable. |
| |
| The value of the variable is split up at white space, so that the |
| value \c{-s -ic:\\nasmlib\\} will be treated as two separate options. |
| However, that means that the value \c{-dNAME="my name"} won't do |
| what you might want, because it will be split at the space and the |
| NASM command-line processing will get confused by the two |
| nonsensical words \c{-dNAME="my} and \c{name"}. |
| |
| To get round this, NASM provides a feature whereby, if you begin the |
| \c{NASMENV} environment variable with some character that isn't a minus |
| sign, then NASM will treat this character as the \i{separator |
| character} for options. So setting the \c{NASMENV} variable to the |
| value \c{!-s!-ic:\\nasmlib\\} is equivalent to setting it to \c{-s |
| -ic:\\nasmlib\\}, but \c{!-dNAME="my name"} will work. |
| |
| This environment variable was previously called \c{NASM}. This was |
| changed with version 0.98.31. |
| |
| |
| \H{qstart} \i{Quick Start} for \i{MASM} Users |
| |
| If you're used to writing programs with MASM, or with \i{TASM} in |
| MASM-compatible (non-Ideal) mode, or with \i\c{a86}, this section |
| attempts to outline the major differences between MASM's syntax and |
| NASM's. If you're not already used to MASM, it's probably worth |
| skipping this section. |
| |
| |
| \S{qscs} NASM Is \I{case sensitivity}Case-Sensitive |
| |
| One simple difference is that NASM is case-sensitive. It makes a |
| difference whether you call your label \c{foo}, \c{Foo} or \c{FOO}. |
| If you're assembling to \c{DOS} or \c{OS/2} \c{.OBJ} files, you can |
| invoke the \i\c{UPPERCASE} directive (documented in \k{objfmt}) to |
| ensure that all symbols exported to other code modules are forced |
| to be upper case; but even then, \e{within} a single module, NASM |
| will distinguish between labels differing only in case. |
| |
| |
| \S{qsbrackets} NASM Requires \i{Square Brackets} For \i{Memory References} |
| |
| NASM was designed with simplicity of syntax in mind. One of the |
| \i{design goals} of NASM is that it should be possible, as far as is |
| practical, for the user to look at a single line of NASM code |
| and tell what opcode is generated by it. You can't do this in MASM: |
| if you declare, for example, |
| |
| \c foo equ 1 |
| \c bar dw 2 |
| |
| then the two lines of code |
| |
| \c mov ax,foo |
| \c mov ax,bar |
| |
| generate completely different opcodes, despite having |
| identical-looking syntaxes. |
| |
| NASM avoids this undesirable situation by having a much simpler |
| syntax for memory references. The rule is simply that any access to |
| the \e{contents} of a memory location requires square brackets |
| around the address, and any access to the \e{address} of a variable |
| doesn't. So an instruction of the form \c{mov ax,foo} will |
| \e{always} refer to a compile-time constant, whether it's an \c{EQU} |
| or the address of a variable; and to access the \e{contents} of the |
| variable \c{bar}, you must code \c{mov ax,[bar]}. |
| |
| This also means that NASM has no need for MASM's \i\c{OFFSET} |
| keyword, since the MASM code \c{mov ax,offset bar} means exactly the |
| same thing as NASM's \c{mov ax,bar}. If you're trying to get |
| large amounts of MASM code to assemble sensibly under NASM, you |
| can always code \c{%idefine offset} to make the preprocessor treat |
| the \c{OFFSET} keyword as a no-op. |
| |
| This issue is even more confusing in \i\c{a86}, where declaring a |
| label with a trailing colon defines it to be a `label' as opposed to |
| a `variable' and causes \c{a86} to adopt NASM-style semantics; so in |
| \c{a86}, \c{mov ax,var} has different behaviour depending on whether |
| \c{var} was declared as \c{var: dw 0} (a label) or \c{var dw 0} (a |
| word-size variable). NASM is very simple by comparison: |
| \e{everything} is a label. |
| |
| NASM, in the interests of simplicity, also does not support the |
| \i{hybrid syntaxes} supported by MASM and its clones, such as |
| \c{mov ax,table[bx]}, where a memory reference is denoted by one |
| portion outside square brackets and another portion inside. The |
| correct syntax for the above is \c{mov ax,[table+bx]}. Likewise, |
| \c{mov ax,es:[di]} is wrong and \c{mov ax,[es:di]} is right. |
| |
| |
| \S{qstypes} NASM Doesn't Store \i{Variable Types} |
| |
| NASM, by design, chooses not to remember the types of variables you |
| declare. Whereas MASM will remember, on seeing \c{var dw 0}, that |
| you declared \c{var} as a word-size variable, and will then be able |
| to fill in the \i{ambiguity} in the size of the instruction \c{mov |
| var,2}, NASM will deliberately remember nothing about the symbol |
| \c{var} except where it begins, and so you must explicitly code |
| \c{mov word [var],2}. |
| |
| For this reason, NASM doesn't support the \c{LODS}, \c{MOVS}, |
| \c{STOS}, \c{SCAS}, \c{CMPS}, \c{INS}, or \c{OUTS} instructions, |
| but only supports the forms such as \c{LODSB}, \c{MOVSW}, and |
| \c{SCASD}, which explicitly specify the size of the components of |
| the strings being manipulated. |
| |
| |
| \S{qsassume} NASM Doesn't \i\c{ASSUME} |
| |
| As part of NASM's drive for simplicity, it also does not support the |
| \c{ASSUME} directive. NASM will not keep track of what values you |
| choose to put in your segment registers, and will never |
| \e{automatically} generate a \i{segment override} prefix. |
| |
| |
| \S{qsmodel} NASM Doesn't Support \i{Memory Models} |
| |
| NASM also does not have any directives to support different 16-bit |
| memory models. The programmer has to keep track of which functions |
| are supposed to be called with a \i{far call} and which with a |
| \i{near call}, and is responsible for putting the correct form of |
| \c{RET} instruction (\c{RETN} or \c{RETF}; NASM accepts \c{RET} |
| itself as an alternate form for \c{RETN}); in addition, the |
| programmer is responsible for coding CALL FAR instructions where |
| necessary when calling \e{external} functions, and must also keep |
| track of which external variable definitions are far and which are |
| near. |
| |
| |
| \S{qsfpu} \i{Floating-Point} Differences |
| |
| NASM uses different names to refer to floating-point registers from |
| MASM: where MASM would call them \c{ST(0)}, \c{ST(1)} and so on, and |
| \i\c{a86} would call them simply \c{0}, \c{1} and so on, NASM |
| chooses to call them \c{st0}, \c{st1} etc. |
| |
| |
| \S{qsother} Other Differences |
| |
| For historical reasons, NASM uses the keyword \i\c{TWORD} where MASM |
| and compatible assemblers use \i\c{TBYTE}. |
| |
| Historically, NASM does not declare \i{uninitialized} storage in the |
| same way as MASM: where a MASM programmer might use \c{stack db 64 dup |
| (?)}, NASM requires \c{stack resb 64}, intended to be read as `reserve |
| 64 bytes'. As of NASM 2.15, the MASM syntax is also supported. |
| |
| In addition to all of this, macros and directives work completely |
| differently to MASM. See \k{preproc} and \k{directive} for further |
| details. |
| |
| \S{masm-compat} MASM compatibility package |
| |
| The MASM compatibility macro package can be used to improve MASM |
| compatibility. See \k{pkg_masm}. |