summaryrefslogtreecommitdiff
path: root/doc/html
diff options
context:
space:
mode:
authorHyungKyu Song <hk76.song@samsung.com>2013-02-16 00:52:20 +0900
committerHyungKyu Song <hk76.song@samsung.com>2013-02-16 00:52:20 +0900
commite6c15f0e49b4ea41b5c5eb36457db0127ec901fc (patch)
tree996be9095a97ff2aac0d98963b6044d47a0ec60c /doc/html
parent65c26d26fb72cec0d43d199c72ed27513d17f4c9 (diff)
downloadnasm-tizen_2.0.tar.gz
nasm-tizen_2.0.tar.bz2
nasm-tizen_2.0.zip
Diffstat (limited to 'doc/html')
-rw-r--r--doc/html/nasmdo10.html165
-rw-r--r--doc/html/nasmdo11.html164
-rw-r--r--doc/html/nasmdo12.html178
-rw-r--r--doc/html/nasmdoc0.html378
-rw-r--r--doc/html/nasmdoc1.html159
-rw-r--r--doc/html/nasmdoc2.html650
-rw-r--r--doc/html/nasmdoc3.html753
-rw-r--r--doc/html/nasmdoc4.html1970
-rw-r--r--doc/html/nasmdoc5.html83
-rw-r--r--doc/html/nasmdoc6.html371
-rw-r--r--doc/html/nasmdoc7.html1267
-rw-r--r--doc/html/nasmdoc8.html808
-rw-r--r--doc/html/nasmdoc9.html482
-rw-r--r--doc/html/nasmdoca.html165
-rw-r--r--doc/html/nasmdocb.html3148
-rw-r--r--doc/html/nasmdocc.html1468
-rw-r--r--doc/html/nasmdoci.html2345
17 files changed, 14554 insertions, 0 deletions
diff --git a/doc/html/nasmdo10.html b/doc/html/nasmdo10.html
new file mode 100644
index 0000000..151dee1
--- /dev/null
+++ b/doc/html/nasmdo10.html
@@ -0,0 +1,165 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdo11.html">Next Chapter</a> |
+<a href="nasmdoc9.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="chapter-10">Chapter 10: Mixing 16 and 32 Bit Code</a></h2>
+<p>This chapter tries to cover some of the issues, largely related to
+unusual forms of addressing and jump instructions, encountered when writing
+operating system code such as protected-mode initialisation routines, which
+require code that operates in mixed segment sizes, such as code in a 16-bit
+segment trying to modify data in a 32-bit one, or jumps between
+different-size segments.
+<h3><a name="section-10.1">10.1 Mixed-Size Jumps</a></h3>
+<p>The most common form of mixed-size instruction is the one used when
+writing a 32-bit OS: having done your setup in 16-bit mode, such as loading
+the kernel, you then have to boot it by switching into protected mode and
+jumping to the 32-bit kernel start address. In a fully 32-bit OS, this
+tends to be the <em>only</em> mixed-size instruction you need, since
+everything before it can be done in pure 16-bit code, and everything after
+it can be pure 32-bit.
+<p>This jump must specify a 48-bit far address, since the target segment is
+a 32-bit one. However, it must be assembled in a 16-bit segment, so just
+coding, for example,
+<p><pre>
+ jmp 0x1234:0x56789ABC ; wrong!
+</pre>
+<p>will not work, since the offset part of the address will be truncated to
+<code><nobr>0x9ABC</nobr></code> and the jump will be an ordinary 16-bit
+far one.
+<p>The Linux kernel setup code gets round the inability of
+<code><nobr>as86</nobr></code> to generate the required instruction by
+coding it manually, using <code><nobr>DB</nobr></code> instructions. NASM
+can go one better than that, by actually generating the right instruction
+itself. Here's how to do it right:
+<p><pre>
+ jmp dword 0x1234:0x56789ABC ; right
+</pre>
+<p>The <code><nobr>DWORD</nobr></code> prefix (strictly speaking, it should
+come <em>after</em> the colon, since it is declaring the <em>offset</em>
+field to be a doubleword; but NASM will accept either form, since both are
+unambiguous) forces the offset part to be treated as far, in the assumption
+that you are deliberately writing a jump from a 16-bit segment to a 32-bit
+one.
+<p>You can do the reverse operation, jumping from a 32-bit segment to a
+16-bit one, by means of the <code><nobr>WORD</nobr></code> prefix:
+<p><pre>
+ jmp word 0x8765:0x4321 ; 32 to 16 bit
+</pre>
+<p>If the <code><nobr>WORD</nobr></code> prefix is specified in 16-bit
+mode, or the <code><nobr>DWORD</nobr></code> prefix in 32-bit mode, they
+will be ignored, since each is explicitly forcing NASM into a mode it was
+in anyway.
+<h3><a name="section-10.2">10.2 Addressing Between Different-Size Segments</a></h3>
+<p>If your OS is mixed 16 and 32-bit, or if you are writing a DOS extender,
+you are likely to have to deal with some 16-bit segments and some 32-bit
+ones. At some point, you will probably end up writing code in a 16-bit
+segment which has to access data in a 32-bit segment, or vice versa.
+<p>If the data you are trying to access in a 32-bit segment lies within the
+first 64K of the segment, you may be able to get away with using an
+ordinary 16-bit addressing operation for the purpose; but sooner or later,
+you will want to do 32-bit addressing from 16-bit mode.
+<p>The easiest way to do this is to make sure you use a register for the
+address, since any effective address containing a 32-bit register is forced
+to be a 32-bit address. So you can do
+<p><pre>
+ mov eax,offset_into_32_bit_segment_specified_by_fs
+ mov dword [fs:eax],0x11223344
+</pre>
+<p>This is fine, but slightly cumbersome (since it wastes an instruction
+and a register) if you already know the precise offset you are aiming at.
+The x86 architecture does allow 32-bit effective addresses to specify
+nothing but a 4-byte offset, so why shouldn't NASM be able to generate the
+best instruction for the purpose?
+<p>It can. As in <a href="#section-10.1">section 10.1</a>, you need only
+prefix the address with the <code><nobr>DWORD</nobr></code> keyword, and it
+will be forced to be a 32-bit address:
+<p><pre>
+ mov dword [fs:dword my_offset],0x11223344
+</pre>
+<p>Also as in <a href="#section-10.1">section 10.1</a>, NASM is not fussy
+about whether the <code><nobr>DWORD</nobr></code> prefix comes before or
+after the segment override, so arguably a nicer-looking way to code the
+above instruction is
+<p><pre>
+ mov dword [dword fs:my_offset],0x11223344
+</pre>
+<p>Don't confuse the <code><nobr>DWORD</nobr></code> prefix
+<em>outside</em> the square brackets, which controls the size of the data
+stored at the address, with the one <code><nobr>inside</nobr></code> the
+square brackets which controls the length of the address itself. The two
+can quite easily be different:
+<p><pre>
+ mov word [dword 0x12345678],0x9ABC
+</pre>
+<p>This moves 16 bits of data to an address specified by a 32-bit offset.
+<p>You can also specify <code><nobr>WORD</nobr></code> or
+<code><nobr>DWORD</nobr></code> prefixes along with the
+<code><nobr>FAR</nobr></code> prefix to indirect far jumps or calls. For
+example:
+<p><pre>
+ call dword far [fs:word 0x4321]
+</pre>
+<p>This instruction contains an address specified by a 16-bit offset; it
+loads a 48-bit far pointer from that (16-bit segment and 32-bit offset),
+and calls that address.
+<h3><a name="section-10.3">10.3 Other Mixed-Size Instructions</a></h3>
+<p>The other way you might want to access data might be using the string
+instructions (<code><nobr>LODSx</nobr></code>,
+<code><nobr>STOSx</nobr></code> and so on) or the
+<code><nobr>XLATB</nobr></code> instruction. These instructions, since they
+take no parameters, might seem to have no easy way to make them perform
+32-bit addressing when assembled in a 16-bit segment.
+<p>This is the purpose of NASM's <code><nobr>a16</nobr></code>,
+<code><nobr>a32</nobr></code> and <code><nobr>a64</nobr></code> prefixes.
+If you are coding <code><nobr>LODSB</nobr></code> in a 16-bit segment but
+it is supposed to be accessing a string in a 32-bit segment, you should
+load the desired address into <code><nobr>ESI</nobr></code> and then code
+<p><pre>
+ a32 lodsb
+</pre>
+<p>The prefix forces the addressing size to 32 bits, meaning that
+<code><nobr>LODSB</nobr></code> loads from
+<code><nobr>[DS:ESI]</nobr></code> instead of
+<code><nobr>[DS:SI]</nobr></code>. To access a string in a 16-bit segment
+when coding in a 32-bit one, the corresponding
+<code><nobr>a16</nobr></code> prefix can be used.
+<p>The <code><nobr>a16</nobr></code>, <code><nobr>a32</nobr></code> and
+<code><nobr>a64</nobr></code> prefixes can be applied to any instruction in
+NASM's instruction table, but most of them can generate all the useful
+forms without them. The prefixes are necessary only for instructions with
+implicit addressing: <code><nobr>CMPSx</nobr></code>,
+<code><nobr>SCASx</nobr></code>, <code><nobr>LODSx</nobr></code>,
+<code><nobr>STOSx</nobr></code>, <code><nobr>MOVSx</nobr></code>,
+<code><nobr>INSx</nobr></code>, <code><nobr>OUTSx</nobr></code>, and
+<code><nobr>XLATB</nobr></code>. Also, the various push and pop
+instructions (<code><nobr>PUSHA</nobr></code> and
+<code><nobr>POPF</nobr></code> as well as the more usual
+<code><nobr>PUSH</nobr></code> and <code><nobr>POP</nobr></code>) can
+accept <code><nobr>a16</nobr></code>, <code><nobr>a32</nobr></code> or
+<code><nobr>a64</nobr></code> prefixes to force a particular one of
+<code><nobr>SP</nobr></code>, <code><nobr>ESP</nobr></code> or
+<code><nobr>RSP</nobr></code> to be used as a stack pointer, in case the
+stack segment in use is a different size from the code segment.
+<p><code><nobr>PUSH</nobr></code> and <code><nobr>POP</nobr></code>, when
+applied to segment registers in 32-bit mode, also have the slightly odd
+behaviour that they push and pop 4 bytes at a time, of which the top two
+are ignored and the bottom two give the value of the segment register being
+manipulated. To force the 16-bit behaviour of segment-register push and pop
+instructions, you can use the operand-size prefix
+<code><nobr>o16</nobr></code>:
+<p><pre>
+ o16 push ss
+ o16 push ds
+</pre>
+<p>This code saves a doubleword of stack space by fitting two segment
+registers into the space which would normally be consumed by pushing one.
+<p>(You can also use the <code><nobr>o32</nobr></code> prefix to force the
+32-bit behaviour when in 16-bit mode, but this seems less useful.)
+<p align=center><a href="nasmdo11.html">Next Chapter</a> |
+<a href="nasmdoc9.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdo11.html b/doc/html/nasmdo11.html
new file mode 100644
index 0000000..c40eede
--- /dev/null
+++ b/doc/html/nasmdo11.html
@@ -0,0 +1,164 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdo12.html">Next Chapter</a> |
+<a href="nasmdo10.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="chapter-11">Chapter 11: Writing 64-bit Code (Unix, Win64)</a></h2>
+<p>This chapter attempts to cover some of the common issues involved when
+writing 64-bit code, to run under Win64 or Unix. It covers how to write
+assembly code to interface with 64-bit C routines, and how to write
+position-independent code for shared libraries.
+<p>All 64-bit code uses a flat memory model, since segmentation is not
+available in 64-bit mode. The one exception is the
+<code><nobr>FS</nobr></code> and <code><nobr>GS</nobr></code> registers,
+which still add their bases.
+<p>Position independence in 64-bit mode is significantly simpler, since the
+processor supports <code><nobr>RIP</nobr></code>-relative addressing
+directly; see the <code><nobr>REL</nobr></code> keyword
+(<a href="nasmdoc3.html#section-3.3">section 3.3</a>). On most 64-bit
+platforms, it is probably desirable to make that the default, using the
+directive <code><nobr>DEFAULT REL</nobr></code>
+(<a href="nasmdoc6.html#section-6.2">section 6.2</a>).
+<p>64-bit programming is relatively similar to 32-bit programming, but of
+course pointers are 64 bits long; additionally, all existing platforms pass
+arguments in registers rather than on the stack. Furthermore, 64-bit
+platforms use SSE2 by default for floating point. Please see the ABI
+documentation for your platform.
+<p>64-bit platforms differ in the sizes of the fundamental datatypes, not
+just from 32-bit platforms but from each other. If a specific size data
+type is desired, it is probably best to use the types defined in the
+Standard C header <code><nobr>&lt;inttypes.h&gt;</nobr></code>.
+<p>In 64-bit mode, the default instruction size is still 32 bits. When
+loading a value into a 32-bit register (but not an 8- or 16-bit register),
+the upper 32 bits of the corresponding 64-bit register are set to zero.
+<h3><a name="section-11.1">11.1 Register Names in 64-bit Mode</a></h3>
+<p>NASM uses the following names for general-purpose registers in 64-bit
+mode, for 8-, 16-, 32- and 64-bit references, respecitively:
+<p><pre>
+ AL/AH, CL/CH, DL/DH, BL/BH, SPL, BPL, SIL, DIL, R8B-R15B
+ AX, CX, DX, BX, SP, BP, SI, DI, R8W-R15W
+ EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, R8D-R15D
+ RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, R8-R15
+</pre>
+<p>This is consistent with the AMD documentation and most other assemblers.
+The Intel documentation, however, uses the names
+<code><nobr>R8L-R15L</nobr></code> for 8-bit references to the higher
+registers. It is possible to use those names by definiting them as macros;
+similarly, if one wants to use numeric names for the low 8 registers,
+define them as macros. The standard macro package
+<code><nobr>altreg</nobr></code> (see
+<a href="nasmdoc5.html#section-5.1">section 5.1</a>) can be used for this
+purpose.
+<h3><a name="section-11.2">11.2 Immediates and Displacements in 64-bit Mode</a></h3>
+<p>In 64-bit mode, immediates and displacements are generally only 32 bits
+wide. NASM will therefore truncate most displacements and immediates to 32
+bits.
+<p>The only instruction which takes a full 64-bit immediate is:
+<p><pre>
+ MOV reg64,imm64
+</pre>
+<p>NASM will produce this instruction whenever the programmer uses
+<code><nobr>MOV</nobr></code> with an immediate into a 64-bit register. If
+this is not desirable, simply specify the equivalent 32-bit register, which
+will be automatically zero-extended by the processor, or specify the
+immediate as <code><nobr>DWORD</nobr></code>:
+<p><pre>
+ mov rax,foo ; 64-bit immediate
+ mov rax,qword foo ; (identical)
+ mov eax,foo ; 32-bit immediate, zero-extended
+ mov rax,dword foo ; 32-bit immediate, sign-extended
+</pre>
+<p>The length of these instructions are 10, 5 and 7 bytes, respectively.
+<p>The only instructions which take a full 64-bit <em>displacement</em> is
+loading or storing, using <code><nobr>MOV</nobr></code>,
+<code><nobr>AL</nobr></code>, <code><nobr>AX</nobr></code>,
+<code><nobr>EAX</nobr></code> or <code><nobr>RAX</nobr></code> (but no
+other registers) to an absolute 64-bit address. Since this is a relatively
+rarely used instruction (64-bit code generally uses relative addressing),
+the programmer has to explicitly declare the displacement size as
+<code><nobr>QWORD</nobr></code>:
+<p><pre>
+ default abs
+
+ mov eax,[foo] ; 32-bit absolute disp, sign-extended
+ mov eax,[a32 foo] ; 32-bit absolute disp, zero-extended
+ mov eax,[qword foo] ; 64-bit absolute disp
+
+ default rel
+
+ mov eax,[foo] ; 32-bit relative disp
+ mov eax,[a32 foo] ; d:o, address truncated to 32 bits(!)
+ mov eax,[qword foo] ; error
+ mov eax,[abs qword foo] ; 64-bit absolute disp
+</pre>
+<p>A sign-extended absolute displacement can access from -2 GB to +2 GB; a
+zero-extended absolute displacement can access from 0 to 4 GB.
+<h3><a name="section-11.3">11.3 Interfacing to 64-bit C Programs (Unix)</a></h3>
+<p>On Unix, the 64-bit ABI is defined by the document:
+<p>
+<a href="http://www.x86-64.org/documentation/abi.pdf"><code><nobr>http://www.x86-64.org/documentation/abi.pdf</nobr></code></a>
+<p>Although written for AT&amp;T-syntax assembly, the concepts apply
+equally well for NASM-style assembly. What follows is a simplified summary.
+<p>The first six integer arguments (from the left) are passed in
+<code><nobr>RDI</nobr></code>, <code><nobr>RSI</nobr></code>,
+<code><nobr>RDX</nobr></code>, <code><nobr>RCX</nobr></code>,
+<code><nobr>R8</nobr></code>, and <code><nobr>R9</nobr></code>, in that
+order. Additional integer arguments are passed on the stack. These
+registers, plus <code><nobr>RAX</nobr></code>,
+<code><nobr>R10</nobr></code> and <code><nobr>R11</nobr></code> are
+destroyed by function calls, and thus are available for use by the function
+without saving.
+<p>Integer return values are passed in <code><nobr>RAX</nobr></code> and
+<code><nobr>RDX</nobr></code>, in that order.
+<p>Floating point is done using SSE registers, except for
+<code><nobr>long double</nobr></code>. Floating-point arguments are passed
+in <code><nobr>XMM0</nobr></code> to <code><nobr>XMM7</nobr></code>; return
+is <code><nobr>XMM0</nobr></code> and <code><nobr>XMM1</nobr></code>.
+<code><nobr>long double</nobr></code> are passed on the stack, and returned
+in <code><nobr>ST0</nobr></code> and <code><nobr>ST1</nobr></code>.
+<p>All SSE and x87 registers are destroyed by function calls.
+<p>On 64-bit Unix, <code><nobr>long</nobr></code> is 64 bits.
+<p>Integer and SSE register arguments are counted separately, so for the
+case of
+<p><pre>
+ void foo(long a, double b, int c)
+</pre>
+<p><code><nobr>a</nobr></code> is passed in <code><nobr>RDI</nobr></code>,
+<code><nobr>b</nobr></code> in <code><nobr>XMM0</nobr></code>, and
+<code><nobr>c</nobr></code> in <code><nobr>ESI</nobr></code>.
+<h3><a name="section-11.4">11.4 Interfacing to 64-bit C Programs (Win64)</a></h3>
+<p>The Win64 ABI is described at:
+<p>
+<a href="http://msdn2.microsoft.com/en-gb/library/ms794533.aspx"><code><nobr>http://msdn2.microsoft.com/en-gb/library/ms794533.aspx</nobr></code></a>
+<p>What follows is a simplified summary.
+<p>The first four integer arguments are passed in
+<code><nobr>RCX</nobr></code>, <code><nobr>RDX</nobr></code>,
+<code><nobr>R8</nobr></code> and <code><nobr>R9</nobr></code>, in that
+order. Additional integer arguments are passed on the stack. These
+registers, plus <code><nobr>RAX</nobr></code>,
+<code><nobr>R10</nobr></code> and <code><nobr>R11</nobr></code> are
+destroyed by function calls, and thus are available for use by the function
+without saving.
+<p>Integer return values are passed in <code><nobr>RAX</nobr></code> only.
+<p>Floating point is done using SSE registers, except for
+<code><nobr>long double</nobr></code>. Floating-point arguments are passed
+in <code><nobr>XMM0</nobr></code> to <code><nobr>XMM3</nobr></code>; return
+is <code><nobr>XMM0</nobr></code> only.
+<p>On Win64, <code><nobr>long</nobr></code> is 32 bits;
+<code><nobr>long long</nobr></code> or <code><nobr>_int64</nobr></code> is
+64 bits.
+<p>Integer and SSE register arguments are counted together, so for the case
+of
+<p><pre>
+ void foo(long long a, double b, int c)
+</pre>
+<p><code><nobr>a</nobr></code> is passed in <code><nobr>RCX</nobr></code>,
+<code><nobr>b</nobr></code> in <code><nobr>XMM1</nobr></code>, and
+<code><nobr>c</nobr></code> in <code><nobr>R8D</nobr></code>.
+<p align=center><a href="nasmdo12.html">Next Chapter</a> |
+<a href="nasmdo10.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdo12.html b/doc/html/nasmdo12.html
new file mode 100644
index 0000000..9c937f8
--- /dev/null
+++ b/doc/html/nasmdo12.html
@@ -0,0 +1,178 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdoca.html">Next Chapter</a> |
+<a href="nasmdo11.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="chapter-12">Chapter 12: Troubleshooting</a></h2>
+<p>This chapter describes some of the common problems that users have been
+known to encounter with NASM, and answers them. It also gives instructions
+for reporting bugs in NASM if you find a difficulty that isn't listed here.
+<h3><a name="section-12.1">12.1 Common Problems</a></h3>
+<h4><a name="section-12.1.1">12.1.1 NASM Generates Inefficient Code</a></h4>
+<p>We sometimes get `bug' reports about NASM generating inefficient, or
+even `wrong', code on instructions such as
+<code><nobr>ADD ESP,8</nobr></code>. This is a deliberate design feature,
+connected to predictability of output: NASM, on seeing
+<code><nobr>ADD ESP,8</nobr></code>, will generate the form of the
+instruction which leaves room for a 32-bit offset. You need to code
+<code><nobr>ADD ESP,BYTE 8</nobr></code> if you want the space-efficient
+form of the instruction. This isn't a bug, it's user error: if you prefer
+to have NASM produce the more efficient code automatically enable
+optimization with the <code><nobr>-O</nobr></code> option (see
+<a href="nasmdoc2.html#section-2.1.22">section 2.1.22</a>).
+<h4><a name="section-12.1.2">12.1.2 My Jumps are Out of Range</a></h4>
+<p>Similarly, people complain that when they issue conditional jumps (which
+are <code><nobr>SHORT</nobr></code> by default) that try to jump too far,
+NASM reports `short jump out of range' instead of making the jumps longer.
+<p>This, again, is partly a predictability issue, but in fact has a more
+practical reason as well. NASM has no means of being told what type of
+processor the code it is generating will be run on; so it cannot decide for
+itself that it should generate <code><nobr>Jcc NEAR</nobr></code> type
+instructions, because it doesn't know that it's working for a 386 or above.
+Alternatively, it could replace the out-of-range short
+<code><nobr>JNE</nobr></code> instruction with a very short
+<code><nobr>JE</nobr></code> instruction that jumps over a
+<code><nobr>JMP NEAR</nobr></code>; this is a sensible solution for
+processors below a 386, but hardly efficient on processors which have good
+branch prediction <em>and</em> could have used
+<code><nobr>JNE NEAR</nobr></code> instead. So, once again, it's up to the
+user, not the assembler, to decide what instructions should be generated.
+See <a href="nasmdoc2.html#section-2.1.22">section 2.1.22</a>.
+<h4><a name="section-12.1.3">12.1.3 <code><nobr>ORG</nobr></code> Doesn't Work</a></h4>
+<p>People writing boot sector programs in the <code><nobr>bin</nobr></code>
+format often complain that <code><nobr>ORG</nobr></code> doesn't work the
+way they'd like: in order to place the <code><nobr>0xAA55</nobr></code>
+signature word at the end of a 512-byte boot sector, people who are used to
+MASM tend to code
+<p><pre>
+ ORG 0
+
+ ; some boot sector code
+
+ ORG 510
+ DW 0xAA55
+</pre>
+<p>This is not the intended use of the <code><nobr>ORG</nobr></code>
+directive in NASM, and will not work. The correct way to solve this problem
+in NASM is to use the <code><nobr>TIMES</nobr></code> directive, like this:
+<p><pre>
+ ORG 0
+
+ ; some boot sector code
+
+ TIMES 510-($-$$) DB 0
+ DW 0xAA55
+</pre>
+<p>The <code><nobr>TIMES</nobr></code> directive will insert exactly enough
+zero bytes into the output to move the assembly point up to 510. This
+method also has the advantage that if you accidentally fill your boot
+sector too full, NASM will catch the problem at assembly time and report
+it, so you won't end up with a boot sector that you have to disassemble to
+find out what's wrong with it.
+<h4><a name="section-12.1.4">12.1.4 <code><nobr>TIMES</nobr></code> Doesn't Work</a></h4>
+<p>The other common problem with the above code is people who write the
+<code><nobr>TIMES</nobr></code> line as
+<p><pre>
+ TIMES 510-$ DB 0
+</pre>
+<p>by reasoning that <code><nobr>$</nobr></code> should be a pure number,
+just like 510, so the difference between them is also a pure number and can
+happily be fed to <code><nobr>TIMES</nobr></code>.
+<p>NASM is a <em>modular</em> assembler: the various component parts are
+designed to be easily separable for re-use, so they don't exchange
+information unnecessarily. In consequence, the
+<code><nobr>bin</nobr></code> output format, even though it has been told
+by the <code><nobr>ORG</nobr></code> directive that the
+<code><nobr>.text</nobr></code> section should start at 0, does not pass
+that information back to the expression evaluator. So from the evaluator's
+point of view, <code><nobr>$</nobr></code> isn't a pure number: it's an
+offset from a section base. Therefore the difference between
+<code><nobr>$</nobr></code> and 510 is also not a pure number, but involves
+a section base. Values involving section bases cannot be passed as
+arguments to <code><nobr>TIMES</nobr></code>.
+<p>The solution, as in the previous section, is to code the
+<code><nobr>TIMES</nobr></code> line in the form
+<p><pre>
+ TIMES 510-($-$$) DB 0
+</pre>
+<p>in which <code><nobr>$</nobr></code> and <code><nobr>$$</nobr></code>
+are offsets from the same section base, and so their difference is a pure
+number. This will solve the problem and generate sensible code.
+<h3><a name="section-12.2">12.2 Bugs</a></h3>
+<p>We have never yet released a version of NASM with any <em>known</em>
+bugs. That doesn't usually stop there being plenty we didn't know about,
+though. Any that you find should be reported firstly via the
+<code><nobr>bugtracker</nobr></code> at
+<a href="https://sourceforge.net/projects/nasm/"><code><nobr>https://sourceforge.net/projects/nasm/</nobr></code></a>
+(click on "Bugs"), or if that fails then through one of the contacts in
+<a href="nasmdoc1.html#section-1.2">section 1.2</a>.
+<p>Please read <a href="nasmdoc2.html#section-2.2">section 2.2</a> first,
+and don't report the bug if it's listed in there as a deliberate feature.
+(If you think the feature is badly thought out, feel free to send us
+reasons why you think it should be changed, but don't just send us mail
+saying `This is a bug' if the documentation says we did it on purpose.)
+Then read <a href="#section-12.1">section 12.1</a>, and don't bother
+reporting the bug if it's listed there.
+<p>If you do report a bug, <em>please</em> give us all of the following
+information:
+<ul>
+<li>What operating system you're running NASM under. DOS, Linux, NetBSD,
+Win16, Win32, VMS (I'd be impressed), whatever.
+<li>If you're running NASM under DOS or Win32, tell us whether you've
+compiled your own executable from the DOS source archive, or whether you
+were using the standard distribution binaries out of the archive. If you
+were using a locally built executable, try to reproduce the problem using
+one of the standard binaries, as this will make it easier for us to
+reproduce your problem prior to fixing it.
+<li>Which version of NASM you're using, and exactly how you invoked it.
+Give us the precise command line, and the contents of the
+<code><nobr>NASMENV</nobr></code> environment variable if any.
+<li>Which versions of any supplementary programs you're using, and how you
+invoked them. If the problem only becomes visible at link time, tell us
+what linker you're using, what version of it you've got, and the exact
+linker command line. If the problem involves linking against object files
+generated by a compiler, tell us what compiler, what version, and what
+command line or options you used. (If you're compiling in an IDE, please
+try to reproduce the problem with the command-line version of the
+compiler.)
+<li>If at all possible, send us a NASM source file which exhibits the
+problem. If this causes copyright problems (e.g. you can only reproduce the
+bug in restricted-distribution code) then bear in mind the following two
+points: firstly, we guarantee that any source code sent to us for the
+purposes of debugging NASM will be used <em>only</em> for the purposes of
+debugging NASM, and that we will delete all our copies of it as soon as we
+have found and fixed the bug or bugs in question; and secondly, we would
+prefer <em>not</em> to be mailed large chunks of code anyway. The smaller
+the file, the better. A three-line sample file that does nothing useful
+<em>except</em> demonstrate the problem is much easier to work with than a
+fully fledged ten-thousand-line program. (Of course, some errors
+<em>do</em> only crop up in large files, so this may not be possible.)
+<li>A description of what the problem actually <em>is</em>. `It doesn't
+work' is <em>not</em> a helpful description! Please describe exactly what
+is happening that shouldn't be, or what isn't happening that should.
+Examples might be: `NASM generates an error message saying Line 3 for an
+error that's actually on Line 5'; `NASM generates an error message that I
+believe it shouldn't be generating at all'; `NASM fails to generate an
+error message that I believe it <em>should</em> be generating'; `the object
+file produced from this source code crashes my linker'; `the ninth byte of
+the output file is 66 and I think it should be 77 instead'.
+<li>If you believe the output file from NASM to be faulty, send it to us.
+That allows us to determine whether our own copy of NASM generates the same
+file, or whether the problem is related to portability issues between our
+development platforms and yours. We can handle binary files mailed to us as
+MIME attachments, uuencoded, and even BinHex. Alternatively, we may be able
+to provide an FTP site you can upload the suspect files to; but mailing
+them is easier for us.
+<li>Any other information or data files that might be helpful. If, for
+example, the problem involves NASM failing to generate an object file while
+TASM can generate an equivalent file without trouble, then send us
+<em>both</em> object files, so we can see what TASM is doing differently
+from us.
+</ul>
+<p align=center><a href="nasmdoca.html">Next Chapter</a> |
+<a href="nasmdo11.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdoc0.html b/doc/html/nasmdoc0.html
new file mode 100644
index 0000000..2b51d51
--- /dev/null
+++ b/doc/html/nasmdoc0.html
@@ -0,0 +1,378 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p>This manual documents NASM, the Netwide Assembler: an assembler
+targetting the Intel x86 series of processors, with portable source.
+<p><p><a href="nasmdoc1.html">Chapter 1: Introduction</a><br>
+<a href="nasmdoc1.html#section-1.1">Section 1.1: What Is NASM?</a><br>
+<a href="nasmdoc1.html#section-1.1.1">Section 1.1.1: Why Yet Another Assembler?</a><br>
+<a href="nasmdoc1.html#section-1.1.2">Section 1.1.2: License Conditions</a><br>
+<a href="nasmdoc1.html#section-1.2">Section 1.2: Contact Information</a><br>
+<a href="nasmdoc1.html#section-1.3">Section 1.3: Installation</a><br>
+<a href="nasmdoc1.html#section-1.3.1">Section 1.3.1: Installing NASM under MS-DOS or Windows</a><br>
+<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2: Installing NASM under Unix</a><br>
+<p><a href="nasmdoc2.html">Chapter 2: Running NASM</a><br>
+<a href="nasmdoc2.html#section-2.1">Section 2.1: NASM Command-Line Syntax</a><br>
+<a href="nasmdoc2.html#section-2.1.1">Section 2.1.1: The <code><nobr>-o</nobr></code> Option: Specifying the Output File Name</a><br>
+<a href="nasmdoc2.html#section-2.1.2">Section 2.1.2: The <code><nobr>-f</nobr></code> Option: Specifying the Output File Format</a><br>
+<a href="nasmdoc2.html#section-2.1.3">Section 2.1.3: The <code><nobr>-l</nobr></code> Option: Generating a Listing File</a><br>
+<a href="nasmdoc2.html#section-2.1.4">Section 2.1.4: The <code><nobr>-M</nobr></code> Option: Generate Makefile Dependencies</a><br>
+<a href="nasmdoc2.html#section-2.1.5">Section 2.1.5: The <code><nobr>-MG</nobr></code> Option: Generate Makefile Dependencies</a><br>
+<a href="nasmdoc2.html#section-2.1.6">Section 2.1.6: The <code><nobr>-MF</nobr></code> Option: Set Makefile Dependency File</a><br>
+<a href="nasmdoc2.html#section-2.1.7">Section 2.1.7: The <code><nobr>-MD</nobr></code> Option: Assemble and Generate Dependencies</a><br>
+<a href="nasmdoc2.html#section-2.1.8">Section 2.1.8: The <code><nobr>-MT</nobr></code> Option: Dependency Target Name</a><br>
+<a href="nasmdoc2.html#section-2.1.9">Section 2.1.9: The <code><nobr>-MQ</nobr></code> Option: Dependency Target Name (Quoted)</a><br>
+<a href="nasmdoc2.html#section-2.1.10">Section 2.1.10: The <code><nobr>-MP</nobr></code> Option: Emit phony targets</a><br>
+<a href="nasmdoc2.html#section-2.1.11">Section 2.1.11: The <code><nobr>-F</nobr></code> Option: Selecting a Debug Information Format</a><br>
+<a href="nasmdoc2.html#section-2.1.12">Section 2.1.12: The <code><nobr>-g</nobr></code> Option: Enabling Debug Information.</a><br>
+<a href="nasmdoc2.html#section-2.1.13">Section 2.1.13: The <code><nobr>-X</nobr></code> Option: Selecting an Error Reporting Format</a><br>
+<a href="nasmdoc2.html#section-2.1.14">Section 2.1.14: The <code><nobr>-Z</nobr></code> Option: Send Errors to a File</a><br>
+<a href="nasmdoc2.html#section-2.1.15">Section 2.1.15: The <code><nobr>-s</nobr></code> Option: Send Errors to <code><nobr>stdout</nobr></code></a><br>
+<a href="nasmdoc2.html#section-2.1.16">Section 2.1.16: The <code><nobr>-i</nobr></code> Option: Include File Search Directories</a><br>
+<a href="nasmdoc2.html#section-2.1.17">Section 2.1.17: The <code><nobr>-p</nobr></code> Option: Pre-Include a File</a><br>
+<a href="nasmdoc2.html#section-2.1.18">Section 2.1.18: The <code><nobr>-d</nobr></code> Option: Pre-Define a Macro</a><br>
+<a href="nasmdoc2.html#section-2.1.19">Section 2.1.19: The <code><nobr>-u</nobr></code> Option: Undefine a Macro</a><br>
+<a href="nasmdoc2.html#section-2.1.20">Section 2.1.20: The <code><nobr>-E</nobr></code> Option: Preprocess Only</a><br>
+<a href="nasmdoc2.html#section-2.1.21">Section 2.1.21: The <code><nobr>-a</nobr></code> Option: Don't Preprocess At All</a><br>
+<a href="nasmdoc2.html#section-2.1.22">Section 2.1.22: The <code><nobr>-O</nobr></code> Option: Specifying Multipass Optimization</a><br>
+<a href="nasmdoc2.html#section-2.1.23">Section 2.1.23: The <code><nobr>-t</nobr></code> Option: Enable TASM Compatibility Mode</a><br>
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24: The <code><nobr>-w</nobr></code> and <code><nobr>-W</nobr></code> Options: Enable or Disable Assembly Warnings</a><br>
+<a href="nasmdoc2.html#section-2.1.25">Section 2.1.25: The <code><nobr>-v</nobr></code> Option: Display Version Info</a><br>
+<a href="nasmdoc2.html#section-2.1.26">Section 2.1.26: The <code><nobr>-y</nobr></code> Option: Display Available Debug Info Formats</a><br>
+<a href="nasmdoc2.html#section-2.1.27">Section 2.1.27: The <code><nobr>--prefix</nobr></code> and <code><nobr>--postfix</nobr></code> Options.</a><br>
+<a href="nasmdoc2.html#section-2.1.28">Section 2.1.28: The <code><nobr>NASMENV</nobr></code> Environment Variable</a><br>
+<a href="nasmdoc2.html#section-2.2">Section 2.2: Quick Start for MASM Users</a><br>
+<a href="nasmdoc2.html#section-2.2.1">Section 2.2.1: NASM Is Case-Sensitive</a><br>
+<a href="nasmdoc2.html#section-2.2.2">Section 2.2.2: NASM Requires Square Brackets For Memory References</a><br>
+<a href="nasmdoc2.html#section-2.2.3">Section 2.2.3: NASM Doesn't Store Variable Types</a><br>
+<a href="nasmdoc2.html#section-2.2.4">Section 2.2.4: NASM Doesn't <code><nobr>ASSUME</nobr></code></a><br>
+<a href="nasmdoc2.html#section-2.2.5">Section 2.2.5: NASM Doesn't Support Memory Models</a><br>
+<a href="nasmdoc2.html#section-2.2.6">Section 2.2.6: Floating-Point Differences</a><br>
+<a href="nasmdoc2.html#section-2.2.7">Section 2.2.7: Other Differences</a><br>
+<p><a href="nasmdoc3.html">Chapter 3: The NASM Language</a><br>
+<a href="nasmdoc3.html#section-3.1">Section 3.1: Layout of a NASM Source Line</a><br>
+<a href="nasmdoc3.html#section-3.2">Section 3.2: Pseudo-Instructions</a><br>
+<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1: <code><nobr>DB</nobr></code> and Friends: Declaring Initialized Data</a><br>
+<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2: <code><nobr>RESB</nobr></code> and Friends: Declaring Uninitialized Data</a><br>
+<a href="nasmdoc3.html#section-3.2.3">Section 3.2.3: <code><nobr>INCBIN</nobr></code>: Including External Binary Files</a><br>
+<a href="nasmdoc3.html#section-3.2.4">Section 3.2.4: <code><nobr>EQU</nobr></code>: Defining Constants</a><br>
+<a href="nasmdoc3.html#section-3.2.5">Section 3.2.5: <code><nobr>TIMES</nobr></code>: Repeating Instructions or Data</a><br>
+<a href="nasmdoc3.html#section-3.3">Section 3.3: Effective Addresses</a><br>
+<a href="nasmdoc3.html#section-3.4">Section 3.4: Constants</a><br>
+<a href="nasmdoc3.html#section-3.4.1">Section 3.4.1: Numeric Constants</a><br>
+<a href="nasmdoc3.html#section-3.4.2">Section 3.4.2: Character Strings</a><br>
+<a href="nasmdoc3.html#section-3.4.3">Section 3.4.3: Character Constants</a><br>
+<a href="nasmdoc3.html#section-3.4.4">Section 3.4.4: String Constants</a><br>
+<a href="nasmdoc3.html#section-3.4.5">Section 3.4.5: Unicode Strings</a><br>
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6: Floating-Point Constants</a><br>
+<a href="nasmdoc3.html#section-3.4.7">Section 3.4.7: Packed BCD Constants</a><br>
+<a href="nasmdoc3.html#section-3.5">Section 3.5: Expressions</a><br>
+<a href="nasmdoc3.html#section-3.5.1">Section 3.5.1: <code><nobr>|</nobr></code>: Bitwise OR Operator</a><br>
+<a href="nasmdoc3.html#section-3.5.2">Section 3.5.2: <code><nobr>^</nobr></code>: Bitwise XOR Operator</a><br>
+<a href="nasmdoc3.html#section-3.5.3">Section 3.5.3: <code><nobr>&amp;</nobr></code>: Bitwise AND Operator</a><br>
+<a href="nasmdoc3.html#section-3.5.4">Section 3.5.4: <code><nobr>&lt;&lt;</nobr></code> and <code><nobr>&gt;&gt;</nobr></code>: Bit Shift Operators</a><br>
+<a href="nasmdoc3.html#section-3.5.5">Section 3.5.5: <code><nobr>+</nobr></code> and <code><nobr>-</nobr></code>: Addition and Subtraction Operators</a><br>
+<a href="nasmdoc3.html#section-3.5.6">Section 3.5.6: <code><nobr>*</nobr></code>, <code><nobr>/</nobr></code>, <code><nobr>//</nobr></code>, <code><nobr>%</nobr></code> and <code><nobr>%%</nobr></code>: Multiplication and Division</a><br>
+<a href="nasmdoc3.html#section-3.5.7">Section 3.5.7: Unary Operators: <code><nobr>+</nobr></code>, <code><nobr>-</nobr></code>, <code><nobr>~</nobr></code>, <code><nobr>!</nobr></code> and <code><nobr>SEG</nobr></code></a><br>
+<a href="nasmdoc3.html#section-3.6">Section 3.6: <code><nobr>SEG</nobr></code> and <code><nobr>WRT</nobr></code></a><br>
+<a href="nasmdoc3.html#section-3.7">Section 3.7: <code><nobr>STRICT</nobr></code>: Inhibiting Optimization</a><br>
+<a href="nasmdoc3.html#section-3.8">Section 3.8: Critical Expressions</a><br>
+<a href="nasmdoc3.html#section-3.9">Section 3.9: Local Labels</a><br>
+<p><a href="nasmdoc4.html">Chapter 4: The NASM Preprocessor</a><br>
+<a href="nasmdoc4.html#section-4.1">Section 4.1: Single-Line Macros</a><br>
+<a href="nasmdoc4.html#section-4.1.1">Section 4.1.1: The Normal Way: <code><nobr>%define</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.1.2">Section 4.1.2: Resolving <code><nobr>%define</nobr></code>: <code><nobr>%xdefine</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.1.3">Section 4.1.3: Macro Indirection: <code><nobr>%[...]</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.1.4">Section 4.1.4: Concatenating Single Line Macro Tokens: <code><nobr>%+</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.1.5">Section 4.1.5: The Macro Name Itself: <code><nobr>%?</nobr></code> and <code><nobr>%??</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.1.6">Section 4.1.6: Undefining Single-Line Macros: <code><nobr>%undef</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.1.7">Section 4.1.7: Preprocessor Variables: <code><nobr>%assign</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.1.8">Section 4.1.8: Defining Strings: <code><nobr>%defstr</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.1.9">Section 4.1.9: Defining Tokens: <code><nobr>%deftok</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.2">Section 4.2: String Manipulation in Macros</a><br>
+<a href="nasmdoc4.html#section-4.2.1">Section 4.2.1: Concatenating Strings: <code><nobr>%strcat</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.2.2">Section 4.2.2: String Length: <code><nobr>%strlen</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.2.3">Section 4.2.3: Extracting Substrings: <code><nobr>%substr</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.3">Section 4.3: Multi-Line Macros: <code><nobr>%macro</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.3.1">Section 4.3.1: Recursive Multi-Line Macros: <code><nobr>%rmacro</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.3.2">Section 4.3.2: Overloading Multi-Line Macros</a><br>
+<a href="nasmdoc4.html#section-4.3.3">Section 4.3.3: Macro-Local Labels</a><br>
+<a href="nasmdoc4.html#section-4.3.4">Section 4.3.4: Greedy Macro Parameters</a><br>
+<a href="nasmdoc4.html#section-4.3.5">Section 4.3.5: Default Macro Parameters</a><br>
+<a href="nasmdoc4.html#section-4.3.6">Section 4.3.6: <code><nobr>%0</nobr></code>: Macro Parameter Counter</a><br>
+<a href="nasmdoc4.html#section-4.3.7">Section 4.3.7: <code><nobr>%rotate</nobr></code>: Rotating Macro Parameters</a><br>
+<a href="nasmdoc4.html#section-4.3.8">Section 4.3.8: Concatenating Macro Parameters</a><br>
+<a href="nasmdoc4.html#section-4.3.9">Section 4.3.9: Condition Codes as Macro Parameters</a><br>
+<a href="nasmdoc4.html#section-4.3.10">Section 4.3.10: Disabling Listing Expansion</a><br>
+<a href="nasmdoc4.html#section-4.3.11">Section 4.3.11: Undefining Multi-Line Macros: <code><nobr>%unmacro</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.3.12">Section 4.3.12: Exiting Multi-Line Macros: <code><nobr>%exitmacro</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.4">Section 4.4: Conditional Assembly</a><br>
+<a href="nasmdoc4.html#section-4.4.1">Section 4.4.1: <code><nobr>%ifdef</nobr></code>: Testing Single-Line Macro Existence</a><br>
+<a href="nasmdoc4.html#section-4.4.2">Section 4.4.2: <code><nobr>%ifmacro</nobr></code>: Testing Multi-Line Macro Existence</a><br>
+<a href="nasmdoc4.html#section-4.4.3">Section 4.4.3: <code><nobr>%ifctx</nobr></code>: Testing the Context Stack</a><br>
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4: <code><nobr>%if</nobr></code>: Testing Arbitrary Numeric Expressions</a><br>
+<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5: <code><nobr>%ifidn</nobr></code> and <code><nobr>%ifidni</nobr></code>: Testing Exact Text Identity</a><br>
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6: <code><nobr>%ifid</nobr></code>, <code><nobr>%ifnum</nobr></code>, <code><nobr>%ifstr</nobr></code>: Testing Token Types</a><br>
+<a href="nasmdoc4.html#section-4.4.7">Section 4.4.7: <code><nobr>%iftoken</nobr></code>: Test for a Single Token</a><br>
+<a href="nasmdoc4.html#section-4.4.8">Section 4.4.8: <code><nobr>%ifempty</nobr></code>: Test for Empty Expansion</a><br>
+<a href="nasmdoc4.html#section-4.5">Section 4.5: Preprocessor Loops: <code><nobr>%rep</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.6">Section 4.6: Source Files and Dependencies</a><br>
+<a href="nasmdoc4.html#section-4.6.1">Section 4.6.1: <code><nobr>%include</nobr></code>: Including Other Files</a><br>
+<a href="nasmdoc4.html#section-4.6.2">Section 4.6.2: <code><nobr>%pathsearch</nobr></code>: Search the Include Path</a><br>
+<a href="nasmdoc4.html#section-4.6.3">Section 4.6.3: <code><nobr>%depend</nobr></code>: Add Dependent Files</a><br>
+<a href="nasmdoc4.html#section-4.6.4">Section 4.6.4: <code><nobr>%use</nobr></code>: Include Standard Macro Package</a><br>
+<a href="nasmdoc4.html#section-4.7">Section 4.7: The Context Stack</a><br>
+<a href="nasmdoc4.html#section-4.7.1">Section 4.7.1: <code><nobr>%push</nobr></code> and <code><nobr>%pop</nobr></code>: Creating and Removing Contexts</a><br>
+<a href="nasmdoc4.html#section-4.7.2">Section 4.7.2: Context-Local Labels</a><br>
+<a href="nasmdoc4.html#section-4.7.3">Section 4.7.3: Context-Local Single-Line Macros</a><br>
+<a href="nasmdoc4.html#section-4.7.4">Section 4.7.4: <code><nobr>%repl</nobr></code>: Renaming a Context</a><br>
+<a href="nasmdoc4.html#section-4.7.5">Section 4.7.5: Example Use of the Context Stack: Block IFs</a><br>
+<a href="nasmdoc4.html#section-4.8">Section 4.8: Stack Relative Preprocessor Directives</a><br>
+<a href="nasmdoc4.html#section-4.8.1">Section 4.8.1: <code><nobr>%arg</nobr></code> Directive</a><br>
+<a href="nasmdoc4.html#section-4.8.2">Section 4.8.2: <code><nobr>%stacksize</nobr></code> Directive</a><br>
+<a href="nasmdoc4.html#section-4.8.3">Section 4.8.3: <code><nobr>%local</nobr></code> Directive</a><br>
+<a href="nasmdoc4.html#section-4.9">Section 4.9: Reporting User-Defined Errors: <code><nobr>%error</nobr></code>, <code><nobr>%warning</nobr></code>, <code><nobr>%fatal</nobr></code></a><br>
+<a href="nasmdoc4.html#section-4.10">Section 4.10: Other Preprocessor Directives</a><br>
+<a href="nasmdoc4.html#section-4.10.1">Section 4.10.1: <code><nobr>%line</nobr></code> Directive</a><br>
+<a href="nasmdoc4.html#section-4.10.2">Section 4.10.2: <code><nobr>%!</nobr></code><code><nobr>&lt;env&gt;</nobr></code>: Read an environment variable.</a><br>
+<a href="nasmdoc4.html#section-4.11">Section 4.11: Standard Macros</a><br>
+<a href="nasmdoc4.html#section-4.11.1">Section 4.11.1: NASM Version Macros</a><br>
+<a href="nasmdoc4.html#section-4.11.2">Section 4.11.2: <code><nobr>__NASM_VERSION_ID__</nobr></code>: NASM Version ID</a><br>
+<a href="nasmdoc4.html#section-4.11.3">Section 4.11.3: <code><nobr>__NASM_VER__</nobr></code>: NASM Version string</a><br>
+<a href="nasmdoc4.html#section-4.11.4">Section 4.11.4: <code><nobr>__FILE__</nobr></code> and <code><nobr>__LINE__</nobr></code>: File Name and Line Number</a><br>
+<a href="nasmdoc4.html#section-4.11.5">Section 4.11.5: <code><nobr>__BITS__</nobr></code>: Current BITS Mode</a><br>
+<a href="nasmdoc4.html#section-4.11.6">Section 4.11.6: <code><nobr>__OUTPUT_FORMAT__</nobr></code>: Current Output Format</a><br>
+<a href="nasmdoc4.html#section-4.11.7">Section 4.11.7: Assembly Date and Time Macros</a><br>
+<a href="nasmdoc4.html#section-4.11.8">Section 4.11.8: <code><nobr>__USE_</nobr></code><em>package</em><code><nobr>__</nobr></code>: Package Include Test</a><br>
+<a href="nasmdoc4.html#section-4.11.9">Section 4.11.9: <code><nobr>__PASS__</nobr></code>: Assembly Pass</a><br>
+<a href="nasmdoc4.html#section-4.11.10">Section 4.11.10: <code><nobr>STRUC</nobr></code> and <code><nobr>ENDSTRUC</nobr></code>: Declaring Structure Data Types</a><br>
+<a href="nasmdoc4.html#section-4.11.11">Section 4.11.11: <code><nobr>ISTRUC</nobr></code>, <code><nobr>AT</nobr></code> and <code><nobr>IEND</nobr></code>: Declaring Instances of Structures</a><br>
+<a href="nasmdoc4.html#section-4.11.12">Section 4.11.12: <code><nobr>ALIGN</nobr></code> and <code><nobr>ALIGNB</nobr></code>: Data Alignment</a><br>
+<p><a href="nasmdoc5.html">Chapter 5: Standard Macro Packages</a><br>
+<a href="nasmdoc5.html#section-5.1">Section 5.1: <code><nobr>altreg</nobr></code>: Alternate Register Names</a><br>
+<a href="nasmdoc5.html#section-5.2">Section 5.2: <code><nobr>smartalign</nobr></code>: Smart <code><nobr>ALIGN</nobr></code> Macro</a><br>
+<p><a href="nasmdoc6.html">Chapter 6: Assembler Directives</a><br>
+<a href="nasmdoc6.html#section-6.1">Section 6.1: <code><nobr>BITS</nobr></code>: Specifying Target Processor Mode</a><br>
+<a href="nasmdoc6.html#section-6.1.1">Section 6.1.1: <code><nobr>USE16</nobr></code> &amp; <code><nobr>USE32</nobr></code>: Aliases for BITS</a><br>
+<a href="nasmdoc6.html#section-6.2">Section 6.2: <code><nobr>DEFAULT</nobr></code>: Change the assembler defaults</a><br>
+<a href="nasmdoc6.html#section-6.3">Section 6.3: <code><nobr>SECTION</nobr></code> or <code><nobr>SEGMENT</nobr></code>: Changing and Defining Sections</a><br>
+<a href="nasmdoc6.html#section-6.3.1">Section 6.3.1: The <code><nobr>__SECT__</nobr></code> Macro</a><br>
+<a href="nasmdoc6.html#section-6.4">Section 6.4: <code><nobr>ABSOLUTE</nobr></code>: Defining Absolute Labels</a><br>
+<a href="nasmdoc6.html#section-6.5">Section 6.5: <code><nobr>EXTERN</nobr></code>: Importing Symbols from Other Modules</a><br>
+<a href="nasmdoc6.html#section-6.6">Section 6.6: <code><nobr>GLOBAL</nobr></code>: Exporting Symbols to Other Modules</a><br>
+<a href="nasmdoc6.html#section-6.7">Section 6.7: <code><nobr>COMMON</nobr></code>: Defining Common Data Areas</a><br>
+<a href="nasmdoc6.html#section-6.8">Section 6.8: <code><nobr>CPU</nobr></code>: Defining CPU Dependencies</a><br>
+<a href="nasmdoc6.html#section-6.9">Section 6.9: <code><nobr>FLOAT</nobr></code>: Handling of floating-point constants</a><br>
+<p><a href="nasmdoc7.html">Chapter 7: Output Formats</a><br>
+<a href="nasmdoc7.html#section-7.1">Section 7.1: <code><nobr>bin</nobr></code>: Flat-Form Binary Output</a><br>
+<a href="nasmdoc7.html#section-7.1.1">Section 7.1.1: <code><nobr>ORG</nobr></code>: Binary File Program Origin</a><br>
+<a href="nasmdoc7.html#section-7.1.2">Section 7.1.2: <code><nobr>bin</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a><br>
+<a href="nasmdoc7.html#section-7.1.3">Section 7.1.3: Multisection Support for the <code><nobr>bin</nobr></code> Format</a><br>
+<a href="nasmdoc7.html#section-7.1.4">Section 7.1.4: Map Files</a><br>
+<a href="nasmdoc7.html#section-7.2">Section 7.2: <code><nobr>ith</nobr></code>: Intel Hex Output</a><br>
+<a href="nasmdoc7.html#section-7.3">Section 7.3: <code><nobr>srec</nobr></code>: Motorola S-Records Output</a><br>
+<a href="nasmdoc7.html#section-7.4">Section 7.4: <code><nobr>obj</nobr></code>: Microsoft OMF Object Files</a><br>
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1: <code><nobr>obj</nobr></code> Extensions to the <code><nobr>SEGMENT</nobr></code> Directive</a><br>
+<a href="nasmdoc7.html#section-7.4.2">Section 7.4.2: <code><nobr>GROUP</nobr></code>: Defining Groups of Segments</a><br>
+<a href="nasmdoc7.html#section-7.4.3">Section 7.4.3: <code><nobr>UPPERCASE</nobr></code>: Disabling Case Sensitivity in Output</a><br>
+<a href="nasmdoc7.html#section-7.4.4">Section 7.4.4: <code><nobr>IMPORT</nobr></code>: Importing DLL Symbols</a><br>
+<a href="nasmdoc7.html#section-7.4.5">Section 7.4.5: <code><nobr>EXPORT</nobr></code>: Exporting DLL Symbols</a><br>
+<a href="nasmdoc7.html#section-7.4.6">Section 7.4.6: <code><nobr>..start</nobr></code>: Defining the Program Entry Point</a><br>
+<a href="nasmdoc7.html#section-7.4.7">Section 7.4.7: <code><nobr>obj</nobr></code> Extensions to the <code><nobr>EXTERN</nobr></code> Directive</a><br>
+<a href="nasmdoc7.html#section-7.4.8">Section 7.4.8: <code><nobr>obj</nobr></code> Extensions to the <code><nobr>COMMON</nobr></code> Directive</a><br>
+<a href="nasmdoc7.html#section-7.5">Section 7.5: <code><nobr>win32</nobr></code>: Microsoft Win32 Object Files</a><br>
+<a href="nasmdoc7.html#section-7.5.1">Section 7.5.1: <code><nobr>win32</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a><br>
+<a href="nasmdoc7.html#section-7.5.2">Section 7.5.2: <code><nobr>win32</nobr></code>: Safe Structured Exception Handling</a><br>
+<a href="nasmdoc7.html#section-7.6">Section 7.6: <code><nobr>win64</nobr></code>: Microsoft Win64 Object Files</a><br>
+<a href="nasmdoc7.html#section-7.6.1">Section 7.6.1: <code><nobr>win64</nobr></code>: Writing Position-Independent Code</a><br>
+<a href="nasmdoc7.html#section-7.6.2">Section 7.6.2: <code><nobr>win64</nobr></code>: Structured Exception Handling</a><br>
+<a href="nasmdoc7.html#section-7.7">Section 7.7: <code><nobr>coff</nobr></code>: Common Object File Format</a><br>
+<a href="nasmdoc7.html#section-7.8">Section 7.8: <code><nobr>macho32</nobr></code> and <code><nobr>macho64</nobr></code>: Mach Object File Format</a><br>
+<a href="nasmdoc7.html#section-7.9">Section 7.9: <code><nobr>elf32</nobr></code> and <code><nobr>elf64</nobr></code>: Executable and Linkable Format Object Files</a><br>
+<a href="nasmdoc7.html#section-7.9.1">Section 7.9.1: ELF specific directive <code><nobr>osabi</nobr></code></a><br>
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2: <code><nobr>elf</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a><br>
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3: Position-Independent Code: <code><nobr>elf</nobr></code> Special Symbols and <code><nobr>WRT</nobr></code></a><br>
+<a href="nasmdoc7.html#section-7.9.4">Section 7.9.4: Thread Local Storage: <code><nobr>elf</nobr></code> Special Symbols and <code><nobr>WRT</nobr></code></a><br>
+<a href="nasmdoc7.html#section-7.9.5">Section 7.9.5: <code><nobr>elf</nobr></code> Extensions to the <code><nobr>GLOBAL</nobr></code> Directive</a><br>
+<a href="nasmdoc7.html#section-7.9.6">Section 7.9.6: <code><nobr>elf</nobr></code> Extensions to the <code><nobr>COMMON</nobr></code> Directive </a><br>
+<a href="nasmdoc7.html#section-7.9.7">Section 7.9.7: 16-bit code and ELF </a><br>
+<a href="nasmdoc7.html#section-7.9.8">Section 7.9.8: Debug formats and ELF </a><br>
+<a href="nasmdoc7.html#section-7.10">Section 7.10: <code><nobr>aout</nobr></code>: Linux <code><nobr>a.out</nobr></code> Object Files</a><br>
+<a href="nasmdoc7.html#section-7.11">Section 7.11: <code><nobr>aoutb</nobr></code>: NetBSD/FreeBSD/OpenBSD <code><nobr>a.out</nobr></code> Object Files</a><br>
+<a href="nasmdoc7.html#section-7.12">Section 7.12: <code><nobr>as86</nobr></code>: Minix/Linux <code><nobr>as86</nobr></code> Object Files</a><br>
+<a href="nasmdoc7.html#section-7.13">Section 7.13: <code><nobr>rdf</nobr></code>: Relocatable Dynamic Object File Format</a><br>
+<a href="nasmdoc7.html#section-7.13.1">Section 7.13.1: Requiring a Library: The <code><nobr>LIBRARY</nobr></code> Directive</a><br>
+<a href="nasmdoc7.html#section-7.13.2">Section 7.13.2: Specifying a Module Name: The <code><nobr>MODULE</nobr></code> Directive</a><br>
+<a href="nasmdoc7.html#section-7.13.3">Section 7.13.3: <code><nobr>rdf</nobr></code> Extensions to the <code><nobr>GLOBAL</nobr></code> Directive</a><br>
+<a href="nasmdoc7.html#section-7.13.4">Section 7.13.4: <code><nobr>rdf</nobr></code> Extensions to the <code><nobr>EXTERN</nobr></code> Directive</a><br>
+<a href="nasmdoc7.html#section-7.14">Section 7.14: <code><nobr>dbg</nobr></code>: Debugging Format</a><br>
+<p><a href="nasmdoc8.html">Chapter 8: Writing 16-bit Code (DOS, Windows 3/3.1)</a><br>
+<a href="nasmdoc8.html#section-8.1">Section 8.1: Producing <code><nobr>.EXE</nobr></code> Files</a><br>
+<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1: Using the <code><nobr>obj</nobr></code> Format To Generate <code><nobr>.EXE</nobr></code> Files</a><br>
+<a href="nasmdoc8.html#section-8.1.2">Section 8.1.2: Using the <code><nobr>bin</nobr></code> Format To Generate <code><nobr>.EXE</nobr></code> Files</a><br>
+<a href="nasmdoc8.html#section-8.2">Section 8.2: Producing <code><nobr>.COM</nobr></code> Files</a><br>
+<a href="nasmdoc8.html#section-8.2.1">Section 8.2.1: Using the <code><nobr>bin</nobr></code> Format To Generate <code><nobr>.COM</nobr></code> Files</a><br>
+<a href="nasmdoc8.html#section-8.2.2">Section 8.2.2: Using the <code><nobr>obj</nobr></code> Format To Generate <code><nobr>.COM</nobr></code> Files</a><br>
+<a href="nasmdoc8.html#section-8.3">Section 8.3: Producing <code><nobr>.SYS</nobr></code> Files</a><br>
+<a href="nasmdoc8.html#section-8.4">Section 8.4: Interfacing to 16-bit C Programs</a><br>
+<a href="nasmdoc8.html#section-8.4.1">Section 8.4.1: External Symbol Names</a><br>
+<a href="nasmdoc8.html#section-8.4.2">Section 8.4.2: Memory Models</a><br>
+<a href="nasmdoc8.html#section-8.4.3">Section 8.4.3: Function Definitions and Function Calls</a><br>
+<a href="nasmdoc8.html#section-8.4.4">Section 8.4.4: Accessing Data Items</a><br>
+<a href="nasmdoc8.html#section-8.4.5">Section 8.4.5: <code><nobr>c16.mac</nobr></code>: Helper Macros for the 16-bit C Interface</a><br>
+<a href="nasmdoc8.html#section-8.5">Section 8.5: Interfacing to Borland Pascal Programs</a><br>
+<a href="nasmdoc8.html#section-8.5.1">Section 8.5.1: The Pascal Calling Convention</a><br>
+<a href="nasmdoc8.html#section-8.5.2">Section 8.5.2: Borland Pascal Segment Name Restrictions</a><br>
+<a href="nasmdoc8.html#section-8.5.3">Section 8.5.3: Using <code><nobr>c16.mac</nobr></code> With Pascal Programs</a><br>
+<p><a href="nasmdoc9.html">Chapter 9: Writing 32-bit Code (Unix, Win32, DJGPP)</a><br>
+<a href="nasmdoc9.html#section-9.1">Section 9.1: Interfacing to 32-bit C Programs</a><br>
+<a href="nasmdoc9.html#section-9.1.1">Section 9.1.1: External Symbol Names</a><br>
+<a href="nasmdoc9.html#section-9.1.2">Section 9.1.2: Function Definitions and Function Calls</a><br>
+<a href="nasmdoc9.html#section-9.1.3">Section 9.1.3: Accessing Data Items</a><br>
+<a href="nasmdoc9.html#section-9.1.4">Section 9.1.4: <code><nobr>c32.mac</nobr></code>: Helper Macros for the 32-bit C Interface</a><br>
+<a href="nasmdoc9.html#section-9.2">Section 9.2: Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries</a><br>
+<a href="nasmdoc9.html#section-9.2.1">Section 9.2.1: Obtaining the Address of the GOT</a><br>
+<a href="nasmdoc9.html#section-9.2.2">Section 9.2.2: Finding Your Local Data Items</a><br>
+<a href="nasmdoc9.html#section-9.2.3">Section 9.2.3: Finding External and Common Data Items</a><br>
+<a href="nasmdoc9.html#section-9.2.4">Section 9.2.4: Exporting Symbols to the Library User</a><br>
+<a href="nasmdoc9.html#section-9.2.5">Section 9.2.5: Calling Procedures Outside the Library</a><br>
+<a href="nasmdoc9.html#section-9.2.6">Section 9.2.6: Generating the Library File</a><br>
+<p><a href="nasmdo10.html">Chapter 10: Mixing 16 and 32 Bit Code</a><br>
+<a href="nasmdo10.html#section-10.1">Section 10.1: Mixed-Size Jumps</a><br>
+<a href="nasmdo10.html#section-10.2">Section 10.2: Addressing Between Different-Size Segments</a><br>
+<a href="nasmdo10.html#section-10.3">Section 10.3: Other Mixed-Size Instructions</a><br>
+<p><a href="nasmdo11.html">Chapter 11: Writing 64-bit Code (Unix, Win64)</a><br>
+<a href="nasmdo11.html#section-11.1">Section 11.1: Register Names in 64-bit Mode</a><br>
+<a href="nasmdo11.html#section-11.2">Section 11.2: Immediates and Displacements in 64-bit Mode</a><br>
+<a href="nasmdo11.html#section-11.3">Section 11.3: Interfacing to 64-bit C Programs (Unix)</a><br>
+<a href="nasmdo11.html#section-11.4">Section 11.4: Interfacing to 64-bit C Programs (Win64)</a><br>
+<p><a href="nasmdo12.html">Chapter 12: Troubleshooting</a><br>
+<a href="nasmdo12.html#section-12.1">Section 12.1: Common Problems</a><br>
+<a href="nasmdo12.html#section-12.1.1">Section 12.1.1: NASM Generates Inefficient Code</a><br>
+<a href="nasmdo12.html#section-12.1.2">Section 12.1.2: My Jumps are Out of Range</a><br>
+<a href="nasmdo12.html#section-12.1.3">Section 12.1.3: <code><nobr>ORG</nobr></code> Doesn't Work</a><br>
+<a href="nasmdo12.html#section-12.1.4">Section 12.1.4: <code><nobr>TIMES</nobr></code> Doesn't Work</a><br>
+<a href="nasmdo12.html#section-12.2">Section 12.2: Bugs</a><br>
+<p><a href="nasmdoca.html">Appendix A: Ndisasm</a><br>
+<a href="nasmdoca.html#section-A.1">Section A.1: Introduction</a><br>
+<a href="nasmdoca.html#section-A.2">Section A.2: Getting Started: Installation</a><br>
+<a href="nasmdoca.html#section-A.3">Section A.3: Running NDISASM</a><br>
+<a href="nasmdoca.html#section-A.3.1">Section A.3.1: COM Files: Specifying an Origin</a><br>
+<a href="nasmdoca.html#section-A.3.2">Section A.3.2: Code Following Data: Synchronisation</a><br>
+<a href="nasmdoca.html#section-A.3.3">Section A.3.3: Mixed Code and Data: Automatic (Intelligent) Synchronisation </a><br>
+<a href="nasmdoca.html#section-A.3.4">Section A.3.4: Other Options</a><br>
+<a href="nasmdoca.html#section-A.4">Section A.4: Bugs and Improvements</a><br>
+<p><a href="nasmdocb.html">Appendix B: Instruction List</a><br>
+<a href="nasmdocb.html#section-B.1">Section B.1: Introduction</a><br>
+<a href="nasmdocb.html#section-B.1.1">Section B.1.1: Special instructions...</a><br>
+<a href="nasmdocb.html#section-B.1.2">Section B.1.2: Conventional instructions</a><br>
+<a href="nasmdocb.html#section-B.1.3">Section B.1.3: Katmai Streaming SIMD instructions (SSE -- a.k.a. KNI, XMM, MMX2)</a><br>
+<a href="nasmdocb.html#section-B.1.4">Section B.1.4: Introduced in Deschutes but necessary for SSE support</a><br>
+<a href="nasmdocb.html#section-B.1.5">Section B.1.5: XSAVE group (AVX and extended state)</a><br>
+<a href="nasmdocb.html#section-B.1.6">Section B.1.6: Generic memory operations</a><br>
+<a href="nasmdocb.html#section-B.1.7">Section B.1.7: New MMX instructions introduced in Katmai</a><br>
+<a href="nasmdocb.html#section-B.1.8">Section B.1.8: AMD Enhanced 3DNow! (Athlon) instructions</a><br>
+<a href="nasmdocb.html#section-B.1.9">Section B.1.9: Willamette SSE2 Cacheability Instructions</a><br>
+<a href="nasmdocb.html#section-B.1.10">Section B.1.10: Willamette MMX instructions (SSE2 SIMD Integer Instructions)</a><br>
+<a href="nasmdocb.html#section-B.1.11">Section B.1.11: Willamette Streaming SIMD instructions (SSE2)</a><br>
+<a href="nasmdocb.html#section-B.1.12">Section B.1.12: Prescott New Instructions (SSE3)</a><br>
+<a href="nasmdocb.html#section-B.1.13">Section B.1.13: VMX Instructions</a><br>
+<a href="nasmdocb.html#section-B.1.14">Section B.1.14: Extended Page Tables VMX instructions</a><br>
+<a href="nasmdocb.html#section-B.1.15">Section B.1.15: Tejas New Instructions (SSSE3)</a><br>
+<a href="nasmdocb.html#section-B.1.16">Section B.1.16: AMD SSE4A</a><br>
+<a href="nasmdocb.html#section-B.1.17">Section B.1.17: New instructions in Barcelona</a><br>
+<a href="nasmdocb.html#section-B.1.18">Section B.1.18: Penryn New Instructions (SSE4.1)</a><br>
+<a href="nasmdocb.html#section-B.1.19">Section B.1.19: Nehalem New Instructions (SSE4.2)</a><br>
+<a href="nasmdocb.html#section-B.1.20">Section B.1.20: Intel SMX</a><br>
+<a href="nasmdocb.html#section-B.1.21">Section B.1.21: Geode (Cyrix) 3DNow! additions</a><br>
+<a href="nasmdocb.html#section-B.1.22">Section B.1.22: Intel new instructions in ???</a><br>
+<a href="nasmdocb.html#section-B.1.23">Section B.1.23: Intel AES instructions</a><br>
+<a href="nasmdocb.html#section-B.1.24">Section B.1.24: Intel AVX AES instructions</a><br>
+<a href="nasmdocb.html#section-B.1.25">Section B.1.25: Intel AVX instructions</a><br>
+<a href="nasmdocb.html#section-B.1.26">Section B.1.26: Intel Carry-Less Multiplication instructions (CLMUL)</a><br>
+<a href="nasmdocb.html#section-B.1.27">Section B.1.27: Intel AVX Carry-Less Multiplication instructions (CLMUL)</a><br>
+<a href="nasmdocb.html#section-B.1.28">Section B.1.28: Intel Fused Multiply-Add instructions (FMA)</a><br>
+<a href="nasmdocb.html#section-B.1.29">Section B.1.29: VIA (Centaur) security instructions</a><br>
+<a href="nasmdocb.html#section-B.1.30">Section B.1.30: AMD Lightweight Profiling (LWP) instructions</a><br>
+<a href="nasmdocb.html#section-B.1.31">Section B.1.31: AMD XOP, FMA4 and CVT16 instructions (SSE5)</a><br>
+<a href="nasmdocb.html#section-B.1.32">Section B.1.32: Systematic names for the hinting nop instructions</a><br>
+<p><a href="nasmdocc.html">Appendix C: NASM Version History</a><br>
+<a href="nasmdocc.html#section-C.1">Section C.1: NASM 2 Series</a><br>
+<a href="nasmdocc.html#section-C.1.1">Section C.1.1: Version 2.08</a><br>
+<a href="nasmdocc.html#section-C.1.2">Section C.1.2: Version 2.07</a><br>
+<a href="nasmdocc.html#section-C.1.3">Section C.1.3: Version 2.06</a><br>
+<a href="nasmdocc.html#section-C.1.4">Section C.1.4: Version 2.05.01</a><br>
+<a href="nasmdocc.html#section-C.1.5">Section C.1.5: Version 2.05</a><br>
+<a href="nasmdocc.html#section-C.1.6">Section C.1.6: Version 2.04</a><br>
+<a href="nasmdocc.html#section-C.1.7">Section C.1.7: Version 2.03.01</a><br>
+<a href="nasmdocc.html#section-C.1.8">Section C.1.8: Version 2.03</a><br>
+<a href="nasmdocc.html#section-C.1.9">Section C.1.9: Version 2.02</a><br>
+<a href="nasmdocc.html#section-C.1.10">Section C.1.10: Version 2.01</a><br>
+<a href="nasmdocc.html#section-C.1.11">Section C.1.11: Version 2.00</a><br>
+<a href="nasmdocc.html#section-C.2">Section C.2: NASM 0.98 Series</a><br>
+<a href="nasmdocc.html#section-C.2.1">Section C.2.1: Version 0.98.39</a><br>
+<a href="nasmdocc.html#section-C.2.2">Section C.2.2: Version 0.98.38</a><br>
+<a href="nasmdocc.html#section-C.2.3">Section C.2.3: Version 0.98.37</a><br>
+<a href="nasmdocc.html#section-C.2.4">Section C.2.4: Version 0.98.36</a><br>
+<a href="nasmdocc.html#section-C.2.5">Section C.2.5: Version 0.98.35</a><br>
+<a href="nasmdocc.html#section-C.2.6">Section C.2.6: Version 0.98.34</a><br>
+<a href="nasmdocc.html#section-C.2.7">Section C.2.7: Version 0.98.33</a><br>
+<a href="nasmdocc.html#section-C.2.8">Section C.2.8: Version 0.98.32</a><br>
+<a href="nasmdocc.html#section-C.2.9">Section C.2.9: Version 0.98.31</a><br>
+<a href="nasmdocc.html#section-C.2.10">Section C.2.10: Version 0.98.30</a><br>
+<a href="nasmdocc.html#section-C.2.11">Section C.2.11: Version 0.98.28</a><br>
+<a href="nasmdocc.html#section-C.2.12">Section C.2.12: Version 0.98.26</a><br>
+<a href="nasmdocc.html#section-C.2.13">Section C.2.13: Version 0.98.25alt</a><br>
+<a href="nasmdocc.html#section-C.2.14">Section C.2.14: Version 0.98.25</a><br>
+<a href="nasmdocc.html#section-C.2.15">Section C.2.15: Version 0.98.24p1</a><br>
+<a href="nasmdocc.html#section-C.2.16">Section C.2.16: Version 0.98.24</a><br>
+<a href="nasmdocc.html#section-C.2.17">Section C.2.17: Version 0.98.23</a><br>
+<a href="nasmdocc.html#section-C.2.18">Section C.2.18: Version 0.98.22</a><br>
+<a href="nasmdocc.html#section-C.2.19">Section C.2.19: Version 0.98.21</a><br>
+<a href="nasmdocc.html#section-C.2.20">Section C.2.20: Version 0.98.20</a><br>
+<a href="nasmdocc.html#section-C.2.21">Section C.2.21: Version 0.98.19</a><br>
+<a href="nasmdocc.html#section-C.2.22">Section C.2.22: Version 0.98.18</a><br>
+<a href="nasmdocc.html#section-C.2.23">Section C.2.23: Version 0.98.17</a><br>
+<a href="nasmdocc.html#section-C.2.24">Section C.2.24: Version 0.98.16</a><br>
+<a href="nasmdocc.html#section-C.2.25">Section C.2.25: Version 0.98.15</a><br>
+<a href="nasmdocc.html#section-C.2.26">Section C.2.26: Version 0.98.14</a><br>
+<a href="nasmdocc.html#section-C.2.27">Section C.2.27: Version 0.98.13</a><br>
+<a href="nasmdocc.html#section-C.2.28">Section C.2.28: Version 0.98.12</a><br>
+<a href="nasmdocc.html#section-C.2.29">Section C.2.29: Version 0.98.11</a><br>
+<a href="nasmdocc.html#section-C.2.30">Section C.2.30: Version 0.98.10</a><br>
+<a href="nasmdocc.html#section-C.2.31">Section C.2.31: Version 0.98.09</a><br>
+<a href="nasmdocc.html#section-C.2.32">Section C.2.32: Version 0.98.08</a><br>
+<a href="nasmdocc.html#section-C.2.33">Section C.2.33: Version 0.98.09b with John Coffman patches released 28-Oct-2001</a><br>
+<a href="nasmdocc.html#section-C.2.34">Section C.2.34: Version 0.98.07 released 01/28/01</a><br>
+<a href="nasmdocc.html#section-C.2.35">Section C.2.35: Version 0.98.06f released 01/18/01</a><br>
+<a href="nasmdocc.html#section-C.2.36">Section C.2.36: Version 0.98.06e released 01/09/01</a><br>
+<a href="nasmdocc.html#section-C.2.37">Section C.2.37: Version 0.98p1</a><br>
+<a href="nasmdocc.html#section-C.2.38">Section C.2.38: Version 0.98bf (bug-fixed)</a><br>
+<a href="nasmdocc.html#section-C.2.39">Section C.2.39: Version 0.98.03 with John Coffman's changes released 27-Jul-2000</a><br>
+<a href="nasmdocc.html#section-C.2.40">Section C.2.40: Version 0.98.03</a><br>
+<a href="nasmdocc.html#section-C.2.41">Section C.2.41: Version 0.98</a><br>
+<a href="nasmdocc.html#section-C.2.42">Section C.2.42: Version 0.98p9</a><br>
+<a href="nasmdocc.html#section-C.2.43">Section C.2.43: Version 0.98p8</a><br>
+<a href="nasmdocc.html#section-C.2.44">Section C.2.44: Version 0.98p7</a><br>
+<a href="nasmdocc.html#section-C.2.45">Section C.2.45: Version 0.98p6</a><br>
+<a href="nasmdocc.html#section-C.2.46">Section C.2.46: Version 0.98p3.7</a><br>
+<a href="nasmdocc.html#section-C.2.47">Section C.2.47: Version 0.98p3.6</a><br>
+<a href="nasmdocc.html#section-C.2.48">Section C.2.48: Version 0.98p3.5</a><br>
+<a href="nasmdocc.html#section-C.2.49">Section C.2.49: Version 0.98p3.4</a><br>
+<a href="nasmdocc.html#section-C.2.50">Section C.2.50: Version 0.98p3.3</a><br>
+<a href="nasmdocc.html#section-C.2.51">Section C.2.51: Version 0.98p3.2</a><br>
+<a href="nasmdocc.html#section-C.2.52">Section C.2.52: Version 0.98p3-hpa</a><br>
+<a href="nasmdocc.html#section-C.2.53">Section C.2.53: Version 0.98 pre-release 3</a><br>
+<a href="nasmdocc.html#section-C.2.54">Section C.2.54: Version 0.98 pre-release 2</a><br>
+<a href="nasmdocc.html#section-C.2.55">Section C.2.55: Version 0.98 pre-release 1</a><br>
+<a href="nasmdocc.html#section-C.3">Section C.3: NASM 0.9 Series</a><br>
+<a href="nasmdocc.html#section-C.3.1">Section C.3.1: Version 0.97 released December 1997</a><br>
+<a href="nasmdocc.html#section-C.3.2">Section C.3.2: Version 0.96 released November 1997</a><br>
+<a href="nasmdocc.html#section-C.3.3">Section C.3.3: Version 0.95 released July 1997</a><br>
+<a href="nasmdocc.html#section-C.3.4">Section C.3.4: Version 0.94 released April 1997</a><br>
+<a href="nasmdocc.html#section-C.3.5">Section C.3.5: Version 0.93 released January 1997</a><br>
+<a href="nasmdocc.html#section-C.3.6">Section C.3.6: Version 0.92 released January 1997</a><br>
+<a href="nasmdocc.html#section-C.3.7">Section C.3.7: Version 0.91 released November 1996</a><br>
+<a href="nasmdocc.html#section-C.3.8">Section C.3.8: Version 0.90 released October 1996</a><br>
+<p><a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdoc1.html b/doc/html/nasmdoc1.html
new file mode 100644
index 0000000..d370895
--- /dev/null
+++ b/doc/html/nasmdoc1.html
@@ -0,0 +1,159 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdoc2.html">Next Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="chapter-1">Chapter 1: Introduction</a></h2>
+<h3><a name="section-1.1">1.1 What Is NASM?</a></h3>
+<p>The Netwide Assembler, NASM, is an 80x86 and x86-64 assembler designed
+for portability and modularity. It supports a range of object file formats,
+including Linux and <code><nobr>*BSD</nobr></code>
+<code><nobr>a.out</nobr></code>, <code><nobr>ELF</nobr></code>,
+<code><nobr>COFF</nobr></code>, <code><nobr>Mach-O</nobr></code>, Microsoft
+16-bit <code><nobr>OBJ</nobr></code>, <code><nobr>Win32</nobr></code> and
+<code><nobr>Win64</nobr></code>. It will also output plain binary files.
+Its syntax is designed to be simple and easy to understand, similar to
+Intel's but less complex. It supports all currently known x86 architectural
+extensions, and has strong support for macros.
+<h4><a name="section-1.1.1">1.1.1 Why Yet Another Assembler?</a></h4>
+<p>The Netwide Assembler grew out of an idea on
+<code><nobr>comp.lang.asm.x86</nobr></code> (or possibly
+<code><nobr>alt.lang.asm</nobr></code> - I forget which), which was
+essentially that there didn't seem to be a good <em>free</em> x86-series
+assembler around, and that maybe someone ought to write one.
+<ul>
+<li><code><nobr>a86</nobr></code> is good, but not free, and in particular
+you don't get any 32-bit capability until you pay. It's DOS only, too.
+<li><code><nobr>gas</nobr></code> is free, and ports over to DOS and Unix,
+but it's not very good, since it's designed to be a back end to
+<code><nobr>gcc</nobr></code>, which always feeds it correct code. So its
+error checking is minimal. Also, its syntax is horrible, from the point of
+view of anyone trying to actually <em>write</em> anything in it. Plus you
+can't write 16-bit code in it (properly.)
+<li><code><nobr>as86</nobr></code> is specific to Minix and Linux, and (my
+version at least) doesn't seem to have much (or any) documentation.
+<li><code><nobr>MASM</nobr></code> isn't very good, and it's (was)
+expensive, and it runs only under DOS.
+<li><code><nobr>TASM</nobr></code> is better, but still strives for MASM
+compatibility, which means millions of directives and tons of red tape. And
+its syntax is essentially MASM's, with the contradictions and quirks that
+entails (although it sorts out some of those by means of Ideal mode.) It's
+expensive too. And it's DOS-only.
+</ul>
+<p>So here, for your coding pleasure, is NASM. At present it's still in
+prototype stage - we don't promise that it can outperform any of these
+assemblers. But please, <em>please</em> send us bug reports, fixes, helpful
+information, and anything else you can get your hands on (and thanks to the
+many people who've done this already! You all know who you are), and we'll
+improve it out of all recognition. Again.
+<h4><a name="section-1.1.2">1.1.2 License Conditions</a></h4>
+<p>Please see the file <code><nobr>LICENSE</nobr></code>, supplied as part
+of any NASM distribution archive, for the license conditions under which
+you may use NASM. NASM is now under the so-called 2-clause BSD license,
+also known as the simplified BSD license.
+<p>Copyright 1996-2009 the NASM Authors - All rights reserved.
+<p>Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+<ul>
+<li>Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+<li>Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+</ul>
+<p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+<h3><a name="section-1.2">1.2 Contact Information</a></h3>
+<p>The current version of NASM (since about 0.98.08) is maintained by a
+team of developers, accessible through the
+<code><nobr>nasm-devel</nobr></code> mailing list (see below for the link).
+If you want to report a bug, please read
+<a href="nasmdo12.html#section-12.2">section 12.2</a> first.
+<p>NASM has a website at
+<a href="http://www.nasm.us/"><code><nobr>http://www.nasm.us/</nobr></code></a>.
+If it's not there, google for us!
+<p>New releases, release candidates, and daily development snapshots of
+NASM are available from the official web site.
+<p>Announcements are posted to
+<a href="news:comp.lang.asm.x86"><code><nobr>comp.lang.asm.x86</nobr></code></a>,
+and to the web site
+<a href="http://www.freshmeat.net/"><code><nobr>http://www.freshmeat.net/</nobr></code></a>.
+<p>If you want information about the current development status, please
+subscribe to the <code><nobr>nasm-devel</nobr></code> email list; see link
+from the website.
+<h3><a name="section-1.3">1.3 Installation</a></h3>
+<h4><a name="section-1.3.1">1.3.1 Installing NASM under MS-DOS or Windows</a></h4>
+<p>Once you've obtained the appropriate archive for NASM,
+<code><nobr>nasm-XXX-dos.zip</nobr></code> or
+<code><nobr>nasm-XXX-win32.zip</nobr></code> (where
+<code><nobr>XXX</nobr></code> denotes the version number of NASM contained
+in the archive), unpack it into its own directory (for example
+<code><nobr>c:\nasm</nobr></code>).
+<p>The archive will contain a set of executable files: the NASM executable
+file <code><nobr>nasm.exe</nobr></code>, the NDISASM executable file
+<code><nobr>ndisasm.exe</nobr></code>, and possibly additional utilities to
+handle the RDOFF file format.
+<p>The only file NASM needs to run is its own executable, so copy
+<code><nobr>nasm.exe</nobr></code> to a directory on your PATH, or
+alternatively edit <code><nobr>autoexec.bat</nobr></code> to add the
+<code><nobr>nasm</nobr></code> directory to your
+<code><nobr>PATH</nobr></code> (to do that under Windows XP, go to Start
+&gt; Control Panel &gt; System &gt; Advanced &gt; Environment Variables;
+these instructions may work under other versions of Windows as well.)
+<p>That's it - NASM is installed. You don't need the nasm directory to be
+present to run NASM (unless you've added it to your
+<code><nobr>PATH</nobr></code>), so you can delete it if you need to save
+space; however, you may want to keep the documentation or test programs.
+<p>If you've downloaded the DOS source archive,
+<code><nobr>nasm-XXX.zip</nobr></code>, the <code><nobr>nasm</nobr></code>
+directory will also contain the full NASM source code, and a selection of
+Makefiles you can (hopefully) use to rebuild your copy of NASM from
+scratch. See the file <code><nobr>INSTALL</nobr></code> in the source
+archive.
+<p>Note that a number of files are generated from other files by Perl
+scripts. Although the NASM source distribution includes these generated
+files, you will need to rebuild them (and hence, will need a Perl
+interpreter) if you change insns.dat, standard.mac or the documentation. It
+is possible future source distributions may not include these files at all.
+Ports of Perl for a variety of platforms, including DOS and Windows, are
+available from <a href="http://www.cpan.org/ports/">www.cpan.org</a>.
+<h4><a name="section-1.3.2">1.3.2 Installing NASM under Unix</a></h4>
+<p>Once you've obtained the Unix source archive for NASM,
+<code><nobr>nasm-XXX.tar.gz</nobr></code> (where
+<code><nobr>XXX</nobr></code> denotes the version number of NASM contained
+in the archive), unpack it into a directory such as
+<code><nobr>/usr/local/src</nobr></code>. The archive, when unpacked, will
+create its own subdirectory <code><nobr>nasm-XXX</nobr></code>.
+<p>NASM is an auto-configuring package: once you've unpacked it,
+<code><nobr>cd</nobr></code> to the directory it's been unpacked into and
+type <code><nobr>./configure</nobr></code>. This shell script will find the
+best C compiler to use for building NASM and set up Makefiles accordingly.
+<p>Once NASM has auto-configured, you can type
+<code><nobr>make</nobr></code> to build the <code><nobr>nasm</nobr></code>
+and <code><nobr>ndisasm</nobr></code> binaries, and then
+<code><nobr>make install</nobr></code> to install them in
+<code><nobr>/usr/local/bin</nobr></code> and install the man pages
+<code><nobr>nasm.1</nobr></code> and <code><nobr>ndisasm.1</nobr></code> in
+<code><nobr>/usr/local/man/man1</nobr></code>. Alternatively, you can give
+options such as <code><nobr>--prefix</nobr></code> to the configure script
+(see the file <code><nobr>INSTALL</nobr></code> for more details), or
+install the programs yourself.
+<p>NASM also comes with a set of utilities for handling the
+<code><nobr>RDOFF</nobr></code> custom object-file format, which are in the
+<code><nobr>rdoff</nobr></code> subdirectory of the NASM archive. You can
+build these with <code><nobr>make rdf</nobr></code> and install them with
+<code><nobr>make rdf_install</nobr></code>, if you want them.
+<p align=center><a href="nasmdoc2.html">Next Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
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 &lt;format&gt; &lt;filename&gt; [-o &lt;output&gt;]
+</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 &gt; 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 &lt;format&gt; -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 &lt;option&gt; -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>
diff --git a/doc/html/nasmdoc3.html b/doc/html/nasmdoc3.html
new file mode 100644
index 0000000..b70e438
--- /dev/null
+++ b/doc/html/nasmdoc3.html
@@ -0,0 +1,753 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdoc4.html">Next Chapter</a> |
+<a href="nasmdoc2.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="chapter-3">Chapter 3: The NASM Language</a></h2>
+<h3><a name="section-3.1">3.1 Layout of a NASM Source Line</a></h3>
+<p>Like most assemblers, each NASM source line contains (unless it is a
+macro, a preprocessor directive or an assembler directive: see
+<a href="nasmdoc4.html">chapter 4</a> and <a href="nasmdoc6.html">chapter
+6</a>) some combination of the four fields
+<p><pre>
+label: instruction operands ; comment
+</pre>
+<p>As usual, most of these fields are optional; the presence or absence of
+any combination of a label, an instruction and a comment is allowed. Of
+course, the operand field is either required or forbidden by the presence
+and nature of the instruction field.
+<p>NASM uses backslash (\) as the line continuation character; if a line
+ends with backslash, the next line is considered to be a part of the
+backslash-ended line.
+<p>NASM places no restrictions on white space within a line: labels may
+have white space before them, or instructions may have no space before
+them, or anything. The colon after a label is also optional. (Note that
+this means that if you intend to code <code><nobr>lodsb</nobr></code> alone
+on a line, and type <code><nobr>lodab</nobr></code> by accident, then
+that's still a valid source line which does nothing but define a label.
+Running NASM with the command-line option
+<code><nobr>-w+orphan-labels</nobr></code> will cause it to warn you if you
+define a label alone on a line without a trailing colon.)
+<p>Valid characters in labels are letters, numbers,
+<code><nobr>_</nobr></code>, <code><nobr>$</nobr></code>,
+<code><nobr>#</nobr></code>, <code><nobr>@</nobr></code>,
+<code><nobr>~</nobr></code>, <code><nobr>.</nobr></code>, and
+<code><nobr>?</nobr></code>. The only characters which may be used as the
+<em>first</em> character of an identifier are letters,
+<code><nobr>.</nobr></code> (with special meaning: see
+<a href="#section-3.9">section 3.9</a>), <code><nobr>_</nobr></code> and
+<code><nobr>?</nobr></code>. An identifier may also be prefixed with a
+<code><nobr>$</nobr></code> to indicate that it is intended to be read as
+an identifier and not a reserved word; thus, if some other module you are
+linking with defines a symbol called <code><nobr>eax</nobr></code>, you can
+refer to <code><nobr>$eax</nobr></code> in NASM code to distinguish the
+symbol from the register. Maximum length of an identifier is 4095
+characters.
+<p>The instruction field may contain any machine instruction: Pentium and
+P6 instructions, FPU instructions, MMX instructions and even undocumented
+instructions are all supported. The instruction may be prefixed by
+<code><nobr>LOCK</nobr></code>, <code><nobr>REP</nobr></code>,
+<code><nobr>REPE</nobr></code>/<code><nobr>REPZ</nobr></code> or
+<code><nobr>REPNE</nobr></code>/<code><nobr>REPNZ</nobr></code>, in the
+usual way. Explicit address-size and operand-size prefixes
+<code><nobr>A16</nobr></code>, <code><nobr>A32</nobr></code>,
+<code><nobr>A64</nobr></code>, <code><nobr>O16</nobr></code> and
+<code><nobr>O32</nobr></code>, <code><nobr>O64</nobr></code> are provided -
+one example of their use is given in <a href="nasmdo10.html">chapter
+10</a>. You can also use the name of a segment register as an instruction
+prefix: coding <code><nobr>es mov [bx],ax</nobr></code> is equivalent to
+coding <code><nobr>mov [es:bx],ax</nobr></code>. We recommend the latter
+syntax, since it is consistent with other syntactic features of the
+language, but for instructions such as <code><nobr>LODSB</nobr></code>,
+which has no operands and yet can require a segment override, there is no
+clean syntactic way to proceed apart from
+<code><nobr>es lodsb</nobr></code>.
+<p>An instruction is not required to use a prefix: prefixes such as
+<code><nobr>CS</nobr></code>, <code><nobr>A32</nobr></code>,
+<code><nobr>LOCK</nobr></code> or <code><nobr>REPE</nobr></code> can appear
+on a line by themselves, and NASM will just generate the prefix bytes.
+<p>In addition to actual machine instructions, NASM also supports a number
+of pseudo-instructions, described in <a href="#section-3.2">section
+3.2</a>.
+<p>Instruction operands may take a number of forms: they can be registers,
+described simply by the register name (e.g. <code><nobr>ax</nobr></code>,
+<code><nobr>bp</nobr></code>, <code><nobr>ebx</nobr></code>,
+<code><nobr>cr0</nobr></code>: NASM does not use the
+<code><nobr>gas</nobr></code>-style syntax in which register names must be
+prefixed by a <code><nobr>%</nobr></code> sign), or they can be effective
+addresses (see <a href="#section-3.3">section 3.3</a>), constants
+(<a href="#section-3.4">section 3.4</a>) or expressions
+(<a href="#section-3.5">section 3.5</a>).
+<p>For x87 floating-point instructions, NASM accepts a wide range of
+syntaxes: you can use two-operand forms like MASM supports, or you can use
+NASM's native single-operand forms in most cases. For example, you can
+code:
+<p><pre>
+ fadd st1 ; this sets st0 := st0 + st1
+ fadd st0,st1 ; so does this
+
+ fadd st1,st0 ; this sets st1 := st1 + st0
+ fadd to st1 ; so does this
+</pre>
+<p>Almost any x87 floating-point instruction that references memory must
+use one of the prefixes <code><nobr>DWORD</nobr></code>,
+<code><nobr>QWORD</nobr></code> or <code><nobr>TWORD</nobr></code> to
+indicate what size of memory operand it refers to.
+<h3><a name="section-3.2">3.2 Pseudo-Instructions</a></h3>
+<p>Pseudo-instructions are things which, though not real x86 machine
+instructions, are used in the instruction field anyway because that's the
+most convenient place to put them. The current pseudo-instructions are
+<code><nobr>DB</nobr></code>, <code><nobr>DW</nobr></code>,
+<code><nobr>DD</nobr></code>, <code><nobr>DQ</nobr></code>,
+<code><nobr>DT</nobr></code>, <code><nobr>DO</nobr></code> and
+<code><nobr>DY</nobr></code>; their uninitialized counterparts
+<code><nobr>RESB</nobr></code>, <code><nobr>RESW</nobr></code>,
+<code><nobr>RESD</nobr></code>, <code><nobr>RESQ</nobr></code>,
+<code><nobr>REST</nobr></code>, <code><nobr>RESO</nobr></code> and
+<code><nobr>RESY</nobr></code>; the <code><nobr>INCBIN</nobr></code>
+command, the <code><nobr>EQU</nobr></code> command, and the
+<code><nobr>TIMES</nobr></code> prefix.
+<h4><a name="section-3.2.1">3.2.1 <code><nobr>DB</nobr></code> and Friends: Declaring Initialized Data</a></h4>
+<p><code><nobr>DB</nobr></code>, <code><nobr>DW</nobr></code>,
+<code><nobr>DD</nobr></code>, <code><nobr>DQ</nobr></code>,
+<code><nobr>DT</nobr></code>, <code><nobr>DO</nobr></code> and
+<code><nobr>DY</nobr></code> are used, much as in MASM, to declare
+initialized data in the output file. They can be invoked in a wide range of
+ways:
+<p><pre>
+ db 0x55 ; just the byte 0x55
+ db 0x55,0x56,0x57 ; three bytes in succession
+ db 'a',0x55 ; character constants are OK
+ db 'hello',13,10,'$' ; so are string constants
+ dw 0x1234 ; 0x34 0x12
+ dw 'a' ; 0x61 0x00 (it's just a number)
+ dw 'ab' ; 0x61 0x62 (character constant)
+ dw 'abc' ; 0x61 0x62 0x63 0x00 (string)
+ dd 0x12345678 ; 0x78 0x56 0x34 0x12
+ dd 1.234567e20 ; floating-point constant
+ dq 0x123456789abcdef0 ; eight byte constant
+ dq 1.234567e20 ; double-precision float
+ dt 1.234567e20 ; extended-precision float
+</pre>
+<p><code><nobr>DT</nobr></code>, <code><nobr>DO</nobr></code> and
+<code><nobr>DY</nobr></code> do not accept numeric constants as operands.
+<h4><a name="section-3.2.2">3.2.2 <code><nobr>RESB</nobr></code> and Friends: Declaring Uninitialized Data</a></h4>
+<p><code><nobr>RESB</nobr></code>, <code><nobr>RESW</nobr></code>,
+<code><nobr>RESD</nobr></code>, <code><nobr>RESQ</nobr></code>,
+<code><nobr>REST</nobr></code>, <code><nobr>RESO</nobr></code> and
+<code><nobr>RESY</nobr></code> are designed to be used in the BSS section
+of a module: they declare <em>uninitialized</em> storage space. Each takes
+a single operand, which is the number of bytes, words, doublewords or
+whatever to reserve. As stated in
+<a href="nasmdoc2.html#section-2.2.7">section 2.2.7</a>, NASM does not
+support the MASM/TASM syntax of reserving uninitialized space by writing
+<code><nobr>DW ?</nobr></code> or similar things: this is what it does
+instead. The operand to a <code><nobr>RESB</nobr></code>-type
+pseudo-instruction is a <em>critical expression</em>: see
+<a href="#section-3.8">section 3.8</a>.
+<p>For example:
+<p><pre>
+buffer: resb 64 ; reserve 64 bytes
+wordvar: resw 1 ; reserve a word
+realarray resq 10 ; array of ten reals
+ymmval: resy 1 ; one YMM register
+</pre>
+<h4><a name="section-3.2.3">3.2.3 <code><nobr>INCBIN</nobr></code>: Including External Binary Files</a></h4>
+<p><code><nobr>INCBIN</nobr></code> is borrowed from the old Amiga
+assembler DevPac: it includes a binary file verbatim into the output file.
+This can be handy for (for example) including graphics and sound data
+directly into a game executable file. It can be called in one of these
+three ways:
+<p><pre>
+ incbin "file.dat" ; include the whole file
+ incbin "file.dat",1024 ; skip the first 1024 bytes
+ incbin "file.dat",1024,512 ; skip the first 1024, and
+ ; actually include at most 512
+</pre>
+<p><code><nobr>INCBIN</nobr></code> is both a directive and a standard
+macro; the standard macro version searches for the file in the include file
+search path and adds the file to the dependency lists. This macro can be
+overridden if desired.
+<h4><a name="section-3.2.4">3.2.4 <code><nobr>EQU</nobr></code>: Defining Constants</a></h4>
+<p><code><nobr>EQU</nobr></code> defines a symbol to a given constant
+value: when <code><nobr>EQU</nobr></code> is used, the source line must
+contain a label. The action of <code><nobr>EQU</nobr></code> is to define
+the given label name to the value of its (only) operand. This definition is
+absolute, and cannot change later. So, for example,
+<p><pre>
+message db 'hello, world'
+msglen equ $-message
+</pre>
+<p>defines <code><nobr>msglen</nobr></code> to be the constant 12.
+<code><nobr>msglen</nobr></code> may not then be redefined later. This is
+not a preprocessor definition either: the value of
+<code><nobr>msglen</nobr></code> is evaluated <em>once</em>, using the
+value of <code><nobr>$</nobr></code> (see <a href="#section-3.5">section
+3.5</a> for an explanation of <code><nobr>$</nobr></code>) at the point of
+definition, rather than being evaluated wherever it is referenced and using
+the value of <code><nobr>$</nobr></code> at the point of reference.
+<h4><a name="section-3.2.5">3.2.5 <code><nobr>TIMES</nobr></code>: Repeating Instructions or Data</a></h4>
+<p>The <code><nobr>TIMES</nobr></code> prefix causes the instruction to be
+assembled multiple times. This is partly present as NASM's equivalent of
+the <code><nobr>DUP</nobr></code> syntax supported by MASM-compatible
+assemblers, in that you can code
+<p><pre>
+zerobuf: times 64 db 0
+</pre>
+<p>or similar things; but <code><nobr>TIMES</nobr></code> is more versatile
+than that. The argument to <code><nobr>TIMES</nobr></code> is not just a
+numeric constant, but a numeric <em>expression</em>, so you can do things
+like
+<p><pre>
+buffer: db 'hello, world'
+ times 64-$+buffer db ' '
+</pre>
+<p>which will store exactly enough spaces to make the total length of
+<code><nobr>buffer</nobr></code> up to 64. Finally,
+<code><nobr>TIMES</nobr></code> can be applied to ordinary instructions, so
+you can code trivial unrolled loops in it:
+<p><pre>
+ times 100 movsb
+</pre>
+<p>Note that there is no effective difference between
+<code><nobr>times 100 resb 1</nobr></code> and
+<code><nobr>resb 100</nobr></code>, except that the latter will be
+assembled about 100 times faster due to the internal structure of the
+assembler.
+<p>The operand to <code><nobr>TIMES</nobr></code> is a critical expression
+(<a href="#section-3.8">section 3.8</a>).
+<p>Note also that <code><nobr>TIMES</nobr></code> can't be applied to
+macros: the reason for this is that <code><nobr>TIMES</nobr></code> is
+processed after the macro phase, which allows the argument to
+<code><nobr>TIMES</nobr></code> to contain expressions such as
+<code><nobr>64-$+buffer</nobr></code> as above. To repeat more than one
+line of code, or a complex macro, use the preprocessor
+<code><nobr>%rep</nobr></code> directive.
+<h3><a name="section-3.3">3.3 Effective Addresses</a></h3>
+<p>An effective address is any operand to an instruction which references
+memory. Effective addresses, in NASM, have a very simple syntax: they
+consist of an expression evaluating to the desired address, enclosed in
+square brackets. For example:
+<p><pre>
+wordvar dw 123
+ mov ax,[wordvar]
+ mov ax,[wordvar+1]
+ mov ax,[es:wordvar+bx]
+</pre>
+<p>Anything not conforming to this simple system is not a valid memory
+reference in NASM, for example <code><nobr>es:wordvar[bx]</nobr></code>.
+<p>More complicated effective addresses, such as those involving more than
+one register, work in exactly the same way:
+<p><pre>
+ mov eax,[ebx*2+ecx+offset]
+ mov ax,[bp+di+8]
+</pre>
+<p>NASM is capable of doing algebra on these effective addresses, so that
+things which don't necessarily <em>look</em> legal are perfectly all right:
+<p><pre>
+ mov eax,[ebx*5] ; assembles as [ebx*4+ebx]
+ mov eax,[label1*2-label2] ; ie [label1+(label1-label2)]
+</pre>
+<p>Some forms of effective address have more than one assembled form; in
+most such cases NASM will generate the smallest form it can. For example,
+there are distinct assembled forms for the 32-bit effective addresses
+<code><nobr>[eax*2+0]</nobr></code> and
+<code><nobr>[eax+eax]</nobr></code>, and NASM will generally generate the
+latter on the grounds that the former requires four bytes to store a zero
+offset.
+<p>NASM has a hinting mechanism which will cause
+<code><nobr>[eax+ebx]</nobr></code> and <code><nobr>[ebx+eax]</nobr></code>
+to generate different opcodes; this is occasionally useful because
+<code><nobr>[esi+ebp]</nobr></code> and <code><nobr>[ebp+esi]</nobr></code>
+have different default segment registers.
+<p>However, you can force NASM to generate an effective address in a
+particular form by the use of the keywords <code><nobr>BYTE</nobr></code>,
+<code><nobr>WORD</nobr></code>, <code><nobr>DWORD</nobr></code> and
+<code><nobr>NOSPLIT</nobr></code>. If you need
+<code><nobr>[eax+3]</nobr></code> to be assembled using a double-word
+offset field instead of the one byte NASM will normally generate, you can
+code <code><nobr>[dword eax+3]</nobr></code>. Similarly, you can force NASM
+to use a byte offset for a small value which it hasn't seen on the first
+pass (see <a href="#section-3.8">section 3.8</a> for an example of such a
+code fragment) by using <code><nobr>[byte eax+offset]</nobr></code>. As
+special cases, <code><nobr>[byte eax]</nobr></code> will code
+<code><nobr>[eax+0]</nobr></code> with a byte offset of zero, and
+<code><nobr>[dword eax]</nobr></code> will code it with a double-word
+offset of zero. The normal form, <code><nobr>[eax]</nobr></code>, will be
+coded with no offset field.
+<p>The form described in the previous paragraph is also useful if you are
+trying to access data in a 32-bit segment from within 16 bit code. For more
+information on this see the section on mixed-size addressing
+(<a href="nasmdo10.html#section-10.2">section 10.2</a>). In particular, if
+you need to access data with a known offset that is larger than will fit in
+a 16-bit value, if you don't specify that it is a dword offset, nasm will
+cause the high word of the offset to be lost.
+<p>Similarly, NASM will split <code><nobr>[eax*2]</nobr></code> into
+<code><nobr>[eax+eax]</nobr></code> because that allows the offset field to
+be absent and space to be saved; in fact, it will also split
+<code><nobr>[eax*2+offset]</nobr></code> into
+<code><nobr>[eax+eax+offset]</nobr></code>. You can combat this behaviour
+by the use of the <code><nobr>NOSPLIT</nobr></code> keyword:
+<code><nobr>[nosplit eax*2]</nobr></code> will force
+<code><nobr>[eax*2+0]</nobr></code> to be generated literally.
+<p>In 64-bit mode, NASM will by default generate absolute addresses. The
+<code><nobr>REL</nobr></code> keyword makes it produce
+<code><nobr>RIP</nobr></code>-relative addresses. Since this is frequently
+the normally desired behaviour, see the <code><nobr>DEFAULT</nobr></code>
+directive (<a href="nasmdoc6.html#section-6.2">section 6.2</a>). The
+keyword <code><nobr>ABS</nobr></code> overrides
+<code><nobr>REL</nobr></code>.
+<h3><a name="section-3.4">3.4 Constants</a></h3>
+<p>NASM understands four different types of constant: numeric, character,
+string and floating-point.
+<h4><a name="section-3.4.1">3.4.1 Numeric Constants</a></h4>
+<p>A numeric constant is simply a number. NASM allows you to specify
+numbers in a variety of number bases, in a variety of ways: you can suffix
+<code><nobr>H</nobr></code> or <code><nobr>X</nobr></code>,
+<code><nobr>Q</nobr></code> or <code><nobr>O</nobr></code>, and
+<code><nobr>B</nobr></code> for hexadecimal, octal and binary respectively,
+or you can prefix <code><nobr>0x</nobr></code> for hexadecimal in the style
+of C, or you can prefix <code><nobr>$</nobr></code> for hexadecimal in the
+style of Borland Pascal. Note, though, that the <code><nobr>$</nobr></code>
+prefix does double duty as a prefix on identifiers (see
+<a href="#section-3.1">section 3.1</a>), so a hex number prefixed with a
+<code><nobr>$</nobr></code> sign must have a digit after the
+<code><nobr>$</nobr></code> rather than a letter. In addition, current
+versions of NASM accept the prefix <code><nobr>0h</nobr></code> for
+hexadecimal, <code><nobr>0o</nobr></code> or <code><nobr>0q</nobr></code>
+for octal, and <code><nobr>0b</nobr></code> for binary. Please note that
+unlike C, a <code><nobr>0</nobr></code> prefix by itself does <em>not</em>
+imply an octal constant!
+<p>Numeric constants can have underscores (<code><nobr>_</nobr></code>)
+interspersed to break up long strings.
+<p>Some examples (all producing exactly the same code):
+<p><pre>
+ mov ax,200 ; decimal
+ mov ax,0200 ; still decimal
+ mov ax,0200d ; explicitly decimal
+ mov ax,0d200 ; also decimal
+ mov ax,0c8h ; hex
+ mov ax,$0c8 ; hex again: the 0 is required
+ mov ax,0xc8 ; hex yet again
+ mov ax,0hc8 ; still hex
+ mov ax,310q ; octal
+ mov ax,310o ; octal again
+ mov ax,0o310 ; octal yet again
+ mov ax,0q310 ; hex yet again
+ mov ax,11001000b ; binary
+ mov ax,1100_1000b ; same binary constant
+ mov ax,0b1100_1000 ; same binary constant yet again
+</pre>
+<h4><a name="section-3.4.2">3.4.2 Character Strings</a></h4>
+<p>A character string consists of up to eight characters enclosed in either
+single quotes (<code><nobr>'...'</nobr></code>), double quotes
+(<code><nobr>"..."</nobr></code>) or backquotes
+(<code><nobr>`...`</nobr></code>). Single or double quotes are equivalent
+to NASM (except of course that surrounding the constant with single quotes
+allows double quotes to appear within it and vice versa); the contents of
+those are represented verbatim. Strings enclosed in backquotes support
+C-style <code><nobr>\</nobr></code>-escapes for special characters.
+<p>The following escape sequences are recognized by backquoted strings:
+<p><pre>
+ \' single quote (')
+ \" double quote (")
+ \` backquote (`)
+ \\ backslash (\)
+ \? question mark (?)
+ \a BEL (ASCII 7)
+ \b BS (ASCII 8)
+ \t TAB (ASCII 9)
+ \n LF (ASCII 10)
+ \v VT (ASCII 11)
+ \f FF (ASCII 12)
+ \r CR (ASCII 13)
+ \e ESC (ASCII 27)
+ \377 Up to 3 octal digits - literal byte
+ \xFF Up to 2 hexadecimal digits - literal byte
+ \u1234 4 hexadecimal digits - Unicode character
+ \U12345678 8 hexadecimal digits - Unicode character
+</pre>
+<p>All other escape sequences are reserved. Note that
+<code><nobr>\0</nobr></code>, meaning a <code><nobr>NUL</nobr></code>
+character (ASCII 0), is a special case of the octal escape sequence.
+<p>Unicode characters specified with <code><nobr>\u</nobr></code> or
+<code><nobr>\U</nobr></code> are converted to UTF-8. For example, the
+following lines are all equivalent:
+<p><pre>
+ db `\u263a` ; UTF-8 smiley face
+ db `\xe2\x98\xba` ; UTF-8 smiley face
+ db 0E2h, 098h, 0BAh ; UTF-8 smiley face
+</pre>
+<h4><a name="section-3.4.3">3.4.3 Character Constants</a></h4>
+<p>A character constant consists of a string up to eight bytes long, used
+in an expression context. It is treated as if it was an integer.
+<p>A character constant with more than one byte will be arranged with
+little-endian order in mind: if you code
+<p><pre>
+ mov eax,'abcd'
+</pre>
+<p>then the constant generated is not <code><nobr>0x61626364</nobr></code>,
+but <code><nobr>0x64636261</nobr></code>, so that if you were then to store
+the value into memory, it would read <code><nobr>abcd</nobr></code> rather
+than <code><nobr>dcba</nobr></code>. This is also the sense of character
+constants understood by the Pentium's <code><nobr>CPUID</nobr></code>
+instruction.
+<h4><a name="section-3.4.4">3.4.4 String Constants</a></h4>
+<p>String constants are character strings used in the context of some
+pseudo-instructions, namely the <code><nobr>DB</nobr></code> family and
+<code><nobr>INCBIN</nobr></code> (where it represents a filename.) They are
+also used in certain preprocessor directives.
+<p>A string constant looks like a character constant, only longer. It is
+treated as a concatenation of maximum-size character constants for the
+conditions. So the following are equivalent:
+<p><pre>
+ db 'hello' ; string constant
+ db 'h','e','l','l','o' ; equivalent character constants
+</pre>
+<p>And the following are also equivalent:
+<p><pre>
+ dd 'ninechars' ; doubleword string constant
+ dd 'nine','char','s' ; becomes three doublewords
+ db 'ninechars',0,0,0 ; and really looks like this
+</pre>
+<p>Note that when used in a string-supporting context, quoted strings are
+treated as a string constants even if they are short enough to be a
+character constant, because otherwise <code><nobr>db 'ab'</nobr></code>
+would have the same effect as <code><nobr>db 'a'</nobr></code>, which would
+be silly. Similarly, three-character or four-character constants are
+treated as strings when they are operands to <code><nobr>DW</nobr></code>,
+and so forth.
+<h4><a name="section-3.4.5">3.4.5 Unicode Strings</a></h4>
+<p>The special operators <code><nobr>__utf16__</nobr></code> and
+<code><nobr>__utf32__</nobr></code> allows definition of Unicode strings.
+They take a string in UTF-8 format and converts it to (littleendian) UTF-16
+or UTF-32, respectively.
+<p>For example:
+<p><pre>
+%define u(x) __utf16__(x)
+%define w(x) __utf32__(x)
+
+ dw u('C:\WINDOWS'), 0 ; Pathname in UTF-16
+ dd w(`A + B = \u206a`), 0 ; String in UTF-32
+</pre>
+<p><code><nobr>__utf16__</nobr></code> and
+<code><nobr>__utf32__</nobr></code> can be applied either to strings passed
+to the <code><nobr>DB</nobr></code> family instructions, or to character
+constants in an expression context.
+<h4><a name="section-3.4.6">3.4.6 Floating-Point Constants</a></h4>
+<p>Floating-point constants are acceptable only as arguments to
+<code><nobr>DB</nobr></code>, <code><nobr>DW</nobr></code>,
+<code><nobr>DD</nobr></code>, <code><nobr>DQ</nobr></code>,
+<code><nobr>DT</nobr></code>, and <code><nobr>DO</nobr></code>, or as
+arguments to the special operators <code><nobr>__float8__</nobr></code>,
+<code><nobr>__float16__</nobr></code>,
+<code><nobr>__float32__</nobr></code>,
+<code><nobr>__float64__</nobr></code>,
+<code><nobr>__float80m__</nobr></code>,
+<code><nobr>__float80e__</nobr></code>,
+<code><nobr>__float128l__</nobr></code>, and
+<code><nobr>__float128h__</nobr></code>.
+<p>Floating-point constants are expressed in the traditional form: digits,
+then a period, then optionally more digits, then optionally an
+<code><nobr>E</nobr></code> followed by an exponent. The period is
+mandatory, so that NASM can distinguish between
+<code><nobr>dd 1</nobr></code>, which declares an integer constant, and
+<code><nobr>dd 1.0</nobr></code> which declares a floating-point constant.
+NASM also support C99-style hexadecimal floating-point:
+<code><nobr>0x</nobr></code>, hexadecimal digits, period, optionally more
+hexadeximal digits, then optionally a <code><nobr>P</nobr></code> followed
+by a <em>binary</em> (not hexadecimal) exponent in decimal notation.
+<p>Underscores to break up groups of digits are permitted in floating-point
+constants as well.
+<p>Some examples:
+<p><pre>
+ db -0.2 ; "Quarter precision"
+ dw -0.5 ; IEEE 754r/SSE5 half precision
+ dd 1.2 ; an easy one
+ dd 1.222_222_222 ; underscores are permitted
+ dd 0x1p+2 ; 1.0x2^2 = 4.0
+ dq 0x1p+32 ; 1.0x2^32 = 4 294 967 296.0
+ dq 1.e10 ; 10 000 000 000.0
+ dq 1.e+10 ; synonymous with 1.e10
+ dq 1.e-10 ; 0.000 000 000 1
+ dt 3.141592653589793238462 ; pi
+ do 1.e+4000 ; IEEE 754r quad precision
+</pre>
+<p>The 8-bit "quarter-precision" floating-point format is
+sign:exponent:mantissa = 1:4:3 with an exponent bias of 7. This appears to
+be the most frequently used 8-bit floating-point format, although it is not
+covered by any formal standard. This is sometimes called a "minifloat."
+<p>The special operators are used to produce floating-point numbers in
+other contexts. They produce the binary representation of a specific
+floating-point number as an integer, and can use anywhere integer constants
+are used in an expression. <code><nobr>__float80m__</nobr></code> and
+<code><nobr>__float80e__</nobr></code> produce the 64-bit mantissa and
+16-bit exponent of an 80-bit floating-point number, and
+<code><nobr>__float128l__</nobr></code> and
+<code><nobr>__float128h__</nobr></code> produce the lower and upper 64-bit
+halves of a 128-bit floating-point number, respectively.
+<p>For example:
+<p><pre>
+ mov rax,__float64__(3.141592653589793238462)
+</pre>
+<p>... would assign the binary representation of pi as a 64-bit floating
+point number into <code><nobr>RAX</nobr></code>. This is exactly equivalent
+to:
+<p><pre>
+ mov rax,0x400921fb54442d18
+</pre>
+<p>NASM cannot do compile-time arithmetic on floating-point constants. This
+is because NASM is designed to be portable - although it always generates
+code to run on x86 processors, the assembler itself can run on any system
+with an ANSI C compiler. Therefore, the assembler cannot guarantee the
+presence of a floating-point unit capable of handling the Intel number
+formats, and so for NASM to be able to do floating arithmetic it would have
+to include its own complete set of floating-point routines, which would
+significantly increase the size of the assembler for very little benefit.
+<p>The special tokens <code><nobr>__Infinity__</nobr></code>,
+<code><nobr>__QNaN__</nobr></code> (or <code><nobr>__NaN__</nobr></code>)
+and <code><nobr>__SNaN__</nobr></code> can be used to generate infinities,
+quiet NaNs, and signalling NaNs, respectively. These are normally used as
+macros:
+<p><pre>
+%define Inf __Infinity__
+%define NaN __QNaN__
+
+ dq +1.5, -Inf, NaN ; Double-precision constants
+</pre>
+<h4><a name="section-3.4.7">3.4.7 Packed BCD Constants</a></h4>
+<p>x87-style packed BCD constants can be used in the same contexts as
+80-bit floating-point numbers. They are suffixed with
+<code><nobr>p</nobr></code> or prefixed with <code><nobr>0p</nobr></code>,
+and can include up to 18 decimal digits.
+<p>As with other numeric constants, underscores can be used to separate
+digits.
+<p>For example:
+<p><pre>
+ dt 12_345_678_901_245_678p
+ dt -12_345_678_901_245_678p
+ dt +0p33
+ dt 33p
+</pre>
+<h3><a name="section-3.5">3.5 Expressions</a></h3>
+<p>Expressions in NASM are similar in syntax to those in C. Expressions are
+evaluated as 64-bit integers which are then adjusted to the appropriate
+size.
+<p>NASM supports two special tokens in expressions, allowing calculations
+to involve the current assembly position: the <code><nobr>$</nobr></code>
+and <code><nobr>$$</nobr></code> tokens. <code><nobr>$</nobr></code>
+evaluates to the assembly position at the beginning of the line containing
+the expression; so you can code an infinite loop using
+<code><nobr>JMP $</nobr></code>. <code><nobr>$$</nobr></code> evaluates to
+the beginning of the current section; so you can tell how far into the
+section you are by using <code><nobr>($-$$)</nobr></code>.
+<p>The arithmetic operators provided by NASM are listed here, in increasing
+order of precedence.
+<h4><a name="section-3.5.1">3.5.1 <code><nobr>|</nobr></code>: Bitwise OR Operator</a></h4>
+<p>The <code><nobr>|</nobr></code> operator gives a bitwise OR, exactly as
+performed by the <code><nobr>OR</nobr></code> machine instruction. Bitwise
+OR is the lowest-priority arithmetic operator supported by NASM.
+<h4><a name="section-3.5.2">3.5.2 <code><nobr>^</nobr></code>: Bitwise XOR Operator</a></h4>
+<p><code><nobr>^</nobr></code> provides the bitwise XOR operation.
+<h4><a name="section-3.5.3">3.5.3 <code><nobr>&amp;</nobr></code>: Bitwise AND Operator</a></h4>
+<p><code><nobr>&amp;</nobr></code> provides the bitwise AND operation.
+<h4><a name="section-3.5.4">3.5.4 <code><nobr>&lt;&lt;</nobr></code> and <code><nobr>&gt;&gt;</nobr></code>: Bit Shift Operators</a></h4>
+<p><code><nobr>&lt;&lt;</nobr></code> gives a bit-shift to the left, just
+as it does in C. So <code><nobr>5&lt;&lt;3</nobr></code> evaluates to 5
+times 8, or 40. <code><nobr>&gt;&gt;</nobr></code> gives a bit-shift to the
+right; in NASM, such a shift is <em>always</em> unsigned, so that the bits
+shifted in from the left-hand end are filled with zero rather than a
+sign-extension of the previous highest bit.
+<h4><a name="section-3.5.5">3.5.5 <code><nobr>+</nobr></code> and <code><nobr>-</nobr></code>: Addition and Subtraction Operators</a></h4>
+<p>The <code><nobr>+</nobr></code> and <code><nobr>-</nobr></code>
+operators do perfectly ordinary addition and subtraction.
+<h4><a name="section-3.5.6">3.5.6 <code><nobr>*</nobr></code>, <code><nobr>/</nobr></code>, <code><nobr>//</nobr></code>, <code><nobr>%</nobr></code> and <code><nobr>%%</nobr></code>: Multiplication and Division</a></h4>
+<p><code><nobr>*</nobr></code> is the multiplication operator.
+<code><nobr>/</nobr></code> and <code><nobr>//</nobr></code> are both
+division operators: <code><nobr>/</nobr></code> is unsigned division and
+<code><nobr>//</nobr></code> is signed division. Similarly,
+<code><nobr>%</nobr></code> and <code><nobr>%%</nobr></code> provide
+unsigned and signed modulo operators respectively.
+<p>NASM, like ANSI C, provides no guarantees about the sensible operation
+of the signed modulo operator.
+<p>Since the <code><nobr>%</nobr></code> character is used extensively by
+the macro preprocessor, you should ensure that both the signed and unsigned
+modulo operators are followed by white space wherever they appear.
+<h4><a name="section-3.5.7">3.5.7 Unary Operators: <code><nobr>+</nobr></code>, <code><nobr>-</nobr></code>, <code><nobr>~</nobr></code>, <code><nobr>!</nobr></code> and <code><nobr>SEG</nobr></code></a></h4>
+<p>The highest-priority operators in NASM's expression grammar are those
+which only apply to one argument. <code><nobr>-</nobr></code> negates its
+operand, <code><nobr>+</nobr></code> does nothing (it's provided for
+symmetry with <code><nobr>-</nobr></code>), <code><nobr>~</nobr></code>
+computes the one's complement of its operand, <code><nobr>!</nobr></code>
+is the logical negation operator, and <code><nobr>SEG</nobr></code>
+provides the segment address of its operand (explained in more detail in
+<a href="#section-3.6">section 3.6</a>).
+<h3><a name="section-3.6">3.6 <code><nobr>SEG</nobr></code> and <code><nobr>WRT</nobr></code></a></h3>
+<p>When writing large 16-bit programs, which must be split into multiple
+segments, it is often necessary to be able to refer to the segment part of
+the address of a symbol. NASM supports the <code><nobr>SEG</nobr></code>
+operator to perform this function.
+<p>The <code><nobr>SEG</nobr></code> operator returns the
+<em>preferred</em> segment base of a symbol, defined as the segment base
+relative to which the offset of the symbol makes sense. So the code
+<p><pre>
+ mov ax,seg symbol
+ mov es,ax
+ mov bx,symbol
+</pre>
+<p>will load <code><nobr>ES:BX</nobr></code> with a valid pointer to the
+symbol <code><nobr>symbol</nobr></code>.
+<p>Things can be more complex than this: since 16-bit segments and groups
+may overlap, you might occasionally want to refer to some symbol using a
+different segment base from the preferred one. NASM lets you do this, by
+the use of the <code><nobr>WRT</nobr></code> (With Reference To) keyword.
+So you can do things like
+<p><pre>
+ mov ax,weird_seg ; weird_seg is a segment base
+ mov es,ax
+ mov bx,symbol wrt weird_seg
+</pre>
+<p>to load <code><nobr>ES:BX</nobr></code> with a different, but
+functionally equivalent, pointer to the symbol
+<code><nobr>symbol</nobr></code>.
+<p>NASM supports far (inter-segment) calls and jumps by means of the syntax
+<code><nobr>call segment:offset</nobr></code>, where
+<code><nobr>segment</nobr></code> and <code><nobr>offset</nobr></code> both
+represent immediate values. So to call a far procedure, you could code
+either of
+<p><pre>
+ call (seg procedure):procedure
+ call weird_seg:(procedure wrt weird_seg)
+</pre>
+<p>(The parentheses are included for clarity, to show the intended parsing
+of the above instructions. They are not necessary in practice.)
+<p>NASM supports the syntax <code><nobr>call far procedure</nobr></code> as
+a synonym for the first of the above usages. <code><nobr>JMP</nobr></code>
+works identically to <code><nobr>CALL</nobr></code> in these examples.
+<p>To declare a far pointer to a data item in a data segment, you must code
+<p><pre>
+ dw symbol, seg symbol
+</pre>
+<p>NASM supports no convenient synonym for this, though you can always
+invent one using the macro processor.
+<h3><a name="section-3.7">3.7 <code><nobr>STRICT</nobr></code>: Inhibiting Optimization</a></h3>
+<p>When assembling with the optimizer set to level 2 or higher (see
+<a href="nasmdoc2.html#section-2.1.22">section 2.1.22</a>), NASM will use
+size specifiers (<code><nobr>BYTE</nobr></code>,
+<code><nobr>WORD</nobr></code>, <code><nobr>DWORD</nobr></code>,
+<code><nobr>QWORD</nobr></code>, <code><nobr>TWORD</nobr></code>,
+<code><nobr>OWORD</nobr></code> or <code><nobr>YWORD</nobr></code>), but
+will give them the smallest possible size. The keyword
+<code><nobr>STRICT</nobr></code> can be used to inhibit optimization and
+force a particular operand to be emitted in the specified size. For
+example, with the optimizer on, and in <code><nobr>BITS 16</nobr></code>
+mode,
+<p><pre>
+ push dword 33
+</pre>
+<p>is encoded in three bytes <code><nobr>66 6A 21</nobr></code>, whereas
+<p><pre>
+ push strict dword 33
+</pre>
+<p>is encoded in six bytes, with a full dword immediate operand
+<code><nobr>66 68 21 00 00 00</nobr></code>.
+<p>With the optimizer off, the same code (six bytes) is generated whether
+the <code><nobr>STRICT</nobr></code> keyword was used or not.
+<h3><a name="section-3.8">3.8 Critical Expressions</a></h3>
+<p>Although NASM has an optional multi-pass optimizer, there are some
+expressions which must be resolvable on the first pass. These are called
+<em>Critical Expressions</em>.
+<p>The first pass is used to determine the size of all the assembled code
+and data, so that the second pass, when generating all the code, knows all
+the symbol addresses the code refers to. So one thing NASM can't handle is
+code whose size depends on the value of a symbol declared after the code in
+question. For example,
+<p><pre>
+ times (label-$) db 0
+label: db 'Where am I?'
+</pre>
+<p>The argument to <code><nobr>TIMES</nobr></code> in this case could
+equally legally evaluate to anything at all; NASM will reject this example
+because it cannot tell the size of the <code><nobr>TIMES</nobr></code> line
+when it first sees it. It will just as firmly reject the slightly
+paradoxical code
+<p><pre>
+ times (label-$+1) db 0
+label: db 'NOW where am I?'
+</pre>
+<p>in which <em>any</em> value for the <code><nobr>TIMES</nobr></code>
+argument is by definition wrong!
+<p>NASM rejects these examples by means of a concept called a <em>critical
+expression</em>, which is defined to be an expression whose value is
+required to be computable in the first pass, and which must therefore
+depend only on symbols defined before it. The argument to the
+<code><nobr>TIMES</nobr></code> prefix is a critical expression.
+<h3><a name="section-3.9">3.9 Local Labels</a></h3>
+<p>NASM gives special treatment to symbols beginning with a period. A label
+beginning with a single period is treated as a <em>local</em> label, which
+means that it is associated with the previous non-local label. So, for
+example:
+<p><pre>
+label1 ; some code
+
+.loop
+ ; some more code
+
+ jne .loop
+ ret
+
+label2 ; some code
+
+.loop
+ ; some more code
+
+ jne .loop
+ ret
+</pre>
+<p>In the above code fragment, each <code><nobr>JNE</nobr></code>
+instruction jumps to the line immediately before it, because the two
+definitions of <code><nobr>.loop</nobr></code> are kept separate by virtue
+of each being associated with the previous non-local label.
+<p>This form of local label handling is borrowed from the old Amiga
+assembler DevPac; however, NASM goes one step further, in allowing access
+to local labels from other parts of the code. This is achieved by means of
+<em>defining</em> a local label in terms of the previous non-local label:
+the first definition of <code><nobr>.loop</nobr></code> above is really
+defining a symbol called <code><nobr>label1.loop</nobr></code>, and the
+second defines a symbol called <code><nobr>label2.loop</nobr></code>. So,
+if you really needed to, you could write
+<p><pre>
+label3 ; some more code
+ ; and some more
+
+ jmp label1.loop
+</pre>
+<p>Sometimes it is useful - in a macro, for instance - to be able to define
+a label which can be referenced from anywhere but which doesn't interfere
+with the normal local-label mechanism. Such a label can't be non-local
+because it would interfere with subsequent definitions of, and references
+to, local labels; and it can't be local because the macro that defined it
+wouldn't know the label's full name. NASM therefore introduces a third type
+of label, which is probably only useful in macro definitions: if a label
+begins with the special prefix <code><nobr>..@</nobr></code>, then it does
+nothing to the local label mechanism. So you could code
+<p><pre>
+label1: ; a non-local label
+.local: ; this is really label1.local
+..@foo: ; this is a special symbol
+label2: ; another non-local label
+.local: ; this is really label2.local
+
+ jmp ..@foo ; this will jump three lines up
+</pre>
+<p>NASM has the capacity to define other special symbols beginning with a
+double period: for example, <code><nobr>..start</nobr></code> is used to
+specify the entry point in the <code><nobr>obj</nobr></code> output format
+(see <a href="nasmdoc7.html#section-7.4.6">section 7.4.6</a>).
+<p align=center><a href="nasmdoc4.html">Next Chapter</a> |
+<a href="nasmdoc2.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdoc4.html b/doc/html/nasmdoc4.html
new file mode 100644
index 0000000..8c71881
--- /dev/null
+++ b/doc/html/nasmdoc4.html
@@ -0,0 +1,1970 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdoc5.html">Next Chapter</a> |
+<a href="nasmdoc3.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="chapter-4">Chapter 4: The NASM Preprocessor</a></h2>
+<p>NASM contains a powerful macro processor, which supports conditional
+assembly, multi-level file inclusion, two forms of macro (single-line and
+multi-line), and a `context stack' mechanism for extra macro power.
+Preprocessor directives all begin with a <code><nobr>%</nobr></code> sign.
+<p>The preprocessor collapses all lines which end with a backslash (\)
+character into a single line. Thus:
+<p><pre>
+%define THIS_VERY_LONG_MACRO_NAME_IS_DEFINED_TO \
+ THIS_VALUE
+</pre>
+<p>will work like a single-line macro without the backslash-newline
+sequence.
+<h3><a name="section-4.1">4.1 Single-Line Macros</a></h3>
+<h4><a name="section-4.1.1">4.1.1 The Normal Way: <code><nobr>%define</nobr></code></a></h4>
+<p>Single-line macros are defined using the
+<code><nobr>%define</nobr></code> preprocessor directive. The definitions
+work in a similar way to C; so you can do things like
+<p><pre>
+%define ctrl 0x1F &amp;
+%define param(a,b) ((a)+(a)*(b))
+
+ mov byte [param(2,ebx)], ctrl 'D'
+</pre>
+<p>which will expand to
+<p><pre>
+ mov byte [(2)+(2)*(ebx)], 0x1F &amp; 'D'
+</pre>
+<p>When the expansion of a single-line macro contains tokens which invoke
+another macro, the expansion is performed at invocation time, not at
+definition time. Thus the code
+<p><pre>
+%define a(x) 1+b(x)
+%define b(x) 2*x
+
+ mov ax,a(8)
+</pre>
+<p>will evaluate in the expected way to
+<code><nobr>mov ax,1+2*8</nobr></code>, even though the macro
+<code><nobr>b</nobr></code> wasn't defined at the time of definition of
+<code><nobr>a</nobr></code>.
+<p>Macros defined with <code><nobr>%define</nobr></code> are case
+sensitive: after <code><nobr>%define foo bar</nobr></code>, only
+<code><nobr>foo</nobr></code> will expand to <code><nobr>bar</nobr></code>:
+<code><nobr>Foo</nobr></code> or <code><nobr>FOO</nobr></code> will not. By
+using <code><nobr>%idefine</nobr></code> instead of
+<code><nobr>%define</nobr></code> (the `i' stands for `insensitive') you
+can define all the case variants of a macro at once, so that
+<code><nobr>%idefine foo bar</nobr></code> would cause
+<code><nobr>foo</nobr></code>, <code><nobr>Foo</nobr></code>,
+<code><nobr>FOO</nobr></code>, <code><nobr>fOO</nobr></code> and so on all
+to expand to <code><nobr>bar</nobr></code>.
+<p>There is a mechanism which detects when a macro call has occurred as a
+result of a previous expansion of the same macro, to guard against circular
+references and infinite loops. If this happens, the preprocessor will only
+expand the first occurrence of the macro. Hence, if you code
+<p><pre>
+%define a(x) 1+a(x)
+
+ mov ax,a(3)
+</pre>
+<p>the macro <code><nobr>a(3)</nobr></code> will expand once, becoming
+<code><nobr>1+a(3)</nobr></code>, and will then expand no further. This
+behaviour can be useful: see <a href="nasmdoc9.html#section-9.1">section
+9.1</a> for an example of its use.
+<p>You can overload single-line macros: if you write
+<p><pre>
+%define foo(x) 1+x
+%define foo(x,y) 1+x*y
+</pre>
+<p>the preprocessor will be able to handle both types of macro call, by
+counting the parameters you pass; so <code><nobr>foo(3)</nobr></code> will
+become <code><nobr>1+3</nobr></code> whereas
+<code><nobr>foo(ebx,2)</nobr></code> will become
+<code><nobr>1+ebx*2</nobr></code>. However, if you define
+<p><pre>
+%define foo bar
+</pre>
+<p>then no other definition of <code><nobr>foo</nobr></code> will be
+accepted: a macro with no parameters prohibits the definition of the same
+name as a macro <em>with</em> parameters, and vice versa.
+<p>This doesn't prevent single-line macros being <em>redefined</em>: you
+can perfectly well define a macro with
+<p><pre>
+%define foo bar
+</pre>
+<p>and then re-define it later in the same source file with
+<p><pre>
+%define foo baz
+</pre>
+<p>Then everywhere the macro <code><nobr>foo</nobr></code> is invoked, it
+will be expanded according to the most recent definition. This is
+particularly useful when defining single-line macros with
+<code><nobr>%assign</nobr></code> (see <a href="#section-4.1.7">section
+4.1.7</a>).
+<p>You can pre-define single-line macros using the `-d' option on the NASM
+command line: see <a href="nasmdoc2.html#section-2.1.18">section
+2.1.18</a>.
+<h4><a name="section-4.1.2">4.1.2 Resolving <code><nobr>%define</nobr></code>: <code><nobr>%xdefine</nobr></code></a></h4>
+<p>To have a reference to an embedded single-line macro resolved at the
+time that the embedding macro is <em>defined</em>, as opposed to when the
+embedding macro is <em>expanded</em>, you need a different mechanism to the
+one offered by <code><nobr>%define</nobr></code>. The solution is to use
+<code><nobr>%xdefine</nobr></code>, or it's case-insensitive counterpart
+<code><nobr>%ixdefine</nobr></code>.
+<p>Suppose you have the following code:
+<p><pre>
+%define isTrue 1
+%define isFalse isTrue
+%define isTrue 0
+
+val1: db isFalse
+
+%define isTrue 1
+
+val2: db isFalse
+</pre>
+<p>In this case, <code><nobr>val1</nobr></code> is equal to 0, and
+<code><nobr>val2</nobr></code> is equal to 1. This is because, when a
+single-line macro is defined using <code><nobr>%define</nobr></code>, it is
+expanded only when it is called. As <code><nobr>isFalse</nobr></code>
+expands to <code><nobr>isTrue</nobr></code>, the expansion will be the
+current value of <code><nobr>isTrue</nobr></code>. The first time it is
+called that is 0, and the second time it is 1.
+<p>If you wanted <code><nobr>isFalse</nobr></code> to expand to the value
+assigned to the embedded macro <code><nobr>isTrue</nobr></code> at the time
+that <code><nobr>isFalse</nobr></code> was defined, you need to change the
+above code to use <code><nobr>%xdefine</nobr></code>.
+<p><pre>
+%xdefine isTrue 1
+%xdefine isFalse isTrue
+%xdefine isTrue 0
+
+val1: db isFalse
+
+%xdefine isTrue 1
+
+val2: db isFalse
+</pre>
+<p>Now, each time that <code><nobr>isFalse</nobr></code> is called, it
+expands to 1, as that is what the embedded macro
+<code><nobr>isTrue</nobr></code> expanded to at the time that
+<code><nobr>isFalse</nobr></code> was defined.
+<h4><a name="section-4.1.3">4.1.3 Macro Indirection: <code><nobr>%[...]</nobr></code></a></h4>
+<p>The <code><nobr>%[...]</nobr></code> construct can be used to expand
+macros in contexts where macro expansion would otherwise not occur,
+including in the names other macros. For example, if you have a set of
+macros named <code><nobr>Foo16</nobr></code>,
+<code><nobr>Foo32</nobr></code> and <code><nobr>Foo64</nobr></code>, you
+could write:
+<p><pre>
+ mov ax,Foo%[__BITS__] ; The Foo value
+</pre>
+<p>to use the builtin macro <code><nobr>__BITS__</nobr></code> (see
+<a href="#section-4.11.5">section 4.11.5</a>) to automatically select
+between them. Similarly, the two statements:
+<p><pre>
+%xdefine Bar Quux ; Expands due to %xdefine
+%define Bar %[Quux] ; Expands due to %[...]
+</pre>
+<p>have, in fact, exactly the same effect.
+<p><code><nobr>%[...]</nobr></code> concatenates to adjacent tokens in the
+same way that multi-line macro parameters do, see
+<a href="#section-4.3.8">section 4.3.8</a> for details.
+<h4><a name="section-4.1.4">4.1.4 Concatenating Single Line Macro Tokens: <code><nobr>%+</nobr></code></a></h4>
+<p>Individual tokens in single line macros can be concatenated, to produce
+longer tokens for later processing. This can be useful if there are several
+similar macros that perform similar functions.
+<p>Please note that a space is required after <code><nobr>%+</nobr></code>,
+in order to disambiguate it from the syntax <code><nobr>%+1</nobr></code>
+used in multiline macros.
+<p>As an example, consider the following:
+<p><pre>
+%define BDASTART 400h ; Start of BIOS data area
+</pre>
+<p><pre>
+struc tBIOSDA ; its structure
+ .COM1addr RESW 1
+ .COM2addr RESW 1
+ ; ..and so on
+endstruc
+</pre>
+<p>Now, if we need to access the elements of tBIOSDA in different places,
+we can end up with:
+<p><pre>
+ mov ax,BDASTART + tBIOSDA.COM1addr
+ mov bx,BDASTART + tBIOSDA.COM2addr
+</pre>
+<p>This will become pretty ugly (and tedious) if used in many places, and
+can be reduced in size significantly by using the following macro:
+<p><pre>
+; Macro to access BIOS variables by their names (from tBDA):
+</pre>
+<p><pre>
+%define BDA(x) BDASTART + tBIOSDA. %+ x
+</pre>
+<p>Now the above code can be written as:
+<p><pre>
+ mov ax,BDA(COM1addr)
+ mov bx,BDA(COM2addr)
+</pre>
+<p>Using this feature, we can simplify references to a lot of macros (and,
+in turn, reduce typing errors).
+<h4><a name="section-4.1.5">4.1.5 The Macro Name Itself: <code><nobr>%?</nobr></code> and <code><nobr>%??</nobr></code></a></h4>
+<p>The special symbols <code><nobr>%?</nobr></code> and
+<code><nobr>%??</nobr></code> can be used to reference the macro name
+itself inside a macro expansion, this is supported for both single-and
+multi-line macros. <code><nobr>%?</nobr></code> refers to the macro name as
+<em>invoked</em>, whereas <code><nobr>%??</nobr></code> refers to the macro
+name as <em>declared</em>. The two are always the same for case-sensitive
+macros, but for case-insensitive macros, they can differ.
+<p>For example:
+<p><pre>
+%idefine Foo mov %?,%??
+
+ foo
+ FOO
+</pre>
+<p>will expand to:
+<p><pre>
+ mov foo,Foo
+ mov FOO,Foo
+</pre>
+<p>The sequence:
+<p><pre>
+%idefine keyword $%?
+</pre>
+<p>can be used to make a keyword "disappear", for example in case a new
+instruction has been used as a label in older code. For example:
+<p><pre>
+%idefine pause $%? ; Hide the PAUSE instruction
+</pre>
+<h4><a name="section-4.1.6">4.1.6 Undefining Single-Line Macros: <code><nobr>%undef</nobr></code></a></h4>
+<p>Single-line macros can be removed with the
+<code><nobr>%undef</nobr></code> directive. For example, the following
+sequence:
+<p><pre>
+%define foo bar
+%undef foo
+
+ mov eax, foo
+</pre>
+<p>will expand to the instruction <code><nobr>mov eax, foo</nobr></code>,
+since after <code><nobr>%undef</nobr></code> the macro
+<code><nobr>foo</nobr></code> is no longer defined.
+<p>Macros that would otherwise be pre-defined can be undefined on the
+command-line using the `-u' option on the NASM command line: see
+<a href="nasmdoc2.html#section-2.1.19">section 2.1.19</a>.
+<h4><a name="section-4.1.7">4.1.7 Preprocessor Variables: <code><nobr>%assign</nobr></code></a></h4>
+<p>An alternative way to define single-line macros is by means of the
+<code><nobr>%assign</nobr></code> command (and its case-insensitive
+counterpart <code><nobr>%iassign</nobr></code>, which differs from
+<code><nobr>%assign</nobr></code> in exactly the same way that
+<code><nobr>%idefine</nobr></code> differs from
+<code><nobr>%define</nobr></code>).
+<p><code><nobr>%assign</nobr></code> is used to define single-line macros
+which take no parameters and have a numeric value. This value can be
+specified in the form of an expression, and it will be evaluated once, when
+the <code><nobr>%assign</nobr></code> directive is processed.
+<p>Like <code><nobr>%define</nobr></code>, macros defined using
+<code><nobr>%assign</nobr></code> can be re-defined later, so you can do
+things like
+<p><pre>
+%assign i i+1
+</pre>
+<p>to increment the numeric value of a macro.
+<p><code><nobr>%assign</nobr></code> is useful for controlling the
+termination of <code><nobr>%rep</nobr></code> preprocessor loops: see
+<a href="#section-4.5">section 4.5</a> for an example of this. Another use
+for <code><nobr>%assign</nobr></code> is given in
+<a href="nasmdoc8.html#section-8.4">section 8.4</a> and
+<a href="nasmdoc9.html#section-9.1">section 9.1</a>.
+<p>The expression passed to <code><nobr>%assign</nobr></code> is a critical
+expression (see <a href="nasmdoc3.html#section-3.8">section 3.8</a>), and
+must also evaluate to a pure number (rather than a relocatable reference
+such as a code or data address, or anything involving a register).
+<h4><a name="section-4.1.8">4.1.8 Defining Strings: <code><nobr>%defstr</nobr></code></a></h4>
+<p><code><nobr>%defstr</nobr></code>, and its case-insensitive counterpart
+<code><nobr>%idefstr</nobr></code>, define or redefine a single-line macro
+without parameters but converts the entire right-hand side, after macro
+expansion, to a quoted string before definition.
+<p>For example:
+<p><pre>
+%defstr test TEST
+</pre>
+<p>is equivalent to
+<p><pre>
+%define test 'TEST'
+</pre>
+<p>This can be used, for example, with the <code><nobr>%!</nobr></code>
+construct (see <a href="#section-4.10.2">section 4.10.2</a>):
+<p><pre>
+%defstr PATH %!PATH ; The operating system PATH variable
+</pre>
+<h4><a name="section-4.1.9">4.1.9 Defining Tokens: <code><nobr>%deftok</nobr></code></a></h4>
+<p><code><nobr>%deftok</nobr></code>, and its case-insensitive counterpart
+<code><nobr>%ideftok</nobr></code>, define or redefine a single-line macro
+without parameters but converts the second parameter, after string
+conversion, to a sequence of tokens.
+<p>For example:
+<p><pre>
+%deftok test 'TEST'
+</pre>
+<p>is equivalent to
+<p><pre>
+%define test TEST
+</pre>
+<h3><a name="section-4.2">4.2 String Manipulation in Macros</a></h3>
+<p>It's often useful to be able to handle strings in macros. NASM supports
+a few simple string handling macro operators from which more complex
+operations can be constructed.
+<p>All the string operators define or redefine a value (either a string or
+a numeric value) to a single-line macro. When producing a string value, it
+may change the style of quoting of the input string or strings, and
+possibly use <code><nobr>\</nobr></code>-escapes inside
+<code><nobr>`</nobr></code>-quoted strings.
+<h4><a name="section-4.2.1">4.2.1 Concatenating Strings: <code><nobr>%strcat</nobr></code></a></h4>
+<p>The <code><nobr>%strcat</nobr></code> operator concatenates quoted
+strings and assign them to a single-line macro.
+<p>For example:
+<p><pre>
+%strcat alpha "Alpha: ", '12" screen'
+</pre>
+<p>... would assign the value <code><nobr>'Alpha: 12" screen'</nobr></code>
+to <code><nobr>alpha</nobr></code>. Similarly:
+<p><pre>
+%strcat beta '"foo"\', "'bar'"
+</pre>
+<p>... would assign the value <code><nobr>`"foo"\\'bar'`</nobr></code> to
+<code><nobr>beta</nobr></code>.
+<p>The use of commas to separate strings is permitted but optional.
+<h4><a name="section-4.2.2">4.2.2 String Length: <code><nobr>%strlen</nobr></code></a></h4>
+<p>The <code><nobr>%strlen</nobr></code> operator assigns the length of a
+string to a macro. For example:
+<p><pre>
+%strlen charcnt 'my string'
+</pre>
+<p>In this example, <code><nobr>charcnt</nobr></code> would receive the
+value 9, just as if an <code><nobr>%assign</nobr></code> had been used. In
+this example, <code><nobr>'my string'</nobr></code> was a literal string
+but it could also have been a single-line macro that expands to a string,
+as in the following example:
+<p><pre>
+%define sometext 'my string'
+%strlen charcnt sometext
+</pre>
+<p>As in the first case, this would result in
+<code><nobr>charcnt</nobr></code> being assigned the value of 9.
+<h4><a name="section-4.2.3">4.2.3 Extracting Substrings: <code><nobr>%substr</nobr></code></a></h4>
+<p>Individual letters or substrings in strings can be extracted using the
+<code><nobr>%substr</nobr></code> operator. An example of its use is
+probably more useful than the description:
+<p><pre>
+%substr mychar 'xyzw' 1 ; equivalent to %define mychar 'x'
+%substr mychar 'xyzw' 2 ; equivalent to %define mychar 'y'
+%substr mychar 'xyzw' 3 ; equivalent to %define mychar 'z'
+%substr mychar 'xyzw' 2,2 ; equivalent to %define mychar 'yz'
+%substr mychar 'xyzw' 2,-1 ; equivalent to %define mychar 'yzw'
+%substr mychar 'xyzw' 2,-2 ; equivalent to %define mychar 'yz'
+</pre>
+<p>As with <code><nobr>%strlen</nobr></code> (see
+<a href="#section-4.2.2">section 4.2.2</a>), the first parameter is the
+single-line macro to be created and the second is the string. The third
+parameter specifies the first character to be selected, and the optional
+fourth parameter preceeded by comma) is the length. Note that the first
+index is 1, not 0 and the last index is equal to the value that
+<code><nobr>%strlen</nobr></code> would assign given the same string. Index
+values out of range result in an empty string. A negative length means
+"until N-1 characters before the end of string", i.e.
+<code><nobr>-1</nobr></code> means until end of string,
+<code><nobr>-2</nobr></code> until one character before, etc.
+<h3><a name="section-4.3">4.3 Multi-Line Macros: <code><nobr>%macro</nobr></code></a></h3>
+<p>Multi-line macros are much more like the type of macro seen in MASM and
+TASM: a multi-line macro definition in NASM looks something like this.
+<p><pre>
+%macro prologue 1
+
+ push ebp
+ mov ebp,esp
+ sub esp,%1
+
+%endmacro
+</pre>
+<p>This defines a C-like function prologue as a macro: so you would invoke
+the macro with a call such as
+<p><pre>
+myfunc: prologue 12
+</pre>
+<p>which would expand to the three lines of code
+<p><pre>
+myfunc: push ebp
+ mov ebp,esp
+ sub esp,12
+</pre>
+<p>The number <code><nobr>1</nobr></code> after the macro name in the
+<code><nobr>%macro</nobr></code> line defines the number of parameters the
+macro <code><nobr>prologue</nobr></code> expects to receive. The use of
+<code><nobr>%1</nobr></code> inside the macro definition refers to the
+first parameter to the macro call. With a macro taking more than one
+parameter, subsequent parameters would be referred to as
+<code><nobr>%2</nobr></code>, <code><nobr>%3</nobr></code> and so on.
+<p>Multi-line macros, like single-line macros, are case-sensitive, unless
+you define them using the alternative directive
+<code><nobr>%imacro</nobr></code>.
+<p>If you need to pass a comma as <em>part</em> of a parameter to a
+multi-line macro, you can do that by enclosing the entire parameter in
+braces. So you could code things like
+<p><pre>
+%macro silly 2
+
+ %2: db %1
+
+%endmacro
+
+ silly 'a', letter_a ; letter_a: db 'a'
+ silly 'ab', string_ab ; string_ab: db 'ab'
+ silly {13,10}, crlf ; crlf: db 13,10
+</pre>
+<h4><a name="section-4.3.1">4.3.1 Recursive Multi-Line Macros: <code><nobr>%rmacro</nobr></code></a></h4>
+<p>A multi-line macro cannot be referenced within itself, in order to
+prevent accidental infinite recursion.
+<p>Recursive multi-line macros allow for self-referencing, with the caveat
+that the user is aware of the existence, use and purpose of recursive
+multi-line macros. There is also a generous, but sane, upper limit to the
+number of recursions, in order to prevent run-away memory consumption in
+case of accidental infinite recursion.
+<p>As with non-recursive multi-line macros, recursive multi-line macros are
+case-sensitive, unless you define them using the alternative directive
+<code><nobr>%irmacro</nobr></code>.
+<h4><a name="section-4.3.2">4.3.2 Overloading Multi-Line Macros</a></h4>
+<p>As with single-line macros, multi-line macros can be overloaded by
+defining the same macro name several times with different numbers of
+parameters. This time, no exception is made for macros with no parameters
+at all. So you could define
+<p><pre>
+%macro prologue 0
+
+ push ebp
+ mov ebp,esp
+
+%endmacro
+</pre>
+<p>to define an alternative form of the function prologue which allocates
+no local stack space.
+<p>Sometimes, however, you might want to `overload' a machine instruction;
+for example, you might want to define
+<p><pre>
+%macro push 2
+
+ push %1
+ push %2
+
+%endmacro
+</pre>
+<p>so that you could code
+<p><pre>
+ push ebx ; this line is not a macro call
+ push eax,ecx ; but this one is
+</pre>
+<p>Ordinarily, NASM will give a warning for the first of the above two
+lines, since <code><nobr>push</nobr></code> is now defined to be a macro,
+and is being invoked with a number of parameters for which no definition
+has been given. The correct code will still be generated, but the assembler
+will give a warning. This warning can be disabled by the use of the
+<code><nobr>-w-macro-params</nobr></code> command-line option (see
+<a href="nasmdoc2.html#section-2.1.24">section 2.1.24</a>).
+<h4><a name="section-4.3.3">4.3.3 Macro-Local Labels</a></h4>
+<p>NASM allows you to define labels within a multi-line macro definition in
+such a way as to make them local to the macro call: so calling the same
+macro multiple times will use a different label each time. You do this by
+prefixing <code><nobr>%%</nobr></code> to the label name. So you can invent
+an instruction which executes a <code><nobr>RET</nobr></code> if the
+<code><nobr>Z</nobr></code> flag is set by doing this:
+<p><pre>
+%macro retz 0
+
+ jnz %%skip
+ ret
+ %%skip:
+
+%endmacro
+</pre>
+<p>You can call this macro as many times as you want, and every time you
+call it NASM will make up a different `real' name to substitute for the
+label <code><nobr>%%skip</nobr></code>. The names NASM invents are of the
+form <code><nobr>..@2345.skip</nobr></code>, where the number 2345 changes
+with every macro call. The <code><nobr>..@</nobr></code> prefix prevents
+macro-local labels from interfering with the local label mechanism, as
+described in <a href="nasmdoc3.html#section-3.9">section 3.9</a>. You
+should avoid defining your own labels in this form (the
+<code><nobr>..@</nobr></code> prefix, then a number, then another period)
+in case they interfere with macro-local labels.
+<h4><a name="section-4.3.4">4.3.4 Greedy Macro Parameters</a></h4>
+<p>Occasionally it is useful to define a macro which lumps its entire
+command line into one parameter definition, possibly after extracting one
+or two smaller parameters from the front. An example might be a macro to
+write a text string to a file in MS-DOS, where you might want to be able to
+write
+<p><pre>
+ writefile [filehandle],"hello, world",13,10
+</pre>
+<p>NASM allows you to define the last parameter of a macro to be
+<em>greedy</em>, meaning that if you invoke the macro with more parameters
+than it expects, all the spare parameters get lumped into the last defined
+one along with the separating commas. So if you code:
+<p><pre>
+%macro writefile 2+
+
+ jmp %%endstr
+ %%str: db %2
+ %%endstr:
+ mov dx,%%str
+ mov cx,%%endstr-%%str
+ mov bx,%1
+ mov ah,0x40
+ int 0x21
+
+%endmacro
+</pre>
+<p>then the example call to <code><nobr>writefile</nobr></code> above will
+work as expected: the text before the first comma,
+<code><nobr>[filehandle]</nobr></code>, is used as the first macro
+parameter and expanded when <code><nobr>%1</nobr></code> is referred to,
+and all the subsequent text is lumped into <code><nobr>%2</nobr></code> and
+placed after the <code><nobr>db</nobr></code>.
+<p>The greedy nature of the macro is indicated to NASM by the use of the
+<code><nobr>+</nobr></code> sign after the parameter count on the
+<code><nobr>%macro</nobr></code> line.
+<p>If you define a greedy macro, you are effectively telling NASM how it
+should expand the macro given <em>any</em> number of parameters from the
+actual number specified up to infinity; in this case, for example, NASM now
+knows what to do when it sees a call to <code><nobr>writefile</nobr></code>
+with 2, 3, 4 or more parameters. NASM will take this into account when
+overloading macros, and will not allow you to define another form of
+<code><nobr>writefile</nobr></code> taking 4 parameters (for example).
+<p>Of course, the above macro could have been implemented as a non-greedy
+macro, in which case the call to it would have had to look like
+<p><pre>
+ writefile [filehandle], {"hello, world",13,10}
+</pre>
+<p>NASM provides both mechanisms for putting commas in macro parameters,
+and you choose which one you prefer for each macro definition.
+<p>See <a href="nasmdoc6.html#section-6.3.1">section 6.3.1</a> for a better
+way to write the above macro.
+<h4><a name="section-4.3.5">4.3.5 Default Macro Parameters</a></h4>
+<p>NASM also allows you to define a multi-line macro with a <em>range</em>
+of allowable parameter counts. If you do this, you can specify defaults for
+omitted parameters. So, for example:
+<p><pre>
+%macro die 0-1 "Painful program death has occurred."
+
+ writefile 2,%1
+ mov ax,0x4c01
+ int 0x21
+
+%endmacro
+</pre>
+<p>This macro (which makes use of the <code><nobr>writefile</nobr></code>
+macro defined in <a href="#section-4.3.4">section 4.3.4</a>) can be called
+with an explicit error message, which it will display on the error output
+stream before exiting, or it can be called with no parameters, in which
+case it will use the default error message supplied in the macro
+definition.
+<p>In general, you supply a minimum and maximum number of parameters for a
+macro of this type; the minimum number of parameters are then required in
+the macro call, and then you provide defaults for the optional ones. So if
+a macro definition began with the line
+<p><pre>
+%macro foobar 1-3 eax,[ebx+2]
+</pre>
+<p>then it could be called with between one and three parameters, and
+<code><nobr>%1</nobr></code> would always be taken from the macro call.
+<code><nobr>%2</nobr></code>, if not specified by the macro call, would
+default to <code><nobr>eax</nobr></code>, and <code><nobr>%3</nobr></code>
+if not specified would default to <code><nobr>[ebx+2]</nobr></code>.
+<p>You can provide extra information to a macro by providing too many
+default parameters:
+<p><pre>
+%macro quux 1 something
+</pre>
+<p>This will trigger a warning by default; see
+<a href="nasmdoc2.html#section-2.1.24">section 2.1.24</a> for more
+information. When <code><nobr>quux</nobr></code> is invoked, it receives
+not one but two parameters. <code><nobr>something</nobr></code> can be
+referred to as <code><nobr>%2</nobr></code>. The difference between passing
+<code><nobr>something</nobr></code> this way and writing
+<code><nobr>something</nobr></code> in the macro body is that with this way
+<code><nobr>something</nobr></code> is evaluated when the macro is defined,
+not when it is expanded.
+<p>You may omit parameter defaults from the macro definition, in which case
+the parameter default is taken to be blank. This can be useful for macros
+which can take a variable number of parameters, since the
+<code><nobr>%0</nobr></code> token (see <a href="#section-4.3.6">section
+4.3.6</a>) allows you to determine how many parameters were really passed
+to the macro call.
+<p>This defaulting mechanism can be combined with the greedy-parameter
+mechanism; so the <code><nobr>die</nobr></code> macro above could be made
+more powerful, and more useful, by changing the first line of the
+definition to
+<p><pre>
+%macro die 0-1+ "Painful program death has occurred.",13,10
+</pre>
+<p>The maximum parameter count can be infinite, denoted by
+<code><nobr>*</nobr></code>. In this case, of course, it is impossible to
+provide a <em>full</em> set of default parameters. Examples of this usage
+are shown in <a href="#section-4.3.7">section 4.3.7</a>.
+<h4><a name="section-4.3.6">4.3.6 <code><nobr>%0</nobr></code>: Macro Parameter Counter</a></h4>
+<p>The parameter reference <code><nobr>%0</nobr></code> will return a
+numeric constant giving the number of parameters received, that is, if
+<code><nobr>%0</nobr></code> is n then <code><nobr>%</nobr></code>n is the
+last parameter. <code><nobr>%0</nobr></code> is mostly useful for macros
+that can take a variable number of parameters. It can be used as an
+argument to <code><nobr>%rep</nobr></code> (see
+<a href="#section-4.5">section 4.5</a>) in order to iterate through all the
+parameters of a macro. Examples are given in
+<a href="#section-4.3.7">section 4.3.7</a>.
+<h4><a name="section-4.3.7">4.3.7 <code><nobr>%rotate</nobr></code>: Rotating Macro Parameters</a></h4>
+<p>Unix shell programmers will be familiar with the
+<code><nobr>shift</nobr></code> shell command, which allows the arguments
+passed to a shell script (referenced as <code><nobr>$1</nobr></code>,
+<code><nobr>$2</nobr></code> and so on) to be moved left by one place, so
+that the argument previously referenced as <code><nobr>$2</nobr></code>
+becomes available as <code><nobr>$1</nobr></code>, and the argument
+previously referenced as <code><nobr>$1</nobr></code> is no longer
+available at all.
+<p>NASM provides a similar mechanism, in the form of
+<code><nobr>%rotate</nobr></code>. As its name suggests, it differs from
+the Unix <code><nobr>shift</nobr></code> in that no parameters are lost:
+parameters rotated off the left end of the argument list reappear on the
+right, and vice versa.
+<p><code><nobr>%rotate</nobr></code> is invoked with a single numeric
+argument (which may be an expression). The macro parameters are rotated to
+the left by that many places. If the argument to
+<code><nobr>%rotate</nobr></code> is negative, the macro parameters are
+rotated to the right.
+<p>So a pair of macros to save and restore a set of registers might work as
+follows:
+<p><pre>
+%macro multipush 1-*
+
+ %rep %0
+ push %1
+ %rotate 1
+ %endrep
+
+%endmacro
+</pre>
+<p>This macro invokes the <code><nobr>PUSH</nobr></code> instruction on
+each of its arguments in turn, from left to right. It begins by pushing its
+first argument, <code><nobr>%1</nobr></code>, then invokes
+<code><nobr>%rotate</nobr></code> to move all the arguments one place to
+the left, so that the original second argument is now available as
+<code><nobr>%1</nobr></code>. Repeating this procedure as many times as
+there were arguments (achieved by supplying <code><nobr>%0</nobr></code> as
+the argument to <code><nobr>%rep</nobr></code>) causes each argument in
+turn to be pushed.
+<p>Note also the use of <code><nobr>*</nobr></code> as the maximum
+parameter count, indicating that there is no upper limit on the number of
+parameters you may supply to the <code><nobr>multipush</nobr></code> macro.
+<p>It would be convenient, when using this macro, to have a
+<code><nobr>POP</nobr></code> equivalent, which <em>didn't</em> require the
+arguments to be given in reverse order. Ideally, you would write the
+<code><nobr>multipush</nobr></code> macro call, then cut-and-paste the line
+to where the pop needed to be done, and change the name of the called macro
+to <code><nobr>multipop</nobr></code>, and the macro would take care of
+popping the registers in the opposite order from the one in which they were
+pushed.
+<p>This can be done by the following definition:
+<p><pre>
+%macro multipop 1-*
+
+ %rep %0
+ %rotate -1
+ pop %1
+ %endrep
+
+%endmacro
+</pre>
+<p>This macro begins by rotating its arguments one place to the
+<em>right</em>, so that the original <em>last</em> argument appears as
+<code><nobr>%1</nobr></code>. This is then popped, and the arguments are
+rotated right again, so the second-to-last argument becomes
+<code><nobr>%1</nobr></code>. Thus the arguments are iterated through in
+reverse order.
+<h4><a name="section-4.3.8">4.3.8 Concatenating Macro Parameters</a></h4>
+<p>NASM can concatenate macro parameters and macro indirection constructs
+on to other text surrounding them. This allows you to declare a family of
+symbols, for example, in a macro definition. If, for example, you wanted to
+generate a table of key codes along with offsets into the table, you could
+code something like
+<p><pre>
+%macro keytab_entry 2
+
+ keypos%1 equ $-keytab
+ db %2
+
+%endmacro
+
+keytab:
+ keytab_entry F1,128+1
+ keytab_entry F2,128+2
+ keytab_entry Return,13
+</pre>
+<p>which would expand to
+<p><pre>
+keytab:
+keyposF1 equ $-keytab
+ db 128+1
+keyposF2 equ $-keytab
+ db 128+2
+keyposReturn equ $-keytab
+ db 13
+</pre>
+<p>You can just as easily concatenate text on to the other end of a macro
+parameter, by writing <code><nobr>%1foo</nobr></code>.
+<p>If you need to append a <em>digit</em> to a macro parameter, for example
+defining labels <code><nobr>foo1</nobr></code> and
+<code><nobr>foo2</nobr></code> when passed the parameter
+<code><nobr>foo</nobr></code>, you can't code <code><nobr>%11</nobr></code>
+because that would be taken as the eleventh macro parameter. Instead, you
+must code <code><nobr>%{1}1</nobr></code>, which will separate the first
+<code><nobr>1</nobr></code> (giving the number of the macro parameter) from
+the second (literal text to be concatenated to the parameter).
+<p>This concatenation can also be applied to other preprocessor in-line
+objects, such as macro-local labels (<a href="#section-4.3.3">section
+4.3.3</a>) and context-local labels (<a href="#section-4.7.2">section
+4.7.2</a>). In all cases, ambiguities in syntax can be resolved by
+enclosing everything after the <code><nobr>%</nobr></code> sign and before
+the literal text in braces: so <code><nobr>%{%foo}bar</nobr></code>
+concatenates the text <code><nobr>bar</nobr></code> to the end of the real
+name of the macro-local label <code><nobr>%%foo</nobr></code>. (This is
+unnecessary, since the form NASM uses for the real names of macro-local
+labels means that the two usages <code><nobr>%{%foo}bar</nobr></code> and
+<code><nobr>%%foobar</nobr></code> would both expand to the same thing
+anyway; nevertheless, the capability is there.)
+<p>The single-line macro indirection construct,
+<code><nobr>%[...]</nobr></code> (<a href="#section-4.1.3">section
+4.1.3</a>), behaves the same way as macro parameters for the purpose of
+concatenation.
+<p>See also the <code><nobr>%+</nobr></code> operator,
+<a href="#section-4.1.4">section 4.1.4</a>.
+<h4><a name="section-4.3.9">4.3.9 Condition Codes as Macro Parameters</a></h4>
+<p>NASM can give special treatment to a macro parameter which contains a
+condition code. For a start, you can refer to the macro parameter
+<code><nobr>%1</nobr></code> by means of the alternative syntax
+<code><nobr>%+1</nobr></code>, which informs NASM that this macro parameter
+is supposed to contain a condition code, and will cause the preprocessor to
+report an error message if the macro is called with a parameter which is
+<em>not</em> a valid condition code.
+<p>Far more usefully, though, you can refer to the macro parameter by means
+of <code><nobr>%-1</nobr></code>, which NASM will expand as the
+<em>inverse</em> condition code. So the <code><nobr>retz</nobr></code>
+macro defined in <a href="#section-4.3.3">section 4.3.3</a> can be replaced
+by a general conditional-return macro like this:
+<p><pre>
+%macro retc 1
+
+ j%-1 %%skip
+ ret
+ %%skip:
+
+%endmacro
+</pre>
+<p>This macro can now be invoked using calls like
+<code><nobr>retc ne</nobr></code>, which will cause the conditional-jump
+instruction in the macro expansion to come out as
+<code><nobr>JE</nobr></code>, or <code><nobr>retc po</nobr></code> which
+will make the jump a <code><nobr>JPE</nobr></code>.
+<p>The <code><nobr>%+1</nobr></code> macro-parameter reference is quite
+happy to interpret the arguments <code><nobr>CXZ</nobr></code> and
+<code><nobr>ECXZ</nobr></code> as valid condition codes; however,
+<code><nobr>%-1</nobr></code> will report an error if passed either of
+these, because no inverse condition code exists.
+<h4><a name="section-4.3.10">4.3.10 Disabling Listing Expansion</a></h4>
+<p>When NASM is generating a listing file from your program, it will
+generally expand multi-line macros by means of writing the macro call and
+then listing each line of the expansion. This allows you to see which
+instructions in the macro expansion are generating what code; however, for
+some macros this clutters the listing up unnecessarily.
+<p>NASM therefore provides the <code><nobr>.nolist</nobr></code> qualifier,
+which you can include in a macro definition to inhibit the expansion of the
+macro in the listing file. The <code><nobr>.nolist</nobr></code> qualifier
+comes directly after the number of parameters, like this:
+<p><pre>
+%macro foo 1.nolist
+</pre>
+<p>Or like this:
+<p><pre>
+%macro bar 1-5+.nolist a,b,c,d,e,f,g,h
+</pre>
+<h4><a name="section-4.3.11">4.3.11 Undefining Multi-Line Macros: <code><nobr>%unmacro</nobr></code></a></h4>
+<p>Multi-line macros can be removed with the
+<code><nobr>%unmacro</nobr></code> directive. Unlike the
+<code><nobr>%undef</nobr></code> directive, however,
+<code><nobr>%unmacro</nobr></code> takes an argument specification, and
+will only remove exact matches with that argument specification.
+<p>For example:
+<p><pre>
+%macro foo 1-3
+ ; Do something
+%endmacro
+%unmacro foo 1-3
+</pre>
+<p>removes the previously defined macro <code><nobr>foo</nobr></code>, but
+<p><pre>
+%macro bar 1-3
+ ; Do something
+%endmacro
+%unmacro bar 1
+</pre>
+<p>does <em>not</em> remove the macro <code><nobr>bar</nobr></code>, since
+the argument specification does not match exactly.
+<h4><a name="section-4.3.12">4.3.12 Exiting Multi-Line Macros: <code><nobr>%exitmacro</nobr></code></a></h4>
+<p>Multi-line macro expansions can be arbitrarily terminated with the
+<code><nobr>%exitmacro</nobr></code> directive.
+<p>For example:
+<p><pre>
+%macro foo 1-3
+ ; Do something
+ %if&lt;condition&gt;
+ %exitmacro
+ %endif
+ ; Do something
+%endmacro
+</pre>
+<h3><a name="section-4.4">4.4 Conditional Assembly</a></h3>
+<p>Similarly to the C preprocessor, NASM allows sections of a source file
+to be assembled only if certain conditions are met. The general syntax of
+this feature looks like this:
+<p><pre>
+%if&lt;condition&gt;
+ ; some code which only appears if &lt;condition&gt; is met
+%elif&lt;condition2&gt;
+ ; only appears if &lt;condition&gt; is not met but &lt;condition2&gt; is
+%else
+ ; this appears if neither &lt;condition&gt; nor &lt;condition2&gt; was met
+%endif
+</pre>
+<p>The inverse forms <code><nobr>%ifn</nobr></code> and
+<code><nobr>%elifn</nobr></code> are also supported.
+<p>The <code><nobr>%else</nobr></code> clause is optional, as is the
+<code><nobr>%elif</nobr></code> clause. You can have more than one
+<code><nobr>%elif</nobr></code> clause as well.
+<p>There are a number of variants of the <code><nobr>%if</nobr></code>
+directive. Each has its corresponding <code><nobr>%elif</nobr></code>,
+<code><nobr>%ifn</nobr></code>, and <code><nobr>%elifn</nobr></code>
+directives; for example, the equivalents to the
+<code><nobr>%ifdef</nobr></code> directive are
+<code><nobr>%elifdef</nobr></code>, <code><nobr>%ifndef</nobr></code>, and
+<code><nobr>%elifndef</nobr></code>.
+<h4><a name="section-4.4.1">4.4.1 <code><nobr>%ifdef</nobr></code>: Testing Single-Line Macro Existence</a></h4>
+<p>Beginning a conditional-assembly block with the line
+<code><nobr>%ifdef MACRO</nobr></code> will assemble the subsequent code
+if, and only if, a single-line macro called <code><nobr>MACRO</nobr></code>
+is defined. If not, then the <code><nobr>%elif</nobr></code> and
+<code><nobr>%else</nobr></code> blocks (if any) will be processed instead.
+<p>For example, when debugging a program, you might want to write code such
+as
+<p><pre>
+ ; perform some function
+%ifdef DEBUG
+ writefile 2,"Function performed successfully",13,10
+%endif
+ ; go and do something else
+</pre>
+<p>Then you could use the command-line option
+<code><nobr>-dDEBUG</nobr></code> to create a version of the program which
+produced debugging messages, and remove the option to generate the final
+release version of the program.
+<p>You can test for a macro <em>not</em> being defined by using
+<code><nobr>%ifndef</nobr></code> instead of
+<code><nobr>%ifdef</nobr></code>. You can also test for macro definitions
+in <code><nobr>%elif</nobr></code> blocks by using
+<code><nobr>%elifdef</nobr></code> and <code><nobr>%elifndef</nobr></code>.
+<h4><a name="section-4.4.2">4.4.2 <code><nobr>%ifmacro</nobr></code>: Testing Multi-Line Macro Existence</a></h4>
+<p>The <code><nobr>%ifmacro</nobr></code> directive operates in the same
+way as the <code><nobr>%ifdef</nobr></code> directive, except that it
+checks for the existence of a multi-line macro.
+<p>For example, you may be working with a large project and not have
+control over the macros in a library. You may want to create a macro with
+one name if it doesn't already exist, and another name if one with that
+name does exist.
+<p>The <code><nobr>%ifmacro</nobr></code> is considered true if defining a
+macro with the given name and number of arguments would cause a definitions
+conflict. For example:
+<p><pre>
+%ifmacro MyMacro 1-3
+
+ %error "MyMacro 1-3" causes a conflict with an existing macro.
+
+%else
+
+ %macro MyMacro 1-3
+
+ ; insert code to define the macro
+
+ %endmacro
+
+%endif
+</pre>
+<p>This will create the macro "MyMacro 1-3" if no macro already exists
+which would conflict with it, and emits a warning if there would be a
+definition conflict.
+<p>You can test for the macro not existing by using the
+<code><nobr>%ifnmacro</nobr></code> instead of
+<code><nobr>%ifmacro</nobr></code>. Additional tests can be performed in
+<code><nobr>%elif</nobr></code> blocks by using
+<code><nobr>%elifmacro</nobr></code> and
+<code><nobr>%elifnmacro</nobr></code>.
+<h4><a name="section-4.4.3">4.4.3 <code><nobr>%ifctx</nobr></code>: Testing the Context Stack</a></h4>
+<p>The conditional-assembly construct <code><nobr>%ifctx</nobr></code> will
+cause the subsequent code to be assembled if and only if the top context on
+the preprocessor's context stack has the same name as one of the arguments.
+As with <code><nobr>%ifdef</nobr></code>, the inverse and
+<code><nobr>%elif</nobr></code> forms <code><nobr>%ifnctx</nobr></code>,
+<code><nobr>%elifctx</nobr></code> and <code><nobr>%elifnctx</nobr></code>
+are also supported.
+<p>For more details of the context stack, see
+<a href="#section-4.7">section 4.7</a>. For a sample use of
+<code><nobr>%ifctx</nobr></code>, see <a href="#section-4.7.5">section
+4.7.5</a>.
+<h4><a name="section-4.4.4">4.4.4 <code><nobr>%if</nobr></code>: Testing Arbitrary Numeric Expressions</a></h4>
+<p>The conditional-assembly construct <code><nobr>%if expr</nobr></code>
+will cause the subsequent code to be assembled if and only if the value of
+the numeric expression <code><nobr>expr</nobr></code> is non-zero. An
+example of the use of this feature is in deciding when to break out of a
+<code><nobr>%rep</nobr></code> preprocessor loop: see
+<a href="#section-4.5">section 4.5</a> for a detailed example.
+<p>The expression given to <code><nobr>%if</nobr></code>, and its
+counterpart <code><nobr>%elif</nobr></code>, is a critical expression (see
+<a href="nasmdoc3.html#section-3.8">section 3.8</a>).
+<p><code><nobr>%if</nobr></code> extends the normal NASM expression syntax,
+by providing a set of relational operators which are not normally available
+in expressions. The operators <code><nobr>=</nobr></code>,
+<code><nobr>&lt;</nobr></code>, <code><nobr>&gt;</nobr></code>,
+<code><nobr>&lt;=</nobr></code>, <code><nobr>&gt;=</nobr></code> and
+<code><nobr>&lt;&gt;</nobr></code> test equality, less-than, greater-than,
+less-or-equal, greater-or-equal and not-equal respectively. The C-like
+forms <code><nobr>==</nobr></code> and <code><nobr>!=</nobr></code> are
+supported as alternative forms of <code><nobr>=</nobr></code> and
+<code><nobr>&lt;&gt;</nobr></code>. In addition, low-priority logical
+operators <code><nobr>&amp;&amp;</nobr></code>,
+<code><nobr>^^</nobr></code> and <code><nobr>||</nobr></code> are provided,
+supplying logical AND, logical XOR and logical OR. These work like the C
+logical operators (although C has no logical XOR), in that they always
+return either 0 or 1, and treat any non-zero input as 1 (so that
+<code><nobr>^^</nobr></code>, for example, returns 1 if exactly one of its
+inputs is zero, and 0 otherwise). The relational operators also return 1
+for true and 0 for false.
+<p>Like other <code><nobr>%if</nobr></code> constructs,
+<code><nobr>%if</nobr></code> has a counterpart
+<code><nobr>%elif</nobr></code>, and negative forms
+<code><nobr>%ifn</nobr></code> and <code><nobr>%elifn</nobr></code>.
+<h4><a name="section-4.4.5">4.4.5 <code><nobr>%ifidn</nobr></code> and <code><nobr>%ifidni</nobr></code>: Testing Exact Text Identity</a></h4>
+<p>The construct <code><nobr>%ifidn text1,text2</nobr></code> will cause
+the subsequent code to be assembled if and only if
+<code><nobr>text1</nobr></code> and <code><nobr>text2</nobr></code>, after
+expanding single-line macros, are identical pieces of text. Differences in
+white space are not counted.
+<p><code><nobr>%ifidni</nobr></code> is similar to
+<code><nobr>%ifidn</nobr></code>, but is case-insensitive.
+<p>For example, the following macro pushes a register or number on the
+stack, and allows you to treat <code><nobr>IP</nobr></code> as a real
+register:
+<p><pre>
+%macro pushparam 1
+
+ %ifidni %1,ip
+ call %%label
+ %%label:
+ %else
+ push %1
+ %endif
+
+%endmacro
+</pre>
+<p>Like other <code><nobr>%if</nobr></code> constructs,
+<code><nobr>%ifidn</nobr></code> has a counterpart
+<code><nobr>%elifidn</nobr></code>, and negative forms
+<code><nobr>%ifnidn</nobr></code> and <code><nobr>%elifnidn</nobr></code>.
+Similarly, <code><nobr>%ifidni</nobr></code> has counterparts
+<code><nobr>%elifidni</nobr></code>, <code><nobr>%ifnidni</nobr></code> and
+<code><nobr>%elifnidni</nobr></code>.
+<h4><a name="section-4.4.6">4.4.6 <code><nobr>%ifid</nobr></code>, <code><nobr>%ifnum</nobr></code>, <code><nobr>%ifstr</nobr></code>: Testing Token Types</a></h4>
+<p>Some macros will want to perform different tasks depending on whether
+they are passed a number, a string, or an identifier. For example, a string
+output macro might want to be able to cope with being passed either a
+string constant or a pointer to an existing string.
+<p>The conditional assembly construct <code><nobr>%ifid</nobr></code>,
+taking one parameter (which may be blank), assembles the subsequent code if
+and only if the first token in the parameter exists and is an identifier.
+<code><nobr>%ifnum</nobr></code> works similarly, but tests for the token
+being a numeric constant; <code><nobr>%ifstr</nobr></code> tests for it
+being a string.
+<p>For example, the <code><nobr>writefile</nobr></code> macro defined in
+<a href="#section-4.3.4">section 4.3.4</a> can be extended to take
+advantage of <code><nobr>%ifstr</nobr></code> in the following fashion:
+<p><pre>
+%macro writefile 2-3+
+
+ %ifstr %2
+ jmp %%endstr
+ %if %0 = 3
+ %%str: db %2,%3
+ %else
+ %%str: db %2
+ %endif
+ %%endstr: mov dx,%%str
+ mov cx,%%endstr-%%str
+ %else
+ mov dx,%2
+ mov cx,%3
+ %endif
+ mov bx,%1
+ mov ah,0x40
+ int 0x21
+
+%endmacro
+</pre>
+<p>Then the <code><nobr>writefile</nobr></code> macro can cope with being
+called in either of the following two ways:
+<p><pre>
+ writefile [file], strpointer, length
+ writefile [file], "hello", 13, 10
+</pre>
+<p>In the first, <code><nobr>strpointer</nobr></code> is used as the
+address of an already-declared string, and <code><nobr>length</nobr></code>
+is used as its length; in the second, a string is given to the macro, which
+therefore declares it itself and works out the address and length for
+itself.
+<p>Note the use of <code><nobr>%if</nobr></code> inside the
+<code><nobr>%ifstr</nobr></code>: this is to detect whether the macro was
+passed two arguments (so the string would be a single string constant, and
+<code><nobr>db %2</nobr></code> would be adequate) or more (in which case,
+all but the first two would be lumped together into
+<code><nobr>%3</nobr></code>, and <code><nobr>db %2,%3</nobr></code> would
+be required).
+<p>The usual <code><nobr>%elif</nobr></code>...,
+<code><nobr>%ifn</nobr></code>..., and <code><nobr>%elifn</nobr></code>...
+versions exist for each of <code><nobr>%ifid</nobr></code>,
+<code><nobr>%ifnum</nobr></code> and <code><nobr>%ifstr</nobr></code>.
+<h4><a name="section-4.4.7">4.4.7 <code><nobr>%iftoken</nobr></code>: Test for a Single Token</a></h4>
+<p>Some macros will want to do different things depending on if it is
+passed a single token (e.g. paste it to something else using
+<code><nobr>%+</nobr></code>) versus a multi-token sequence.
+<p>The conditional assembly construct <code><nobr>%iftoken</nobr></code>
+assembles the subsequent code if and only if the expanded parameters
+consist of exactly one token, possibly surrounded by whitespace.
+<p>For example:
+<p><pre>
+%iftoken 1
+</pre>
+<p>will assemble the subsequent code, but
+<p><pre>
+%iftoken -1
+</pre>
+<p>will not, since <code><nobr>-1</nobr></code> contains two tokens: the
+unary minus operator <code><nobr>-</nobr></code>, and the number
+<code><nobr>1</nobr></code>.
+<p>The usual <code><nobr>%eliftoken</nobr></code>,
+<code><nobr>%ifntoken</nobr></code>, and
+<code><nobr>%elifntoken</nobr></code> variants are also provided.
+<h4><a name="section-4.4.8">4.4.8 <code><nobr>%ifempty</nobr></code>: Test for Empty Expansion</a></h4>
+<p>The conditional assembly construct <code><nobr>%ifempty</nobr></code>
+assembles the subsequent code if and only if the expanded parameters do not
+contain any tokens at all, whitespace excepted.
+<p>The usual <code><nobr>%elifempty</nobr></code>,
+<code><nobr>%ifnempty</nobr></code>, and
+<code><nobr>%elifnempty</nobr></code> variants are also provided.
+<h3><a name="section-4.5">4.5 Preprocessor Loops: <code><nobr>%rep</nobr></code></a></h3>
+<p>NASM's <code><nobr>TIMES</nobr></code> prefix, though useful, cannot be
+used to invoke a multi-line macro multiple times, because it is processed
+by NASM after macros have already been expanded. Therefore NASM provides
+another form of loop, this time at the preprocessor level:
+<code><nobr>%rep</nobr></code>.
+<p>The directives <code><nobr>%rep</nobr></code> and
+<code><nobr>%endrep</nobr></code> (<code><nobr>%rep</nobr></code> takes a
+numeric argument, which can be an expression;
+<code><nobr>%endrep</nobr></code> takes no arguments) can be used to
+enclose a chunk of code, which is then replicated as many times as
+specified by the preprocessor:
+<p><pre>
+%assign i 0
+%rep 64
+ inc word [table+2*i]
+%assign i i+1
+%endrep
+</pre>
+<p>This will generate a sequence of 64 <code><nobr>INC</nobr></code>
+instructions, incrementing every word of memory from
+<code><nobr>[table]</nobr></code> to <code><nobr>[table+126]</nobr></code>.
+<p>For more complex termination conditions, or to break out of a repeat
+loop part way along, you can use the <code><nobr>%exitrep</nobr></code>
+directive to terminate the loop, like this:
+<p><pre>
+fibonacci:
+%assign i 0
+%assign j 1
+%rep 100
+%if j &gt; 65535
+ %exitrep
+%endif
+ dw j
+%assign k j+i
+%assign i j
+%assign j k
+%endrep
+
+fib_number equ ($-fibonacci)/2
+</pre>
+<p>This produces a list of all the Fibonacci numbers that will fit in 16
+bits. Note that a maximum repeat count must still be given to
+<code><nobr>%rep</nobr></code>. This is to prevent the possibility of NASM
+getting into an infinite loop in the preprocessor, which (on multitasking
+or multi-user systems) would typically cause all the system memory to be
+gradually used up and other applications to start crashing.
+<h3><a name="section-4.6">4.6 Source Files and Dependencies</a></h3>
+<p>These commands allow you to split your sources into multiple files.
+<h4><a name="section-4.6.1">4.6.1 <code><nobr>%include</nobr></code>: Including Other Files</a></h4>
+<p>Using, once again, a very similar syntax to the C preprocessor, NASM's
+preprocessor lets you include other source files into your code. This is
+done by the use of the <code><nobr>%include</nobr></code> directive:
+<p><pre>
+%include "macros.mac"
+</pre>
+<p>will include the contents of the file
+<code><nobr>macros.mac</nobr></code> into the source file containing the
+<code><nobr>%include</nobr></code> directive.
+<p>Include files are searched for in the current directory (the directory
+you're in when you run NASM, as opposed to the location of the NASM
+executable or the location of the source file), plus any directories
+specified on the NASM command line using the <code><nobr>-i</nobr></code>
+option.
+<p>The standard C idiom for preventing a file being included more than once
+is just as applicable in NASM: if the file
+<code><nobr>macros.mac</nobr></code> has the form
+<p><pre>
+%ifndef MACROS_MAC
+ %define MACROS_MAC
+ ; now define some macros
+%endif
+</pre>
+<p>then including the file more than once will not cause errors, because
+the second time the file is included nothing will happen because the macro
+<code><nobr>MACROS_MAC</nobr></code> will already be defined.
+<p>You can force a file to be included even if there is no
+<code><nobr>%include</nobr></code> directive that explicitly includes it,
+by using the <code><nobr>-p</nobr></code> option on the NASM command line
+(see <a href="nasmdoc2.html#section-2.1.17">section 2.1.17</a>).
+<h4><a name="section-4.6.2">4.6.2 <code><nobr>%pathsearch</nobr></code>: Search the Include Path</a></h4>
+<p>The <code><nobr>%pathsearch</nobr></code> directive takes a single-line
+macro name and a filename, and declare or redefines the specified
+single-line macro to be the include-path-resolved version of the filename,
+if the file exists (otherwise, it is passed unchanged.)
+<p>For example,
+<p><pre>
+%pathsearch MyFoo "foo.bin"
+</pre>
+<p>... with <code><nobr>-Ibins/</nobr></code> in the include path may end
+up defining the macro <code><nobr>MyFoo</nobr></code> to be
+<code><nobr>"bins/foo.bin"</nobr></code>.
+<h4><a name="section-4.6.3">4.6.3 <code><nobr>%depend</nobr></code>: Add Dependent Files</a></h4>
+<p>The <code><nobr>%depend</nobr></code> directive takes a filename and
+adds it to the list of files to be emitted as dependency generation when
+the <code><nobr>-M</nobr></code> options and its relatives (see
+<a href="nasmdoc2.html#section-2.1.4">section 2.1.4</a>) are used. It
+produces no output.
+<p>This is generally used in conjunction with
+<code><nobr>%pathsearch</nobr></code>. For example, a simplified version of
+the standard macro wrapper for the <code><nobr>INCBIN</nobr></code>
+directive looks like:
+<p><pre>
+%imacro incbin 1-2+ 0
+%pathsearch dep %1
+%depend dep
+ incbin dep,%2
+%endmacro
+</pre>
+<p>This first resolves the location of the file into the macro
+<code><nobr>dep</nobr></code>, then adds it to the dependency lists, and
+finally issues the assembler-level <code><nobr>INCBIN</nobr></code>
+directive.
+<h4><a name="section-4.6.4">4.6.4 <code><nobr>%use</nobr></code>: Include Standard Macro Package</a></h4>
+<p>The <code><nobr>%use</nobr></code> directive is similar to
+<code><nobr>%include</nobr></code>, but rather than including the contents
+of a file, it includes a named standard macro package. The standard macro
+packages are part of NASM, and are described in
+<a href="nasmdoc5.html">chapter 5</a>.
+<p>Unlike the <code><nobr>%include</nobr></code> directive, package names
+for the <code><nobr>%use</nobr></code> directive do not require quotes, but
+quotes are permitted. In NASM 2.04 and 2.05 the unquoted form would be
+macro-expanded; this is no longer true. Thus, the following lines are
+equivalent:
+<p><pre>
+%use altreg
+%use 'altreg'
+</pre>
+<p>Standard macro packages are protected from multiple inclusion. When a
+standard macro package is used, a testable single-line macro of the form
+<code><nobr>__USE_</nobr></code><em>package</em><code><nobr>__</nobr></code>
+is also defined, see <a href="#section-4.11.8">section 4.11.8</a>.
+<h3><a name="section-4.7">4.7 The Context Stack</a></h3>
+<p>Having labels that are local to a macro definition is sometimes not
+quite powerful enough: sometimes you want to be able to share labels
+between several macro calls. An example might be a
+<code><nobr>REPEAT</nobr></code> ... <code><nobr>UNTIL</nobr></code> loop,
+in which the expansion of the <code><nobr>REPEAT</nobr></code> macro would
+need to be able to refer to a label which the
+<code><nobr>UNTIL</nobr></code> macro had defined. However, for such a
+macro you would also want to be able to nest these loops.
+<p>NASM provides this level of power by means of a <em>context stack</em>.
+The preprocessor maintains a stack of <em>contexts</em>, each of which is
+characterized by a name. You add a new context to the stack using the
+<code><nobr>%push</nobr></code> directive, and remove one using
+<code><nobr>%pop</nobr></code>. You can define labels that are local to a
+particular context on the stack.
+<h4><a name="section-4.7.1">4.7.1 <code><nobr>%push</nobr></code> and <code><nobr>%pop</nobr></code>: Creating and Removing Contexts</a></h4>
+<p>The <code><nobr>%push</nobr></code> directive is used to create a new
+context and place it on the top of the context stack.
+<code><nobr>%push</nobr></code> takes an optional argument, which is the
+name of the context. For example:
+<p><pre>
+%push foobar
+</pre>
+<p>This pushes a new context called <code><nobr>foobar</nobr></code> on the
+stack. You can have several contexts on the stack with the same name: they
+can still be distinguished. If no name is given, the context is unnamed
+(this is normally used when both the <code><nobr>%push</nobr></code> and
+the <code><nobr>%pop</nobr></code> are inside a single macro definition.)
+<p>The directive <code><nobr>%pop</nobr></code>, taking one optional
+argument, removes the top context from the context stack and destroys it,
+along with any labels associated with it. If an argument is given, it must
+match the name of the current context, otherwise it will issue an error.
+<h4><a name="section-4.7.2">4.7.2 Context-Local Labels</a></h4>
+<p>Just as the usage <code><nobr>%%foo</nobr></code> defines a label which
+is local to the particular macro call in which it is used, the usage
+<code><nobr>%$foo</nobr></code> is used to define a label which is local to
+the context on the top of the context stack. So the
+<code><nobr>REPEAT</nobr></code> and <code><nobr>UNTIL</nobr></code>
+example given above could be implemented by means of:
+<p><pre>
+%macro repeat 0
+
+ %push repeat
+ %$begin:
+
+%endmacro
+
+%macro until 1
+
+ j%-1 %$begin
+ %pop
+
+%endmacro
+</pre>
+<p>and invoked by means of, for example,
+<p><pre>
+ mov cx,string
+ repeat
+ add cx,3
+ scasb
+ until e
+</pre>
+<p>which would scan every fourth byte of a string in search of the byte in
+<code><nobr>AL</nobr></code>.
+<p>If you need to define, or access, labels local to the context
+<em>below</em> the top one on the stack, you can use
+<code><nobr>%$$foo</nobr></code>, or <code><nobr>%$$$foo</nobr></code> for
+the context below that, and so on.
+<h4><a name="section-4.7.3">4.7.3 Context-Local Single-Line Macros</a></h4>
+<p>NASM also allows you to define single-line macros which are local to a
+particular context, in just the same way:
+<p><pre>
+%define %$localmac 3
+</pre>
+<p>will define the single-line macro <code><nobr>%$localmac</nobr></code>
+to be local to the top context on the stack. Of course, after a subsequent
+<code><nobr>%push</nobr></code>, it can then still be accessed by the name
+<code><nobr>%$$localmac</nobr></code>.
+<h4><a name="section-4.7.4">4.7.4 <code><nobr>%repl</nobr></code>: Renaming a Context</a></h4>
+<p>If you need to change the name of the top context on the stack (in
+order, for example, to have it respond differently to
+<code><nobr>%ifctx</nobr></code>), you can execute a
+<code><nobr>%pop</nobr></code> followed by a
+<code><nobr>%push</nobr></code>; but this will have the side effect of
+destroying all context-local labels and macros associated with the context
+that was just popped.
+<p>NASM provides the directive <code><nobr>%repl</nobr></code>, which
+<em>replaces</em> a context with a different name, without touching the
+associated macros and labels. So you could replace the destructive code
+<p><pre>
+%pop
+%push newname
+</pre>
+<p>with the non-destructive version
+<code><nobr>%repl newname</nobr></code>.
+<h4><a name="section-4.7.5">4.7.5 Example Use of the Context Stack: Block IFs</a></h4>
+<p>This example makes use of almost all the context-stack features,
+including the conditional-assembly construct
+<code><nobr>%ifctx</nobr></code>, to implement a block IF statement as a
+set of macros.
+<p><pre>
+%macro if 1
+
+ %push if
+ j%-1 %$ifnot
+
+%endmacro
+
+%macro else 0
+
+ %ifctx if
+ %repl else
+ jmp %$ifend
+ %$ifnot:
+ %else
+ %error "expected `if' before `else'"
+ %endif
+
+%endmacro
+
+%macro endif 0
+
+ %ifctx if
+ %$ifnot:
+ %pop
+ %elifctx else
+ %$ifend:
+ %pop
+ %else
+ %error "expected `if' or `else' before `endif'"
+ %endif
+
+%endmacro
+</pre>
+<p>This code is more robust than the <code><nobr>REPEAT</nobr></code> and
+<code><nobr>UNTIL</nobr></code> macros given in
+<a href="#section-4.7.2">section 4.7.2</a>, because it uses conditional
+assembly to check that the macros are issued in the right order (for
+example, not calling <code><nobr>endif</nobr></code> before
+<code><nobr>if</nobr></code>) and issues a <code><nobr>%error</nobr></code>
+if they're not.
+<p>In addition, the <code><nobr>endif</nobr></code> macro has to be able to
+cope with the two distinct cases of either directly following an
+<code><nobr>if</nobr></code>, or following an
+<code><nobr>else</nobr></code>. It achieves this, again, by using
+conditional assembly to do different things depending on whether the
+context on top of the stack is <code><nobr>if</nobr></code> or
+<code><nobr>else</nobr></code>.
+<p>The <code><nobr>else</nobr></code> macro has to preserve the context on
+the stack, in order to have the <code><nobr>%$ifnot</nobr></code> referred
+to by the <code><nobr>if</nobr></code> macro be the same as the one defined
+by the <code><nobr>endif</nobr></code> macro, but has to change the
+context's name so that <code><nobr>endif</nobr></code> will know there was
+an intervening <code><nobr>else</nobr></code>. It does this by the use of
+<code><nobr>%repl</nobr></code>.
+<p>A sample usage of these macros might look like:
+<p><pre>
+ cmp ax,bx
+
+ if ae
+ cmp bx,cx
+
+ if ae
+ mov ax,cx
+ else
+ mov ax,bx
+ endif
+
+ else
+ cmp ax,cx
+
+ if ae
+ mov ax,cx
+ endif
+
+ endif
+</pre>
+<p>The block-<code><nobr>IF</nobr></code> macros handle nesting quite
+happily, by means of pushing another context, describing the inner
+<code><nobr>if</nobr></code>, on top of the one describing the outer
+<code><nobr>if</nobr></code>; thus <code><nobr>else</nobr></code> and
+<code><nobr>endif</nobr></code> always refer to the last unmatched
+<code><nobr>if</nobr></code> or <code><nobr>else</nobr></code>.
+<h3><a name="section-4.8">4.8 Stack Relative Preprocessor Directives</a></h3>
+<p>The following preprocessor directives provide a way to use labels to
+refer to local variables allocated on the stack.
+<ul>
+<li><code><nobr>%arg</nobr></code> (see <a href="#section-4.8.1">section
+4.8.1</a>)
+<li><code><nobr>%stacksize</nobr></code> (see
+<a href="#section-4.8.2">section 4.8.2</a>)
+<li><code><nobr>%local</nobr></code> (see <a href="#section-4.8.3">section
+4.8.3</a>)
+</ul>
+<h4><a name="section-4.8.1">4.8.1 <code><nobr>%arg</nobr></code> Directive</a></h4>
+<p>The <code><nobr>%arg</nobr></code> directive is used to simplify the
+handling of parameters passed on the stack. Stack based parameter passing
+is used by many high level languages, including C, C++ and Pascal.
+<p>While NASM has macros which attempt to duplicate this functionality (see
+<a href="nasmdoc8.html#section-8.4.5">section 8.4.5</a>), the syntax is not
+particularly convenient to use. and is not TASM compatible. Here is an
+example which shows the use of <code><nobr>%arg</nobr></code> without any
+external macros:
+<p><pre>
+some_function:
+
+ %push mycontext ; save the current context
+ %stacksize large ; tell NASM to use bp
+ %arg i:word, j_ptr:word
+
+ mov ax,[i]
+ mov bx,[j_ptr]
+ add ax,[bx]
+ ret
+
+ %pop ; restore original context
+</pre>
+<p>This is similar to the procedure defined in
+<a href="nasmdoc8.html#section-8.4.5">section 8.4.5</a> and adds the value
+in i to the value pointed to by j_ptr and returns the sum in the ax
+register. See <a href="#section-4.7.1">section 4.7.1</a> for an explanation
+of <code><nobr>push</nobr></code> and <code><nobr>pop</nobr></code> and the
+use of context stacks.
+<h4><a name="section-4.8.2">4.8.2 <code><nobr>%stacksize</nobr></code> Directive</a></h4>
+<p>The <code><nobr>%stacksize</nobr></code> directive is used in
+conjunction with the <code><nobr>%arg</nobr></code> (see
+<a href="#section-4.8.1">section 4.8.1</a>) and the
+<code><nobr>%local</nobr></code> (see <a href="#section-4.8.3">section
+4.8.3</a>) directives. It tells NASM the default size to use for subsequent
+<code><nobr>%arg</nobr></code> and <code><nobr>%local</nobr></code>
+directives. The <code><nobr>%stacksize</nobr></code> directive takes one
+required argument which is one of <code><nobr>flat</nobr></code>,
+<code><nobr>flat64</nobr></code>, <code><nobr>large</nobr></code> or
+<code><nobr>small</nobr></code>.
+<p><pre>
+%stacksize flat
+</pre>
+<p>This form causes NASM to use stack-based parameter addressing relative
+to <code><nobr>ebp</nobr></code> and it assumes that a near form of call
+was used to get to this label (i.e. that <code><nobr>eip</nobr></code> is
+on the stack).
+<p><pre>
+%stacksize flat64
+</pre>
+<p>This form causes NASM to use stack-based parameter addressing relative
+to <code><nobr>rbp</nobr></code> and it assumes that a near form of call
+was used to get to this label (i.e. that <code><nobr>rip</nobr></code> is
+on the stack).
+<p><pre>
+%stacksize large
+</pre>
+<p>This form uses <code><nobr>bp</nobr></code> to do stack-based parameter
+addressing and assumes that a far form of call was used to get to this
+address (i.e. that <code><nobr>ip</nobr></code> and
+<code><nobr>cs</nobr></code> are on the stack).
+<p><pre>
+%stacksize small
+</pre>
+<p>This form also uses <code><nobr>bp</nobr></code> to address stack
+parameters, but it is different from <code><nobr>large</nobr></code>
+because it also assumes that the old value of bp is pushed onto the stack
+(i.e. it expects an <code><nobr>ENTER</nobr></code> instruction). In other
+words, it expects that <code><nobr>bp</nobr></code>,
+<code><nobr>ip</nobr></code> and <code><nobr>cs</nobr></code> are on the
+top of the stack, underneath any local space which may have been allocated
+by <code><nobr>ENTER</nobr></code>. This form is probably most useful when
+used in combination with the <code><nobr>%local</nobr></code> directive
+(see <a href="#section-4.8.3">section 4.8.3</a>).
+<h4><a name="section-4.8.3">4.8.3 <code><nobr>%local</nobr></code> Directive</a></h4>
+<p>The <code><nobr>%local</nobr></code> directive is used to simplify the
+use of local temporary stack variables allocated in a stack frame.
+Automatic local variables in C are an example of this kind of variable. The
+<code><nobr>%local</nobr></code> directive is most useful when used with
+the <code><nobr>%stacksize</nobr></code> (see
+<a href="#section-4.8.2">section 4.8.2</a> and is also compatible with the
+<code><nobr>%arg</nobr></code> directive (see
+<a href="#section-4.8.1">section 4.8.1</a>). It allows simplified reference
+to variables on the stack which have been allocated typically by using the
+<code><nobr>ENTER</nobr></code> instruction. An example of its use is the
+following:
+<p><pre>
+silly_swap:
+
+ %push mycontext ; save the current context
+ %stacksize small ; tell NASM to use bp
+ %assign %$localsize 0 ; see text for explanation
+ %local old_ax:word, old_dx:word
+
+ enter %$localsize,0 ; see text for explanation
+ mov [old_ax],ax ; swap ax &amp; bx
+ mov [old_dx],dx ; and swap dx &amp; cx
+ mov ax,bx
+ mov dx,cx
+ mov bx,[old_ax]
+ mov cx,[old_dx]
+ leave ; restore old bp
+ ret ;
+
+ %pop ; restore original context
+</pre>
+<p>The <code><nobr>%$localsize</nobr></code> variable is used internally by
+the <code><nobr>%local</nobr></code> directive and <em>must</em> be defined
+within the current context before the <code><nobr>%local</nobr></code>
+directive may be used. Failure to do so will result in one expression
+syntax error for each <code><nobr>%local</nobr></code> variable declared.
+It then may be used in the construction of an appropriately sized ENTER
+instruction as shown in the example.
+<h3><a name="section-4.9">4.9 Reporting User-Defined Errors: <code><nobr>%error</nobr></code>, <code><nobr>%warning</nobr></code>, <code><nobr>%fatal</nobr></code></a></h3>
+<p>The preprocessor directive <code><nobr>%error</nobr></code> will cause
+NASM to report an error if it occurs in assembled code. So if other users
+are going to try to assemble your source files, you can ensure that they
+define the right macros by means of code like this:
+<p><pre>
+%ifdef F1
+ ; do some setup
+%elifdef F2
+ ; do some different setup
+%else
+ %error "Neither F1 nor F2 was defined."
+%endif
+</pre>
+<p>Then any user who fails to understand the way your code is supposed to
+be assembled will be quickly warned of their mistake, rather than having to
+wait until the program crashes on being run and then not knowing what went
+wrong.
+<p>Similarly, <code><nobr>%warning</nobr></code> issues a warning, but
+allows assembly to continue:
+<p><pre>
+%ifdef F1
+ ; do some setup
+%elifdef F2
+ ; do some different setup
+%else
+ %warning "Neither F1 nor F2 was defined, assuming F1."
+ %define F1
+%endif
+</pre>
+<p><code><nobr>%error</nobr></code> and <code><nobr>%warning</nobr></code>
+are issued only on the final assembly pass. This makes them safe to use in
+conjunction with tests that depend on symbol values.
+<p><code><nobr>%fatal</nobr></code> terminates assembly immediately,
+regardless of pass. This is useful when there is no point in continuing the
+assembly further, and doing so is likely just going to cause a spew of
+confusing error messages.
+<p>It is optional for the message string after
+<code><nobr>%error</nobr></code>, <code><nobr>%warning</nobr></code> or
+<code><nobr>%fatal</nobr></code> to be quoted. If it is <em>not</em>, then
+single-line macros are expanded in it, which can be used to display more
+information to the user. For example:
+<p><pre>
+%if foo &gt; 64
+ %assign foo_over foo-64
+ %error foo is foo_over bytes too large
+%endif
+</pre>
+<h3><a name="section-4.10">4.10 Other Preprocessor Directives</a></h3>
+<p>NASM also has preprocessor directives which allow access to information
+from external sources. Currently they include:
+<ul>
+<li><code><nobr>%line</nobr></code> enables NASM to correctly handle the
+output of another preprocessor (see <a href="#section-4.10.1">section
+4.10.1</a>).
+<li><code><nobr>%!</nobr></code> enables NASM to read in the value of an
+environment variable, which can then be used in your program (see
+<a href="#section-4.10.2">section 4.10.2</a>).
+</ul>
+<h4><a name="section-4.10.1">4.10.1 <code><nobr>%line</nobr></code> Directive</a></h4>
+<p>The <code><nobr>%line</nobr></code> directive is used to notify NASM
+that the input line corresponds to a specific line number in another file.
+Typically this other file would be an original source file, with the
+current NASM input being the output of a pre-processor. The
+<code><nobr>%line</nobr></code> directive allows NASM to output messages
+which indicate the line number of the original source file, instead of the
+file that is being read by NASM.
+<p>This preprocessor directive is not generally of use to programmers, by
+may be of interest to preprocessor authors. The usage of the
+<code><nobr>%line</nobr></code> preprocessor directive is as follows:
+<p><pre>
+%line nnn[+mmm] [filename]
+</pre>
+<p>In this directive, <code><nobr>nnn</nobr></code> identifies the line of
+the original source file which this line corresponds to.
+<code><nobr>mmm</nobr></code> is an optional parameter which specifies a
+line increment value; each line of the input file read in is considered to
+correspond to <code><nobr>mmm</nobr></code> lines of the original source
+file. Finally, <code><nobr>filename</nobr></code> is an optional parameter
+which specifies the file name of the original source file.
+<p>After reading a <code><nobr>%line</nobr></code> preprocessor directive,
+NASM will report all file name and line numbers relative to the values
+specified therein.
+<h4><a name="section-4.10.2">4.10.2 <code><nobr>%!</nobr></code><code><nobr>&lt;env&gt;</nobr></code>: Read an environment variable.</a></h4>
+<p>The <code><nobr>%!&lt;env&gt;</nobr></code> directive makes it possible
+to read the value of an environment variable at assembly time. This could,
+for example, be used to store the contents of an environment variable into
+a string, which could be used at some other point in your code.
+<p>For example, suppose that you have an environment variable
+<code><nobr>FOO</nobr></code>, and you want the contents of
+<code><nobr>FOO</nobr></code> to be embedded in your program. You could do
+that as follows:
+<p><pre>
+%defstr FOO %!FOO
+</pre>
+<p>See <a href="#section-4.1.8">section 4.1.8</a> for notes on the
+<code><nobr>%defstr</nobr></code> directive.
+<h3><a name="section-4.11">4.11 Standard Macros</a></h3>
+<p>NASM defines a set of standard macros, which are already defined when it
+starts to process any source file. If you really need a program to be
+assembled with no pre-defined macros, you can use the
+<code><nobr>%clear</nobr></code> directive to empty the preprocessor of
+everything but context-local preprocessor variables and single-line macros.
+<p>Most user-level assembler directives (see
+<a href="nasmdoc6.html">chapter 6</a>) are implemented as macros which
+invoke primitive directives; these are described in
+<a href="nasmdoc6.html">chapter 6</a>. The rest of the standard macro set
+is described here.
+<h4><a name="section-4.11.1">4.11.1 NASM Version Macros</a></h4>
+<p>The single-line macros <code><nobr>__NASM_MAJOR__</nobr></code>,
+<code><nobr>__NASM_MINOR__</nobr></code>,
+<code><nobr>__NASM_SUBMINOR__</nobr></code> and
+<code><nobr>___NASM_PATCHLEVEL__</nobr></code> expand to the major, minor,
+subminor and patch level parts of the version number of NASM being used.
+So, under NASM 0.98.32p1 for example,
+<code><nobr>__NASM_MAJOR__</nobr></code> would be defined to be 0,
+<code><nobr>__NASM_MINOR__</nobr></code> would be defined as 98,
+<code><nobr>__NASM_SUBMINOR__</nobr></code> would be defined to 32, and
+<code><nobr>___NASM_PATCHLEVEL__</nobr></code> would be defined as 1.
+<p>Additionally, the macro <code><nobr>__NASM_SNAPSHOT__</nobr></code> is
+defined for automatically generated snapshot releases <em>only</em>.
+<h4><a name="section-4.11.2">4.11.2 <code><nobr>__NASM_VERSION_ID__</nobr></code>: NASM Version ID</a></h4>
+<p>The single-line macro <code><nobr>__NASM_VERSION_ID__</nobr></code>
+expands to a dword integer representing the full version number of the
+version of nasm being used. The value is the equivalent to
+<code><nobr>__NASM_MAJOR__</nobr></code>,
+<code><nobr>__NASM_MINOR__</nobr></code>,
+<code><nobr>__NASM_SUBMINOR__</nobr></code> and
+<code><nobr>___NASM_PATCHLEVEL__</nobr></code> concatenated to produce a
+single doubleword. Hence, for 0.98.32p1, the returned number would be
+equivalent to:
+<p><pre>
+ dd 0x00622001
+</pre>
+<p>or
+<p><pre>
+ db 1,32,98,0
+</pre>
+<p>Note that the above lines are generate exactly the same code, the second
+line is used just to give an indication of the order that the separate
+values will be present in memory.
+<h4><a name="section-4.11.3">4.11.3 <code><nobr>__NASM_VER__</nobr></code>: NASM Version string</a></h4>
+<p>The single-line macro <code><nobr>__NASM_VER__</nobr></code> expands to
+a string which defines the version number of nasm being used. So, under
+NASM 0.98.32 for example,
+<p><pre>
+ db __NASM_VER__
+</pre>
+<p>would expand to
+<p><pre>
+ db "0.98.32"
+</pre>
+<h4><a name="section-4.11.4">4.11.4 <code><nobr>__FILE__</nobr></code> and <code><nobr>__LINE__</nobr></code>: File Name and Line Number</a></h4>
+<p>Like the C preprocessor, NASM allows the user to find out the file name
+and line number containing the current instruction. The macro
+<code><nobr>__FILE__</nobr></code> expands to a string constant giving the
+name of the current input file (which may change through the course of
+assembly if <code><nobr>%include</nobr></code> directives are used), and
+<code><nobr>__LINE__</nobr></code> expands to a numeric constant giving the
+current line number in the input file.
+<p>These macros could be used, for example, to communicate debugging
+information to a macro, since invoking <code><nobr>__LINE__</nobr></code>
+inside a macro definition (either single-line or multi-line) will return
+the line number of the macro <em>call</em>, rather than
+<em>definition</em>. So to determine where in a piece of code a crash is
+occurring, for example, one could write a routine
+<code><nobr>stillhere</nobr></code>, which is passed a line number in
+<code><nobr>EAX</nobr></code> and outputs something like `line 155: still
+here'. You could then write a macro
+<p><pre>
+%macro notdeadyet 0
+
+ push eax
+ mov eax,__LINE__
+ call stillhere
+ pop eax
+
+%endmacro
+</pre>
+<p>and then pepper your code with calls to
+<code><nobr>notdeadyet</nobr></code> until you find the crash point.
+<h4><a name="section-4.11.5">4.11.5 <code><nobr>__BITS__</nobr></code>: Current BITS Mode</a></h4>
+<p>The <code><nobr>__BITS__</nobr></code> standard macro is updated every
+time that the BITS mode is set using the <code><nobr>BITS XX</nobr></code>
+or <code><nobr>[BITS XX]</nobr></code> directive, where XX is a valid mode
+number of 16, 32 or 64. <code><nobr>__BITS__</nobr></code> receives the
+specified mode number and makes it globally available. This can be very
+useful for those who utilize mode-dependent macros.
+<h4><a name="section-4.11.6">4.11.6 <code><nobr>__OUTPUT_FORMAT__</nobr></code>: Current Output Format</a></h4>
+<p>The <code><nobr>__OUTPUT_FORMAT__</nobr></code> standard macro holds the
+current Output Format, as given by the <code><nobr>-f</nobr></code> option
+or NASM's default. Type <code><nobr>nasm -hf</nobr></code> for a list.
+<p><pre>
+%ifidn __OUTPUT_FORMAT__, win32
+ %define NEWLINE 13, 10
+%elifidn __OUTPUT_FORMAT__, elf32
+ %define NEWLINE 10
+%endif
+</pre>
+<h4><a name="section-4.11.7">4.11.7 Assembly Date and Time Macros</a></h4>
+<p>NASM provides a variety of macros that represent the timestamp of the
+assembly session.
+<ul>
+<li>The <code><nobr>__DATE__</nobr></code> and
+<code><nobr>__TIME__</nobr></code> macros give the assembly date and time
+as strings, in ISO 8601 format (<code><nobr>"YYYY-MM-DD"</nobr></code> and
+<code><nobr>"HH:MM:SS"</nobr></code>, respectively.)
+<li>The <code><nobr>__DATE_NUM__</nobr></code> and
+<code><nobr>__TIME_NUM__</nobr></code> macros give the assembly date and
+time in numeric form; in the format <code><nobr>YYYYMMDD</nobr></code> and
+<code><nobr>HHMMSS</nobr></code> respectively.
+<li>The <code><nobr>__UTC_DATE__</nobr></code> and
+<code><nobr>__UTC_TIME__</nobr></code> macros give the assembly date and
+time in universal time (UTC) as strings, in ISO 8601 format
+(<code><nobr>"YYYY-MM-DD"</nobr></code> and
+<code><nobr>"HH:MM:SS"</nobr></code>, respectively.) If the host platform
+doesn't provide UTC time, these macros are undefined.
+<li>The <code><nobr>__UTC_DATE_NUM__</nobr></code> and
+<code><nobr>__UTC_TIME_NUM__</nobr></code> macros give the assembly date
+and time universal time (UTC) in numeric form; in the format
+<code><nobr>YYYYMMDD</nobr></code> and <code><nobr>HHMMSS</nobr></code>
+respectively. If the host platform doesn't provide UTC time, these macros
+are undefined.
+<li>The <code><nobr>__POSIX_TIME__</nobr></code> macro is defined as a
+number containing the number of seconds since the POSIX epoch, 1 January
+1970 00:00:00 UTC; excluding any leap seconds. This is computed using UTC
+time if available on the host platform, otherwise it is computed using the
+local time as if it was UTC.
+</ul>
+<p>All instances of time and date macros in the same assembly session
+produce consistent output. For example, in an assembly session started at
+42 seconds after midnight on January 1, 2010 in Moscow (timezone UTC+3)
+these macros would have the following values, assuming, of course, a
+properly configured environment with a correct clock:
+<p><pre>
+ __DATE__ "2010-01-01"
+ __TIME__ "00:00:42"
+ __DATE_NUM__ 20100101
+ __TIME_NUM__ 000042
+ __UTC_DATE__ "2009-12-31"
+ __UTC_TIME__ "21:00:42"
+ __UTC_DATE_NUM__ 20091231
+ __UTC_TIME_NUM__ 210042
+ __POSIX_TIME__ 1262293242
+</pre>
+<h4><a name="section-4.11.8">4.11.8 <code><nobr>__USE_</nobr></code><em>package</em><code><nobr>__</nobr></code>: Package Include Test</a></h4>
+<p>When a standard macro package (see <a href="nasmdoc5.html">chapter
+5</a>) is included with the <code><nobr>%use</nobr></code> directive (see
+<a href="#section-4.6.4">section 4.6.4</a>), a single-line macro of the
+form
+<code><nobr>__USE_</nobr></code><em>package</em><code><nobr>__</nobr></code>
+is automatically defined. This allows testing if a particular package is
+invoked or not.
+<p>For example, if the <code><nobr>altreg</nobr></code> package is included
+(see <a href="nasmdoc5.html#section-5.1">section 5.1</a>), then the macro
+<code><nobr>__USE_ALTREG__</nobr></code> is defined.
+<h4><a name="section-4.11.9">4.11.9 <code><nobr>__PASS__</nobr></code>: Assembly Pass</a></h4>
+<p>The macro <code><nobr>__PASS__</nobr></code> is defined to be
+<code><nobr>1</nobr></code> on preparatory passes, and
+<code><nobr>2</nobr></code> on the final pass. In preprocess-only mode, it
+is set to <code><nobr>3</nobr></code>, and when running only to generate
+dependencies (due to the <code><nobr>-M</nobr></code> or
+<code><nobr>-MG</nobr></code> option, see
+<a href="nasmdoc2.html#section-2.1.4">section 2.1.4</a>) it is set to
+<code><nobr>0</nobr></code>.
+<p><em>Avoid using this macro if at all possible. It is tremendously easy
+to generate very strange errors by misusing it, and the semantics may
+change in future versions of NASM.</em>
+<h4><a name="section-4.11.10">4.11.10 <code><nobr>STRUC</nobr></code> and <code><nobr>ENDSTRUC</nobr></code>: Declaring Structure Data Types</a></h4>
+<p>The core of NASM contains no intrinsic means of defining data
+structures; instead, the preprocessor is sufficiently powerful that data
+structures can be implemented as a set of macros. The macros
+<code><nobr>STRUC</nobr></code> and <code><nobr>ENDSTRUC</nobr></code> are
+used to define a structure data type.
+<p><code><nobr>STRUC</nobr></code> takes one or two parameters. The first
+parameter is the name of the data type. The second, optional parameter is
+the base offset of the structure. The name of the data type is defined as a
+symbol with the value of the base offset, and the name of the data type
+with the suffix <code><nobr>_size</nobr></code> appended to it is defined
+as an <code><nobr>EQU</nobr></code> giving the size of the structure. Once
+<code><nobr>STRUC</nobr></code> has been issued, you are defining the
+structure, and should define fields using the
+<code><nobr>RESB</nobr></code> family of pseudo-instructions, and then
+invoke <code><nobr>ENDSTRUC</nobr></code> to finish the definition.
+<p>For example, to define a structure called
+<code><nobr>mytype</nobr></code> containing a longword, a word, a byte and
+a string of bytes, you might code
+<p><pre>
+struc mytype
+
+ mt_long: resd 1
+ mt_word: resw 1
+ mt_byte: resb 1
+ mt_str: resb 32
+
+endstruc
+</pre>
+<p>The above code defines six symbols: <code><nobr>mt_long</nobr></code> as
+0 (the offset from the beginning of a <code><nobr>mytype</nobr></code>
+structure to the longword field), <code><nobr>mt_word</nobr></code> as 4,
+<code><nobr>mt_byte</nobr></code> as 6, <code><nobr>mt_str</nobr></code> as
+7, <code><nobr>mytype_size</nobr></code> as 39, and
+<code><nobr>mytype</nobr></code> itself as zero.
+<p>The reason why the structure type name is defined at zero by default is
+a side effect of allowing structures to work with the local label
+mechanism: if your structure members tend to have the same names in more
+than one structure, you can define the above structure like this:
+<p><pre>
+struc mytype
+
+ .long: resd 1
+ .word: resw 1
+ .byte: resb 1
+ .str: resb 32
+
+endstruc
+</pre>
+<p>This defines the offsets to the structure fields as
+<code><nobr>mytype.long</nobr></code>,
+<code><nobr>mytype.word</nobr></code>,
+<code><nobr>mytype.byte</nobr></code> and
+<code><nobr>mytype.str</nobr></code>.
+<p>NASM, since it has no <em>intrinsic</em> structure support, does not
+support any form of period notation to refer to the elements of a structure
+once you have one (except the above local-label notation), so code such as
+<code><nobr>mov ax,[mystruc.mt_word]</nobr></code> is not valid.
+<code><nobr>mt_word</nobr></code> is a constant just like any other
+constant, so the correct syntax is
+<code><nobr>mov ax,[mystruc+mt_word]</nobr></code> or
+<code><nobr>mov ax,[mystruc+mytype.word]</nobr></code>.
+<p>Sometimes you only have the address of the structure displaced by an
+offset. For example, consider this standard stack frame setup:
+<p><pre>
+push ebp
+mov ebp, esp
+sub esp, 40
+</pre>
+<p>In this case, you could access an element by subtracting the offset:
+<p><pre>
+mov [ebp - 40 + mytype.word], ax
+</pre>
+<p>However, if you do not want to repeat this offset, you can use -40 as a
+base offset:
+<p><pre>
+struc mytype, -40
+</pre>
+<p>And access an element this way:
+<p><pre>
+mov [ebp + mytype.word], ax
+</pre>
+<h4><a name="section-4.11.11">4.11.11 <code><nobr>ISTRUC</nobr></code>, <code><nobr>AT</nobr></code> and <code><nobr>IEND</nobr></code>: Declaring Instances of Structures</a></h4>
+<p>Having defined a structure type, the next thing you typically want to do
+is to declare instances of that structure in your data segment. NASM
+provides an easy way to do this in the <code><nobr>ISTRUC</nobr></code>
+mechanism. To declare a structure of type <code><nobr>mytype</nobr></code>
+in a program, you code something like this:
+<p><pre>
+mystruc:
+ istruc mytype
+
+ at mt_long, dd 123456
+ at mt_word, dw 1024
+ at mt_byte, db 'x'
+ at mt_str, db 'hello, world', 13, 10, 0
+
+ iend
+</pre>
+<p>The function of the <code><nobr>AT</nobr></code> macro is to make use of
+the <code><nobr>TIMES</nobr></code> prefix to advance the assembly position
+to the correct point for the specified structure field, and then to declare
+the specified data. Therefore the structure fields must be declared in the
+same order as they were specified in the structure definition.
+<p>If the data to go in a structure field requires more than one source
+line to specify, the remaining source lines can easily come after the
+<code><nobr>AT</nobr></code> line. For example:
+<p><pre>
+ at mt_str, db 123,134,145,156,167,178,189
+ db 190,100,0
+</pre>
+<p>Depending on personal taste, you can also omit the code part of the
+<code><nobr>AT</nobr></code> line completely, and start the structure field
+on the next line:
+<p><pre>
+ at mt_str
+ db 'hello, world'
+ db 13,10,0
+</pre>
+<h4><a name="section-4.11.12">4.11.12 <code><nobr>ALIGN</nobr></code> and <code><nobr>ALIGNB</nobr></code>: Data Alignment</a></h4>
+<p>The <code><nobr>ALIGN</nobr></code> and <code><nobr>ALIGNB</nobr></code>
+macros provides a convenient way to align code or data on a word, longword,
+paragraph or other boundary. (Some assemblers call this directive
+<code><nobr>EVEN</nobr></code>.) The syntax of the
+<code><nobr>ALIGN</nobr></code> and <code><nobr>ALIGNB</nobr></code> macros
+is
+<p><pre>
+ align 4 ; align on 4-byte boundary
+ align 16 ; align on 16-byte boundary
+ align 8,db 0 ; pad with 0s rather than NOPs
+ align 4,resb 1 ; align to 4 in the BSS
+ alignb 4 ; equivalent to previous line
+</pre>
+<p>Both macros require their first argument to be a power of two; they both
+compute the number of additional bytes required to bring the length of the
+current section up to a multiple of that power of two, and then apply the
+<code><nobr>TIMES</nobr></code> prefix to their second argument to perform
+the alignment.
+<p>If the second argument is not specified, the default for
+<code><nobr>ALIGN</nobr></code> is <code><nobr>NOP</nobr></code>, and the
+default for <code><nobr>ALIGNB</nobr></code> is
+<code><nobr>RESB 1</nobr></code>. So if the second argument is specified,
+the two macros are equivalent. Normally, you can just use
+<code><nobr>ALIGN</nobr></code> in code and data sections and
+<code><nobr>ALIGNB</nobr></code> in BSS sections, and never need the second
+argument except for special purposes.
+<p><code><nobr>ALIGN</nobr></code> and <code><nobr>ALIGNB</nobr></code>,
+being simple macros, perform no error checking: they cannot warn you if
+their first argument fails to be a power of two, or if their second
+argument generates more than one byte of code. In each of these cases they
+will silently do the wrong thing.
+<p><code><nobr>ALIGNB</nobr></code> (or <code><nobr>ALIGN</nobr></code>
+with a second argument of <code><nobr>RESB 1</nobr></code>) can be used
+within structure definitions:
+<p><pre>
+struc mytype2
+
+ mt_byte:
+ resb 1
+ alignb 2
+ mt_word:
+ resw 1
+ alignb 4
+ mt_long:
+ resd 1
+ mt_str:
+ resb 32
+
+endstruc
+</pre>
+<p>This will ensure that the structure members are sensibly aligned
+relative to the base of the structure.
+<p>A final caveat: <code><nobr>ALIGN</nobr></code> and
+<code><nobr>ALIGNB</nobr></code> work relative to the beginning of the
+<em>section</em>, not the beginning of the address space in the final
+executable. Aligning to a 16-byte boundary when the section you're in is
+only guaranteed to be aligned to a 4-byte boundary, for example, is a waste
+of effort. Again, NASM does not check that the section's alignment
+characteristics are sensible for the use of <code><nobr>ALIGN</nobr></code>
+or <code><nobr>ALIGNB</nobr></code>.
+<p>See also the <code><nobr>smartalign</nobr></code> standard macro
+package, <a href="nasmdoc5.html#section-5.2">section 5.2</a>.
+<p align=center><a href="nasmdoc5.html">Next Chapter</a> |
+<a href="nasmdoc3.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdoc5.html b/doc/html/nasmdoc5.html
new file mode 100644
index 0000000..7effbbb
--- /dev/null
+++ b/doc/html/nasmdoc5.html
@@ -0,0 +1,83 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdoc6.html">Next Chapter</a> |
+<a href="nasmdoc4.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="chapter-5">Chapter 5: Standard Macro Packages</a></h2>
+<p>The <code><nobr>%use</nobr></code> directive (see
+<a href="nasmdoc4.html#section-4.6.4">section 4.6.4</a>) includes one of
+the standard macro packages included with the NASM distribution and
+compiled into the NASM binary. It operates like the
+<code><nobr>%include</nobr></code> directive (see
+<a href="nasmdoc4.html#section-4.6.1">section 4.6.1</a>), but the included
+contents is provided by NASM itself.
+<p>The names of standard macro packages are case insensitive, and can be
+quoted or not.
+<h3><a name="section-5.1">5.1 <code><nobr>altreg</nobr></code>: Alternate Register Names</a></h3>
+<p>The <code><nobr>altreg</nobr></code> standard macro package provides
+alternate register names. It provides numeric register names for all
+registers (not just
+<code><nobr>R8</nobr></code>-<code><nobr>R15</nobr></code>), the
+Intel-defined aliases
+<code><nobr>R8L</nobr></code>-<code><nobr>R15L</nobr></code> for the low
+bytes of register (as opposed to the NASM/AMD standard names
+<code><nobr>R8B</nobr></code>-<code><nobr>R15B</nobr></code>), and the
+names <code><nobr>R0H</nobr></code>-<code><nobr>R3H</nobr></code> (by
+analogy with <code><nobr>R0L</nobr></code>-<code><nobr>R3L</nobr></code>)
+for <code><nobr>AH</nobr></code>, <code><nobr>CH</nobr></code>,
+<code><nobr>DH</nobr></code>, and <code><nobr>BH</nobr></code>.
+<p>Example use:
+<p><pre>
+%use altreg
+
+proc:
+ mov r0l,r3h ; mov al,bh
+ ret
+</pre>
+<p>See also <a href="nasmdo11.html#section-11.1">section 11.1</a>.
+<h3><a name="section-5.2">5.2 <code><nobr>smartalign</nobr></code>: Smart <code><nobr>ALIGN</nobr></code> Macro</a></h3>
+<p>The <code><nobr>smartalign</nobr></code> standard macro package provides
+for an <code><nobr>ALIGN</nobr></code> macro which is more powerful than
+the default (and backwards-compatible) one (see
+<a href="nasmdoc4.html#section-4.11.12">section 4.11.12</a>). When the
+<code><nobr>smartalign</nobr></code> package is enabled, when
+<code><nobr>ALIGN</nobr></code> is used without a second argument, NASM
+will generate a sequence of instructions more efficient than a series of
+<code><nobr>NOP</nobr></code>. Furthermore, if the padding exceeds a
+specific threshold, then NASM will generate a jump over the entire padding
+sequence.
+<p>The specific instructions generated can be controlled with the new
+<code><nobr>ALIGNMODE</nobr></code> macro. This macro takes two parameters:
+one mode, and an optional jump threshold override. The modes are as
+follows:
+<ul>
+<li><code><nobr>generic</nobr></code>: Works on all x86 CPUs and should
+have reasonable performance. The default jump threshold is 8. This is the
+default.
+<li><code><nobr>nop</nobr></code>: Pad out with
+<code><nobr>NOP</nobr></code> instructions. The only difference compared to
+the standard <code><nobr>ALIGN</nobr></code> macro is that NASM can still
+jump over a large padding area. The default jump threshold is 16.
+<li><code><nobr>k7</nobr></code>: Optimize for the AMD K7 (Athlon/Althon
+XP). These instructions should still work on all x86 CPUs. The default jump
+threshold is 16.
+<li><code><nobr>k8</nobr></code>: Optimize for the AMD K8 (Opteron/Althon
+64). These instructions should still work on all x86 CPUs. The default jump
+threshold is 16.
+<li><code><nobr>p6</nobr></code>: Optimize for Intel CPUs. This uses the
+long <code><nobr>NOP</nobr></code> instructions first introduced in Pentium
+Pro. This is incompatible with all CPUs of family 5 or lower, as well as
+some VIA CPUs and several virtualization solutions. The default jump
+threshold is 16.
+</ul>
+<p>The macro <code><nobr>__ALIGNMODE__</nobr></code> is defined to contain
+the current alignment mode. A number of other macros beginning with
+<code><nobr>__ALIGN_</nobr></code> are used internally by this macro
+package.
+<p align=center><a href="nasmdoc6.html">Next Chapter</a> |
+<a href="nasmdoc4.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdoc6.html b/doc/html/nasmdoc6.html
new file mode 100644
index 0000000..144a661
--- /dev/null
+++ b/doc/html/nasmdoc6.html
@@ -0,0 +1,371 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdoc7.html">Next Chapter</a> |
+<a href="nasmdoc5.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="chapter-6">Chapter 6: Assembler Directives</a></h2>
+<p>NASM, though it attempts to avoid the bureaucracy of assemblers like
+MASM and TASM, is nevertheless forced to support a <em>few</em> directives.
+These are described in this chapter.
+<p>NASM's directives come in two types: <em>user-level</em> directives and
+<em>primitive</em> directives. Typically, each directive has a user-level
+form and a primitive form. In almost all cases, we recommend that users use
+the user-level forms of the directives, which are implemented as macros
+which call the primitive forms.
+<p>Primitive directives are enclosed in square brackets; user-level
+directives are not.
+<p>In addition to the universal directives described in this chapter, each
+object file format can optionally supply extra directives in order to
+control particular features of that file format. These
+<em>format-specific</em> directives are documented along with the formats
+that implement them, in <a href="nasmdoc7.html">chapter 7</a>.
+<h3><a name="section-6.1">6.1 <code><nobr>BITS</nobr></code>: Specifying Target Processor Mode</a></h3>
+<p>The <code><nobr>BITS</nobr></code> directive specifies whether NASM
+should generate code designed to run on a processor operating in 16-bit
+mode, 32-bit mode or 64-bit mode. The syntax is
+<code><nobr>BITS XX</nobr></code>, where XX is 16, 32 or 64.
+<p>In most cases, you should not need to use <code><nobr>BITS</nobr></code>
+explicitly. The <code><nobr>aout</nobr></code>,
+<code><nobr>coff</nobr></code>, <code><nobr>elf</nobr></code>,
+<code><nobr>macho</nobr></code>, <code><nobr>win32</nobr></code> and
+<code><nobr>win64</nobr></code> object formats, which are designed for use
+in 32-bit or 64-bit operating systems, all cause NASM to select 32-bit or
+64-bit mode, respectively, by default. The <code><nobr>obj</nobr></code>
+object format allows you to specify each segment you define as either
+<code><nobr>USE16</nobr></code> or <code><nobr>USE32</nobr></code>, and
+NASM will set its operating mode accordingly, so the use of the
+<code><nobr>BITS</nobr></code> directive is once again unnecessary.
+<p>The most likely reason for using the <code><nobr>BITS</nobr></code>
+directive is to write 32-bit or 64-bit code in a flat binary file; this is
+because the <code><nobr>bin</nobr></code> output format defaults to 16-bit
+mode in anticipation of it being used most frequently to write DOS
+<code><nobr>.COM</nobr></code> programs, DOS <code><nobr>.SYS</nobr></code>
+device drivers and boot loader software.
+<p>You do <em>not</em> need to specify <code><nobr>BITS 32</nobr></code>
+merely in order to use 32-bit instructions in a 16-bit DOS program; if you
+do, the assembler will generate incorrect code because it will be writing
+code targeted at a 32-bit platform, to be run on a 16-bit one.
+<p>When NASM is in <code><nobr>BITS 16</nobr></code> mode, instructions
+which use 32-bit data are prefixed with an 0x66 byte, and those referring
+to 32-bit addresses have an 0x67 prefix. In
+<code><nobr>BITS 32</nobr></code> mode, the reverse is true: 32-bit
+instructions require no prefixes, whereas instructions using 16-bit data
+need an 0x66 and those working on 16-bit addresses need an 0x67.
+<p>When NASM is in <code><nobr>BITS 64</nobr></code> mode, most
+instructions operate the same as they do for
+<code><nobr>BITS 32</nobr></code> mode. However, there are 8 more general
+and SSE registers, and 16-bit addressing is no longer supported.
+<p>The default address size is 64 bits; 32-bit addressing can be selected
+with the 0x67 prefix. The default operand size is still 32 bits, however,
+and the 0x66 prefix selects 16-bit operand size. The
+<code><nobr>REX</nobr></code> prefix is used both to select 64-bit operand
+size, and to access the new registers. NASM automatically inserts REX
+prefixes when necessary.
+<p>When the <code><nobr>REX</nobr></code> prefix is used, the processor
+does not know how to address the AH, BH, CH or DH (high 8-bit legacy)
+registers. Instead, it is possible to access the the low 8-bits of the SP,
+BP SI and DI registers as SPL, BPL, SIL and DIL, respectively; but only
+when the REX prefix is used.
+<p>The <code><nobr>BITS</nobr></code> directive has an exactly equivalent
+primitive form, <code><nobr>[BITS 16]</nobr></code>,
+<code><nobr>[BITS 32]</nobr></code> and
+<code><nobr>[BITS 64]</nobr></code>. The user-level form is a macro which
+has no function other than to call the primitive form.
+<p>Note that the space is neccessary, e.g. <code><nobr>BITS32</nobr></code>
+will <em>not</em> work!
+<h4><a name="section-6.1.1">6.1.1 <code><nobr>USE16</nobr></code> &amp; <code><nobr>USE32</nobr></code>: Aliases for BITS</a></h4>
+<p>The `<code><nobr>USE16</nobr></code>' and
+`<code><nobr>USE32</nobr></code>' directives can be used in place of
+`<code><nobr>BITS 16</nobr></code>' and
+`<code><nobr>BITS 32</nobr></code>', for compatibility with other
+assemblers.
+<h3><a name="section-6.2">6.2 <code><nobr>DEFAULT</nobr></code>: Change the assembler defaults</a></h3>
+<p>The <code><nobr>DEFAULT</nobr></code> directive changes the assembler
+defaults. Normally, NASM defaults to a mode where the programmer is
+expected to explicitly specify most features directly. However, this is
+occationally obnoxious, as the explicit form is pretty much the only one
+one wishes to use.
+<p>Currently, the only <code><nobr>DEFAULT</nobr></code> that is settable
+is whether or not registerless instructions in 64-bit mode are
+<code><nobr>RIP</nobr></code>-relative or not. By default, they are
+absolute unless overridden with the <code><nobr>REL</nobr></code> specifier
+(see <a href="nasmdoc3.html#section-3.3">section 3.3</a>). However, if
+<code><nobr>DEFAULT REL</nobr></code> is specified,
+<code><nobr>REL</nobr></code> is default, unless overridden with the
+<code><nobr>ABS</nobr></code> specifier, <em>except when used with an FS or
+GS segment override</em>.
+<p>The special handling of <code><nobr>FS</nobr></code> and
+<code><nobr>GS</nobr></code> overrides are due to the fact that these
+registers are generally used as thread pointers or other special functions
+in 64-bit mode, and generating <code><nobr>RIP</nobr></code>-relative
+addresses would be extremely confusing.
+<p><code><nobr>DEFAULT REL</nobr></code> is disabled with
+<code><nobr>DEFAULT ABS</nobr></code>.
+<h3><a name="section-6.3">6.3 <code><nobr>SECTION</nobr></code> or <code><nobr>SEGMENT</nobr></code>: Changing and Defining Sections</a></h3>
+<p>The <code><nobr>SECTION</nobr></code> directive
+(<code><nobr>SEGMENT</nobr></code> is an exactly equivalent synonym)
+changes which section of the output file the code you write will be
+assembled into. In some object file formats, the number and names of
+sections are fixed; in others, the user may make up as many as they wish.
+Hence <code><nobr>SECTION</nobr></code> may sometimes give an error
+message, or may define a new section, if you try to switch to a section
+that does not (yet) exist.
+<p>The Unix object formats, and the <code><nobr>bin</nobr></code> object
+format (but see <a href="nasmdoc7.html#section-7.1.3">section 7.1.3</a>,
+all support the standardized section names <code><nobr>.text</nobr></code>,
+<code><nobr>.data</nobr></code> and <code><nobr>.bss</nobr></code> for the
+code, data and uninitialized-data sections. The
+<code><nobr>obj</nobr></code> format, by contrast, does not recognize these
+section names as being special, and indeed will strip off the leading
+period of any section name that has one.
+<h4><a name="section-6.3.1">6.3.1 The <code><nobr>__SECT__</nobr></code> Macro</a></h4>
+<p>The <code><nobr>SECTION</nobr></code> directive is unusual in that its
+user-level form functions differently from its primitive form. The
+primitive form, <code><nobr>[SECTION xyz]</nobr></code>, simply switches
+the current target section to the one given. The user-level form,
+<code><nobr>SECTION xyz</nobr></code>, however, first defines the
+single-line macro <code><nobr>__SECT__</nobr></code> to be the primitive
+<code><nobr>[SECTION]</nobr></code> directive which it is about to issue,
+and then issues it. So the user-level directive
+<p><pre>
+ SECTION .text
+</pre>
+<p>expands to the two lines
+<p><pre>
+%define __SECT__ [SECTION .text]
+ [SECTION .text]
+</pre>
+<p>Users may find it useful to make use of this in their own macros. For
+example, the <code><nobr>writefile</nobr></code> macro defined in
+<a href="nasmdoc4.html#section-4.3.4">section 4.3.4</a> can be usefully
+rewritten in the following more sophisticated form:
+<p><pre>
+%macro writefile 2+
+
+ [section .data]
+
+ %%str: db %2
+ %%endstr:
+
+ __SECT__
+
+ mov dx,%%str
+ mov cx,%%endstr-%%str
+ mov bx,%1
+ mov ah,0x40
+ int 0x21
+
+%endmacro
+</pre>
+<p>This form of the macro, once passed a string to output, first switches
+temporarily to the data section of the file, using the primitive form of
+the <code><nobr>SECTION</nobr></code> directive so as not to modify
+<code><nobr>__SECT__</nobr></code>. It then declares its string in the data
+section, and then invokes <code><nobr>__SECT__</nobr></code> to switch back
+to <em>whichever</em> section the user was previously working in. It thus
+avoids the need, in the previous version of the macro, to include a
+<code><nobr>JMP</nobr></code> instruction to jump over the data, and also
+does not fail if, in a complicated <code><nobr>OBJ</nobr></code> format
+module, the user could potentially be assembling the code in any of several
+separate code sections.
+<h3><a name="section-6.4">6.4 <code><nobr>ABSOLUTE</nobr></code>: Defining Absolute Labels</a></h3>
+<p>The <code><nobr>ABSOLUTE</nobr></code> directive can be thought of as an
+alternative form of <code><nobr>SECTION</nobr></code>: it causes the
+subsequent code to be directed at no physical section, but at the
+hypothetical section starting at the given absolute address. The only
+instructions you can use in this mode are the
+<code><nobr>RESB</nobr></code> family.
+<p><code><nobr>ABSOLUTE</nobr></code> is used as follows:
+<p><pre>
+absolute 0x1A
+
+ kbuf_chr resw 1
+ kbuf_free resw 1
+ kbuf resw 16
+</pre>
+<p>This example describes a section of the PC BIOS data area, at segment
+address 0x40: the above code defines <code><nobr>kbuf_chr</nobr></code> to
+be 0x1A, <code><nobr>kbuf_free</nobr></code> to be 0x1C, and
+<code><nobr>kbuf</nobr></code> to be 0x1E.
+<p>The user-level form of <code><nobr>ABSOLUTE</nobr></code>, like that of
+<code><nobr>SECTION</nobr></code>, redefines the
+<code><nobr>__SECT__</nobr></code> macro when it is invoked.
+<p><code><nobr>STRUC</nobr></code> and <code><nobr>ENDSTRUC</nobr></code>
+are defined as macros which use <code><nobr>ABSOLUTE</nobr></code> (and
+also <code><nobr>__SECT__</nobr></code>).
+<p><code><nobr>ABSOLUTE</nobr></code> doesn't have to take an absolute
+constant as an argument: it can take an expression (actually, a critical
+expression: see <a href="nasmdoc3.html#section-3.8">section 3.8</a>) and it
+can be a value in a segment. For example, a TSR can re-use its setup code
+as run-time BSS like this:
+<p><pre>
+ org 100h ; it's a .COM program
+
+ jmp setup ; setup code comes last
+
+ ; the resident part of the TSR goes here
+setup:
+ ; now write the code that installs the TSR here
+
+absolute setup
+
+runtimevar1 resw 1
+runtimevar2 resd 20
+
+tsr_end:
+</pre>
+<p>This defines some variables `on top of' the setup code, so that after
+the setup has finished running, the space it took up can be re-used as data
+storage for the running TSR. The symbol `tsr_end' can be used to calculate
+the total size of the part of the TSR that needs to be made resident.
+<h3><a name="section-6.5">6.5 <code><nobr>EXTERN</nobr></code>: Importing Symbols from Other Modules</a></h3>
+<p><code><nobr>EXTERN</nobr></code> is similar to the MASM directive
+<code><nobr>EXTRN</nobr></code> and the C keyword
+<code><nobr>extern</nobr></code>: it is used to declare a symbol which is
+not defined anywhere in the module being assembled, but is assumed to be
+defined in some other module and needs to be referred to by this one. Not
+every object-file format can support external variables: the
+<code><nobr>bin</nobr></code> format cannot.
+<p>The <code><nobr>EXTERN</nobr></code> directive takes as many arguments
+as you like. Each argument is the name of a symbol:
+<p><pre>
+extern _printf
+extern _sscanf,_fscanf
+</pre>
+<p>Some object-file formats provide extra features to the
+<code><nobr>EXTERN</nobr></code> directive. In all cases, the extra
+features are used by suffixing a colon to the symbol name followed by
+object-format specific text. For example, the <code><nobr>obj</nobr></code>
+format allows you to declare that the default segment base of an external
+should be the group <code><nobr>dgroup</nobr></code> by means of the
+directive
+<p><pre>
+extern _variable:wrt dgroup
+</pre>
+<p>The primitive form of <code><nobr>EXTERN</nobr></code> differs from the
+user-level form only in that it can take only one argument at a time: the
+support for multiple arguments is implemented at the preprocessor level.
+<p>You can declare the same variable as <code><nobr>EXTERN</nobr></code>
+more than once: NASM will quietly ignore the second and later
+redeclarations. You can't declare a variable as
+<code><nobr>EXTERN</nobr></code> as well as something else, though.
+<h3><a name="section-6.6">6.6 <code><nobr>GLOBAL</nobr></code>: Exporting Symbols to Other Modules</a></h3>
+<p><code><nobr>GLOBAL</nobr></code> is the other end of
+<code><nobr>EXTERN</nobr></code>: if one module declares a symbol as
+<code><nobr>EXTERN</nobr></code> and refers to it, then in order to prevent
+linker errors, some other module must actually <em>define</em> the symbol
+and declare it as <code><nobr>GLOBAL</nobr></code>. Some assemblers use the
+name <code><nobr>PUBLIC</nobr></code> for this purpose.
+<p>The <code><nobr>GLOBAL</nobr></code> directive applying to a symbol must
+appear <em>before</em> the definition of the symbol.
+<p><code><nobr>GLOBAL</nobr></code> uses the same syntax as
+<code><nobr>EXTERN</nobr></code>, except that it must refer to symbols
+which <em>are</em> defined in the same module as the
+<code><nobr>GLOBAL</nobr></code> directive. For example:
+<p><pre>
+global _main
+_main:
+ ; some code
+</pre>
+<p><code><nobr>GLOBAL</nobr></code>, like <code><nobr>EXTERN</nobr></code>,
+allows object formats to define private extensions by means of a colon. The
+<code><nobr>elf</nobr></code> object format, for example, lets you specify
+whether global data items are functions or data:
+<p><pre>
+global hashlookup:function, hashtable:data
+</pre>
+<p>Like <code><nobr>EXTERN</nobr></code>, the primitive form of
+<code><nobr>GLOBAL</nobr></code> differs from the user-level form only in
+that it can take only one argument at a time.
+<h3><a name="section-6.7">6.7 <code><nobr>COMMON</nobr></code>: Defining Common Data Areas</a></h3>
+<p>The <code><nobr>COMMON</nobr></code> directive is used to declare
+<em>common variables</em>. A common variable is much like a global variable
+declared in the uninitialized data section, so that
+<p><pre>
+common intvar 4
+</pre>
+<p>is similar in function to
+<p><pre>
+global intvar
+section .bss
+
+intvar resd 1
+</pre>
+<p>The difference is that if more than one module defines the same common
+variable, then at link time those variables will be <em>merged</em>, and
+references to <code><nobr>intvar</nobr></code> in all modules will point at
+the same piece of memory.
+<p>Like <code><nobr>GLOBAL</nobr></code> and
+<code><nobr>EXTERN</nobr></code>, <code><nobr>COMMON</nobr></code> supports
+object-format specific extensions. For example, the
+<code><nobr>obj</nobr></code> format allows common variables to be NEAR or
+FAR, and the <code><nobr>elf</nobr></code> format allows you to specify the
+alignment requirements of a common variable:
+<p><pre>
+common commvar 4:near ; works in OBJ
+common intarray 100:4 ; works in ELF: 4 byte aligned
+</pre>
+<p>Once again, like <code><nobr>EXTERN</nobr></code> and
+<code><nobr>GLOBAL</nobr></code>, the primitive form of
+<code><nobr>COMMON</nobr></code> differs from the user-level form only in
+that it can take only one argument at a time.
+<h3><a name="section-6.8">6.8 <code><nobr>CPU</nobr></code>: Defining CPU Dependencies</a></h3>
+<p>The <code><nobr>CPU</nobr></code> directive restricts assembly to those
+instructions which are available on the specified CPU.
+<p>Options are:
+<ul>
+<li><code><nobr>CPU 8086</nobr></code> Assemble only 8086 instruction set
+<li><code><nobr>CPU 186</nobr></code> Assemble instructions up to the 80186
+instruction set
+<li><code><nobr>CPU 286</nobr></code> Assemble instructions up to the 286
+instruction set
+<li><code><nobr>CPU 386</nobr></code> Assemble instructions up to the 386
+instruction set
+<li><code><nobr>CPU 486</nobr></code> 486 instruction set
+<li><code><nobr>CPU 586</nobr></code> Pentium instruction set
+<li><code><nobr>CPU PENTIUM</nobr></code> Same as 586
+<li><code><nobr>CPU 686</nobr></code> P6 instruction set
+<li><code><nobr>CPU PPRO</nobr></code> Same as 686
+<li><code><nobr>CPU P2</nobr></code> Same as 686
+<li><code><nobr>CPU P3</nobr></code> Pentium III (Katmai) instruction sets
+<li><code><nobr>CPU KATMAI</nobr></code> Same as P3
+<li><code><nobr>CPU P4</nobr></code> Pentium 4 (Willamette) instruction set
+<li><code><nobr>CPU WILLAMETTE</nobr></code> Same as P4
+<li><code><nobr>CPU PRESCOTT</nobr></code> Prescott instruction set
+<li><code><nobr>CPU X64</nobr></code> x86-64 (x64/AMD64/Intel 64)
+instruction set
+<li><code><nobr>CPU IA64</nobr></code> IA64 CPU (in x86 mode) instruction
+set
+</ul>
+<p>All options are case insensitive. All instructions will be selected only
+if they apply to the selected CPU or lower. By default, all instructions
+are available.
+<h3><a name="section-6.9">6.9 <code><nobr>FLOAT</nobr></code>: Handling of floating-point constants</a></h3>
+<p>By default, floating-point constants are rounded to nearest, and IEEE
+denormals are supported. The following options can be set to alter this
+behaviour:
+<ul>
+<li><code><nobr>FLOAT DAZ</nobr></code> Flush denormals to zero
+<li><code><nobr>FLOAT NODAZ</nobr></code> Do not flush denormals to zero
+(default)
+<li><code><nobr>FLOAT NEAR</nobr></code> Round to nearest (default)
+<li><code><nobr>FLOAT UP</nobr></code> Round up (toward +Infinity)
+<li><code><nobr>FLOAT DOWN</nobr></code> Round down (toward -Infinity)
+<li><code><nobr>FLOAT ZERO</nobr></code> Round toward zero
+<li><code><nobr>FLOAT DEFAULT</nobr></code> Restore default settings
+</ul>
+<p>The standard macros <code><nobr>__FLOAT_DAZ__</nobr></code>,
+<code><nobr>__FLOAT_ROUND__</nobr></code>, and
+<code><nobr>__FLOAT__</nobr></code> contain the current state, as long as
+the programmer has avoided the use of the brackeded primitive form,
+(<code><nobr>[FLOAT]</nobr></code>).
+<p><code><nobr>__FLOAT__</nobr></code> contains the full set of
+floating-point settings; this value can be saved away and invoked later to
+restore the setting.
+<p align=center><a href="nasmdoc7.html">Next Chapter</a> |
+<a href="nasmdoc5.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdoc7.html b/doc/html/nasmdoc7.html
new file mode 100644
index 0000000..d1339a8
--- /dev/null
+++ b/doc/html/nasmdoc7.html
@@ -0,0 +1,1267 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdoc8.html">Next Chapter</a> |
+<a href="nasmdoc6.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="chapter-7">Chapter 7: Output Formats</a></h2>
+<p>NASM is a portable assembler, designed to be able to compile on any ANSI
+C-supporting platform and produce output to run on a variety of Intel x86
+operating systems. For this reason, it has a large number of available
+output formats, selected using the <code><nobr>-f</nobr></code> option on
+the NASM command line. Each of these formats, along with its extensions to
+the base NASM syntax, is detailed in this chapter.
+<p>As stated in <a href="nasmdoc2.html#section-2.1.1">section 2.1.1</a>,
+NASM chooses a default name for your output file based on the input file
+name and the chosen output format. This will be generated by removing the
+extension (<code><nobr>.asm</nobr></code>, <code><nobr>.s</nobr></code>, or
+whatever you like to use) from the input file name, and substituting an
+extension defined by the output format. The extensions are given with each
+format below.
+<h3><a name="section-7.1">7.1 <code><nobr>bin</nobr></code>: Flat-Form Binary Output</a></h3>
+<p>The <code><nobr>bin</nobr></code> format does not produce object files:
+it generates nothing in the output file except the code you wrote. Such
+`pure binary' files are used by MS-DOS: <code><nobr>.COM</nobr></code>
+executables and <code><nobr>.SYS</nobr></code> device drivers are pure
+binary files. Pure binary output is also useful for operating system and
+boot loader development.
+<p>The <code><nobr>bin</nobr></code> format supports multiple section
+names. For details of how NASM handles sections in the
+<code><nobr>bin</nobr></code> format, see <a href="#section-7.1.3">section
+7.1.3</a>.
+<p>Using the <code><nobr>bin</nobr></code> format puts NASM by default into
+16-bit mode (see <a href="nasmdoc6.html#section-6.1">section 6.1</a>). In
+order to use <code><nobr>bin</nobr></code> to write 32-bit or 64-bit code,
+such as an OS kernel, you need to explicitly issue the
+<code><nobr>BITS 32</nobr></code> or <code><nobr>BITS 64</nobr></code>
+directive.
+<p><code><nobr>bin</nobr></code> has no default output file name extension:
+instead, it leaves your file name as it is once the original extension has
+been removed. Thus, the default is for NASM to assemble
+<code><nobr>binprog.asm</nobr></code> into a binary file called
+<code><nobr>binprog</nobr></code>.
+<h4><a name="section-7.1.1">7.1.1 <code><nobr>ORG</nobr></code>: Binary File Program Origin</a></h4>
+<p>The <code><nobr>bin</nobr></code> format provides an additional
+directive to the list given in <a href="nasmdoc6.html">chapter 6</a>:
+<code><nobr>ORG</nobr></code>. The function of the
+<code><nobr>ORG</nobr></code> directive is to specify the origin address
+which NASM will assume the program begins at when it is loaded into memory.
+<p>For example, the following code will generate the longword
+<code><nobr>0x00000104</nobr></code>:
+<p><pre>
+ org 0x100
+ dd label
+label:
+</pre>
+<p>Unlike the <code><nobr>ORG</nobr></code> directive provided by
+MASM-compatible assemblers, which allows you to jump around in the object
+file and overwrite code you have already generated, NASM's
+<code><nobr>ORG</nobr></code> does exactly what the directive says:
+<em>origin</em>. Its sole function is to specify one offset which is added
+to all internal address references within the section; it does not permit
+any of the trickery that MASM's version does. See
+<a href="nasmdo12.html#section-12.1.3">section 12.1.3</a> for further
+comments.
+<h4><a name="section-7.1.2">7.1.2 <code><nobr>bin</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a></h4>
+<p>The <code><nobr>bin</nobr></code> output format extends the
+<code><nobr>SECTION</nobr></code> (or <code><nobr>SEGMENT</nobr></code>)
+directive to allow you to specify the alignment requirements of segments.
+This is done by appending the <code><nobr>ALIGN</nobr></code> qualifier to
+the end of the section-definition line. For example,
+<p><pre>
+section .data align=16
+</pre>
+<p>switches to the section <code><nobr>.data</nobr></code> and also
+specifies that it must be aligned on a 16-byte boundary.
+<p>The parameter to <code><nobr>ALIGN</nobr></code> specifies how many low
+bits of the section start address must be forced to zero. The alignment
+value given may be any power of two.
+<h4><a name="section-7.1.3">7.1.3 Multisection Support for the <code><nobr>bin</nobr></code> Format</a></h4>
+<p>The <code><nobr>bin</nobr></code> format allows the use of multiple
+sections, of arbitrary names, besides the "known"
+<code><nobr>.text</nobr></code>, <code><nobr>.data</nobr></code>, and
+<code><nobr>.bss</nobr></code> names.
+<ul>
+<li>Sections may be designated <code><nobr>progbits</nobr></code> or
+<code><nobr>nobits</nobr></code>. Default is
+<code><nobr>progbits</nobr></code> (except <code><nobr>.bss</nobr></code>,
+which defaults to <code><nobr>nobits</nobr></code>, of course).
+<li>Sections can be aligned at a specified boundary following the previous
+section with <code><nobr>align=</nobr></code>, or at an arbitrary
+byte-granular position with <code><nobr>start=</nobr></code>.
+<li>Sections can be given a virtual start address, which will be used for
+the calculation of all memory references within that section with
+<code><nobr>vstart=</nobr></code>.
+<li>Sections can be ordered using
+<code><nobr>follows=</nobr></code><code><nobr>&lt;section&gt;</nobr></code>
+or
+<code><nobr>vfollows=</nobr></code><code><nobr>&lt;section&gt;</nobr></code>
+as an alternative to specifying an explicit start address.
+<li>Arguments to <code><nobr>org</nobr></code>,
+<code><nobr>start</nobr></code>, <code><nobr>vstart</nobr></code>, and
+<code><nobr>align=</nobr></code> are critical expressions. See
+<a href="nasmdoc3.html#section-3.8">section 3.8</a>. E.g.
+<code><nobr>align=(1 &lt;&lt; ALIGN_SHIFT)</nobr></code> -
+<code><nobr>ALIGN_SHIFT</nobr></code> must be defined before it is used
+here.
+<li>Any code which comes before an explicit
+<code><nobr>SECTION</nobr></code> directive is directed by default into the
+<code><nobr>.text</nobr></code> section.
+<li>If an <code><nobr>ORG</nobr></code> statement is not given,
+<code><nobr>ORG 0</nobr></code> is used by default.
+<li>The <code><nobr>.bss</nobr></code> section will be placed after the
+last <code><nobr>progbits</nobr></code> section, unless
+<code><nobr>start=</nobr></code>, <code><nobr>vstart=</nobr></code>,
+<code><nobr>follows=</nobr></code>, or <code><nobr>vfollows=</nobr></code>
+has been specified.
+<li>All sections are aligned on dword boundaries, unless a different
+alignment has been specified.
+<li>Sections may not overlap.
+<li>NASM creates the
+<code><nobr>section.&lt;secname&gt;.start</nobr></code> for each section,
+which may be used in your code.
+</ul>
+<h4><a name="section-7.1.4">7.1.4 Map Files</a></h4>
+<p>Map files can be generated in <code><nobr>-f bin</nobr></code> format by
+means of the <code><nobr>[map]</nobr></code> option. Map types of
+<code><nobr>all</nobr></code> (default), <code><nobr>brief</nobr></code>,
+<code><nobr>sections</nobr></code>, <code><nobr>segments</nobr></code>, or
+<code><nobr>symbols</nobr></code> may be specified. Output may be directed
+to <code><nobr>stdout</nobr></code> (default),
+<code><nobr>stderr</nobr></code>, or a specified file. E.g.
+<code><nobr>[map symbols myfile.map]</nobr></code>. No "user form" exists,
+the square brackets must be used.
+<h3><a name="section-7.2">7.2 <code><nobr>ith</nobr></code>: Intel Hex Output</a></h3>
+<p>The <code><nobr>ith</nobr></code> file format produces Intel hex-format
+files. Just as the <code><nobr>bin</nobr></code> format, this is a flat
+memory image format with no support for relocation or linking. It is
+usually used with ROM programmers and similar utilities.
+<p>All extensions supported by the <code><nobr>bin</nobr></code> file
+format is also supported by the <code><nobr>ith</nobr></code> file format.
+<p><code><nobr>ith</nobr></code> provides a default output file-name
+extension of <code><nobr>.ith</nobr></code>.
+<h3><a name="section-7.3">7.3 <code><nobr>srec</nobr></code>: Motorola S-Records Output</a></h3>
+<p>The <code><nobr>srec</nobr></code> file format produces Motorola
+S-records files. Just as the <code><nobr>bin</nobr></code> format, this is
+a flat memory image format with no support for relocation or linking. It is
+usually used with ROM programmers and similar utilities.
+<p>All extensions supported by the <code><nobr>bin</nobr></code> file
+format is also supported by the <code><nobr>srec</nobr></code> file format.
+<p><code><nobr>srec</nobr></code> provides a default output file-name
+extension of <code><nobr>.srec</nobr></code>.
+<h3><a name="section-7.4">7.4 <code><nobr>obj</nobr></code>: Microsoft OMF Object Files</a></h3>
+<p>The <code><nobr>obj</nobr></code> file format (NASM calls it
+<code><nobr>obj</nobr></code> rather than <code><nobr>omf</nobr></code> for
+historical reasons) is the one produced by MASM and TASM, which is
+typically fed to 16-bit DOS linkers to produce
+<code><nobr>.EXE</nobr></code> files. It is also the format used by OS/2.
+<p><code><nobr>obj</nobr></code> provides a default output file-name
+extension of <code><nobr>.obj</nobr></code>.
+<p><code><nobr>obj</nobr></code> is not exclusively a 16-bit format,
+though: NASM has full support for the 32-bit extensions to the format. In
+particular, 32-bit <code><nobr>obj</nobr></code> format files are used by
+Borland's Win32 compilers, instead of using Microsoft's newer
+<code><nobr>win32</nobr></code> object file format.
+<p>The <code><nobr>obj</nobr></code> format does not define any special
+segment names: you can call your segments anything you like. Typical names
+for segments in <code><nobr>obj</nobr></code> format files are
+<code><nobr>CODE</nobr></code>, <code><nobr>DATA</nobr></code> and
+<code><nobr>BSS</nobr></code>.
+<p>If your source file contains code before specifying an explicit
+<code><nobr>SEGMENT</nobr></code> directive, then NASM will invent its own
+segment called <code><nobr>__NASMDEFSEG</nobr></code> for you.
+<p>When you define a segment in an <code><nobr>obj</nobr></code> file, NASM
+defines the segment name as a symbol as well, so that you can access the
+segment address of the segment. So, for example:
+<p><pre>
+segment data
+
+dvar: dw 1234
+
+segment code
+
+function:
+ mov ax,data ; get segment address of data
+ mov ds,ax ; and move it into DS
+ inc word [dvar] ; now this reference will work
+ ret
+</pre>
+<p>The <code><nobr>obj</nobr></code> format also enables the use of the
+<code><nobr>SEG</nobr></code> and <code><nobr>WRT</nobr></code> operators,
+so that you can write code which does things like
+<p><pre>
+extern foo
+
+ mov ax,seg foo ; get preferred segment of foo
+ mov ds,ax
+ mov ax,data ; a different segment
+ mov es,ax
+ mov ax,[ds:foo] ; this accesses `foo'
+ mov [es:foo wrt data],bx ; so does this
+</pre>
+<h4><a name="section-7.4.1">7.4.1 <code><nobr>obj</nobr></code> Extensions to the <code><nobr>SEGMENT</nobr></code> Directive</a></h4>
+<p>The <code><nobr>obj</nobr></code> output format extends the
+<code><nobr>SEGMENT</nobr></code> (or <code><nobr>SECTION</nobr></code>)
+directive to allow you to specify various properties of the segment you are
+defining. This is done by appending extra qualifiers to the end of the
+segment-definition line. For example,
+<p><pre>
+segment code private align=16
+</pre>
+<p>defines the segment <code><nobr>code</nobr></code>, but also declares it
+to be a private segment, and requires that the portion of it described in
+this code module must be aligned on a 16-byte boundary.
+<p>The available qualifiers are:
+<ul>
+<li><code><nobr>PRIVATE</nobr></code>, <code><nobr>PUBLIC</nobr></code>,
+<code><nobr>COMMON</nobr></code> and <code><nobr>STACK</nobr></code>
+specify the combination characteristics of the segment.
+<code><nobr>PRIVATE</nobr></code> segments do not get combined with any
+others by the linker; <code><nobr>PUBLIC</nobr></code> and
+<code><nobr>STACK</nobr></code> segments get concatenated together at link
+time; and <code><nobr>COMMON</nobr></code> segments all get overlaid on top
+of each other rather than stuck end-to-end.
+<li><code><nobr>ALIGN</nobr></code> is used, as shown above, to specify how
+many low bits of the segment start address must be forced to zero. The
+alignment value given may be any power of two from 1 to 4096; in reality,
+the only values supported are 1, 2, 4, 16, 256 and 4096, so if 8 is
+specified it will be rounded up to 16, and 32, 64 and 128 will all be
+rounded up to 256, and so on. Note that alignment to 4096-byte boundaries
+is a PharLap extension to the format and may not be supported by all
+linkers.
+<li><code><nobr>CLASS</nobr></code> can be used to specify the segment
+class; this feature indicates to the linker that segments of the same class
+should be placed near each other in the output file. The class name can be
+any word, e.g. <code><nobr>CLASS=CODE</nobr></code>.
+<li><code><nobr>OVERLAY</nobr></code>, like
+<code><nobr>CLASS</nobr></code>, is specified with an arbitrary word as an
+argument, and provides overlay information to an overlay-capable linker.
+<li>Segments can be declared as <code><nobr>USE16</nobr></code> or
+<code><nobr>USE32</nobr></code>, which has the effect of recording the
+choice in the object file and also ensuring that NASM's default assembly
+mode when assembling in that segment is 16-bit or 32-bit respectively.
+<li>When writing OS/2 object files, you should declare 32-bit segments as
+<code><nobr>FLAT</nobr></code>, which causes the default segment base for
+anything in the segment to be the special group
+<code><nobr>FLAT</nobr></code>, and also defines the group if it is not
+already defined.
+<li>The <code><nobr>obj</nobr></code> file format also allows segments to
+be declared as having a pre-defined absolute segment address, although no
+linkers are currently known to make sensible use of this feature;
+nevertheless, NASM allows you to declare a segment such as
+<code><nobr>SEGMENT SCREEN ABSOLUTE=0xB800</nobr></code> if you need to.
+The <code><nobr>ABSOLUTE</nobr></code> and <code><nobr>ALIGN</nobr></code>
+keywords are mutually exclusive.
+</ul>
+<p>NASM's default segment attributes are <code><nobr>PUBLIC</nobr></code>,
+<code><nobr>ALIGN=1</nobr></code>, no class, no overlay, and
+<code><nobr>USE16</nobr></code>.
+<h4><a name="section-7.4.2">7.4.2 <code><nobr>GROUP</nobr></code>: Defining Groups of Segments</a></h4>
+<p>The <code><nobr>obj</nobr></code> format also allows segments to be
+grouped, so that a single segment register can be used to refer to all the
+segments in a group. NASM therefore supplies the
+<code><nobr>GROUP</nobr></code> directive, whereby you can code
+<p><pre>
+segment data
+
+ ; some data
+
+segment bss
+
+ ; some uninitialized data
+
+group dgroup data bss
+</pre>
+<p>which will define a group called <code><nobr>dgroup</nobr></code> to
+contain the segments <code><nobr>data</nobr></code> and
+<code><nobr>bss</nobr></code>. Like <code><nobr>SEGMENT</nobr></code>,
+<code><nobr>GROUP</nobr></code> causes the group name to be defined as a
+symbol, so that you can refer to a variable <code><nobr>var</nobr></code>
+in the <code><nobr>data</nobr></code> segment as
+<code><nobr>var wrt data</nobr></code> or as
+<code><nobr>var wrt dgroup</nobr></code>, depending on which segment value
+is currently in your segment register.
+<p>If you just refer to <code><nobr>var</nobr></code>, however, and
+<code><nobr>var</nobr></code> is declared in a segment which is part of a
+group, then NASM will default to giving you the offset of
+<code><nobr>var</nobr></code> from the beginning of the <em>group</em>, not
+the <em>segment</em>. Therefore <code><nobr>SEG var</nobr></code>, also,
+will return the group base rather than the segment base.
+<p>NASM will allow a segment to be part of more than one group, but will
+generate a warning if you do this. Variables declared in a segment which is
+part of more than one group will default to being relative to the first
+group that was defined to contain the segment.
+<p>A group does not have to contain any segments; you can still make
+<code><nobr>WRT</nobr></code> references to a group which does not contain
+the variable you are referring to. OS/2, for example, defines the special
+group <code><nobr>FLAT</nobr></code> with no segments in it.
+<h4><a name="section-7.4.3">7.4.3 <code><nobr>UPPERCASE</nobr></code>: Disabling Case Sensitivity in Output</a></h4>
+<p>Although NASM itself is case sensitive, some OMF linkers are not;
+therefore it can be useful for NASM to output single-case object files. The
+<code><nobr>UPPERCASE</nobr></code> format-specific directive causes all
+segment, group and symbol names that are written to the object file to be
+forced to upper case just before being written. Within a source file, NASM
+is still case-sensitive; but the object file can be written entirely in
+upper case if desired.
+<p><code><nobr>UPPERCASE</nobr></code> is used alone on a line; it requires
+no parameters.
+<h4><a name="section-7.4.4">7.4.4 <code><nobr>IMPORT</nobr></code>: Importing DLL Symbols</a></h4>
+<p>The <code><nobr>IMPORT</nobr></code> format-specific directive defines a
+symbol to be imported from a DLL, for use if you are writing a DLL's import
+library in NASM. You still need to declare the symbol as
+<code><nobr>EXTERN</nobr></code> as well as using the
+<code><nobr>IMPORT</nobr></code> directive.
+<p>The <code><nobr>IMPORT</nobr></code> directive takes two required
+parameters, separated by white space, which are (respectively) the name of
+the symbol you wish to import and the name of the library you wish to
+import it from. For example:
+<p><pre>
+ import WSAStartup wsock32.dll
+</pre>
+<p>A third optional parameter gives the name by which the symbol is known
+in the library you are importing it from, in case this is not the same as
+the name you wish the symbol to be known by to your code once you have
+imported it. For example:
+<p><pre>
+ import asyncsel wsock32.dll WSAAsyncSelect
+</pre>
+<h4><a name="section-7.4.5">7.4.5 <code><nobr>EXPORT</nobr></code>: Exporting DLL Symbols</a></h4>
+<p>The <code><nobr>EXPORT</nobr></code> format-specific directive defines a
+global symbol to be exported as a DLL symbol, for use if you are writing a
+DLL in NASM. You still need to declare the symbol as
+<code><nobr>GLOBAL</nobr></code> as well as using the
+<code><nobr>EXPORT</nobr></code> directive.
+<p><code><nobr>EXPORT</nobr></code> takes one required parameter, which is
+the name of the symbol you wish to export, as it was defined in your source
+file. An optional second parameter (separated by white space from the
+first) gives the <em>external</em> name of the symbol: the name by which
+you wish the symbol to be known to programs using the DLL. If this name is
+the same as the internal name, you may leave the second parameter off.
+<p>Further parameters can be given to define attributes of the exported
+symbol. These parameters, like the second, are separated by white space. If
+further parameters are given, the external name must also be specified,
+even if it is the same as the internal name. The available attributes are:
+<ul>
+<li><code><nobr>resident</nobr></code> indicates that the exported name is
+to be kept resident by the system loader. This is an optimisation for
+frequently used symbols imported by name.
+<li><code><nobr>nodata</nobr></code> indicates that the exported symbol is
+a function which does not make use of any initialized data.
+<li><code><nobr>parm=NNN</nobr></code>, where <code><nobr>NNN</nobr></code>
+is an integer, sets the number of parameter words for the case in which the
+symbol is a call gate between 32-bit and 16-bit segments.
+<li>An attribute which is just a number indicates that the symbol should be
+exported with an identifying number (ordinal), and gives the desired
+number.
+</ul>
+<p>For example:
+<p><pre>
+ export myfunc
+ export myfunc TheRealMoreFormalLookingFunctionName
+ export myfunc myfunc 1234 ; export by ordinal
+ export myfunc myfunc resident parm=23 nodata
+</pre>
+<h4><a name="section-7.4.6">7.4.6 <code><nobr>..start</nobr></code>: Defining the Program Entry Point</a></h4>
+<p><code><nobr>OMF</nobr></code> linkers require exactly one of the object
+files being linked to define the program entry point, where execution will
+begin when the program is run. If the object file that defines the entry
+point is assembled using NASM, you specify the entry point by declaring the
+special symbol <code><nobr>..start</nobr></code> at the point where you
+wish execution to begin.
+<h4><a name="section-7.4.7">7.4.7 <code><nobr>obj</nobr></code> Extensions to the <code><nobr>EXTERN</nobr></code> Directive</a></h4>
+<p>If you declare an external symbol with the directive
+<p><pre>
+ extern foo
+</pre>
+<p>then references such as <code><nobr>mov ax,foo</nobr></code> will give
+you the offset of <code><nobr>foo</nobr></code> from its preferred segment
+base (as specified in whichever module <code><nobr>foo</nobr></code> is
+actually defined in). So to access the contents of
+<code><nobr>foo</nobr></code> you will usually need to do something like
+<p><pre>
+ mov ax,seg foo ; get preferred segment base
+ mov es,ax ; move it into ES
+ mov ax,[es:foo] ; and use offset `foo' from it
+</pre>
+<p>This is a little unwieldy, particularly if you know that an external is
+going to be accessible from a given segment or group, say
+<code><nobr>dgroup</nobr></code>. So if <code><nobr>DS</nobr></code>
+already contained <code><nobr>dgroup</nobr></code>, you could simply code
+<p><pre>
+ mov ax,[foo wrt dgroup]
+</pre>
+<p>However, having to type this every time you want to access
+<code><nobr>foo</nobr></code> can be a pain; so NASM allows you to declare
+<code><nobr>foo</nobr></code> in the alternative form
+<p><pre>
+ extern foo:wrt dgroup
+</pre>
+<p>This form causes NASM to pretend that the preferred segment base of
+<code><nobr>foo</nobr></code> is in fact <code><nobr>dgroup</nobr></code>;
+so the expression <code><nobr>seg foo</nobr></code> will now return
+<code><nobr>dgroup</nobr></code>, and the expression
+<code><nobr>foo</nobr></code> is equivalent to
+<code><nobr>foo wrt dgroup</nobr></code>.
+<p>This default-<code><nobr>WRT</nobr></code> mechanism can be used to make
+externals appear to be relative to any group or segment in your program. It
+can also be applied to common variables: see
+<a href="#section-7.4.8">section 7.4.8</a>.
+<h4><a name="section-7.4.8">7.4.8 <code><nobr>obj</nobr></code> Extensions to the <code><nobr>COMMON</nobr></code> Directive</a></h4>
+<p>The <code><nobr>obj</nobr></code> format allows common variables to be
+either near or far; NASM allows you to specify which your variables should
+be by the use of the syntax
+<p><pre>
+common nearvar 2:near ; `nearvar' is a near common
+common farvar 10:far ; and `farvar' is far
+</pre>
+<p>Far common variables may be greater in size than 64Kb, and so the OMF
+specification says that they are declared as a number of <em>elements</em>
+of a given size. So a 10-byte far common variable could be declared as ten
+one-byte elements, five two-byte elements, two five-byte elements or one
+ten-byte element.
+<p>Some <code><nobr>OMF</nobr></code> linkers require the element size, as
+well as the variable size, to match when resolving common variables
+declared in more than one module. Therefore NASM must allow you to specify
+the element size on your far common variables. This is done by the
+following syntax:
+<p><pre>
+common c_5by2 10:far 5 ; two five-byte elements
+common c_2by5 10:far 2 ; five two-byte elements
+</pre>
+<p>If no element size is specified, the default is 1. Also, the
+<code><nobr>FAR</nobr></code> keyword is not required when an element size
+is specified, since only far commons may have element sizes at all. So the
+above declarations could equivalently be
+<p><pre>
+common c_5by2 10:5 ; two five-byte elements
+common c_2by5 10:2 ; five two-byte elements
+</pre>
+<p>In addition to these extensions, the <code><nobr>COMMON</nobr></code>
+directive in <code><nobr>obj</nobr></code> also supports
+default-<code><nobr>WRT</nobr></code> specification like
+<code><nobr>EXTERN</nobr></code> does (explained in
+<a href="#section-7.4.7">section 7.4.7</a>). So you can also declare things
+like
+<p><pre>
+common foo 10:wrt dgroup
+common bar 16:far 2:wrt data
+common baz 24:wrt data:6
+</pre>
+<h3><a name="section-7.5">7.5 <code><nobr>win32</nobr></code>: Microsoft Win32 Object Files</a></h3>
+<p>The <code><nobr>win32</nobr></code> output format generates Microsoft
+Win32 object files, suitable for passing to Microsoft linkers such as
+Visual C++. Note that Borland Win32 compilers do not use this format, but
+use <code><nobr>obj</nobr></code> instead (see
+<a href="#section-7.4">section 7.4</a>).
+<p><code><nobr>win32</nobr></code> provides a default output file-name
+extension of <code><nobr>.obj</nobr></code>.
+<p>Note that although Microsoft say that Win32 object files follow the
+<code><nobr>COFF</nobr></code> (Common Object File Format) standard, the
+object files produced by Microsoft Win32 compilers are not compatible with
+COFF linkers such as DJGPP's, and vice versa. This is due to a difference
+of opinion over the precise semantics of PC-relative relocations. To
+produce COFF files suitable for DJGPP, use NASM's
+<code><nobr>coff</nobr></code> output format; conversely, the
+<code><nobr>coff</nobr></code> format does not produce object files that
+Win32 linkers can generate correct output from.
+<h4><a name="section-7.5.1">7.5.1 <code><nobr>win32</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a></h4>
+<p>Like the <code><nobr>obj</nobr></code> format,
+<code><nobr>win32</nobr></code> allows you to specify additional
+information on the <code><nobr>SECTION</nobr></code> directive line, to
+control the type and properties of sections you declare. Section types and
+properties are generated automatically by NASM for the standard section
+names <code><nobr>.text</nobr></code>, <code><nobr>.data</nobr></code> and
+<code><nobr>.bss</nobr></code>, but may still be overridden by these
+qualifiers.
+<p>The available qualifiers are:
+<ul>
+<li><code><nobr>code</nobr></code>, or equivalently
+<code><nobr>text</nobr></code>, defines the section to be a code section.
+This marks the section as readable and executable, but not writable, and
+also indicates to the linker that the type of the section is code.
+<li><code><nobr>data</nobr></code> and <code><nobr>bss</nobr></code> define
+the section to be a data section, analogously to
+<code><nobr>code</nobr></code>. Data sections are marked as readable and
+writable, but not executable. <code><nobr>data</nobr></code> declares an
+initialized data section, whereas <code><nobr>bss</nobr></code> declares an
+uninitialized data section.
+<li><code><nobr>rdata</nobr></code> declares an initialized data section
+that is readable but not writable. Microsoft compilers use this section to
+place constants in it.
+<li><code><nobr>info</nobr></code> defines the section to be an
+informational section, which is not included in the executable file by the
+linker, but may (for example) pass information <em>to</em> the linker. For
+example, declaring an <code><nobr>info</nobr></code>-type section called
+<code><nobr>.drectve</nobr></code> causes the linker to interpret the
+contents of the section as command-line options.
+<li><code><nobr>align=</nobr></code>, used with a trailing number as in
+<code><nobr>obj</nobr></code>, gives the alignment requirements of the
+section. The maximum you may specify is 64: the Win32 object file format
+contains no means to request a greater section alignment than this. If
+alignment is not explicitly specified, the defaults are 16-byte alignment
+for code sections, 8-byte alignment for rdata sections and 4-byte alignment
+for data (and BSS) sections. Informational sections get a default alignment
+of 1 byte (no alignment), though the value does not matter.
+</ul>
+<p>The defaults assumed by NASM if you do not specify the above qualifiers
+are:
+<p><pre>
+section .text code align=16
+section .data data align=4
+section .rdata rdata align=8
+section .bss bss align=4
+</pre>
+<p>Any other section name is treated by default like
+<code><nobr>.text</nobr></code>.
+<h4><a name="section-7.5.2">7.5.2 <code><nobr>win32</nobr></code>: Safe Structured Exception Handling</a></h4>
+<p>Among other improvements in Windows XP SP2 and Windows Server 2003
+Microsoft has introduced concept of "safe structured exception handling."
+General idea is to collect handlers' entry points in designated read-only
+table and have alleged entry point verified against this table prior
+exception control is passed to the handler. In order for an executable
+module to be equipped with such "safe exception handler table," all object
+modules on linker command line has to comply with certain criteria. If one
+single module among them does not, then the table in question is omitted
+and above mentioned run-time checks will not be performed for application
+in question. Table omission is by default silent and therefore can be
+easily overlooked. One can instruct linker to refuse to produce binary
+without such table by passing <code><nobr>/safeseh</nobr></code> command
+line option.
+<p>Without regard to this run-time check merits it's natural to expect NASM
+to be capable of generating modules suitable for
+<code><nobr>/safeseh</nobr></code> linking. From developer's viewpoint the
+problem is two-fold:
+<ul>
+<li>how to adapt modules not deploying exception handlers of their own;
+<li>how to adapt/develop modules utilizing custom exception handling;
+</ul>
+<p>Former can be easily achieved with any NASM version by adding following
+line to source code:
+<p><pre>
+$@feat.00 equ 1
+</pre>
+<p>As of version 2.03 NASM adds this absolute symbol automatically. If it's
+not already present to be precise. I.e. if for whatever reason developer
+would choose to assign another value in source file, it would still be
+perfectly possible.
+<p>Registering custom exception handler on the other hand requires certain
+"magic." As of version 2.03 additional directive is implemented,
+<code><nobr>safeseh</nobr></code>, which instructs the assembler to produce
+appropriately formatted input data for above mentioned "safe exception
+handler table." Its typical use would be:
+<p><pre>
+section .text
+extern _MessageBoxA@16
+%if __NASM_VERSION_ID__ &gt;= 0x02030000
+safeseh handler ; register handler as "safe handler"
+%endif
+handler:
+ push DWORD 1 ; MB_OKCANCEL
+ push DWORD caption
+ push DWORD text
+ push DWORD 0
+ call _MessageBoxA@16
+ sub eax,1 ; incidentally suits as return value
+ ; for exception handler
+ ret
+global _main
+_main:
+ push DWORD handler
+ push DWORD [fs:0]
+ mov DWORD [fs:0],esp ; engage exception handler
+ xor eax,eax
+ mov eax,DWORD[eax] ; cause exception
+ pop DWORD [fs:0] ; disengage exception handler
+ add esp,4
+ ret
+text: db 'OK to rethrow, CANCEL to generate core dump',0
+caption:db 'SEGV',0
+
+section .drectve info
+ db '/defaultlib:user32.lib /defaultlib:msvcrt.lib '
+</pre>
+<p>As you might imagine, it's perfectly possible to produce .exe binary
+with "safe exception handler table" and yet engage unregistered exception
+handler. Indeed, handler is engaged by simply manipulating
+<code><nobr>[fs:0]</nobr></code> location at run-time, something linker has
+no power over, run-time that is. It should be explicitly mentioned that
+such failure to register handler's entry point with
+<code><nobr>safeseh</nobr></code> directive has undesired side effect at
+run-time. If exception is raised and unregistered handler is to be
+executed, the application is abruptly terminated without any notification
+whatsoever. One can argue that system could at least have logged some kind
+"non-safe exception handler in x.exe at address n" message in event log,
+but no, literally no notification is provided and user is left with no clue
+on what caused application failure.
+<p>Finally, all mentions of linker in this paragraph refer to Microsoft
+linker version 7.x and later. Presence of
+<code><nobr>@feat.00</nobr></code> symbol and input data for "safe
+exception handler table" causes no backward incompatibilities and "safeseh"
+modules generated by NASM 2.03 and later can still be linked by earlier
+versions or non-Microsoft linkers.
+<h3><a name="section-7.6">7.6 <code><nobr>win64</nobr></code>: Microsoft Win64 Object Files</a></h3>
+<p>The <code><nobr>win64</nobr></code> output format generates Microsoft
+Win64 object files, which is nearly 100% identical to the
+<code><nobr>win32</nobr></code> object format
+(<a href="#section-7.5">section 7.5</a>) with the exception that it is
+meant to target 64-bit code and the x86-64 platform altogether. This object
+file is used exactly the same as the <code><nobr>win32</nobr></code> object
+format (<a href="#section-7.5">section 7.5</a>), in NASM, with regard to
+this exception.
+<h4><a name="section-7.6.1">7.6.1 <code><nobr>win64</nobr></code>: Writing Position-Independent Code</a></h4>
+<p>While <code><nobr>REL</nobr></code> takes good care of RIP-relative
+addressing, there is one aspect that is easy to overlook for a Win64
+programmer: indirect references. Consider a switch dispatch table:
+<p><pre>
+ jmp QWORD[dsptch+rax*8]
+ ...
+dsptch: dq case0
+ dq case1
+ ...
+</pre>
+<p>Even novice Win64 assembler programmer will soon realize that the code
+is not 64-bit savvy. Most notably linker will refuse to link it with
+"<code><nobr>'ADDR32' relocation to '.text' invalid without /LARGEADDRESSAWARE:NO</nobr></code>".
+So [s]he will have to split jmp instruction as following:
+<p><pre>
+ lea rbx,[rel dsptch]
+ jmp QWORD[rbx+rax*8]
+</pre>
+<p>What happens behind the scene is that effective address in
+<code><nobr>lea</nobr></code> is encoded relative to instruction pointer,
+or in perfectly position-independent manner. But this is only part of the
+problem! Trouble is that in .dll context <code><nobr>caseN</nobr></code>
+relocations will make their way to the final module and might have to be
+adjusted at .dll load time. To be specific when it can't be loaded at
+preferred address. And when this occurs, pages with such relocations will
+be rendered private to current process, which kind of undermines the idea
+of sharing .dll. But no worry, it's trivial to fix:
+<p><pre>
+ lea rbx,[rel dsptch]
+ add rbx,QWORD[rbx+rax*8]
+ jmp rbx
+ ...
+dsptch: dq case0-dsptch
+ dq case1-dsptch
+ ...
+</pre>
+<p>NASM version 2.03 and later provides another alternative,
+<code><nobr>wrt ..imagebase</nobr></code> operator, which returns offset
+from base address of the current image, be it .exe or .dll module,
+therefore the name. For those acquainted with PE-COFF format base address
+denotes start of <code><nobr>IMAGE_DOS_HEADER</nobr></code> structure. Here
+is how to implement switch with these image-relative references:
+<p><pre>
+ lea rbx,[rel dsptch]
+ mov eax,DWORD[rbx+rax*4]
+ sub rbx,dsptch wrt ..imagebase
+ add rbx,rax
+ jmp rbx
+ ...
+dsptch: dd case0 wrt ..imagebase
+ dd case1 wrt ..imagebase
+</pre>
+<p>One can argue that the operator is redundant. Indeed, snippet before
+last works just fine with any NASM version and is not even Windows
+specific... The real reason for implementing
+<code><nobr>wrt ..imagebase</nobr></code> will become apparent in next
+paragraph.
+<p>It should be noted that <code><nobr>wrt ..imagebase</nobr></code> is
+defined as 32-bit operand only:
+<p><pre>
+ dd label wrt ..imagebase ; ok
+ dq label wrt ..imagebase ; bad
+ mov eax,label wrt ..imagebase ; ok
+ mov rax,label wrt ..imagebase ; bad
+</pre>
+<h4><a name="section-7.6.2">7.6.2 <code><nobr>win64</nobr></code>: Structured Exception Handling</a></h4>
+<p>Structured exception handing in Win64 is completely different matter
+from Win32. Upon exception program counter value is noted, and
+linker-generated table comprising start and end addresses of all the
+functions [in given executable module] is traversed and compared to the
+saved program counter. Thus so called <code><nobr>UNWIND_INFO</nobr></code>
+structure is identified. If it's not found, then offending subroutine is
+assumed to be "leaf" and just mentioned lookup procedure is attempted for
+its caller. In Win64 leaf function is such function that does not call any
+other function <em>nor</em> modifies any Win64 non-volatile registers,
+including stack pointer. The latter ensures that it's possible to identify
+leaf function's caller by simply pulling the value from the top of the
+stack.
+<p>While majority of subroutines written in assembler are not calling any
+other function, requirement for non-volatile registers' immutability leaves
+developer with not more than 7 registers and no stack frame, which is not
+necessarily what [s]he counted with. Customarily one would meet the
+requirement by saving non-volatile registers on stack and restoring them
+upon return, so what can go wrong? If [and only if] an exception is raised
+at run-time and no <code><nobr>UNWIND_INFO</nobr></code> structure is
+associated with such "leaf" function, the stack unwind procedure will
+expect to find caller's return address on the top of stack immediately
+followed by its frame. Given that developer pushed caller's non-volatile
+registers on stack, would the value on top point at some code segment or
+even addressable space? Well, developer can attempt copying caller's return
+address to the top of stack and this would actually work in some very
+specific circumstances. But unless developer can guarantee that these
+circumstances are always met, it's more appropriate to assume worst case
+scenario, i.e. stack unwind procedure going berserk. Relevant question is
+what happens then? Application is abruptly terminated without any
+notification whatsoever. Just like in Win32 case, one can argue that system
+could at least have logged "unwind procedure went berserk in x.exe at
+address n" in event log, but no, no trace of failure is left.
+<p>Now, when we understand significance of the
+<code><nobr>UNWIND_INFO</nobr></code> structure, let's discuss what's in it
+and/or how it's processed. First of all it is checked for presence of
+reference to custom language-specific exception handler. If there is one,
+then it's invoked. Depending on the return value, execution flow is resumed
+(exception is said to be "handled"), <em>or</em> rest of
+<code><nobr>UNWIND_INFO</nobr></code> structure is processed as following.
+Beside optional reference to custom handler, it carries information about
+current callee's stack frame and where non-volatile registers are saved.
+Information is detailed enough to be able to reconstruct contents of
+caller's non-volatile registers upon call to current callee. And so
+caller's context is reconstructed, and then unwind procedure is repeated,
+i.e. another <code><nobr>UNWIND_INFO</nobr></code> structure is associated,
+this time, with caller's instruction pointer, which is then checked for
+presence of reference to language-specific handler, etc. The procedure is
+recursively repeated till exception is handled. As last resort system
+"handles" it by generating memory core dump and terminating the
+application.
+<p>As for the moment of this writing NASM unfortunately does not facilitate
+generation of above mentioned detailed information about stack frame
+layout. But as of version 2.03 it implements building blocks for generating
+structures involved in stack unwinding. As simplest example, here is how to
+deploy custom exception handler for leaf function:
+<p><pre>
+default rel
+section .text
+extern MessageBoxA
+handler:
+ sub rsp,40
+ mov rcx,0
+ lea rdx,[text]
+ lea r8,[caption]
+ mov r9,1 ; MB_OKCANCEL
+ call MessageBoxA
+ sub eax,1 ; incidentally suits as return value
+ ; for exception handler
+ add rsp,40
+ ret
+global main
+main:
+ xor rax,rax
+ mov rax,QWORD[rax] ; cause exception
+ ret
+main_end:
+text: db 'OK to rethrow, CANCEL to generate core dump',0
+caption:db 'SEGV',0
+
+section .pdata rdata align=4
+ dd main wrt ..imagebase
+ dd main_end wrt ..imagebase
+ dd xmain wrt ..imagebase
+section .xdata rdata align=8
+xmain: db 9,0,0,0
+ dd handler wrt ..imagebase
+section .drectve info
+ db '/defaultlib:user32.lib /defaultlib:msvcrt.lib '
+</pre>
+<p>What you see in <code><nobr>.pdata</nobr></code> section is element of
+the "table comprising start and end addresses of function" along with
+reference to associated <code><nobr>UNWIND_INFO</nobr></code> structure.
+And what you see in <code><nobr>.xdata</nobr></code> section is
+<code><nobr>UNWIND_INFO</nobr></code> structure describing function with no
+frame, but with designated exception handler. References are
+<em>required</em> to be image-relative (which is the real reason for
+implementing <code><nobr>wrt ..imagebase</nobr></code> operator). It should
+be noted that <code><nobr>rdata align=n</nobr></code>, as well as
+<code><nobr>wrt ..imagebase</nobr></code>, are optional in these two
+segments' contexts, i.e. can be omitted. Latter means that <em>all</em>
+32-bit references, not only above listed required ones, placed into these
+two segments turn out image-relative. Why is it important to understand?
+Developer is allowed to append handler-specific data to
+<code><nobr>UNWIND_INFO</nobr></code> structure, and if [s]he adds a 32-bit
+reference, then [s]he will have to remember to adjust its value to obtain
+the real pointer.
+<p>As already mentioned, in Win64 terms leaf function is one that does not
+call any other function <em>nor</em> modifies any non-volatile register,
+including stack pointer. But it's not uncommon that assembler programmer
+plans to utilize every single register and sometimes even have variable
+stack frame. Is there anything one can do with bare building blocks? I.e.
+besides manually composing fully-fledged
+<code><nobr>UNWIND_INFO</nobr></code> structure, which would surely be
+considered error-prone? Yes, there is. Recall that exception handler is
+called first, before stack layout is analyzed. As it turned out, it's
+perfectly possible to manipulate current callee's context in custom handler
+in manner that permits further stack unwinding. General idea is that
+handler would not actually "handle" the exception, but instead restore
+callee's context, as it was at its entry point and thus mimic leaf
+function. In other words, handler would simply undertake part of unwinding
+procedure. Consider following example:
+<p><pre>
+function:
+ mov rax,rsp ; copy rsp to volatile register
+ push r15 ; save non-volatile registers
+ push rbx
+ push rbp
+ mov r11,rsp ; prepare variable stack frame
+ sub r11,rcx
+ and r11,-64
+ mov QWORD[r11],rax ; check for exceptions
+ mov rsp,r11 ; allocate stack frame
+ mov QWORD[rsp],rax ; save original rsp value
+magic_point:
+ ...
+ mov r11,QWORD[rsp] ; pull original rsp value
+ mov rbp,QWORD[r11-24]
+ mov rbx,QWORD[r11-16]
+ mov r15,QWORD[r11-8]
+ mov rsp,r11 ; destroy frame
+ ret
+</pre>
+<p>The keyword is that up to <code><nobr>magic_point</nobr></code> original
+<code><nobr>rsp</nobr></code> value remains in chosen volatile register and
+no non-volatile register, except for <code><nobr>rsp</nobr></code>, is
+modified. While past <code><nobr>magic_point</nobr></code>
+<code><nobr>rsp</nobr></code> remains constant till the very end of the
+<code><nobr>function</nobr></code>. In this case custom language-specific
+exception handler would look like this:
+<p><pre>
+EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame,
+ CONTEXT *context,DISPATCHER_CONTEXT *disp)
+{ ULONG64 *rsp;
+ if (context-&gt;Rip&lt;(ULONG64)magic_point)
+ rsp = (ULONG64 *)context-&gt;Rax;
+ else
+ { rsp = ((ULONG64 **)context-&gt;Rsp)[0];
+ context-&gt;Rbp = rsp[-3];
+ context-&gt;Rbx = rsp[-2];
+ context-&gt;R15 = rsp[-1];
+ }
+ context-&gt;Rsp = (ULONG64)rsp;
+
+ memcpy (disp-&gt;ContextRecord,context,sizeof(CONTEXT));
+ RtlVirtualUnwind(UNW_FLAG_NHANDLER,disp-&gt;ImageBase,
+ dips-&gt;ControlPc,disp-&gt;FunctionEntry,disp-&gt;ContextRecord,
+ &amp;disp-&gt;HandlerData,&amp;disp-&gt;EstablisherFrame,NULL);
+ return ExceptionContinueSearch;
+}
+</pre>
+<p>As custom handler mimics leaf function, corresponding
+<code><nobr>UNWIND_INFO</nobr></code> structure does not have to contain
+any information about stack frame and its layout.
+<h3><a name="section-7.7">7.7 <code><nobr>coff</nobr></code>: Common Object File Format</a></h3>
+<p>The <code><nobr>coff</nobr></code> output type produces
+<code><nobr>COFF</nobr></code> object files suitable for linking with the
+DJGPP linker.
+<p><code><nobr>coff</nobr></code> provides a default output file-name
+extension of <code><nobr>.o</nobr></code>.
+<p>The <code><nobr>coff</nobr></code> format supports the same extensions
+to the <code><nobr>SECTION</nobr></code> directive as
+<code><nobr>win32</nobr></code> does, except that the
+<code><nobr>align</nobr></code> qualifier and the
+<code><nobr>info</nobr></code> section type are not supported.
+<h3><a name="section-7.8">7.8 <code><nobr>macho32</nobr></code> and <code><nobr>macho64</nobr></code>: Mach Object File Format</a></h3>
+<p>The <code><nobr>macho32</nobr></code> and
+<code><nobr>macho64</nobr></code> output formts produces
+<code><nobr>Mach-O</nobr></code> object files suitable for linking with the
+MacOS X linker. <code><nobr>macho</nobr></code> is a synonym for
+<code><nobr>macho32</nobr></code>.
+<p><code><nobr>macho</nobr></code> provides a default output file-name
+extension of <code><nobr>.o</nobr></code>.
+<h3><a name="section-7.9">7.9 <code><nobr>elf32</nobr></code> and <code><nobr>elf64</nobr></code>: Executable and Linkable Format Object Files</a></h3>
+<p>The <code><nobr>elf32</nobr></code> and <code><nobr>elf64</nobr></code>
+output formats generate <code><nobr>ELF32 and ELF64</nobr></code>
+(Executable and Linkable Format) object files, as used by Linux as well as
+Unix System V, including Solaris x86, UnixWare and SCO Unix.
+<code><nobr>elf</nobr></code> provides a default output file-name extension
+of <code><nobr>.o</nobr></code>. <code><nobr>elf</nobr></code> is a synonym
+for <code><nobr>elf32</nobr></code>.
+<h4><a name="section-7.9.1">7.9.1 ELF specific directive <code><nobr>osabi</nobr></code></a></h4>
+<p>The ELF header specifies the application binary interface for the target
+operating system (OSABI). This field can be set by using the
+<code><nobr>osabi</nobr></code> directive with the numeric value (0-255) of
+the target system. If this directive is not used, the default value will be
+"UNIX System V ABI" (0) which will work on most systems which support ELF.
+<h4><a name="section-7.9.2">7.9.2 <code><nobr>elf</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a></h4>
+<p>Like the <code><nobr>obj</nobr></code> format,
+<code><nobr>elf</nobr></code> allows you to specify additional information
+on the <code><nobr>SECTION</nobr></code> directive line, to control the
+type and properties of sections you declare. Section types and properties
+are generated automatically by NASM for the standard section names, but may
+still be overridden by these qualifiers.
+<p>The available qualifiers are:
+<ul>
+<li><code><nobr>alloc</nobr></code> defines the section to be one which is
+loaded into memory when the program is run.
+<code><nobr>noalloc</nobr></code> defines it to be one which is not, such
+as an informational or comment section.
+<li><code><nobr>exec</nobr></code> defines the section to be one which
+should have execute permission when the program is run.
+<code><nobr>noexec</nobr></code> defines it as one which should not.
+<li><code><nobr>write</nobr></code> defines the section to be one which
+should be writable when the program is run.
+<code><nobr>nowrite</nobr></code> defines it as one which should not.
+<li><code><nobr>progbits</nobr></code> defines the section to be one with
+explicit contents stored in the object file: an ordinary code or data
+section, for example, <code><nobr>nobits</nobr></code> defines the section
+to be one with no explicit contents given, such as a BSS section.
+<li><code><nobr>align=</nobr></code>, used with a trailing number as in
+<code><nobr>obj</nobr></code>, gives the alignment requirements of the
+section.
+<li><code><nobr>tls</nobr></code> defines the section to be one which
+contains thread local variables.
+</ul>
+<p>The defaults assumed by NASM if you do not specify the above qualifiers
+are:
+<p>
+<p><pre>
+section .text progbits alloc exec nowrite align=16
+section .rodata progbits alloc noexec nowrite align=4
+section .lrodata progbits alloc noexec nowrite align=4
+section .data progbits alloc noexec write align=4
+section .ldata progbits alloc noexec write align=4
+section .bss nobits alloc noexec write align=4
+section .lbss nobits alloc noexec write align=4
+section .tdata progbits alloc noexec write align=4 tls
+section .tbss nobits alloc noexec write align=4 tls
+section .comment progbits noalloc noexec nowrite align=1
+section other progbits alloc noexec nowrite align=1
+</pre>
+<p>(Any section name other than those in the above table is treated by
+default like <code><nobr>other</nobr></code> in the above table. Please
+note that section names are case sensitive.)
+<h4><a name="section-7.9.3">7.9.3 Position-Independent Code: <code><nobr>elf</nobr></code> Special Symbols and <code><nobr>WRT</nobr></code></a></h4>
+<p>The <code><nobr>ELF</nobr></code> specification contains enough features
+to allow position-independent code (PIC) to be written, which makes ELF
+shared libraries very flexible. However, it also means NASM has to be able
+to generate a variety of ELF specific relocation types in ELF object files,
+if it is to be an assembler which can write PIC.
+<p>Since <code><nobr>ELF</nobr></code> does not support segment-base
+references, the <code><nobr>WRT</nobr></code> operator is not used for its
+normal purpose; therefore NASM's <code><nobr>elf</nobr></code> output
+format makes use of <code><nobr>WRT</nobr></code> for a different purpose,
+namely the PIC-specific relocation types.
+<p><code><nobr>elf</nobr></code> defines five special symbols which you can
+use as the right-hand side of the <code><nobr>WRT</nobr></code> operator to
+obtain PIC relocation types. They are <code><nobr>..gotpc</nobr></code>,
+<code><nobr>..gotoff</nobr></code>, <code><nobr>..got</nobr></code>,
+<code><nobr>..plt</nobr></code> and <code><nobr>..sym</nobr></code>. Their
+functions are summarized here:
+<ul>
+<li>Referring to the symbol marking the global offset table base using
+<code><nobr>wrt ..gotpc</nobr></code> will end up giving the distance from
+the beginning of the current section to the global offset table.
+(<code><nobr>_GLOBAL_OFFSET_TABLE_</nobr></code> is the standard symbol
+name used to refer to the GOT.) So you would then need to add
+<code><nobr>$$</nobr></code> to the result to get the real address of the
+GOT.
+<li>Referring to a location in one of your own sections using
+<code><nobr>wrt ..gotoff</nobr></code> will give the distance from the
+beginning of the GOT to the specified location, so that adding on the
+address of the GOT would give the real address of the location you wanted.
+<li>Referring to an external or global symbol using
+<code><nobr>wrt ..got</nobr></code> causes the linker to build an entry
+<em>in</em> the GOT containing the address of the symbol, and the reference
+gives the distance from the beginning of the GOT to the entry; so you can
+add on the address of the GOT, load from the resulting address, and end up
+with the address of the symbol.
+<li>Referring to a procedure name using <code><nobr>wrt ..plt</nobr></code>
+causes the linker to build a procedure linkage table entry for the symbol,
+and the reference gives the address of the PLT entry. You can only use this
+in contexts which would generate a PC-relative relocation normally (i.e. as
+the destination for <code><nobr>CALL</nobr></code> or
+<code><nobr>JMP</nobr></code>), since ELF contains no relocation type to
+refer to PLT entries absolutely.
+<li>Referring to a symbol name using <code><nobr>wrt ..sym</nobr></code>
+causes NASM to write an ordinary relocation, but instead of making the
+relocation relative to the start of the section and then adding on the
+offset to the symbol, it will write a relocation record aimed directly at
+the symbol in question. The distinction is a necessary one due to a
+peculiarity of the dynamic linker.
+</ul>
+<p>A fuller explanation of how to use these relocation types to write
+shared libraries entirely in NASM is given in
+<a href="nasmdoc9.html#section-9.2">section 9.2</a>.
+<h4><a name="section-7.9.4">7.9.4 Thread Local Storage: <code><nobr>elf</nobr></code> Special Symbols and <code><nobr>WRT</nobr></code></a></h4>
+<ul>
+<li>In ELF32 mode, referring to an external or global symbol using
+<code><nobr>wrt ..tlsie</nobr></code> causes the linker to build an entry
+<em>in</em> the GOT containing the offset of the symbol within the TLS
+block, so you can access the value of the symbol with code such as:
+</ul>
+<p><pre>
+ mov eax,[tid wrt ..tlsie]
+ mov [gs:eax],ebx
+</pre>
+<ul>
+<li>In ELF64 mode, referring to an external or global symbol using
+<code><nobr>wrt ..gottpoff</nobr></code> causes the linker to build an
+entry <em>in</em> the GOT containing the offset of the symbol within the
+TLS block, so you can access the value of the symbol with code such as:
+</ul>
+<p><pre>
+ mov rax,[rel tid wrt ..gottpoff]
+ mov rcx,[fs:rax]
+</pre>
+<h4><a name="section-7.9.5">7.9.5 <code><nobr>elf</nobr></code> Extensions to the <code><nobr>GLOBAL</nobr></code> Directive</a></h4>
+<p><code><nobr>ELF</nobr></code> object files can contain more information
+about a global symbol than just its address: they can contain the size of
+the symbol and its type as well. These are not merely debugger
+conveniences, but are actually necessary when the program being written is
+a shared library. NASM therefore supports some extensions to the
+<code><nobr>GLOBAL</nobr></code> directive, allowing you to specify these
+features.
+<p>You can specify whether a global variable is a function or a data object
+by suffixing the name with a colon and the word
+<code><nobr>function</nobr></code> or <code><nobr>data</nobr></code>.
+(<code><nobr>object</nobr></code> is a synonym for
+<code><nobr>data</nobr></code>.) For example:
+<p><pre>
+global hashlookup:function, hashtable:data
+</pre>
+<p>exports the global symbol <code><nobr>hashlookup</nobr></code> as a
+function and <code><nobr>hashtable</nobr></code> as a data object.
+<p>Optionally, you can control the ELF visibility of the symbol. Just add
+one of the visibility keywords: <code><nobr>default</nobr></code>,
+<code><nobr>internal</nobr></code>, <code><nobr>hidden</nobr></code>, or
+<code><nobr>protected</nobr></code>. The default is
+<code><nobr>default</nobr></code> of course. For example, to make
+<code><nobr>hashlookup</nobr></code> hidden:
+<p><pre>
+global hashlookup:function hidden
+</pre>
+<p>You can also specify the size of the data associated with the symbol, as
+a numeric expression (which may involve labels, and even forward
+references) after the type specifier. Like this:
+<p><pre>
+global hashtable:data (hashtable.end - hashtable)
+
+hashtable:
+ db this,that,theother ; some data here
+.end:
+</pre>
+<p>This makes NASM automatically calculate the length of the table and
+place that information into the <code><nobr>ELF</nobr></code> symbol table.
+<p>Declaring the type and size of global symbols is necessary when writing
+shared library code. For more information, see
+<a href="nasmdoc9.html#section-9.2.4">section 9.2.4</a>.
+<h4><a name="section-7.9.6">7.9.6 <code><nobr>elf</nobr></code> Extensions to the <code><nobr>COMMON</nobr></code> Directive </a></h4>
+<p><code><nobr>ELF</nobr></code> also allows you to specify alignment
+requirements on common variables. This is done by putting a number (which
+must be a power of two) after the name and size of the common variable,
+separated (as usual) by a colon. For example, an array of doublewords would
+benefit from 4-byte alignment:
+<p><pre>
+common dwordarray 128:4
+</pre>
+<p>This declares the total size of the array to be 128 bytes, and requires
+that it be aligned on a 4-byte boundary.
+<h4><a name="section-7.9.7">7.9.7 16-bit code and ELF </a></h4>
+<p>The <code><nobr>ELF32</nobr></code> specification doesn't provide
+relocations for 8- and 16-bit values, but the GNU
+<code><nobr>ld</nobr></code> linker adds these as an extension. NASM can
+generate GNU-compatible relocations, to allow 16-bit code to be linked as
+ELF using GNU <code><nobr>ld</nobr></code>. If NASM is used with the
+<code><nobr>-w+gnu-elf-extensions</nobr></code> option, a warning is issued
+when one of these relocations is generated.
+<h4><a name="section-7.9.8">7.9.8 Debug formats and ELF </a></h4>
+<p><code><nobr>ELF32</nobr></code> and <code><nobr>ELF64</nobr></code>
+provide debug information in <code><nobr>STABS</nobr></code> and
+<code><nobr>DWARF</nobr></code> formats. Line number information is
+generated for all executable sections, but please note that only the
+".text" section is executable by default.
+<h3><a name="section-7.10">7.10 <code><nobr>aout</nobr></code>: Linux <code><nobr>a.out</nobr></code> Object Files</a></h3>
+<p>The <code><nobr>aout</nobr></code> format generates
+<code><nobr>a.out</nobr></code> object files, in the form used by early
+Linux systems (current Linux systems use ELF, see
+<a href="#section-7.9">section 7.9</a>.) These differ from other
+<code><nobr>a.out</nobr></code> object files in that the magic number in
+the first four bytes of the file is different; also, some implementations
+of <code><nobr>a.out</nobr></code>, for example NetBSD's, support
+position-independent code, which Linux's implementation does not.
+<p><code><nobr>a.out</nobr></code> provides a default output file-name
+extension of <code><nobr>.o</nobr></code>.
+<p><code><nobr>a.out</nobr></code> is a very simple object format. It
+supports no special directives, no special symbols, no use of
+<code><nobr>SEG</nobr></code> or <code><nobr>WRT</nobr></code>, and no
+extensions to any standard directives. It supports only the three standard
+section names <code><nobr>.text</nobr></code>,
+<code><nobr>.data</nobr></code> and <code><nobr>.bss</nobr></code>.
+<h3><a name="section-7.11">7.11 <code><nobr>aoutb</nobr></code>: NetBSD/FreeBSD/OpenBSD <code><nobr>a.out</nobr></code> Object Files</a></h3>
+<p>The <code><nobr>aoutb</nobr></code> format generates
+<code><nobr>a.out</nobr></code> object files, in the form used by the
+various free <code><nobr>BSD Unix</nobr></code> clones,
+<code><nobr>NetBSD</nobr></code>, <code><nobr>FreeBSD</nobr></code> and
+<code><nobr>OpenBSD</nobr></code>. For simple object files, this object
+format is exactly the same as <code><nobr>aout</nobr></code> except for the
+magic number in the first four bytes of the file. However, the
+<code><nobr>aoutb</nobr></code> format supports position-independent code
+in the same way as the <code><nobr>elf</nobr></code> format, so you can use
+it to write <code><nobr>BSD</nobr></code> shared libraries.
+<p><code><nobr>aoutb</nobr></code> provides a default output file-name
+extension of <code><nobr>.o</nobr></code>.
+<p><code><nobr>aoutb</nobr></code> supports no special directives, no
+special symbols, and only the three standard section names
+<code><nobr>.text</nobr></code>, <code><nobr>.data</nobr></code> and
+<code><nobr>.bss</nobr></code>. However, it also supports the same use of
+<code><nobr>WRT</nobr></code> as <code><nobr>elf</nobr></code> does, to
+provide position-independent code relocation types. See
+<a href="#section-7.9.3">section 7.9.3</a> for full documentation of this
+feature.
+<p><code><nobr>aoutb</nobr></code> also supports the same extensions to the
+<code><nobr>GLOBAL</nobr></code> directive as <code><nobr>elf</nobr></code>
+does: see <a href="#section-7.9.5">section 7.9.5</a> for documentation of
+this.
+<h3><a name="section-7.12">7.12 <code><nobr>as86</nobr></code>: Minix/Linux <code><nobr>as86</nobr></code> Object Files</a></h3>
+<p>The Minix/Linux 16-bit assembler <code><nobr>as86</nobr></code> has its
+own non-standard object file format. Although its companion linker
+<code><nobr>ld86</nobr></code> produces something close to ordinary
+<code><nobr>a.out</nobr></code> binaries as output, the object file format
+used to communicate between <code><nobr>as86</nobr></code> and
+<code><nobr>ld86</nobr></code> is not itself
+<code><nobr>a.out</nobr></code>.
+<p>NASM supports this format, just in case it is useful, as
+<code><nobr>as86</nobr></code>. <code><nobr>as86</nobr></code> provides a
+default output file-name extension of <code><nobr>.o</nobr></code>.
+<p><code><nobr>as86</nobr></code> is a very simple object format (from the
+NASM user's point of view). It supports no special directives, no use of
+<code><nobr>SEG</nobr></code> or <code><nobr>WRT</nobr></code>, and no
+extensions to any standard directives. It supports only the three standard
+section names <code><nobr>.text</nobr></code>,
+<code><nobr>.data</nobr></code> and <code><nobr>.bss</nobr></code>. The
+only special symbol supported is <code><nobr>..start</nobr></code>.
+<h3><a name="section-7.13">7.13 <code><nobr>rdf</nobr></code>: Relocatable Dynamic Object File Format</a></h3>
+<p>The <code><nobr>rdf</nobr></code> output format produces
+<code><nobr>RDOFF</nobr></code> object files.
+<code><nobr>RDOFF</nobr></code> (Relocatable Dynamic Object File Format) is
+a home-grown object-file format, designed alongside NASM itself and
+reflecting in its file format the internal structure of the assembler.
+<p><code><nobr>RDOFF</nobr></code> is not used by any well-known operating
+systems. Those writing their own systems, however, may well wish to use
+<code><nobr>RDOFF</nobr></code> as their object format, on the grounds that
+it is designed primarily for simplicity and contains very little
+file-header bureaucracy.
+<p>The Unix NASM archive, and the DOS archive which includes sources, both
+contain an <code><nobr>rdoff</nobr></code> subdirectory holding a set of
+RDOFF utilities: an RDF linker, an <code><nobr>RDF</nobr></code>
+static-library manager, an RDF file dump utility, and a program which will
+load and execute an RDF executable under Linux.
+<p><code><nobr>rdf</nobr></code> supports only the standard section names
+<code><nobr>.text</nobr></code>, <code><nobr>.data</nobr></code> and
+<code><nobr>.bss</nobr></code>.
+<h4><a name="section-7.13.1">7.13.1 Requiring a Library: The <code><nobr>LIBRARY</nobr></code> Directive</a></h4>
+<p><code><nobr>RDOFF</nobr></code> contains a mechanism for an object file
+to demand a given library to be linked to the module, either at load time
+or run time. This is done by the <code><nobr>LIBRARY</nobr></code>
+directive, which takes one argument which is the name of the module:
+<p><pre>
+ library mylib.rdl
+</pre>
+<h4><a name="section-7.13.2">7.13.2 Specifying a Module Name: The <code><nobr>MODULE</nobr></code> Directive</a></h4>
+<p>Special <code><nobr>RDOFF</nobr></code> header record is used to store
+the name of the module. It can be used, for example, by run-time loader to
+perform dynamic linking. <code><nobr>MODULE</nobr></code> directive takes
+one argument which is the name of current module:
+<p><pre>
+ module mymodname
+</pre>
+<p>Note that when you statically link modules and tell linker to strip the
+symbols from output file, all module names will be stripped too. To avoid
+it, you should start module names with <code><nobr>$</nobr></code>, like:
+<p><pre>
+ module $kernel.core
+</pre>
+<h4><a name="section-7.13.3">7.13.3 <code><nobr>rdf</nobr></code> Extensions to the <code><nobr>GLOBAL</nobr></code> Directive</a></h4>
+<p><code><nobr>RDOFF</nobr></code> global symbols can contain additional
+information needed by the static linker. You can mark a global symbol as
+exported, thus telling the linker do not strip it from target executable or
+library file. Like in <code><nobr>ELF</nobr></code>, you can also specify
+whether an exported symbol is a procedure (function) or data object.
+<p>Suffixing the name with a colon and the word
+<code><nobr>export</nobr></code> you make the symbol exported:
+<p><pre>
+ global sys_open:export
+</pre>
+<p>To specify that exported symbol is a procedure (function), you add the
+word <code><nobr>proc</nobr></code> or <code><nobr>function</nobr></code>
+after declaration:
+<p><pre>
+ global sys_open:export proc
+</pre>
+<p>Similarly, to specify exported data object, add the word
+<code><nobr>data</nobr></code> or <code><nobr>object</nobr></code> to the
+directive:
+<p><pre>
+ global kernel_ticks:export data
+</pre>
+<h4><a name="section-7.13.4">7.13.4 <code><nobr>rdf</nobr></code> Extensions to the <code><nobr>EXTERN</nobr></code> Directive</a></h4>
+<p>By default the <code><nobr>EXTERN</nobr></code> directive in
+<code><nobr>RDOFF</nobr></code> declares a "pure external" symbol (i.e. the
+static linker will complain if such a symbol is not resolved). To declare
+an "imported" symbol, which must be resolved later during a dynamic linking
+phase, <code><nobr>RDOFF</nobr></code> offers an additional
+<code><nobr>import</nobr></code> modifier. As in
+<code><nobr>GLOBAL</nobr></code>, you can also specify whether an imported
+symbol is a procedure (function) or data object. For example:
+<p><pre>
+ library $libc
+ extern _open:import
+ extern _printf:import proc
+ extern _errno:import data
+</pre>
+<p>Here the directive <code><nobr>LIBRARY</nobr></code> is also included,
+which gives the dynamic linker a hint as to where to find requested
+symbols.
+<h3><a name="section-7.14">7.14 <code><nobr>dbg</nobr></code>: Debugging Format</a></h3>
+<p>The <code><nobr>dbg</nobr></code> output format is not built into NASM
+in the default configuration. If you are building your own NASM executable
+from the sources, you can define <code><nobr>OF_DBG</nobr></code> in
+<code><nobr>output/outform.h</nobr></code> or on the compiler command line,
+and obtain the <code><nobr>dbg</nobr></code> output format.
+<p>The <code><nobr>dbg</nobr></code> format does not output an object file
+as such; instead, it outputs a text file which contains a complete list of
+all the transactions between the main body of NASM and the output-format
+back end module. It is primarily intended to aid people who want to write
+their own output drivers, so that they can get a clearer idea of the
+various requests the main program makes of the output driver, and in what
+order they happen.
+<p>For simple files, one can easily use the <code><nobr>dbg</nobr></code>
+format like this:
+<p><pre>
+nasm -f dbg filename.asm
+</pre>
+<p>which will generate a diagnostic file called
+<code><nobr>filename.dbg</nobr></code>. However, this will not work well on
+files which were designed for a different object format, because each
+object format defines its own macros (usually user-level forms of
+directives), and those macros will not be defined in the
+<code><nobr>dbg</nobr></code> format. Therefore it can be useful to run
+NASM twice, in order to do the preprocessing with the native object format
+selected:
+<p><pre>
+nasm -e -f rdf -o rdfprog.i rdfprog.asm
+nasm -a -f dbg rdfprog.i
+</pre>
+<p>This preprocesses <code><nobr>rdfprog.asm</nobr></code> into
+<code><nobr>rdfprog.i</nobr></code>, keeping the
+<code><nobr>rdf</nobr></code> object format selected in order to make sure
+RDF special directives are converted into primitive form correctly. Then
+the preprocessed source is fed through the <code><nobr>dbg</nobr></code>
+format to generate the final diagnostic output.
+<p>This workaround will still typically not work for programs intended for
+<code><nobr>obj</nobr></code> format, because the
+<code><nobr>obj</nobr></code> <code><nobr>SEGMENT</nobr></code> and
+<code><nobr>GROUP</nobr></code> directives have side effects of defining
+the segment and group names as symbols; <code><nobr>dbg</nobr></code> will
+not do this, so the program will not assemble. You will have to work around
+that by defining the symbols yourself (using
+<code><nobr>EXTERN</nobr></code>, for example) if you really need to get a
+<code><nobr>dbg</nobr></code> trace of an
+<code><nobr>obj</nobr></code>-specific source file.
+<p><code><nobr>dbg</nobr></code> accepts any section name and any
+directives at all, and logs them all to its output file.
+<p align=center><a href="nasmdoc8.html">Next Chapter</a> |
+<a href="nasmdoc6.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdoc8.html b/doc/html/nasmdoc8.html
new file mode 100644
index 0000000..a7c2869
--- /dev/null
+++ b/doc/html/nasmdoc8.html
@@ -0,0 +1,808 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdoc9.html">Next Chapter</a> |
+<a href="nasmdoc7.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="chapter-8">Chapter 8: Writing 16-bit Code (DOS, Windows 3/3.1)</a></h2>
+<p>This chapter attempts to cover some of the common issues encountered
+when writing 16-bit code to run under <code><nobr>MS-DOS</nobr></code> or
+<code><nobr>Windows 3.x</nobr></code>. It covers how to link programs to
+produce <code><nobr>.EXE</nobr></code> or <code><nobr>.COM</nobr></code>
+files, how to write <code><nobr>.SYS</nobr></code> device drivers, and how
+to interface assembly language code with 16-bit C compilers and with
+Borland Pascal.
+<h3><a name="section-8.1">8.1 Producing <code><nobr>.EXE</nobr></code> Files</a></h3>
+<p>Any large program written under DOS needs to be built as a
+<code><nobr>.EXE</nobr></code> file: only <code><nobr>.EXE</nobr></code>
+files have the necessary internal structure required to span more than one
+64K segment. Windows programs, also, have to be built as
+<code><nobr>.EXE</nobr></code> files, since Windows does not support the
+<code><nobr>.COM</nobr></code> format.
+<p>In general, you generate <code><nobr>.EXE</nobr></code> files by using
+the <code><nobr>obj</nobr></code> output format to produce one or more
+<code><nobr>.OBJ</nobr></code> files, and then linking them together using
+a linker. However, NASM also supports the direct generation of simple DOS
+<code><nobr>.EXE</nobr></code> files using the
+<code><nobr>bin</nobr></code> output format (by using
+<code><nobr>DB</nobr></code> and <code><nobr>DW</nobr></code> to construct
+the <code><nobr>.EXE</nobr></code> file header), and a macro package is
+supplied to do this. Thanks to Yann Guidon for contributing the code for
+this.
+<p>NASM may also support <code><nobr>.EXE</nobr></code> natively as another
+output format in future releases.
+<h4><a name="section-8.1.1">8.1.1 Using the <code><nobr>obj</nobr></code> Format To Generate <code><nobr>.EXE</nobr></code> Files</a></h4>
+<p>This section describes the usual method of generating
+<code><nobr>.EXE</nobr></code> files by linking
+<code><nobr>.OBJ</nobr></code> files together.
+<p>Most 16-bit programming language packages come with a suitable linker;
+if you have none of these, there is a free linker called VAL, available in
+<code><nobr>LZH</nobr></code> archive format from
+<a href="ftp://x2ftp.oulu.fi/pub/msdos/programming/lang/"><code><nobr>x2ftp.oulu.fi</nobr></code></a>.
+An LZH archiver can be found at
+<a href="ftp://ftp.simtel.net/pub/simtelnet/msdos/arcers"><code><nobr>ftp.simtel.net</nobr></code></a>.
+There is another `free' linker (though this one doesn't come with sources)
+called FREELINK, available from
+<a href="http://www.pcorner.com/tpc/old/3-101.html"><code><nobr>www.pcorner.com</nobr></code></a>.
+A third, <code><nobr>djlink</nobr></code>, written by DJ Delorie, is
+available at
+<a href="http://www.delorie.com/djgpp/16bit/djlink/"><code><nobr>www.delorie.com</nobr></code></a>.
+A fourth linker, <code><nobr>ALINK</nobr></code>, written by Anthony A.J.
+Williams, is available at
+<a href="http://alink.sourceforge.net"><code><nobr>alink.sourceforge.net</nobr></code></a>.
+<p>When linking several <code><nobr>.OBJ</nobr></code> files into a
+<code><nobr>.EXE</nobr></code> file, you should ensure that exactly one of
+them has a start point defined (using the <code><nobr>..start</nobr></code>
+special symbol defined by the <code><nobr>obj</nobr></code> format: see
+<a href="nasmdoc7.html#section-7.4.6">section 7.4.6</a>). If no module
+defines a start point, the linker will not know what value to give the
+entry-point field in the output file header; if more than one defines a
+start point, the linker will not know <em>which</em> value to use.
+<p>An example of a NASM source file which can be assembled to a
+<code><nobr>.OBJ</nobr></code> file and linked on its own to a
+<code><nobr>.EXE</nobr></code> is given here. It demonstrates the basic
+principles of defining a stack, initialising the segment registers, and
+declaring a start point. This file is also provided in the
+<code><nobr>test</nobr></code> subdirectory of the NASM archives, under the
+name <code><nobr>objexe.asm</nobr></code>.
+<p><pre>
+segment code
+
+..start:
+ mov ax,data
+ mov ds,ax
+ mov ax,stack
+ mov ss,ax
+ mov sp,stacktop
+</pre>
+<p>This initial piece of code sets up <code><nobr>DS</nobr></code> to point
+to the data segment, and initializes <code><nobr>SS</nobr></code> and
+<code><nobr>SP</nobr></code> to point to the top of the provided stack.
+Notice that interrupts are implicitly disabled for one instruction after a
+move into <code><nobr>SS</nobr></code>, precisely for this situation, so
+that there's no chance of an interrupt occurring between the loads of
+<code><nobr>SS</nobr></code> and <code><nobr>SP</nobr></code> and not
+having a stack to execute on.
+<p>Note also that the special symbol <code><nobr>..start</nobr></code> is
+defined at the beginning of this code, which means that will be the entry
+point into the resulting executable file.
+<p><pre>
+ mov dx,hello
+ mov ah,9
+ int 0x21
+</pre>
+<p>The above is the main program: load <code><nobr>DS:DX</nobr></code> with
+a pointer to the greeting message (<code><nobr>hello</nobr></code> is
+implicitly relative to the segment <code><nobr>data</nobr></code>, which
+was loaded into <code><nobr>DS</nobr></code> in the setup code, so the full
+pointer is valid), and call the DOS print-string function.
+<p><pre>
+ mov ax,0x4c00
+ int 0x21
+</pre>
+<p>This terminates the program using another DOS system call.
+<p><pre>
+segment data
+
+hello: db 'hello, world', 13, 10, '$'
+</pre>
+<p>The data segment contains the string we want to display.
+<p><pre>
+segment stack stack
+ resb 64
+stacktop:
+</pre>
+<p>The above code declares a stack segment containing 64 bytes of
+uninitialized stack space, and points <code><nobr>stacktop</nobr></code> at
+the top of it. The directive <code><nobr>segment stack stack</nobr></code>
+defines a segment <em>called</em> <code><nobr>stack</nobr></code>, and also
+of <em>type</em> <code><nobr>STACK</nobr></code>. The latter is not
+necessary to the correct running of the program, but linkers are likely to
+issue warnings or errors if your program has no segment of type
+<code><nobr>STACK</nobr></code>.
+<p>The above file, when assembled into a <code><nobr>.OBJ</nobr></code>
+file, will link on its own to a valid <code><nobr>.EXE</nobr></code> file,
+which when run will print `hello, world' and then exit.
+<h4><a name="section-8.1.2">8.1.2 Using the <code><nobr>bin</nobr></code> Format To Generate <code><nobr>.EXE</nobr></code> Files</a></h4>
+<p>The <code><nobr>.EXE</nobr></code> file format is simple enough that
+it's possible to build a <code><nobr>.EXE</nobr></code> file by writing a
+pure-binary program and sticking a 32-byte header on the front. This header
+is simple enough that it can be generated using
+<code><nobr>DB</nobr></code> and <code><nobr>DW</nobr></code> commands by
+NASM itself, so that you can use the <code><nobr>bin</nobr></code> output
+format to directly generate <code><nobr>.EXE</nobr></code> files.
+<p>Included in the NASM archives, in the <code><nobr>misc</nobr></code>
+subdirectory, is a file <code><nobr>exebin.mac</nobr></code> of macros. It
+defines three macros: <code><nobr>EXE_begin</nobr></code>,
+<code><nobr>EXE_stack</nobr></code> and <code><nobr>EXE_end</nobr></code>.
+<p>To produce a <code><nobr>.EXE</nobr></code> file using this method, you
+should start by using <code><nobr>%include</nobr></code> to load the
+<code><nobr>exebin.mac</nobr></code> macro package into your source file.
+You should then issue the <code><nobr>EXE_begin</nobr></code> macro call
+(which takes no arguments) to generate the file header data. Then write
+code as normal for the <code><nobr>bin</nobr></code> format - you can use
+all three standard sections <code><nobr>.text</nobr></code>,
+<code><nobr>.data</nobr></code> and <code><nobr>.bss</nobr></code>. At the
+end of the file you should call the <code><nobr>EXE_end</nobr></code> macro
+(again, no arguments), which defines some symbols to mark section sizes,
+and these symbols are referred to in the header code generated by
+<code><nobr>EXE_begin</nobr></code>.
+<p>In this model, the code you end up writing starts at
+<code><nobr>0x100</nobr></code>, just like a <code><nobr>.COM</nobr></code>
+file - in fact, if you strip off the 32-byte header from the resulting
+<code><nobr>.EXE</nobr></code> file, you will have a valid
+<code><nobr>.COM</nobr></code> program. All the segment bases are the same,
+so you are limited to a 64K program, again just like a
+<code><nobr>.COM</nobr></code> file. Note that an
+<code><nobr>ORG</nobr></code> directive is issued by the
+<code><nobr>EXE_begin</nobr></code> macro, so you should not explicitly
+issue one of your own.
+<p>You can't directly refer to your segment base value, unfortunately,
+since this would require a relocation in the header, and things would get a
+lot more complicated. So you should get your segment base by copying it out
+of <code><nobr>CS</nobr></code> instead.
+<p>On entry to your <code><nobr>.EXE</nobr></code> file,
+<code><nobr>SS:SP</nobr></code> are already set up to point to the top of a
+2Kb stack. You can adjust the default stack size of 2Kb by calling the
+<code><nobr>EXE_stack</nobr></code> macro. For example, to change the stack
+size of your program to 64 bytes, you would call
+<code><nobr>EXE_stack 64</nobr></code>.
+<p>A sample program which generates a <code><nobr>.EXE</nobr></code> file
+in this way is given in the <code><nobr>test</nobr></code> subdirectory of
+the NASM archive, as <code><nobr>binexe.asm</nobr></code>.
+<h3><a name="section-8.2">8.2 Producing <code><nobr>.COM</nobr></code> Files</a></h3>
+<p>While large DOS programs must be written as
+<code><nobr>.EXE</nobr></code> files, small ones are often better written
+as <code><nobr>.COM</nobr></code> files. <code><nobr>.COM</nobr></code>
+files are pure binary, and therefore most easily produced using the
+<code><nobr>bin</nobr></code> output format.
+<h4><a name="section-8.2.1">8.2.1 Using the <code><nobr>bin</nobr></code> Format To Generate <code><nobr>.COM</nobr></code> Files</a></h4>
+<p><code><nobr>.COM</nobr></code> files expect to be loaded at offset
+<code><nobr>100h</nobr></code> into their segment (though the segment may
+change). Execution then begins at <code><nobr>100h</nobr></code>, i.e.
+right at the start of the program. So to write a
+<code><nobr>.COM</nobr></code> program, you would create a source file
+looking like
+<p><pre>
+ org 100h
+
+section .text
+
+start:
+ ; put your code here
+
+section .data
+
+ ; put data items here
+
+section .bss
+
+ ; put uninitialized data here
+</pre>
+<p>The <code><nobr>bin</nobr></code> format puts the
+<code><nobr>.text</nobr></code> section first in the file, so you can
+declare data or BSS items before beginning to write code if you want to and
+the code will still end up at the front of the file where it belongs.
+<p>The BSS (uninitialized data) section does not take up space in the
+<code><nobr>.COM</nobr></code> file itself: instead, addresses of BSS items
+are resolved to point at space beyond the end of the file, on the grounds
+that this will be free memory when the program is run. Therefore you should
+not rely on your BSS being initialized to all zeros when you run.
+<p>To assemble the above program, you should use a command line like
+<p><pre>
+nasm myprog.asm -fbin -o myprog.com
+</pre>
+<p>The <code><nobr>bin</nobr></code> format would produce a file called
+<code><nobr>myprog</nobr></code> if no explicit output file name were
+specified, so you have to override it and give the desired file name.
+<h4><a name="section-8.2.2">8.2.2 Using the <code><nobr>obj</nobr></code> Format To Generate <code><nobr>.COM</nobr></code> Files</a></h4>
+<p>If you are writing a <code><nobr>.COM</nobr></code> program as more than
+one module, you may wish to assemble several <code><nobr>.OBJ</nobr></code>
+files and link them together into a <code><nobr>.COM</nobr></code> program.
+You can do this, provided you have a linker capable of outputting
+<code><nobr>.COM</nobr></code> files directly (TLINK does this), or
+alternatively a converter program such as <code><nobr>EXE2BIN</nobr></code>
+to transform the <code><nobr>.EXE</nobr></code> file output from the linker
+into a <code><nobr>.COM</nobr></code> file.
+<p>If you do this, you need to take care of several things:
+<ul>
+<li>The first object file containing code should start its code segment
+with a line like <code><nobr>RESB 100h</nobr></code>. This is to ensure
+that the code begins at offset <code><nobr>100h</nobr></code> relative to
+the beginning of the code segment, so that the linker or converter program
+does not have to adjust address references within the file when generating
+the <code><nobr>.COM</nobr></code> file. Other assemblers use an
+<code><nobr>ORG</nobr></code> directive for this purpose, but
+<code><nobr>ORG</nobr></code> in NASM is a format-specific directive to the
+<code><nobr>bin</nobr></code> output format, and does not mean the same
+thing as it does in MASM-compatible assemblers.
+<li>You don't need to define a stack segment.
+<li>All your segments should be in the same group, so that every time your
+code or data references a symbol offset, all offsets are relative to the
+same segment base. This is because, when a <code><nobr>.COM</nobr></code>
+file is loaded, all the segment registers contain the same value.
+</ul>
+<h3><a name="section-8.3">8.3 Producing <code><nobr>.SYS</nobr></code> Files</a></h3>
+<p>MS-DOS device drivers - <code><nobr>.SYS</nobr></code> files - are pure
+binary files, similar to <code><nobr>.COM</nobr></code> files, except that
+they start at origin zero rather than <code><nobr>100h</nobr></code>.
+Therefore, if you are writing a device driver using the
+<code><nobr>bin</nobr></code> format, you do not need the
+<code><nobr>ORG</nobr></code> directive, since the default origin for
+<code><nobr>bin</nobr></code> is zero. Similarly, if you are using
+<code><nobr>obj</nobr></code>, you do not need the
+<code><nobr>RESB 100h</nobr></code> at the start of your code segment.
+<p><code><nobr>.SYS</nobr></code> files start with a header structure,
+containing pointers to the various routines inside the driver which do the
+work. This structure should be defined at the start of the code segment,
+even though it is not actually code.
+<p>For more information on the format of <code><nobr>.SYS</nobr></code>
+files, and the data which has to go in the header structure, a list of
+books is given in the Frequently Asked Questions list for the newsgroup
+<a href="news:comp.os.msdos.programmer"><code><nobr>comp.os.msdos.programmer</nobr></code></a>.
+<h3><a name="section-8.4">8.4 Interfacing to 16-bit C Programs</a></h3>
+<p>This section covers the basics of writing assembly routines that call,
+or are called from, C programs. To do this, you would typically write an
+assembly module as a <code><nobr>.OBJ</nobr></code> file, and link it with
+your C modules to produce a mixed-language program.
+<h4><a name="section-8.4.1">8.4.1 External Symbol Names</a></h4>
+<p>C compilers have the convention that the names of all global symbols
+(functions or data) they define are formed by prefixing an underscore to
+the name as it appears in the C program. So, for example, the function a C
+programmer thinks of as <code><nobr>printf</nobr></code> appears to an
+assembly language programmer as <code><nobr>_printf</nobr></code>. This
+means that in your assembly programs, you can define symbols without a
+leading underscore, and not have to worry about name clashes with C
+symbols.
+<p>If you find the underscores inconvenient, you can define macros to
+replace the <code><nobr>GLOBAL</nobr></code> and
+<code><nobr>EXTERN</nobr></code> directives as follows:
+<p><pre>
+%macro cglobal 1
+
+ global _%1
+ %define %1 _%1
+
+%endmacro
+
+%macro cextern 1
+
+ extern _%1
+ %define %1 _%1
+
+%endmacro
+</pre>
+<p>(These forms of the macros only take one argument at a time; a
+<code><nobr>%rep</nobr></code> construct could solve this.)
+<p>If you then declare an external like this:
+<p><pre>
+cextern printf
+</pre>
+<p>then the macro will expand it as
+<p><pre>
+extern _printf
+%define printf _printf
+</pre>
+<p>Thereafter, you can reference <code><nobr>printf</nobr></code> as if it
+was a symbol, and the preprocessor will put the leading underscore on where
+necessary.
+<p>The <code><nobr>cglobal</nobr></code> macro works similarly. You must
+use <code><nobr>cglobal</nobr></code> before defining the symbol in
+question, but you would have had to do that anyway if you used
+<code><nobr>GLOBAL</nobr></code>.
+<p>Also see <a href="nasmdoc2.html#section-2.1.27">section 2.1.27</a>.
+<h4><a name="section-8.4.2">8.4.2 Memory Models</a></h4>
+<p>NASM contains no mechanism to support the various C memory models
+directly; you have to keep track yourself of which one you are writing for.
+This means you have to keep track of the following things:
+<ul>
+<li>In models using a single code segment (tiny, small and compact),
+functions are near. This means that function pointers, when stored in data
+segments or pushed on the stack as function arguments, are 16 bits long and
+contain only an offset field (the <code><nobr>CS</nobr></code> register
+never changes its value, and always gives the segment part of the full
+function address), and that functions are called using ordinary near
+<code><nobr>CALL</nobr></code> instructions and return using
+<code><nobr>RETN</nobr></code> (which, in NASM, is synonymous with
+<code><nobr>RET</nobr></code> anyway). This means both that you should
+write your own routines to return with <code><nobr>RETN</nobr></code>, and
+that you should call external C routines with near
+<code><nobr>CALL</nobr></code> instructions.
+<li>In models using more than one code segment (medium, large and huge),
+functions are far. This means that function pointers are 32 bits long
+(consisting of a 16-bit offset followed by a 16-bit segment), and that
+functions are called using <code><nobr>CALL FAR</nobr></code> (or
+<code><nobr>CALL seg:offset</nobr></code>) and return using
+<code><nobr>RETF</nobr></code>. Again, you should therefore write your own
+routines to return with <code><nobr>RETF</nobr></code> and use
+<code><nobr>CALL FAR</nobr></code> to call external routines.
+<li>In models using a single data segment (tiny, small and medium), data
+pointers are 16 bits long, containing only an offset field (the
+<code><nobr>DS</nobr></code> register doesn't change its value, and always
+gives the segment part of the full data item address).
+<li>In models using more than one data segment (compact, large and huge),
+data pointers are 32 bits long, consisting of a 16-bit offset followed by a
+16-bit segment. You should still be careful not to modify
+<code><nobr>DS</nobr></code> in your routines without restoring it
+afterwards, but <code><nobr>ES</nobr></code> is free for you to use to
+access the contents of 32-bit data pointers you are passed.
+<li>The huge memory model allows single data items to exceed 64K in size.
+In all other memory models, you can access the whole of a data item just by
+doing arithmetic on the offset field of the pointer you are given, whether
+a segment field is present or not; in huge model, you have to be more
+careful of your pointer arithmetic.
+<li>In most memory models, there is a <em>default</em> data segment, whose
+segment address is kept in <code><nobr>DS</nobr></code> throughout the
+program. This data segment is typically the same segment as the stack, kept
+in <code><nobr>SS</nobr></code>, so that functions' local variables (which
+are stored on the stack) and global data items can both be accessed easily
+without changing <code><nobr>DS</nobr></code>. Particularly large data
+items are typically stored in other segments. However, some memory models
+(though not the standard ones, usually) allow the assumption that
+<code><nobr>SS</nobr></code> and <code><nobr>DS</nobr></code> hold the same
+value to be removed. Be careful about functions' local variables in this
+latter case.
+</ul>
+<p>In models with a single code segment, the segment is called
+<code><nobr>_TEXT</nobr></code>, so your code segment must also go by this
+name in order to be linked into the same place as the main code segment. In
+models with a single data segment, or with a default data segment, it is
+called <code><nobr>_DATA</nobr></code>.
+<h4><a name="section-8.4.3">8.4.3 Function Definitions and Function Calls</a></h4>
+<p>The C calling convention in 16-bit programs is as follows. In the
+following description, the words <em>caller</em> and <em>callee</em> are
+used to denote the function doing the calling and the function which gets
+called.
+<ul>
+<li>The caller pushes the function's parameters on the stack, one after
+another, in reverse order (right to left, so that the first argument
+specified to the function is pushed last).
+<li>The caller then executes a <code><nobr>CALL</nobr></code> instruction
+to pass control to the callee. This <code><nobr>CALL</nobr></code> is
+either near or far depending on the memory model.
+<li>The callee receives control, and typically (although this is not
+actually necessary, in functions which do not need to access their
+parameters) starts by saving the value of <code><nobr>SP</nobr></code> in
+<code><nobr>BP</nobr></code> so as to be able to use
+<code><nobr>BP</nobr></code> as a base pointer to find its parameters on
+the stack. However, the caller was probably doing this too, so part of the
+calling convention states that <code><nobr>BP</nobr></code> must be
+preserved by any C function. Hence the callee, if it is going to set up
+<code><nobr>BP</nobr></code> as a <em>frame pointer</em>, must push the
+previous value first.
+<li>The callee may then access its parameters relative to
+<code><nobr>BP</nobr></code>. The word at <code><nobr>[BP]</nobr></code>
+holds the previous value of <code><nobr>BP</nobr></code> as it was pushed;
+the next word, at <code><nobr>[BP+2]</nobr></code>, holds the offset part
+of the return address, pushed implicitly by <code><nobr>CALL</nobr></code>.
+In a small-model (near) function, the parameters start after that, at
+<code><nobr>[BP+4]</nobr></code>; in a large-model (far) function, the
+segment part of the return address lives at
+<code><nobr>[BP+4]</nobr></code>, and the parameters begin at
+<code><nobr>[BP+6]</nobr></code>. The leftmost parameter of the function,
+since it was pushed last, is accessible at this offset from
+<code><nobr>BP</nobr></code>; the others follow, at successively greater
+offsets. Thus, in a function such as <code><nobr>printf</nobr></code> which
+takes a variable number of parameters, the pushing of the parameters in
+reverse order means that the function knows where to find its first
+parameter, which tells it the number and type of the remaining ones.
+<li>The callee may also wish to decrease <code><nobr>SP</nobr></code>
+further, so as to allocate space on the stack for local variables, which
+will then be accessible at negative offsets from
+<code><nobr>BP</nobr></code>.
+<li>The callee, if it wishes to return a value to the caller, should leave
+the value in <code><nobr>AL</nobr></code>, <code><nobr>AX</nobr></code> or
+<code><nobr>DX:AX</nobr></code> depending on the size of the value.
+Floating-point results are sometimes (depending on the compiler) returned
+in <code><nobr>ST0</nobr></code>.
+<li>Once the callee has finished processing, it restores
+<code><nobr>SP</nobr></code> from <code><nobr>BP</nobr></code> if it had
+allocated local stack space, then pops the previous value of
+<code><nobr>BP</nobr></code>, and returns via
+<code><nobr>RETN</nobr></code> or <code><nobr>RETF</nobr></code> depending
+on memory model.
+<li>When the caller regains control from the callee, the function
+parameters are still on the stack, so it typically adds an immediate
+constant to <code><nobr>SP</nobr></code> to remove them (instead of
+executing a number of slow <code><nobr>POP</nobr></code> instructions).
+Thus, if a function is accidentally called with the wrong number of
+parameters due to a prototype mismatch, the stack will still be returned to
+a sensible state since the caller, which <em>knows</em> how many parameters
+it pushed, does the removing.
+</ul>
+<p>It is instructive to compare this calling convention with that for
+Pascal programs (described in <a href="#section-8.5.1">section 8.5.1</a>).
+Pascal has a simpler convention, since no functions have variable numbers
+of parameters. Therefore the callee knows how many parameters it should
+have been passed, and is able to deallocate them from the stack itself by
+passing an immediate argument to the <code><nobr>RET</nobr></code> or
+<code><nobr>RETF</nobr></code> instruction, so the caller does not have to
+do it. Also, the parameters are pushed in left-to-right order, not
+right-to-left, which means that a compiler can give better guarantees about
+sequence points without performance suffering.
+<p>Thus, you would define a function in C style in the following way. The
+following example is for small model:
+<p><pre>
+global _myfunc
+
+_myfunc:
+ push bp
+ mov bp,sp
+ sub sp,0x40 ; 64 bytes of local stack space
+ mov bx,[bp+4] ; first parameter to function
+
+ ; some more code
+
+ mov sp,bp ; undo "sub sp,0x40" above
+ pop bp
+ ret
+</pre>
+<p>For a large-model function, you would replace
+<code><nobr>RET</nobr></code> by <code><nobr>RETF</nobr></code>, and look
+for the first parameter at <code><nobr>[BP+6]</nobr></code> instead of
+<code><nobr>[BP+4]</nobr></code>. Of course, if one of the parameters is a
+pointer, then the offsets of <em>subsequent</em> parameters will change
+depending on the memory model as well: far pointers take up four bytes on
+the stack when passed as a parameter, whereas near pointers take up two.
+<p>At the other end of the process, to call a C function from your assembly
+code, you would do something like this:
+<p><pre>
+extern _printf
+
+ ; and then, further down...
+
+ push word [myint] ; one of my integer variables
+ push word mystring ; pointer into my data segment
+ call _printf
+ add sp,byte 4 ; `byte' saves space
+
+ ; then those data items...
+
+segment _DATA
+
+myint dw 1234
+mystring db 'This number -&gt; %d &lt;- should be 1234',10,0
+</pre>
+<p>This piece of code is the small-model assembly equivalent of the C code
+<p><pre>
+ int myint = 1234;
+ printf("This number -&gt; %d &lt;- should be 1234\n", myint);
+</pre>
+<p>In large model, the function-call code might look more like this. In
+this example, it is assumed that <code><nobr>DS</nobr></code> already holds
+the segment base of the segment <code><nobr>_DATA</nobr></code>. If not,
+you would have to initialize it first.
+<p><pre>
+ push word [myint]
+ push word seg mystring ; Now push the segment, and...
+ push word mystring ; ... offset of "mystring"
+ call far _printf
+ add sp,byte 6
+</pre>
+<p>The integer value still takes up one word on the stack, since large
+model does not affect the size of the <code><nobr>int</nobr></code> data
+type. The first argument (pushed last) to <code><nobr>printf</nobr></code>,
+however, is a data pointer, and therefore has to contain a segment and
+offset part. The segment should be stored second in memory, and therefore
+must be pushed first. (Of course, <code><nobr>PUSH DS</nobr></code> would
+have been a shorter instruction than
+<code><nobr>PUSH WORD SEG mystring</nobr></code>, if
+<code><nobr>DS</nobr></code> was set up as the above example assumed.) Then
+the actual call becomes a far call, since functions expect far calls in
+large model; and <code><nobr>SP</nobr></code> has to be increased by 6
+rather than 4 afterwards to make up for the extra word of parameters.
+<h4><a name="section-8.4.4">8.4.4 Accessing Data Items</a></h4>
+<p>To get at the contents of C variables, or to declare variables which C
+can access, you need only declare the names as
+<code><nobr>GLOBAL</nobr></code> or <code><nobr>EXTERN</nobr></code>.
+(Again, the names require leading underscores, as stated in
+<a href="#section-8.4.1">section 8.4.1</a>.) Thus, a C variable declared as
+<code><nobr>int i</nobr></code> can be accessed from assembler as
+<p><pre>
+extern _i
+
+ mov ax,[_i]
+</pre>
+<p>And to declare your own integer variable which C programs can access as
+<code><nobr>extern int j</nobr></code>, you do this (making sure you are
+assembling in the <code><nobr>_DATA</nobr></code> segment, if necessary):
+<p><pre>
+global _j
+
+_j dw 0
+</pre>
+<p>To access a C array, you need to know the size of the components of the
+array. For example, <code><nobr>int</nobr></code> variables are two bytes
+long, so if a C program declares an array as
+<code><nobr>int a[10]</nobr></code>, you can access
+<code><nobr>a[3]</nobr></code> by coding
+<code><nobr>mov ax,[_a+6]</nobr></code>. (The byte offset 6 is obtained by
+multiplying the desired array index, 3, by the size of the array element,
+2.) The sizes of the C base types in 16-bit compilers are: 1 for
+<code><nobr>char</nobr></code>, 2 for <code><nobr>short</nobr></code> and
+<code><nobr>int</nobr></code>, 4 for <code><nobr>long</nobr></code> and
+<code><nobr>float</nobr></code>, and 8 for
+<code><nobr>double</nobr></code>.
+<p>To access a C data structure, you need to know the offset from the base
+of the structure to the field you are interested in. You can either do this
+by converting the C structure definition into a NASM structure definition
+(using <code><nobr>STRUC</nobr></code>), or by calculating the one offset
+and using just that.
+<p>To do either of these, you should read your C compiler's manual to find
+out how it organizes data structures. NASM gives no special alignment to
+structure members in its own <code><nobr>STRUC</nobr></code> macro, so you
+have to specify alignment yourself if the C compiler generates it.
+Typically, you might find that a structure like
+<p><pre>
+struct {
+ char c;
+ int i;
+} foo;
+</pre>
+<p>might be four bytes long rather than three, since the
+<code><nobr>int</nobr></code> field would be aligned to a two-byte
+boundary. However, this sort of feature tends to be a configurable option
+in the C compiler, either using command-line options or
+<code><nobr>#pragma</nobr></code> lines, so you have to find out how your
+own compiler does it.
+<h4><a name="section-8.4.5">8.4.5 <code><nobr>c16.mac</nobr></code>: Helper Macros for the 16-bit C Interface</a></h4>
+<p>Included in the NASM archives, in the <code><nobr>misc</nobr></code>
+directory, is a file <code><nobr>c16.mac</nobr></code> of macros. It
+defines three macros: <code><nobr>proc</nobr></code>,
+<code><nobr>arg</nobr></code> and <code><nobr>endproc</nobr></code>. These
+are intended to be used for C-style procedure definitions, and they
+automate a lot of the work involved in keeping track of the calling
+convention.
+<p>(An alternative, TASM compatible form of <code><nobr>arg</nobr></code>
+is also now built into NASM's preprocessor. See
+<a href="nasmdoc4.html#section-4.8">section 4.8</a> for details.)
+<p>An example of an assembly function using the macro set is given here:
+<p><pre>
+proc _nearproc
+
+%$i arg
+%$j arg
+ mov ax,[bp + %$i]
+ mov bx,[bp + %$j]
+ add ax,[bx]
+
+endproc
+</pre>
+<p>This defines <code><nobr>_nearproc</nobr></code> to be a procedure
+taking two arguments, the first (<code><nobr>i</nobr></code>) an integer
+and the second (<code><nobr>j</nobr></code>) a pointer to an integer. It
+returns <code><nobr>i + *j</nobr></code>.
+<p>Note that the <code><nobr>arg</nobr></code> macro has an
+<code><nobr>EQU</nobr></code> as the first line of its expansion, and since
+the label before the macro call gets prepended to the first line of the
+expanded macro, the <code><nobr>EQU</nobr></code> works, defining
+<code><nobr>%$i</nobr></code> to be an offset from
+<code><nobr>BP</nobr></code>. A context-local variable is used, local to
+the context pushed by the <code><nobr>proc</nobr></code> macro and popped
+by the <code><nobr>endproc</nobr></code> macro, so that the same argument
+name can be used in later procedures. Of course, you don't <em>have</em> to
+do that.
+<p>The macro set produces code for near functions (tiny, small and
+compact-model code) by default. You can have it generate far functions
+(medium, large and huge-model code) by means of coding
+<code><nobr>%define FARCODE</nobr></code>. This changes the kind of return
+instruction generated by <code><nobr>endproc</nobr></code>, and also
+changes the starting point for the argument offsets. The macro set contains
+no intrinsic dependency on whether data pointers are far or not.
+<p><code><nobr>arg</nobr></code> can take an optional parameter, giving the
+size of the argument. If no size is given, 2 is assumed, since it is likely
+that many function parameters will be of type
+<code><nobr>int</nobr></code>.
+<p>The large-model equivalent of the above function would look like this:
+<p><pre>
+%define FARCODE
+
+proc _farproc
+
+%$i arg
+%$j arg 4
+ mov ax,[bp + %$i]
+ mov bx,[bp + %$j]
+ mov es,[bp + %$j + 2]
+ add ax,[bx]
+
+endproc
+</pre>
+<p>This makes use of the argument to the <code><nobr>arg</nobr></code>
+macro to define a parameter of size 4, because <code><nobr>j</nobr></code>
+is now a far pointer. When we load from <code><nobr>j</nobr></code>, we
+must load a segment and an offset.
+<h3><a name="section-8.5">8.5 Interfacing to Borland Pascal Programs</a></h3>
+<p>Interfacing to Borland Pascal programs is similar in concept to
+interfacing to 16-bit C programs. The differences are:
+<ul>
+<li>The leading underscore required for interfacing to C programs is not
+required for Pascal.
+<li>The memory model is always large: functions are far, data pointers are
+far, and no data item can be more than 64K long. (Actually, some functions
+are near, but only those functions that are local to a Pascal unit and
+never called from outside it. All assembly functions that Pascal calls, and
+all Pascal functions that assembly routines are able to call, are far.)
+However, all static data declared in a Pascal program goes into the default
+data segment, which is the one whose segment address will be in
+<code><nobr>DS</nobr></code> when control is passed to your assembly code.
+The only things that do not live in the default data segment are local
+variables (they live in the stack segment) and dynamically allocated
+variables. All data <em>pointers</em>, however, are far.
+<li>The function calling convention is different - described below.
+<li>Some data types, such as strings, are stored differently.
+<li>There are restrictions on the segment names you are allowed to use -
+Borland Pascal will ignore code or data declared in a segment it doesn't
+like the name of. The restrictions are described below.
+</ul>
+<h4><a name="section-8.5.1">8.5.1 The Pascal Calling Convention</a></h4>
+<p>The 16-bit Pascal calling convention is as follows. In the following
+description, the words <em>caller</em> and <em>callee</em> are used to
+denote the function doing the calling and the function which gets called.
+<ul>
+<li>The caller pushes the function's parameters on the stack, one after
+another, in normal order (left to right, so that the first argument
+specified to the function is pushed first).
+<li>The caller then executes a far <code><nobr>CALL</nobr></code>
+instruction to pass control to the callee.
+<li>The callee receives control, and typically (although this is not
+actually necessary, in functions which do not need to access their
+parameters) starts by saving the value of <code><nobr>SP</nobr></code> in
+<code><nobr>BP</nobr></code> so as to be able to use
+<code><nobr>BP</nobr></code> as a base pointer to find its parameters on
+the stack. However, the caller was probably doing this too, so part of the
+calling convention states that <code><nobr>BP</nobr></code> must be
+preserved by any function. Hence the callee, if it is going to set up
+<code><nobr>BP</nobr></code> as a frame pointer, must push the previous
+value first.
+<li>The callee may then access its parameters relative to
+<code><nobr>BP</nobr></code>. The word at <code><nobr>[BP]</nobr></code>
+holds the previous value of <code><nobr>BP</nobr></code> as it was pushed.
+The next word, at <code><nobr>[BP+2]</nobr></code>, holds the offset part
+of the return address, and the next one at <code><nobr>[BP+4]</nobr></code>
+the segment part. The parameters begin at <code><nobr>[BP+6]</nobr></code>.
+The rightmost parameter of the function, since it was pushed last, is
+accessible at this offset from <code><nobr>BP</nobr></code>; the others
+follow, at successively greater offsets.
+<li>The callee may also wish to decrease <code><nobr>SP</nobr></code>
+further, so as to allocate space on the stack for local variables, which
+will then be accessible at negative offsets from
+<code><nobr>BP</nobr></code>.
+<li>The callee, if it wishes to return a value to the caller, should leave
+the value in <code><nobr>AL</nobr></code>, <code><nobr>AX</nobr></code> or
+<code><nobr>DX:AX</nobr></code> depending on the size of the value.
+Floating-point results are returned in <code><nobr>ST0</nobr></code>.
+Results of type <code><nobr>Real</nobr></code> (Borland's own custom
+floating-point data type, not handled directly by the FPU) are returned in
+<code><nobr>DX:BX:AX</nobr></code>. To return a result of type
+<code><nobr>String</nobr></code>, the caller pushes a pointer to a
+temporary string before pushing the parameters, and the callee places the
+returned string value at that location. The pointer is not a parameter, and
+should not be removed from the stack by the <code><nobr>RETF</nobr></code>
+instruction.
+<li>Once the callee has finished processing, it restores
+<code><nobr>SP</nobr></code> from <code><nobr>BP</nobr></code> if it had
+allocated local stack space, then pops the previous value of
+<code><nobr>BP</nobr></code>, and returns via
+<code><nobr>RETF</nobr></code>. It uses the form of
+<code><nobr>RETF</nobr></code> with an immediate parameter, giving the
+number of bytes taken up by the parameters on the stack. This causes the
+parameters to be removed from the stack as a side effect of the return
+instruction.
+<li>When the caller regains control from the callee, the function
+parameters have already been removed from the stack, so it needs to do
+nothing further.
+</ul>
+<p>Thus, you would define a function in Pascal style, taking two
+<code><nobr>Integer</nobr></code>-type parameters, in the following way:
+<p><pre>
+global myfunc
+
+myfunc: push bp
+ mov bp,sp
+ sub sp,0x40 ; 64 bytes of local stack space
+ mov bx,[bp+8] ; first parameter to function
+ mov bx,[bp+6] ; second parameter to function
+
+ ; some more code
+
+ mov sp,bp ; undo "sub sp,0x40" above
+ pop bp
+ retf 4 ; total size of params is 4
+</pre>
+<p>At the other end of the process, to call a Pascal function from your
+assembly code, you would do something like this:
+<p><pre>
+extern SomeFunc
+
+ ; and then, further down...
+
+ push word seg mystring ; Now push the segment, and...
+ push word mystring ; ... offset of "mystring"
+ push word [myint] ; one of my variables
+ call far SomeFunc
+</pre>
+<p>This is equivalent to the Pascal code
+<p><pre>
+procedure SomeFunc(String: PChar; Int: Integer);
+ SomeFunc(@mystring, myint);
+</pre>
+<h4><a name="section-8.5.2">8.5.2 Borland Pascal Segment Name Restrictions</a></h4>
+<p>Since Borland Pascal's internal unit file format is completely different
+from <code><nobr>OBJ</nobr></code>, it only makes a very sketchy job of
+actually reading and understanding the various information contained in a
+real <code><nobr>OBJ</nobr></code> file when it links that in. Therefore an
+object file intended to be linked to a Pascal program must obey a number of
+restrictions:
+<ul>
+<li>Procedures and functions must be in a segment whose name is either
+<code><nobr>CODE</nobr></code>, <code><nobr>CSEG</nobr></code>, or
+something ending in <code><nobr>_TEXT</nobr></code>.
+<li>initialized data must be in a segment whose name is either
+<code><nobr>CONST</nobr></code> or something ending in
+<code><nobr>_DATA</nobr></code>.
+<li>Uninitialized data must be in a segment whose name is either
+<code><nobr>DATA</nobr></code>, <code><nobr>DSEG</nobr></code>, or
+something ending in <code><nobr>_BSS</nobr></code>.
+<li>Any other segments in the object file are completely ignored.
+<code><nobr>GROUP</nobr></code> directives and segment attributes are also
+ignored.
+</ul>
+<h4><a name="section-8.5.3">8.5.3 Using <code><nobr>c16.mac</nobr></code> With Pascal Programs</a></h4>
+<p>The <code><nobr>c16.mac</nobr></code> macro package, described in
+<a href="#section-8.4.5">section 8.4.5</a>, can also be used to simplify
+writing functions to be called from Pascal programs, if you code
+<code><nobr>%define PASCAL</nobr></code>. This definition ensures that
+functions are far (it implies <code><nobr>FARCODE</nobr></code>), and also
+causes procedure return instructions to be generated with an operand.
+<p>Defining <code><nobr>PASCAL</nobr></code> does not change the code which
+calculates the argument offsets; you must declare your function's arguments
+in reverse order. For example:
+<p><pre>
+%define PASCAL
+
+proc _pascalproc
+
+%$j arg 4
+%$i arg
+ mov ax,[bp + %$i]
+ mov bx,[bp + %$j]
+ mov es,[bp + %$j + 2]
+ add ax,[bx]
+
+endproc
+</pre>
+<p>This defines the same routine, conceptually, as the example in
+<a href="#section-8.4.5">section 8.4.5</a>: it defines a function taking
+two arguments, an integer and a pointer to an integer, which returns the
+sum of the integer and the contents of the pointer. The only difference
+between this code and the large-model C version is that
+<code><nobr>PASCAL</nobr></code> is defined instead of
+<code><nobr>FARCODE</nobr></code>, and that the arguments are declared in
+reverse order.
+<p align=center><a href="nasmdoc9.html">Next Chapter</a> |
+<a href="nasmdoc7.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdoc9.html b/doc/html/nasmdoc9.html
new file mode 100644
index 0000000..811af7c
--- /dev/null
+++ b/doc/html/nasmdoc9.html
@@ -0,0 +1,482 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdo10.html">Next Chapter</a> |
+<a href="nasmdoc8.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="chapter-9">Chapter 9: Writing 32-bit Code (Unix, Win32, DJGPP)</a></h2>
+<p>This chapter attempts to cover some of the common issues involved when
+writing 32-bit code, to run under Win32 or Unix, or to be linked with C
+code generated by a Unix-style C compiler such as DJGPP. It covers how to
+write assembly code to interface with 32-bit C routines, and how to write
+position-independent code for shared libraries.
+<p>Almost all 32-bit code, and in particular all code running under
+<code><nobr>Win32</nobr></code>, <code><nobr>DJGPP</nobr></code> or any of
+the PC Unix variants, runs in <em>flat</em> memory model. This means that
+the segment registers and paging have already been set up to give you the
+same 32-bit 4Gb address space no matter what segment you work relative to,
+and that you should ignore all segment registers completely. When writing
+flat-model application code, you never need to use a segment override or
+modify any segment register, and the code-section addresses you pass to
+<code><nobr>CALL</nobr></code> and <code><nobr>JMP</nobr></code> live in
+the same address space as the data-section addresses you access your
+variables by and the stack-section addresses you access local variables and
+procedure parameters by. Every address is 32 bits long and contains only an
+offset part.
+<h3><a name="section-9.1">9.1 Interfacing to 32-bit C Programs</a></h3>
+<p>A lot of the discussion in <a href="nasmdoc8.html#section-8.4">section
+8.4</a>, about interfacing to 16-bit C programs, still applies when working
+in 32 bits. The absence of memory models or segmentation worries simplifies
+things a lot.
+<h4><a name="section-9.1.1">9.1.1 External Symbol Names</a></h4>
+<p>Most 32-bit C compilers share the convention used by 16-bit compilers,
+that the names of all global symbols (functions or data) they define are
+formed by prefixing an underscore to the name as it appears in the C
+program. However, not all of them do: the <code><nobr>ELF</nobr></code>
+specification states that C symbols do <em>not</em> have a leading
+underscore on their assembly-language names.
+<p>The older Linux <code><nobr>a.out</nobr></code> C compiler, all
+<code><nobr>Win32</nobr></code> compilers, <code><nobr>DJGPP</nobr></code>,
+and <code><nobr>NetBSD</nobr></code> and <code><nobr>FreeBSD</nobr></code>,
+all use the leading underscore; for these compilers, the macros
+<code><nobr>cextern</nobr></code> and <code><nobr>cglobal</nobr></code>, as
+given in <a href="nasmdoc8.html#section-8.4.1">section 8.4.1</a>, will
+still work. For <code><nobr>ELF</nobr></code>, though, the leading
+underscore should not be used.
+<p>See also <a href="nasmdoc2.html#section-2.1.27">section 2.1.27</a>.
+<h4><a name="section-9.1.2">9.1.2 Function Definitions and Function Calls</a></h4>
+<p>The C calling convention in 32-bit programs is as follows. In the
+following description, the words <em>caller</em> and <em>callee</em> are
+used to denote the function doing the calling and the function which gets
+called.
+<ul>
+<li>The caller pushes the function's parameters on the stack, one after
+another, in reverse order (right to left, so that the first argument
+specified to the function is pushed last).
+<li>The caller then executes a near <code><nobr>CALL</nobr></code>
+instruction to pass control to the callee.
+<li>The callee receives control, and typically (although this is not
+actually necessary, in functions which do not need to access their
+parameters) starts by saving the value of <code><nobr>ESP</nobr></code> in
+<code><nobr>EBP</nobr></code> so as to be able to use
+<code><nobr>EBP</nobr></code> as a base pointer to find its parameters on
+the stack. However, the caller was probably doing this too, so part of the
+calling convention states that <code><nobr>EBP</nobr></code> must be
+preserved by any C function. Hence the callee, if it is going to set up
+<code><nobr>EBP</nobr></code> as a frame pointer, must push the previous
+value first.
+<li>The callee may then access its parameters relative to
+<code><nobr>EBP</nobr></code>. The doubleword at
+<code><nobr>[EBP]</nobr></code> holds the previous value of
+<code><nobr>EBP</nobr></code> as it was pushed; the next doubleword, at
+<code><nobr>[EBP+4]</nobr></code>, holds the return address, pushed
+implicitly by <code><nobr>CALL</nobr></code>. The parameters start after
+that, at <code><nobr>[EBP+8]</nobr></code>. The leftmost parameter of the
+function, since it was pushed last, is accessible at this offset from
+<code><nobr>EBP</nobr></code>; the others follow, at successively greater
+offsets. Thus, in a function such as <code><nobr>printf</nobr></code> which
+takes a variable number of parameters, the pushing of the parameters in
+reverse order means that the function knows where to find its first
+parameter, which tells it the number and type of the remaining ones.
+<li>The callee may also wish to decrease <code><nobr>ESP</nobr></code>
+further, so as to allocate space on the stack for local variables, which
+will then be accessible at negative offsets from
+<code><nobr>EBP</nobr></code>.
+<li>The callee, if it wishes to return a value to the caller, should leave
+the value in <code><nobr>AL</nobr></code>, <code><nobr>AX</nobr></code> or
+<code><nobr>EAX</nobr></code> depending on the size of the value.
+Floating-point results are typically returned in
+<code><nobr>ST0</nobr></code>.
+<li>Once the callee has finished processing, it restores
+<code><nobr>ESP</nobr></code> from <code><nobr>EBP</nobr></code> if it had
+allocated local stack space, then pops the previous value of
+<code><nobr>EBP</nobr></code>, and returns via
+<code><nobr>RET</nobr></code> (equivalently,
+<code><nobr>RETN</nobr></code>).
+<li>When the caller regains control from the callee, the function
+parameters are still on the stack, so it typically adds an immediate
+constant to <code><nobr>ESP</nobr></code> to remove them (instead of
+executing a number of slow <code><nobr>POP</nobr></code> instructions).
+Thus, if a function is accidentally called with the wrong number of
+parameters due to a prototype mismatch, the stack will still be returned to
+a sensible state since the caller, which <em>knows</em> how many parameters
+it pushed, does the removing.
+</ul>
+<p>There is an alternative calling convention used by Win32 programs for
+Windows API calls, and also for functions called <em>by</em> the Windows
+API such as window procedures: they follow what Microsoft calls the
+<code><nobr>__stdcall</nobr></code> convention. This is slightly closer to
+the Pascal convention, in that the callee clears the stack by passing a
+parameter to the <code><nobr>RET</nobr></code> instruction. However, the
+parameters are still pushed in right-to-left order.
+<p>Thus, you would define a function in C style in the following way:
+<p><pre>
+global _myfunc
+
+_myfunc:
+ push ebp
+ mov ebp,esp
+ sub esp,0x40 ; 64 bytes of local stack space
+ mov ebx,[ebp+8] ; first parameter to function
+
+ ; some more code
+
+ leave ; mov esp,ebp / pop ebp
+ ret
+</pre>
+<p>At the other end of the process, to call a C function from your assembly
+code, you would do something like this:
+<p><pre>
+extern _printf
+
+ ; and then, further down...
+
+ push dword [myint] ; one of my integer variables
+ push dword mystring ; pointer into my data segment
+ call _printf
+ add esp,byte 8 ; `byte' saves space
+
+ ; then those data items...
+
+segment _DATA
+
+myint dd 1234
+mystring db 'This number -&gt; %d &lt;- should be 1234',10,0
+</pre>
+<p>This piece of code is the assembly equivalent of the C code
+<p><pre>
+ int myint = 1234;
+ printf("This number -&gt; %d &lt;- should be 1234\n", myint);
+</pre>
+<h4><a name="section-9.1.3">9.1.3 Accessing Data Items</a></h4>
+<p>To get at the contents of C variables, or to declare variables which C
+can access, you need only declare the names as
+<code><nobr>GLOBAL</nobr></code> or <code><nobr>EXTERN</nobr></code>.
+(Again, the names require leading underscores, as stated in
+<a href="#section-9.1.1">section 9.1.1</a>.) Thus, a C variable declared as
+<code><nobr>int i</nobr></code> can be accessed from assembler as
+<p><pre>
+ extern _i
+ mov eax,[_i]
+</pre>
+<p>And to declare your own integer variable which C programs can access as
+<code><nobr>extern int j</nobr></code>, you do this (making sure you are
+assembling in the <code><nobr>_DATA</nobr></code> segment, if necessary):
+<p><pre>
+ global _j
+_j dd 0
+</pre>
+<p>To access a C array, you need to know the size of the components of the
+array. For example, <code><nobr>int</nobr></code> variables are four bytes
+long, so if a C program declares an array as
+<code><nobr>int a[10]</nobr></code>, you can access
+<code><nobr>a[3]</nobr></code> by coding
+<code><nobr>mov ax,[_a+12]</nobr></code>. (The byte offset 12 is obtained
+by multiplying the desired array index, 3, by the size of the array
+element, 4.) The sizes of the C base types in 32-bit compilers are: 1 for
+<code><nobr>char</nobr></code>, 2 for <code><nobr>short</nobr></code>, 4
+for <code><nobr>int</nobr></code>, <code><nobr>long</nobr></code> and
+<code><nobr>float</nobr></code>, and 8 for
+<code><nobr>double</nobr></code>. Pointers, being 32-bit addresses, are
+also 4 bytes long.
+<p>To access a C data structure, you need to know the offset from the base
+of the structure to the field you are interested in. You can either do this
+by converting the C structure definition into a NASM structure definition
+(using <code><nobr>STRUC</nobr></code>), or by calculating the one offset
+and using just that.
+<p>To do either of these, you should read your C compiler's manual to find
+out how it organizes data structures. NASM gives no special alignment to
+structure members in its own <code><nobr>STRUC</nobr></code> macro, so you
+have to specify alignment yourself if the C compiler generates it.
+Typically, you might find that a structure like
+<p><pre>
+struct {
+ char c;
+ int i;
+} foo;
+</pre>
+<p>might be eight bytes long rather than five, since the
+<code><nobr>int</nobr></code> field would be aligned to a four-byte
+boundary. However, this sort of feature is sometimes a configurable option
+in the C compiler, either using command-line options or
+<code><nobr>#pragma</nobr></code> lines, so you have to find out how your
+own compiler does it.
+<h4><a name="section-9.1.4">9.1.4 <code><nobr>c32.mac</nobr></code>: Helper Macros for the 32-bit C Interface</a></h4>
+<p>Included in the NASM archives, in the <code><nobr>misc</nobr></code>
+directory, is a file <code><nobr>c32.mac</nobr></code> of macros. It
+defines three macros: <code><nobr>proc</nobr></code>,
+<code><nobr>arg</nobr></code> and <code><nobr>endproc</nobr></code>. These
+are intended to be used for C-style procedure definitions, and they
+automate a lot of the work involved in keeping track of the calling
+convention.
+<p>An example of an assembly function using the macro set is given here:
+<p><pre>
+proc _proc32
+
+%$i arg
+%$j arg
+ mov eax,[ebp + %$i]
+ mov ebx,[ebp + %$j]
+ add eax,[ebx]
+
+endproc
+</pre>
+<p>This defines <code><nobr>_proc32</nobr></code> to be a procedure taking
+two arguments, the first (<code><nobr>i</nobr></code>) an integer and the
+second (<code><nobr>j</nobr></code>) a pointer to an integer. It returns
+<code><nobr>i + *j</nobr></code>.
+<p>Note that the <code><nobr>arg</nobr></code> macro has an
+<code><nobr>EQU</nobr></code> as the first line of its expansion, and since
+the label before the macro call gets prepended to the first line of the
+expanded macro, the <code><nobr>EQU</nobr></code> works, defining
+<code><nobr>%$i</nobr></code> to be an offset from
+<code><nobr>BP</nobr></code>. A context-local variable is used, local to
+the context pushed by the <code><nobr>proc</nobr></code> macro and popped
+by the <code><nobr>endproc</nobr></code> macro, so that the same argument
+name can be used in later procedures. Of course, you don't <em>have</em> to
+do that.
+<p><code><nobr>arg</nobr></code> can take an optional parameter, giving the
+size of the argument. If no size is given, 4 is assumed, since it is likely
+that many function parameters will be of type <code><nobr>int</nobr></code>
+or pointers.
+<h3><a name="section-9.2">9.2 Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries</a></h3>
+<p><code><nobr>ELF</nobr></code> replaced the older
+<code><nobr>a.out</nobr></code> object file format under Linux because it
+contains support for position-independent code (PIC), which makes writing
+shared libraries much easier. NASM supports the
+<code><nobr>ELF</nobr></code> position-independent code features, so you
+can write Linux <code><nobr>ELF</nobr></code> shared libraries in NASM.
+<p>NetBSD, and its close cousins FreeBSD and OpenBSD, take a different
+approach by hacking PIC support into the <code><nobr>a.out</nobr></code>
+format. NASM supports this as the <code><nobr>aoutb</nobr></code> output
+format, so you can write BSD shared libraries in NASM too.
+<p>The operating system loads a PIC shared library by memory-mapping the
+library file at an arbitrarily chosen point in the address space of the
+running process. The contents of the library's code section must therefore
+not depend on where it is loaded in memory.
+<p>Therefore, you cannot get at your variables by writing code like this:
+<p><pre>
+ mov eax,[myvar] ; WRONG
+</pre>
+<p>Instead, the linker provides an area of memory called the <em>global
+offset table</em>, or GOT; the GOT is situated at a constant distance from
+your library's code, so if you can find out where your library is loaded
+(which is typically done using a <code><nobr>CALL</nobr></code> and
+<code><nobr>POP</nobr></code> combination), you can obtain the address of
+the GOT, and you can then load the addresses of your variables out of
+linker-generated entries in the GOT.
+<p>The <em>data</em> section of a PIC shared library does not have these
+restrictions: since the data section is writable, it has to be copied into
+memory anyway rather than just paged in from the library file, so as long
+as it's being copied it can be relocated too. So you can put ordinary types
+of relocation in the data section without too much worry (but see
+<a href="#section-9.2.4">section 9.2.4</a> for a caveat).
+<h4><a name="section-9.2.1">9.2.1 Obtaining the Address of the GOT</a></h4>
+<p>Each code module in your shared library should define the GOT as an
+external symbol:
+<p><pre>
+extern _GLOBAL_OFFSET_TABLE_ ; in ELF
+extern __GLOBAL_OFFSET_TABLE_ ; in BSD a.out
+</pre>
+<p>At the beginning of any function in your shared library which plans to
+access your data or BSS sections, you must first calculate the address of
+the GOT. This is typically done by writing the function in this form:
+<p><pre>
+func: push ebp
+ mov ebp,esp
+ push ebx
+ call .get_GOT
+.get_GOT:
+ pop ebx
+ add ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc
+
+ ; the function body comes here
+
+ mov ebx,[ebp-4]
+ mov esp,ebp
+ pop ebp
+ ret
+</pre>
+<p>(For BSD, again, the symbol
+<code><nobr>_GLOBAL_OFFSET_TABLE</nobr></code> requires a second leading
+underscore.)
+<p>The first two lines of this function are simply the standard C prologue
+to set up a stack frame, and the last three lines are standard C function
+epilogue. The third line, and the fourth to last line, save and restore the
+<code><nobr>EBX</nobr></code> register, because PIC shared libraries use
+this register to store the address of the GOT.
+<p>The interesting bit is the <code><nobr>CALL</nobr></code> instruction
+and the following two lines. The <code><nobr>CALL</nobr></code> and
+<code><nobr>POP</nobr></code> combination obtains the address of the label
+<code><nobr>.get_GOT</nobr></code>, without having to know in advance where
+the program was loaded (since the <code><nobr>CALL</nobr></code>
+instruction is encoded relative to the current position). The
+<code><nobr>ADD</nobr></code> instruction makes use of one of the special
+PIC relocation types: GOTPC relocation. With the
+<code><nobr>WRT ..gotpc</nobr></code> qualifier specified, the symbol
+referenced (here <code><nobr>_GLOBAL_OFFSET_TABLE_</nobr></code>, the
+special symbol assigned to the GOT) is given as an offset from the
+beginning of the section. (Actually, <code><nobr>ELF</nobr></code> encodes
+it as the offset from the operand field of the
+<code><nobr>ADD</nobr></code> instruction, but NASM simplifies this
+deliberately, so you do things the same way for both
+<code><nobr>ELF</nobr></code> and <code><nobr>BSD</nobr></code>.) So the
+instruction then <em>adds</em> the beginning of the section, to get the
+real address of the GOT, and subtracts the value of
+<code><nobr>.get_GOT</nobr></code> which it knows is in
+<code><nobr>EBX</nobr></code>. Therefore, by the time that instruction has
+finished, <code><nobr>EBX</nobr></code> contains the address of the GOT.
+<p>If you didn't follow that, don't worry: it's never necessary to obtain
+the address of the GOT by any other means, so you can put those three
+instructions into a macro and safely ignore them:
+<p><pre>
+%macro get_GOT 0
+
+ call %%getgot
+ %%getgot:
+ pop ebx
+ add ebx,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc
+
+%endmacro
+</pre>
+<h4><a name="section-9.2.2">9.2.2 Finding Your Local Data Items</a></h4>
+<p>Having got the GOT, you can then use it to obtain the addresses of your
+data items. Most variables will reside in the sections you have declared;
+they can be accessed using the <code><nobr>..gotoff</nobr></code> special
+<code><nobr>WRT</nobr></code> type. The way this works is like this:
+<p><pre>
+ lea eax,[ebx+myvar wrt ..gotoff]
+</pre>
+<p>The expression <code><nobr>myvar wrt ..gotoff</nobr></code> is
+calculated, when the shared library is linked, to be the offset to the
+local variable <code><nobr>myvar</nobr></code> from the beginning of the
+GOT. Therefore, adding it to <code><nobr>EBX</nobr></code> as above will
+place the real address of <code><nobr>myvar</nobr></code> in
+<code><nobr>EAX</nobr></code>.
+<p>If you declare variables as <code><nobr>GLOBAL</nobr></code> without
+specifying a size for them, they are shared between code modules in the
+library, but do not get exported from the library to the program that
+loaded it. They will still be in your ordinary data and BSS sections, so
+you can access them in the same way as local variables, using the above
+<code><nobr>..gotoff</nobr></code> mechanism.
+<p>Note that due to a peculiarity of the way BSD
+<code><nobr>a.out</nobr></code> format handles this relocation type, there
+must be at least one non-local symbol in the same section as the address
+you're trying to access.
+<h4><a name="section-9.2.3">9.2.3 Finding External and Common Data Items</a></h4>
+<p>If your library needs to get at an external variable (external to the
+<em>library</em>, not just to one of the modules within it), you must use
+the <code><nobr>..got</nobr></code> type to get at it. The
+<code><nobr>..got</nobr></code> type, instead of giving you the offset from
+the GOT base to the variable, gives you the offset from the GOT base to a
+GOT <em>entry</em> containing the address of the variable. The linker will
+set up this GOT entry when it builds the library, and the dynamic linker
+will place the correct address in it at load time. So to obtain the address
+of an external variable <code><nobr>extvar</nobr></code> in
+<code><nobr>EAX</nobr></code>, you would code
+<p><pre>
+ mov eax,[ebx+extvar wrt ..got]
+</pre>
+<p>This loads the address of <code><nobr>extvar</nobr></code> out of an
+entry in the GOT. The linker, when it builds the shared library, collects
+together every relocation of type <code><nobr>..got</nobr></code>, and
+builds the GOT so as to ensure it has every necessary entry present.
+<p>Common variables must also be accessed in this way.
+<h4><a name="section-9.2.4">9.2.4 Exporting Symbols to the Library User</a></h4>
+<p>If you want to export symbols to the user of the library, you have to
+declare whether they are functions or data, and if they are data, you have
+to give the size of the data item. This is because the dynamic linker has
+to build procedure linkage table entries for any exported functions, and
+also moves exported data items away from the library's data section in
+which they were declared.
+<p>So to export a function to users of the library, you must use
+<p><pre>
+global func:function ; declare it as a function
+
+func: push ebp
+
+ ; etc.
+</pre>
+<p>And to export a data item such as an array, you would have to code
+<p><pre>
+global array:data array.end-array ; give the size too
+
+array: resd 128
+.end:
+</pre>
+<p>Be careful: If you export a variable to the library user, by declaring
+it as <code><nobr>GLOBAL</nobr></code> and supplying a size, the variable
+will end up living in the data section of the main program, rather than in
+your library's data section, where you declared it. So you will have to
+access your own global variable with the <code><nobr>..got</nobr></code>
+mechanism rather than <code><nobr>..gotoff</nobr></code>, as if it were
+external (which, effectively, it has become).
+<p>Equally, if you need to store the address of an exported global in one
+of your data sections, you can't do it by means of the standard sort of
+code:
+<p><pre>
+dataptr: dd global_data_item ; WRONG
+</pre>
+<p>NASM will interpret this code as an ordinary relocation, in which
+<code><nobr>global_data_item</nobr></code> is merely an offset from the
+beginning of the <code><nobr>.data</nobr></code> section (or whatever); so
+this reference will end up pointing at your data section instead of at the
+exported global which resides elsewhere.
+<p>Instead of the above code, then, you must write
+<p><pre>
+dataptr: dd global_data_item wrt ..sym
+</pre>
+<p>which makes use of the special <code><nobr>WRT</nobr></code> type
+<code><nobr>..sym</nobr></code> to instruct NASM to search the symbol table
+for a particular symbol at that address, rather than just relocating by
+section base.
+<p>Either method will work for functions: referring to one of your
+functions by means of
+<p><pre>
+funcptr: dd my_function
+</pre>
+<p>will give the user the address of the code you wrote, whereas
+<p><pre>
+funcptr: dd my_function wrt .sym
+</pre>
+<p>will give the address of the procedure linkage table for the function,
+which is where the calling program will <em>believe</em> the function
+lives. Either address is a valid way to call the function.
+<h4><a name="section-9.2.5">9.2.5 Calling Procedures Outside the Library</a></h4>
+<p>Calling procedures outside your shared library has to be done by means
+of a <em>procedure linkage table</em>, or PLT. The PLT is placed at a known
+offset from where the library is loaded, so the library code can make calls
+to the PLT in a position-independent way. Within the PLT there is code to
+jump to offsets contained in the GOT, so function calls to other shared
+libraries or to routines in the main program can be transparently passed
+off to their real destinations.
+<p>To call an external routine, you must use another special PIC relocation
+type, <code><nobr>WRT ..plt</nobr></code>. This is much easier than the
+GOT-based ones: you simply replace calls such as
+<code><nobr>CALL printf</nobr></code> with the PLT-relative version
+<code><nobr>CALL printf WRT ..plt</nobr></code>.
+<h4><a name="section-9.2.6">9.2.6 Generating the Library File</a></h4>
+<p>Having written some code modules and assembled them to
+<code><nobr>.o</nobr></code> files, you then generate your shared library
+with a command such as
+<p><pre>
+ld -shared -o library.so module1.o module2.o # for ELF
+ld -Bshareable -o library.so module1.o module2.o # for BSD
+</pre>
+<p>For ELF, if your shared library is going to reside in system directories
+such as <code><nobr>/usr/lib</nobr></code> or
+<code><nobr>/lib</nobr></code>, it is usually worth using the
+<code><nobr>-soname</nobr></code> flag to the linker, to store the final
+library file name, with a version number, into the library:
+<p><pre>
+ld -shared -soname library.so.1 -o library.so.1.2 *.o
+</pre>
+<p>You would then copy <code><nobr>library.so.1.2</nobr></code> into the
+library directory, and create <code><nobr>library.so.1</nobr></code> as a
+symbolic link to it.
+<p align=center><a href="nasmdo10.html">Next Chapter</a> |
+<a href="nasmdoc8.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdoca.html b/doc/html/nasmdoca.html
new file mode 100644
index 0000000..fda553d
--- /dev/null
+++ b/doc/html/nasmdoca.html
@@ -0,0 +1,165 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdocb.html">Next Chapter</a> |
+<a href="nasmdo12.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="appendix-A">Appendix A: Ndisasm</a></h2>
+<p>The Netwide Disassembler, NDISASM
+<h3><a name="section-A.1">A.1 Introduction</a></h3>
+<p>The Netwide Disassembler is a small companion program to the Netwide
+Assembler, NASM. It seemed a shame to have an x86 assembler, complete with
+a full instruction table, and not make as much use of it as possible, so
+here's a disassembler which shares the instruction table (and some other
+bits of code) with NASM.
+<p>The Netwide Disassembler does nothing except to produce disassemblies of
+<em>binary</em> source files. NDISASM does not have any understanding of
+object file formats, like <code><nobr>objdump</nobr></code>, and it will
+not understand <code><nobr>DOS .EXE</nobr></code> files like
+<code><nobr>debug</nobr></code> will. It just disassembles.
+<h3><a name="section-A.2">A.2 Getting Started: Installation</a></h3>
+<p>See <a href="nasmdoc1.html#section-1.3">section 1.3</a> for installation
+instructions. NDISASM, like NASM, has a <code><nobr>man page</nobr></code>
+which you may want to put somewhere useful, if you are on a Unix system.
+<h3><a name="section-A.3">A.3 Running NDISASM</a></h3>
+<p>To disassemble a file, you will typically use a command of the form
+<p><pre>
+ ndisasm -b {16|32|64} filename
+</pre>
+<p>NDISASM can disassemble 16-, 32- or 64-bit code equally easily, provided
+of course that you remember to specify which it is to work with. If no
+<code><nobr>-b</nobr></code> switch is present, NDISASM works in 16-bit
+mode by default. The <code><nobr>-u</nobr></code> switch (for USE32) also
+invokes 32-bit mode.
+<p>Two more command line options are <code><nobr>-r</nobr></code> which
+reports the version number of NDISASM you are running, and
+<code><nobr>-h</nobr></code> which gives a short summary of command line
+options.
+<h4><a name="section-A.3.1">A.3.1 COM Files: Specifying an Origin</a></h4>
+<p>To disassemble a <code><nobr>DOS .COM</nobr></code> file correctly, a
+disassembler must assume that the first instruction in the file is loaded
+at address <code><nobr>0x100</nobr></code>, rather than at zero. NDISASM,
+which assumes by default that any file you give it is loaded at zero, will
+therefore need to be informed of this.
+<p>The <code><nobr>-o</nobr></code> option allows you to declare a
+different origin for the file you are disassembling. Its argument may be
+expressed in any of the NASM numeric formats: decimal by default, if it
+begins with `<code><nobr>$</nobr></code>' or `<code><nobr>0x</nobr></code>'
+or ends in `<code><nobr>H</nobr></code>' it's
+<code><nobr>hex</nobr></code>, if it ends in `<code><nobr>Q</nobr></code>'
+it's <code><nobr>octal</nobr></code>, and if it ends in
+`<code><nobr>B</nobr></code>' it's <code><nobr>binary</nobr></code>.
+<p>Hence, to disassemble a <code><nobr>.COM</nobr></code> file:
+<p><pre>
+ ndisasm -o100h filename.com
+</pre>
+<p>will do the trick.
+<h4><a name="section-A.3.2">A.3.2 Code Following Data: Synchronisation</a></h4>
+<p>Suppose you are disassembling a file which contains some data which
+isn't machine code, and <em>then</em> contains some machine code. NDISASM
+will faithfully plough through the data section, producing machine
+instructions wherever it can (although most of them will look bizarre, and
+some may have unusual prefixes, e.g.
+`<code><nobr>FS OR AX,0x240A</nobr></code>'), and generating `DB'
+instructions ever so often if it's totally stumped. Then it will reach the
+code section.
+<p>Supposing NDISASM has just finished generating a strange machine
+instruction from part of the data section, and its file position is now one
+byte <em>before</em> the beginning of the code section. It's entirely
+possible that another spurious instruction will get generated, starting
+with the final byte of the data section, and then the correct first
+instruction in the code section will not be seen because the starting point
+skipped over it. This isn't really ideal.
+<p>To avoid this, you can specify a
+`<code><nobr>synchronisation</nobr></code>' point, or indeed as many
+synchronisation points as you like (although NDISASM can only handle
+2147483647 sync points internally). The definition of a sync point is this:
+NDISASM guarantees to hit sync points exactly during disassembly. If it is
+thinking about generating an instruction which would cause it to jump over
+a sync point, it will discard that instruction and output a
+`<code><nobr>db</nobr></code>' instead. So it <em>will</em> start
+disassembly exactly from the sync point, and so you <em>will</em> see all
+the instructions in your code section.
+<p>Sync points are specified using the <code><nobr>-s</nobr></code> option:
+they are measured in terms of the program origin, not the file position. So
+if you want to synchronize after 32 bytes of a
+<code><nobr>.COM</nobr></code> file, you would have to do
+<p><pre>
+ ndisasm -o100h -s120h file.com
+</pre>
+<p>rather than
+<p><pre>
+ ndisasm -o100h -s20h file.com
+</pre>
+<p>As stated above, you can specify multiple sync markers if you need to,
+just by repeating the <code><nobr>-s</nobr></code> option.
+<h4><a name="section-A.3.3">A.3.3 Mixed Code and Data: Automatic (Intelligent) Synchronisation </a></h4>
+<p>Suppose you are disassembling the boot sector of a
+<code><nobr>DOS</nobr></code> floppy (maybe it has a virus, and you need to
+understand the virus so that you know what kinds of damage it might have
+done you). Typically, this will contain a <code><nobr>JMP</nobr></code>
+instruction, then some data, then the rest of the code. So there is a very
+good chance of NDISASM being <em>misaligned</em> when the data ends and the
+code begins. Hence a sync point is needed.
+<p>On the other hand, why should you have to specify the sync point
+manually? What you'd do in order to find where the sync point would be,
+surely, would be to read the <code><nobr>JMP</nobr></code> instruction, and
+then to use its target address as a sync point. So can NDISASM do that for
+you?
+<p>The answer, of course, is yes: using either of the synonymous switches
+<code><nobr>-a</nobr></code> (for automatic sync) or
+<code><nobr>-i</nobr></code> (for intelligent sync) will enable
+<code><nobr>auto-sync</nobr></code> mode. Auto-sync mode automatically
+generates a sync point for any forward-referring PC-relative jump or call
+instruction that NDISASM encounters. (Since NDISASM is one-pass, if it
+encounters a PC-relative jump whose target has already been processed,
+there isn't much it can do about it...)
+<p>Only PC-relative jumps are processed, since an absolute jump is either
+through a register (in which case NDISASM doesn't know what the register
+contains) or involves a segment address (in which case the target code
+isn't in the same segment that NDISASM is working in, and so the sync point
+can't be placed anywhere useful).
+<p>For some kinds of file, this mechanism will automatically put sync
+points in all the right places, and save you from having to place any sync
+points manually. However, it should be stressed that auto-sync mode is
+<em>not</em> guaranteed to catch all the sync points, and you may still
+have to place some manually.
+<p>Auto-sync mode doesn't prevent you from declaring manual sync points: it
+just adds automatically generated ones to the ones you provide. It's
+perfectly feasible to specify <code><nobr>-i</nobr></code> <em>and</em>
+some <code><nobr>-s</nobr></code> options.
+<p>Another caveat with auto-sync mode is that if, by some unpleasant fluke,
+something in your data section should disassemble to a PC-relative call or
+jump instruction, NDISASM may obediently place a sync point in a totally
+random place, for example in the middle of one of the instructions in your
+code section. So you may end up with a wrong disassembly even if you use
+auto-sync. Again, there isn't much I can do about this. If you have
+problems, you'll have to use manual sync points, or use the
+<code><nobr>-k</nobr></code> option (documented below) to suppress
+disassembly of the data area.
+<h4><a name="section-A.3.4">A.3.4 Other Options</a></h4>
+<p>The <code><nobr>-e</nobr></code> option skips a header on the file, by
+ignoring the first N bytes. This means that the header is <em>not</em>
+counted towards the disassembly offset: if you give
+<code><nobr>-e10 -o10</nobr></code>, disassembly will start at byte 10 in
+the file, and this will be given offset 10, not 20.
+<p>The <code><nobr>-k</nobr></code> option is provided with two
+comma-separated numeric arguments, the first of which is an assembly offset
+and the second is a number of bytes to skip. This <em>will</em> count the
+skipped bytes towards the assembly offset: its use is to suppress
+disassembly of a data section which wouldn't contain anything you wanted to
+see anyway.
+<h3><a name="section-A.4">A.4 Bugs and Improvements</a></h3>
+<p>There are no known bugs. However, any you find, with patches if
+possible, should be sent to
+<a href="mailto:nasm-bugs@lists.sourceforge.net"><code><nobr>nasm-bugs@lists.sourceforge.net</nobr></code></a>,
+or to the developer's site at
+<a href="https://sourceforge.net/projects/nasm/"><code><nobr>https://sourceforge.net/projects/nasm/</nobr></code></a>
+and we'll try to fix them. Feel free to send contributions and new features
+as well.
+<p align=center><a href="nasmdocb.html">Next Chapter</a> |
+<a href="nasmdo12.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdocb.html b/doc/html/nasmdocb.html
new file mode 100644
index 0000000..15bca45
--- /dev/null
+++ b/doc/html/nasmdocb.html
@@ -0,0 +1,3148 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdocc.html">Next Chapter</a> |
+<a href="nasmdoca.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="appendix-B">Appendix B: Instruction List</a></h2>
+<h3><a name="section-B.1">B.1 Introduction</a></h3>
+<p>The following sections show the instructions which NASM currently
+supports. For each instruction, there is a separate entry for each
+supported addressing mode. The third column shows the processor type in
+which the instruction was introduced and, when appropriate, one or more
+usage flags.
+<h4><a name="section-B.1.1">B.1.1 Special instructions...</a></h4>
+<p><pre>
+DB
+DW
+DD
+DQ
+DT
+DO
+DY
+RESB imm 8086
+RESW
+RESD
+RESQ
+REST
+RESO
+RESY
+</pre>
+<h4><a name="section-B.1.2">B.1.2 Conventional instructions</a></h4>
+<p><pre>
+AAA 8086,NOLONG
+AAD 8086,NOLONG
+AAD imm 8086,NOLONG
+AAM 8086,NOLONG
+AAM imm 8086,NOLONG
+AAS 8086,NOLONG
+ADC mem,reg8 8086
+ADC reg8,reg8 8086
+ADC mem,reg16 8086
+ADC reg16,reg16 8086
+ADC mem,reg32 386
+ADC reg32,reg32 386
+ADC mem,reg64 X64
+ADC reg64,reg64 X64
+ADC reg8,mem 8086
+ADC reg8,reg8 8086
+ADC reg16,mem 8086
+ADC reg16,reg16 8086
+ADC reg32,mem 386
+ADC reg32,reg32 386
+ADC reg64,mem X64
+ADC reg64,reg64 X64
+ADC rm16,imm8 8086
+ADC rm32,imm8 386
+ADC rm64,imm8 X64
+ADC reg_al,imm 8086
+ADC reg_ax,sbyte16 8086
+ADC reg_ax,imm 8086
+ADC reg_eax,sbyte32 386
+ADC reg_eax,imm 386
+ADC reg_rax,sbyte64 X64
+ADC reg_rax,imm X64
+ADC rm8,imm 8086
+ADC rm16,imm 8086
+ADC rm32,imm 386
+ADC rm64,imm X64
+ADC mem,imm8 8086
+ADC mem,imm16 8086
+ADC mem,imm32 386
+ADD mem,reg8 8086
+ADD reg8,reg8 8086
+ADD mem,reg16 8086
+ADD reg16,reg16 8086
+ADD mem,reg32 386
+ADD reg32,reg32 386
+ADD mem,reg64 X64
+ADD reg64,reg64 X64
+ADD reg8,mem 8086
+ADD reg8,reg8 8086
+ADD reg16,mem 8086
+ADD reg16,reg16 8086
+ADD reg32,mem 386
+ADD reg32,reg32 386
+ADD reg64,mem X64
+ADD reg64,reg64 X64
+ADD rm16,imm8 8086
+ADD rm32,imm8 386
+ADD rm64,imm8 X64
+ADD reg_al,imm 8086
+ADD reg_ax,sbyte16 8086
+ADD reg_ax,imm 8086
+ADD reg_eax,sbyte32 386
+ADD reg_eax,imm 386
+ADD reg_rax,sbyte64 X64
+ADD reg_rax,imm X64
+ADD rm8,imm 8086
+ADD rm16,imm 8086
+ADD rm32,imm 386
+ADD rm64,imm X64
+ADD mem,imm8 8086
+ADD mem,imm16 8086
+ADD mem,imm32 386
+AND mem,reg8 8086
+AND reg8,reg8 8086
+AND mem,reg16 8086
+AND reg16,reg16 8086
+AND mem,reg32 386
+AND reg32,reg32 386
+AND mem,reg64 X64
+AND reg64,reg64 X64
+AND reg8,mem 8086
+AND reg8,reg8 8086
+AND reg16,mem 8086
+AND reg16,reg16 8086
+AND reg32,mem 386
+AND reg32,reg32 386
+AND reg64,mem X64
+AND reg64,reg64 X64
+AND rm16,imm8 8086
+AND rm32,imm8 386
+AND rm64,imm8 X64
+AND reg_al,imm 8086
+AND reg_ax,sbyte16 8086
+AND reg_ax,imm 8086
+AND reg_eax,sbyte32 386
+AND reg_eax,imm 386
+AND reg_rax,sbyte64 X64
+AND reg_rax,imm X64
+AND rm8,imm 8086
+AND rm16,imm 8086
+AND rm32,imm 386
+AND rm64,imm X64
+AND mem,imm8 8086
+AND mem,imm16 8086
+AND mem,imm32 386
+ARPL mem,reg16 286,PROT,NOLONG
+ARPL reg16,reg16 286,PROT,NOLONG
+BB0_RESET PENT,CYRIX,ND
+BB1_RESET PENT,CYRIX,ND
+BOUND reg16,mem 186,NOLONG
+BOUND reg32,mem 386,NOLONG
+BSF reg16,mem 386
+BSF reg16,reg16 386
+BSF reg32,mem 386
+BSF reg32,reg32 386
+BSF reg64,mem X64
+BSF reg64,reg64 X64
+BSR reg16,mem 386
+BSR reg16,reg16 386
+BSR reg32,mem 386
+BSR reg32,reg32 386
+BSR reg64,mem X64
+BSR reg64,reg64 X64
+BSWAP reg32 486
+BSWAP reg64 X64
+BT mem,reg16 386
+BT reg16,reg16 386
+BT mem,reg32 386
+BT reg32,reg32 386
+BT mem,reg64 X64
+BT reg64,reg64 X64
+BT rm16,imm 386
+BT rm32,imm 386
+BT rm64,imm X64
+BTC mem,reg16 386
+BTC reg16,reg16 386
+BTC mem,reg32 386
+BTC reg32,reg32 386
+BTC mem,reg64 X64
+BTC reg64,reg64 X64
+BTC rm16,imm 386
+BTC rm32,imm 386
+BTC rm64,imm X64
+BTR mem,reg16 386
+BTR reg16,reg16 386
+BTR mem,reg32 386
+BTR reg32,reg32 386
+BTR mem,reg64 X64
+BTR reg64,reg64 X64
+BTR rm16,imm 386
+BTR rm32,imm 386
+BTR rm64,imm X64
+BTS mem,reg16 386
+BTS reg16,reg16 386
+BTS mem,reg32 386
+BTS reg32,reg32 386
+BTS mem,reg64 X64
+BTS reg64,reg64 X64
+BTS rm16,imm 386
+BTS rm32,imm 386
+BTS rm64,imm X64
+CALL imm 8086
+CALL imm|near 8086
+CALL imm|far 8086,ND,NOLONG
+CALL imm16 8086
+CALL imm16|near 8086
+CALL imm16|far 8086,ND,NOLONG
+CALL imm32 386
+CALL imm32|near 386
+CALL imm32|far 386,ND,NOLONG
+CALL imm:imm 8086,NOLONG
+CALL imm16:imm 8086,NOLONG
+CALL imm:imm16 8086,NOLONG
+CALL imm32:imm 386,NOLONG
+CALL imm:imm32 386,NOLONG
+CALL mem|far 8086,NOLONG
+CALL mem|far X64
+CALL mem16|far 8086
+CALL mem32|far 386
+CALL mem64|far X64
+CALL mem|near 8086
+CALL mem16|near 8086
+CALL mem32|near 386,NOLONG
+CALL mem64|near X64
+CALL reg16 8086
+CALL reg32 386,NOLONG
+CALL reg64 X64
+CALL mem 8086
+CALL mem16 8086
+CALL mem32 386,NOLONG
+CALL mem64 X64
+CBW 8086
+CDQ 386
+CDQE X64
+CLC 8086
+CLD 8086
+CLGI X64,AMD
+CLI 8086
+CLTS 286,PRIV
+CMC 8086
+CMP mem,reg8 8086
+CMP reg8,reg8 8086
+CMP mem,reg16 8086
+CMP reg16,reg16 8086
+CMP mem,reg32 386
+CMP reg32,reg32 386
+CMP mem,reg64 X64
+CMP reg64,reg64 X64
+CMP reg8,mem 8086
+CMP reg8,reg8 8086
+CMP reg16,mem 8086
+CMP reg16,reg16 8086
+CMP reg32,mem 386
+CMP reg32,reg32 386
+CMP reg64,mem X64
+CMP reg64,reg64 X64
+CMP rm16,imm8 8086
+CMP rm32,imm8 386
+CMP rm64,imm8 X64
+CMP reg_al,imm 8086
+CMP reg_ax,sbyte16 8086
+CMP reg_ax,imm 8086
+CMP reg_eax,sbyte32 386
+CMP reg_eax,imm 386
+CMP reg_rax,sbyte64 X64
+CMP reg_rax,imm X64
+CMP rm8,imm 8086
+CMP rm16,imm 8086
+CMP rm32,imm 386
+CMP rm64,imm X64
+CMP mem,imm8 8086
+CMP mem,imm16 8086
+CMP mem,imm32 386
+CMPSB 8086
+CMPSD 386
+CMPSQ X64
+CMPSW 8086
+CMPXCHG mem,reg8 PENT
+CMPXCHG reg8,reg8 PENT
+CMPXCHG mem,reg16 PENT
+CMPXCHG reg16,reg16 PENT
+CMPXCHG mem,reg32 PENT
+CMPXCHG reg32,reg32 PENT
+CMPXCHG mem,reg64 X64
+CMPXCHG reg64,reg64 X64
+CMPXCHG486 mem,reg8 486,UNDOC,ND
+CMPXCHG486 reg8,reg8 486,UNDOC,ND
+CMPXCHG486 mem,reg16 486,UNDOC,ND
+CMPXCHG486 reg16,reg16 486,UNDOC,ND
+CMPXCHG486 mem,reg32 486,UNDOC,ND
+CMPXCHG486 reg32,reg32 486,UNDOC,ND
+CMPXCHG8B mem PENT
+CMPXCHG16B mem X64
+CPUID PENT
+CPU_READ PENT,CYRIX
+CPU_WRITE PENT,CYRIX
+CQO X64
+CWD 8086
+CWDE 386
+DAA 8086,NOLONG
+DAS 8086,NOLONG
+DEC reg16 8086,NOLONG
+DEC reg32 386,NOLONG
+DEC rm8 8086
+DEC rm16 8086
+DEC rm32 386
+DEC rm64 X64
+DIV rm8 8086
+DIV rm16 8086
+DIV rm32 386
+DIV rm64 X64
+DMINT P6,CYRIX
+EMMS PENT,MMX
+ENTER imm,imm 186
+EQU imm 8086
+EQU imm:imm 8086
+F2XM1 8086,FPU
+FABS 8086,FPU
+FADD mem32 8086,FPU
+FADD mem64 8086,FPU
+FADD fpureg|to 8086,FPU
+FADD fpureg 8086,FPU
+FADD fpureg,fpu0 8086,FPU
+FADD fpu0,fpureg 8086,FPU
+FADD 8086,FPU,ND
+FADDP fpureg 8086,FPU
+FADDP fpureg,fpu0 8086,FPU
+FADDP 8086,FPU,ND
+FBLD mem80 8086,FPU
+FBLD mem 8086,FPU
+FBSTP mem80 8086,FPU
+FBSTP mem 8086,FPU
+FCHS 8086,FPU
+FCLEX 8086,FPU
+FCMOVB fpureg P6,FPU
+FCMOVB fpu0,fpureg P6,FPU
+FCMOVB P6,FPU,ND
+FCMOVBE fpureg P6,FPU
+FCMOVBE fpu0,fpureg P6,FPU
+FCMOVBE P6,FPU,ND
+FCMOVE fpureg P6,FPU
+FCMOVE fpu0,fpureg P6,FPU
+FCMOVE P6,FPU,ND
+FCMOVNB fpureg P6,FPU
+FCMOVNB fpu0,fpureg P6,FPU
+FCMOVNB P6,FPU,ND
+FCMOVNBE fpureg P6,FPU
+FCMOVNBE fpu0,fpureg P6,FPU
+FCMOVNBE P6,FPU,ND
+FCMOVNE fpureg P6,FPU
+FCMOVNE fpu0,fpureg P6,FPU
+FCMOVNE P6,FPU,ND
+FCMOVNU fpureg P6,FPU
+FCMOVNU fpu0,fpureg P6,FPU
+FCMOVNU P6,FPU,ND
+FCMOVU fpureg P6,FPU
+FCMOVU fpu0,fpureg P6,FPU
+FCMOVU P6,FPU,ND
+FCOM mem32 8086,FPU
+FCOM mem64 8086,FPU
+FCOM fpureg 8086,FPU
+FCOM fpu0,fpureg 8086,FPU
+FCOM 8086,FPU,ND
+FCOMI fpureg P6,FPU
+FCOMI fpu0,fpureg P6,FPU
+FCOMI P6,FPU,ND
+FCOMIP fpureg P6,FPU
+FCOMIP fpu0,fpureg P6,FPU
+FCOMIP P6,FPU,ND
+FCOMP mem32 8086,FPU
+FCOMP mem64 8086,FPU
+FCOMP fpureg 8086,FPU
+FCOMP fpu0,fpureg 8086,FPU
+FCOMP 8086,FPU,ND
+FCOMPP 8086,FPU
+FCOS 386,FPU
+FDECSTP 8086,FPU
+FDISI 8086,FPU
+FDIV mem32 8086,FPU
+FDIV mem64 8086,FPU
+FDIV fpureg|to 8086,FPU
+FDIV fpureg 8086,FPU
+FDIV fpureg,fpu0 8086,FPU
+FDIV fpu0,fpureg 8086,FPU
+FDIV 8086,FPU,ND
+FDIVP fpureg 8086,FPU
+FDIVP fpureg,fpu0 8086,FPU
+FDIVP 8086,FPU,ND
+FDIVR mem32 8086,FPU
+FDIVR mem64 8086,FPU
+FDIVR fpureg|to 8086,FPU
+FDIVR fpureg,fpu0 8086,FPU
+FDIVR fpureg 8086,FPU
+FDIVR fpu0,fpureg 8086,FPU
+FDIVR 8086,FPU,ND
+FDIVRP fpureg 8086,FPU
+FDIVRP fpureg,fpu0 8086,FPU
+FDIVRP 8086,FPU,ND
+FEMMS PENT,3DNOW
+FENI 8086,FPU
+FFREE fpureg 8086,FPU
+FFREE 8086,FPU
+FFREEP fpureg 286,FPU,UNDOC
+FFREEP 286,FPU,UNDOC
+FIADD mem32 8086,FPU
+FIADD mem16 8086,FPU
+FICOM mem32 8086,FPU
+FICOM mem16 8086,FPU
+FICOMP mem32 8086,FPU
+FICOMP mem16 8086,FPU
+FIDIV mem32 8086,FPU
+FIDIV mem16 8086,FPU
+FIDIVR mem32 8086,FPU
+FIDIVR mem16 8086,FPU
+FILD mem32 8086,FPU
+FILD mem16 8086,FPU
+FILD mem64 8086,FPU
+FIMUL mem32 8086,FPU
+FIMUL mem16 8086,FPU
+FINCSTP 8086,FPU
+FINIT 8086,FPU
+FIST mem32 8086,FPU
+FIST mem16 8086,FPU
+FISTP mem32 8086,FPU
+FISTP mem16 8086,FPU
+FISTP mem64 8086,FPU
+FISTTP mem16 PRESCOTT,FPU
+FISTTP mem32 PRESCOTT,FPU
+FISTTP mem64 PRESCOTT,FPU
+FISUB mem32 8086,FPU
+FISUB mem16 8086,FPU
+FISUBR mem32 8086,FPU
+FISUBR mem16 8086,FPU
+FLD mem32 8086,FPU
+FLD mem64 8086,FPU
+FLD mem80 8086,FPU
+FLD fpureg 8086,FPU
+FLD 8086,FPU,ND
+FLD1 8086,FPU
+FLDCW mem 8086,FPU,SW
+FLDENV mem 8086,FPU
+FLDL2E 8086,FPU
+FLDL2T 8086,FPU
+FLDLG2 8086,FPU
+FLDLN2 8086,FPU
+FLDPI 8086,FPU
+FLDZ 8086,FPU
+FMUL mem32 8086,FPU
+FMUL mem64 8086,FPU
+FMUL fpureg|to 8086,FPU
+FMUL fpureg,fpu0 8086,FPU
+FMUL fpureg 8086,FPU
+FMUL fpu0,fpureg 8086,FPU
+FMUL 8086,FPU,ND
+FMULP fpureg 8086,FPU
+FMULP fpureg,fpu0 8086,FPU
+FMULP 8086,FPU,ND
+FNCLEX 8086,FPU
+FNDISI 8086,FPU
+FNENI 8086,FPU
+FNINIT 8086,FPU
+FNOP 8086,FPU
+FNSAVE mem 8086,FPU
+FNSTCW mem 8086,FPU,SW
+FNSTENV mem 8086,FPU
+FNSTSW mem 8086,FPU,SW
+FNSTSW reg_ax 286,FPU
+FPATAN 8086,FPU
+FPREM 8086,FPU
+FPREM1 386,FPU
+FPTAN 8086,FPU
+FRNDINT 8086,FPU
+FRSTOR mem 8086,FPU
+FSAVE mem 8086,FPU
+FSCALE 8086,FPU
+FSETPM 286,FPU
+FSIN 386,FPU
+FSINCOS 386,FPU
+FSQRT 8086,FPU
+FST mem32 8086,FPU
+FST mem64 8086,FPU
+FST fpureg 8086,FPU
+FST 8086,FPU,ND
+FSTCW mem 8086,FPU,SW
+FSTENV mem 8086,FPU
+FSTP mem32 8086,FPU
+FSTP mem64 8086,FPU
+FSTP mem80 8086,FPU
+FSTP fpureg 8086,FPU
+FSTP 8086,FPU,ND
+FSTSW mem 8086,FPU,SW
+FSTSW reg_ax 286,FPU
+FSUB mem32 8086,FPU
+FSUB mem64 8086,FPU
+FSUB fpureg|to 8086,FPU
+FSUB fpureg,fpu0 8086,FPU
+FSUB fpureg 8086,FPU
+FSUB fpu0,fpureg 8086,FPU
+FSUB 8086,FPU,ND
+FSUBP fpureg 8086,FPU
+FSUBP fpureg,fpu0 8086,FPU
+FSUBP 8086,FPU,ND
+FSUBR mem32 8086,FPU
+FSUBR mem64 8086,FPU
+FSUBR fpureg|to 8086,FPU
+FSUBR fpureg,fpu0 8086,FPU
+FSUBR fpureg 8086,FPU
+FSUBR fpu0,fpureg 8086,FPU
+FSUBR 8086,FPU,ND
+FSUBRP fpureg 8086,FPU
+FSUBRP fpureg,fpu0 8086,FPU
+FSUBRP 8086,FPU,ND
+FTST 8086,FPU
+FUCOM fpureg 386,FPU
+FUCOM fpu0,fpureg 386,FPU
+FUCOM 386,FPU,ND
+FUCOMI fpureg P6,FPU
+FUCOMI fpu0,fpureg P6,FPU
+FUCOMI P6,FPU,ND
+FUCOMIP fpureg P6,FPU
+FUCOMIP fpu0,fpureg P6,FPU
+FUCOMIP P6,FPU,ND
+FUCOMP fpureg 386,FPU
+FUCOMP fpu0,fpureg 386,FPU
+FUCOMP 386,FPU,ND
+FUCOMPP 386,FPU
+FXAM 8086,FPU
+FXCH fpureg 8086,FPU
+FXCH fpureg,fpu0 8086,FPU
+FXCH fpu0,fpureg 8086,FPU
+FXCH 8086,FPU,ND
+FXTRACT 8086,FPU
+FYL2X 8086,FPU
+FYL2XP1 8086,FPU
+HLT 8086,PRIV
+IBTS mem,reg16 386,SW,UNDOC,ND
+IBTS reg16,reg16 386,UNDOC,ND
+IBTS mem,reg32 386,SD,UNDOC,ND
+IBTS reg32,reg32 386,UNDOC,ND
+ICEBP 386,ND
+IDIV rm8 8086
+IDIV rm16 8086
+IDIV rm32 386
+IDIV rm64 X64
+IMUL rm8 8086
+IMUL rm16 8086
+IMUL rm32 386
+IMUL rm64 X64
+IMUL reg16,mem 386
+IMUL reg16,reg16 386
+IMUL reg32,mem 386
+IMUL reg32,reg32 386
+IMUL reg64,mem X64
+IMUL reg64,reg64 X64
+IMUL reg16,mem,imm8 186
+IMUL reg16,mem,sbyte16 186,ND
+IMUL reg16,mem,imm16 186
+IMUL reg16,mem,imm 186,ND
+IMUL reg16,reg16,imm8 186
+IMUL reg16,reg16,sbyte16 186,ND
+IMUL reg16,reg16,imm16 186
+IMUL reg16,reg16,imm 186,ND
+IMUL reg32,mem,imm8 386
+IMUL reg32,mem,sbyte32 386,ND
+IMUL reg32,mem,imm32 386
+IMUL reg32,mem,imm 386,ND
+IMUL reg32,reg32,imm8 386
+IMUL reg32,reg32,sbyte32 386,ND
+IMUL reg32,reg32,imm32 386
+IMUL reg32,reg32,imm 386,ND
+IMUL reg64,mem,imm8 X64
+IMUL reg64,mem,sbyte64 X64,ND
+IMUL reg64,mem,imm32 X64
+IMUL reg64,mem,imm X64,ND
+IMUL reg64,reg64,imm8 X64
+IMUL reg64,reg64,sbyte64 X64,ND
+IMUL reg64,reg64,imm32 X64
+IMUL reg64,reg64,imm X64,ND
+IMUL reg16,imm8 186
+IMUL reg16,sbyte16 186,ND
+IMUL reg16,imm16 186
+IMUL reg16,imm 186,ND
+IMUL reg32,imm8 386
+IMUL reg32,sbyte32 386,ND
+IMUL reg32,imm32 386
+IMUL reg32,imm 386,ND
+IMUL reg64,imm8 X64
+IMUL reg64,sbyte64 X64,ND
+IMUL reg64,imm32 X64
+IMUL reg64,imm X64,ND
+IN reg_al,imm 8086
+IN reg_ax,imm 8086
+IN reg_eax,imm 386
+IN reg_al,reg_dx 8086
+IN reg_ax,reg_dx 8086
+IN reg_eax,reg_dx 386
+INC reg16 8086,NOLONG
+INC reg32 386,NOLONG
+INC rm8 8086
+INC rm16 8086
+INC rm32 386
+INC rm64 X64
+INCBIN
+INSB 186
+INSD 386
+INSW 186
+INT imm 8086
+INT01 386,ND
+INT1 386
+INT03 8086,ND
+INT3 8086
+INTO 8086,NOLONG
+INVD 486,PRIV
+INVLPG mem 486,PRIV
+INVLPGA reg_ax,reg_ecx X86_64,AMD,NOLONG
+INVLPGA reg_eax,reg_ecx X86_64,AMD
+INVLPGA reg_rax,reg_ecx X64,AMD
+INVLPGA X86_64,AMD
+IRET 8086
+IRETD 386
+IRETQ X64
+IRETW 8086
+JCXZ imm 8086,NOLONG
+JECXZ imm 386
+JRCXZ imm X64
+JMP imm|short 8086
+JMP imm 8086,ND
+JMP imm 8086
+JMP imm|near 8086,ND
+JMP imm|far 8086,ND,NOLONG
+JMP imm16 8086
+JMP imm16|near 8086,ND
+JMP imm16|far 8086,ND,NOLONG
+JMP imm32 386
+JMP imm32|near 386,ND
+JMP imm32|far 386,ND,NOLONG
+JMP imm:imm 8086,NOLONG
+JMP imm16:imm 8086,NOLONG
+JMP imm:imm16 8086,NOLONG
+JMP imm32:imm 386,NOLONG
+JMP imm:imm32 386,NOLONG
+JMP mem|far 8086,NOLONG
+JMP mem|far X64
+JMP mem16|far 8086
+JMP mem32|far 386
+JMP mem64|far X64
+JMP mem|near 8086
+JMP mem16|near 8086
+JMP mem32|near 386,NOLONG
+JMP mem64|near X64
+JMP reg16 8086
+JMP reg32 386,NOLONG
+JMP reg64 X64
+JMP mem 8086
+JMP mem16 8086
+JMP mem32 386,NOLONG
+JMP mem64 X64
+JMPE imm IA64
+JMPE imm16 IA64
+JMPE imm32 IA64
+JMPE rm16 IA64
+JMPE rm32 IA64
+LAHF 8086
+LAR reg16,mem 286,PROT,SW
+LAR reg16,reg16 286,PROT
+LAR reg16,reg32 386,PROT
+LAR reg16,reg64 X64,PROT,ND
+LAR reg32,mem 386,PROT,SW
+LAR reg32,reg16 386,PROT
+LAR reg32,reg32 386,PROT
+LAR reg32,reg64 X64,PROT,ND
+LAR reg64,mem X64,PROT,SW
+LAR reg64,reg16 X64,PROT
+LAR reg64,reg32 X64,PROT
+LAR reg64,reg64 X64,PROT
+LDS reg16,mem 8086,NOLONG
+LDS reg32,mem 386,NOLONG
+LEA reg16,mem 8086
+LEA reg32,mem 386
+LEA reg64,mem X64
+LEAVE 186
+LES reg16,mem 8086,NOLONG
+LES reg32,mem 386,NOLONG
+LFENCE X64,AMD
+LFS reg16,mem 386
+LFS reg32,mem 386
+LGDT mem 286,PRIV
+LGS reg16,mem 386
+LGS reg32,mem 386
+LIDT mem 286,PRIV
+LLDT mem 286,PROT,PRIV
+LLDT mem16 286,PROT,PRIV
+LLDT reg16 286,PROT,PRIV
+LMSW mem 286,PRIV
+LMSW mem16 286,PRIV
+LMSW reg16 286,PRIV
+LOADALL 386,UNDOC
+LOADALL286 286,UNDOC
+LODSB 8086
+LODSD 386
+LODSQ X64
+LODSW 8086
+LOOP imm 8086
+LOOP imm,reg_cx 8086,NOLONG
+LOOP imm,reg_ecx 386
+LOOP imm,reg_rcx X64
+LOOPE imm 8086
+LOOPE imm,reg_cx 8086,NOLONG
+LOOPE imm,reg_ecx 386
+LOOPE imm,reg_rcx X64
+LOOPNE imm 8086
+LOOPNE imm,reg_cx 8086,NOLONG
+LOOPNE imm,reg_ecx 386
+LOOPNE imm,reg_rcx X64
+LOOPNZ imm 8086
+LOOPNZ imm,reg_cx 8086,NOLONG
+LOOPNZ imm,reg_ecx 386
+LOOPNZ imm,reg_rcx X64
+LOOPZ imm 8086
+LOOPZ imm,reg_cx 8086,NOLONG
+LOOPZ imm,reg_ecx 386
+LOOPZ imm,reg_rcx X64
+LSL reg16,mem 286,PROT,SW
+LSL reg16,reg16 286,PROT
+LSL reg16,reg32 386,PROT
+LSL reg16,reg64 X64,PROT,ND
+LSL reg32,mem 386,PROT,SW
+LSL reg32,reg16 386,PROT
+LSL reg32,reg32 386,PROT
+LSL reg32,reg64 X64,PROT,ND
+LSL reg64,mem X64,PROT,SW
+LSL reg64,reg16 X64,PROT
+LSL reg64,reg32 X64,PROT
+LSL reg64,reg64 X64,PROT
+LSS reg16,mem 386
+LSS reg32,mem 386
+LTR mem 286,PROT,PRIV
+LTR mem16 286,PROT,PRIV
+LTR reg16 286,PROT,PRIV
+MFENCE X64,AMD
+MONITOR PRESCOTT
+MONITOR reg_eax,reg_ecx,reg_edx PRESCOTT,ND
+MONITOR reg_rax,reg_ecx,reg_edx X64,ND
+MOV mem,reg_sreg 8086
+MOV reg16,reg_sreg 8086
+MOV reg32,reg_sreg 386
+MOV reg_sreg,mem 8086
+MOV reg_sreg,reg16 8086
+MOV reg_sreg,reg32 386
+MOV reg_al,mem_offs 8086
+MOV reg_ax,mem_offs 8086
+MOV reg_eax,mem_offs 386
+MOV reg_rax,mem_offs X64
+MOV mem_offs,reg_al 8086
+MOV mem_offs,reg_ax 8086
+MOV mem_offs,reg_eax 386
+MOV mem_offs,reg_rax X64
+MOV reg32,reg_creg 386,PRIV,NOLONG
+MOV reg64,reg_creg X64,PRIV
+MOV reg_creg,reg32 386,PRIV,NOLONG
+MOV reg_creg,reg64 X64,PRIV
+MOV reg32,reg_dreg 386,PRIV,NOLONG
+MOV reg64,reg_dreg X64,PRIV
+MOV reg_dreg,reg32 386,PRIV,NOLONG
+MOV reg_dreg,reg64 X64,PRIV
+MOV reg32,reg_treg 386,NOLONG,ND
+MOV reg_treg,reg32 386,NOLONG,ND
+MOV mem,reg8 8086
+MOV reg8,reg8 8086
+MOV mem,reg16 8086
+MOV reg16,reg16 8086
+MOV mem,reg32 386
+MOV reg32,reg32 386
+MOV mem,reg64 X64
+MOV reg64,reg64 X64
+MOV reg8,mem 8086
+MOV reg8,reg8 8086
+MOV reg16,mem 8086
+MOV reg16,reg16 8086
+MOV reg32,mem 386
+MOV reg32,reg32 386
+MOV reg64,mem X64
+MOV reg64,reg64 X64
+MOV reg8,imm 8086
+MOV reg16,imm 8086
+MOV reg32,imm 386
+MOV reg64,imm X64
+MOV reg64,imm32 X64
+MOV rm8,imm 8086
+MOV rm16,imm 8086
+MOV rm32,imm 386
+MOV rm64,imm X64
+MOV mem,imm8 8086
+MOV mem,imm16 8086
+MOV mem,imm32 386
+MOVD mmxreg,mem PENT,MMX,SD
+MOVD mmxreg,reg32 PENT,MMX
+MOVD mem,mmxreg PENT,MMX,SD
+MOVD reg32,mmxreg PENT,MMX
+MOVD xmmreg,mem X64,SD
+MOVD xmmreg,reg32 X64
+MOVD mem,xmmreg X64,SD
+MOVD reg32,xmmreg X64,SSE
+MOVQ mmxreg,mmxrm PENT,MMX
+MOVQ mmxrm,mmxreg PENT,MMX
+MOVQ mmxreg,rm64 X64,MMX
+MOVQ rm64,mmxreg X64,MMX
+MOVSB 8086
+MOVSD 386
+MOVSQ X64
+MOVSW 8086
+MOVSX reg16,mem 386
+MOVSX reg16,reg8 386
+MOVSX reg32,rm8 386
+MOVSX reg32,rm16 386
+MOVSX reg64,rm8 X64
+MOVSX reg64,rm16 X64
+MOVSXD reg64,rm32 X64
+MOVSX reg64,rm32 X64,ND
+MOVZX reg16,mem 386
+MOVZX reg16,reg8 386
+MOVZX reg32,rm8 386
+MOVZX reg32,rm16 386
+MOVZX reg64,rm8 X64
+MOVZX reg64,rm16 X64
+MUL rm8 8086
+MUL rm16 8086
+MUL rm32 386
+MUL rm64 X64
+MWAIT PRESCOTT
+MWAIT reg_eax,reg_ecx PRESCOTT,ND
+NEG rm8 8086
+NEG rm16 8086
+NEG rm32 386
+NEG rm64 X64
+NOP 8086
+NOP rm16 P6
+NOP rm32 P6
+NOP rm64 X64
+NOT rm8 8086
+NOT rm16 8086
+NOT rm32 386
+NOT rm64 X64
+OR mem,reg8 8086
+OR reg8,reg8 8086
+OR mem,reg16 8086
+OR reg16,reg16 8086
+OR mem,reg32 386
+OR reg32,reg32 386
+OR mem,reg64 X64
+OR reg64,reg64 X64
+OR reg8,mem 8086
+OR reg8,reg8 8086
+OR reg16,mem 8086
+OR reg16,reg16 8086
+OR reg32,mem 386
+OR reg32,reg32 386
+OR reg64,mem X64
+OR reg64,reg64 X64
+OR rm16,imm8 8086
+OR rm32,imm8 386
+OR rm64,imm8 X64
+OR reg_al,imm 8086
+OR reg_ax,sbyte16 8086
+OR reg_ax,imm 8086
+OR reg_eax,sbyte32 386
+OR reg_eax,imm 386
+OR reg_rax,sbyte64 X64
+OR reg_rax,imm X64
+OR rm8,imm 8086
+OR rm16,imm 8086
+OR rm32,imm 386
+OR rm64,imm X64
+OR mem,imm8 8086
+OR mem,imm16 8086
+OR mem,imm32 386
+OUT imm,reg_al 8086
+OUT imm,reg_ax 8086
+OUT imm,reg_eax 386
+OUT reg_dx,reg_al 8086
+OUT reg_dx,reg_ax 8086
+OUT reg_dx,reg_eax 386
+OUTSB 186
+OUTSD 386
+OUTSW 186
+PACKSSDW mmxreg,mmxrm PENT,MMX
+PACKSSWB mmxreg,mmxrm PENT,MMX
+PACKUSWB mmxreg,mmxrm PENT,MMX
+PADDB mmxreg,mmxrm PENT,MMX
+PADDD mmxreg,mmxrm PENT,MMX
+PADDSB mmxreg,mmxrm PENT,MMX
+PADDSIW mmxreg,mmxrm PENT,MMX,CYRIX
+PADDSW mmxreg,mmxrm PENT,MMX
+PADDUSB mmxreg,mmxrm PENT,MMX
+PADDUSW mmxreg,mmxrm PENT,MMX
+PADDW mmxreg,mmxrm PENT,MMX
+PAND mmxreg,mmxrm PENT,MMX
+PANDN mmxreg,mmxrm PENT,MMX
+PAUSE 8086
+PAVEB mmxreg,mmxrm PENT,MMX,CYRIX
+PAVGUSB mmxreg,mmxrm PENT,3DNOW
+PCMPEQB mmxreg,mmxrm PENT,MMX
+PCMPEQD mmxreg,mmxrm PENT,MMX
+PCMPEQW mmxreg,mmxrm PENT,MMX
+PCMPGTB mmxreg,mmxrm PENT,MMX
+PCMPGTD mmxreg,mmxrm PENT,MMX
+PCMPGTW mmxreg,mmxrm PENT,MMX
+PDISTIB mmxreg,mem PENT,MMX,CYRIX
+PF2ID mmxreg,mmxrm PENT,3DNOW
+PFACC mmxreg,mmxrm PENT,3DNOW
+PFADD mmxreg,mmxrm PENT,3DNOW
+PFCMPEQ mmxreg,mmxrm PENT,3DNOW
+PFCMPGE mmxreg,mmxrm PENT,3DNOW
+PFCMPGT mmxreg,mmxrm PENT,3DNOW
+PFMAX mmxreg,mmxrm PENT,3DNOW
+PFMIN mmxreg,mmxrm PENT,3DNOW
+PFMUL mmxreg,mmxrm PENT,3DNOW
+PFRCP mmxreg,mmxrm PENT,3DNOW
+PFRCPIT1 mmxreg,mmxrm PENT,3DNOW
+PFRCPIT2 mmxreg,mmxrm PENT,3DNOW
+PFRSQIT1 mmxreg,mmxrm PENT,3DNOW
+PFRSQRT mmxreg,mmxrm PENT,3DNOW
+PFSUB mmxreg,mmxrm PENT,3DNOW
+PFSUBR mmxreg,mmxrm PENT,3DNOW
+PI2FD mmxreg,mmxrm PENT,3DNOW
+PMACHRIW mmxreg,mem PENT,MMX,CYRIX
+PMADDWD mmxreg,mmxrm PENT,MMX
+PMAGW mmxreg,mmxrm PENT,MMX,CYRIX
+PMULHRIW mmxreg,mmxrm PENT,MMX,CYRIX
+PMULHRWA mmxreg,mmxrm PENT,3DNOW
+PMULHRWC mmxreg,mmxrm PENT,MMX,CYRIX
+PMULHW mmxreg,mmxrm PENT,MMX
+PMULLW mmxreg,mmxrm PENT,MMX
+PMVGEZB mmxreg,mem PENT,MMX,CYRIX
+PMVLZB mmxreg,mem PENT,MMX,CYRIX
+PMVNZB mmxreg,mem PENT,MMX,CYRIX
+PMVZB mmxreg,mem PENT,MMX,CYRIX
+POP reg16 8086
+POP reg32 386,NOLONG
+POP reg64 X64
+POP rm16 8086
+POP rm32 386,NOLONG
+POP rm64 X64
+POP reg_cs 8086,UNDOC,ND
+POP reg_dess 8086,NOLONG
+POP reg_fsgs 386
+POPA 186,NOLONG
+POPAD 386,NOLONG
+POPAW 186,NOLONG
+POPF 8086
+POPFD 386,NOLONG
+POPFQ X64
+POPFW 8086
+POR mmxreg,mmxrm PENT,MMX
+PREFETCH mem PENT,3DNOW
+PREFETCHW mem PENT,3DNOW
+PSLLD mmxreg,mmxrm PENT,MMX
+PSLLD mmxreg,imm PENT,MMX
+PSLLQ mmxreg,mmxrm PENT,MMX
+PSLLQ mmxreg,imm PENT,MMX
+PSLLW mmxreg,mmxrm PENT,MMX
+PSLLW mmxreg,imm PENT,MMX
+PSRAD mmxreg,mmxrm PENT,MMX
+PSRAD mmxreg,imm PENT,MMX
+PSRAW mmxreg,mmxrm PENT,MMX
+PSRAW mmxreg,imm PENT,MMX
+PSRLD mmxreg,mmxrm PENT,MMX
+PSRLD mmxreg,imm PENT,MMX
+PSRLQ mmxreg,mmxrm PENT,MMX
+PSRLQ mmxreg,imm PENT,MMX
+PSRLW mmxreg,mmxrm PENT,MMX
+PSRLW mmxreg,imm PENT,MMX
+PSUBB mmxreg,mmxrm PENT,MMX
+PSUBD mmxreg,mmxrm PENT,MMX
+PSUBSB mmxreg,mmxrm PENT,MMX
+PSUBSIW mmxreg,mmxrm PENT,MMX,CYRIX
+PSUBSW mmxreg,mmxrm PENT,MMX
+PSUBUSB mmxreg,mmxrm PENT,MMX
+PSUBUSW mmxreg,mmxrm PENT,MMX
+PSUBW mmxreg,mmxrm PENT,MMX
+PUNPCKHBW mmxreg,mmxrm PENT,MMX
+PUNPCKHDQ mmxreg,mmxrm PENT,MMX
+PUNPCKHWD mmxreg,mmxrm PENT,MMX
+PUNPCKLBW mmxreg,mmxrm PENT,MMX
+PUNPCKLDQ mmxreg,mmxrm PENT,MMX
+PUNPCKLWD mmxreg,mmxrm PENT,MMX
+PUSH reg16 8086
+PUSH reg32 386,NOLONG
+PUSH reg64 X64
+PUSH rm16 8086
+PUSH rm32 386,NOLONG
+PUSH rm64 X64
+PUSH reg_cs 8086,NOLONG
+PUSH reg_dess 8086,NOLONG
+PUSH reg_fsgs 386
+PUSH imm8 186
+PUSH imm16 186,AR0,SZ
+PUSH imm32 386,NOLONG,AR0,SZ
+PUSH imm32 386,NOLONG,SD
+PUSH imm64 X64,AR0,SZ
+PUSHA 186,NOLONG
+PUSHAD 386,NOLONG
+PUSHAW 186,NOLONG
+PUSHF 8086
+PUSHFD 386,NOLONG
+PUSHFQ X64
+PUSHFW 8086
+PXOR mmxreg,mmxrm PENT,MMX
+RCL rm8,unity 8086
+RCL rm8,reg_cl 8086
+RCL rm8,imm 186
+RCL rm16,unity 8086
+RCL rm16,reg_cl 8086
+RCL rm16,imm 186
+RCL rm32,unity 386
+RCL rm32,reg_cl 386
+RCL rm32,imm 386
+RCL rm64,unity X64
+RCL rm64,reg_cl X64
+RCL rm64,imm X64
+RCR rm8,unity 8086
+RCR rm8,reg_cl 8086
+RCR rm8,imm 186
+RCR rm16,unity 8086
+RCR rm16,reg_cl 8086
+RCR rm16,imm 186
+RCR rm32,unity 386
+RCR rm32,reg_cl 386
+RCR rm32,imm 386
+RCR rm64,unity X64
+RCR rm64,reg_cl X64
+RCR rm64,imm X64
+RDSHR rm32 P6,CYRIXM
+RDMSR PENT,PRIV
+RDPMC P6
+RDTSC PENT
+RDTSCP X86_64
+RET 8086
+RET imm 8086,SW
+RETF 8086
+RETF imm 8086,SW
+RETN 8086
+RETN imm 8086,SW
+ROL rm8,unity 8086
+ROL rm8,reg_cl 8086
+ROL rm8,imm 186
+ROL rm16,unity 8086
+ROL rm16,reg_cl 8086
+ROL rm16,imm 186
+ROL rm32,unity 386
+ROL rm32,reg_cl 386
+ROL rm32,imm 386
+ROL rm64,unity X64
+ROL rm64,reg_cl X64
+ROL rm64,imm X64
+ROR rm8,unity 8086
+ROR rm8,reg_cl 8086
+ROR rm8,imm 186
+ROR rm16,unity 8086
+ROR rm16,reg_cl 8086
+ROR rm16,imm 186
+ROR rm32,unity 386
+ROR rm32,reg_cl 386
+ROR rm32,imm 386
+ROR rm64,unity X64
+ROR rm64,reg_cl X64
+ROR rm64,imm X64
+RDM P6,CYRIX,ND
+RSDC reg_sreg,mem80 486,CYRIXM
+RSLDT mem80 486,CYRIXM
+RSM PENTM
+RSTS mem80 486,CYRIXM
+SAHF 8086
+SAL rm8,unity 8086,ND
+SAL rm8,reg_cl 8086,ND
+SAL rm8,imm 186,ND
+SAL rm16,unity 8086,ND
+SAL rm16,reg_cl 8086,ND
+SAL rm16,imm 186,ND
+SAL rm32,unity 386,ND
+SAL rm32,reg_cl 386,ND
+SAL rm32,imm 386,ND
+SAL rm64,unity X64,ND
+SAL rm64,reg_cl X64,ND
+SAL rm64,imm X64,ND
+SALC 8086,UNDOC
+SAR rm8,unity 8086
+SAR rm8,reg_cl 8086
+SAR rm8,imm 186
+SAR rm16,unity 8086
+SAR rm16,reg_cl 8086
+SAR rm16,imm 186
+SAR rm32,unity 386
+SAR rm32,reg_cl 386
+SAR rm32,imm 386
+SAR rm64,unity X64
+SAR rm64,reg_cl X64
+SAR rm64,imm X64
+SBB mem,reg8 8086
+SBB reg8,reg8 8086
+SBB mem,reg16 8086
+SBB reg16,reg16 8086
+SBB mem,reg32 386
+SBB reg32,reg32 386
+SBB mem,reg64 X64
+SBB reg64,reg64 X64
+SBB reg8,mem 8086
+SBB reg8,reg8 8086
+SBB reg16,mem 8086
+SBB reg16,reg16 8086
+SBB reg32,mem 386
+SBB reg32,reg32 386
+SBB reg64,mem X64
+SBB reg64,reg64 X64
+SBB rm16,imm8 8086
+SBB rm32,imm8 386
+SBB rm64,imm8 X64
+SBB reg_al,imm 8086
+SBB reg_ax,sbyte16 8086
+SBB reg_ax,imm 8086
+SBB reg_eax,sbyte32 386
+SBB reg_eax,imm 386
+SBB reg_rax,sbyte64 X64
+SBB reg_rax,imm X64
+SBB rm8,imm 8086
+SBB rm16,imm 8086
+SBB rm32,imm 386
+SBB rm64,imm X64
+SBB mem,imm8 8086
+SBB mem,imm16 8086
+SBB mem,imm32 386
+SCASB 8086
+SCASD 386
+SCASQ X64
+SCASW 8086
+SFENCE X64,AMD
+SGDT mem 286
+SHL rm8,unity 8086
+SHL rm8,reg_cl 8086
+SHL rm8,imm 186
+SHL rm16,unity 8086
+SHL rm16,reg_cl 8086
+SHL rm16,imm 186
+SHL rm32,unity 386
+SHL rm32,reg_cl 386
+SHL rm32,imm 386
+SHL rm64,unity X64
+SHL rm64,reg_cl X64
+SHL rm64,imm X64
+SHLD mem,reg16,imm 3862
+SHLD reg16,reg16,imm 3862
+SHLD mem,reg32,imm 3862
+SHLD reg32,reg32,imm 3862
+SHLD mem,reg64,imm X642
+SHLD reg64,reg64,imm X642
+SHLD mem,reg16,reg_cl 386
+SHLD reg16,reg16,reg_cl 386
+SHLD mem,reg32,reg_cl 386
+SHLD reg32,reg32,reg_cl 386
+SHLD mem,reg64,reg_cl X64
+SHLD reg64,reg64,reg_cl X64
+SHR rm8,unity 8086
+SHR rm8,reg_cl 8086
+SHR rm8,imm 186
+SHR rm16,unity 8086
+SHR rm16,reg_cl 8086
+SHR rm16,imm 186
+SHR rm32,unity 386
+SHR rm32,reg_cl 386
+SHR rm32,imm 386
+SHR rm64,unity X64
+SHR rm64,reg_cl X64
+SHR rm64,imm X64
+SHRD mem,reg16,imm 3862
+SHRD reg16,reg16,imm 3862
+SHRD mem,reg32,imm 3862
+SHRD reg32,reg32,imm 3862
+SHRD mem,reg64,imm X642
+SHRD reg64,reg64,imm X642
+SHRD mem,reg16,reg_cl 386
+SHRD reg16,reg16,reg_cl 386
+SHRD mem,reg32,reg_cl 386
+SHRD reg32,reg32,reg_cl 386
+SHRD mem,reg64,reg_cl X64
+SHRD reg64,reg64,reg_cl X64
+SIDT mem 286
+SLDT mem 286
+SLDT mem16 286
+SLDT reg16 286
+SLDT reg32 386
+SLDT reg64 X64,ND
+SLDT reg64 X64
+SKINIT X64
+SMI 386,UNDOC
+SMINT P6,CYRIX,ND
+SMINTOLD 486,CYRIX,ND
+SMSW mem 286
+SMSW mem16 286
+SMSW reg16 286
+SMSW reg32 386
+STC 8086
+STD 8086
+STGI X64
+STI 8086
+STOSB 8086
+STOSD 386
+STOSQ X64
+STOSW 8086
+STR mem 286,PROT
+STR mem16 286,PROT
+STR reg16 286,PROT
+STR reg32 386,PROT
+STR reg64 X64
+SUB mem,reg8 8086
+SUB reg8,reg8 8086
+SUB mem,reg16 8086
+SUB reg16,reg16 8086
+SUB mem,reg32 386
+SUB reg32,reg32 386
+SUB mem,reg64 X64
+SUB reg64,reg64 X64
+SUB reg8,mem 8086
+SUB reg8,reg8 8086
+SUB reg16,mem 8086
+SUB reg16,reg16 8086
+SUB reg32,mem 386
+SUB reg32,reg32 386
+SUB reg64,mem X64
+SUB reg64,reg64 X64
+SUB rm16,imm8 8086
+SUB rm32,imm8 386
+SUB rm64,imm8 X64
+SUB reg_al,imm 8086
+SUB reg_ax,sbyte16 8086
+SUB reg_ax,imm 8086
+SUB reg_eax,sbyte32 386
+SUB reg_eax,imm 386
+SUB reg_rax,sbyte64 X64
+SUB reg_rax,imm X64
+SUB rm8,imm 8086
+SUB rm16,imm 8086
+SUB rm32,imm 386
+SUB rm64,imm X64
+SUB mem,imm8 8086
+SUB mem,imm16 8086
+SUB mem,imm32 386
+SVDC mem80,reg_sreg 486,CYRIXM
+SVLDT mem80 486,CYRIXM,ND
+SVTS mem80 486,CYRIXM
+SWAPGS X64
+SYSCALL P6,AMD
+SYSENTER P6
+SYSEXIT P6,PRIV
+SYSRET P6,PRIV,AMD
+TEST mem,reg8 8086
+TEST reg8,reg8 8086
+TEST mem,reg16 8086
+TEST reg16,reg16 8086
+TEST mem,reg32 386
+TEST reg32,reg32 386
+TEST mem,reg64 X64
+TEST reg64,reg64 X64
+TEST reg8,mem 8086
+TEST reg16,mem 8086
+TEST reg32,mem 386
+TEST reg64,mem X64
+TEST reg_al,imm 8086
+TEST reg_ax,imm 8086
+TEST reg_eax,imm 386
+TEST reg_rax,imm X64
+TEST rm8,imm 8086
+TEST rm16,imm 8086
+TEST rm32,imm 386
+TEST rm64,imm X64
+TEST mem,imm8 8086
+TEST mem,imm16 8086
+TEST mem,imm32 386
+UD0 186,UNDOC
+UD1 186,UNDOC
+UD2B 186,UNDOC,ND
+UD2 186
+UD2A 186,ND
+UMOV mem,reg8 386,UNDOC,ND
+UMOV reg8,reg8 386,UNDOC,ND
+UMOV mem,reg16 386,UNDOC,ND
+UMOV reg16,reg16 386,UNDOC,ND
+UMOV mem,reg32 386,UNDOC,ND
+UMOV reg32,reg32 386,UNDOC,ND
+UMOV reg8,mem 386,UNDOC,ND
+UMOV reg8,reg8 386,UNDOC,ND
+UMOV reg16,mem 386,UNDOC,ND
+UMOV reg16,reg16 386,UNDOC,ND
+UMOV reg32,mem 386,UNDOC,ND
+UMOV reg32,reg32 386,UNDOC,ND
+VERR mem 286,PROT
+VERR mem16 286,PROT
+VERR reg16 286,PROT
+VERW mem 286,PROT
+VERW mem16 286,PROT
+VERW reg16 286,PROT
+FWAIT 8086
+WBINVD 486,PRIV
+WRSHR rm32 P6,CYRIXM
+WRMSR PENT,PRIV
+XADD mem,reg8 486
+XADD reg8,reg8 486
+XADD mem,reg16 486
+XADD reg16,reg16 486
+XADD mem,reg32 486
+XADD reg32,reg32 486
+XADD mem,reg64 X64
+XADD reg64,reg64 X64
+XBTS reg16,mem 386,SW,UNDOC,ND
+XBTS reg16,reg16 386,UNDOC,ND
+XBTS reg32,mem 386,SD,UNDOC,ND
+XBTS reg32,reg32 386,UNDOC,ND
+XCHG reg_ax,reg16 8086
+XCHG reg_eax,reg32na 386
+XCHG reg_rax,reg64 X64
+XCHG reg16,reg_ax 8086
+XCHG reg32na,reg_eax 386
+XCHG reg64,reg_rax X64
+XCHG reg_eax,reg_eax 386,NOLONG
+XCHG reg8,mem 8086
+XCHG reg8,reg8 8086
+XCHG reg16,mem 8086
+XCHG reg16,reg16 8086
+XCHG reg32,mem 386
+XCHG reg32,reg32 386
+XCHG reg64,mem X64
+XCHG reg64,reg64 X64
+XCHG mem,reg8 8086
+XCHG reg8,reg8 8086
+XCHG mem,reg16 8086
+XCHG reg16,reg16 8086
+XCHG mem,reg32 386
+XCHG reg32,reg32 386
+XCHG mem,reg64 X64
+XCHG reg64,reg64 X64
+XLATB 8086
+XLAT 8086
+XOR mem,reg8 8086
+XOR reg8,reg8 8086
+XOR mem,reg16 8086
+XOR reg16,reg16 8086
+XOR mem,reg32 386
+XOR reg32,reg32 386
+XOR mem,reg64 X64
+XOR reg64,reg64 X64
+XOR reg8,mem 8086
+XOR reg8,reg8 8086
+XOR reg16,mem 8086
+XOR reg16,reg16 8086
+XOR reg32,mem 386
+XOR reg32,reg32 386
+XOR reg64,mem X64
+XOR reg64,reg64 X64
+XOR rm16,imm8 8086
+XOR rm32,imm8 386
+XOR rm64,imm8 X64
+XOR reg_al,imm 8086
+XOR reg_ax,sbyte16 8086
+XOR reg_ax,imm 8086
+XOR reg_eax,sbyte32 386
+XOR reg_eax,imm 386
+XOR reg_rax,sbyte64 X64
+XOR reg_rax,imm X64
+XOR rm8,imm 8086
+XOR rm16,imm 8086
+XOR rm32,imm 386
+XOR rm64,imm X64
+XOR mem,imm8 8086
+XOR mem,imm16 8086
+XOR mem,imm32 386
+CMOVcc reg16,mem P6
+CMOVcc reg16,reg16 P6
+CMOVcc reg32,mem P6
+CMOVcc reg32,reg32 P6
+CMOVcc reg64,mem X64
+CMOVcc reg64,reg64 X64
+Jcc imm|near 386
+Jcc imm16|near 386
+Jcc imm32|near 386
+Jcc imm|short 8086,ND
+Jcc imm 8086,ND
+Jcc imm 386,ND
+Jcc imm 8086,ND
+Jcc imm 8086
+SETcc mem 386
+SETcc reg8 386
+</pre>
+<h4><a name="section-B.1.3">B.1.3 Katmai Streaming SIMD instructions (SSE -- a.k.a. KNI, XMM, MMX2)</a></h4>
+<p><pre>
+ADDPS xmmreg,xmmrm KATMAI,SSE
+ADDSS xmmreg,xmmrm KATMAI,SSE,SD
+ANDNPS xmmreg,xmmrm KATMAI,SSE
+ANDPS xmmreg,xmmrm KATMAI,SSE
+CMPEQPS xmmreg,xmmrm KATMAI,SSE
+CMPEQSS xmmreg,xmmrm KATMAI,SSE
+CMPLEPS xmmreg,xmmrm KATMAI,SSE
+CMPLESS xmmreg,xmmrm KATMAI,SSE
+CMPLTPS xmmreg,xmmrm KATMAI,SSE
+CMPLTSS xmmreg,xmmrm KATMAI,SSE
+CMPNEQPS xmmreg,xmmrm KATMAI,SSE
+CMPNEQSS xmmreg,xmmrm KATMAI,SSE
+CMPNLEPS xmmreg,xmmrm KATMAI,SSE
+CMPNLESS xmmreg,xmmrm KATMAI,SSE
+CMPNLTPS xmmreg,xmmrm KATMAI,SSE
+CMPNLTSS xmmreg,xmmrm KATMAI,SSE
+CMPORDPS xmmreg,xmmrm KATMAI,SSE
+CMPORDSS xmmreg,xmmrm KATMAI,SSE
+CMPUNORDPS xmmreg,xmmrm KATMAI,SSE
+CMPUNORDSS xmmreg,xmmrm KATMAI,SSE
+CMPPS xmmreg,mem,imm KATMAI,SSE
+CMPPS xmmreg,xmmreg,imm KATMAI,SSE
+CMPSS xmmreg,mem,imm KATMAI,SSE
+CMPSS xmmreg,xmmreg,imm KATMAI,SSE
+COMISS xmmreg,xmmrm KATMAI,SSE
+CVTPI2PS xmmreg,mmxrm KATMAI,SSE,MMX
+CVTPS2PI mmxreg,xmmrm KATMAI,SSE,MMX
+CVTSI2SS xmmreg,mem KATMAI,SSE,SD,AR1,ND
+CVTSI2SS xmmreg,rm32 KATMAI,SSE,SD,AR1
+CVTSI2SS xmmreg,rm64 X64,SSE,AR1
+CVTSS2SI reg32,xmmreg KATMAI,SSE,SD,AR1
+CVTSS2SI reg32,mem KATMAI,SSE,SD,AR1
+CVTSS2SI reg64,xmmreg X64,SSE,SD,AR1
+CVTSS2SI reg64,mem X64,SSE,SD,AR1
+CVTTPS2PI mmxreg,xmmrm KATMAI,SSE,MMX
+CVTTSS2SI reg32,xmmrm KATMAI,SSE,SD,AR1
+CVTTSS2SI reg64,xmmrm X64,SSE,SD,AR1
+DIVPS xmmreg,xmmrm KATMAI,SSE
+DIVSS xmmreg,xmmrm KATMAI,SSE
+LDMXCSR mem KATMAI,SSE,SD
+MAXPS xmmreg,xmmrm KATMAI,SSE
+MAXSS xmmreg,xmmrm KATMAI,SSE
+MINPS xmmreg,xmmrm KATMAI,SSE
+MINSS xmmreg,xmmrm KATMAI,SSE
+MOVAPS xmmreg,mem KATMAI,SSE
+MOVAPS mem,xmmreg KATMAI,SSE
+MOVAPS xmmreg,xmmreg KATMAI,SSE
+MOVAPS xmmreg,xmmreg KATMAI,SSE
+MOVHPS xmmreg,mem KATMAI,SSE
+MOVHPS mem,xmmreg KATMAI,SSE
+MOVLHPS xmmreg,xmmreg KATMAI,SSE
+MOVLPS xmmreg,mem KATMAI,SSE
+MOVLPS mem,xmmreg KATMAI,SSE
+MOVHLPS xmmreg,xmmreg KATMAI,SSE
+MOVMSKPS reg32,xmmreg KATMAI,SSE
+MOVMSKPS reg64,xmmreg X64,SSE
+MOVNTPS mem,xmmreg KATMAI,SSE
+MOVSS xmmreg,mem KATMAI,SSE
+MOVSS mem,xmmreg KATMAI,SSE
+MOVSS xmmreg,xmmreg KATMAI,SSE
+MOVSS xmmreg,xmmreg KATMAI,SSE
+MOVUPS xmmreg,mem KATMAI,SSE
+MOVUPS mem,xmmreg KATMAI,SSE
+MOVUPS xmmreg,xmmreg KATMAI,SSE
+MOVUPS xmmreg,xmmreg KATMAI,SSE
+MULPS xmmreg,xmmrm KATMAI,SSE
+MULSS xmmreg,xmmrm KATMAI,SSE
+ORPS xmmreg,xmmrm KATMAI,SSE
+RCPPS xmmreg,xmmrm KATMAI,SSE
+RCPSS xmmreg,xmmrm KATMAI,SSE
+RSQRTPS xmmreg,xmmrm KATMAI,SSE
+RSQRTSS xmmreg,xmmrm KATMAI,SSE
+SHUFPS xmmreg,mem,imm KATMAI,SSE
+SHUFPS xmmreg,xmmreg,imm KATMAI,SSE
+SQRTPS xmmreg,xmmrm KATMAI,SSE
+SQRTSS xmmreg,xmmrm KATMAI,SSE
+STMXCSR mem KATMAI,SSE,SD
+SUBPS xmmreg,xmmrm KATMAI,SSE
+SUBSS xmmreg,xmmrm KATMAI,SSE
+UCOMISS xmmreg,xmmrm KATMAI,SSE
+UNPCKHPS xmmreg,xmmrm KATMAI,SSE
+UNPCKLPS xmmreg,xmmrm KATMAI,SSE
+XORPS xmmreg,xmmrm KATMAI,SSE
+</pre>
+<h4><a name="section-B.1.4">B.1.4 Introduced in Deschutes but necessary for SSE support</a></h4>
+<p><pre>
+FXRSTOR mem P6,SSE,FPU
+FXSAVE mem P6,SSE,FPU
+</pre>
+<h4><a name="section-B.1.5">B.1.5 XSAVE group (AVX and extended state)</a></h4>
+<p><pre>
+XGETBV NEHALEM
+XSETBV NEHALEM,PRIV
+XSAVE mem NEHALEM
+XRSTOR mem NEHALEM
+</pre>
+<h4><a name="section-B.1.6">B.1.6 Generic memory operations</a></h4>
+<p><pre>
+PREFETCHNTA mem KATMAI
+PREFETCHT0 mem KATMAI
+PREFETCHT1 mem KATMAI
+PREFETCHT2 mem KATMAI
+SFENCE KATMAI
+</pre>
+<h4><a name="section-B.1.7">B.1.7 New MMX instructions introduced in Katmai</a></h4>
+<p><pre>
+MASKMOVQ mmxreg,mmxreg KATMAI,MMX
+MOVNTQ mem,mmxreg KATMAI,MMX
+PAVGB mmxreg,mmxrm KATMAI,MMX
+PAVGW mmxreg,mmxrm KATMAI,MMX
+PEXTRW reg32,mmxreg,imm KATMAI,MMX
+PINSRW mmxreg,mem,imm KATMAI,MMX
+PINSRW mmxreg,rm16,imm KATMAI,MMX
+PINSRW mmxreg,reg32,imm KATMAI,MMX
+PMAXSW mmxreg,mmxrm KATMAI,MMX
+PMAXUB mmxreg,mmxrm KATMAI,MMX
+PMINSW mmxreg,mmxrm KATMAI,MMX
+PMINUB mmxreg,mmxrm KATMAI,MMX
+PMOVMSKB reg32,mmxreg KATMAI,MMX
+PMULHUW mmxreg,mmxrm KATMAI,MMX
+PSADBW mmxreg,mmxrm KATMAI,MMX
+PSHUFW mmxreg,mmxrm,imm KATMAI,MMX2
+</pre>
+<h4><a name="section-B.1.8">B.1.8 AMD Enhanced 3DNow! (Athlon) instructions</a></h4>
+<p><pre>
+PF2IW mmxreg,mmxrm PENT,3DNOW
+PFNACC mmxreg,mmxrm PENT,3DNOW
+PFPNACC mmxreg,mmxrm PENT,3DNOW
+PI2FW mmxreg,mmxrm PENT,3DNOW
+PSWAPD mmxreg,mmxrm PENT,3DNOW
+</pre>
+<h4><a name="section-B.1.9">B.1.9 Willamette SSE2 Cacheability Instructions</a></h4>
+<p><pre>
+MASKMOVDQU xmmreg,xmmreg WILLAMETTE,SSE2
+CLFLUSH mem WILLAMETTE,SSE2
+MOVNTDQ mem,xmmreg WILLAMETTE,SSE2,SO
+MOVNTI mem,reg32 WILLAMETTE,SD
+MOVNTI mem,reg64 X64
+MOVNTPD mem,xmmreg WILLAMETTE,SSE2,SO
+LFENCE WILLAMETTE,SSE2
+MFENCE WILLAMETTE,SSE2
+</pre>
+<h4><a name="section-B.1.10">B.1.10 Willamette MMX instructions (SSE2 SIMD Integer Instructions)</a></h4>
+<p><pre>
+MOVD mem,xmmreg WILLAMETTE,SSE2,SD
+MOVD xmmreg,mem WILLAMETTE,SSE2,SD
+MOVD xmmreg,rm32 WILLAMETTE,SSE2
+MOVD rm32,xmmreg WILLAMETTE,SSE2
+MOVDQA xmmreg,xmmreg WILLAMETTE,SSE2
+MOVDQA mem,xmmreg WILLAMETTE,SSE2,SO
+MOVDQA xmmreg,mem WILLAMETTE,SSE2,SO
+MOVDQA xmmreg,xmmreg WILLAMETTE,SSE2
+MOVDQU xmmreg,xmmreg WILLAMETTE,SSE2
+MOVDQU mem,xmmreg WILLAMETTE,SSE2,SO
+MOVDQU xmmreg,mem WILLAMETTE,SSE2,SO
+MOVDQU xmmreg,xmmreg WILLAMETTE,SSE2
+MOVDQ2Q mmxreg,xmmreg WILLAMETTE,SSE2
+MOVQ xmmreg,xmmreg WILLAMETTE,SSE2
+MOVQ xmmreg,xmmreg WILLAMETTE,SSE2
+MOVQ mem,xmmreg WILLAMETTE,SSE2
+MOVQ xmmreg,mem WILLAMETTE,SSE2
+MOVQ xmmreg,rm64 X64,SSE2
+MOVQ rm64,xmmreg X64,SSE2
+MOVQ2DQ xmmreg,mmxreg WILLAMETTE,SSE2
+PACKSSWB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PACKSSDW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PACKUSWB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PADDB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PADDW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PADDD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PADDQ mmxreg,mmxrm WILLAMETTE,MMX
+PADDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PADDSB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PADDSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PADDUSB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PADDUSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PAND xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PANDN xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PAVGB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PAVGW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PCMPEQB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PCMPEQW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PCMPEQD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PCMPGTB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PCMPGTW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PCMPGTD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PEXTRW reg32,xmmreg,imm WILLAMETTE,SSE2
+PINSRW xmmreg,reg16,imm WILLAMETTE,SSE2
+PINSRW xmmreg,reg32,imm WILLAMETTE,SSE2,ND
+PINSRW xmmreg,mem,imm WILLAMETTE,SSE2
+PINSRW xmmreg,mem16,imm WILLAMETTE,SSE2
+PMADDWD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PMAXSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PMAXUB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PMINSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PMINUB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PMOVMSKB reg32,xmmreg WILLAMETTE,SSE2
+PMULHUW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PMULHW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PMULLW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PMULUDQ mmxreg,mmxrm WILLAMETTE,SSE2,SO
+PMULUDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+POR xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSADBW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSHUFD xmmreg,xmmreg,imm WILLAMETTE,SSE2
+PSHUFD xmmreg,mem,imm WILLAMETTE,SSE22
+PSHUFHW xmmreg,xmmreg,imm WILLAMETTE,SSE2
+PSHUFHW xmmreg,mem,imm WILLAMETTE,SSE22
+PSHUFLW xmmreg,xmmreg,imm WILLAMETTE,SSE2
+PSHUFLW xmmreg,mem,imm WILLAMETTE,SSE22
+PSLLDQ xmmreg,imm WILLAMETTE,SSE2,AR1
+PSLLW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSLLW xmmreg,imm WILLAMETTE,SSE2,AR1
+PSLLD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSLLD xmmreg,imm WILLAMETTE,SSE2,AR1
+PSLLQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSLLQ xmmreg,imm WILLAMETTE,SSE2,AR1
+PSRAW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSRAW xmmreg,imm WILLAMETTE,SSE2,AR1
+PSRAD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSRAD xmmreg,imm WILLAMETTE,SSE2,AR1
+PSRLDQ xmmreg,imm WILLAMETTE,SSE2,AR1
+PSRLW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSRLW xmmreg,imm WILLAMETTE,SSE2,AR1
+PSRLD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSRLD xmmreg,imm WILLAMETTE,SSE2,AR1
+PSRLQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSRLQ xmmreg,imm WILLAMETTE,SSE2,AR1
+PSUBB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSUBW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSUBD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSUBQ mmxreg,mmxrm WILLAMETTE,SSE2,SO
+PSUBQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSUBSB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSUBSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSUBUSB xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PSUBUSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PUNPCKHBW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PUNPCKHWD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PUNPCKHDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PUNPCKHQDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PUNPCKLBW xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PUNPCKLWD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PUNPCKLDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PUNPCKLQDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+PXOR xmmreg,xmmrm WILLAMETTE,SSE2,SO
+</pre>
+<h4><a name="section-B.1.11">B.1.11 Willamette Streaming SIMD instructions (SSE2)</a></h4>
+<p><pre>
+ADDPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+ADDSD xmmreg,xmmrm WILLAMETTE,SSE2
+ANDNPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+ANDPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CMPEQPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CMPEQSD xmmreg,xmmrm WILLAMETTE,SSE2
+CMPLEPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CMPLESD xmmreg,xmmrm WILLAMETTE,SSE2
+CMPLTPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CMPLTSD xmmreg,xmmrm WILLAMETTE,SSE2
+CMPNEQPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CMPNEQSD xmmreg,xmmrm WILLAMETTE,SSE2
+CMPNLEPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CMPNLESD xmmreg,xmmrm WILLAMETTE,SSE2
+CMPNLTPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CMPNLTSD xmmreg,xmmrm WILLAMETTE,SSE2
+CMPORDPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CMPORDSD xmmreg,xmmrm WILLAMETTE,SSE2
+CMPUNORDPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CMPUNORDSD xmmreg,xmmrm WILLAMETTE,SSE2
+CMPPD xmmreg,xmmrm,imm WILLAMETTE,SSE22
+CMPSD xmmreg,xmmrm,imm WILLAMETTE,SSE2
+COMISD xmmreg,xmmrm WILLAMETTE,SSE2
+CVTDQ2PD xmmreg,xmmrm WILLAMETTE,SSE2
+CVTDQ2PS xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CVTPD2DQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CVTPD2PI mmxreg,xmmrm WILLAMETTE,SSE2,SO
+CVTPD2PS xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CVTPI2PD xmmreg,mmxrm WILLAMETTE,SSE2
+CVTPS2DQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CVTPS2PD xmmreg,xmmrm WILLAMETTE,SSE2
+CVTSD2SI reg32,xmmreg WILLAMETTE,SSE2,AR1
+CVTSD2SI reg32,mem WILLAMETTE,SSE2,AR1
+CVTSD2SI reg64,xmmreg X64,SSE2,AR1
+CVTSD2SI reg64,mem X64,SSE2,AR1
+CVTSD2SS xmmreg,xmmrm WILLAMETTE,SSE2
+CVTSI2SD xmmreg,mem WILLAMETTE,SSE2,SD,AR1,ND
+CVTSI2SD xmmreg,rm32 WILLAMETTE,SSE2,SD,AR1
+CVTSI2SD xmmreg,rm64 X64,SSE2,AR1
+CVTSS2SD xmmreg,xmmrm WILLAMETTE,SSE2,SD
+CVTTPD2PI mmxreg,xmmrm WILLAMETTE,SSE2,SO
+CVTTPD2DQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CVTTPS2DQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
+CVTTSD2SI reg32,xmmreg WILLAMETTE,SSE2,AR1
+CVTTSD2SI reg32,mem WILLAMETTE,SSE2,AR1
+CVTTSD2SI reg64,xmmreg X64,SSE2,AR1
+CVTTSD2SI reg64,mem X64,SSE2,AR1
+DIVPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+DIVSD xmmreg,xmmrm WILLAMETTE,SSE2
+MAXPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+MAXSD xmmreg,xmmrm WILLAMETTE,SSE2
+MINPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+MINSD xmmreg,xmmrm WILLAMETTE,SSE2
+MOVAPD xmmreg,xmmreg WILLAMETTE,SSE2
+MOVAPD xmmreg,xmmreg WILLAMETTE,SSE2
+MOVAPD mem,xmmreg WILLAMETTE,SSE2,SO
+MOVAPD xmmreg,mem WILLAMETTE,SSE2,SO
+MOVHPD mem,xmmreg WILLAMETTE,SSE2
+MOVHPD xmmreg,mem WILLAMETTE,SSE2
+MOVLPD mem,xmmreg WILLAMETTE,SSE2
+MOVLPD xmmreg,mem WILLAMETTE,SSE2
+MOVMSKPD reg32,xmmreg WILLAMETTE,SSE2
+MOVMSKPD reg64,xmmreg X64,SSE2
+MOVSD xmmreg,xmmreg WILLAMETTE,SSE2
+MOVSD xmmreg,xmmreg WILLAMETTE,SSE2
+MOVSD mem,xmmreg WILLAMETTE,SSE2
+MOVSD xmmreg,mem WILLAMETTE,SSE2
+MOVUPD xmmreg,xmmreg WILLAMETTE,SSE2
+MOVUPD xmmreg,xmmreg WILLAMETTE,SSE2
+MOVUPD mem,xmmreg WILLAMETTE,SSE2,SO
+MOVUPD xmmreg,mem WILLAMETTE,SSE2,SO
+MULPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+MULSD xmmreg,xmmrm WILLAMETTE,SSE2
+ORPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+SHUFPD xmmreg,xmmreg,imm WILLAMETTE,SSE2
+SHUFPD xmmreg,mem,imm WILLAMETTE,SSE2
+SQRTPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+SQRTSD xmmreg,xmmrm WILLAMETTE,SSE2
+SUBPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+SUBSD xmmreg,xmmrm WILLAMETTE,SSE2
+UCOMISD xmmreg,xmmrm WILLAMETTE,SSE2
+UNPCKHPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+UNPCKLPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+XORPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
+</pre>
+<h4><a name="section-B.1.12">B.1.12 Prescott New Instructions (SSE3)</a></h4>
+<p><pre>
+ADDSUBPD xmmreg,xmmrm PRESCOTT,SSE3,SO
+ADDSUBPS xmmreg,xmmrm PRESCOTT,SSE3,SO
+HADDPD xmmreg,xmmrm PRESCOTT,SSE3,SO
+HADDPS xmmreg,xmmrm PRESCOTT,SSE3,SO
+HSUBPD xmmreg,xmmrm PRESCOTT,SSE3,SO
+HSUBPS xmmreg,xmmrm PRESCOTT,SSE3,SO
+LDDQU xmmreg,mem PRESCOTT,SSE3,SO
+MOVDDUP xmmreg,xmmrm PRESCOTT,SSE3
+MOVSHDUP xmmreg,xmmrm PRESCOTT,SSE3
+MOVSLDUP xmmreg,xmmrm PRESCOTT,SSE3
+</pre>
+<h4><a name="section-B.1.13">B.1.13 VMX Instructions</a></h4>
+<p><pre>
+VMCALL VMX
+VMCLEAR mem VMX
+VMLAUNCH VMX
+VMLOAD X64,VMX
+VMMCALL X64,VMX
+VMPTRLD mem VMX
+VMPTRST mem VMX
+VMREAD rm32,reg32 VMX,NOLONG,SD
+VMREAD rm64,reg64 X64,VMX
+VMRESUME VMX
+VMRUN X64,VMX
+VMSAVE X64,VMX
+VMWRITE reg32,rm32 VMX,NOLONG,SD
+VMWRITE reg64,rm64 X64,VMX
+VMXOFF VMX
+VMXON mem VMX
+</pre>
+<h4><a name="section-B.1.14">B.1.14 Extended Page Tables VMX instructions</a></h4>
+<p><pre>
+INVEPT reg32,mem VMX,SO,NOLONG
+INVEPT reg64,mem VMX,SO,LONG
+INVVPID reg32,mem VMX,SO,NOLONG
+INVVPID reg64,mem VMX,SO,LONG
+</pre>
+<h4><a name="section-B.1.15">B.1.15 Tejas New Instructions (SSSE3)</a></h4>
+<p><pre>
+PABSB mmxreg,mmxrm SSSE3,MMX
+PABSB xmmreg,xmmrm SSSE3
+PABSW mmxreg,mmxrm SSSE3,MMX
+PABSW xmmreg,xmmrm SSSE3
+PABSD mmxreg,mmxrm SSSE3,MMX
+PABSD xmmreg,xmmrm SSSE3
+PALIGNR mmxreg,mmxrm,imm SSSE3,MMX
+PALIGNR xmmreg,xmmrm,imm SSSE3
+PHADDW mmxreg,mmxrm SSSE3,MMX
+PHADDW xmmreg,xmmrm SSSE3
+PHADDD mmxreg,mmxrm SSSE3,MMX
+PHADDD xmmreg,xmmrm SSSE3
+PHADDSW mmxreg,mmxrm SSSE3,MMX
+PHADDSW xmmreg,xmmrm SSSE3
+PHSUBW mmxreg,mmxrm SSSE3,MMX
+PHSUBW xmmreg,xmmrm SSSE3
+PHSUBD mmxreg,mmxrm SSSE3,MMX
+PHSUBD xmmreg,xmmrm SSSE3
+PHSUBSW mmxreg,mmxrm SSSE3,MMX
+PHSUBSW xmmreg,xmmrm SSSE3
+PMADDUBSW mmxreg,mmxrm SSSE3,MMX
+PMADDUBSW xmmreg,xmmrm SSSE3
+PMULHRSW mmxreg,mmxrm SSSE3,MMX
+PMULHRSW xmmreg,xmmrm SSSE3
+PSHUFB mmxreg,mmxrm SSSE3,MMX
+PSHUFB xmmreg,xmmrm SSSE3
+PSIGNB mmxreg,mmxrm SSSE3,MMX
+PSIGNB xmmreg,xmmrm SSSE3
+PSIGNW mmxreg,mmxrm SSSE3,MMX
+PSIGNW xmmreg,xmmrm SSSE3
+PSIGND mmxreg,mmxrm SSSE3,MMX
+PSIGND xmmreg,xmmrm SSSE3
+</pre>
+<h4><a name="section-B.1.16">B.1.16 AMD SSE4A</a></h4>
+<p><pre>
+EXTRQ xmmreg,imm,imm SSE4A,AMD
+EXTRQ xmmreg,xmmreg SSE4A,AMD
+INSERTQ xmmreg,xmmreg,imm,imm SSE4A,AMD
+INSERTQ xmmreg,xmmreg SSE4A,AMD
+MOVNTSD mem,xmmreg SSE4A,AMD
+MOVNTSS mem,xmmreg SSE4A,AMD,SD
+</pre>
+<h4><a name="section-B.1.17">B.1.17 New instructions in Barcelona</a></h4>
+<p><pre>
+LZCNT reg16,rm16 P6,AMD
+LZCNT reg32,rm32 P6,AMD
+LZCNT reg64,rm64 X64,AMD
+</pre>
+<h4><a name="section-B.1.18">B.1.18 Penryn New Instructions (SSE4.1)</a></h4>
+<p><pre>
+BLENDPD xmmreg,xmmrm,imm SSE41
+BLENDPS xmmreg,xmmrm,imm SSE41
+BLENDVPD xmmreg,xmmrm,xmm0 SSE41
+BLENDVPS xmmreg,xmmrm,xmm0 SSE41
+DPPD xmmreg,xmmrm,imm SSE41
+DPPS xmmreg,xmmrm,imm SSE41
+EXTRACTPS rm32,xmmreg,imm SSE41
+EXTRACTPS reg64,xmmreg,imm SSE41,X64
+INSERTPS xmmreg,xmmrm,imm SSE41,SD
+MOVNTDQA xmmreg,mem SSE41
+MPSADBW xmmreg,xmmrm,imm SSE41
+PACKUSDW xmmreg,xmmrm SSE41
+PBLENDVB xmmreg,xmmrm,xmm0 SSE41
+PBLENDW xmmreg,xmmrm,imm SSE41
+PCMPEQQ xmmreg,xmmrm SSE41
+PEXTRB reg32,xmmreg,imm SSE41
+PEXTRB mem8,xmmreg,imm SSE41
+PEXTRB reg64,xmmreg,imm SSE41,X64
+PEXTRD rm32,xmmreg,imm SSE41
+PEXTRQ rm64,xmmreg,imm SSE41,X64
+PEXTRW reg32,xmmreg,imm SSE41
+PEXTRW mem16,xmmreg,imm SSE41
+PEXTRW reg64,xmmreg,imm SSE41,X64
+PHMINPOSUW xmmreg,xmmrm SSE41
+PINSRB xmmreg,mem,imm SSE41
+PINSRB xmmreg,rm8,imm SSE41
+PINSRB xmmreg,reg32,imm SSE41
+PINSRD xmmreg,mem,imm SSE41
+PINSRD xmmreg,rm32,imm SSE41
+PINSRQ xmmreg,mem,imm SSE41,X64
+PINSRQ xmmreg,rm64,imm SSE41,X64
+PMAXSB xmmreg,xmmrm SSE41
+PMAXSD xmmreg,xmmrm SSE41
+PMAXUD xmmreg,xmmrm SSE41
+PMAXUW xmmreg,xmmrm SSE41
+PMINSB xmmreg,xmmrm SSE41
+PMINSD xmmreg,xmmrm SSE41
+PMINUD xmmreg,xmmrm SSE41
+PMINUW xmmreg,xmmrm SSE41
+PMOVSXBW xmmreg,xmmrm SSE41
+PMOVSXBD xmmreg,xmmrm SSE41,SD
+PMOVSXBQ xmmreg,xmmrm SSE41,SW
+PMOVSXWD xmmreg,xmmrm SSE41
+PMOVSXWQ xmmreg,xmmrm SSE41,SD
+PMOVSXDQ xmmreg,xmmrm SSE41
+PMOVZXBW xmmreg,xmmrm SSE41
+PMOVZXBD xmmreg,xmmrm SSE41,SD
+PMOVZXBQ xmmreg,xmmrm SSE41,SW
+PMOVZXWD xmmreg,xmmrm SSE41
+PMOVZXWQ xmmreg,xmmrm SSE41,SD
+PMOVZXDQ xmmreg,xmmrm SSE41
+PMULDQ xmmreg,xmmrm SSE41
+PMULLD xmmreg,xmmrm SSE41
+PTEST xmmreg,xmmrm SSE41
+ROUNDPD xmmreg,xmmrm,imm SSE41
+ROUNDPS xmmreg,xmmrm,imm SSE41
+ROUNDSD xmmreg,xmmrm,imm SSE41
+ROUNDSS xmmreg,xmmrm,imm SSE41
+</pre>
+<h4><a name="section-B.1.19">B.1.19 Nehalem New Instructions (SSE4.2)</a></h4>
+<p><pre>
+CRC32 reg32,rm8 SSE42
+CRC32 reg32,rm16 SSE42
+CRC32 reg32,rm32 SSE42
+CRC32 reg64,rm8 SSE42,X64
+CRC32 reg64,rm64 SSE42,X64
+PCMPESTRI xmmreg,xmmrm,imm SSE42
+PCMPESTRM xmmreg,xmmrm,imm SSE42
+PCMPISTRI xmmreg,xmmrm,imm SSE42
+PCMPISTRM xmmreg,xmmrm,imm SSE42
+PCMPGTQ xmmreg,xmmrm SSE42
+POPCNT reg16,rm16 NEHALEM,SW
+POPCNT reg32,rm32 NEHALEM,SD
+POPCNT reg64,rm64 NEHALEM,X64
+</pre>
+<h4><a name="section-B.1.20">B.1.20 Intel SMX</a></h4>
+<p><pre>
+GETSEC KATMAI
+</pre>
+<h4><a name="section-B.1.21">B.1.21 Geode (Cyrix) 3DNow! additions</a></h4>
+<p><pre>
+PFRCPV mmxreg,mmxrm PENT,3DNOW,CYRIX
+PFRSQRTV mmxreg,mmxrm PENT,3DNOW,CYRIX
+</pre>
+<h4><a name="section-B.1.22">B.1.22 Intel new instructions in ???</a></h4>
+<p><pre>
+MOVBE reg16,mem16 NEHALEM
+MOVBE reg32,mem32 NEHALEM
+MOVBE reg64,mem64 NEHALEM
+MOVBE mem16,reg16 NEHALEM
+MOVBE mem32,reg32 NEHALEM
+MOVBE mem64,reg64 NEHALEM
+</pre>
+<h4><a name="section-B.1.23">B.1.23 Intel AES instructions</a></h4>
+<p><pre>
+AESENC xmmreg,xmmrm128 SSE,WESTMERE
+AESENCLAST xmmreg,xmmrm128 SSE,WESTMERE
+AESDEC xmmreg,xmmrm128 SSE,WESTMERE
+AESDECLAST xmmreg,xmmrm128 SSE,WESTMERE
+AESIMC xmmreg,xmmrm128 SSE,WESTMERE
+AESKEYGENASSIST xmmreg,xmmrm128,imm8 SSE,WESTMERE
+</pre>
+<h4><a name="section-B.1.24">B.1.24 Intel AVX AES instructions</a></h4>
+<p><pre>
+VAESENC xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VAESENCLAST xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VAESDEC xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VAESDECLAST xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VAESIMC xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VAESKEYGENASSIST xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+</pre>
+<h4><a name="section-B.1.25">B.1.25 Intel AVX instructions</a></h4>
+<p><pre>
+VADDPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VADDPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VADDPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VADDPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VADDSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VADDSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VADDSUBPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VADDSUBPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VADDSUBPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VADDSUBPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VANDPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VANDPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VANDPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VANDPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VANDNPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VANDNPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VANDNPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VANDNPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VBLENDPD xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+VBLENDPD ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+VBLENDPS xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+VBLENDPS ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+VBLENDVPD xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+VBLENDVPD xmmreg,xmmrm128,xmm0 AVX,SANDYBRIDGE
+VBLENDVPD ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+VBLENDVPD ymmreg,ymmrm256,ymm0 AVX,SANDYBRIDGE
+VBLENDVPS xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+VBLENDVPS xmmreg,xmmrm128,xmm0 AVX,SANDYBRIDGE
+VBLENDVPS ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+VBLENDVPD ymmreg,ymmrm256,ymm0 AVX,SANDYBRIDGE
+VBROADCASTSS xmmreg,mem32 AVX,SANDYBRIDGE
+VBROADCASTSS ymmreg,mem32 AVX,SANDYBRIDGE
+VBROADCASTSD ymmreg,mem64 AVX,SANDYBRIDGE
+VBROADCASTF128 ymmreg,mem128 AVX,SANDYBRIDGE
+VCMPEQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPEQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPLTPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPLTPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPLEPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPLEPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPUNORDPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPUNORDPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNEQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNEQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNLTPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNLTPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNLEPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNLEPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPORDPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPORDPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPEQ_UQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPEQ_UQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNGEPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNGEPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNGTPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNGTPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPFALSEPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPFALSEPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNEQ_OQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNEQ_OQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPGEPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPGEPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPGTPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPGTPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPTRUEPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPTRUEPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPEQ_OSPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPEQ_OSPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPLT_OQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPLT_OQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPLE_OQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPLE_OQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPUNORD_SPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPUNORD_SPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNEQ_USPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNEQ_USPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNLT_UQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNLT_UQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNLE_UQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNLE_UQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPORD_SPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPORD_SPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPEQ_USPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPEQ_USPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNGE_UQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNGE_UQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNGT_UQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNGT_UQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPFALSE_OSPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPFALSE_OSPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNEQ_OSPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNEQ_OSPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPGE_OQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPGE_OQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPGT_OQPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPGT_OQPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPTRUE_USPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPTRUE_USPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPPD xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+VCMPPD ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+VCMPEQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPEQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPLTPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPLTPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPLEPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPLEPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPUNORDPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPUNORDPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNEQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNEQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNLTPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNLTPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNLEPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNLEPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPORDPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPORDPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPEQ_UQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPEQ_UQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNGEPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNGEPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNGTPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNGTPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPFALSEPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPFALSEPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNEQ_OQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNEQ_OQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPGEPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPGEPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPGTPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPGTPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPTRUEPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPTRUEPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPEQ_OSPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPEQ_OSPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPLT_OQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPLT_OQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPLE_OQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPLE_OQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPUNORD_SPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPUNORD_SPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNEQ_USPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNEQ_USPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNLT_UQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNLT_UQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNLE_UQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNLE_UQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPORD_SPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPORD_SPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPEQ_USPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPEQ_USPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNGE_UQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNGE_UQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNGT_UQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNGT_UQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPFALSE_OSPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPFALSE_OSPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPNEQ_OSPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPNEQ_OSPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPGE_OQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPGE_OQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPGT_OQPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPGT_OQPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPTRUE_USPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VCMPTRUE_USPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VCMPPS xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+VCMPPS ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+VCMPEQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPLTSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPLESD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPUNORDSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNEQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNLTSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNLESD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPORDSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPEQ_UQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNGESD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNGTSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPFALSESD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNEQ_OQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPGESD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPGTSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPTRUESD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPEQ_OSSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPLT_OQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPLE_OQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPUNORD_SSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNEQ_USSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNLT_UQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNLE_UQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPORD_SSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPEQ_USSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNGE_UQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNGT_UQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPFALSE_OSSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPNEQ_OSSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPGE_OQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPGT_OQSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPTRUE_USSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCMPSD xmmreg,xmmreg*,xmmrm64,imm8 AVX,SANDYBRIDGE
+VCMPEQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPLTSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPLESS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPUNORDSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNEQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNLTSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNLESS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPORDSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPEQ_UQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNGESS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNGTSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPFALSESS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNEQ_OQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPGESS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPGTSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPTRUESS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPEQ_OSSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPLT_OQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPLE_OQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPUNORD_SSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNEQ_USSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNLT_UQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNLE_UQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPORD_SSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPEQ_USSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNGE_UQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNGT_UQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPFALSE_OSSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPNEQ_OSSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPGE_OQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPGT_OQSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPTRUE_USSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCMPSS xmmreg,xmmreg*,xmmrm32,imm8 AVX,SANDYBRIDGE
+VCOMISD xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VCOMISS xmmreg,xmmrm32 AVX,SANDYBRIDGE
+VCVTDQ2PD xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VCVTDQ2PD ymmreg,xmmrm128 AVX,SANDYBRIDGE
+VCVTDQ2PS xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VCVTDQ2PS ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VCVTPD2DQ xmmreg,xmmreg AVX,SANDYBRIDGE
+VCVTPD2DQ xmmreg,mem128 AVX,SANDYBRIDGE,SO
+VCVTPD2DQ xmmreg,ymmreg AVX,SANDYBRIDGE
+VCVTPD2DQ xmmreg,mem256 AVX,SANDYBRIDGE,SY
+VCVTPD2PS xmmreg,xmmreg AVX,SANDYBRIDGE
+VCVTPD2PS xmmreg,mem128 AVX,SANDYBRIDGE,SO
+VCVTPD2PS xmmreg,ymmreg AVX,SANDYBRIDGE
+VCVTPD2PS xmmreg,mem256 AVX,SANDYBRIDGE,SY
+VCVTPS2DQ xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VCVTPS2DQ ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VCVTPS2PD xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VCVTPS2PD ymmreg,xmmrm128 AVX,SANDYBRIDGE
+VCVTSD2SI reg32,xmmrm64 AVX,SANDYBRIDGE
+VCVTSD2SI reg64,xmmrm64 AVX,SANDYBRIDGE,LONG
+VCVTSD2SS xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VCVTSI2SD xmmreg,xmmreg*,rm32 AVX,SANDYBRIDGE,SD
+VCVTSI2SD xmmreg,xmmreg*,mem32 AVX,SANDYBRIDGE,ND,SD
+VCVTSI2SD xmmreg,xmmreg*,rm64 AVX,SANDYBRIDGE,LONG
+VCVTSI2SS xmmreg,xmmreg*,rm32 AVX,SANDYBRIDGE,SD
+VCVTSI2SS xmmreg,xmmreg*,mem32 AVX,SANDYBRIDGE,ND,SD
+VCVTSI2SS xmmreg,xmmreg*,rm64 AVX,SANDYBRIDGE,LONG
+VCVTSS2SD xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VCVTSS2SI reg32,xmmrm32 AVX,SANDYBRIDGE
+VCVTSS2SI reg64,xmmrm32 AVX,SANDYBRIDGE,LONG
+VCVTTPD2DQ xmmreg,xmmreg AVX,SANDYBRIDGE
+VCVTTPD2DQ xmmreg,mem128 AVX,SANDYBRIDGE,SO
+VCVTTPD2DQ xmmreg,ymmreg AVX,SANDYBRIDGE
+VCVTTPD2DQ xmmreg,mem256 AVX,SANDYBRIDGE,SY
+VCVTTPS2DQ xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VCVTTPS2DQ ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VCVTTSD2SI reg32,xmmrm64 AVX,SANDYBRIDGE
+VCVTTSD2SI reg64,xmmrm64 AVX,SANDYBRIDGE,LONG
+VCVTTSS2SI reg32,xmmrm32 AVX,SANDYBRIDGE
+VCVTTSS2SI reg64,xmmrm32 AVX,SANDYBRIDGE,LONG
+VDIVPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VDIVPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VDIVPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VDIVPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VDIVSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VDIVSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VDPPD xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+VDPPS xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+VDPPS ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+VEXTRACTF128 xmmrm128,xmmreg,imm8 AVX,SANDYBRIDGE
+VEXTRACTPS rm32,xmmreg,imm8 AVX,SANDYBRIDGE
+VHADDPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VHADDPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VHADDPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VHADDPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VHSUBPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VHSUBPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VHSUBPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VHSUBPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VINSERTF128 ymmreg,ymmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VINSERTPS xmmreg,xmmreg*,xmmrm32,imm8 AVX,SANDYBRIDGE
+VLDDQU xmmreg,mem128 AVX,SANDYBRIDGE
+VLDQQU ymmreg,mem256 AVX,SANDYBRIDGE
+VLDDQU ymmreg,mem256 AVX,SANDYBRIDGE
+VLDMXCSR mem32 AVX,SANDYBRIDGE
+VMASKMOVDQU xmmreg,xmmreg AVX,SANDYBRIDGE
+VMASKMOVPS xmmreg,xmmreg,mem128 AVX,SANDYBRIDGE
+VMASKMOVPS ymmreg,ymmreg,mem256 AVX,SANDYBRIDGE
+VMASKMOVPS mem128,xmmreg,xmmreg AVX,SANDYBRIDGE,SO
+VMASKMOVPS mem256,xmmreg,xmmreg AVX,SANDYBRIDGE,SY
+VMASKMOVPD xmmreg,xmmreg,mem128 AVX,SANDYBRIDGE
+VMASKMOVPD ymmreg,ymmreg,mem256 AVX,SANDYBRIDGE
+VMASKMOVPD mem128,xmmreg,xmmreg AVX,SANDYBRIDGE
+VMASKMOVPD mem256,ymmreg,ymmreg AVX,SANDYBRIDGE
+VMAXPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VMAXPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VMAXPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VMAXPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VMAXSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VMAXSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VMINPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VMINPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VMINPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VMINPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VMINSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VMINSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VMOVAPD xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VMOVAPD xmmrm128,xmmreg AVX,SANDYBRIDGE
+VMOVAPD ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VMOVAPD ymmrm256,ymmreg AVX,SANDYBRIDGE
+VMOVAPS xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VMOVAPS xmmrm128,xmmreg AVX,SANDYBRIDGE
+VMOVAPS ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VMOVAPS ymmrm256,ymmreg AVX,SANDYBRIDGE
+VMOVQ xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VMOVQ xmmrm64,xmmreg AVX,SANDYBRIDGE
+VMOVQ xmmreg,rm64 AVX,SANDYBRIDGE,LONG
+VMOVQ rm64,xmmreg AVX,SANDYBRIDGE,LONG
+VMOVD xmmreg,rm32 AVX,SANDYBRIDGE
+VMOVD rm32,xmmreg AVX,SANDYBRIDGE
+VMOVDDUP xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VMOVDDUP ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VMOVDQA xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VMOVDQA xmmrm128,xmmreg AVX,SANDYBRIDGE
+VMOVQQA ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VMOVQQA ymmrm256,ymmreg AVX,SANDYBRIDGE
+VMOVDQA ymmreg,ymmrm AVX,SANDYBRIDGE
+VMOVDQA ymmrm256,ymmreg AVX,SANDYBRIDGE
+VMOVDQU xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VMOVDQU xmmrm128,xmmreg AVX,SANDYBRIDGE
+VMOVQQU ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VMOVQQU ymmrm256,ymmreg AVX,SANDYBRIDGE
+VMOVDQU ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VMOVDQU ymmrm256,ymmreg AVX,SANDYBRIDGE
+VMOVHLPS xmmreg,xmmreg*,xmmreg AVX,SANDYBRIDGE
+VMOVHPD xmmreg,xmmreg*,mem64 AVX,SANDYBRIDGE
+VMOVHPD mem64,xmmreg AVX,SANDYBRIDGE
+VMOVHPS xmmreg,xmmreg*,mem64 AVX,SANDYBRIDGE
+VMOVHPS mem64,xmmreg AVX,SANDYBRIDGE
+VMOVLHPS xmmreg,xmmreg*,xmmreg AVX,SANDYBRIDGE
+VMOVLPD xmmreg,xmmreg*,mem64 AVX,SANDYBRIDGE
+VMOVLPD mem64,xmmreg AVX,SANDYBRIDGE
+VMOVLPS xmmreg,xmmreg*,mem64 AVX,SANDYBRIDGE
+VMOVLPS mem64,xmmreg AVX,SANDYBRIDGE
+VMOVMSKPD reg64,xmmreg AVX,SANDYBRIDGE,LONG
+VMOVMSKPD reg32,xmmreg AVX,SANDYBRIDGE
+VMOVMSKPD reg64,ymmreg AVX,SANDYBRIDGE,LONG
+VMOVMSKPD reg32,ymmreg AVX,SANDYBRIDGE
+VMOVMSKPS reg64,xmmreg AVX,SANDYBRIDGE,LONG
+VMOVMSKPS reg32,xmmreg AVX,SANDYBRIDGE
+VMOVMSKPS reg64,ymmreg AVX,SANDYBRIDGE,LONG
+VMOVMSKPS reg32,ymmreg AVX,SANDYBRIDGE
+VMOVNTDQ mem128,xmmreg AVX,SANDYBRIDGE
+VMOVNTQQ mem256,ymmreg AVX,SANDYBRIDGE
+VMOVNTDQ mem256,ymmreg AVX,SANDYBRIDGE
+VMOVNTDQA xmmreg,mem128 AVX,SANDYBRIDGE
+VMOVNTPD mem128,xmmreg AVX,SANDYBRIDGE
+VMOVNTPD mem256,ymmreg AVX,SANDYBRIDGE
+VMOVNTPS mem128,xmmreg AVX,SANDYBRIDGE
+VMOVNTPS mem128,ymmreg AVX,SANDYBRIDGE
+VMOVSD xmmreg,xmmreg*,xmmreg AVX,SANDYBRIDGE
+VMOVSD xmmreg,mem64 AVX,SANDYBRIDGE
+VMOVSD xmmreg,xmmreg*,xmmreg AVX,SANDYBRIDGE
+VMOVSD mem64,xmmreg AVX,SANDYBRIDGE
+VMOVSHDUP xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VMOVSHDUP ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VMOVSLDUP xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VMOVSLDUP ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VMOVSS xmmreg,xmmreg*,xmmreg AVX,SANDYBRIDGE
+VMOVSS xmmreg,mem64 AVX,SANDYBRIDGE
+VMOVSS xmmreg,xmmreg*,xmmreg AVX,SANDYBRIDGE
+VMOVSS mem64,xmmreg AVX,SANDYBRIDGE
+VMOVUPD xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VMOVUPD xmmrm128,xmmreg AVX,SANDYBRIDGE
+VMOVUPD ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VMOVUPD ymmrm256,ymmreg AVX,SANDYBRIDGE
+VMOVUPS xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VMOVUPS xmmrm128,xmmreg AVX,SANDYBRIDGE
+VMOVUPS ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VMOVUPS ymmrm256,ymmreg AVX,SANDYBRIDGE
+VMPSADBW xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+VMULPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VMULPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VMULPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VMULPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VMULSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VMULSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VORPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VORPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VORPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VORPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VPABSB xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPABSW xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPABSD xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPACKSSWB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPACKSSDW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPACKUSWB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPACKUSDW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPADDB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPADDW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPADDD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPADDQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPADDSB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPADDSW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPADDUSB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPADDUSW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPALIGNR xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPAND xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPANDN xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPAVGB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPAVGW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPBLENDVB xmmreg,xmmreg*,xmmrm128,xmmreg AVX,SANDYBRIDGE
+VPBLENDW xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPCMPESTRI xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPCMPESTRM xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPCMPISTRI xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPCMPISTRM xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPCMPEQB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPCMPEQW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPCMPEQD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPCMPEQQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPCMPGTB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPCMPGTW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPCMPGTD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPCMPGTQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPERMILPD xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPERMILPD ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VPERMILPD xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPERMILPD ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE
+VPERMILTD2PD xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+VPERMILTD2PD xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPERMILTD2PD ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+VPERMILTD2PD ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VPERMILMO2PD xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+VPERMILMO2PD xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPERMILMO2PD ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+VPERMILMO2PD ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VPERMILMZ2PD xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+VPERMILMZ2PD xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPERMILMZ2PD ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+VPERMILMZ2PD ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VPERMIL2PD xmmreg,xmmreg,xmmrm128,xmmreg,imm8 AVX,SANDYBRIDGE
+VPERMIL2PD xmmreg,xmmreg,xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPERMIL2PD ymmreg,ymmreg,ymmrm256,ymmreg,imm8 AVX,SANDYBRIDGE
+VPERMIL2PD ymmreg,ymmreg,ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE
+VPERMILPS xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPERMILPS ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VPERMILPS xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPERMILPS ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE
+VPERMILTD2PS xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+VPERMILTD2PS xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPERMILTD2PS ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+VPERMILTD2PS ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VPERMILMO2PS xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+VPERMILMO2PS xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPERMILMO2PS ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+VPERMILMO2PS ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VPERMILMZ2PS xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+VPERMILMZ2PS xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPERMILMZ2PS ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+VPERMILMZ2PS ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VPERMIL2PS xmmreg,xmmreg,xmmrm128,xmmreg,imm8 AVX,SANDYBRIDGE
+VPERMIL2PS xmmreg,xmmreg,xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPERMIL2PS ymmreg,ymmreg,ymmrm256,ymmreg,imm8 AVX,SANDYBRIDGE
+VPERMIL2PS ymmreg,ymmreg,ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE
+VPERM2F128 ymmreg,ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE
+VPEXTRB reg64,xmmreg,imm8 AVX,SANDYBRIDGE,LONG
+VPEXTRB reg32,xmmreg,imm8 AVX,SANDYBRIDGE
+VPEXTRB mem8,xmmreg,imm8 AVX,SANDYBRIDGE
+VPEXTRW reg64,xmmreg,imm8 AVX,SANDYBRIDGE,LONG
+VPEXTRW reg32,xmmreg,imm8 AVX,SANDYBRIDGE
+VPEXTRW mem16,xmmreg,imm8 AVX,SANDYBRIDGE
+VPEXTRW reg64,xmmreg,imm8 AVX,SANDYBRIDGE,LONG
+VPEXTRW reg32,xmmreg,imm8 AVX,SANDYBRIDGE
+VPEXTRW mem16,xmmreg,imm8 AVX,SANDYBRIDGE
+VPEXTRD reg64,xmmreg,imm8 AVX,SANDYBRIDGE,LONG
+VPEXTRD rm32,xmmreg,imm8 AVX,SANDYBRIDGE
+VPEXTRQ rm64,xmmreg,imm8 AVX,SANDYBRIDGE,LONG
+VPHADDW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPHADDD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPHADDSW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPHMINPOSUW xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPHSUBW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPHSUBD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPHSUBSW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPINSRB xmmreg,xmmreg*,mem8,imm8 AVX,SANDYBRIDGE
+VPINSRB xmmreg,xmmreg*,rm8,imm8 AVX,SANDYBRIDGE
+VPINSRB xmmreg,xmmreg*,reg32,imm8 AVX,SANDYBRIDGE
+VPINSRW xmmreg,xmmreg*,mem16,imm8 AVX,SANDYBRIDGE
+VPINSRW xmmreg,xmmreg*,rm16,imm8 AVX,SANDYBRIDGE
+VPINSRW xmmreg,xmmreg*,reg32,imm8 AVX,SANDYBRIDGE
+VPINSRD xmmreg,xmmreg*,mem32,imm8 AVX,SANDYBRIDGE
+VPINSRD xmmreg,xmmreg*,rm32,imm8 AVX,SANDYBRIDGE
+VPINSRQ xmmreg,xmmreg*,mem64,imm8 AVX,SANDYBRIDGE,LONG
+VPINSRQ xmmreg,xmmreg*,rm64,imm8 AVX,SANDYBRIDGE,LONG
+VPMADDWD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMADDUBSW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMAXSB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMAXSW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMAXSD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMAXUB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMAXUW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMAXUD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMINSB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMINSW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMINSD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMINUB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMINUW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMINUD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMOVMSKB reg64,xmmreg AVX,SANDYBRIDGE,LONG
+VPMOVMSKB reg32,xmmreg AVX,SANDYBRIDGE
+VPMOVSXBW xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VPMOVSXBD xmmreg,xmmrm32 AVX,SANDYBRIDGE
+VPMOVSXBQ xmmreg,xmmrm16 AVX,SANDYBRIDGE
+VPMOVSXWD xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VPMOVSXWQ xmmreg,xmmrm32 AVX,SANDYBRIDGE
+VPMOVSXDQ xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VPMOVZXBW xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VPMOVZXBD xmmreg,xmmrm32 AVX,SANDYBRIDGE
+VPMOVZXBQ xmmreg,xmmrm16 AVX,SANDYBRIDGE
+VPMOVZXWD xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VPMOVZXWQ xmmreg,xmmrm32 AVX,SANDYBRIDGE
+VPMOVZXDQ xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VPMULHUW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMULHRSW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMULHW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMULLW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMULLD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMULUDQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPMULDQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPOR xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSADBW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSHUFB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSHUFD xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPSHUFHW xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPSHUFLW xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VPSIGNB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSIGNW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSIGND xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSLLDQ xmmreg,xmmreg*,imm8 AVX,SANDYBRIDGE
+VPSRLDQ xmmreg,xmmreg*,imm8 AVX,SANDYBRIDGE
+VPSLLW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSLLW xmmreg,xmmreg*,imm8 AVX,SANDYBRIDGE
+VPSLLD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSLLD xmmreg,xmmreg*,imm8 AVX,SANDYBRIDGE
+VPSLLQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSLLQ xmmreg,xmmreg*,imm8 AVX,SANDYBRIDGE
+VPSRAW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSRAW xmmreg,xmmreg*,imm8 AVX,SANDYBRIDGE
+VPSRAD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSRAD xmmreg,xmmreg*,imm8 AVX,SANDYBRIDGE
+VPSRLW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSRLW xmmreg,xmmreg*,imm8 AVX,SANDYBRIDGE
+VPSRLD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSRLD xmmreg,xmmreg*,imm8 AVX,SANDYBRIDGE
+VPSRLQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSRLQ xmmreg,xmmreg*,imm8 AVX,SANDYBRIDGE
+VPTEST xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VPTEST ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VPSUBB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSUBW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSUBD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSUBQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSUBSB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSUBSW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSUBUSB xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPSUBUSW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPUNPCKHBW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPUNPCKHWD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPUNPCKHDQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPUNPCKHQDQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPUNPCKLBW xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPUNPCKLWD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPUNPCKLDQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPUNPCKLQDQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPXOR xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VRCPPS xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VRCPPS ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VRCPSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VRSQRTPS xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VRSQRTPS ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VRSQRTSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VROUNDPD xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VROUNDPD ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE
+VROUNDPS xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+VROUNDPS ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE
+VROUNDSD xmmreg,xmmreg*,xmmrm64,imm8 AVX,SANDYBRIDGE
+VROUNDSS xmmreg,xmmreg*,xmmrm32,imm8 AVX,SANDYBRIDGE
+VSHUFPD xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+VSHUFPD ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+VSHUFPS xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+VSHUFPS ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+VSQRTPD xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VSQRTPD ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VSQRTPS xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VSQRTPS ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VSQRTSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VSQRTSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VSTMXCSR mem32 AVX,SANDYBRIDGE
+VSUBPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VSUBPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VSUBPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VSUBPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VSUBSD xmmreg,xmmreg*,xmmrm64 AVX,SANDYBRIDGE
+VSUBSS xmmreg,xmmreg*,xmmrm32 AVX,SANDYBRIDGE
+VTESTPS xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VTESTPS ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VTESTPD xmmreg,xmmrm128 AVX,SANDYBRIDGE
+VTESTPD ymmreg,ymmrm256 AVX,SANDYBRIDGE
+VUCOMISD xmmreg,xmmrm64 AVX,SANDYBRIDGE
+VUCOMISS xmmreg,xmmrm32 AVX,SANDYBRIDGE
+VUNPCKHPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VUNPCKHPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VUNPCKHPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VUNPCKHPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VUNPCKLPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VUNPCKLPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VUNPCKLPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VUNPCKLPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VXORPD xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VXORPD ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VXORPS xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VXORPS ymmreg,ymmreg*,ymmrm256 AVX,SANDYBRIDGE
+VZEROALL AVX,SANDYBRIDGE
+VZEROUPPER AVX,SANDYBRIDGE
+</pre>
+<h4><a name="section-B.1.26">B.1.26 Intel Carry-Less Multiplication instructions (CLMUL)</a></h4>
+<p><pre>
+PCLMULLQLQDQ xmmreg,xmmrm128 SSE,WESTMERE
+PCLMULHQLQDQ xmmreg,xmmrm128 SSE,WESTMERE
+PCLMULLQHQDQ xmmreg,xmmrm128 SSE,WESTMERE
+PCLMULHQHQDQ xmmreg,xmmrm128 SSE,WESTMERE
+PCLMULQDQ xmmreg,xmmrm128,imm8 SSE,WESTMERE
+</pre>
+<h4><a name="section-B.1.27">B.1.27 Intel AVX Carry-Less Multiplication instructions (CLMUL)</a></h4>
+<p><pre>
+VPCLMULLQLQDQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPCLMULHQLQDQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPCLMULLQHQDQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPCLMULHQHQDQ xmmreg,xmmreg*,xmmrm128 AVX,SANDYBRIDGE
+VPCLMULQDQ xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+</pre>
+<h4><a name="section-B.1.28">B.1.28 Intel Fused Multiply-Add instructions (FMA)</a></h4>
+<p><pre>
+VFMADD132PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD132PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD132PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD132PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD312PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD312PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD312PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD312PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD213PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD213PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD213PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD213PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD123PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD123PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD123PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD123PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD231PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD231PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD231PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD231PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD321PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD321PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD321PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADD321PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB132PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB132PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB132PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB132PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB312PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB312PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB312PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB312PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB213PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB213PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB213PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB213PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB123PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB123PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB123PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB123PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB231PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB231PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB231PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB231PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB321PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB321PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADDSUB321PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMADDSUB321PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB132PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB132PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB132PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB132PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB312PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB312PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB312PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB312PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB213PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB213PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB213PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB213PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB123PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB123PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB123PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB123PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB231PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB231PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB231PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB231PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB321PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB321PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUB321PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUB321PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD132PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD132PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD132PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD132PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD312PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD312PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD312PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD312PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD213PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD213PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD213PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD213PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD123PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD123PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD123PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD123PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD231PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD231PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD231PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD231PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD321PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD321PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMSUBADD321PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFMSUBADD321PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD132PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD132PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD132PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD132PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD312PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD312PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD312PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD312PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD213PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD213PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD213PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD213PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD123PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD123PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD123PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD123PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD231PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD231PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD231PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD231PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD321PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD321PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMADD321PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMADD321PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB132PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB132PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB132PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB132PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB312PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB312PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB312PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB312PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB213PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB213PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB213PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB213PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB123PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB123PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB123PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB123PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB231PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB231PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB231PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB231PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB321PS xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB321PS ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFNMSUB321PD xmmreg,xmmreg,xmmrm128 FMA,FUTURE
+VFNMSUB321PD ymmreg,ymmreg,ymmrm256 FMA,FUTURE
+VFMADD132SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMADD132SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFMADD312SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMADD312SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFMADD213SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMADD213SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFMADD123SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMADD123SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFMADD231SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMADD231SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFMADD321SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMADD321SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFMSUB132SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMSUB132SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFMSUB312SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMSUB312SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFMSUB213SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMSUB213SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFMSUB123SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMSUB123SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFMSUB231SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMSUB231SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFMSUB321SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFMSUB321SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMADD132SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMADD132SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMADD312SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMADD312SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMADD213SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMADD213SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMADD123SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMADD123SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMADD231SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMADD231SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMADD321SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMADD321SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMSUB132SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMSUB132SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMSUB312SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMSUB312SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMSUB213SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMSUB213SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMSUB123SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMSUB123SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMSUB231SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMSUB231SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+VFNMSUB321SS xmmreg,xmmreg,xmmrm32 FMA,FUTURE
+VFNMSUB321SD xmmreg,xmmreg,xmmrm64 FMA,FUTURE
+</pre>
+<h4><a name="section-B.1.29">B.1.29 VIA (Centaur) security instructions</a></h4>
+<p><pre>
+XSTORE PENT,CYRIX
+XCRYPTECB PENT,CYRIX
+XCRYPTCBC PENT,CYRIX
+XCRYPTCTR PENT,CYRIX
+XCRYPTCFB PENT,CYRIX
+XCRYPTOFB PENT,CYRIX
+MONTMUL PENT,CYRIX
+XSHA1 PENT,CYRIX
+XSHA256 PENT,CYRIX
+</pre>
+<h4><a name="section-B.1.30">B.1.30 AMD Lightweight Profiling (LWP) instructions</a></h4>
+<p><pre>
+LLWPCB reg16 AMD
+LLWPCB reg32 AMD,386
+LLWPCB reg64 AMD,X64
+SLWPCB reg16 AMD
+SLWPCB reg32 AMD,386
+SLWPCB reg64 AMD,X64
+LWPVAL reg16,rm32,imm16 AMD,386
+LWPVAL reg32,rm32,imm32 AMD,386
+LWPVAL reg64,rm32,imm32 AMD,X64
+LWPINS reg16,rm32,imm16 AMD,386
+LWPINS reg32,rm32,imm32 AMD,386
+LWPINS reg64,rm32,imm32 AMD,X64
+</pre>
+<h4><a name="section-B.1.31">B.1.31 AMD XOP, FMA4 and CVT16 instructions (SSE5)</a></h4>
+<p><pre>
+VCVTPH2PS xmmreg,xmmrm64*,imm8 AMD,SSE5
+VCVTPH2PS ymmreg,xmmrm128,imm8 AMD,SSE5
+VCVTPH2PS ymmreg,ymmrm128*,imm8 AMD,SSE5
+VCVTPS2PH xmmrm64,xmmreg*,imm8 AMD,SSE5
+VCVTPS2PH xmmrm128,ymmreg,imm8 AMD,SSE5
+VCVTPS2PH ymmrm128,ymmreg*,imm8 AMD,SSE5
+VFMADDPD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFMADDPD ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFMADDPD xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFMADDPD ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFMADDPS xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFMADDPS ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFMADDPS xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFMADDPS ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFMADDSD xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5
+VFMADDSD xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5
+VFMADDSS xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5
+VFMADDSS xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5
+VFMADDSUBPD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFMADDSUBPD ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFMADDSUBPD xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFMADDSUBPD ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFMADDSUBPS xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFMADDSUBPS ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFMADDSUBPS xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFMADDSUBPS ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFMSUBADDPD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFMSUBADDPD ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFMSUBADDPD xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFMSUBADDPD ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFMSUBADDPS xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFMSUBADDPS ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFMSUBADDPS xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFMSUBADDPS ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFMSUBPD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFMSUBPD ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFMSUBPD xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFMSUBPD ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFMSUBPS xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFMSUBPS ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFMSUBPS xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFMSUBPS ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFMSUBSD xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5
+VFMSUBSD xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5
+VFMSUBSS xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5
+VFMSUBSS xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5
+VFNMADDPD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFNMADDPD ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFNMADDPD xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFNMADDPD ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFNMADDPS xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFNMADDPS ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFNMADDPS xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFNMADDPS ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFNMADDSD xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5
+VFNMADDSD xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5
+VFNMADDSS xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5
+VFNMADDSS xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5
+VFNMSUBPD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFNMSUBPD ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFNMSUBPD xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFNMSUBPD ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFNMSUBPS xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VFNMSUBPS ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VFNMSUBPS xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VFNMSUBPS ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VFNMSUBSD xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5
+VFNMSUBSD xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5
+VFNMSUBSS xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5
+VFNMSUBSS xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5
+VFRCZPD xmmreg,xmmrm128* AMD,SSE5
+VFRCZPD ymmreg,ymmrm256* AMD,SSE5
+VFRCZPS xmmreg,xmmrm128* AMD,SSE5
+VFRCZPS ymmreg,ymmrm256* AMD,SSE5
+VFRCZSD xmmreg,xmmrm64* AMD,SSE5
+VFRCZSS xmmreg,xmmrm32* AMD,SSE5
+VPCMOV xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPCMOV ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+VPCMOV xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VPCMOV ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+VPCOMB xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+VPCOMD xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+VPCOMQ xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+VPCOMUB xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+VPCOMUD xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+VPCOMUQ xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+VPCOMUW xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+VPCOMW xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+VPHADDBD xmmreg,xmmrm128* AMD,SSE5
+VPHADDBQ xmmreg,xmmrm128* AMD,SSE5
+VPHADDBW xmmreg,xmmrm128* AMD,SSE5
+VPHADDDQ xmmreg,xmmrm128* AMD,SSE5
+VPHADDUBD xmmreg,xmmrm128* AMD,SSE5
+VPHADDUBQ xmmreg,xmmrm128* AMD,SSE5
+VPHADDUBW xmmreg,xmmrm128* AMD,SSE5
+VPHADDUDQ xmmreg,xmmrm128* AMD,SSE5
+VPHADDUWD xmmreg,xmmrm128* AMD,SSE5
+VPHADDUWQ xmmreg,xmmrm128* AMD,SSE5
+VPHADDWD xmmreg,xmmrm128* AMD,SSE5
+VPHADDWQ xmmreg,xmmrm128* AMD,SSE5
+VPHSUBBW xmmreg,xmmrm128* AMD,SSE5
+VPHSUBDQ xmmreg,xmmrm128* AMD,SSE5
+VPHSUBWD xmmreg,xmmrm128* AMD,SSE5
+VPMACSDD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPMACSDQH xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPMACSDQL xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPMACSSDD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPMACSSDQH xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPMACSSDQL xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPMACSSWD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPMACSSWW xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPMACSWD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPMACSWW xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPMADCSSWD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPMADCSWD xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPPERM xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+VPPERM xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+VPROTB xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPROTB xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+VPROTB xmmreg,xmmrm128*,imm8 AMD,SSE5
+VPROTD xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPROTD xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+VPROTD xmmreg,xmmrm128*,imm8 AMD,SSE5
+VPROTQ xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPROTQ xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+VPROTQ xmmreg,xmmrm128*,imm8 AMD,SSE5
+VPROTW xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPROTW xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+VPROTW xmmreg,xmmrm128*,imm8 AMD,SSE5
+VPSHAB xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPSHAB xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+VPSHAD xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPSHAD xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+VPSHAQ xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPSHAQ xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+VPSHAW xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPSHAW xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+VPSHLB xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPSHLB xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+VPSHLD xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPSHLD xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+VPSHLQ xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPSHLQ xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+VPSHLW xmmreg,xmmrm128*,xmmreg AMD,SSE5
+VPSHLW xmmreg,xmmreg*,xmmrm128 AMD,SSE5
+</pre>
+<h4><a name="section-B.1.32">B.1.32 Systematic names for the hinting nop instructions</a></h4>
+<p><pre>
+HINT_NOP0 rm16 P6,UNDOC
+HINT_NOP0 rm32 P6,UNDOC
+HINT_NOP0 rm64 X64,UNDOC
+HINT_NOP1 rm16 P6,UNDOC
+HINT_NOP1 rm32 P6,UNDOC
+HINT_NOP1 rm64 X64,UNDOC
+HINT_NOP2 rm16 P6,UNDOC
+HINT_NOP2 rm32 P6,UNDOC
+HINT_NOP2 rm64 X64,UNDOC
+HINT_NOP3 rm16 P6,UNDOC
+HINT_NOP3 rm32 P6,UNDOC
+HINT_NOP3 rm64 X64,UNDOC
+HINT_NOP4 rm16 P6,UNDOC
+HINT_NOP4 rm32 P6,UNDOC
+HINT_NOP4 rm64 X64,UNDOC
+HINT_NOP5 rm16 P6,UNDOC
+HINT_NOP5 rm32 P6,UNDOC
+HINT_NOP5 rm64 X64,UNDOC
+HINT_NOP6 rm16 P6,UNDOC
+HINT_NOP6 rm32 P6,UNDOC
+HINT_NOP6 rm64 X64,UNDOC
+HINT_NOP7 rm16 P6,UNDOC
+HINT_NOP7 rm32 P6,UNDOC
+HINT_NOP7 rm64 X64,UNDOC
+HINT_NOP8 rm16 P6,UNDOC
+HINT_NOP8 rm32 P6,UNDOC
+HINT_NOP8 rm64 X64,UNDOC
+HINT_NOP9 rm16 P6,UNDOC
+HINT_NOP9 rm32 P6,UNDOC
+HINT_NOP9 rm64 X64,UNDOC
+HINT_NOP10 rm16 P6,UNDOC
+HINT_NOP10 rm32 P6,UNDOC
+HINT_NOP10 rm64 X64,UNDOC
+HINT_NOP11 rm16 P6,UNDOC
+HINT_NOP11 rm32 P6,UNDOC
+HINT_NOP11 rm64 X64,UNDOC
+HINT_NOP12 rm16 P6,UNDOC
+HINT_NOP12 rm32 P6,UNDOC
+HINT_NOP12 rm64 X64,UNDOC
+HINT_NOP13 rm16 P6,UNDOC
+HINT_NOP13 rm32 P6,UNDOC
+HINT_NOP13 rm64 X64,UNDOC
+HINT_NOP14 rm16 P6,UNDOC
+HINT_NOP14 rm32 P6,UNDOC
+HINT_NOP14 rm64 X64,UNDOC
+HINT_NOP15 rm16 P6,UNDOC
+HINT_NOP15 rm32 P6,UNDOC
+HINT_NOP15 rm64 X64,UNDOC
+HINT_NOP16 rm16 P6,UNDOC
+HINT_NOP16 rm32 P6,UNDOC
+HINT_NOP16 rm64 X64,UNDOC
+HINT_NOP17 rm16 P6,UNDOC
+HINT_NOP17 rm32 P6,UNDOC
+HINT_NOP17 rm64 X64,UNDOC
+HINT_NOP18 rm16 P6,UNDOC
+HINT_NOP18 rm32 P6,UNDOC
+HINT_NOP18 rm64 X64,UNDOC
+HINT_NOP19 rm16 P6,UNDOC
+HINT_NOP19 rm32 P6,UNDOC
+HINT_NOP19 rm64 X64,UNDOC
+HINT_NOP20 rm16 P6,UNDOC
+HINT_NOP20 rm32 P6,UNDOC
+HINT_NOP20 rm64 X64,UNDOC
+HINT_NOP21 rm16 P6,UNDOC
+HINT_NOP21 rm32 P6,UNDOC
+HINT_NOP21 rm64 X64,UNDOC
+HINT_NOP22 rm16 P6,UNDOC
+HINT_NOP22 rm32 P6,UNDOC
+HINT_NOP22 rm64 X64,UNDOC
+HINT_NOP23 rm16 P6,UNDOC
+HINT_NOP23 rm32 P6,UNDOC
+HINT_NOP23 rm64 X64,UNDOC
+HINT_NOP24 rm16 P6,UNDOC
+HINT_NOP24 rm32 P6,UNDOC
+HINT_NOP24 rm64 X64,UNDOC
+HINT_NOP25 rm16 P6,UNDOC
+HINT_NOP25 rm32 P6,UNDOC
+HINT_NOP25 rm64 X64,UNDOC
+HINT_NOP26 rm16 P6,UNDOC
+HINT_NOP26 rm32 P6,UNDOC
+HINT_NOP26 rm64 X64,UNDOC
+HINT_NOP27 rm16 P6,UNDOC
+HINT_NOP27 rm32 P6,UNDOC
+HINT_NOP27 rm64 X64,UNDOC
+HINT_NOP28 rm16 P6,UNDOC
+HINT_NOP28 rm32 P6,UNDOC
+HINT_NOP28 rm64 X64,UNDOC
+HINT_NOP29 rm16 P6,UNDOC
+HINT_NOP29 rm32 P6,UNDOC
+HINT_NOP29 rm64 X64,UNDOC
+HINT_NOP30 rm16 P6,UNDOC
+HINT_NOP30 rm32 P6,UNDOC
+HINT_NOP30 rm64 X64,UNDOC
+HINT_NOP31 rm16 P6,UNDOC
+HINT_NOP31 rm32 P6,UNDOC
+HINT_NOP31 rm64 X64,UNDOC
+HINT_NOP32 rm16 P6,UNDOC
+HINT_NOP32 rm32 P6,UNDOC
+HINT_NOP32 rm64 X64,UNDOC
+HINT_NOP33 rm16 P6,UNDOC
+HINT_NOP33 rm32 P6,UNDOC
+HINT_NOP33 rm64 X64,UNDOC
+HINT_NOP34 rm16 P6,UNDOC
+HINT_NOP34 rm32 P6,UNDOC
+HINT_NOP34 rm64 X64,UNDOC
+HINT_NOP35 rm16 P6,UNDOC
+HINT_NOP35 rm32 P6,UNDOC
+HINT_NOP35 rm64 X64,UNDOC
+HINT_NOP36 rm16 P6,UNDOC
+HINT_NOP36 rm32 P6,UNDOC
+HINT_NOP36 rm64 X64,UNDOC
+HINT_NOP37 rm16 P6,UNDOC
+HINT_NOP37 rm32 P6,UNDOC
+HINT_NOP37 rm64 X64,UNDOC
+HINT_NOP38 rm16 P6,UNDOC
+HINT_NOP38 rm32 P6,UNDOC
+HINT_NOP38 rm64 X64,UNDOC
+HINT_NOP39 rm16 P6,UNDOC
+HINT_NOP39 rm32 P6,UNDOC
+HINT_NOP39 rm64 X64,UNDOC
+HINT_NOP40 rm16 P6,UNDOC
+HINT_NOP40 rm32 P6,UNDOC
+HINT_NOP40 rm64 X64,UNDOC
+HINT_NOP41 rm16 P6,UNDOC
+HINT_NOP41 rm32 P6,UNDOC
+HINT_NOP41 rm64 X64,UNDOC
+HINT_NOP42 rm16 P6,UNDOC
+HINT_NOP42 rm32 P6,UNDOC
+HINT_NOP42 rm64 X64,UNDOC
+HINT_NOP43 rm16 P6,UNDOC
+HINT_NOP43 rm32 P6,UNDOC
+HINT_NOP43 rm64 X64,UNDOC
+HINT_NOP44 rm16 P6,UNDOC
+HINT_NOP44 rm32 P6,UNDOC
+HINT_NOP44 rm64 X64,UNDOC
+HINT_NOP45 rm16 P6,UNDOC
+HINT_NOP45 rm32 P6,UNDOC
+HINT_NOP45 rm64 X64,UNDOC
+HINT_NOP46 rm16 P6,UNDOC
+HINT_NOP46 rm32 P6,UNDOC
+HINT_NOP46 rm64 X64,UNDOC
+HINT_NOP47 rm16 P6,UNDOC
+HINT_NOP47 rm32 P6,UNDOC
+HINT_NOP47 rm64 X64,UNDOC
+HINT_NOP48 rm16 P6,UNDOC
+HINT_NOP48 rm32 P6,UNDOC
+HINT_NOP48 rm64 X64,UNDOC
+HINT_NOP49 rm16 P6,UNDOC
+HINT_NOP49 rm32 P6,UNDOC
+HINT_NOP49 rm64 X64,UNDOC
+HINT_NOP50 rm16 P6,UNDOC
+HINT_NOP50 rm32 P6,UNDOC
+HINT_NOP50 rm64 X64,UNDOC
+HINT_NOP51 rm16 P6,UNDOC
+HINT_NOP51 rm32 P6,UNDOC
+HINT_NOP51 rm64 X64,UNDOC
+HINT_NOP52 rm16 P6,UNDOC
+HINT_NOP52 rm32 P6,UNDOC
+HINT_NOP52 rm64 X64,UNDOC
+HINT_NOP53 rm16 P6,UNDOC
+HINT_NOP53 rm32 P6,UNDOC
+HINT_NOP53 rm64 X64,UNDOC
+HINT_NOP54 rm16 P6,UNDOC
+HINT_NOP54 rm32 P6,UNDOC
+HINT_NOP54 rm64 X64,UNDOC
+HINT_NOP55 rm16 P6,UNDOC
+HINT_NOP55 rm32 P6,UNDOC
+HINT_NOP55 rm64 X64,UNDOC
+HINT_NOP56 rm16 P6,UNDOC
+HINT_NOP56 rm32 P6,UNDOC
+HINT_NOP56 rm64 X64,UNDOC
+HINT_NOP57 rm16 P6,UNDOC
+HINT_NOP57 rm32 P6,UNDOC
+HINT_NOP57 rm64 X64,UNDOC
+HINT_NOP58 rm16 P6,UNDOC
+HINT_NOP58 rm32 P6,UNDOC
+HINT_NOP58 rm64 X64,UNDOC
+HINT_NOP59 rm16 P6,UNDOC
+HINT_NOP59 rm32 P6,UNDOC
+HINT_NOP59 rm64 X64,UNDOC
+HINT_NOP60 rm16 P6,UNDOC
+HINT_NOP60 rm32 P6,UNDOC
+HINT_NOP60 rm64 X64,UNDOC
+HINT_NOP61 rm16 P6,UNDOC
+HINT_NOP61 rm32 P6,UNDOC
+HINT_NOP61 rm64 X64,UNDOC
+HINT_NOP62 rm16 P6,UNDOC
+HINT_NOP62 rm32 P6,UNDOC
+HINT_NOP62 rm64 X64,UNDOC
+HINT_NOP63 rm16 P6,UNDOC
+HINT_NOP63 rm32 P6,UNDOC
+HINT_NOP63 rm64 X64,UNDOC
+</pre>
+<p align=center><a href="nasmdocc.html">Next Chapter</a> |
+<a href="nasmdoca.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdocc.html b/doc/html/nasmdocc.html
new file mode 100644
index 0000000..b7ec3b2
--- /dev/null
+++ b/doc/html/nasmdocc.html
@@ -0,0 +1,1468 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdocb.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+<h2><a name="appendix-C">Appendix C: NASM Version History</a></h2>
+<h3><a name="section-C.1">C.1 NASM 2 Series</a></h3>
+<p>The NASM 2 series support x86-64, and is the production version of NASM
+since 2007.
+<h4><a name="section-C.1.1">C.1.1 Version 2.08</a></h4>
+<ul>
+<li>A number of enhancements/fixes in macros area.
+<li>Support for arbitrarily terminating macro expansions
+<code><nobr>%exitmacro</nobr></code>. See
+<a href="nasmdoc4.html#section-4.3.12">section 4.3.12</a>.
+<li>Support for recursive macro expansion
+<code><nobr>%rmacro/irmacro</nobr></code>. See
+<a href="nasmdoc4.html#section-4.3.1">section 4.3.1</a>.
+<li>Support for converting strings to tokens. See
+<a href="nasmdoc4.html#section-4.1.9">section 4.1.9</a>.
+<li>Fuzzy operand size logic introduced.
+<li>Fix COFF stack overrun on too long export identifiers.
+<li>Fix Macho-O alignment bug.
+<li>Fix crashes with -fwin32 on file with many exports.
+<li>Fix stack overrun for too long [DEBUG id].
+<li>Fix incorrect sbyte usage in IMUL (hit only if optimization flag
+passed).
+<li>Append ending token for <code><nobr>.stabs</nobr></code> records in the
+ELF output format.
+<li>New NSIS script which uses ModernUI and MultiUser approach.
+<li>Visual Studio 2008 NASM integration (rules file).
+<li>Warn a user if a constant is too long (and as result will be stripped).
+<li>The obsoleted pre-XOP AMD SSE5 instruction set which was never
+actualized was removed.
+<li>Fix stack overrun on too long error file name passed from the command
+line.
+<li>Bind symbols to the .text section by default (ie in case if SECTION
+directive was omitted) in the ELF output format.
+<li>Fix sync points array index wrapping.
+<li>A few fixes for FMA4 and XOP instruction templates.
+<li>Add AMD Lightweight Profiling (LWP) instructions.
+</ul>
+<h4><a name="section-C.1.2">C.1.2 Version 2.07</a></h4>
+<ul>
+<li>NASM is now under the 2-clause BSD license. See
+<a href="nasmdoc1.html#section-1.1.2">section 1.1.2</a>.
+<li>Fix the section type for the <code><nobr>.strtab</nobr></code> section
+in the <code><nobr>elf64</nobr></code> output format.
+<li>Fix the handling of <code><nobr>COMMON</nobr></code> directives in the
+<code><nobr>obj</nobr></code> output format.
+<li>New <code><nobr>ith</nobr></code> and <code><nobr>srec</nobr></code>
+output formats; these are variants of the <code><nobr>bin</nobr></code>
+output format which output Intel hex and Motorola S-records, respectively.
+See <a href="nasmdoc7.html#section-7.2">section 7.2</a> and
+<a href="nasmdoc7.html#section-7.3">section 7.3</a>.
+<li><code><nobr>rdf2ihx</nobr></code> replaced with an enhanced
+<code><nobr>rdf2bin</nobr></code>, which can output binary, COM, Intel hex
+or Motorola S-records.
+<li>The Windows installer now puts the NASM directory first in the
+<code><nobr>PATH</nobr></code> of the "NASM Shell".
+<li>Revert the early expansion behavior of <code><nobr>%+</nobr></code> to
+pre-2.06 behavior: <code><nobr>%+</nobr></code> is only expanded late.
+<li>Yet another Mach-O alignment fix.
+<li>Don't delete the list file on errors. Also, include error and warning
+information in the list file.
+<li>Support for 64-bit Mach-O output, see
+<a href="nasmdoc7.html#section-7.8">section 7.8</a>.
+<li>Fix assert failure on certain operations that involve strings with
+high-bit bytes.
+</ul>
+<h4><a name="section-C.1.3">C.1.3 Version 2.06</a></h4>
+<ul>
+<li>This release is dedicated to the memory of Charles A. Crayne, long time
+NASM developer as well as moderator of
+<code><nobr>comp.lang.asm.x86</nobr></code> and author of the book
+<em>Serious Assembler</em>. We miss you, Chuck.
+<li>Support for indirect macro expansion
+(<code><nobr>%[...]</nobr></code>). See
+<a href="nasmdoc4.html#section-4.1.3">section 4.1.3</a>.
+<li><code><nobr>%pop</nobr></code> can now take an argument, see
+<a href="nasmdoc4.html#section-4.7.1">section 4.7.1</a>.
+<li>The argument to <code><nobr>%use</nobr></code> is no longer
+macro-expanded. Use <code><nobr>%[...]</nobr></code> if macro expansion is
+desired.
+<li>Support for thread-local storage in ELF32 and ELF64. See
+<a href="nasmdoc7.html#section-7.9.4">section 7.9.4</a>.
+<li>Fix crash on <code><nobr>%ifmacro</nobr></code> without an argument.
+<li>Correct the arguments to the <code><nobr>POPCNT</nobr></code>
+instruction.
+<li>Fix section alignment in the Mach-O format.
+<li>Update AVX support to version 5 of the Intel specification.
+<li>Fix the handling of accesses to context-local macros from higher levels
+in the context stack.
+<li>Treat <code><nobr>WAIT</nobr></code> as a prefix rather than as an
+instruction, thereby allowing constructs like
+<code><nobr>O16 FSAVE</nobr></code> to work correctly.
+<li>Support for structures with a non-zero base offset. See
+<a href="nasmdoc4.html#section-4.11.10">section 4.11.10</a>.
+<li>Correctly handle preprocessor token concatenation (see
+<a href="nasmdoc4.html#section-4.3.8">section 4.3.8</a>) involving
+floating-point numbers.
+<li>The <code><nobr>PINSR</nobr></code> series of instructions have been
+corrected and rationalized.
+<li>Removed AMD SSE5, replaced with the new XOP/FMA4/CVT16 (rev 3.03) spec.
+<li>The ELF backends no longer automatically generate a
+<code><nobr>.comment</nobr></code> section.
+<li>Add additional "well-known" ELF sections with default attributes. See
+<a href="nasmdoc7.html#section-7.9.2">section 7.9.2</a>.
+</ul>
+<h4><a name="section-C.1.4">C.1.4 Version 2.05.01</a></h4>
+<ul>
+<li>Fix the <code><nobr>-w</nobr></code>/<code><nobr>-W</nobr></code>
+option parsing, which was broken in NASM 2.05.
+</ul>
+<h4><a name="section-C.1.5">C.1.5 Version 2.05</a></h4>
+<ul>
+<li>Fix redundant REX.W prefix on <code><nobr>JMP reg64</nobr></code>.
+<li>Make the behaviour of <code><nobr>-O0</nobr></code> match NASM 0.98
+legacy behavior. See <a href="nasmdoc2.html#section-2.1.22">section
+2.1.22</a>.
+<li><code><nobr>-w-user</nobr></code> can be used to suppress the output of
+<code><nobr>%warning</nobr></code> directives. See
+<a href="nasmdoc2.html#section-2.1.24">section 2.1.24</a>.
+<li>Fix bug where <code><nobr>ALIGN</nobr></code> would issue a full
+alignment datum instead of zero bytes.
+<li>Fix offsets in list files.
+<li>Fix <code><nobr>%include</nobr></code> inside multi-line macros or
+loops.
+<li>Fix error where NASM would generate a spurious warning on valid
+optimizations of immediate values.
+<li>Fix arguments to a number of the <code><nobr>CVT</nobr></code> SSE
+instructions.
+<li>Fix RIP-relative offsets when the instruction carries an immediate.
+<li>Massive overhaul of the ELF64 backend for spec compliance.
+<li>Fix the Geode <code><nobr>PFRCPV</nobr></code> and
+<code><nobr>PFRSQRTV</nobr></code> instruction.
+<li>Fix the SSE 4.2 <code><nobr>CRC32</nobr></code> instruction.
+</ul>
+<h4><a name="section-C.1.6">C.1.6 Version 2.04</a></h4>
+<ul>
+<li>Sanitize macro handing in the <code><nobr>%error</nobr></code>
+directive.
+<li>New <code><nobr>%warning</nobr></code> directive to issue
+user-controlled warnings.
+<li><code><nobr>%error</nobr></code> directives are now deferred to the
+final assembly phase.
+<li>New <code><nobr>%fatal</nobr></code> directive to immediately terminate
+assembly.
+<li>New <code><nobr>%strcat</nobr></code> directive to join quoted strings
+together.
+<li>New <code><nobr>%use</nobr></code> macro directive to support standard
+macro directives. See <a href="nasmdoc4.html#section-4.6.4">section
+4.6.4</a>.
+<li>Excess default parameters to <code><nobr>%macro</nobr></code> now
+issues a warning by default. See
+<a href="nasmdoc4.html#section-4.3">section 4.3</a>.
+<li>Fix <code><nobr>%ifn</nobr></code> and
+<code><nobr>%elifn</nobr></code>.
+<li>Fix nested <code><nobr>%else</nobr></code> clauses.
+<li>Correct the handling of nested <code><nobr>%rep</nobr></code>s.
+<li>New <code><nobr>%unmacro</nobr></code> directive to undeclare a
+multi-line macro. See <a href="nasmdoc4.html#section-4.3.11">section
+4.3.11</a>.
+<li>Builtin macro <code><nobr>__PASS__</nobr></code> which expands to the
+current assembly pass. See <a href="nasmdoc4.html#section-4.11.9">section
+4.11.9</a>.
+<li><code><nobr>__utf16__</nobr></code> and
+<code><nobr>__utf32__</nobr></code> operators to generate UTF-16 and UTF-32
+strings. See <a href="nasmdoc3.html#section-3.4.5">section 3.4.5</a>.
+<li>Fix bug in case-insensitive matching when compiled on platforms that
+don't use the <code><nobr>configure</nobr></code> script. Of the official
+release binaries, that only affected the OS/2 binary.
+<li>Support for x87 packed BCD constants. See
+<a href="nasmdoc3.html#section-3.4.7">section 3.4.7</a>.
+<li>Correct the <code><nobr>LTR</nobr></code> and
+<code><nobr>SLDT</nobr></code> instructions in 64-bit mode.
+<li>Fix unnecessary REX.W prefix on indirect jumps in 64-bit mode.
+<li>Add AVX versions of the AES instructions
+(<code><nobr>VAES</nobr></code>...).
+<li>Fix the 256-bit FMA instructions.
+<li>Add 256-bit AVX stores per the latest AVX spec.
+<li>VIA XCRYPT instructions can now be written either with or without
+<code><nobr>REP</nobr></code>, apparently different versions of the VIA
+spec wrote them differently.
+<li>Add missing 64-bit <code><nobr>MOVNTI</nobr></code> instruction.
+<li>Fix the operand size of <code><nobr>VMREAD</nobr></code> and
+<code><nobr>VMWRITE</nobr></code>.
+<li>Numerous bug fixes, especially to the AES, AVX and VTX instructions.
+<li>The optimizer now always runs until it converges. It also runs even
+when disabled, but doesn't optimize. This allows most forward references to
+be resolved properly.
+<li><code><nobr>%push</nobr></code> no longer needs a context identifier;
+omitting the context identifier results in an anonymous context.
+</ul>
+<h4><a name="section-C.1.7">C.1.7 Version 2.03.01</a></h4>
+<ul>
+<li>Fix buffer overflow in the listing module.
+<li>Fix the handling of hexadecimal escape codes in `...` strings.
+<li>The Postscript/PDF documentation has been reformatted.
+<li>The <code><nobr>-F</nobr></code> option now implies
+<code><nobr>-g</nobr></code>.
+</ul>
+<h4><a name="section-C.1.8">C.1.8 Version 2.03</a></h4>
+<ul>
+<li>Add support for Intel AVX, CLMUL and FMA instructions, including YMM
+registers.
+<li><code><nobr>dy</nobr></code>, <code><nobr>resy</nobr></code> and
+<code><nobr>yword</nobr></code> for 32-byte operands.
+<li>Fix some SSE5 instructions.
+<li>Intel <code><nobr>INVEPT</nobr></code>,
+<code><nobr>INVVPID</nobr></code> and <code><nobr>MOVBE</nobr></code>
+instructions.
+<li>Fix checking for critical expressions when the optimizer is enabled.
+<li>Support the DWARF debugging format for ELF targets.
+<li>Fix optimizations of signed bytes.
+<li>Fix operation on bigendian machines.
+<li>Fix buffer overflow in the preprocessor.
+<li><code><nobr>SAFESEH</nobr></code> support for Win32,
+<code><nobr>IMAGEREL</nobr></code> for Win64 (SEH).
+<li><code><nobr>%?</nobr></code> and <code><nobr>%??</nobr></code> to refer
+to the name of a macro itself. In particular,
+<code><nobr>%idefine keyword $%?</nobr></code> can be used to make a
+keyword "disappear".
+<li>New options for dependency generation: <code><nobr>-MD</nobr></code>,
+<code><nobr>-MF</nobr></code>, <code><nobr>-MP</nobr></code>,
+<code><nobr>-MT</nobr></code>, <code><nobr>-MQ</nobr></code>.
+<li>New preprocessor directives <code><nobr>%pathsearch</nobr></code> and
+<code><nobr>%depend</nobr></code>; INCBIN reimplemented as a macro.
+<li><code><nobr>%include</nobr></code> now resolves macros in a sane
+manner.
+<li><code><nobr>%substr</nobr></code> can now be used to get other than
+one-character substrings.
+<li>New type of character/string constants, using backquotes
+(<code><nobr>`...`</nobr></code>), which support C-style escape sequences.
+<li><code><nobr>%defstr</nobr></code> and
+<code><nobr>%idefstr</nobr></code> to stringize macro definitions before
+creation.
+<li>Fix forward references used in <code><nobr>EQU</nobr></code>
+statements.
+</ul>
+<h4><a name="section-C.1.9">C.1.9 Version 2.02</a></h4>
+<ul>
+<li>Additional fixes for MMX operands with explicit
+<code><nobr>qword</nobr></code>, as well as (hopefully) SSE operands with
+<code><nobr>oword</nobr></code>.
+<li>Fix handling of truncated strings with <code><nobr>DO</nobr></code>.
+<li>Fix segfaults due to memory overwrites when floating-point constants
+were used.
+<li>Fix segfaults due to missing include files.
+<li>Fix OpenWatcom Makefiles for DOS and OS/2.
+<li>Add autogenerated instruction list back into the documentation.
+<li>ELF: Fix segfault when generating stabs, and no symbols have been
+defined.
+<li>ELF: Experimental support for DWARF debugging information.
+<li>New compile date and time standard macros.
+<li><code><nobr>%ifnum</nobr></code> now returns true for negative numbers.
+<li>New <code><nobr>%iftoken</nobr></code> test for a single token.
+<li>New <code><nobr>%ifempty</nobr></code> test for empty expansion.
+<li>Add support for the <code><nobr>XSAVE</nobr></code> instruction group.
+<li>Makefile for Netware/gcc.
+<li>Fix issue with some warnings getting emitted way too many times.
+<li>Autogenerated instruction list added to the documentation.
+</ul>
+<h4><a name="section-C.1.10">C.1.10 Version 2.01</a></h4>
+<ul>
+<li>Fix the handling of MMX registers with explicit
+<code><nobr>qword</nobr></code> tags on memory (broken in 2.00 due to
+64-bit changes.)
+<li>Fix the PREFETCH instructions.
+<li>Fix the documentation.
+<li>Fix debugging info when using <code><nobr>-f elf</nobr></code>
+(backwards compatibility alias for <code><nobr>-f elf32</nobr></code>).
+<li>Man pages for rdoff tools (from the Debian project.)
+<li>ELF: handle large numbers of sections.
+<li>Fix corrupt output when the optimizer runs out of passes.
+</ul>
+<h4><a name="section-C.1.11">C.1.11 Version 2.00</a></h4>
+<ul>
+<li>Added c99 data-type compliance.
+<li>Added general x86-64 support.
+<li>Added win64 (x86-64 COFF) output format.
+<li>Added <code><nobr>__BITS__</nobr></code> standard macro.
+<li>Renamed the <code><nobr>elf</nobr></code> output format to
+<code><nobr>elf32</nobr></code> for clarity.
+<li>Added <code><nobr>elf64</nobr></code> and
+<code><nobr>macho</nobr></code> (MacOS X) output formats.
+<li>Added Numeric constants in <code><nobr>dq</nobr></code> directive.
+<li>Added <code><nobr>oword</nobr></code>, <code><nobr>do</nobr></code> and
+<code><nobr>reso</nobr></code> pseudo operands.
+<li>Allow underscores in numbers.
+<li>Added 8-, 16- and 128-bit floating-point formats.
+<li>Added binary, octal and hexadecimal floating-point.
+<li>Correct the generation of floating-point constants.
+<li>Added floating-point option control.
+<li>Added Infinity and NaN floating point support.
+<li>Added ELF Symbol Visibility support.
+<li>Added setting OSABI value in ELF header directive.
+<li>Added Generate Makefile Dependencies option.
+<li>Added Unlimited Optimization Passes option.
+<li>Added <code><nobr>%IFN</nobr></code> and
+<code><nobr>%ELIFN</nobr></code> support.
+<li>Added Logical Negation Operator.
+<li>Enhanced Stack Relative Preprocessor Directives.
+<li>Enhanced ELF Debug Formats.
+<li>Enhanced Send Errors to a File option.
+<li>Added SSSE3, SSE4.1, SSE4.2, SSE5 support.
+<li>Added a large number of additional instructions.
+<li>Significant performance improvements.
+<li><code><nobr>-w+warning</nobr></code> and
+<code><nobr>-w-warning</nobr></code> can now be written as -Wwarning and
+-Wno-warning, respectively. See
+<a href="nasmdoc2.html#section-2.1.24">section 2.1.24</a>.
+<li>Add <code><nobr>-w+error</nobr></code> to treat warnings as errors. See
+<a href="nasmdoc2.html#section-2.1.24">section 2.1.24</a>.
+<li>Add <code><nobr>-w+all</nobr></code> and
+<code><nobr>-w-all</nobr></code> to enable or disable all suppressible
+warnings. See <a href="nasmdoc2.html#section-2.1.24">section 2.1.24</a>.
+</ul>
+<h3><a name="section-C.2">C.2 NASM 0.98 Series</a></h3>
+<p>The 0.98 series was the production versions of NASM from 1999 to 2007.
+<h4><a name="section-C.2.1">C.2.1 Version 0.98.39</a></h4>
+<ul>
+<li>fix buffer overflow
+<li>fix outas86's <code><nobr>.bss</nobr></code> handling
+<li>"make spotless" no longer deletes config.h.in.
+<li><code><nobr>%(el)if(n)idn</nobr></code> insensitivity to string quotes
+difference (#809300).
+<li>(nasm.c)<code><nobr>__OUTPUT_FORMAT__</nobr></code> changed to string
+value instead of symbol.
+</ul>
+<h4><a name="section-C.2.2">C.2.2 Version 0.98.38</a></h4>
+<ul>
+<li>Add Makefile for 16-bit DOS binaries under OpenWatcom, and modify
+<code><nobr>mkdep.pl</nobr></code> to be able to generate completely
+pathless dependencies, as required by OpenWatcom wmake (it supports path
+searches, but not explicit paths.)
+<li>Fix the <code><nobr>STR</nobr></code> instruction.
+<li>Fix the ELF output format, which was broken under certain circumstances
+due to the addition of stabs support.
+<li>Quick-fix Borland format debug-info for
+<code><nobr>-f obj</nobr></code>
+<li>Fix for <code><nobr>%rep</nobr></code> with no arguments (#560568)
+<li>Fix concatenation of preprocessor function call (#794686)
+<li>Fix long label causes coredump (#677841)
+<li>Use autoheader as well as autoconf to keep configure from generating
+ridiculously long command lines.
+<li>Make sure that all of the formats which support debugging output
+actually will suppress debugging output when <code><nobr>-g</nobr></code>
+not specified.
+</ul>
+<h4><a name="section-C.2.3">C.2.3 Version 0.98.37</a></h4>
+<ul>
+<li>Paths given in <code><nobr>-I</nobr></code> switch searched for
+<code><nobr>incbin</nobr></code>-ed as well as
+<code><nobr>%include</nobr></code>-ed files.
+<li>Added stabs debugging for the ELF output format, patch from Martin
+Wawro.
+<li>Fix <code><nobr>output/outbin.c</nobr></code> to allow origin &gt;
+80000000h.
+<li>Make <code><nobr>-U</nobr></code> switch work.
+<li>Fix the use of relative offsets with explicit prefixes, e.g.
+<code><nobr>a32 loop foo</nobr></code>.
+<li>Remove <code><nobr>backslash()</nobr></code>.
+<li>Fix the <code><nobr>SMSW</nobr></code> and
+<code><nobr>SLDT</nobr></code> instructions.
+<li><code><nobr>-O2</nobr></code> and <code><nobr>-O3</nobr></code> are no
+longer aliases for <code><nobr>-O10</nobr></code> and
+<code><nobr>-O15</nobr></code>. If you mean the latter, please say so! :)
+</ul>
+<h4><a name="section-C.2.4">C.2.4 Version 0.98.36</a></h4>
+<ul>
+<li>Update rdoff - librarian/archiver - common rec - docs!
+<li>Fix signed/unsigned problems.
+<li>Fix <code><nobr>JMP FAR label</nobr></code> and
+<code><nobr>CALL FAR label</nobr></code>.
+<li>Add new multisection support - map files - fix align bug
+<li>Fix sysexit, movhps/movlps reg,reg bugs in insns.dat
+<li><code><nobr>Q</nobr></code> or <code><nobr>O</nobr></code> suffixes
+indicate octal
+<li>Support Prescott new instructions (PNI).
+<li>Cyrix <code><nobr>XSTORE</nobr></code> instruction.
+</ul>
+<h4><a name="section-C.2.5">C.2.5 Version 0.98.35</a></h4>
+<ul>
+<li>Fix build failure on 16-bit DOS (Makefile.bc3 workaround for compiler
+bug.)
+<li>Fix dependencies and compiler warnings.
+<li>Add "const" in a number of places.
+<li>Add -X option to specify error reporting format (use -Xvc to integrate
+with Microsoft Visual Studio.)
+<li>Minor changes for code legibility.
+<li>Drop use of tmpnam() in rdoff (security fix.)
+</ul>
+<h4><a name="section-C.2.6">C.2.6 Version 0.98.34</a></h4>
+<ul>
+<li>Correct additional address-size vs. operand-size confusions.
+<li>Generate dependencies for all Makefiles automatically.
+<li>Add support for unimplemented (but theoretically available) registers
+such as tr0 and cr5. Segment registers 6 and 7 are called segr6 and segr7
+for the operations which they can be represented.
+<li>Correct some disassembler bugs related to redundant address-size
+prefixes. Some work still remains in this area.
+<li>Correctly generate an error for things like "SEG eax".
+<li>Add the JMPE instruction, enabled by "CPU IA64".
+<li>Correct compilation on newer gcc/glibc platforms.
+<li>Issue an error on things like "jmp far eax".
+</ul>
+<h4><a name="section-C.2.7">C.2.7 Version 0.98.33</a></h4>
+<ul>
+<li>New __NASM_PATCHLEVEL__ and __NASM_VERSION_ID__ standard macros to
+round out the version-query macros. version.pl now understands X.YYplWW or
+X.YY.ZZplWW as a version number, equivalent to X.YY.ZZ.WW (or X.YY.0.WW, as
+appropriate).
+<li>New keyword "strict" to disable the optimization of specific operands.
+<li>Fix the handing of size overrides with JMP instructions (instructions
+such as "jmp dword foo".)
+<li>Fix the handling of "ABSOLUTE label", where "label" points into a
+relocatable segment.
+<li>Fix OBJ output format with lots of externs.
+<li>More documentation updates.
+<li>Add -Ov option to get verbose information about optimizations.
+<li>Undo a braindead change which broke <code><nobr>%elif</nobr></code>
+directives.
+<li>Makefile updates.
+</ul>
+<h4><a name="section-C.2.8">C.2.8 Version 0.98.32</a></h4>
+<ul>
+<li>Fix NASM crashing when <code><nobr>%macro</nobr></code> directives were
+left unterminated.
+<li>Lots of documentation updates.
+<li>Complete rewrite of the PostScript/PDF documentation generator.
+<li>The MS Visual C++ Makefile was updated and corrected.
+<li>Recognize .rodata as a standard section name in ELF.
+<li>Fix some obsolete Perl4-isms in Perl scripts.
+<li>Fix configure.in to work with autoconf 2.5x.
+<li>Fix a couple of "make cleaner" misses.
+<li>Make the normal "./configure &amp;&amp; make" work with Cygwin.
+</ul>
+<h4><a name="section-C.2.9">C.2.9 Version 0.98.31</a></h4>
+<ul>
+<li>Correctly build in a separate object directory again.
+<li>Derive all references to the version number from the version file.
+<li>New standard macros __NASM_SUBMINOR__ and __NASM_VER__ macros.
+<li>Lots of Makefile updates and bug fixes.
+<li>New <code><nobr>%ifmacro</nobr></code> directive to test for multiline
+macros.
+<li>Documentation updates.
+<li>Fixes for 16-bit OBJ format output.
+<li>Changed the NASM environment variable to NASMENV.
+</ul>
+<h4><a name="section-C.2.10">C.2.10 Version 0.98.30</a></h4>
+<ul>
+<li>Changed doc files a lot: completely removed old READMExx and Wishlist
+files, incorporating all information in CHANGES and TODO.
+<li>I waited a long time to rename zoutieee.c to (original) outieee.c
+<li>moved all output modules to output/ subdirectory.
+<li>Added 'make strip' target to strip debug info from nasm &amp; ndisasm.
+<li>Added INSTALL file with installation instructions.
+<li>Added -v option description to nasm man.
+<li>Added dist makefile target to produce source distributions.
+<li>16-bit support for ELF output format (GNU extension, but useful.)
+</ul>
+<h4><a name="section-C.2.11">C.2.11 Version 0.98.28</a></h4>
+<ul>
+<li>Fastcooked this for Debian's Woody release: Frank applied the INCBIN
+bug patch to 0.98.25alt and called it 0.98.28 to not confuse poor little
+apt-get.
+</ul>
+<h4><a name="section-C.2.12">C.2.12 Version 0.98.26</a></h4>
+<ul>
+<li>Reorganised files even better from 0.98.25alt
+</ul>
+<h4><a name="section-C.2.13">C.2.13 Version 0.98.25alt</a></h4>
+<ul>
+<li>Prettified the source tree. Moved files to more reasonable places.
+<li>Added findleak.pl script to misc/ directory.
+<li>Attempted to fix doc.
+</ul>
+<h4><a name="section-C.2.14">C.2.14 Version 0.98.25</a></h4>
+<ul>
+<li>Line continuation character <code><nobr>\</nobr></code>.
+<li>Docs inadvertantly reverted - "dos packaging".
+</ul>
+<h4><a name="section-C.2.15">C.2.15 Version 0.98.24p1</a></h4>
+<ul>
+<li>FIXME: Someone, document this please.
+</ul>
+<h4><a name="section-C.2.16">C.2.16 Version 0.98.24</a></h4>
+<ul>
+<li>Documentation - Ndisasm doc added to Nasm.doc.
+</ul>
+<h4><a name="section-C.2.17">C.2.17 Version 0.98.23</a></h4>
+<ul>
+<li>Attempted to remove rdoff version1
+<li>Lino Mastrodomenico's patches to preproc.c (%$$ bug?).
+</ul>
+<h4><a name="section-C.2.18">C.2.18 Version 0.98.22</a></h4>
+<ul>
+<li>Update rdoff2 - attempt to remove v1.
+</ul>
+<h4><a name="section-C.2.19">C.2.19 Version 0.98.21</a></h4>
+<ul>
+<li>Optimization fixes.
+</ul>
+<h4><a name="section-C.2.20">C.2.20 Version 0.98.20</a></h4>
+<ul>
+<li>Optimization fixes.
+</ul>
+<h4><a name="section-C.2.21">C.2.21 Version 0.98.19</a></h4>
+<ul>
+<li>H. J. Lu's patch back out.
+</ul>
+<h4><a name="section-C.2.22">C.2.22 Version 0.98.18</a></h4>
+<ul>
+<li>Added ".rdata" to "-f win32".
+</ul>
+<h4><a name="section-C.2.23">C.2.23 Version 0.98.17</a></h4>
+<ul>
+<li>H. J. Lu's "bogus elf" patch. (Red Hat problem?)
+</ul>
+<h4><a name="section-C.2.24">C.2.24 Version 0.98.16</a></h4>
+<ul>
+<li>Fix whitespace before "[section ..." bug.
+</ul>
+<h4><a name="section-C.2.25">C.2.25 Version 0.98.15</a></h4>
+<ul>
+<li>Rdoff changes (?).
+<li>Fix fixes to memory leaks.
+</ul>
+<h4><a name="section-C.2.26">C.2.26 Version 0.98.14</a></h4>
+<ul>
+<li>Fix memory leaks.
+</ul>
+<h4><a name="section-C.2.27">C.2.27 Version 0.98.13</a></h4>
+<ul>
+<li>There was no 0.98.13
+</ul>
+<h4><a name="section-C.2.28">C.2.28 Version 0.98.12</a></h4>
+<ul>
+<li>Update optimization (new function of "-O1")
+<li>Changes to test/bintest.asm (?).
+</ul>
+<h4><a name="section-C.2.29">C.2.29 Version 0.98.11</a></h4>
+<ul>
+<li>Optimization changes.
+<li>Ndisasm fixed.
+</ul>
+<h4><a name="section-C.2.30">C.2.30 Version 0.98.10</a></h4>
+<ul>
+<li>There was no 0.98.10
+</ul>
+<h4><a name="section-C.2.31">C.2.31 Version 0.98.09</a></h4>
+<ul>
+<li>Add multiple sections support to "-f bin".
+<li>Changed GLOBAL_TEMP_BASE in outelf.c from 6 to 15.
+<li>Add "-v" as an alias to the "-r" switch.
+<li>Remove "#ifdef" from Tasm compatibility options.
+<li>Remove redundant size-overrides on "mov ds, ex", etc.
+<li>Fixes to SSE2, other insns.dat (?).
+<li>Enable uppercase "I" and "P" switches.
+<li>Case insinsitive "seg" and "wrt".
+<li>Update install.sh (?).
+<li>Allocate tokens in blocks.
+<li>Improve "invalid effective address" messages.
+</ul>
+<h4><a name="section-C.2.32">C.2.32 Version 0.98.08</a></h4>
+<ul>
+<li>Add "<code><nobr>%strlen</nobr></code>" and
+"<code><nobr>%substr</nobr></code>" macro operators
+<li>Fixed broken c16.mac.
+<li>Unterminated string error reported.
+<li>Fixed bugs as per 0.98bf
+</ul>
+<h4><a name="section-C.2.33">C.2.33 Version 0.98.09b with John Coffman patches released 28-Oct-2001</a></h4>
+<p>Changes from 0.98.07 release to 98.09b as of 28-Oct-2001
+<ul>
+<li>More closely compatible with 0.98 when -O0 is implied or specified. Not
+strictly identical, since backward branches in range of short offsets are
+recognized, and signed byte values with no explicit size specification will
+be assembled as a single byte.
+<li>More forgiving with the PUSH instruction. 0.98 requires a size to be
+specified always. 0.98.09b will imply the size from the current BITS
+setting (16 or 32).
+<li>Changed definition of the optimization flag:
+</ul>
+<p>-O0 strict two-pass assembly, JMP and Jcc are handled more like 0.98,
+except that back- ward JMPs are short, if possible.
+<p>-O1 strict two-pass assembly, but forward branches are assembled with
+code guaranteed to reach; may produce larger code than -O0, but will
+produce successful assembly more often if branch offset sizes are not
+specified.
+<p>-O2 multi-pass optimization, minimize branch offsets; also will minimize
+signed immed- iate bytes, overriding size specification.
+<p>-O3 like -O2, but more passes taken, if needed
+<h4><a name="section-C.2.34">C.2.34 Version 0.98.07 released 01/28/01</a></h4>
+<ul>
+<li>Added Stepane Denis' SSE2 instructions to a *working* version of the
+code - some earlier versions were based on broken code - sorry 'bout that.
+version "0.98.07"
+</ul>
+<p>01/28/01
+<ul>
+<li>Cosmetic modifications to nasm.c, nasm.h, AUTHORS, MODIFIED
+</ul>
+<h4><a name="section-C.2.35">C.2.35 Version 0.98.06f released 01/18/01</a></h4>
+<ul>
+<li>- Add "metalbrain"s jecxz bug fix in insns.dat - alter nasmdoc.src to
+match - version "0.98.06f"
+</ul>
+<h4><a name="section-C.2.36">C.2.36 Version 0.98.06e released 01/09/01</a></h4>
+<ul>
+<li>Removed the "outforms.h" file - it appears to be someone's old backup
+of "outform.h". version "0.98.06e"
+</ul>
+<p>01/09/01
+<ul>
+<li>fbk - finally added the fix for the "multiple %includes bug", known
+since 7/27/99 - reported originally (?) and sent to us by Austin Lunnen -
+he reports that John Fine had a fix within the day. Here it is...
+<li>Nelson Rush resigns from the group. Big thanks to Nelson for his
+leadership and enthusiasm in getting these changes incorporated into Nasm!
+<li>fbk - [list +], [list -] directives - ineptly implemented, should be
+re-written or removed, perhaps.
+<li>Brian Raiter / fbk - "elfso bug" fix - applied to aoutb format as well
+- testing might be desirable...
+</ul>
+<p>08/07/00
+<ul>
+<li>James Seter - -postfix, -prefix command line switches.
+<li>Yuri Zaporogets - rdoff utility changes.
+</ul>
+<h4><a name="section-C.2.37">C.2.37 Version 0.98p1</a></h4>
+<ul>
+<li>GAS-like palign (Panos Minos)
+<li>FIXME: Someone, fill this in with details
+</ul>
+<h4><a name="section-C.2.38">C.2.38 Version 0.98bf (bug-fixed)</a></h4>
+<ul>
+<li>Fixed - elf and aoutb bug - shared libraries - multiple "%include" bug
+in "-f obj" - jcxz, jecxz bug - unrecognized option bug in ndisasm
+</ul>
+<h4><a name="section-C.2.39">C.2.39 Version 0.98.03 with John Coffman's changes released 27-Jul-2000</a></h4>
+<ul>
+<li>Added signed byte optimizations for the 0x81/0x83 class of
+instructions: ADC, ADD, AND, CMP, OR, SBB, SUB, XOR: when used as 'ADD
+reg16,imm' or 'ADD reg32,imm.' Also optimization of signed byte form of
+'PUSH imm' and 'IMUL reg,imm'/'IMUL reg,reg,imm.' No size specification is
+needed.
+<li>Added multi-pass JMP and Jcc offset optimization. Offsets on forward
+references will preferentially use the short form, without the need to code
+a specific size (short or near) for the branch. Added instructions for 'Jcc
+label' to use the form 'Jnotcc $+3/JMP label', in cases where a short
+offset is out of bounds. If compiling for a 386 or higher CPU, then the 386
+form of Jcc will be used instead.
+</ul>
+<p>This feature is controlled by a new command-line switch: "O", (upper
+case letter O). "-O0" reverts the assembler to no extra optimization
+passes, "-O1" allows up to 5 extra passes, and "-O2"(default), allows up to
+10 extra optimization passes.
+<ul>
+<li>Added a new directive: 'cpu XXX', where XXX is any of: 8086, 186, 286,
+386, 486, 586, pentium, 686, PPro, P2, P3 or Katmai. All are case
+insensitive. All instructions will be selected only if they apply to the
+selected cpu or lower. Corrected a couple of bugs in cpu-dependence in
+'insns.dat'.
+<li>Added to 'standard.mac', the "use16" and "use32" forms of the "bits
+16/32" directive. This is nothing new, just conforms to a lot of other
+assemblers. (minor)
+<li>Changed label allocation from 320/32 (10000 labels @ 200K+) to 32/37
+(1000 labels); makes running under DOS much easier. Since additional label
+space is allocated dynamically, this should have no effect on large
+programs with lots of labels. The 37 is a prime, believed to be better for
+hashing. (minor)
+</ul>
+<h4><a name="section-C.2.40">C.2.40 Version 0.98.03</a></h4>
+<p>"Integrated patchfile 0.98-0.98.01. I call this version 0.98.03 for
+historical reasons: 0.98.02 was trashed." --John Coffman
+&lt;johninsd@san.rr.com&gt;, 27-Jul-2000
+<ul>
+<li>Kendall Bennett's SciTech MGL changes
+<li>Note that you must define "TASM_COMPAT" at compile-time to get the Tasm
+Ideal Mode compatibility.
+<li>All changes can be compiled in and out using the TASM_COMPAT macros,
+and when compiled without TASM_COMPAT defined we get the exact same binary
+as the unmodified 0.98 sources.
+<li>standard.mac, macros.c: Added macros to ignore TASM directives before
+first include
+<li>nasm.h: Added extern declaration for tasm_compatible_mode
+<li>nasm.c: Added global variable tasm_compatible_mode
+<li>Added command line switch for TASM compatible mode (-t)
+<li>Changed version command line to reflect when compiled with TASM
+additions
+<li>Added response file processing to allow all arguments on a single line
+(response file is @resp rather than -@resp for NASM format).
+<li>labels.c: Changes islocal() macro to support TASM style @@local labels.
+<li>Added islocalchar() macro to support TASM style @@local labels.
+<li>parser.c: Added support for TASM style memory references (ie: mov
+[DWORD eax],10 rather than the NASM style mov DWORD [eax],10).
+<li>preproc.c: Added new directives, <code><nobr>%arg</nobr></code>,
+<code><nobr>%local</nobr></code>, <code><nobr>%stacksize</nobr></code> to
+directives table
+<li>Added support for TASM style directives without a leading % symbol.
+<li>Integrated a block of changes from Andrew Zabolotny
+&lt;bit@eltech.ru&gt;:
+<li>A new keyword <code><nobr>%xdefine</nobr></code> and its
+case-insensitive counterpart <code><nobr>%ixdefine</nobr></code>. They work
+almost the same way as <code><nobr>%define</nobr></code> and
+<code><nobr>%idefine</nobr></code> but expand the definition immediately,
+not on the invocation. Something like a cross between
+<code><nobr>%define</nobr></code> and <code><nobr>%assign</nobr></code>.
+The "x" suffix stands for "eXpand", so "xdefine" can be deciphered as
+"expand-and-define". Thus you can do things like this:
+</ul>
+<p><pre>
+ %assign ofs 0
+
+ %macro arg 1
+ %xdefine %1 dword [esp+ofs]
+ %assign ofs ofs+4
+ %endmacro
+</pre>
+<ul>
+<li>Changed the place where the expansion of %$name macros are expanded.
+Now they are converted into ..@ctxnum.name form when detokenizing, so there
+are no quirks as before when using %$name arguments to macros, in macros
+etc. For example:
+</ul>
+<p><pre>
+ %macro abc 1
+ %define %1 hello
+ %endm
+
+ abc %$here
+ %$here
+</pre>
+<p>Now last line will be expanded into "hello" as expected. This also
+allows for lots of goodies, a good example are extended "proc" macros
+included in this archive.
+<ul>
+<li>Added a check for "cstk" in smacro_defined() before calling get_ctx() -
+this allows for things like:
+</ul>
+<p><pre>
+ %ifdef %$abc
+ %endif
+</pre>
+<p>to work without warnings even in no context.
+<ul>
+<li>Added a check for "cstk" in %if*ctx and %elif*ctx directives - this
+allows to use <code><nobr>%ifctx</nobr></code> without excessive warnings.
+If there is no active context, <code><nobr>%ifctx</nobr></code> goes
+through "false" branch.
+<li>Removed "user error: " prefix with <code><nobr>%error</nobr></code>
+directive: it just clobbers the output and has absolutely no functionality.
+Besides, this allows to write macros that does not differ from built-in
+functions in any way.
+<li>Added expansion of string that is output by
+<code><nobr>%error</nobr></code> directive. Now you can do things like:
+</ul>
+<p><pre>
+ %define hello(x) Hello, x!
+
+ %define %$name andy
+ %error "hello(%$name)"
+</pre>
+<p>Same happened with <code><nobr>%include</nobr></code> directive.
+<ul>
+<li>Now all directives that expect an identifier will try to expand and
+concatenate everything without whitespaces in between before usage. For
+example, with "unfixed" nasm the commands
+</ul>
+<p><pre>
+ %define %$abc hello
+ %define __%$abc goodbye
+ __%$abc
+</pre>
+<p>would produce "incorrect" output: last line will expand to
+<p><pre>
+ hello goodbyehello
+</pre>
+<p>Not quite what you expected, eh? :-) The answer is that preprocessor
+treats the <code><nobr>%define</nobr></code> construct as if it would be
+<p><pre>
+ %define __ %$abc goodbye
+</pre>
+<p>(note the white space between __ and %$abc). After my "fix" it will
+"correctly" expand into
+<p><pre>
+ goodbye
+</pre>
+<p>as expected. Note that I use quotes around words "correct", "incorrect"
+etc because this is rather a feature not a bug; however current behaviour
+is more logical (and allows more advanced macro usage :-).
+<p>Same change was applied to:
+<code><nobr>%push</nobr></code>,<code><nobr>%macro</nobr></code>,<code><nobr>%imacro</nobr></code>,<code><nobr>%define</nobr></code>,<code><nobr>%idefine</nobr></code>,<code><nobr>%xdefine</nobr></code>,<code><nobr>%ixdefine</nobr></code>,
+<code><nobr>%assign</nobr></code>,<code><nobr>%iassign</nobr></code>,<code><nobr>%undef</nobr></code>
+<ul>
+<li>A new directive [WARNING {+|-}warning-id] have been added. It works
+only if the assembly phase is enabled (i.e. it doesn't work with nasm -e).
+<li>A new warning type: macro-selfref. By default this warning is disabled;
+when enabled NASM warns when a macro self-references itself; for example
+the following source:
+</ul>
+<p><pre>
+ [WARNING macro-selfref]
+
+ %macro push 1-*
+ %rep %0
+ push %1
+ %rotate 1
+ %endrep
+ %endmacro
+
+ push eax,ebx,ecx
+</pre>
+<p>will produce a warning, but if we remove the first line we won't see it
+anymore (which is The Right Thing To Do {tm} IMHO since C preprocessor eats
+such constructs without warnings at all).
+<ul>
+<li>Added a "error" routine to preprocessor which always will set ERR_PASS1
+bit in severity_code. This removes annoying repeated errors on first and
+second passes from preprocessor.
+<li>Added the %+ operator in single-line macros for concatenating two
+identifiers. Usage example:
+</ul>
+<p><pre>
+ %define _myfunc _otherfunc
+ %define cextern(x) _ %+ x
+ cextern (myfunc)
+</pre>
+<p>After first expansion, third line will become "_myfunc". After this
+expansion is performed again so it becomes "_otherunc".
+<ul>
+<li>Now if preprocessor is in a non-emitting state, no warning or error
+will be emitted. Example:
+</ul>
+<p><pre>
+ %if 1
+ mov eax,ebx
+ %else
+ put anything you want between these two brackets,
+ even macro-parameter references %1 or local
+ labels %$zz or macro-local labels %%zz - no
+ warning will be emitted.
+ %endif
+</pre>
+<ul>
+<li>Context-local variables on expansion as a last resort are looked up in
+outer contexts. For example, the following piece:
+</ul>
+<p><pre>
+ %push outer
+ %define %$a [esp]
+
+ %push inner
+ %$a
+ %pop
+ %pop
+</pre>
+<p>will expand correctly the fourth line to [esp]; if we'll define another
+%$a inside the "inner" context, it will take precedence over outer
+definition. However, this modification has been applied only to
+expand_smacro and not to smacro_define: as a consequence expansion looks in
+outer contexts, but <code><nobr>%ifdef</nobr></code> won't look in outer
+contexts.
+<p>This behaviour is needed because we don't want nested contexts to act on
+already defined local macros. Example:
+<p><pre>
+ %define %$arg1 [esp+4]
+ test eax,eax
+ if nz
+ mov eax,%$arg1
+ endif
+</pre>
+<p>In this example the "if" mmacro enters into the "if" context, so %$arg1
+is not valid anymore inside "if". Of course it could be worked around by
+using explicitely %$$arg1 but this is ugly IMHO.
+<ul>
+<li>Fixed memory leak in <code><nobr>%undef</nobr></code>. The origline
+wasn't freed before exiting on success.
+<li>Fixed trap in preprocessor when line expanded to empty set of tokens.
+This happens, for example, in the following case:
+</ul>
+<p><pre>
+ #define SOMETHING
+ SOMETHING
+</pre>
+<h4><a name="section-C.2.41">C.2.41 Version 0.98</a></h4>
+<p>All changes since NASM 0.98p3 have been produced by H. Peter Anvin
+&lt;hpa@zytor.com&gt;.
+<ul>
+<li>The documentation comment delimiter is
+<li>Allow EQU definitions to refer to external labels; reported by Pedro
+Gimeno.
+<li>Re-enable support for RDOFF v1; reported by Pedro Gimeno.
+<li>Updated License file per OK from Simon and Julian.
+</ul>
+<h4><a name="section-C.2.42">C.2.42 Version 0.98p9</a></h4>
+<ul>
+<li>Update documentation (although the instruction set reference will have
+to wait; I don't want to hold up the 0.98 release for it.)
+<li>Verified that the NASM implementation of the PEXTRW and PMOVMSKB
+instructions is correct. The encoding differs from what the Intel manuals
+document, but the Pentium III behaviour matches NASM, not the Intel
+manuals.
+<li>Fix handling of implicit sizes in PSHUFW and PINSRW, reported by Stefan
+Hoffmeister.
+<li>Resurrect the -s option, which was removed when changing the diagnostic
+output to stdout.
+</ul>
+<h4><a name="section-C.2.43">C.2.43 Version 0.98p8</a></h4>
+<ul>
+<li>Fix for "DB" when NASM is running on a bigendian machine.
+<li>Invoke insns.pl once for each output script, making Makefile.in legal
+for "make -j".
+<li>Improve the Unix configure-based makefiles to make package creation
+easier.
+<li>Included an RPM .spec file for building RPM (RedHat Package Manager)
+packages on Linux or Unix systems.
+<li>Fix Makefile dependency problems.
+<li>Change src/rdsrc.pl to include sectioning information in info output;
+required for install-info to work.
+<li>Updated the RDOFF distribution to version 2 from Jules; minor massaging
+to make it compile in my environment.
+<li>Split doc files that can be built by anyone with a Perl interpreter off
+into a separate archive.
+<li>"Dress rehearsal" release!
+</ul>
+<h4><a name="section-C.2.44">C.2.44 Version 0.98p7</a></h4>
+<ul>
+<li>Fixed opcodes with a third byte-sized immediate argument to not
+complain if given "byte" on the immediate.
+<li>Allow <code><nobr>%undef</nobr></code> to remove single-line macros
+with arguments. This matches the behaviour of #undef in the C preprocessor.
+<li>Allow -d, -u, -i and -p to be specified as -D, -U, -I and -P for
+compatibility with most C compilers and preprocessors. This allows Makefile
+options to be shared between cc and nasm, for example.
+<li>Minor cleanups.
+<li>Went through the list of Katmai instructions and hopefully fixed the
+(rather few) mistakes in it.
+<li>(Hopefully) fixed a number of disassembler bugs related to ambiguous
+instructions (disambiguated by -p) and SSE instructions with REP.
+<li>Fix for bug reported by Mark Junger: "call dword 0x12345678" should
+work and may add an OSP (affected CALL, JMP, Jcc).
+<li>Fix for environments when "stderr" isn't a compile-time constant.
+</ul>
+<h4><a name="section-C.2.45">C.2.45 Version 0.98p6</a></h4>
+<ul>
+<li>Took officially over coordination of the 0.98 release; so drop the p3.x
+notation. Skipped p4 and p5 to avoid confusion with John Fine's J4 and J5
+releases.
+<li>Update the documentation; however, it still doesn't include
+documentation for the various new instructions. I somehow wonder if it
+makes sense to have an instruction set reference in the assembler manual
+when Intel et al have PDF versions of their manuals online.
+<li>Recognize "idt" or "centaur" for the -p option to ndisasm.
+<li>Changed error messages back to stderr where they belong, but add an -E
+option to redirect them elsewhere (the DOS shell cannot redirect stderr.)
+<li>-M option to generate Makefile dependencies (based on code from Alex
+Verstak.)
+<li><code><nobr>%undef</nobr></code> preprocessor directive, and -u option,
+that undefines a single-line macro.
+<li>OS/2 Makefile (Mkfiles/Makefile.os2) for Borland under OS/2; from Chuck
+Crayne.
+<li>Various minor bugfixes (reported by): - Dangling
+<code><nobr>%s</nobr></code> in preproc.c (Martin Junker)
+<li>THERE ARE KNOWN BUGS IN SSE AND THE OTHER KATMAI INSTRUCTIONS. I am on
+a trip and didn't bring the Katmai instruction reference, so I can't work
+on them right now.
+<li>Updated the License file per agreement with Simon and Jules to include
+a GPL distribution clause.
+</ul>
+<h4><a name="section-C.2.46">C.2.46 Version 0.98p3.7</a></h4>
+<ul>
+<li>(Hopefully) fixed the canned Makefiles to include the outrdf2 and
+zoutieee modules.
+<li>Renamed changes.asm to changed.asm.
+</ul>
+<h4><a name="section-C.2.47">C.2.47 Version 0.98p3.6</a></h4>
+<ul>
+<li>Fixed a bunch of instructions that were added in 0.98p3.5 which had
+memory operands, and the address-size prefix was missing from the
+instruction pattern.
+</ul>
+<h4><a name="section-C.2.48">C.2.48 Version 0.98p3.5</a></h4>
+<ul>
+<li>Merged in changes from John S. Fine's 0.98-J5 release. John's based
+0.98-J5 on my 0.98p3.3 release; this merges the changes.
+<li>Expanded the instructions flag field to a long so we can fit more
+flags; mark SSE (KNI) and AMD or Katmai-specific instructions as such.
+<li>Fix the "PRIV" flag on a bunch of instructions, and create new "PROT"
+flag for protected-mode-only instructions (orthogonal to if the instruction
+is privileged!) and new "SMM" flag for SMM-only instructions.
+<li>Added AMD-only SYSCALL and SYSRET instructions.
+<li>Make SSE actually work, and add new Katmai MMX instructions.
+<li>Added a -p (preferred vendor) option to ndisasm so that it can
+distinguish e.g. Cyrix opcodes also used in SSE. For example:
+</ul>
+<p><pre>
+ ndisasm -p cyrix aliased.bin
+ 00000000 670F514310 paddsiw mm0,[ebx+0x10]
+ 00000005 670F514320 paddsiw mm0,[ebx+0x20]
+ ndisasm -p intel aliased.bin
+ 00000000 670F514310 sqrtps xmm0,[ebx+0x10]
+ 00000005 670F514320 sqrtps xmm0,[ebx+0x20]
+</pre>
+<ul>
+<li>Added a bunch of Cyrix-specific instructions.
+</ul>
+<h4><a name="section-C.2.49">C.2.49 Version 0.98p3.4</a></h4>
+<ul>
+<li>Made at least an attempt to modify all the additional Makefiles (in the
+Mkfiles directory). I can't test it, but this was the best I could do.
+<li>DOS DJGPP+"Opus Make" Makefile from John S. Fine.
+<li>changes.asm changes from John S. Fine.
+</ul>
+<h4><a name="section-C.2.50">C.2.50 Version 0.98p3.3</a></h4>
+<ul>
+<li>Patch from Conan Brink to allow nesting of
+<code><nobr>%rep</nobr></code> directives.
+<li>If we're going to allow INT01 as an alias for INT1/ICEBP (one of Jules
+0.98p3 changes), then we should allow INT03 as an alias for INT3 as well.
+<li>Updated changes.asm to include the latest changes.
+<li>Tried to clean up the &lt;CR&gt;s that had snuck in from a DOS/Windows
+environment into my Unix environment, and try to make sure than DOS/Windows
+users get them back.
+<li>We would silently generate broken tools if insns.dat wasn't sorted
+properly. Change insns.pl so that the order doesn't matter.
+<li>Fix bug in insns.pl (introduced by me) which would cause conditional
+instructions to have an extra "cc" in disassembly, e.g. "jnz" disassembled
+as "jccnz".
+</ul>
+<h4><a name="section-C.2.51">C.2.51 Version 0.98p3.2</a></h4>
+<ul>
+<li>Merged in John S. Fine's changes from his 0.98-J4 prerelease; see
+http://www.csoft.net/cz/johnfine/
+<li>Changed previous "spotless" Makefile target (appropriate for
+distribution) to "distclean", and added "cleaner" target which is same as
+"clean" except deletes files generated by Perl scripts; "spotless" is
+union.
+<li>Removed BASIC programs from distribution. Get a Perl interpreter
+instead (see below.)
+<li>Calling this "pre-release 3.2" rather than "p3-hpa2" because of John's
+contributions.
+<li>Actually link in the IEEE output format (zoutieee.c); fix a bunch of
+compiler warnings in that file. Note I don't know what IEEE output is
+supposed to look like, so these changes were made "blind".
+</ul>
+<h4><a name="section-C.2.52">C.2.52 Version 0.98p3-hpa</a></h4>
+<ul>
+<li>Merged nasm098p3.zip with nasm-0.97.tar.gz to create a fully buildable
+version for Unix systems (Makefile.in updates, etc.)
+<li>Changed insns.pl to create the instruction tables in nasm.h and
+names.c, so that a new instruction can be added by adding it *only* to
+insns.dat.
+<li>Added the following new instructions: SYSENTER, SYSEXIT, FXSAVE,
+FXRSTOR, UD1, UD2 (the latter two are two opcodes that Intel guarantee will
+never be used; one of them is documented as UD2 in Intel documentation, the
+other one just as "Undefined Opcode" -- calling it UD1 seemed to make
+sense.)
+<li>MAX_SYMBOL was defined to be 9, but LOADALL286 and LOADALL386 are 10
+characters long. Now MAX_SYMBOL is derived from insns.dat.
+<li>A note on the BASIC programs included: forget them. insns.bas is
+already out of date. Get yourself a Perl interpreter for your platform of
+choice at
+<a href="http://www.cpan.org/ports/index.html">http://www.cpan.org/ports/index.html</a>.
+</ul>
+<h4><a name="section-C.2.53">C.2.53 Version 0.98 pre-release 3</a></h4>
+<ul>
+<li>added response file support, improved command line handling, new layout
+help screen
+<li>fixed limit checking bug, 'OUT byte nn, reg' bug, and a couple of rdoff
+related bugs, updated Wishlist; 0.98 Prerelease 3.
+</ul>
+<h4><a name="section-C.2.54">C.2.54 Version 0.98 pre-release 2</a></h4>
+<ul>
+<li>fixed bug in outcoff.c to do with truncating section names longer than
+8 characters, referencing beyond end of string; 0.98 pre-release 2
+</ul>
+<h4><a name="section-C.2.55">C.2.55 Version 0.98 pre-release 1</a></h4>
+<ul>
+<li>Fixed a bug whereby STRUC didn't work at all in RDF.
+<li>Fixed a problem with group specification in PUBDEFs in OBJ.
+<li>Improved ease of adding new output formats. Contribution due to Fox
+Cutter.
+<li>Fixed a bug in relocations in the `bin' format: was showing up when a
+relocatable reference crossed an 8192-byte boundary in any output section.
+<li>Fixed a bug in local labels: local-label lookups were inconsistent
+between passes one and two if an EQU occurred between the definition of a
+global label and the subsequent use of a local label local to that global.
+<li>Fixed a seg-fault in the preprocessor (again) which happened when you
+use a blank line as the first line of a multi-line macro definition and
+then defined a label on the same line as a call to that macro.
+<li>Fixed a stale-pointer bug in the handling of the NASM environment
+variable. Thanks to Thomas McWilliams.
+<li>ELF had a hard limit on the number of sections which caused segfaults
+when transgressed. Fixed.
+<li>Added ability for ndisasm to read from stdin by using `-' as the
+filename.
+<li>ndisasm wasn't outputting the TO keyword. Fixed.
+<li>Fixed error cascade on bogus expression in
+<code><nobr>%if</nobr></code> - an error in evaluation was causing the
+entire <code><nobr>%if</nobr></code> to be discarded, thus creating trouble
+later when the <code><nobr>%else</nobr></code> or
+<code><nobr>%endif</nobr></code> was encountered.
+<li>Forward reference tracking was instruction-granular not operand-
+granular, which was causing 286-specific code to be generated needlessly on
+code of the form `shr word [forwardref],1'. Thanks to Jim Hague for sending
+a patch.
+<li>All messages now appear on stdout, as sending them to stderr serves no
+useful purpose other than to make redirection difficult.
+<li>Fixed the problem with EQUs pointing to an external symbol - this now
+generates an error message.
+<li>Allowed multiple size prefixes to an operand, of which only the first
+is taken into account.
+<li>Incorporated John Fine's changes, including fixes of a large number of
+preprocessor bugs, some small problems in OBJ, and a reworking of label
+handling to define labels before their line is assembled, rather than
+after.
+<li>Reformatted a lot of the source code to be more readable. Included
+'coding.txt' as a guideline for how to format code for contributors.
+<li>Stopped nested <code><nobr>%reps</nobr></code> causing a panic - they
+now cause a slightly more friendly error message instead.
+<li>Fixed floating point constant problems (patch by Pedro Gimeno)
+<li>Fixed the return value of insn_size() not being checked for -1,
+indicating an error.
+<li>Incorporated 3Dnow! instructions.
+<li>Fixed the 'mov eax, eax + ebx' bug.
+<li>Fixed the GLOBAL EQU bug in ELF. Released developers release 3.
+<li>Incorporated John Fine's command line parsing changes
+<li>Incorporated David Lindauer's OMF debug support
+<li>Made changes for LCC 4.0 support
+(<code><nobr>__NASM_CDecl__</nobr></code>, removed register size
+specification warning when sizes agree).
+</ul>
+<h3><a name="section-C.3">C.3 NASM 0.9 Series</a></h3>
+<p>Revisions before 0.98.
+<h4><a name="section-C.3.1">C.3.1 Version 0.97 released December 1997</a></h4>
+<ul>
+<li>This was entirely a bug-fix release to 0.96, which seems to have got
+cursed. Silly me.
+<li>Fixed stupid mistake in OBJ which caused `MOV EAX,&lt;constant&gt;' to
+fail. Caused by an error in the `MOV EAX,&lt;segment&gt;' support.
+<li>ndisasm hung at EOF when compiled with lcc on Linux because lcc on
+Linux somehow breaks feof(). ndisasm now does not rely on feof().
+<li>A heading in the documentation was missing due to a markup error in the
+indexing. Fixed.
+<li>Fixed failure to update all pointers on realloc() within extended-
+operand code in parser.c. Was causing wrong behaviour and seg faults on
+lines such as `dd 0.0,0.0,0.0,0.0,...'
+<li>Fixed a subtle preprocessor bug whereby invoking one multi-line macro
+on the first line of the expansion of another, when the second had been
+invoked with a label defined before it, didn't expand the inner macro.
+<li>Added internal.doc back in to the distribution archives - it was
+missing in 0.96 *blush*
+<li>Fixed bug causing 0.96 to be unable to assemble its own test files,
+specifically objtest.asm. *blush again*
+<li>Fixed seg-faults and bogus error messages caused by mismatching
+<code><nobr>%rep</nobr></code> and <code><nobr>%endrep</nobr></code> within
+multi-line macro definitions.
+<li>Fixed a problem with buffer overrun in OBJ, which was causing
+corruption at ends of long PUBDEF records.
+<li>Separated DOS archives into main-program and documentation to reduce
+download size.
+</ul>
+<h4><a name="section-C.3.2">C.3.2 Version 0.96 released November 1997</a></h4>
+<ul>
+<li>Fixed a bug whereby, if `nasm sourcefile' would cause a filename
+collision warning and put output into `nasm.out', then `nasm sourcefile -o
+outputfile' still gave the warning even though the `-o' was honoured. Fixed
+name pollution under Digital UNIX: one of its header files defined R_SP,
+which broke the enum in nasm.h.
+<li>Fixed minor instruction table problems: FUCOM and FUCOMP didn't have
+two-operand forms; NDISASM didn't recognise the longer register forms of
+PUSH and POP (eg FF F3 for PUSH BX); TEST mem,imm32 was flagged as
+undocumented; the 32-bit forms of CMOV had 16-bit operand size prefixes;
+`AAD imm' and `AAM imm' are no longer flagged as undocumented because the
+Intel Architecture reference documents them.
+<li>Fixed a problem with the local-label mechanism, whereby strange types
+of symbol (EQUs, auto-defined OBJ segment base symbols) interfered with the
+`previous global label' value and screwed up local labels.
+<li>Fixed a bug whereby the stub preprocessor didn't communicate with the
+listing file generator, so that the -a and -l options in conjunction would
+produce a useless listing file.
+<li>Merged `os2' object file format back into `obj', after discovering that
+`obj' _also_ shouldn't have a link pass separator in a module containing a
+non-trivial MODEND. Flat segments are now declared using the FLAT
+attribute. `os2' is no longer a valid object format name: use `obj'.
+<li>Removed the fixed-size temporary storage in the evaluator. Very very
+long expressions (like `mov ax,1+1+1+1+...' for two hundred 1s or so)
+should now no longer crash NASM.
+<li>Fixed a bug involving segfaults on disassembly of MMX instructions, by
+changing the meaning of one of the operand-type flags in nasm.h. This may
+cause other apparently unrelated MMX problems; it needs to be tested
+thoroughly.
+<li>Fixed some buffer overrun problems with large OBJ output files. Thanks
+to DJ Delorie for the bug report and fix.
+<li>Made preprocess-only mode actually listen to the
+<code><nobr>%line</nobr></code> markers as it prints them, so that it can
+report errors more sanely.
+<li>Re-designed the evaluator to keep more sensible track of expressions
+involving forward references: can now cope with previously-nightmare
+situations such as:
+</ul>
+<p><pre>
+ mov ax,foo | bar
+ foo equ 1
+ bar equ 2
+</pre>
+<ul>
+<li>Added the ALIGN and ALIGNB standard macros.
+<li>Added PIC support in ELF: use of WRT to obtain the four extra
+relocation types needed.
+<li>Added the ability for output file formats to define their own
+extensions to the GLOBAL, COMMON and EXTERN directives.
+<li>Implemented common-variable alignment, and global-symbol type and size
+declarations, in ELF.
+<li>Implemented NEAR and FAR keywords for common variables, plus far-common
+element size specification, in OBJ.
+<li>Added a feature whereby EXTERNs and COMMONs in OBJ can be given a
+default WRT specification (either a segment or a group).
+<li>Transformed the Unix NASM archive into an auto-configuring package.
+<li>Added a sanity-check for people applying SEG to things which are
+already segment bases: this previously went unnoticed by the SEG processing
+and caused OBJ-driver panics later.
+<li>Added the ability, in OBJ format, to deal with `MOV
+EAX,&lt;segment&gt;' type references: OBJ doesn't directly support
+dword-size segment base fixups, but as long as the low two bytes of the
+constant term are zero, a word-size fixup can be generated instead and it
+will work.
+<li>Added the ability to specify sections' alignment requirements in Win32
+object files and pure binary files.
+<li>Added preprocess-time expression evaluation: the
+<code><nobr>%assign</nobr></code> (and <code><nobr>%iassign</nobr></code>)
+directive and the bare <code><nobr>%if</nobr></code> (and
+<code><nobr>%elif</nobr></code>) conditional. Added relational operators to
+the evaluator, for use only in <code><nobr>%if</nobr></code> constructs:
+the standard relationals = &lt; &gt; &lt;= &gt;= &lt;&gt; (and C-like
+synonyms == and !=) plus low-precedence logical operators &amp;&amp;, ^^
+and ||.
+<li>Added a preprocessor repeat construct: <code><nobr>%rep</nobr></code> /
+<code><nobr>%exitrep</nobr></code> / <code><nobr>%endrep</nobr></code>.
+<li>Added the __FILE__ and __LINE__ standard macros.
+<li>Added a sanity check for number constants being greater than
+0xFFFFFFFF. The warning can be disabled.
+<li>Added the %0 token whereby a variadic multi-line macro can tell how
+many parameters it's been given in a specific invocation.
+<li>Added <code><nobr>%rotate</nobr></code>, allowing multi-line macro
+parameters to be cycled.
+<li>Added the `*' option for the maximum parameter count on multi-line
+macros, allowing them to take arbitrarily many parameters.
+<li>Added the ability for the user-level forms of EXTERN, GLOBAL and COMMON
+to take more than one argument.
+<li>Added the IMPORT and EXPORT directives in OBJ format, to deal with
+Windows DLLs.
+<li>Added some more preprocessor <code><nobr>%if</nobr></code> constructs:
+<code><nobr>%ifidn</nobr></code> / <code><nobr>%ifidni</nobr></code> (exact
+textual identity), and <code><nobr>%ifid</nobr></code> /
+<code><nobr>%ifnum</nobr></code> / <code><nobr>%ifstr</nobr></code> (token
+type testing).
+<li>Added the ability to distinguish SHL AX,1 (the 8086 version) from SHL
+AX,BYTE 1 (the 286-and-upwards version whose constant happens to be 1).
+<li>Added NetBSD/FreeBSD/OpenBSD's variant of a.out format, complete with
+PIC shared library features.
+<li>Changed NASM's idiosyncratic handling of FCLEX, FDISI, FENI, FINIT,
+FSAVE, FSTCW, FSTENV, and FSTSW to bring it into line with the otherwise
+accepted standard. The previous behaviour, though it was a deliberate
+feature, was a deliberate feature based on a misunderstanding. Apologies
+for the inconvenience.
+<li>Improved the flexibility of ABSOLUTE: you can now give it an expression
+rather than being restricted to a constant, and it can take relocatable
+arguments as well.
+<li>Added the ability for a variable to be declared as EXTERN multiple
+times, and the subsequent definitions are just ignored.
+<li>We now allow instruction prefixes (CS, DS, LOCK, REPZ etc) to be alone
+on a line (without a following instruction).
+<li>Improved sanity checks on whether the arguments to EXTERN, GLOBAL and
+COMMON are valid identifiers.
+<li>Added misc/exebin.mac to allow direct generation of .EXE files by
+hacking up an EXE header using DB and DW; also added test/binexe.asm to
+demonstrate the use of this. Thanks to Yann Guidon for contributing the EXE
+header code.
+<li>ndisasm forgot to check whether the input file had been successfully
+opened. Now it does. Doh!
+<li>Added the Cyrix extensions to the MMX instruction set.
+<li>Added a hinting mechanism to allow [EAX+EBX] and [EBX+EAX] to be
+assembled differently. This is important since [ESI+EBP] and [EBP+ESI] have
+different default base segment registers.
+<li>Added support for the PharLap OMF extension for 4096-byte segment
+alignment.
+</ul>
+<h4><a name="section-C.3.3">C.3.3 Version 0.95 released July 1997</a></h4>
+<ul>
+<li>Fixed yet another ELF bug. This one manifested if the user relied on
+the default segment, and attempted to define global symbols without first
+explicitly declaring the target segment.
+<li>Added makefiles (for NASM and the RDF tools) to build Win32 console
+apps under Symantec C++. Donated by Mark Junker.
+<li>Added `macros.bas' and `insns.bas', QBasic versions of the Perl scripts
+that convert `standard.mac' to `macros.c' and convert `insns.dat' to
+`insnsa.c' and `insnsd.c'. Also thanks to Mark Junker.
+<li>Changed the diassembled forms of the conditional instructions so that
+JB is now emitted as JC, and other similar changes. Suggested list by
+Ulrich Doewich.
+<li>Added `@' to the list of valid characters to begin an identifier with.
+<li>Documentary changes, notably the addition of the `Common Problems'
+section in nasm.doc.
+<li>Fixed a bug relating to 32-bit PC-relative fixups in OBJ.
+<li>Fixed a bug in perm_copy() in labels.c which was causing exceptions in
+cleanup_labels() on some systems.
+<li>Positivity sanity check in TIMES argument changed from a warning to an
+error following a further complaint.
+<li>Changed the acceptable limits on byte and word operands to allow things
+like `~10111001b' to work.
+<li>Fixed a major problem in the preprocessor which caused seg-faults if
+macro definitions contained blank lines or comment-only lines.
+<li>Fixed inadequate error checking on the commas separating the arguments
+to `db', `dw' etc.
+<li>Fixed a crippling bug in the handling of macros with operand counts
+defined with a `+' modifier.
+<li>Fixed a bug whereby object file formats which stored the input file
+name in the output file (such as OBJ and COFF) weren't doing so correctly
+when the output file name was specified on the command line.
+<li>Removed [INC] and [INCLUDE] support for good, since they were obsolete
+anyway.
+<li>Fixed a bug in OBJ which caused all fixups to be output in 16-bit
+(old-format) FIXUPP records, rather than putting the 32-bit ones in
+FIXUPP32 (new-format) records.
+<li>Added, tentatively, OS/2 object file support (as a minor variant on
+OBJ).
+<li>Updates to Fox Cutter's Borland C makefile, Makefile.bc2.
+<li>Removed a spurious second fclose() on the output file.
+<li>Added the `-s' command line option to redirect all messages which would
+go to stderr (errors, help text) to stdout instead.
+<li>Added the `-w' command line option to selectively suppress some classes
+of assembly warning messages.
+<li>Added the `-p' pre-include and `-d' pre-define command-line options.
+<li>Added an include file search path: the `-i' command line option.
+<li>Fixed a silly little preprocessor bug whereby starting a line with a
+`%!' environment-variable reference caused an `unknown directive' error.
+<li>Added the long-awaited listing file support: the `-l' command line
+option.
+<li>Fixed a problem with OBJ format whereby, in the absence of any explicit
+segment definition, non-global symbols declared in the implicit default
+segment generated spurious EXTDEF records in the output.
+<li>Added the NASM environment variable.
+<li>From this version forward, Win32 console-mode binaries will be included
+in the DOS distribution in addition to the 16-bit binaries. Added
+Makefile.vc for this purpose.
+<li>Added `return 0;' to test/objlink.c to prevent compiler warnings.
+<li>Added the __NASM_MAJOR__ and __NASM_MINOR__ standard defines.
+<li>Added an alternative memory-reference syntax in which prefixing an
+operand with `&amp;' is equivalent to enclosing it in square brackets, at
+the request of Fox Cutter.
+<li>Errors in pass two now cause the program to return a non-zero error
+code, which they didn't before.
+<li>Fixed the single-line macro cycle detection, which didn't work at all
+on macros with no parameters (caused an infinite loop). Also changed the
+behaviour of single-line macro cycle detection to work like cpp, so that
+macros like `extrn' as given in the documentation can be implemented.
+<li>Fixed the implementation of WRT, which was too restrictive in that you
+couldn't do `mov ax,[di+abc wrt dgroup]' because (di+abc) wasn't a
+relocatable reference.
+</ul>
+<h4><a name="section-C.3.4">C.3.4 Version 0.94 released April 1997</a></h4>
+<ul>
+<li>Major item: added the macro processor.
+<li>Added undocumented instructions SMI, IBTS, XBTS and LOADALL286. Also
+reorganised CMPXCHG instruction into early-486 and Pentium forms. Thanks to
+Thobias Jones for the information.
+<li>Fixed two more stupid bugs in ELF, which were causing `ld' to continue
+to seg-fault in a lot of non-trivial cases.
+<li>Fixed a seg-fault in the label manager.
+<li>Stopped FBLD and FBSTP from _requiring_ the TWORD keyword, which is the
+only option for BCD loads/stores in any case.
+<li>Ensured FLDCW, FSTCW and FSTSW can cope with the WORD keyword, if
+anyone bothers to provide it. Previously they complained unless no keyword
+at all was present.
+<li>Some forms of FDIV/FDIVR and FSUB/FSUBR were still inverted: a vestige
+of a bug that I thought had been fixed in 0.92. This was fixed, hopefully
+for good this time...
+<li>Another minor phase error (insofar as a phase error can _ever_ be
+minor) fixed, this one occurring in code of the form
+</ul>
+<p><pre>
+ rol ax,forward_reference
+ forward_reference equ 1
+</pre>
+<ul>
+<li>The number supplied to TIMES is now sanity-checked for positivity, and
+also may be greater than 64K (which previously didn't work on 16-bit
+systems).
+<li>Added Watcom C makefiles, and misc/pmw.bat, donated by Dominik Behr.
+<li>Added the INCBIN pseudo-opcode.
+<li>Due to the advent of the preprocessor, the [INCLUDE] and [INC]
+directives have become obsolete. They are still supported in this version,
+with a warning, but won't be in the next.
+<li>Fixed a bug in OBJ format, which caused incorrect object records to be
+output when absolute labels were made global.
+<li>Updates to RDOFF subdirectory, and changes to outrdf.c.
+</ul>
+<h4><a name="section-C.3.5">C.3.5 Version 0.93 released January 1997</a></h4>
+<p>This release went out in a great hurry after semi-crippling bugs were
+found in 0.92.
+<ul>
+<li>Really <em>did</em> fix the stack overflows this time. *blush*
+<li>Had problems with EA instruction sizes changing between passes, when an
+offset contained a forward reference and so 4 bytes were allocated for the
+offset in pass one; by pass two the symbol had been defined and happened to
+be a small absolute value, so only 1 byte got allocated, causing
+instruction size mismatch between passes and hence incorrect address
+calculations. Fixed.
+<li>Stupid bug in the revised ELF section generation fixed (associated
+string-table section for .symtab was hard-coded as 7, even when this didn't
+fit with the real section table). Was causing `ld' to seg-fault under
+Linux.
+<li>Included a new Borland C makefile, Makefile.bc2, donated by Fox Cutter
+&lt;lmb@comtch.iea.com&gt;.
+</ul>
+<h4><a name="section-C.3.6">C.3.6 Version 0.92 released January 1997</a></h4>
+<ul>
+<li>The FDIVP/FDIVRP and FSUBP/FSUBRP pairs had been inverted: this was
+fixed. This also affected the LCC driver.
+<li>Fixed a bug regarding 32-bit effective addresses of the form
+<code><nobr>[other_register+ESP]</nobr></code>.
+<li>Documentary changes, notably documentation of the fact that Borland
+Win32 compilers use `obj' rather than `win32' object format.
+<li>Fixed the COMENT record in OBJ files, which was formatted incorrectly.
+<li>Fixed a bug causing segfaults in large RDF files.
+<li>OBJ format now strips initial periods from segment and group
+definitions, in order to avoid complications with the local label syntax.
+<li>Fixed a bug in disassembling far calls and jumps in NDISASM.
+<li>Added support for user-defined sections in COFF and ELF files.
+<li>Compiled the DOS binaries with a sensible amount of stack, to prevent
+stack overflows on any arithmetic expression containing parentheses.
+<li>Fixed a bug in handling of files that do not terminate in a newline.
+</ul>
+<h4><a name="section-C.3.7">C.3.7 Version 0.91 released November 1996</a></h4>
+<ul>
+<li>Loads of bug fixes.
+<li>Support for RDF added.
+<li>Support for DBG debugging format added.
+<li>Support for 32-bit extensions to Microsoft OBJ format added.
+<li>Revised for Borland C: some variable names changed, makefile added.
+<li>LCC support revised to actually work.
+<li>JMP/CALL NEAR/FAR notation added.
+<li>`a16', `o16', `a32' and `o32' prefixes added.
+<li>Range checking on short jumps implemented.
+<li>MMX instruction support added.
+<li>Negative floating point constant support added.
+<li>Memory handling improved to bypass 64K barrier under DOS.
+<li><code><nobr>$</nobr></code> prefix to force treatment of reserved words
+as identifiers added.
+<li>Default-size mechanism for object formats added.
+<li>Compile-time configurability added.
+<li><code><nobr>#</nobr></code>, <code><nobr>@</nobr></code>,
+<code><nobr>~</nobr></code> and c{?} are now valid characters in labels.
+<li><code><nobr>-e</nobr></code> and <code><nobr>-k</nobr></code> options
+in NDISASM added.
+</ul>
+<h4><a name="section-C.3.8">C.3.8 Version 0.90 released October 1996</a></h4>
+<p>First release version. First support for object file output. Other
+changes from previous version (0.3x) too numerous to document.
+<p align=center><a href="nasmdocb.html">Previous Chapter</a> |
+<a href="nasmdoc0.html">Contents</a> |
+<a href="nasmdoci.html">Index</a>
+</body></html>
diff --git a/doc/html/nasmdoci.html b/doc/html/nasmdoci.html
new file mode 100644
index 0000000..54eb6a6
--- /dev/null
+++ b/doc/html/nasmdoci.html
@@ -0,0 +1,2345 @@
+<html><head><title>NASM Manual</title></head>
+<body><h1 align=center>The Netwide Assembler: NASM</h1>
+
+<p align=center><a href="nasmdoc0.html">Contents</a>
+<p><code><nobr>!</nobr></code> operator, unary:
+<a href="nasmdoc3.html#section-3.5.7">Section 3.5.7</a>
+<br>
+<code><nobr>!=</nobr></code> operator:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>$$</nobr></code> token:
+<a href="nasmdoc3.html#section-3.5">Section 3.5</a>,
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>
+<br>
+<code><nobr>$</nobr></code>, Here token:
+<a href="nasmdoc3.html#section-3.5">Section 3.5</a>
+<br>
+<code><nobr>$</nobr></code>, prefix:
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>,
+<a href="nasmdoc3.html#section-3.4.1">Section 3.4.1</a>,
+<a href="nasmdoc7.html#section-7.13.2">Section 7.13.2</a>
+<br>
+<code><nobr>%</nobr></code> operator:
+<a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>
+<br>
+<code><nobr>%!</nobr></code>:
+<a href="nasmdoc4.html#section-4.10.2">Section 4.10.2</a>
+<br>
+<code><nobr>%$</nobr></code> and <code><nobr>%$$</nobr></code> prefixes:
+<a href="nasmdoc4.html#section-4.7.2">Section 4.7.2</a>
+<br>
+<code><nobr>%%</nobr></code> operator:
+<a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>,
+<a href="nasmdoc4.html#section-4.3.3">Section 4.3.3</a>
+<br>
+<code><nobr>%+</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.4">Section 4.1.4</a>
+<br>
+<code><nobr>%?</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.5">Section 4.1.5</a>
+<br>
+<code><nobr>%??</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.5">Section 4.1.5</a>
+<br>
+<code><nobr>%[</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.3">Section 4.1.3</a>
+<br>
+<code><nobr>&amp;</nobr></code> operator:
+<a href="nasmdoc3.html#section-3.5.3">Section 3.5.3</a>
+<br>
+<code><nobr>&amp;&amp;</nobr></code> operator:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>*</nobr></code> operator:
+<a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>
+<br>
+<code><nobr>+</nobr></code> modifier:
+<a href="nasmdoc4.html#section-4.3.4">Section 4.3.4</a>
+<br>
+<code><nobr>+</nobr></code> operator, binary:
+<a href="nasmdoc3.html#section-3.5.5">Section 3.5.5</a>
+<br>
+<code><nobr>+</nobr></code> operator, unary:
+<a href="nasmdoc3.html#section-3.5.7">Section 3.5.7</a>
+<br>
+<code><nobr>-</nobr></code> operator, binary:
+<a href="nasmdoc3.html#section-3.5.5">Section 3.5.5</a>
+<br>
+<code><nobr>-</nobr></code> operator, unary:
+<a href="nasmdoc3.html#section-3.5.7">Section 3.5.7</a>
+<br>
+<code><nobr>..@</nobr></code> symbol prefix:
+<a href="nasmdoc3.html#section-3.9">Section 3.9</a>,
+<a href="nasmdoc4.html#section-4.3.3">Section 4.3.3</a>
+<br>
+<code><nobr>/</nobr></code> operator:
+<a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>
+<br>
+<code><nobr>//</nobr></code> operator:
+<a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>
+<br>
+<code><nobr>&lt;</nobr></code> operator:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>&lt;&lt;</nobr></code> operator:
+<a href="nasmdoc3.html#section-3.5.4">Section 3.5.4</a>
+<br>
+<code><nobr>&lt;=</nobr></code> operator:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>&lt;&gt;</nobr></code> operator:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>=</nobr></code> operator:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>==</nobr></code> operator:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>&gt;</nobr></code> operator:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>&gt;=</nobr></code> operator:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>&gt;&gt;</nobr></code> operator:
+<a href="nasmdoc3.html#section-3.5.4">Section 3.5.4</a>
+<br>
+<code><nobr>?</nobr></code> MASM syntax:
+<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2</a>
+<br>
+<code><nobr>^</nobr></code> operator:
+<a href="nasmdoc3.html#section-3.5.2">Section 3.5.2</a>
+<br>
+<code><nobr>^^</nobr></code> operator:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>|</nobr></code> operator:
+<a href="nasmdoc3.html#section-3.5.1">Section 3.5.1</a>
+<br>
+<code><nobr>||</nobr></code> operator:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>~</nobr></code> operator:
+<a href="nasmdoc3.html#section-3.5.7">Section 3.5.7</a>
+<br>
+<code><nobr>%0</nobr></code> parameter count:
+<a href="nasmdoc4.html#section-4.3.5">Section 4.3.5</a>,
+<a href="nasmdoc4.html#section-4.3.6">Section 4.3.6</a>
+<br>
+<code><nobr>%+1</nobr></code> and <code><nobr>%-1</nobr></code> syntax:
+<a href="nasmdoc4.html#section-4.3.9">Section 4.3.9</a>
+<br>
+16-bit mode, versus 32-bit mode:
+<a href="nasmdoc6.html#section-6.1">Section 6.1</a>
+<br>
+64-bit displacement: <a href="nasmdo11.html#section-11.2">Section 11.2</a>
+<br>
+64-bit immediate: <a href="nasmdo11.html#section-11.2">Section 11.2</a>
+<br>
+<code><nobr>-a</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.21">Section 2.1.21</a>,
+<a href="nasmdoca.html#section-A.3.3">Section A.3.3</a>
+<br>
+<code><nobr>A16</nobr></code>:
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+<code><nobr>a16</nobr></code>:
+<a href="nasmdo10.html#section-10.3">Section 10.3</a>
+<br>
+<code><nobr>A32</nobr></code>:
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+<code><nobr>a32</nobr></code>:
+<a href="nasmdo10.html#section-10.3">Section 10.3</a>
+<br>
+<code><nobr>A64</nobr></code>:
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+<code><nobr>a64</nobr></code>:
+<a href="nasmdo10.html#section-10.3">Section 10.3</a>
+<br>
+<code><nobr>a86</nobr></code>:
+<a href="nasmdoc1.html#section-1.1.1">Section 1.1.1</a>,
+<a href="nasmdoc2.html#section-2.2">Section 2.2</a>,
+<a href="nasmdoc2.html#section-2.2.2">Section 2.2.2</a>,
+<a href="nasmdoc2.html#section-2.2.6">Section 2.2.6</a>
+<br>
+<code><nobr>ABS</nobr></code>:
+<a href="nasmdoc3.html#section-3.3">Section 3.3</a>
+<br>
+<code><nobr>ABSOLUTE</nobr></code>:
+<a href="nasmdoc6.html#section-6.4">Section 6.4</a>,
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+addition: <a href="nasmdoc3.html#section-3.5.5">Section 3.5.5</a>
+<br>
+addressing, mixed-size:
+<a href="nasmdo10.html#section-10.2">Section 10.2</a>
+<br>
+address-size prefixes: <a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+algebra: <a href="nasmdoc3.html#section-3.3">Section 3.3</a>
+<br>
+<code><nobr>ALIGN</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.12">Section 4.11.12</a>,
+<a href="nasmdoc5.html#section-5.2">Section 5.2</a>,
+<a href="nasmdoc7.html#section-7.1.2">Section 7.1.2</a>,
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+<code><nobr>ALIGN</nobr></code>, smart:
+<a href="nasmdoc5.html#section-5.2">Section 5.2</a>
+<br>
+<code><nobr>ALIGNB</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.12">Section 4.11.12</a>
+<br>
+alignment, in <code><nobr>bin</nobr></code> sections:
+<a href="nasmdoc7.html#section-7.1.2">Section 7.1.2</a>
+<br>
+alignment, in <code><nobr>elf</nobr></code> sections:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+alignment, in <code><nobr>obj</nobr></code> sections:
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+alignment, in <code><nobr>win32</nobr></code> sections:
+<a href="nasmdoc7.html#section-7.5.1">Section 7.5.1</a>
+<br>
+alignment, of <code><nobr>elf</nobr></code> common variables:
+<a href="nasmdoc7.html#section-7.9.6">Section 7.9.6</a>
+<br>
+<code><nobr>ALIGNMODE</nobr></code>:
+<a href="nasmdoc5.html#section-5.2">Section 5.2</a>
+<br>
+<code><nobr>__ALIGNMODE__</nobr></code>:
+<a href="nasmdoc5.html#section-5.2">Section 5.2</a>
+<br>
+<code><nobr>ALINK</nobr></code>:
+<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+<code><nobr>alink.sourceforge.net</nobr></code>:
+<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+<code><nobr>all</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+<code><nobr>alloc</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+alternate register names:
+<a href="nasmdoc5.html#section-5.1">Section 5.1</a>
+<br>
+<code><nobr>alt.lang.asm</nobr></code>:
+<a href="nasmdoc1.html#section-1.1.1">Section 1.1.1</a>
+<br>
+<code><nobr>altreg</nobr></code>:
+<a href="nasmdoc5.html#section-5.1">Section 5.1</a>
+<br>
+ambiguity: <a href="nasmdoc2.html#section-2.2.3">Section 2.2.3</a>
+<br>
+<code><nobr>a.out</nobr></code>, BSD version:
+<a href="nasmdoc7.html#section-7.11">Section 7.11</a>
+<br>
+<code><nobr>a.out</nobr></code>, Linux version:
+<a href="nasmdoc7.html#section-7.10">Section 7.10</a>
+<br>
+<code><nobr>aout</nobr></code>:
+<a href="nasmdoc7.html#section-7.10">Section 7.10</a>
+<br>
+<code><nobr>aoutb</nobr></code>:
+<a href="nasmdoc7.html#section-7.11">Section 7.11</a>,
+<a href="nasmdoc9.html#section-9.2">Section 9.2</a>
+<br>
+<code><nobr>%arg</nobr></code>:
+<a href="nasmdoc4.html#section-4.8.1">Section 4.8.1</a>
+<br>
+<code><nobr>arg</nobr></code>:
+<a href="nasmdoc8.html#section-8.4.5">Section 8.4.5</a>,
+<a href="nasmdoc9.html#section-9.1.4">Section 9.1.4</a>
+<br>
+<code><nobr>as86</nobr></code>:
+<a href="nasmdoc1.html#section-1.1.1">Section 1.1.1</a>,
+<a href="nasmdoc7.html#section-7.12">Section 7.12</a>
+<br>
+assembler directives: <a href="nasmdoc6.html">Chapter 6</a>
+<br>
+assembly-time options:
+<a href="nasmdoc2.html#section-2.1.18">Section 2.1.18</a>
+<br>
+<code><nobr>%assign</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.7">Section 4.1.7</a>
+<br>
+<code><nobr>ASSUME</nobr></code>:
+<a href="nasmdoc2.html#section-2.2.4">Section 2.2.4</a>
+<br>
+<code><nobr>AT</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.11">Section 4.11.11</a>
+<br>
+Autoconf: <a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>
+<br>
+<code><nobr>autoexec.bat</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+<code><nobr>auto-sync</nobr></code>:
+<a href="nasmdoca.html#section-A.3.3">Section A.3.3</a>
+<br>
+<code><nobr>-b</nobr></code>:
+<a href="nasmdoca.html#section-A.3">Section A.3</a>
+<br>
+bin: <a href="nasmdoc2.html#section-2.1.2">Section 2.1.2</a>,
+<a href="nasmdoc7.html#section-7.1">Section 7.1</a>
+<br>
+bin, multisection: <a href="nasmdoc7.html#section-7.1.3">Section 7.1.3</a>
+<br>
+binary: <a href="nasmdoc3.html#section-3.4.1">Section 3.4.1</a>
+<br>
+binary files: <a href="nasmdoc3.html#section-3.2.3">Section 3.2.3</a>
+<br>
+bit shift: <a href="nasmdoc3.html#section-3.5.4">Section 3.5.4</a>
+<br>
+<code><nobr>BITS</nobr></code>:
+<a href="nasmdoc6.html#section-6.1">Section 6.1</a>,
+<a href="nasmdoc7.html#section-7.1">Section 7.1</a>
+<br>
+<code><nobr>__BITS__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.5">Section 4.11.5</a>
+<br>
+bitwise AND: <a href="nasmdoc3.html#section-3.5.3">Section 3.5.3</a>
+<br>
+bitwise OR: <a href="nasmdoc3.html#section-3.5.1">Section 3.5.1</a>
+<br>
+bitwise XOR: <a href="nasmdoc3.html#section-3.5.2">Section 3.5.2</a>
+<br>
+block IFs: <a href="nasmdoc4.html#section-4.7.5">Section 4.7.5</a>
+<br>
+boot loader: <a href="nasmdoc7.html#section-7.1">Section 7.1</a>
+<br>
+boot sector: <a href="nasmdo12.html#section-12.1.3">Section 12.1.3</a>
+<br>
+Borland, Pascal: <a href="nasmdoc8.html#section-8.5">Section 8.5</a>
+<br>
+Borland, Win32 compilers:
+<a href="nasmdoc7.html#section-7.4">Section 7.4</a>
+<br>
+braces, after <code><nobr>%</nobr></code> sign:
+<a href="nasmdoc4.html#section-4.3.8">Section 4.3.8</a>
+<br>
+braces, around macro parameters:
+<a href="nasmdoc4.html#section-4.3">Section 4.3</a>
+<br>
+BSD: <a href="nasmdoc9.html#section-9.2">Section 9.2</a>
+<br>
+<code><nobr>.bss</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>,
+<a href="nasmdoc7.html#section-7.10">Section 7.10</a>,
+<a href="nasmdoc7.html#section-7.11">Section 7.11</a>,
+<a href="nasmdoc7.html#section-7.12">Section 7.12</a>,
+<a href="nasmdoc7.html#section-7.13">Section 7.13</a>
+<br>
+bugs: <a href="nasmdo12.html#section-12.2">Section 12.2</a>
+<br>
+<code><nobr>bugtracker</nobr></code>:
+<a href="nasmdo12.html#section-12.2">Section 12.2</a>
+<br>
+<code><nobr>BYTE</nobr></code>:
+<a href="nasmdo12.html#section-12.1.1">Section 12.1.1</a>
+<br>
+C calling convention:
+<a href="nasmdoc8.html#section-8.4.3">Section 8.4.3</a>,
+<a href="nasmdoc9.html#section-9.1.2">Section 9.1.2</a>
+<br>
+C symbol names: <a href="nasmdoc8.html#section-8.4.1">Section 8.4.1</a>
+<br>
+<code><nobr>c16.mac</nobr></code>:
+<a href="nasmdoc8.html#section-8.4.5">Section 8.4.5</a>,
+<a href="nasmdoc8.html#section-8.5.3">Section 8.5.3</a>
+<br>
+<code><nobr>c32.mac</nobr></code>:
+<a href="nasmdoc9.html#section-9.1.4">Section 9.1.4</a>
+<br>
+<code><nobr>CALL FAR</nobr></code>:
+<a href="nasmdoc3.html#section-3.6">Section 3.6</a>
+<br>
+case sensitivity: <a href="nasmdoc2.html#section-2.2.1">Section 2.2.1</a>,
+<a href="nasmdoc4.html#section-4.1.1">Section 4.1.1</a>,
+<a href="nasmdoc4.html#section-4.1.2">Section 4.1.2</a>,
+<a href="nasmdoc4.html#section-4.1.7">Section 4.1.7</a>,
+<a href="nasmdoc4.html#section-4.3">Section 4.3</a>,
+<a href="nasmdoc4.html#section-4.3.1">Section 4.3.1</a>,
+<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5</a>,
+<a href="nasmdoc7.html#section-7.4.3">Section 7.4.3</a>
+<br>
+changing sections: <a href="nasmdoc6.html#section-6.3">Section 6.3</a>
+<br>
+character constant:
+<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1</a>,
+<a href="nasmdoc3.html#section-3.4.3">Section 3.4.3</a>
+<br>
+character strings: <a href="nasmdoc3.html#section-3.4.2">Section 3.4.2</a>
+<br>
+circular references:
+<a href="nasmdoc4.html#section-4.1.1">Section 4.1.1</a>
+<br>
+<code><nobr>CLASS</nobr></code>:
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+<code><nobr>%clear</nobr></code>:
+<a href="nasmdoc4.html#section-4.11">Section 4.11</a>
+<br>
+<code><nobr>coff</nobr></code>:
+<a href="nasmdoc7.html#section-7.7">Section 7.7</a>
+<br>
+colon: <a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+<code><nobr>.COM</nobr></code>:
+<a href="nasmdoc7.html#section-7.1">Section 7.1</a>,
+<a href="nasmdoc8.html#section-8.2">Section 8.2</a>
+<br>
+command-line: <a href="nasmdoc2.html#section-2.1">Section 2.1</a>,
+<a href="nasmdoc7.html">Chapter 7</a>
+<br>
+commas in macro parameters:
+<a href="nasmdoc4.html#section-4.3.4">Section 4.3.4</a>
+<br>
+<code><nobr>.comment</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>COMMON</nobr></code>:
+<a href="nasmdoc6.html#section-6.7">Section 6.7</a>,
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+<code><nobr>COMMON</nobr></code>, <code><nobr>elf</nobr></code> extensions
+to: <a href="nasmdoc7.html#section-7.9.6">Section 7.9.6</a>
+<br>
+<code><nobr>COMMON</nobr></code>, <code><nobr>obj</nobr></code> extensions
+to: <a href="nasmdoc7.html#section-7.4.8">Section 7.4.8</a>
+<br>
+Common Object File Format:
+<a href="nasmdoc7.html#section-7.7">Section 7.7</a>
+<br>
+common variables: <a href="nasmdoc6.html#section-6.7">Section 6.7</a>
+<br>
+common variables, alignment in <code><nobr>elf</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.6">Section 7.9.6</a>
+<br>
+common variables, element size:
+<a href="nasmdoc7.html#section-7.4.8">Section 7.4.8</a>
+<br>
+<code><nobr>comp.lang.asm.x86</nobr></code>:
+<a href="nasmdoc1.html#section-1.1.1">Section 1.1.1</a>,
+<a href="nasmdoc1.html#section-1.2">Section 1.2</a>
+<br>
+<code><nobr>comp.os.msdos.programmer</nobr></code>:
+<a href="nasmdoc8.html#section-8.3">Section 8.3</a>
+<br>
+concatenating macro parameters:
+<a href="nasmdoc4.html#section-4.3.8">Section 4.3.8</a>
+<br>
+concatenating strings:
+<a href="nasmdoc4.html#section-4.2.1">Section 4.2.1</a>
+<br>
+condition codes as macro parameters:
+<a href="nasmdoc4.html#section-4.3.9">Section 4.3.9</a>
+<br>
+conditional assembly: <a href="nasmdoc4.html#section-4.4">Section 4.4</a>
+<br>
+conditional jumps:
+<a href="nasmdo12.html#section-12.1.2">Section 12.1.2</a>
+<br>
+conditional-return macro:
+<a href="nasmdoc4.html#section-4.3.9">Section 4.3.9</a>
+<br>
+<code><nobr>configure</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>
+<br>
+constants: <a href="nasmdoc3.html#section-3.4">Section 3.4</a>
+<br>
+context stack: <a href="nasmdoc4.html#section-4.7">Section 4.7</a>,
+<a href="nasmdoc4.html#section-4.7.5">Section 4.7.5</a>
+<br>
+context-local labels:
+<a href="nasmdoc4.html#section-4.7.2">Section 4.7.2</a>
+<br>
+context-local single-line macros:
+<a href="nasmdoc4.html#section-4.7.3">Section 4.7.3</a>
+<br>
+counting macro parameters:
+<a href="nasmdoc4.html#section-4.3.6">Section 4.3.6</a>
+<br>
+<code><nobr>CPU</nobr></code>:
+<a href="nasmdoc6.html#section-6.8">Section 6.8</a>
+<br>
+<code><nobr>CPUID</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.3">Section 3.4.3</a>
+<br>
+creating contexts: <a href="nasmdoc4.html#section-4.7.1">Section 4.7.1</a>
+<br>
+critical expression:
+<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2</a>,
+<a href="nasmdoc3.html#section-3.8">Section 3.8</a>,
+<a href="nasmdoc4.html#section-4.1.7">Section 4.1.7</a>,
+<a href="nasmdoc6.html#section-6.4">Section 6.4</a>
+<br>
+<code><nobr>-D</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.18">Section 2.1.18</a>
+<br>
+<code><nobr>-d</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.18">Section 2.1.18</a>
+<br>
+daily development snapshots:
+<a href="nasmdoc1.html#section-1.2">Section 1.2</a>
+<br>
+<code><nobr>.data</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>,
+<a href="nasmdoc7.html#section-7.10">Section 7.10</a>,
+<a href="nasmdoc7.html#section-7.11">Section 7.11</a>,
+<a href="nasmdoc7.html#section-7.12">Section 7.12</a>,
+<a href="nasmdoc7.html#section-7.13">Section 7.13</a>
+<br>
+<code><nobr>_DATA</nobr></code>:
+<a href="nasmdoc8.html#section-8.4.2">Section 8.4.2</a>
+<br>
+<code><nobr>data</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>,
+<a href="nasmdoc7.html#section-7.13.3">Section 7.13.3</a>
+<br>
+data structure: <a href="nasmdoc8.html#section-8.4.4">Section 8.4.4</a>,
+<a href="nasmdoc9.html#section-9.1.3">Section 9.1.3</a>
+<br>
+<code><nobr>__DATE__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.7">Section 4.11.7</a>
+<br>
+<code><nobr>__DATE_NUM__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.7">Section 4.11.7</a>
+<br>
+<code><nobr>DB</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1</a>,
+<a href="nasmdoc3.html#section-3.4.4">Section 3.4.4</a>,
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>dbg</nobr></code>:
+<a href="nasmdoc7.html#section-7.14">Section 7.14</a>
+<br>
+<code><nobr>DD</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1</a>,
+<a href="nasmdoc3.html#section-3.4.4">Section 3.4.4</a>,
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+debug information:
+<a href="nasmdoc2.html#section-2.1.12">Section 2.1.12</a>
+<br>
+debug information format:
+<a href="nasmdoc2.html#section-2.1.11">Section 2.1.11</a>
+<br>
+declaring structures:
+<a href="nasmdoc4.html#section-4.11.10">Section 4.11.10</a>
+<br>
+<code><nobr>DEFAULT</nobr></code>:
+<a href="nasmdoc6.html#section-6.2">Section 6.2</a>
+<br>
+<code><nobr>default</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>
+<br>
+default macro parameters:
+<a href="nasmdoc4.html#section-4.3.5">Section 4.3.5</a>
+<br>
+default name: <a href="nasmdoc7.html">Chapter 7</a>
+<br>
+default-<code><nobr>WRT</nobr></code> mechanism:
+<a href="nasmdoc7.html#section-7.4.7">Section 7.4.7</a>
+<br>
+<code><nobr>%define</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.18">Section 2.1.18</a>,
+<a href="nasmdoc4.html#section-4.1.1">Section 4.1.1</a>
+<br>
+defining sections: <a href="nasmdoc6.html#section-6.3">Section 6.3</a>
+<br>
+<code><nobr>%defstr</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.8">Section 4.1.8</a>
+<br>
+<code><nobr>%deftok</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.9">Section 4.1.9</a>
+<br>
+<code><nobr>%depend</nobr></code>:
+<a href="nasmdoc4.html#section-4.6.3">Section 4.6.3</a>
+<br>
+design goals: <a href="nasmdoc2.html#section-2.2.2">Section 2.2.2</a>
+<br>
+DevPac: <a href="nasmdoc3.html#section-3.2.3">Section 3.2.3</a>,
+<a href="nasmdoc3.html#section-3.9">Section 3.9</a>
+<br>
+disabling listing expansion:
+<a href="nasmdoc4.html#section-4.3.10">Section 4.3.10</a>
+<br>
+division: <a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>
+<br>
+DJGPP: <a href="nasmdoc7.html#section-7.7">Section 7.7</a>,
+<a href="nasmdoc9.html">Chapter 9</a>
+<br>
+<code><nobr>djlink</nobr></code>:
+<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+DLL symbols, exporting:
+<a href="nasmdoc7.html#section-7.4.5">Section 7.4.5</a>
+<br>
+DLL symbols, importing:
+<a href="nasmdoc7.html#section-7.4.4">Section 7.4.4</a>
+<br>
+<code><nobr>DO</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1</a>,
+<a href="nasmdoc3.html#section-3.4.4">Section 3.4.4</a>,
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+DOS: <a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>,
+<a href="nasmdoc2.html#section-2.1.14">Section 2.1.14</a>,
+<a href="nasmdoc2.html#section-2.1.15">Section 2.1.15</a>
+<br>
+DOS archive:
+<br>
+DOS source archive: <a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+<code><nobr>DQ</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1</a>,
+<a href="nasmdoc3.html#section-3.4.4">Section 3.4.4</a>,
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>.drectve</nobr></code>:
+<a href="nasmdoc7.html#section-7.5.1">Section 7.5.1</a>
+<br>
+<code><nobr>DT</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1</a>,
+<a href="nasmdoc3.html#section-3.4.4">Section 3.4.4</a>,
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>DUP</nobr></code>:
+<a href="nasmdoc2.html#section-2.2.7">Section 2.2.7</a>,
+<a href="nasmdoc3.html#section-3.2.5">Section 3.2.5</a>
+<br>
+<code><nobr>DW</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1</a>,
+<a href="nasmdoc3.html#section-3.4.4">Section 3.4.4</a>,
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>DWORD</nobr></code>:
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+<code><nobr>DY</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1</a>,
+<a href="nasmdoc3.html#section-3.4.4">Section 3.4.4</a>
+<br>
+<code><nobr>-E</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.20">Section 2.1.20</a>
+<br>
+<code><nobr>-e</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.20">Section 2.1.20</a>,
+<a href="nasmdoca.html#section-A.3.4">Section A.3.4</a>
+<br>
+effective addresses: <a href="nasmdoc3.html#section-3.1">Section 3.1</a>,
+<a href="nasmdoc3.html#section-3.3">Section 3.3</a>
+<br>
+element size, in common variables:
+<a href="nasmdoc7.html#section-7.4.8">Section 7.4.8</a>
+<br>
+ELF: <a href="nasmdoc7.html#section-7.9">Section 7.9</a>
+<br>
+ELF, shared libraries:
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>
+<br>
+ELF, 16-bit code and:
+<a href="nasmdoc7.html#section-7.9.7">Section 7.9.7</a>
+<br>
+elf, debug formats and:
+<a href="nasmdoc7.html#section-7.9.8">Section 7.9.8</a>
+<br>
+<code><nobr>elf32</nobr></code>:
+<a href="nasmdoc7.html#section-7.9">Section 7.9</a>
+<br>
+<code><nobr>elf64</nobr></code>:
+<a href="nasmdoc7.html#section-7.9">Section 7.9</a>
+<br>
+<code><nobr>%elif</nobr></code>:
+<a href="nasmdoc4.html#section-4.4">Section 4.4</a>,
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>%elifctx</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.3">Section 4.4.3</a>
+<br>
+<code><nobr>%elifdef</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.1">Section 4.4.1</a>
+<br>
+<code><nobr>%elifempty</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.8">Section 4.4.8</a>
+<br>
+<code><nobr>%elifid</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%elifidn</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5</a>
+<br>
+<code><nobr>%elifidni</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5</a>
+<br>
+<code><nobr>%elifmacro</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.2">Section 4.4.2</a>
+<br>
+<code><nobr>%elifn</nobr></code>:
+<a href="nasmdoc4.html#section-4.4">Section 4.4</a>,
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>%elifnctx</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.3">Section 4.4.3</a>
+<br>
+<code><nobr>%elifndef</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.1">Section 4.4.1</a>
+<br>
+<code><nobr>%elifnempty</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.8">Section 4.4.8</a>
+<br>
+<code><nobr>%elifnid</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%elifnidn</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5</a>
+<br>
+<code><nobr>%elifnidni</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5</a>
+<br>
+<code><nobr>%elifnmacro</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.2">Section 4.4.2</a>
+<br>
+<code><nobr>%elifnnum</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%elifnstr</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%elifntoken</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.7">Section 4.4.7</a>
+<br>
+<code><nobr>%elifnum</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%elifstr</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%eliftoken</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.7">Section 4.4.7</a>
+<br>
+<code><nobr>%else</nobr></code>:
+<a href="nasmdoc4.html#section-4.4">Section 4.4</a>
+<br>
+<code><nobr>endproc</nobr></code>:
+<a href="nasmdoc8.html#section-8.4.5">Section 8.4.5</a>,
+<a href="nasmdoc9.html#section-9.1.4">Section 9.1.4</a>
+<br>
+<code><nobr>%endrep</nobr></code>:
+<a href="nasmdoc4.html#section-4.5">Section 4.5</a>
+<br>
+<code><nobr>ENDSTRUC</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.10">Section 4.11.10</a>,
+<a href="nasmdoc6.html#section-6.4">Section 6.4</a>
+<br>
+environment: <a href="nasmdoc2.html#section-2.1.28">Section 2.1.28</a>
+<br>
+<code><nobr>EQU</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.4">Section 3.2.4</a>
+<br>
+<code><nobr>%error</nobr></code>:
+<a href="nasmdoc4.html#section-4.9">Section 4.9</a>
+<br>
+<code><nobr>error</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+error messages: <a href="nasmdoc2.html#section-2.1.14">Section 2.1.14</a>,
+<a href="nasmdoc2.html#section-2.1.15">Section 2.1.15</a>
+<br>
+error reporting format:
+<a href="nasmdoc2.html#section-2.1.13">Section 2.1.13</a>
+<br>
+escape sequences: <a href="nasmdoc3.html#section-3.4.2">Section 3.4.2</a>
+<br>
+<code><nobr>EVEN</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.12">Section 4.11.12</a>
+<br>
+exact matches: <a href="nasmdoc4.html#section-4.3.11">Section 4.3.11</a>
+<br>
+<code><nobr>.EXE</nobr></code>:
+<a href="nasmdoc7.html#section-7.4">Section 7.4</a>,
+<a href="nasmdoc8.html#section-8.1">Section 8.1</a>
+<br>
+<code><nobr>EXE2BIN</nobr></code>:
+<a href="nasmdoc8.html#section-8.2.2">Section 8.2.2</a>
+<br>
+<code><nobr>EXE_begin</nobr></code>:
+<a href="nasmdoc8.html#section-8.1.2">Section 8.1.2</a>
+<br>
+<code><nobr>exebin.mac</nobr></code>:
+<a href="nasmdoc8.html#section-8.1.2">Section 8.1.2</a>
+<br>
+<code><nobr>exec</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+Executable and Linkable Format:
+<a href="nasmdoc7.html#section-7.9">Section 7.9</a>
+<br>
+<code><nobr>EXE_end</nobr></code>:
+<a href="nasmdoc8.html#section-8.1.2">Section 8.1.2</a>
+<br>
+<code><nobr>EXE_stack</nobr></code>:
+<a href="nasmdoc8.html#section-8.1.2">Section 8.1.2</a>
+<br>
+<code><nobr>%exitmacro</nobr></code>:
+<a href="nasmdoc4.html#section-4.3.12">Section 4.3.12</a>
+<br>
+<code><nobr>%exitrep</nobr></code>:
+<a href="nasmdoc4.html#section-4.5">Section 4.5</a>
+<br>
+<code><nobr>EXPORT</nobr></code>:
+<a href="nasmdoc7.html#section-7.4.5">Section 7.4.5</a>
+<br>
+<code><nobr>export</nobr></code>:
+<a href="nasmdoc7.html#section-7.13.3">Section 7.13.3</a>
+<br>
+exporting symbols: <a href="nasmdoc6.html#section-6.6">Section 6.6</a>
+<br>
+expressions: <a href="nasmdoc2.html#section-2.1.20">Section 2.1.20</a>,
+<a href="nasmdoc3.html#section-3.5">Section 3.5</a>
+<br>
+extension: <a href="nasmdoc2.html#section-2.1.1">Section 2.1.1</a>,
+<a href="nasmdoc7.html">Chapter 7</a>
+<br>
+<code><nobr>EXTERN</nobr></code>:
+<a href="nasmdoc6.html#section-6.5">Section 6.5</a>
+<br>
+<code><nobr>EXTERN</nobr></code>, <code><nobr>obj</nobr></code> extensions
+to: <a href="nasmdoc7.html#section-7.4.7">Section 7.4.7</a>
+<br>
+<code><nobr>EXTERN</nobr></code>, <code><nobr>rdf</nobr></code> extensions
+to: <a href="nasmdoc7.html#section-7.13.4">Section 7.13.4</a>
+<br>
+extracting substrings:
+<a href="nasmdoc4.html#section-4.2.3">Section 4.2.3</a>
+<br>
+<code><nobr>-F</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.11">Section 2.1.11</a>
+<br>
+<code><nobr>-f</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.2">Section 2.1.2</a>,
+<a href="nasmdoc7.html">Chapter 7</a>
+<br>
+far call: <a href="nasmdoc2.html#section-2.2.5">Section 2.2.5</a>
+<br>
+far common variables:
+<a href="nasmdoc7.html#section-7.4.8">Section 7.4.8</a>
+<br>
+far pointer: <a href="nasmdoc3.html#section-3.6">Section 3.6</a>
+<br>
+<code><nobr>FARCODE</nobr></code>:
+<a href="nasmdoc8.html#section-8.4.5">Section 8.4.5</a>,
+<a href="nasmdoc8.html#section-8.5.3">Section 8.5.3</a>
+<br>
+<code><nobr>%fatal</nobr></code>:
+<a href="nasmdoc4.html#section-4.9">Section 4.9</a>
+<br>
+<code><nobr>__FILE__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.4">Section 4.11.4</a>
+<br>
+<code><nobr>FLAT</nobr></code>:
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+flat memory model: <a href="nasmdoc9.html">Chapter 9</a>
+<br>
+flat-form binary: <a href="nasmdoc7.html#section-7.1">Section 7.1</a>
+<br>
+<code><nobr>FLOAT</nobr></code>:
+<a href="nasmdoc6.html#section-6.9">Section 6.9</a>
+<br>
+<code><nobr>__FLOAT__</nobr></code>:
+<a href="nasmdoc6.html#section-6.9">Section 6.9</a>
+<br>
+<code><nobr>__float128h__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>__float128l__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>__float16__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>__float32__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>__float64__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>__float8__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>__float80e__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>__float80m__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>__FLOAT_DAZ__</nobr></code>:
+<a href="nasmdoc6.html#section-6.9">Section 6.9</a>
+<br>
+<code><nobr>float-denorm</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+floating-point, constants:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>,
+<a href="nasmdoc6.html#section-6.9">Section 6.9</a>
+<br>
+floating-point, packed BCD constants:
+<a href="nasmdoc3.html#section-3.4.7">Section 3.4.7</a>
+<br>
+floating-point: <a href="nasmdoc2.html#section-2.2.6">Section 2.2.6</a>,
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>,
+<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1</a>,
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>float-overflow</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+<code><nobr>__FLOAT_ROUND__</nobr></code>:
+<a href="nasmdoc6.html#section-6.9">Section 6.9</a>
+<br>
+<code><nobr>float-toolong</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+<code><nobr>float-underflow</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+<code><nobr>follows=</nobr></code>:
+<a href="nasmdoc7.html#section-7.1.3">Section 7.1.3</a>
+<br>
+format-specific directives: <a href="nasmdoc6.html">Chapter 6</a>
+<br>
+frame pointer: <a href="nasmdoc8.html#section-8.4.3">Section 8.4.3</a>,
+<a href="nasmdoc8.html#section-8.5.1">Section 8.5.1</a>,
+<a href="nasmdoc9.html#section-9.1.2">Section 9.1.2</a>
+<br>
+FreeBSD: <a href="nasmdoc7.html#section-7.11">Section 7.11</a>,
+<a href="nasmdoc9.html#section-9.2">Section 9.2</a>
+<br>
+FreeLink: <a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+<code><nobr>ftp.simtel.net</nobr></code>:
+<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+<code><nobr>function</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>,
+<a href="nasmdoc7.html#section-7.13.3">Section 7.13.3</a>
+<br>
+functions, C calling convention:
+<a href="nasmdoc8.html#section-8.4.3">Section 8.4.3</a>,
+<a href="nasmdoc9.html#section-9.1.2">Section 9.1.2</a>
+<br>
+functions, Pascal calling convention:
+<a href="nasmdoc8.html#section-8.5.1">Section 8.5.1</a>
+<br>
+<code><nobr>-g</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.12">Section 2.1.12</a>
+<br>
+<code><nobr>gas</nobr></code>:
+<a href="nasmdoc1.html#section-1.1.1">Section 1.1.1</a>
+<br>
+<code><nobr>gcc</nobr></code>:
+<a href="nasmdoc1.html#section-1.1.1">Section 1.1.1</a>
+<br>
+<code><nobr>GLOBAL</nobr></code>:
+<a href="nasmdoc6.html#section-6.6">Section 6.6</a>
+<br>
+<code><nobr>GLOBAL</nobr></code>, <code><nobr>aoutb</nobr></code>
+extensions to: <a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>
+<br>
+<code><nobr>GLOBAL</nobr></code>, <code><nobr>elf</nobr></code> extensions
+to: <a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>
+<br>
+<code><nobr>GLOBAL</nobr></code>, <code><nobr>rdf</nobr></code> extensions
+to: <a href="nasmdoc7.html#section-7.13.3">Section 7.13.3</a>
+<br>
+global offset table: <a href="nasmdoc9.html#section-9.2">Section 9.2</a>
+<br>
+<code><nobr>_GLOBAL_OFFSET_TABLE_</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>
+<br>
+<code><nobr>gnu-elf-extensions</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+<code><nobr>..got</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>
+<br>
+<code><nobr>GOT</nobr></code> relocations:
+<a href="nasmdoc9.html#section-9.2.3">Section 9.2.3</a>
+<br>
+GOT: <a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>,
+<a href="nasmdoc9.html#section-9.2">Section 9.2</a>
+<br>
+<code><nobr>..gotoff</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>
+<br>
+<code><nobr>GOTOFF</nobr></code> relocations:
+<a href="nasmdoc9.html#section-9.2.2">Section 9.2.2</a>
+<br>
+<code><nobr>..gotpc</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>
+<br>
+<code><nobr>GOTPC</nobr></code> relocations:
+<a href="nasmdoc9.html#section-9.2.1">Section 9.2.1</a>
+<br>
+<code><nobr>..gottpoff</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.4">Section 7.9.4</a>
+<br>
+graphics: <a href="nasmdoc3.html#section-3.2.3">Section 3.2.3</a>
+<br>
+greedy macro parameters:
+<a href="nasmdoc4.html#section-4.3.4">Section 4.3.4</a>
+<br>
+<code><nobr>GROUP</nobr></code>:
+<a href="nasmdoc7.html#section-7.4.2">Section 7.4.2</a>
+<br>
+groups: <a href="nasmdoc3.html#section-3.6">Section 3.6</a>
+<br>
+<code><nobr>-h</nobr></code>:
+<a href="nasmdoca.html#section-A.3">Section A.3</a>
+<br>
+hexadecimal: <a href="nasmdoc3.html#section-3.4.1">Section 3.4.1</a>
+<br>
+<code><nobr>hidden</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>
+<br>
+hybrid syntaxes: <a href="nasmdoc2.html#section-2.2.2">Section 2.2.2</a>
+<br>
+<code><nobr>-I</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.16">Section 2.1.16</a>
+<br>
+<code><nobr>-i</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.16">Section 2.1.16</a>,
+<a href="nasmdoca.html#section-A.3.3">Section A.3.3</a>
+<br>
+<code><nobr>%iassign</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.7">Section 4.1.7</a>
+<br>
+<code><nobr>%idefine</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.1">Section 4.1.1</a>
+<br>
+<code><nobr>%idefstr</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.8">Section 4.1.8</a>
+<br>
+<code><nobr>%ideftok</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.9">Section 4.1.9</a>
+<br>
+<code><nobr>IEND</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.11">Section 4.11.11</a>
+<br>
+<code><nobr>%if</nobr></code>:
+<a href="nasmdoc4.html#section-4.4">Section 4.4</a>,
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>%ifctx</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.3">Section 4.4.3</a>,
+<a href="nasmdoc4.html#section-4.7.5">Section 4.7.5</a>
+<br>
+<code><nobr>%ifdef</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.1">Section 4.4.1</a>
+<br>
+<code><nobr>%ifempty</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.8">Section 4.4.8</a>
+<br>
+<code><nobr>%ifid</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%ifidn</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5</a>
+<br>
+<code><nobr>%ifidni</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5</a>
+<br>
+<code><nobr>%ifmacro</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.2">Section 4.4.2</a>
+<br>
+<code><nobr>%ifn</nobr></code>:
+<a href="nasmdoc4.html#section-4.4">Section 4.4</a>,
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>%ifnctx</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.3">Section 4.4.3</a>
+<br>
+<code><nobr>%ifndef</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.1">Section 4.4.1</a>
+<br>
+<code><nobr>%ifnempty</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.8">Section 4.4.8</a>
+<br>
+<code><nobr>%ifnid</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%ifnidn</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5</a>
+<br>
+<code><nobr>%ifnidni</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5</a>
+<br>
+<code><nobr>%ifnmacro</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.2">Section 4.4.2</a>
+<br>
+<code><nobr>%ifnnum</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%ifnstr</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%ifntoken</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.7">Section 4.4.7</a>
+<br>
+<code><nobr>%ifnum</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%ifstr</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>%iftoken</nobr></code>:
+<a href="nasmdoc4.html#section-4.4.7">Section 4.4.7</a>
+<br>
+<code><nobr>%imacro</nobr></code>:
+<a href="nasmdoc4.html#section-4.3">Section 4.3</a>
+<br>
+<code><nobr>IMPORT</nobr></code>:
+<a href="nasmdoc7.html#section-7.4.4">Section 7.4.4</a>
+<br>
+import library: <a href="nasmdoc7.html#section-7.4.4">Section 7.4.4</a>
+<br>
+importing symbols: <a href="nasmdoc6.html#section-6.5">Section 6.5</a>
+<br>
+<code><nobr>INCBIN</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.3">Section 3.2.3</a>,
+<a href="nasmdoc3.html#section-3.4.4">Section 3.4.4</a>
+<br>
+<code><nobr>%include</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.16">Section 2.1.16</a>,
+<a href="nasmdoc2.html#section-2.1.17">Section 2.1.17</a>,
+<a href="nasmdoc4.html#section-4.6.1">Section 4.6.1</a>
+<br>
+include search path:
+<a href="nasmdoc2.html#section-2.1.16">Section 2.1.16</a>
+<br>
+including other files:
+<a href="nasmdoc4.html#section-4.6.1">Section 4.6.1</a>
+<br>
+inefficient code: <a href="nasmdo12.html#section-12.1.1">Section 12.1.1</a>
+<br>
+infinite loop: <a href="nasmdoc3.html#section-3.5">Section 3.5</a>
+<br>
+<code><nobr>__Infinity__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+infinity: <a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+informational section:
+<a href="nasmdoc7.html#section-7.5.1">Section 7.5.1</a>
+<br>
+<code><nobr>INSTALL</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>
+<br>
+installing: <a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+instances of structures:
+<a href="nasmdoc4.html#section-4.11.11">Section 4.11.11</a>
+<br>
+instruction list: <a href="nasmdocb.html">Appendix B</a>
+<br>
+intel hex: <a href="nasmdoc7.html#section-7.2">Section 7.2</a>
+<br>
+Intel number formats:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+<code><nobr>internal</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>
+<br>
+<code><nobr>%irmacro</nobr></code>:
+<a href="nasmdoc4.html#section-4.3.1">Section 4.3.1</a>
+<br>
+<code><nobr>ISTRUC</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.11">Section 4.11.11</a>
+<br>
+iterating over macro parameters:
+<a href="nasmdoc4.html#section-4.3.7">Section 4.3.7</a>
+<br>
+<code><nobr>ith</nobr></code>:
+<a href="nasmdoc7.html#section-7.2">Section 7.2</a>
+<br>
+<code><nobr>%ixdefine</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.2">Section 4.1.2</a>
+<br>
+<code><nobr>Jcc NEAR</nobr></code>:
+<a href="nasmdo12.html#section-12.1.2">Section 12.1.2</a>
+<br>
+<code><nobr>JMP DWORD</nobr></code>:
+<a href="nasmdo10.html#section-10.1">Section 10.1</a>
+<br>
+jumps, mixed-size: <a href="nasmdo10.html#section-10.1">Section 10.1</a>
+<br>
+<code><nobr>-k</nobr></code>:
+<a href="nasmdoca.html#section-A.3.4">Section A.3.4</a>
+<br>
+<code><nobr>-l</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.3">Section 2.1.3</a>
+<br>
+label prefix: <a href="nasmdoc3.html#section-3.9">Section 3.9</a>
+<br>
+<code><nobr>.lbss</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>ld86</nobr></code>:
+<a href="nasmdoc7.html#section-7.12">Section 7.12</a>
+<br>
+<code><nobr>.ldata</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>LIBRARY</nobr></code>:
+<a href="nasmdoc7.html#section-7.13.1">Section 7.13.1</a>
+<br>
+license: <a href="nasmdoc1.html#section-1.1.2">Section 1.1.2</a>
+<br>
+<code><nobr>%line</nobr></code>:
+<a href="nasmdoc4.html#section-4.10.1">Section 4.10.1</a>
+<br>
+<code><nobr>__LINE__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.4">Section 4.11.4</a>
+<br>
+linker, free: <a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+Linux, <code><nobr>a.out</nobr></code>:
+<a href="nasmdoc7.html#section-7.10">Section 7.10</a>
+<br>
+Linux, <code><nobr>as86</nobr></code>:
+<a href="nasmdoc7.html#section-7.12">Section 7.12</a>
+<br>
+Linux, ELF: <a href="nasmdoc7.html#section-7.9">Section 7.9</a>
+<br>
+listing file: <a href="nasmdoc2.html#section-2.1.3">Section 2.1.3</a>
+<br>
+little-endian: <a href="nasmdoc3.html#section-3.4.3">Section 3.4.3</a>
+<br>
+<code><nobr>%local</nobr></code>:
+<a href="nasmdoc4.html#section-4.8.3">Section 4.8.3</a>
+<br>
+local labels: <a href="nasmdoc3.html#section-3.9">Section 3.9</a>
+<br>
+logical AND: <a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+logical negation: <a href="nasmdoc3.html#section-3.5.7">Section 3.5.7</a>
+<br>
+logical OR: <a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+logical XOR: <a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+<code><nobr>.lrodata</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>-M</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.4">Section 2.1.4</a>
+<br>
+Mach, object file format:
+<a href="nasmdoc7.html#section-7.8">Section 7.8</a>
+<br>
+Mach-O: <a href="nasmdoc7.html#section-7.8">Section 7.8</a>
+<br>
+<code><nobr>macho</nobr></code>:
+<a href="nasmdoc7.html#section-7.8">Section 7.8</a>
+<br>
+<code><nobr>macho32</nobr></code>:
+<a href="nasmdoc7.html#section-7.8">Section 7.8</a>
+<br>
+<code><nobr>macho64</nobr></code>:
+<a href="nasmdoc7.html#section-7.8">Section 7.8</a>
+<br>
+MacOS X: <a href="nasmdoc7.html#section-7.8">Section 7.8</a>
+<br>
+<code><nobr>%macro</nobr></code>:
+<a href="nasmdoc4.html#section-4.3">Section 4.3</a>
+<br>
+macro indirection: <a href="nasmdoc4.html#section-4.1.3">Section 4.1.3</a>
+<br>
+macro library: <a href="nasmdoc2.html#section-2.1.16">Section 2.1.16</a>
+<br>
+macro processor: <a href="nasmdoc4.html">Chapter 4</a>
+<br>
+<code><nobr>macro-defaults</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+macro-local labels: <a href="nasmdoc4.html#section-4.3.3">Section 4.3.3</a>
+<br>
+<code><nobr>macro-params</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+macros: <a href="nasmdoc3.html#section-3.2.5">Section 3.2.5</a>
+<br>
+<code><nobr>macro-selfref</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+<code><nobr>make</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>
+<br>
+makefile dependencies:
+<a href="nasmdoc2.html#section-2.1.4">Section 2.1.4</a>,
+<a href="nasmdoc2.html#section-2.1.5">Section 2.1.5</a>
+<br>
+makefiles: <a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>,
+<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>
+<br>
+man pages: <a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>
+<br>
+map files: <a href="nasmdoc7.html#section-7.1.4">Section 7.1.4</a>
+<br>
+<code><nobr>MASM</nobr></code>:
+<a href="nasmdoc1.html#section-1.1.1">Section 1.1.1</a>
+<br>
+MASM: <a href="nasmdoc2.html#section-2.2">Section 2.2</a>,
+<a href="nasmdoc3.html#section-3.2.5">Section 3.2.5</a>,
+<a href="nasmdoc7.html#section-7.4">Section 7.4</a>
+<br>
+<code><nobr>-MD</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.7">Section 2.1.7</a>
+<br>
+memory models: <a href="nasmdoc2.html#section-2.2.5">Section 2.2.5</a>,
+<a href="nasmdoc8.html#section-8.4.2">Section 8.4.2</a>
+<br>
+memory operand: <a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+memory references: <a href="nasmdoc2.html#section-2.2.2">Section 2.2.2</a>,
+<a href="nasmdoc3.html#section-3.3">Section 3.3</a>
+<br>
+<code><nobr>-MF</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.6">Section 2.1.6</a>
+<br>
+<code><nobr>-MG</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.5">Section 2.1.5</a>
+<br>
+Microsoft OMF: <a href="nasmdoc7.html#section-7.4">Section 7.4</a>
+<br>
+minifloat: <a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+Minix: <a href="nasmdoc7.html#section-7.12">Section 7.12</a>
+<br>
+<code><nobr>misc</nobr></code> subdirectory:
+<a href="nasmdoc8.html#section-8.1.2">Section 8.1.2</a>,
+<a href="nasmdoc8.html#section-8.4.5">Section 8.4.5</a>,
+<a href="nasmdoc9.html#section-9.1.4">Section 9.1.4</a>
+<br>
+mixed-language program: <a href="nasmdoc8.html#section-8.4">Section 8.4</a>
+<br>
+mixed-size addressing:
+<a href="nasmdo10.html#section-10.2">Section 10.2</a>
+<br>
+mixed-size instruction:
+<a href="nasmdo10.html#section-10.1">Section 10.1</a>
+<br>
+MMX registers:
+<br>
+ModR/M byte:
+<br>
+<code><nobr>MODULE</nobr></code>:
+<a href="nasmdoc7.html#section-7.13.2">Section 7.13.2</a>
+<br>
+modulo operators: <a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>
+<br>
+motorola s-records: <a href="nasmdoc7.html#section-7.3">Section 7.3</a>
+<br>
+<code><nobr>-MP</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.10">Section 2.1.10</a>
+<br>
+<code><nobr>-MQ</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.9">Section 2.1.9</a>
+<br>
+MS-DOS: <a href="nasmdoc7.html#section-7.1">Section 7.1</a>
+<br>
+MS-DOS device drivers: <a href="nasmdoc8.html#section-8.3">Section 8.3</a>
+<br>
+<code><nobr>-MT</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.8">Section 2.1.8</a>
+<br>
+multi-line macros:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>,
+<a href="nasmdoc4.html#section-4.3">Section 4.3</a>
+<br>
+multipass optimization:
+<a href="nasmdoc2.html#section-2.1.22">Section 2.1.22</a>
+<br>
+multiple section names: <a href="nasmdoc7.html#section-7.1">Section 7.1</a>
+<br>
+multiplication: <a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>
+<br>
+<code><nobr>multipush</nobr></code> macro:
+<a href="nasmdoc4.html#section-4.3.7">Section 4.3.7</a>
+<br>
+multisection: <a href="nasmdoc7.html#section-7.1.3">Section 7.1.3</a>
+<br>
+<code><nobr>__NaN__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+NaN: <a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+NASM version: <a href="nasmdoc4.html#section-4.11.1">Section 4.11.1</a>
+<br>
+nasm version history: <a href="nasmdocc.html">Appendix C</a>
+<br>
+nasm version id: <a href="nasmdoc4.html#section-4.11.2">Section 4.11.2</a>
+<br>
+nasm version string:
+<a href="nasmdoc4.html#section-4.11.3">Section 4.11.3</a>
+<br>
+<code><nobr>nasm.1</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>
+<br>
+<code><nobr>__NASMDEFSEG</nobr></code>:
+<a href="nasmdoc7.html#section-7.4">Section 7.4</a>
+<br>
+<code><nobr>nasm-devel</nobr></code>:
+<a href="nasmdoc1.html#section-1.2">Section 1.2</a>
+<br>
+<code><nobr>NASMENV</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.28">Section 2.1.28</a>
+<br>
+<code><nobr>nasm.exe</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+<code><nobr>nasm -hf</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.2">Section 2.1.2</a>
+<br>
+<code><nobr>__NASM_MAJOR__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.1">Section 4.11.1</a>
+<br>
+<code><nobr>__NASM_MINOR__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.1">Section 4.11.1</a>
+<br>
+<code><nobr>nasm.out</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.1">Section 2.1.1</a>
+<br>
+<code><nobr>___NASM_PATCHLEVEL__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.1">Section 4.11.1</a>
+<br>
+<code><nobr>__NASM_SNAPSHOT__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.1">Section 4.11.1</a>
+<br>
+<code><nobr>__NASM_SUBMINOR__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.1">Section 4.11.1</a>
+<br>
+<code><nobr>__NASM_VER__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.3">Section 4.11.3</a>
+<br>
+<code><nobr>__NASM_VERSION_ID__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.2">Section 4.11.2</a>
+<br>
+<code><nobr>nasm-XXX-dos.zip</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+<code><nobr>nasm-XXX.tar.gz</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>
+<br>
+<code><nobr>nasm-XXX-win32.zip</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+<code><nobr>nasm-XXX.zip</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+ndisasm: <a href="nasmdoca.html">Appendix A</a>
+<br>
+<code><nobr>ndisasm.1</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>
+<br>
+<code><nobr>ndisasm.exe</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+near call: <a href="nasmdoc2.html#section-2.2.5">Section 2.2.5</a>
+<br>
+near common variables:
+<a href="nasmdoc7.html#section-7.4.8">Section 7.4.8</a>
+<br>
+NetBSD: <a href="nasmdoc7.html#section-7.11">Section 7.11</a>,
+<a href="nasmdoc9.html#section-9.2">Section 9.2</a>
+<br>
+new releases: <a href="nasmdoc1.html#section-1.2">Section 1.2</a>
+<br>
+<code><nobr>noalloc</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>nobits</nobr></code>:
+<a href="nasmdoc7.html#section-7.1.3">Section 7.1.3</a>,
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>noexec</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>.nolist</nobr></code>:
+<a href="nasmdoc4.html#section-4.3.10">Section 4.3.10</a>
+<br>
+`nowait': <a href="nasmdoc2.html#section-2.2.6">Section 2.2.6</a>
+<br>
+<code><nobr>nowrite</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>number-overflow</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+numeric constants: <a href="nasmdoc3.html#section-3.2.1">Section 3.2.1</a>,
+<a href="nasmdoc3.html#section-3.4.1">Section 3.4.1</a>
+<br>
+<code><nobr>-O</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.22">Section 2.1.22</a>
+<br>
+<code><nobr>-o</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.1">Section 2.1.1</a>,
+<a href="nasmdoca.html#section-A.3.1">Section A.3.1</a>
+<br>
+<code><nobr>O16</nobr></code>:
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+<code><nobr>o16</nobr></code>:
+<a href="nasmdo10.html#section-10.3">Section 10.3</a>
+<br>
+<code><nobr>O32</nobr></code>:
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+<code><nobr>o32</nobr></code>:
+<a href="nasmdo10.html#section-10.3">Section 10.3</a>
+<br>
+<code><nobr>O64</nobr></code>:
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+<code><nobr>.OBJ</nobr></code>:
+<a href="nasmdoc8.html#section-8.1">Section 8.1</a>
+<br>
+<code><nobr>obj</nobr></code>:
+<a href="nasmdoc7.html#section-7.4">Section 7.4</a>
+<br>
+<code><nobr>object</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>,
+<a href="nasmdoc7.html#section-7.13.3">Section 7.13.3</a>
+<br>
+octal: <a href="nasmdoc3.html#section-3.4.1">Section 3.4.1</a>
+<br>
+<code><nobr>OF_DBG</nobr></code>:
+<a href="nasmdoc7.html#section-7.14">Section 7.14</a>
+<br>
+<code><nobr>OF_DEFAULT</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.2">Section 2.1.2</a>
+<br>
+<code><nobr>OFFSET</nobr></code>:
+<a href="nasmdoc2.html#section-2.2.2">Section 2.2.2</a>
+<br>
+OMF: <a href="nasmdoc7.html#section-7.4">Section 7.4</a>
+<br>
+omitted parameters: <a href="nasmdoc4.html#section-4.3.5">Section 4.3.5</a>
+<br>
+one's complement: <a href="nasmdoc3.html#section-3.5.7">Section 3.5.7</a>
+<br>
+OpenBSD: <a href="nasmdoc7.html#section-7.11">Section 7.11</a>,
+<a href="nasmdoc9.html#section-9.2">Section 9.2</a>
+<br>
+operands: <a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+operand-size prefixes: <a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+operating system: <a href="nasmdoc7.html#section-7.1">Section 7.1</a>
+<br>
+operating system, writing:
+<a href="nasmdo10.html#section-10.1">Section 10.1</a>
+<br>
+operators: <a href="nasmdoc3.html#section-3.5">Section 3.5</a>
+<br>
+<code><nobr>ORG</nobr></code>:
+<a href="nasmdoc7.html#section-7.1.1">Section 7.1.1</a>,
+<a href="nasmdoc8.html#section-8.2.1">Section 8.2.1</a>,
+<a href="nasmdoc8.html#section-8.2.2">Section 8.2.2</a>,
+<a href="nasmdo12.html#section-12.1.3">Section 12.1.3</a>
+<br>
+<code><nobr>orphan-labels</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>,
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+OS/2: <a href="nasmdoc7.html#section-7.4">Section 7.4</a>,
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+<code><nobr>osabi</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.1">Section 7.9.1</a>
+<br>
+other preprocessor directives:
+<a href="nasmdoc4.html#section-4.10">Section 4.10</a>
+<br>
+out of range, jumps:
+<a href="nasmdo12.html#section-12.1.2">Section 12.1.2</a>
+<br>
+output file format: <a href="nasmdoc2.html#section-2.1.2">Section 2.1.2</a>
+<br>
+output formats: <a href="nasmdoc7.html">Chapter 7</a>
+<br>
+<code><nobr>__OUTPUT_FORMAT__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.6">Section 4.11.6</a>
+<br>
+overlapping segments: <a href="nasmdoc3.html#section-3.6">Section 3.6</a>
+<br>
+<code><nobr>OVERLAY</nobr></code>:
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+overloading, multi-line macros:
+<a href="nasmdoc4.html#section-4.3.2">Section 4.3.2</a>
+<br>
+overloading, single-line macros:
+<a href="nasmdoc4.html#section-4.1.1">Section 4.1.1</a>
+<br>
+<code><nobr>-P</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.17">Section 2.1.17</a>
+<br>
+<code><nobr>-p</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.17">Section 2.1.17</a>,
+<a href="nasmdoc4.html#section-4.6.1">Section 4.6.1</a>
+<br>
+paradox: <a href="nasmdoc3.html#section-3.8">Section 3.8</a>
+<br>
+<code><nobr>PASCAL</nobr></code>:
+<a href="nasmdoc8.html#section-8.5.3">Section 8.5.3</a>
+<br>
+Pascal calling convention:
+<a href="nasmdoc8.html#section-8.5.1">Section 8.5.1</a>
+<br>
+<code><nobr>__PASS__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.9">Section 4.11.9</a>
+<br>
+passes, assembly:
+<br>
+<code><nobr>PATH</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+<code><nobr>%pathsearch</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.16">Section 2.1.16</a>,
+<a href="nasmdoc4.html#section-4.6.2">Section 4.6.2</a>
+<br>
+period: <a href="nasmdoc3.html#section-3.9">Section 3.9</a>
+<br>
+Perl: <a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+perverse: <a href="nasmdoc2.html#section-2.1.16">Section 2.1.16</a>
+<br>
+PharLap: <a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+PIC: <a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>,
+<a href="nasmdoc7.html#section-7.11">Section 7.11</a>,
+<a href="nasmdoc9.html#section-9.2">Section 9.2</a>
+<br>
+<code><nobr>..plt</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>
+<br>
+<code><nobr>PLT</nobr></code> relocations:
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>,
+<a href="nasmdoc9.html#section-9.2.4">Section 9.2.4</a>,
+<a href="nasmdoc9.html#section-9.2.5">Section 9.2.5</a>
+<br>
+plt relocations: <a href="nasmdoc9.html#section-9.2.5">Section 9.2.5</a>
+<br>
+<code><nobr>%pop</nobr></code>:
+<a href="nasmdoc4.html#section-4.7">Section 4.7</a>,
+<a href="nasmdoc4.html#section-4.7.1">Section 4.7.1</a>
+<br>
+position-independent code:
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>,
+<a href="nasmdoc7.html#section-7.11">Section 7.11</a>,
+<a href="nasmdoc9.html#section-9.2">Section 9.2</a>
+<br>
+<code><nobr>--postfix</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.27">Section 2.1.27</a>
+<br>
+precedence: <a href="nasmdoc3.html#section-3.5">Section 3.5</a>
+<br>
+pre-defining macros:
+<a href="nasmdoc2.html#section-2.1.18">Section 2.1.18</a>,
+<a href="nasmdoc4.html#section-4.1.1">Section 4.1.1</a>
+<br>
+preferred: <a href="nasmdoc3.html#section-3.6">Section 3.6</a>
+<br>
+<code><nobr>--prefix</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.27">Section 2.1.27</a>
+<br>
+pre-including files:
+<a href="nasmdoc2.html#section-2.1.17">Section 2.1.17</a>
+<br>
+preprocess-only mode:
+<a href="nasmdoc2.html#section-2.1.20">Section 2.1.20</a>
+<br>
+preprocessor: <a href="nasmdoc2.html#section-2.1.20">Section 2.1.20</a>,
+<a href="nasmdoc2.html#section-2.1.21">Section 2.1.21</a>,
+<a href="nasmdoc3.html#section-3.2.4">Section 3.2.4</a>,
+<a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>,
+<a href="nasmdoc4.html">Chapter 4</a>
+<br>
+preprocessor expressions:
+<a href="nasmdoc2.html#section-2.1.20">Section 2.1.20</a>
+<br>
+preprocessor loops: <a href="nasmdoc4.html#section-4.5">Section 4.5</a>
+<br>
+preprocessor variables:
+<a href="nasmdoc4.html#section-4.1.7">Section 4.1.7</a>
+<br>
+primitive directives: <a href="nasmdoc6.html">Chapter 6</a>
+<br>
+<code><nobr>PRIVATE</nobr></code>:
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+<code><nobr>proc</nobr></code>:
+<a href="nasmdoc7.html#section-7.13.3">Section 7.13.3</a>,
+<a href="nasmdoc8.html#section-8.4.5">Section 8.4.5</a>,
+<a href="nasmdoc9.html#section-9.1.4">Section 9.1.4</a>
+<br>
+procedure linkage table:
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>,
+<a href="nasmdoc9.html#section-9.2.4">Section 9.2.4</a>,
+<a href="nasmdoc9.html#section-9.2.5">Section 9.2.5</a>
+<br>
+processor mode: <a href="nasmdoc6.html#section-6.1">Section 6.1</a>
+<br>
+<code><nobr>progbits</nobr></code>:
+<a href="nasmdoc7.html#section-7.1.3">Section 7.1.3</a>,
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+program entry point:
+<a href="nasmdoc7.html#section-7.4.6">Section 7.4.6</a>,
+<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+program origin: <a href="nasmdoc7.html#section-7.1.1">Section 7.1.1</a>
+<br>
+<code><nobr>protected</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>
+<br>
+pseudo-instructions: <a href="nasmdoc3.html#section-3.2">Section 3.2</a>
+<br>
+<code><nobr>PUBLIC</nobr></code>:
+<a href="nasmdoc6.html#section-6.6">Section 6.6</a>,
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+pure binary: <a href="nasmdoc7.html#section-7.1">Section 7.1</a>
+<br>
+<code><nobr>%push</nobr></code>:
+<a href="nasmdoc4.html#section-4.7">Section 4.7</a>,
+<a href="nasmdoc4.html#section-4.7.1">Section 4.7.1</a>
+<br>
+<code><nobr>__QNaN__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+quick start: <a href="nasmdoc2.html#section-2.2">Section 2.2</a>
+<br>
+<code><nobr>QWORD</nobr></code>:
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+<code><nobr>-r</nobr></code>:
+<a href="nasmdoca.html#section-A.3">Section A.3</a>
+<br>
+<code><nobr>rdf</nobr></code>:
+<a href="nasmdoc7.html#section-7.13">Section 7.13</a>
+<br>
+<code><nobr>rdoff</nobr></code> subdirectory:
+<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>,
+<a href="nasmdoc7.html#section-7.13">Section 7.13</a>
+<br>
+recursive multi-line macros:
+<a href="nasmdoc4.html#section-4.3.1">Section 4.3.1</a>
+<br>
+redirecting errors:
+<a href="nasmdoc2.html#section-2.1.14">Section 2.1.14</a>
+<br>
+<code><nobr>REL</nobr></code>:
+<a href="nasmdoc3.html#section-3.3">Section 3.3</a>,
+<a href="nasmdoc6.html#section-6.2">Section 6.2</a>
+<br>
+relational operators:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+release candidates: <a href="nasmdoc1.html#section-1.2">Section 1.2</a>
+<br>
+Relocatable Dynamic Object File Format:
+<a href="nasmdoc7.html#section-7.13">Section 7.13</a>
+<br>
+relocations, PIC-specific:
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>
+<br>
+removing contexts: <a href="nasmdoc4.html#section-4.7.1">Section 4.7.1</a>
+<br>
+renaming contexts: <a href="nasmdoc4.html#section-4.7.4">Section 4.7.4</a>
+<br>
+<code><nobr>%rep</nobr></code>:
+<a href="nasmdoc3.html#section-3.2.5">Section 3.2.5</a>,
+<a href="nasmdoc4.html#section-4.5">Section 4.5</a>
+<br>
+repeating: <a href="nasmdoc3.html#section-3.2.5">Section 3.2.5</a>,
+<a href="nasmdoc4.html#section-4.5">Section 4.5</a>
+<br>
+<code><nobr>%repl</nobr></code>:
+<a href="nasmdoc4.html#section-4.7.4">Section 4.7.4</a>
+<br>
+reporting bugs: <a href="nasmdo12.html#section-12.2">Section 12.2</a>
+<br>
+<code><nobr>RESB</nobr></code>:
+<a href="nasmdoc2.html#section-2.2.7">Section 2.2.7</a>,
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2</a>
+<br>
+<code><nobr>RESD</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2</a>
+<br>
+<code><nobr>RESO</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2</a>
+<br>
+<code><nobr>RESQ</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2</a>
+<br>
+<code><nobr>REST</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2</a>
+<br>
+<code><nobr>RESW</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2</a>
+<br>
+<code><nobr>RESY</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2</a>
+<br>
+<code><nobr>%rmacro</nobr></code>:
+<a href="nasmdoc4.html#section-4.3.1">Section 4.3.1</a>
+<br>
+<code><nobr>.rodata</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>%rotate</nobr></code>:
+<a href="nasmdoc4.html#section-4.3.7">Section 4.3.7</a>
+<br>
+rotating macro parameters:
+<a href="nasmdoc4.html#section-4.3.7">Section 4.3.7</a>
+<br>
+<code><nobr>-s</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.15">Section 2.1.15</a>,
+<a href="nasmdoca.html#section-A.3.2">Section A.3.2</a>
+<br>
+searching for include files:
+<a href="nasmdoc4.html#section-4.6.1">Section 4.6.1</a>
+<br>
+<code><nobr>__SECT__</nobr></code>:
+<a href="nasmdoc6.html#section-6.3.1">Section 6.3.1</a>,
+<a href="nasmdoc6.html#section-6.4">Section 6.4</a>
+<br>
+<code><nobr>SECTION</nobr></code>:
+<a href="nasmdoc6.html#section-6.3">Section 6.3</a>
+<br>
+<code><nobr>SECTION</nobr></code>, <code><nobr>elf</nobr></code> extensions
+to: <a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>SECTION</nobr></code>, <code><nobr>win32</nobr></code>
+extensions to: <a href="nasmdoc7.html#section-7.5.1">Section 7.5.1</a>
+<br>
+section alignment, in <code><nobr>bin</nobr></code>:
+<a href="nasmdoc7.html#section-7.1.2">Section 7.1.2</a>
+<br>
+section alignment, in <code><nobr>elf</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+section alignment, in <code><nobr>obj</nobr></code>:
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+section alignment, in <code><nobr>win32</nobr></code>:
+<a href="nasmdoc7.html#section-7.5.1">Section 7.5.1</a>
+<br>
+section, bin extensions to:
+<a href="nasmdoc7.html#section-7.1.2">Section 7.1.2</a>
+<br>
+<code><nobr>SEG</nobr></code>:
+<a href="nasmdoc3.html#section-3.5.7">Section 3.5.7</a>,
+<a href="nasmdoc3.html#section-3.6">Section 3.6</a>,
+<a href="nasmdoc7.html#section-7.4">Section 7.4</a>
+<br>
+<code><nobr>SEGMENT</nobr></code>:
+<a href="nasmdoc6.html#section-6.3">Section 6.3</a>
+<br>
+<code><nobr>SEGMENT</nobr></code>, <code><nobr>elf</nobr></code> extensions
+to: <a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+segment address: <a href="nasmdoc3.html#section-3.5.7">Section 3.5.7</a>,
+<a href="nasmdoc3.html#section-3.6">Section 3.6</a>
+<br>
+segment alignment, in <code><nobr>bin</nobr></code>:
+<a href="nasmdoc7.html#section-7.1.2">Section 7.1.2</a>
+<br>
+segment alignment, in <code><nobr>obj</nobr></code>:
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+segment names, Borland Pascal:
+<a href="nasmdoc8.html#section-8.5.2">Section 8.5.2</a>
+<br>
+segment override: <a href="nasmdoc2.html#section-2.2.4">Section 2.2.4</a>,
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+segments: <a href="nasmdoc3.html#section-3.6">Section 3.6</a>
+<br>
+segments, groups of:
+<a href="nasmdoc7.html#section-7.4.2">Section 7.4.2</a>
+<br>
+separator character:
+<a href="nasmdoc2.html#section-2.1.28">Section 2.1.28</a>
+<br>
+shared libraries: <a href="nasmdoc7.html#section-7.11">Section 7.11</a>,
+<a href="nasmdoc9.html#section-9.2">Section 9.2</a>
+<br>
+shared library: <a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>
+<br>
+<code><nobr>shift</nobr></code> command:
+<a href="nasmdoc4.html#section-4.3.7">Section 4.3.7</a>
+<br>
+SIB byte:
+<br>
+signed division: <a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>
+<br>
+signed modulo: <a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>
+<br>
+single-line macros: <a href="nasmdoc4.html#section-4.1">Section 4.1</a>
+<br>
+size, of symbols: <a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>
+<br>
+<code><nobr>smartalign</nobr></code>:
+<a href="nasmdoc5.html#section-5.2">Section 5.2</a>
+<br>
+<code><nobr>__SNaN__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.6">Section 3.4.6</a>
+<br>
+snapshots, daily development:
+<a href="nasmdoc1.html#section-1.2">Section 1.2</a>
+<br>
+Solaris x86: <a href="nasmdoc7.html#section-7.9">Section 7.9</a>
+<br>
+<code><nobr>-soname</nobr></code>:
+<a href="nasmdoc9.html#section-9.2.6">Section 9.2.6</a>
+<br>
+sound: <a href="nasmdoc3.html#section-3.2.3">Section 3.2.3</a>
+<br>
+source code: <a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+source-listing file:
+<a href="nasmdoc2.html#section-2.1.3">Section 2.1.3</a>
+<br>
+square brackets: <a href="nasmdoc2.html#section-2.2.2">Section 2.2.2</a>,
+<a href="nasmdoc3.html#section-3.3">Section 3.3</a>
+<br>
+<code><nobr>srec</nobr></code>:
+<a href="nasmdoc7.html#section-7.3">Section 7.3</a>
+<br>
+<code><nobr>STACK</nobr></code>:
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+stack relative preprocessor directives:
+<a href="nasmdoc4.html#section-4.8">Section 4.8</a>
+<br>
+<code><nobr>%stacksize</nobr></code>:
+<a href="nasmdoc4.html#section-4.8.2">Section 4.8.2</a>
+<br>
+standard macro packages: <a href="nasmdoc5.html">Chapter 5</a>
+<br>
+standard macros: <a href="nasmdoc4.html#section-4.11">Section 4.11</a>
+<br>
+standardized section names:
+<a href="nasmdoc6.html#section-6.3">Section 6.3</a>,
+<a href="nasmdoc7.html#section-7.5.1">Section 7.5.1</a>,
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>,
+<a href="nasmdoc7.html#section-7.10">Section 7.10</a>,
+<a href="nasmdoc7.html#section-7.11">Section 7.11</a>,
+<a href="nasmdoc7.html#section-7.12">Section 7.12</a>,
+<a href="nasmdoc7.html#section-7.13">Section 7.13</a>
+<br>
+<code><nobr>..start</nobr></code>:
+<a href="nasmdoc7.html#section-7.4.6">Section 7.4.6</a>,
+<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+<code><nobr>start=</nobr></code>:
+<a href="nasmdoc7.html#section-7.1.3">Section 7.1.3</a>
+<br>
+<code><nobr>stderr</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.14">Section 2.1.14</a>
+<br>
+<code><nobr>stdout</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.15">Section 2.1.15</a>
+<br>
+<code><nobr>%strcat</nobr></code>:
+<a href="nasmdoc4.html#section-4.2.1">Section 4.2.1</a>
+<br>
+<code><nobr>STRICT</nobr></code>:
+<a href="nasmdoc3.html#section-3.7">Section 3.7</a>
+<br>
+string constant: <a href="nasmdoc3.html#section-3.2.1">Section 3.2.1</a>
+<br>
+string constants: <a href="nasmdoc3.html#section-3.4.4">Section 3.4.4</a>
+<br>
+string length: <a href="nasmdoc4.html#section-4.2.2">Section 4.2.2</a>
+<br>
+string manipulation in macros:
+<a href="nasmdoc4.html#section-4.2">Section 4.2</a>
+<br>
+strings: <a href="nasmdoc3.html#section-3.4.2">Section 3.4.2</a>
+<br>
+<code><nobr>%strlen</nobr></code>:
+<a href="nasmdoc4.html#section-4.2.2">Section 4.2.2</a>
+<br>
+<code><nobr>STRUC</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.10">Section 4.11.10</a>,
+<a href="nasmdoc6.html#section-6.4">Section 6.4</a>,
+<a href="nasmdoc8.html#section-8.4.4">Section 8.4.4</a>,
+<a href="nasmdoc9.html#section-9.1.3">Section 9.1.3</a>
+<br>
+stub preprocessor:
+<a href="nasmdoc2.html#section-2.1.21">Section 2.1.21</a>
+<br>
+<code><nobr>%substr</nobr></code>:
+<a href="nasmdoc4.html#section-4.2.3">Section 4.2.3</a>
+<br>
+subtraction: <a href="nasmdoc3.html#section-3.5.5">Section 3.5.5</a>
+<br>
+suppressible warning:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+suppressing preprocessing:
+<a href="nasmdoc2.html#section-2.1.21">Section 2.1.21</a>
+<br>
+switching between sections:
+<a href="nasmdoc6.html#section-6.3">Section 6.3</a>
+<br>
+<code><nobr>..sym</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>
+<br>
+symbol sizes, specifying:
+<a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>
+<br>
+symbol types, specifying:
+<a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>
+<br>
+symbols, exporting from DLLs:
+<a href="nasmdoc7.html#section-7.4.5">Section 7.4.5</a>
+<br>
+symbols, importing from DLLs:
+<a href="nasmdoc7.html#section-7.4.4">Section 7.4.4</a>
+<br>
+<code><nobr>synchronisation</nobr></code>:
+<a href="nasmdoca.html#section-A.3.2">Section A.3.2</a>
+<br>
+<code><nobr>.SYS</nobr></code>:
+<a href="nasmdoc7.html#section-7.1">Section 7.1</a>,
+<a href="nasmdoc8.html#section-8.3">Section 8.3</a>
+<br>
+<code><nobr>-t</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.23">Section 2.1.23</a>
+<br>
+<code><nobr>TASM</nobr></code>:
+<a href="nasmdoc1.html#section-1.1.1">Section 1.1.1</a>,
+<a href="nasmdoc2.html#section-2.1.23">Section 2.1.23</a>
+<br>
+tasm: <a href="nasmdoc2.html#section-2.2">Section 2.2</a>,
+<a href="nasmdoc7.html#section-7.4">Section 7.4</a>
+<br>
+<code><nobr>.tbss</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>TBYTE</nobr></code>:
+<a href="nasmdoc2.html#section-2.2.7">Section 2.2.7</a>
+<br>
+<code><nobr>.tdata</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+<code><nobr>test</nobr></code> subdirectory:
+<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+testing, arbitrary numeric expressions:
+<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4</a>
+<br>
+testing, context stack:
+<a href="nasmdoc4.html#section-4.4.3">Section 4.4.3</a>
+<br>
+testing, exact text identity:
+<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5</a>
+<br>
+testing, multi-line macro existence:
+<a href="nasmdoc4.html#section-4.4.2">Section 4.4.2</a>
+<br>
+testing, single-line macro existence:
+<a href="nasmdoc4.html#section-4.4.1">Section 4.4.1</a>
+<br>
+testing, token types:
+<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6</a>
+<br>
+<code><nobr>.text</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>,
+<a href="nasmdoc7.html#section-7.10">Section 7.10</a>,
+<a href="nasmdoc7.html#section-7.11">Section 7.11</a>,
+<a href="nasmdoc7.html#section-7.12">Section 7.12</a>,
+<a href="nasmdoc7.html#section-7.13">Section 7.13</a>
+<br>
+<code><nobr>_TEXT</nobr></code>:
+<a href="nasmdoc8.html#section-8.4.2">Section 8.4.2</a>
+<br>
+thread local storage:
+<a href="nasmdoc7.html#section-7.9.4">Section 7.9.4</a>
+<br>
+<code><nobr>__TIME__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.7">Section 4.11.7</a>
+<br>
+<code><nobr>__TIME_NUM__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.7">Section 4.11.7</a>
+<br>
+<code><nobr>TIMES</nobr></code>:
+<a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.5">Section 3.2.5</a>,
+<a href="nasmdoc3.html#section-3.8">Section 3.8</a>,
+<a href="nasmdo12.html#section-12.1.3">Section 12.1.3</a>,
+<a href="nasmdo12.html#section-12.1.4">Section 12.1.4</a>
+<br>
+<code><nobr>TLINK</nobr></code>:
+<a href="nasmdoc8.html#section-8.2.2">Section 8.2.2</a>
+<br>
+<code><nobr>tls</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>,
+<a href="nasmdoc7.html#section-7.9.4">Section 7.9.4</a>
+<br>
+<code><nobr>..tlsie</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.4">Section 7.9.4</a>
+<br>
+trailing colon: <a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+<code><nobr>TWORD</nobr></code>:
+<a href="nasmdoc2.html#section-2.2.7">Section 2.2.7</a>,
+<a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+type, of symbols: <a href="nasmdoc7.html#section-7.9.5">Section 7.9.5</a>
+<br>
+<code><nobr>-U</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.19">Section 2.1.19</a>
+<br>
+<code><nobr>-u</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.19">Section 2.1.19</a>,
+<a href="nasmdoca.html#section-A.3">Section A.3</a>
+<br>
+unary operators: <a href="nasmdoc3.html#section-3.5.7">Section 3.5.7</a>
+<br>
+<code><nobr>%undef</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.19">Section 2.1.19</a>,
+<a href="nasmdoc4.html#section-4.1.6">Section 4.1.6</a>
+<br>
+undefining macros:
+<a href="nasmdoc2.html#section-2.1.19">Section 2.1.19</a>
+<br>
+underscore, in C symbols:
+<a href="nasmdoc8.html#section-8.4.1">Section 8.4.1</a>
+<br>
+Unicode: <a href="nasmdoc3.html#section-3.4.2">Section 3.4.2</a>,
+<a href="nasmdoc3.html#section-3.4.5">Section 3.4.5</a>
+<br>
+uninitialized: <a href="nasmdoc3.html#section-3.2">Section 3.2</a>,
+<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2</a>
+<br>
+uninitialized storage:
+<a href="nasmdoc2.html#section-2.2.7">Section 2.2.7</a>
+<br>
+Unix: <a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>
+<br>
+Unix, SCO: <a href="nasmdoc7.html#section-7.9">Section 7.9</a>
+<br>
+Unix, source archive:
+<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2</a>
+<br>
+Unix, System V: <a href="nasmdoc7.html#section-7.9">Section 7.9</a>
+<br>
+UnixWare: <a href="nasmdoc7.html#section-7.9">Section 7.9</a>
+<br>
+<code><nobr>%unmacro</nobr></code>:
+<a href="nasmdoc4.html#section-4.3.11">Section 4.3.11</a>
+<br>
+unrolled loops: <a href="nasmdoc3.html#section-3.2.5">Section 3.2.5</a>
+<br>
+unsigned division: <a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>
+<br>
+unsigned modulo: <a href="nasmdoc3.html#section-3.5.6">Section 3.5.6</a>
+<br>
+<code><nobr>UPPERCASE</nobr></code>:
+<a href="nasmdoc2.html#section-2.2.1">Section 2.2.1</a>,
+<a href="nasmdoc7.html#section-7.4.3">Section 7.4.3</a>
+<br>
+<code><nobr>%use</nobr></code>:
+<a href="nasmdoc4.html#section-4.6.4">Section 4.6.4</a>,
+<a href="nasmdoc5.html">Chapter 5</a>
+<br>
+<code><nobr>__USE_*__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.8">Section 4.11.8</a>
+<br>
+<code><nobr>USE16</nobr></code>:
+<a href="nasmdoc6.html#section-6.1.1">Section 6.1.1</a>,
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+<code><nobr>USE32</nobr></code>:
+<a href="nasmdoc6.html#section-6.1.1">Section 6.1.1</a>,
+<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1</a>
+<br>
+<code><nobr>user</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+user-defined errors: <a href="nasmdoc4.html#section-4.9">Section 4.9</a>
+<br>
+user-level assembler directives:
+<a href="nasmdoc4.html#section-4.11">Section 4.11</a>
+<br>
+user-level directives: <a href="nasmdoc6.html">Chapter 6</a>
+<br>
+<code><nobr>__UTC_DATE__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.7">Section 4.11.7</a>
+<br>
+<code><nobr>__UTC_DATE_NUM__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.7">Section 4.11.7</a>
+<br>
+<code><nobr>__UTC_TIME__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.7">Section 4.11.7</a>
+<br>
+<code><nobr>__UTC_TIME_NUM__</nobr></code>:
+<a href="nasmdoc4.html#section-4.11.7">Section 4.11.7</a>
+<br>
+UTF-16: <a href="nasmdoc3.html#section-3.4.5">Section 3.4.5</a>
+<br>
+UTF-32: <a href="nasmdoc3.html#section-3.4.5">Section 3.4.5</a>
+<br>
+UTF-8: <a href="nasmdoc3.html#section-3.4.2">Section 3.4.2</a>
+<br>
+<code><nobr>__utf16__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.5">Section 3.4.5</a>
+<br>
+<code><nobr>__utf32__</nobr></code>:
+<a href="nasmdoc3.html#section-3.4.5">Section 3.4.5</a>
+<br>
+<code><nobr>-v</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.25">Section 2.1.25</a>
+<br>
+VAL: <a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+valid characters: <a href="nasmdoc3.html#section-3.1">Section 3.1</a>
+<br>
+variable types: <a href="nasmdoc2.html#section-2.2.3">Section 2.2.3</a>
+<br>
+version: <a href="nasmdoc2.html#section-2.1.25">Section 2.1.25</a>
+<br>
+version number of NASM:
+<a href="nasmdoc4.html#section-4.11.1">Section 4.11.1</a>
+<br>
+<code><nobr>vfollows=</nobr></code>:
+<a href="nasmdoc7.html#section-7.1.3">Section 7.1.3</a>
+<br>
+Visual C++: <a href="nasmdoc7.html#section-7.5">Section 7.5</a>
+<br>
+<code><nobr>vstart=</nobr></code>:
+<a href="nasmdoc7.html#section-7.1.3">Section 7.1.3</a>
+<br>
+<code><nobr>-W</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+<code><nobr>-w</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+<code><nobr>%warning</nobr></code>:
+<a href="nasmdoc4.html#section-4.9">Section 4.9</a>
+<br>
+warnings: <a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+<code><nobr>[warning *warning-name]</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+<code><nobr>[warning +warning-name]</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+<code><nobr>[warning -warning-name]</nobr></code>:
+<a href="nasmdoc2.html#section-2.1.24">Section 2.1.24</a>
+<br>
+website: <a href="nasmdoc1.html#section-1.2">Section 1.2</a>
+<br>
+<code><nobr>win64</nobr></code>:
+<a href="nasmdoc7.html#section-7.6">Section 7.6</a>,
+<a href="nasmdo11.html">Chapter 11</a>
+<br>
+Win64: <a href="nasmdoc7.html#section-7.4">Section 7.4</a>,
+<a href="nasmdoc7.html#section-7.5">Section 7.5</a>,
+<a href="nasmdoc9.html">Chapter 9</a>
+<br>
+Windows: <a href="nasmdoc8.html#section-8.1">Section 8.1</a>
+<br>
+Windows 95:
+<br>
+Windows NT:
+<br>
+<code><nobr>write</nobr></code>:
+<a href="nasmdoc7.html#section-7.9.2">Section 7.9.2</a>
+<br>
+writing operating systems:
+<a href="nasmdo10.html#section-10.1">Section 10.1</a>
+<br>
+<code><nobr>WRT</nobr></code>:
+<a href="nasmdoc3.html#section-3.6">Section 3.6</a>,
+<a href="nasmdoc7.html#section-7.4">Section 7.4</a>,
+<a href="nasmdoc7.html#section-7.9.3">Section 7.9.3</a>,
+<a href="nasmdoc7.html#section-7.9.4">Section 7.9.4</a>,
+<a href="nasmdoc7.html#section-7.11">Section 7.11</a>
+<br>
+<code><nobr>WRT ..got</nobr></code>:
+<a href="nasmdoc9.html#section-9.2.3">Section 9.2.3</a>
+<br>
+<code><nobr>WRT ..gotoff</nobr></code>:
+<a href="nasmdoc9.html#section-9.2.2">Section 9.2.2</a>
+<br>
+<code><nobr>WRT ..gotpc</nobr></code>:
+<a href="nasmdoc9.html#section-9.2.1">Section 9.2.1</a>
+<br>
+<code><nobr>WRT ..plt</nobr></code>:
+<a href="nasmdoc9.html#section-9.2.5">Section 9.2.5</a>
+<br>
+<code><nobr>WRT ..sym</nobr></code>:
+<a href="nasmdoc9.html#section-9.2.4">Section 9.2.4</a>
+<br>
+WWW page:
+<br>
+<code><nobr>www.cpan.org</nobr></code>:
+<a href="nasmdoc1.html#section-1.3.1">Section 1.3.1</a>
+<br>
+<code><nobr>www.delorie.com</nobr></code>:
+<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+<code><nobr>www.pcorner.com</nobr></code>:
+<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+<code><nobr>-X</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.13">Section 2.1.13</a>
+<br>
+<code><nobr>x2ftp.oulu.fi</nobr></code>:
+<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1</a>
+<br>
+<code><nobr>%xdefine</nobr></code>:
+<a href="nasmdoc4.html#section-4.1.2">Section 4.1.2</a>
+<br>
+<code><nobr>-y</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.26">Section 2.1.26</a>
+<br>
+<code><nobr>-Z</nobr></code> option:
+<a href="nasmdoc2.html#section-2.1.14">Section 2.1.14</a>
+<br>
+<p align=center><a href="nasmdoc0.html">Contents</a>
+</body></html>