| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- nasm(1)
- =======
- :doctype: manpage
- :man source: NASM
- :man manual: The Netwide Assembler Project
- NAME
- ----
- nasm - the Netwide Assembler, a portable 80x86 assembler
- SYNOPSIS
- --------
- *nasm* [*-@* response file] [*-f* format] [*-o* outfile] [*-l* listfile] ['options'...] filename
- DESCRIPTION
- -----------
- The *nasm* command assembles the file 'filename' and directs output to the file
- 'outfile' if specified. If 'outfile' is not specified, *nasm* will derive a default
- output file name from the name of its input file, usually by appending `.o' or
- `.obj', or by removing all extensions for a raw binary file. Failing that, the
- output file name will be `nasm.out'.
- OPTIONS
- -------
- *-@* 'filename'::
- Causes *nasm* to process options from filename as if they were included on
- the command line.
- *-a*::
- Causes *nasm* to assemble the given input file without first applying the
- macro preprocessor.
- *-D*|*-d* 'macro[=value]'::
- Pre-defines a single-line macro.
- *-E*|*-e*::
- Causes *nasm* to preprocess the given input file, and write the output to
- 'stdout' (or the specified output file name), and not actually assemble
- anything.
- *-f* 'format'::
- Specifies the output file format. To see a list of valid output formats,
- use the *-hf* option.
- *-F* 'format'::
- Specifies the debug information format. To see a list of valid output
- formats, use the *-y* option (for example *-felf -y*).
- *-g*::
- Causes *nasm* to generate debug information.
- *-g*'format'::
- Equivalent to **-g -F**__ format__.
- *-h*::
- Causes *nasm* to exit immediately, after giving a summary of its
- invocation options.
- *-hf*::
- Same as *-h* , but also lists all valid output formats.
- *-I*|*-i* 'directory'::
- Adds a directory to the search path for include files. The directory
- specification must include the trailing slash, as it will be directly
- prepended to the name of the include file.
- *-l* 'listfile'::
- Causes an assembly listing to be directed to the given file, in which
- the original source is displayed on the right hand side (plus the source
- for included files and the expansions of multi-line macros) and the
- generated code is shown in hex on the left.
- *-M*::
- Causes *nasm* to output Makefile-style dependencies to stdout; normal
- output is suppressed.
- *-MG* 'file'::
- Same as *-M* but assumes that missing Makefile dependecies are generated
- and added to dependency list without a prefix.
- *-MF* 'file'::
- Output Makefile-style dependencies to the specified file.
- *-MD* 'file'::
- Same as a combination of *-M* and *-MF* options.
- *-MT* 'file'::
- Override the default name of the dependency target dependency target name.
- This is normally the same as the output filename, specified by
- the *-o* option.
- *-MQ* 'file'::
- The same as *-MT* 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.
- *-MP*::
- Emit phony target.
- *-O* 'number'::
- Optimize branch offsets.
- * *-O0*: No optimization
- * *-O1*: Minimal optimization
- * *-Ox*: Multipass optimization (default)
- *-o* 'outfile'::
- Specifies a precise name for the output file, overriding *nasm*'s default
- means of determining it.
- *-P*|*-p* 'file'::
- Specifies a file to be pre-included, before the main source file
- starts to be processed.
- *-s*::
- Causes *nasm* to send its error messages and/or help text to stdout
- instead of stderr.
- *-t*::
- Causes *nasm* to assemble in SciTech TASM compatible mode.
- *-U*|*-u* 'macro'::
- Undefines a single-line macro.
- *-v*::
- Causes *nasm* to exit immediately, after displaying its version number.
- *-W[no-]foo'::
- Causes *nasm* to enable or disable certain classes of warning messages,
- in gcc-like style, for example *-Worphan-labels* or *-Wno-orphan-labels*.
- *-w*'[+-]foo'::
- Causes *nasm* to enable or disable certain classes of warning messages,
- for example *-w+orphan-labels* or *-w-macro-params*.
- *-X* 'format'::
- Specifies error reporting format (gnu or vc).
- *-y*::
- Causes *nasm* to list supported debug formats.
- *-Z* 'filename'::
- Causes *nasm* to redirect error messages to 'filename'. This option exists
- to support operating systems on which stderr is not easily redirected.
- --prefix::
- --postfix::
- Prepend or append (respectively) the given argument to all global or
- extern variables.
- SYNTAX
- ------
- This man page does not fully describe the syntax of *nasm*'s assembly language,
- but does give a summary of the differences from other assemblers.
- 'Registers' have no leading `%' sign, unlike *gas*, and floating-point stack
- registers are referred to as 'st0', 'st1', and so on.
- 'Floating-point instructions' may use either the single-operand form or the
- double. A 'TO' keyword is provided; thus, one could either write
- fadd st0,st1
- fadd st1,st0
- or one could use the alternative single-operand forms
- fadd st1
- fadd to st1
- 'Uninitialised storage' is reserved using the 'RESB', 'RESW', 'RESD', 'RESQ',
- 'REST' and 'RESO' pseudo-opcodes, each taking one parameter which gives the
- number of bytes, words, doublewords, quadwords or ten-byte words to reserve.
- 'Repetition' of data items is not done by the 'DUP' keyword as seen in DOS
- assemblers, but by the use of the 'TIMES' prefix, like this:
- message: times 3 db 'abc'
- times 64-$+message db 0
- which defines the string `abcabcabc`, followed by the right number of zero
- bytes to make the total length up to 64 bytes.
- 'Symbol references' are always understood to be immediate (i.e. the address
- of the symbol), unless square brackets are used, in which case the contents
- of the memory location are used. Thus:
- mov ax,wordvar
- loads AX with the address of the variable `wordvar`, whereas
- mov ax,[wordvar]
- mov ax,[wordvar+1]
- mov ax,[es:wordvar+bx]
- all refer to the 'contents' of memory locations. The syntaxes
- mov ax,es:wordvar[bx]
- es mov ax,wordvar[1]
- are not legal at all, although the use of a segment register name as an instruction
- prefix is valid, and can be used with instructions such as 'LODSB' which can't
- be overridden any other way.
- 'Constants' may be expressed numerically in most formats: a trailing H, Q or
- B denotes hex, octal or binary respectively, and a leading `0x' or `$' denotes
- hex as well. Leading zeros are not treated specially at all. Character constants
- may be enclosed in single or double quotes; there is no escape character. The
- ordering is little-endian (reversed), so that the character constant ''abcd''
- denotes 0x64636261 and not 0x61626364.
- Local labels begin with a period, and their `locality' is granted by the assembler
- prepending the name of the previous non-local symbol. Thus declaring a label
- `.loop' after a label `label' has actually defined a symbol called `label.loop'.
- DIRECTIVES
- ----------
- 'SECTION' 'name' or 'SEGMENT' 'name' causes *nasm* to direct all following code
- to the named section. Section names vary with output file format, although most
- formats support the names '.text', '.data' and '.bss'. (The exception is the
- 'obj' format, in which all segments are user-definable.)
- 'ABSOLUTE' 'address' causes *nasm* to position its notional assembly point at
- an absolute address: so no code or data may be generated, but you can use 'RESB',
- 'RESW' and 'RESD' to move the assembly point further on, and you can define labels.
- So this directive may be used to define data structures. When you have finished
- doing absolute assembly, you must issue another 'SECTION' directive to return to
- normal assembly.
- 'BITS' '16', 'BITS' '32' or 'BITS' '64' switches the default processor mode for
- which *nasm* is generating code: it is equivalent to 'USE16' or 'USE32' in DOS
- assemblers.
- 'EXTERN' 'symbol' and 'GLOBAL' 'symbol' import and export symbol definitions,
- respectively, from and to other modules. Note that the 'GLOBAL' directive must
- appear before the definition of the symbol it refers to.
- 'STRUC' 'strucname' and 'ENDSTRUC', when used to bracket a number of 'RESB',
- 'RESW' or similar instructions, define a data structure. In addition to
- defining the offsets of the structure members, the construct also defines a symbol
- for the size of the structure, which is simply the structure name with 'size'
- tacked on to the end.
- FORMAT-SPECIFIC DIRECTIVES
- --------------------------
- 'ORG' 'address' is used by the 'bin' flat-form binary output format, and
- specifies the address at which the output code will eventually be loaded.
- 'GROUP' 'grpname' 'seg1' 'seg2'... is used by the obj (Microsoft 16-bit)
- output format, and defines segment groups. This format also uses 'UPPERCASE',
- which directs that all segment, group and symbol names output to the object
- file should be in uppercase. Note that the actual assembly is still case
- sensitive.
- 'LIBRARY' 'libname' is used by the 'rdf' output format, and causes a
- dependency record to be written to the output file which indicates that
- the program requires a certain library in order to run.
- MACRO PREPROCESSOR
- ------------------
- Single-line macros are defined using the '%define' or '%idefine' commands, in
- a similar fashion to the C preprocessor. They can be overloaded with respect
- to number of parameters, although defining a macro with no parameters prevents
- the definition of any macro with the same name taking parameters, and vice versa.
- '%define' defines macros whose names match case-sensitively, whereas '%idefine'
- defines case-insensitive macros.
- Multi-line macros are defined using '%macro' and '%imacro' (the distinction is the
- same as that between '%define' and '%idefine'), whose syntax is as follows
- %macro name minprm[-maxprm][+][.nolist] [defaults]
- <some lines of macro expansion text>
- %endmacro
- Again, these macros may be overloaded. The trailing plus sign indicates that
- any parameters after the last one get subsumed, with their separating commas,
- into the last parameter. The 'defaults' part can be used to specify defaults for
- unspecified macro parameters after 'minparam'. '%endm' is a valid synonym for
- '%endmacro'.
- To refer to the macro parameters within a macro expansion, you use '%1', '%2' and
- so on. You can also enforce that a macro parameter should contain a condition
- code by using '%+1', and you can invert the condition code by using '%-1'. You can also
- define a label specific to a macro invocation by prefixing it with a double `%' sign.
- Files can be included using the '%include' directive, which works like C.
- The preprocessor has a `context stack', which may be used by one macro to store
- information that a later one will retrieve. You can push a context on the stack
- using '%push', remove one using '%pop', and change the name of the top context (without
- disturbing any associated definitions) using '%repl'. Labels and '%define' macros
- specific to the top context may be defined by prefixing their names with %$,
- and things specific to the next context down with %$$, and so on.
- Conditional assembly is done by means of '%ifdef', '%ifndef', '%else' and '%endif'
- as in C. (Except that '%ifdef' can accept several putative macro names, and
- will evaluate TRUE if any of them is defined.) In addition, the directives
- '%ifctx' and '%ifnctx' can be used to condition on the name of the top context
- on the context stack. The obvious set of `else-if' directives, '%elifdef',
- '%elifndef', '%elifctx' and '%elifnctx' are also supported.
- BUGS
- ----
- Please report bugs through the bug tracker function at http://nasm.us.
- SEE ALSO
- --------
- *as*(1), *ld*(1).
|