diff options
Diffstat (limited to 'doc/html/nasmdoc2.html')
-rw-r--r-- | doc/html/nasmdoc2.html | 650 |
1 files changed, 650 insertions, 0 deletions
diff --git a/doc/html/nasmdoc2.html b/doc/html/nasmdoc2.html new file mode 100644 index 0000000..a639a4a --- /dev/null +++ b/doc/html/nasmdoc2.html @@ -0,0 +1,650 @@ +<html><head><title>NASM Manual</title></head> +<body><h1 align=center>The Netwide Assembler: NASM</h1> + +<p align=center><a href="nasmdoc3.html">Next Chapter</a> | +<a href="nasmdoc1.html">Previous Chapter</a> | +<a href="nasmdoc0.html">Contents</a> | +<a href="nasmdoci.html">Index</a> +<h2><a name="chapter-2">Chapter 2: Running NASM</a></h2> +<h3><a name="section-2.1">2.1 NASM Command-Line Syntax</a></h3> +<p>To assemble a file, you issue a command of the form +<p><pre> +nasm -f <format> <filename> [-o <output>] +</pre> +<p>For example, +<p><pre> +nasm -f elf myfile.asm +</pre> +<p>will assemble <code><nobr>myfile.asm</nobr></code> into an +<code><nobr>ELF</nobr></code> object file +<code><nobr>myfile.o</nobr></code>. And +<p><pre> +nasm -f bin myfile.asm -o myfile.com +</pre> +<p>will assemble <code><nobr>myfile.asm</nobr></code> into a raw binary +file <code><nobr>myfile.com</nobr></code>. +<p>To produce a listing file, with the hex codes output from NASM displayed +on the left of the original sources, use the <code><nobr>-l</nobr></code> +option to give a listing file name, for example: +<p><pre> +nasm -f coff myfile.asm -l myfile.lst +</pre> +<p>To get further usage instructions from NASM, try typing +<p><pre> +nasm -h +</pre> +<p>As <code><nobr>-hf</nobr></code>, this will also list the available +output file formats, and what they are. +<p>If you use Linux but aren't sure whether your system is +<code><nobr>a.out</nobr></code> or <code><nobr>ELF</nobr></code>, type +<p><pre> +file nasm +</pre> +<p>(in the directory in which you put the NASM binary when you installed +it). If it says something like +<p><pre> +nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1 +</pre> +<p>then your system is <code><nobr>ELF</nobr></code>, and you should use +the option <code><nobr>-f elf</nobr></code> when you want NASM to produce +Linux object files. If it says +<p><pre> +nasm: Linux/i386 demand-paged executable (QMAGIC) +</pre> +<p>or something similar, your system is <code><nobr>a.out</nobr></code>, +and you should use <code><nobr>-f aout</nobr></code> instead (Linux +<code><nobr>a.out</nobr></code> systems have long been obsolete, and are +rare these days.) +<p>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. +<h4><a name="section-2.1.1">2.1.1 The <code><nobr>-o</nobr></code> Option: Specifying the Output File Name</a></h4> +<p>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 (<code><nobr>obj</nobr></code>, +<code><nobr>win32</nobr></code> and <code><nobr>win64</nobr></code>), it +will remove the <code><nobr>.asm</nobr></code> extension (or whatever +extension you like to use - NASM doesn't care) from your source file name +and substitute <code><nobr>.obj</nobr></code>. For Unix object file formats +(<code><nobr>aout</nobr></code>, <code><nobr>as86</nobr></code>, +<code><nobr>coff</nobr></code>, <code><nobr>elf32</nobr></code>, +<code><nobr>elf64</nobr></code>, <code><nobr>ieee</nobr></code>, +<code><nobr>macho32</nobr></code> and <code><nobr>macho64</nobr></code>) it +will substitute <code><nobr>.o</nobr></code>. For +<code><nobr>dbg</nobr></code>, <code><nobr>rdf</nobr></code>, +<code><nobr>ith</nobr></code> and <code><nobr>srec</nobr></code>, it will +use <code><nobr>.dbg</nobr></code>, <code><nobr>.rdf</nobr></code>, +<code><nobr>.ith</nobr></code> and <code><nobr>.srec</nobr></code>, +respectively, and for the <code><nobr>bin</nobr></code> format it will +simply remove the extension, so that <code><nobr>myfile.asm</nobr></code> +produces the output file <code><nobr>myfile</nobr></code>. +<p>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 <code><nobr>nasm.out</nobr></code> as the output file name instead. +<p>For situations in which this behaviour is unacceptable, NASM provides +the <code><nobr>-o</nobr></code> command-line option, which allows you to +specify your desired output file name. You invoke +<code><nobr>-o</nobr></code> by following it with the name you wish for the +output file, either with or without an intervening space. For example: +<p><pre> +nasm -f bin program.asm -o program.com +nasm -f bin driver.asm -odriver.sys +</pre> +<p>Note that this is a small o, and is different from a capital O , which +is used to specify the number of optimisation passes required. See +<a href="#section-2.1.22">section 2.1.22</a>. +<h4><a name="section-2.1.2">2.1.2 The <code><nobr>-f</nobr></code> Option: Specifying the Output File Format</a></h4> +<p>If you do not supply the <code><nobr>-f</nobr></code> option to NASM, it +will choose an output file format for you itself. In the distribution +versions of NASM, the default is always <code><nobr>bin</nobr></code>; if +you've compiled your own copy of NASM, you can redefine +<code><nobr>OF_DEFAULT</nobr></code> at compile time and choose what you +want the default to be. +<p>Like <code><nobr>-o</nobr></code>, the intervening space between +<code><nobr>-f</nobr></code> and the output file format is optional; so +<code><nobr>-f elf</nobr></code> and <code><nobr>-felf</nobr></code> are +both valid. +<p>A complete list of the available output file formats can be given by +issuing the command <code><nobr>nasm -hf</nobr></code>. +<h4><a name="section-2.1.3">2.1.3 The <code><nobr>-l</nobr></code> Option: Generating a Listing File</a></h4> +<p>If you supply the <code><nobr>-l</nobr></code> option to NASM, followed +(with the usual optional space) by a file name, NASM will generate a +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 <a href="nasmdoc4.html#section-4.3.10">section +4.3.10</a>) on the right. For example: +<p><pre> +nasm -f elf myfile.asm -l myfile.lst +</pre> +<p>If a list file is selected, you may turn off listing for a section of +your source with <code><nobr>[list -]</nobr></code>, and turn it back on +with <code><nobr>[list +]</nobr></code>, (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. +<h4><a name="section-2.1.4">2.1.4 The <code><nobr>-M</nobr></code> Option: Generate Makefile Dependencies</a></h4> +<p>This option can be used to generate makefile dependencies on stdout. +This can be redirected to a file for further processing. For example: +<p><pre> +nasm -M myfile.asm > myfile.dep +</pre> +<h4><a name="section-2.1.5">2.1.5 The <code><nobr>-MG</nobr></code> Option: Generate Makefile Dependencies</a></h4> +<p>This option can be used to generate makefile dependencies on stdout. +This differs from the <code><nobr>-M</nobr></code> 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. +<h4><a name="section-2.1.6">2.1.6 The <code><nobr>-MF</nobr></code> Option: Set Makefile Dependency File</a></h4> +<p>This option can be used with the <code><nobr>-M</nobr></code> or +<code><nobr>-MG</nobr></code> options to send the output to a file, rather +than to stdout. For example: +<p><pre> +nasm -M -MF myfile.dep myfile.asm +</pre> +<h4><a name="section-2.1.7">2.1.7 The <code><nobr>-MD</nobr></code> Option: Assemble and Generate Dependencies</a></h4> +<p>The <code><nobr>-MD</nobr></code> option acts as the combination of the +<code><nobr>-M</nobr></code> and <code><nobr>-MF</nobr></code> options +(i.e. a filename has to be specified.) However, unlike the +<code><nobr>-M</nobr></code> or <code><nobr>-MG</nobr></code> options, +<code><nobr>-MD</nobr></code> does <em>not</em> inhibit the normal +operation of the assembler. Use this to automatically generate updated +dependencies with every assembly session. For example: +<p><pre> +nasm -f elf -o myfile.o -MD myfile.dep myfile.asm +</pre> +<h4><a name="section-2.1.8">2.1.8 The <code><nobr>-MT</nobr></code> Option: Dependency Target Name</a></h4> +<p>The <code><nobr>-MT</nobr></code> 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 <code><nobr>-o</nobr></code> option. +<h4><a name="section-2.1.9">2.1.9 The <code><nobr>-MQ</nobr></code> Option: Dependency Target Name (Quoted)</a></h4> +<p>The <code><nobr>-MQ</nobr></code> option acts as the +<code><nobr>-MT</nobr></code> 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 Make. +<h4><a name="section-2.1.10">2.1.10 The <code><nobr>-MP</nobr></code> Option: Emit phony targets</a></h4> +<p>When used with any of the dependency generation options, the +<code><nobr>-MP</nobr></code> option causes NASM to emit a phony target +without dependencies for each header file. This prevents Make from +complaining if a header file has been removed. +<h4><a name="section-2.1.11">2.1.11 The <code><nobr>-F</nobr></code> Option: Selecting a Debug Information Format</a></h4> +<p>This option is used to select the format of the debug information +emitted into the output file, to be used by a debugger (or <em>will</em> +be). Prior to version 2.03.01, the use of this switch did <em>not</em> +enable output of the selected debug info format. Use +<code><nobr>-g</nobr></code>, see <a href="#section-2.1.12">section +2.1.12</a>, to enable output. Versions 2.03.01 and later automatically +enable <code><nobr>-g</nobr></code> if <code><nobr>-F</nobr></code> is +specified. +<p>A complete list of the available debug file formats for an output format +can be seen by issuing the command +<code><nobr>nasm -f <format> -y</nobr></code>. Not all output formats +currently support debugging output. See <a href="#section-2.1.26">section +2.1.26</a>. +<p>This should not be confused with the <code><nobr>-f dbg</nobr></code> +output format option which is not built into NASM by default. For +information on how to enable it when building from the sources, see +<a href="nasmdoc7.html#section-7.14">section 7.14</a>. +<h4><a name="section-2.1.12">2.1.12 The <code><nobr>-g</nobr></code> Option: Enabling Debug Information.</a></h4> +<p>This option can be used to generate debugging information in the +specified format. See <a href="#section-2.1.11">section 2.1.11</a>. Using +<code><nobr>-g</nobr></code> without <code><nobr>-F</nobr></code> 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, <code><nobr>-g</nobr></code> is <em>silently +ignored</em>. +<h4><a name="section-2.1.13">2.1.13 The <code><nobr>-X</nobr></code> Option: Selecting an Error Reporting Format</a></h4> +<p>This option can be used to select an error reporting format for any +error messages that might be produced by NASM. +<p>Currently, two error reporting formats may be selected. They are the +<code><nobr>-Xvc</nobr></code> option and the +<code><nobr>-Xgnu</nobr></code> option. The GNU format is the default and +looks like this: +<p><pre> +filename.asm:65: error: specific error message +</pre> +<p>where <code><nobr>filename.asm</nobr></code> is the name of the source +file in which the error was detected, <code><nobr>65</nobr></code> is the +source file line number on which the error was detected, +<code><nobr>error</nobr></code> is the severity of the error (this could be +<code><nobr>warning</nobr></code>), and +<code><nobr>specific error message</nobr></code> is a more detailed text +message which should help pinpoint the exact problem. +<p>The other format, specified by <code><nobr>-Xvc</nobr></code> is the +style used by Microsoft Visual C++ and some other programs. It looks like +this: +<p><pre> +filename.asm(65) : error: specific error message +</pre> +<p>where the only difference is that the line number is in parentheses +instead of being delimited by colons. +<p>See also the <code><nobr>Visual C++</nobr></code> output format, +<a href="nasmdoc7.html#section-7.5">section 7.5</a>. +<h4><a name="section-2.1.14">2.1.14 The <code><nobr>-Z</nobr></code> Option: Send Errors to a File</a></h4> +<p>Under <code><nobr>MS-DOS</nobr></code> 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 error messages on +<code><nobr>stderr</nobr></code>, this can make it hard to capture the +errors if (for example) you want to load them into an editor. +<p>NASM therefore provides the <code><nobr>-Z</nobr></code> option, taking +a filename argument which causes errors to be sent to the specified files +rather than standard error. Therefore you can redirect the errors into a +file by typing +<p><pre> +nasm -Z myfile.err -f obj myfile.asm +</pre> +<p>In earlier versions of NASM, this option was called +<code><nobr>-E</nobr></code>, but it was changed since +<code><nobr>-E</nobr></code> is an option conventionally used for +preprocessing only, with disastrous results. See +<a href="#section-2.1.20">section 2.1.20</a>. +<h4><a name="section-2.1.15">2.1.15 The <code><nobr>-s</nobr></code> Option: Send Errors to <code><nobr>stdout</nobr></code></a></h4> +<p>The <code><nobr>-s</nobr></code> option redirects error messages to +<code><nobr>stdout</nobr></code> rather than +<code><nobr>stderr</nobr></code>, so it can be redirected under +<code><nobr>MS-DOS</nobr></code>. To assemble the file +<code><nobr>myfile.asm</nobr></code> and pipe its output to the +<code><nobr>more</nobr></code> program, you can type: +<p><pre> +nasm -s -f obj myfile.asm | more +</pre> +<p>See also the <code><nobr>-Z</nobr></code> option, +<a href="#section-2.1.14">section 2.1.14</a>. +<h4><a name="section-2.1.16">2.1.16 The <code><nobr>-i</nobr></code> Option: Include File Search Directories</a></h4> +<p>When NASM sees the <code><nobr>%include</nobr></code> or +<code><nobr>%pathsearch</nobr></code> directive in a source file (see +<a href="nasmdoc4.html#section-4.6.1">section 4.6.1</a>, +<a href="nasmdoc4.html#section-4.6.2">section 4.6.2</a> or +<a href="nasmdoc3.html#section-3.2.3">section 3.2.3</a>), 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 +<code><nobr>-i</nobr></code> option. Therefore you can include files from a +macro library, for example, by typing +<p><pre> +nasm -ic:\macrolib\ -f obj myfile.asm +</pre> +<p>(As usual, a space between <code><nobr>-i</nobr></code> and the path +name is allowed, and optional). +<p>NASM, in the interests of complete source-code portability, does not +understand the file naming conventions of the OS it is running on; the +string you provide as an argument to the <code><nobr>-i</nobr></code> +option will be prepended exactly as written to the name of the include +file. Therefore the trailing backslash in the above example is necessary. +Under Unix, a trailing forward slash is similarly necessary. +<p>(You can use this to your advantage, if you're really perverse, by +noting that the option <code><nobr>-ifoo</nobr></code> will cause +<code><nobr>%include "bar.i"</nobr></code> to search for the file +<code><nobr>foobar.i</nobr></code>...) +<p>If you want to define a <em>standard</em> include search path, similar +to <code><nobr>/usr/include</nobr></code> on Unix systems, you should place +one or more <code><nobr>-i</nobr></code> directives in the +<code><nobr>NASMENV</nobr></code> environment variable (see +<a href="#section-2.1.28">section 2.1.28</a>). +<p>For Makefile compatibility with many C compilers, this option can also +be specified as <code><nobr>-I</nobr></code>. +<h4><a name="section-2.1.17">2.1.17 The <code><nobr>-p</nobr></code> Option: Pre-Include a File</a></h4> +<p>NASM allows you to specify files to be <em>pre-included</em> into your +source file, by the use of the <code><nobr>-p</nobr></code> option. So +running +<p><pre> +nasm myfile.asm -p myinc.inc +</pre> +<p>is equivalent to running <code><nobr>nasm myfile.asm</nobr></code> and +placing the directive <code><nobr>%include "myinc.inc"</nobr></code> at the +start of the file. +<p>For consistency with the <code><nobr>-I</nobr></code>, +<code><nobr>-D</nobr></code> and <code><nobr>-U</nobr></code> options, this +option can also be specified as <code><nobr>-P</nobr></code>. +<h4><a name="section-2.1.18">2.1.18 The <code><nobr>-d</nobr></code> Option: Pre-Define a Macro</a></h4> +<p>Just as the <code><nobr>-p</nobr></code> option gives an alternative to +placing <code><nobr>%include</nobr></code> directives at the start of a +source file, the <code><nobr>-d</nobr></code> option gives an alternative +to placing a <code><nobr>%define</nobr></code> directive. You could code +<p><pre> +nasm myfile.asm -dFOO=100 +</pre> +<p>as an alternative to placing the directive +<p><pre> +%define FOO 100 +</pre> +<p>at the start of the file. You can miss off the macro value, as well: the +option <code><nobr>-dFOO</nobr></code> is equivalent to coding +<code><nobr>%define FOO</nobr></code>. This form of the directive may be +useful for selecting assembly-time options which are then tested using +<code><nobr>%ifdef</nobr></code>, for example +<code><nobr>-dDEBUG</nobr></code>. +<p>For Makefile compatibility with many C compilers, this option can also +be specified as <code><nobr>-D</nobr></code>. +<h4><a name="section-2.1.19">2.1.19 The <code><nobr>-u</nobr></code> Option: Undefine a Macro</a></h4> +<p>The <code><nobr>-u</nobr></code> option undefines a macro that would +otherwise have been pre-defined, either automatically or by a +<code><nobr>-p</nobr></code> or <code><nobr>-d</nobr></code> option +specified earlier on the command lines. +<p>For example, the following command line: +<p><pre> +nasm myfile.asm -dFOO=100 -uFOO +</pre> +<p>would result in <code><nobr>FOO</nobr></code> <em>not</em> being a +predefined macro in the program. This is useful to override options +specified at a different point in a Makefile. +<p>For Makefile compatibility with many C compilers, this option can also +be specified as <code><nobr>-U</nobr></code>. +<h4><a name="section-2.1.20">2.1.20 The <code><nobr>-E</nobr></code> Option: Preprocess Only</a></h4> +<p>NASM allows the preprocessor to be run on its own, up to a point. Using +the <code><nobr>-E</nobr></code> 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 +<code><nobr>-o</nobr></code> option is also used). +<p>This option cannot be applied to programs which require the preprocessor +to evaluate expressions which depend on the values of symbols: so code such +as +<p><pre> +%assign tablesize ($-tablestart) +</pre> +<p>will cause an error in preprocess-only mode. +<p>For compatiblity with older version of NASM, this option can also be +written <code><nobr>-e</nobr></code>. <code><nobr>-E</nobr></code> in older +versions of NASM was the equivalent of the current +<code><nobr>-Z</nobr></code> option, <a href="#section-2.1.14">section +2.1.14</a>. +<h4><a name="section-2.1.21">2.1.21 The <code><nobr>-a</nobr></code> Option: Don't Preprocess At All</a></h4> +<p>If NASM is being used as the back end to a compiler, it might be +desirable to suppress preprocessing completely and assume the compiler has +already done it, to save time and increase compilation speeds. The +<code><nobr>-a</nobr></code> option, requiring no argument, instructs NASM +to replace its powerful preprocessor with a stub preprocessor which does +nothing. +<h4><a name="section-2.1.22">2.1.22 The <code><nobr>-O</nobr></code> Option: Specifying Multipass Optimization</a></h4> +<p>NASM defaults to not optimizing operands which can fit into a signed +byte. This means that if you want the shortest possible object code, you +have to enable optimization. +<p>Using the <code><nobr>-O</nobr></code> option, you can tell NASM to +carry out different levels of optimization. The syntax is: +<ul> +<li><code><nobr>-O0</nobr></code>: 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. +<li><code><nobr>-O1</nobr></code>: 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. +<li><code><nobr>-Ox</nobr></code> (where <code><nobr>x</nobr></code> is the +actual letter <code><nobr>x</nobr></code>): Multipass optimization. +Minimize branch offsets and signed immediate bytes, overriding size +specification unless the <code><nobr>strict</nobr></code> keyword has been +used (see <a href="nasmdoc3.html#section-3.7">section 3.7</a>). For +compatability with earlier releases, the letter <code><nobr>x</nobr></code> +may also be any number greater than one. This number has no effect on the +actual number of passes. +</ul> +<p>The <code><nobr>-Ox</nobr></code> mode is recommended for most uses. +<p>Note that this is a capital <code><nobr>O</nobr></code>, and is +different from a small <code><nobr>o</nobr></code>, which is used to +specify the output file name. See <a href="#section-2.1.1">section +2.1.1</a>. +<h4><a name="section-2.1.23">2.1.23 The <code><nobr>-t</nobr></code> Option: Enable TASM Compatibility Mode</a></h4> +<p>NASM includes a limited form of compatibility with Borland's +<code><nobr>TASM</nobr></code>. When NASM's <code><nobr>-t</nobr></code> +option is used, the following changes are made: +<ul> +<li>local labels may be prefixed with <code><nobr>@@</nobr></code> instead +of <code><nobr>.</nobr></code> +<li>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. +<code><nobr>mov eax,[DWORD val]</nobr></code> is valid syntax in TASM +compatibility mode. Note that you lose the ability to override the default +address type for the instruction. +<li>unprefixed forms of some directives supported +(<code><nobr>arg</nobr></code>, <code><nobr>elif</nobr></code>, +<code><nobr>else</nobr></code>, <code><nobr>endif</nobr></code>, +<code><nobr>if</nobr></code>, <code><nobr>ifdef</nobr></code>, +<code><nobr>ifdifi</nobr></code>, <code><nobr>ifndef</nobr></code>, +<code><nobr>include</nobr></code>, <code><nobr>local</nobr></code>) +</ul> +<h4><a name="section-2.1.24">2.1.24 The <code><nobr>-w</nobr></code> and <code><nobr>-W</nobr></code> Options: Enable or Disable Assembly Warnings</a></h4> +<p>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. +<p>Some conditions are even less severe than that: they are only sometimes +worth mentioning to the user. Therefore NASM supports the +<code><nobr>-w</nobr></code> command-line option, which enables or disables +certain classes of assembly warning. Such warning classes are described by +a name, for example <code><nobr>orphan-labels</nobr></code>; you can enable +warnings of this class by the command-line option +<code><nobr>-w+orphan-labels</nobr></code> and disable it by +<code><nobr>-w-orphan-labels</nobr></code>. +<p>The suppressible warning classes are: +<ul> +<li><code><nobr>macro-params</nobr></code> covers warnings about multi-line +macros being invoked with the wrong number of parameters. This warning +class is enabled by default; see +<a href="nasmdoc4.html#section-4.3.2">section 4.3.2</a> for an example of +why you might want to disable it. +<li><code><nobr>macro-selfref</nobr></code> warns if a macro references +itself. This warning class is disabled by default. +<li><code><nobr>macro-defaults</nobr></code> warns when a macro has more +default parameters than optional parameters. This warning class is enabled +by default; see <a href="nasmdoc4.html#section-4.3.5">section 4.3.5</a> for +why you might want to disable it. +<li><code><nobr>orphan-labels</nobr></code> covers warnings about source +lines which contain no instruction but define a label without a trailing +colon. NASM warns about this somewhat obscure condition by default; see +<a href="nasmdoc3.html#section-3.1">section 3.1</a> for more information. +<li><code><nobr>number-overflow</nobr></code> covers warnings about numeric +constants which don't fit in 64 bits. This warning class is enabled by +default. +<li><code><nobr>gnu-elf-extensions</nobr></code> warns if 8-bit or 16-bit +relocations are used in <code><nobr>-f elf</nobr></code> format. The GNU +extensions allow this. This warning class is disabled by default. +<li><code><nobr>float-overflow</nobr></code> warns about floating point +overflow. Enabled by default. +<li><code><nobr>float-denorm</nobr></code> warns about floating point +denormals. Disabled by default. +<li><code><nobr>float-underflow</nobr></code> warns about floating point +underflow. Disabled by default. +<li><code><nobr>float-toolong</nobr></code> warns about too many digits in +floating-point numbers. Enabled by default. +<li><code><nobr>user</nobr></code> controls +<code><nobr>%warning</nobr></code> directives (see +<a href="nasmdoc4.html#section-4.9">section 4.9</a>). Enabled by default. +<li><code><nobr>error</nobr></code> causes warnings to be treated as +errors. Disabled by default. +<li><code><nobr>all</nobr></code> is an alias for <em>all</em> suppressible +warning classes (not including <code><nobr>error</nobr></code>). Thus, +<code><nobr>-w+all</nobr></code> enables all available warnings. +</ul> +<p>In addition, you can set warning classes across sections. Warning +classes may be enabled with +<code><nobr>[warning +warning-name]</nobr></code>, disabled with +<code><nobr>[warning -warning-name]</nobr></code> or reset to their +original value with <code><nobr>[warning *warning-name]</nobr></code>. No +"user form" (without the brackets) exists. +<p>Since version 2.00, NASM has also supported the gcc-like syntax +<code><nobr>-Wwarning</nobr></code> and +<code><nobr>-Wno-warning</nobr></code> instead of +<code><nobr>-w+warning</nobr></code> and +<code><nobr>-w-warning</nobr></code>, respectively. +<h4><a name="section-2.1.25">2.1.25 The <code><nobr>-v</nobr></code> Option: Display Version Info</a></h4> +<p>Typing <code><nobr>NASM -v</nobr></code> will display the version of +NASM which you are using, and the date on which it was compiled. +<p>You will need the version number if you report a bug. +<h4><a name="section-2.1.26">2.1.26 The <code><nobr>-y</nobr></code> Option: Display Available Debug Info Formats</a></h4> +<p>Typing <code><nobr>nasm -f <option> -y</nobr></code> will display +a list of the available debug info formats for the given output format. The +default format is indicated by an asterisk. For example: +<p><pre> +nasm -f elf -y +</pre> +<p><pre> +valid debug formats for 'elf32' output format are + ('*' denotes default): + * stabs ELF32 (i386) stabs debug format for Linux + dwarf elf32 (i386) dwarf debug format for Linux +</pre> +<h4><a name="section-2.1.27">2.1.27 The <code><nobr>--prefix</nobr></code> and <code><nobr>--postfix</nobr></code> Options.</a></h4> +<p>The <code><nobr>--prefix</nobr></code> and +<code><nobr>--postfix</nobr></code> options prepend or append +(respectively) the given argument to all <code><nobr>global</nobr></code> +or <code><nobr>extern</nobr></code> variables. E.g. +<code><nobr>--prefix _</nobr></code> will prepend the underscore to all +global and external variables, as C sometimes (but not always) likes it. +<h4><a name="section-2.1.28">2.1.28 The <code><nobr>NASMENV</nobr></code> Environment Variable</a></h4> +<p>If you define an environment variable called +<code><nobr>NASMENV</nobr></code>, 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 <code><nobr>-i</nobr></code> options in the +<code><nobr>NASMENV</nobr></code> variable. +<p>The value of the variable is split up at white space, so that the value +<code><nobr>-s -ic:\nasmlib\</nobr></code> will be treated as two separate +options. However, that means that the value +<code><nobr>-dNAME="my name"</nobr></code> 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 +<code><nobr>-dNAME="my</nobr></code> and <code><nobr>name"</nobr></code>. +<p>To get round this, NASM provides a feature whereby, if you begin the +<code><nobr>NASMENV</nobr></code> environment variable with some character +that isn't a minus sign, then NASM will treat this character as the +separator character for options. So setting the +<code><nobr>NASMENV</nobr></code> variable to the value +<code><nobr>!-s!-ic:\nasmlib\</nobr></code> is equivalent to setting it to +<code><nobr>-s -ic:\nasmlib\</nobr></code>, but +<code><nobr>!-dNAME="my name"</nobr></code> will work. +<p>This environment variable was previously called +<code><nobr>NASM</nobr></code>. This was changed with version 0.98.31. +<h3><a name="section-2.2">2.2 Quick Start for MASM Users</a></h3> +<p>If you're used to writing programs with MASM, or with TASM in +MASM-compatible (non-Ideal) mode, or with <code><nobr>a86</nobr></code>, +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. +<h4><a name="section-2.2.1">2.2.1 NASM Is Case-Sensitive</a></h4> +<p>One simple difference is that NASM is case-sensitive. It makes a +difference whether you call your label <code><nobr>foo</nobr></code>, +<code><nobr>Foo</nobr></code> or <code><nobr>FOO</nobr></code>. If you're +assembling to <code><nobr>DOS</nobr></code> or +<code><nobr>OS/2</nobr></code> <code><nobr>.OBJ</nobr></code> files, you +can invoke the <code><nobr>UPPERCASE</nobr></code> directive (documented in +<a href="nasmdoc7.html#section-7.4">section 7.4</a>) to ensure that all +symbols exported to other code modules are forced to be upper case; but +even then, <em>within</em> a single module, NASM will distinguish between +labels differing only in case. +<h4><a name="section-2.2.2">2.2.2 NASM Requires Square Brackets For Memory References</a></h4> +<p>NASM was designed with simplicity of syntax in mind. One of the 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, +<p><pre> +foo equ 1 +bar dw 2 +</pre> +<p>then the two lines of code +<p><pre> + mov ax,foo + mov ax,bar +</pre> +<p>generate completely different opcodes, despite having identical-looking +syntaxes. +<p>NASM avoids this undesirable situation by having a much simpler syntax +for memory references. The rule is simply that any access to the +<em>contents</em> of a memory location requires square brackets around the +address, and any access to the <em>address</em> of a variable doesn't. So +an instruction of the form <code><nobr>mov ax,foo</nobr></code> will +<em>always</em> refer to a compile-time constant, whether it's an +<code><nobr>EQU</nobr></code> or the address of a variable; and to access +the <em>contents</em> of the variable <code><nobr>bar</nobr></code>, you +must code <code><nobr>mov ax,[bar]</nobr></code>. +<p>This also means that NASM has no need for MASM's +<code><nobr>OFFSET</nobr></code> keyword, since the MASM code +<code><nobr>mov ax,offset bar</nobr></code> means exactly the same thing as +NASM's <code><nobr>mov ax,bar</nobr></code>. If you're trying to get large +amounts of MASM code to assemble sensibly under NASM, you can always code +<code><nobr>%idefine offset</nobr></code> to make the preprocessor treat +the <code><nobr>OFFSET</nobr></code> keyword as a no-op. +<p>This issue is even more confusing in <code><nobr>a86</nobr></code>, +where declaring a label with a trailing colon defines it to be a `label' as +opposed to a `variable' and causes <code><nobr>a86</nobr></code> to adopt +NASM-style semantics; so in <code><nobr>a86</nobr></code>, +<code><nobr>mov ax,var</nobr></code> has different behaviour depending on +whether <code><nobr>var</nobr></code> was declared as +<code><nobr>var: dw 0</nobr></code> (a label) or +<code><nobr>var dw 0</nobr></code> (a word-size variable). NASM is very +simple by comparison: <em>everything</em> is a label. +<p>NASM, in the interests of simplicity, also does not support the hybrid +syntaxes supported by MASM and its clones, such as +<code><nobr>mov ax,table[bx]</nobr></code>, where a memory reference is +denoted by one portion outside square brackets and another portion inside. +The correct syntax for the above is +<code><nobr>mov ax,[table+bx]</nobr></code>. Likewise, +<code><nobr>mov ax,es:[di]</nobr></code> is wrong and +<code><nobr>mov ax,[es:di]</nobr></code> is right. +<h4><a name="section-2.2.3">2.2.3 NASM Doesn't Store Variable Types</a></h4> +<p>NASM, by design, chooses not to remember the types of variables you +declare. Whereas MASM will remember, on seeing +<code><nobr>var dw 0</nobr></code>, that you declared +<code><nobr>var</nobr></code> as a word-size variable, and will then be +able to fill in the ambiguity in the size of the instruction +<code><nobr>mov var,2</nobr></code>, NASM will deliberately remember +nothing about the symbol <code><nobr>var</nobr></code> except where it +begins, and so you must explicitly code +<code><nobr>mov word [var],2</nobr></code>. +<p>For this reason, NASM doesn't support the +<code><nobr>LODS</nobr></code>, <code><nobr>MOVS</nobr></code>, +<code><nobr>STOS</nobr></code>, <code><nobr>SCAS</nobr></code>, +<code><nobr>CMPS</nobr></code>, <code><nobr>INS</nobr></code>, or +<code><nobr>OUTS</nobr></code> instructions, but only supports the forms +such as <code><nobr>LODSB</nobr></code>, <code><nobr>MOVSW</nobr></code>, +and <code><nobr>SCASD</nobr></code>, which explicitly specify the size of +the components of the strings being manipulated. +<h4><a name="section-2.2.4">2.2.4 NASM Doesn't <code><nobr>ASSUME</nobr></code></a></h4> +<p>As part of NASM's drive for simplicity, it also does not support the +<code><nobr>ASSUME</nobr></code> directive. NASM will not keep track of +what values you choose to put in your segment registers, and will never +<em>automatically</em> generate a segment override prefix. +<h4><a name="section-2.2.5">2.2.5 NASM Doesn't Support Memory Models</a></h4> +<p>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 far call and which with a near call, and is +responsible for putting the correct form of <code><nobr>RET</nobr></code> +instruction (<code><nobr>RETN</nobr></code> or +<code><nobr>RETF</nobr></code>; NASM accepts <code><nobr>RET</nobr></code> +itself as an alternate form for <code><nobr>RETN</nobr></code>); in +addition, the programmer is responsible for coding CALL FAR instructions +where necessary when calling <em>external</em> functions, and must also +keep track of which external variable definitions are far and which are +near. +<h4><a name="section-2.2.6">2.2.6 Floating-Point Differences</a></h4> +<p>NASM uses different names to refer to floating-point registers from +MASM: where MASM would call them <code><nobr>ST(0)</nobr></code>, +<code><nobr>ST(1)</nobr></code> and so on, and +<code><nobr>a86</nobr></code> would call them simply +<code><nobr>0</nobr></code>, <code><nobr>1</nobr></code> and so on, NASM +chooses to call them <code><nobr>st0</nobr></code>, +<code><nobr>st1</nobr></code> etc. +<p>As of version 0.96, NASM now treats the instructions with `nowait' forms +in the same way as MASM-compatible assemblers. The idiosyncratic treatment +employed by 0.95 and earlier was based on a misunderstanding by the +authors. +<h4><a name="section-2.2.7">2.2.7 Other Differences</a></h4> +<p>For historical reasons, NASM uses the keyword +<code><nobr>TWORD</nobr></code> where MASM and compatible assemblers use +<code><nobr>TBYTE</nobr></code>. +<p>NASM does not declare uninitialized storage in the same way as MASM: +where a MASM programmer might use +<code><nobr>stack db 64 dup (?)</nobr></code>, NASM requires +<code><nobr>stack resb 64</nobr></code>, intended to be read as `reserve 64 +bytes'. For a limited amount of compatibility, since NASM treats +<code><nobr>?</nobr></code> as a valid character in symbol names, you can +code <code><nobr>? equ 0</nobr></code> and then writing +<code><nobr>dw ?</nobr></code> will at least do something vaguely useful. +<code><nobr>DUP</nobr></code> is still not a supported syntax, however. +<p>In addition to all of this, macros and directives work completely +differently to MASM. See <a href="nasmdoc4.html">chapter 4</a> and +<a href="nasmdoc6.html">chapter 6</a> for further details. +<p align=center><a href="nasmdoc3.html">Next Chapter</a> | +<a href="nasmdoc1.html">Previous Chapter</a> | +<a href="nasmdoc0.html">Contents</a> | +<a href="nasmdoci.html">Index</a> +</body></html> |