Initial code release
authorZhang Qiang <qiang.z.zhang@intel.com>
Fri, 18 May 2012 11:55:25 +0000 (19:55 +0800)
committerZhang Qiang <qiang.z.zhang@intel.com>
Sat, 19 May 2012 06:03:42 +0000 (14:03 +0800)
28 files changed:
doc/html/nasmdo10.html [new file with mode: 0644]
doc/html/nasmdo11.html [new file with mode: 0644]
doc/html/nasmdo12.html [new file with mode: 0644]
doc/html/nasmdoc0.html [new file with mode: 0644]
doc/html/nasmdoc1.html [new file with mode: 0644]
doc/html/nasmdoc2.html [new file with mode: 0644]
doc/html/nasmdoc3.html [new file with mode: 0644]
doc/html/nasmdoc4.html [new file with mode: 0644]
doc/html/nasmdoc5.html [new file with mode: 0644]
doc/html/nasmdoc6.html [new file with mode: 0644]
doc/html/nasmdoc7.html [new file with mode: 0644]
doc/html/nasmdoc8.html [new file with mode: 0644]
doc/html/nasmdoc9.html [new file with mode: 0644]
doc/html/nasmdoca.html [new file with mode: 0644]
doc/html/nasmdocb.html [new file with mode: 0644]
doc/html/nasmdocc.html [new file with mode: 0644]
doc/html/nasmdoci.html [new file with mode: 0644]
doc/info/nasm.info [new file with mode: 0644]
doc/info/nasm.info-1 [new file with mode: 0644]
doc/info/nasm.info-2 [new file with mode: 0644]
doc/info/nasm.info-3 [new file with mode: 0644]
doc/inslist.src [new file with mode: 0644]
doc/nasmdoc.pdf [new file with mode: 0644]
doc/nasmdoc.ps [new file with mode: 0644]
doc/nasmdoc.txt [new file with mode: 0644]
packaging/nasm-2.08rc7-xdoc.tar.bz2 [new file with mode: 0644]
packaging/nasm.sh [new file with mode: 0644]
packaging/nasm.spec [new file with mode: 0644]

diff --git a/doc/html/nasmdo10.html b/doc/html/nasmdo10.html
new file mode 100644 (file)
index 0000000..151dee1
--- /dev/null
@@ -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 (file)
index 0000000..c40eede
--- /dev/null
@@ -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 (file)
index 0000000..9c937f8
--- /dev/null
@@ -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 (file)
index 0000000..2b51d51
--- /dev/null
@@ -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 (file)
index 0000000..d370895
--- /dev/null
@@ -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 (file)
index 0000000..a639a4a
--- /dev/null
@@ -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 (file)
index 0000000..b70e438
--- /dev/null
@@ -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 (file)
index 0000000..8c71881
--- /dev/null
@@ -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 (file)
index 0000000..7effbbb
--- /dev/null
@@ -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 (file)
index 0000000..144a661
--- /dev/null
@@ -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 (file)
index 0000000..d1339a8
--- /dev/null
@@ -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 (file)
index 0000000..a7c2869
--- /dev/null
@@ -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 (file)
index 0000000..811af7c
--- /dev/null
@@ -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 (file)
index 0000000..fda553d
--- /dev/null
@@ -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 (file)
index 0000000..15bca45
--- /dev/null
@@ -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 (file)
index 0000000..b7ec3b2
--- /dev/null
@@ -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 (file)
index 0000000..54eb6a6
--- /dev/null
@@ -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>
diff --git a/doc/info/nasm.info b/doc/info/nasm.info
new file mode 100644 (file)
index 0000000..64ae230
--- /dev/null
@@ -0,0 +1,398 @@
+This is nasm.info, produced by makeinfo version 4.13 from nasmdoc.texi.
+
+INFO-DIR-SECTION Programming
+START-INFO-DIR-ENTRY
+* NASM: (nasm).                The Netwide Assembler for x86.
+END-INFO-DIR-ENTRY
+
+   This file documents NASM, the Netwide Assembler: an assembler
+targetting the Intel x86 series of processors, with portable source.
+
+   Copyright 1996-2009 The NASM Development Team
+
+   This document is redistributable under the license given in the file
+"COPYING" distributed in the NASM archive.
+
+\1f
+Indirect:
+nasm.info-1: 506
+nasm.info-2: 299030
+nasm.info-3: 597272
+\1f
+Tag Table:
+(Indirect)
+Node: Top\7f506
+Node: Chapter 1\7f1340
+Node: Section 1.1\7f1573
+Node: Section 1.1.1\7f2288
+Node: Section 1.1.2\7f4165
+Node: Section 1.2\7f5885
+Node: Section 1.3\7f6714
+Node: Section 1.3.1\7f6961
+Node: Section 1.3.2\7f8939
+Node: Chapter 2\7f10269
+Node: Section 2.1\7f10501
+Node: Section 2.1.1\7f13922
+Node: Section 2.1.2\7f15572
+Node: Section 2.1.3\7f16326
+Node: Section 2.1.4\7f17278
+Node: Section 2.1.5\7f17670
+Node: Section 2.1.6\7f18127
+Node: Section 2.1.7\7f18501
+Node: Section 2.1.8\7f19097
+Node: Section 2.1.9\7f19462
+Node: Section 2.1.10\7f19895
+Node: Section 2.1.11\7f20315
+Node: Section 2.1.12\7f21351
+Node: Section 2.1.13\7f21902
+Node: Section 2.1.14\7f23151
+Node: Section 2.1.15\7f24104
+Node: Section 2.1.16\7f24609
+Node: Section 2.1.17\7f26221
+Node: Section 2.1.18\7f26794
+Node: Section 2.1.19\7f27652
+Node: Section 2.1.20\7f28346
+Node: Section 2.1.21\7f29324
+Node: Section 2.1.22\7f29870
+Node: Section 2.1.23\7f31394
+Node: Section 2.1.24\7f32358
+Node: Section 2.1.25\7f35726
+Node: Section 2.1.26\7f36094
+Node: Section 2.1.27\7f36730
+Node: Section 2.1.28\7f37190
+Node: Section 2.2\7f38528
+Node: Section 2.2.1\7f39321
+Node: Section 2.2.2\7f39931
+Node: Section 2.2.3\7f42292
+Node: Section 2.2.4\7f43155
+Node: Section 2.2.5\7f43559
+Node: Section 2.2.6\7f44319
+Node: Section 2.2.7\7f44947
+Node: Chapter 3\7f45799
+Node: Section 3.1\7f46276
+Node: Section 3.2\7f50446
+Node: Section 3.2.1\7f51310
+Node: Section 3.2.2\7f52567
+Node: Section 3.2.3\7f53598
+Node: Section 3.2.4\7f54561
+Node: Section 3.2.5\7f55471
+Node: Section 3.3\7f56970
+Node: Section 3.4\7f60459
+Node: Section 3.4.1\7f60957
+Node: Section 3.4.2\7f62817
+Node: Section 3.4.3\7f64681
+Node: Section 3.4.4\7f65383
+Node: Section 3.4.5\7f66694
+Node: Section 3.4.6\7f67390
+Node: Section 3.4.7\7f71120
+Node: Section 3.5\7f71682
+Node: Section 3.5.1\7f72876
+Node: Section 3.5.2\7f73207
+Node: Section 3.5.3\7f73418
+Node: Section 3.5.4\7f73629
+Node: Section 3.5.5\7f74128
+Node: Section 3.5.6\7f74417
+Node: Section 3.5.7\7f75167
+Node: Section 3.6\7f75754
+Node: Section 3.7\7f77833
+Node: Section 3.8\7f78736
+Node: Section 3.9\7f80161
+Node: Chapter 4\7f82743
+Node: Section 4.1\7f83935
+Node: Section 4.1.1\7f84549
+Node: Section 4.1.2\7f87390
+Node: Section 4.1.3\7f88934
+Node: Section 4.1.4\7f89843
+Node: Section 4.1.5\7f91349
+Node: Section 4.1.6\7f92319
+Node: Section 4.1.7\7f92959
+Node: Section 4.1.8\7f94230
+Node: Section 4.1.9\7f94874
+Node: Section 4.2\7f95336
+Node: Section 4.2.1\7f96105
+Node: Section 4.2.2\7f96681
+Node: Section 4.2.3\7f97368
+Node: Section 4.3\7f98741
+Node: Section 4.3.1\7f100959
+Node: Section 4.3.2\7f101752
+Node: Section 4.3.3\7f103123
+Node: Section 4.3.4\7f104286
+Node: Section 4.3.5\7f106612
+Node: Section 4.3.6\7f109310
+Node: Section 4.3.7\7f109896
+Node: Section 4.3.8\7f112639
+Node: Section 4.3.9\7f114996
+Node: Section 4.3.10\7f116387
+Node: Section 4.3.11\7f117234
+Node: Section 4.3.12\7f117992
+Node: Section 4.4\7f118457
+Node: Section 4.4.1\7f119961
+Node: Section 4.4.2\7f121062
+Node: Section 4.4.3\7f122377
+Node: Section 4.4.4\7f123000
+Node: Section 4.4.5\7f124560
+Node: Section 4.4.6\7f125561
+Node: Section 4.4.7\7f127864
+Node: Section 4.4.8\7f128682
+Node: Section 4.5\7f129130
+Node: Section 4.6\7f130826
+Node: Section 4.6.1\7f131288
+Node: Section 4.6.2\7f132695
+Node: Section 4.6.3\7f133293
+Node: Section 4.6.4\7f134133
+Node: Section 4.7\7f135063
+Node: Section 4.7.1\7f136233
+Node: Section 4.7.2\7f137224
+Node: Section 4.7.3\7f138261
+Node: Section 4.7.4\7f138778
+Node: Section 4.7.5\7f139538
+Node: Section 4.8\7f142039
+Node: Section 4.8.1\7f142600
+Node: Section 4.8.2\7f143809
+Node: Section 4.8.3\7f145438
+Node: Section 4.9\7f147193
+Node: Section 4.10\7f149062
+Node: Section 4.10.1\7f149732
+Node: Section 4.10.2\7f151046
+Node: Section 4.11\7f151773
+Node: Section 4.11.1\7f153179
+Node: Section 4.11.2\7f153878
+Node: Section 4.11.3\7f154703
+Node: Section 4.11.4\7f155133
+Node: Section 4.11.5\7f156498
+Node: Section 4.11.6\7f157004
+Node: Section 4.11.7\7f157505
+Node: Section 4.11.8\7f159693
+Node: Section 4.11.9\7f160294
+Node: Section 4.11.10\7f160911
+Node: Section 4.11.11\7f163932
+Node: Section 4.11.12\7f165536
+Node: Chapter 5\7f168133
+Node: Section 5.1\7f168785
+Node: Section 5.2\7f169475
+Node: Chapter 6\7f171420
+Node: Section 6.1\7f173000
+Node: Section 6.1.1\7f175976
+Node: Section 6.2\7f176296
+Node: Section 6.3\7f177453
+Node: Section 6.3.1\7f178524
+Node: Section 6.4\7f180364
+Node: Section 6.5\7f182293
+Node: Section 6.6\7f183787
+Node: Section 6.7\7f184971
+Node: Section 6.8\7f186170
+Node: Section 6.9\7f187418
+Node: Chapter 7\7f188427
+Node: Section 7.1\7f190123
+Node: Section 7.1.1\7f191429
+Node: Section 7.1.2\7f192457
+Node: Section 7.1.3\7f193198
+Node: Section 7.1.4\7f194959
+Node: Section 7.2\7f195436
+Node: Section 7.3\7f195980
+Node: Section 7.4\7f196548
+Node: Section 7.4.1\7f199011
+Node: Section 7.4.2\7f201987
+Node: Section 7.4.3\7f203656
+Node: Section 7.4.4\7f204379
+Node: Section 7.4.5\7f205355
+Node: Section 7.4.6\7f207319
+Node: Section 7.4.7\7f207871
+Node: Section 7.4.8\7f209425
+Node: Section 7.5\7f211274
+Node: Section 7.5.1\7f212425
+Node: Section 7.5.2\7f214883
+Node: Section 7.6\7f219189
+Node: Section 7.6.1\7f219880
+Node: Section 7.6.2\7f222750
+Node: Section 7.7\7f231628
+Node: Section 7.8\7f232143
+Node: Section 7.9\7f232570
+Node: Section 7.9.1\7f233574
+Node: Section 7.9.2\7f234090
+Node: Section 7.9.3\7f236574
+Node: Section 7.9.4\7f239580
+Node: Section 7.9.5\7f240492
+Node: Section 7.9.6\7f242295
+Node: Section 7.9.7\7f242944
+Node: Section 7.9.8\7f243460
+Node: Section 7.10\7f243838
+Node: Section 7.11\7f244741
+Node: Section 7.12\7f245917
+Node: Section 7.13\7f246833
+Node: Section 7.13.1\7f248187
+Node: Section 7.13.2\7f248663
+Node: Section 7.13.3\7f249368
+Node: Section 7.13.4\7f250315
+Node: Section 7.14\7f251192
+Node: Chapter 8\7f253473
+Node: Section 8.1\7f254227
+Node: Section 8.1.1\7f255319
+Node: Section 8.1.2\7f258921
+Node: Section 8.2\7f261299
+Node: Section 8.2.1\7f261805
+Node: Section 8.2.2\7f263314
+Node: Section 8.3\7f264893
+Node: Section 8.4\7f265899
+Node: Section 8.4.1\7f266570
+Node: Section 8.4.2\7f268084
+Node: Section 8.4.3\7f271540
+Node: Section 8.4.4\7f278288
+Node: Section 8.4.5\7f280465
+Node: Section 8.5\7f283090
+Node: Section 8.5.1\7f284827
+Node: Section 8.5.2\7f289081
+Node: Section 8.5.3\7f290107
+Node: Chapter 9\7f291435
+Node: Section 9.1\7f292896
+Node: Section 9.1.1\7f293491
+Node: Section 9.1.2\7f294359
+Node: Section 9.1.3\7f299030
+Node: Section 9.1.4\7f301283
+Node: Section 9.2\7f302862
+Node: Section 9.2.1\7f305149
+Node: Section 9.2.2\7f307928
+Node: Section 9.2.3\7f309212
+Node: Section 9.2.4\7f310327
+Node: Section 9.2.5\7f312918
+Node: Section 9.2.6\7f313825
+Node: Chapter 10\7f314685
+Node: Section 10.1\7f315390
+Node: Section 10.2\7f317375
+Node: Section 10.3\7f319959
+Node: Chapter 11\7f322252
+Node: Section 11.1\7f324207
+Node: Section 11.2\7f325177
+Node: Section 11.3\7f327200
+Node: Section 11.4\7f328551
+Node: Chapter 12\7f329634
+Node: Section 12.1\7f330070
+Node: Section 12.1.1\7f330398
+Node: Section 12.1.2\7f331166
+Node: Section 12.1.3\7f332323
+Node: Section 12.1.4\7f333493
+Node: Section 12.2\7f334851
+Node: Appendix A\7f339510
+Node: Section A.1\7f339830
+Node: Section A.2\7f340543
+Node: Section A.3\7f340876
+Node: Section A.3.1\7f341789
+Node: Section A.3.2\7f342678
+Node: Section A.3.3\7f344784
+Node: Section A.3.4\7f347578
+Node: Section A.4\7f348326
+Node: Appendix B\7f348762
+Node: Section B.1\7f348948
+Node: Section B.1.1\7f351150
+Node: Section B.1.2\7f351483
+Node: Section B.1.3\7f424168
+Node: Section B.1.4\7f429304
+Node: Section B.1.5\7f429647
+Node: Section B.1.6\7f430065
+Node: Section B.1.7\7f430506
+Node: Section B.1.8\7f431638
+Node: Section B.1.9\7f432131
+Node: Section B.1.10\7f432831
+Node: Section B.1.11\7f439728
+Node: Section B.1.12\7f445350
+Node: Section B.1.13\7f446171
+Node: Section B.1.14\7f447189
+Node: Section B.1.15\7f447629
+Node: Section B.1.16\7f449575
+Node: Section B.1.17\7f450064
+Node: Section B.1.18\7f450411
+Node: Section B.1.19\7f453720
+Node: Section B.1.20\7f454625
+Node: Section B.1.21\7f454823
+Node: Section B.1.22\7f455137
+Node: Section B.1.23\7f455651
+Node: Section B.1.24\7f456181
+Node: Section B.1.25\7f456737
+Node: Section B.1.26\7f497504
+Node: Section B.1.27\7f498034
+Node: Section B.1.28\7f498591
+Node: Section B.1.29\7f509939
+Node: Section B.1.30\7f510657
+Node: Section B.1.31\7f511523
+Node: Section B.1.32\7f520363
+Node: Appendix C\7f531399
+Node: Section C.1\7f531662
+Node: Section C.1.1\7f532242
+Node: Section C.1.2\7f533796
+Node: Section C.1.3\7f535031
+Node: Section C.1.4\7f536766
+Node: Section C.1.5\7f536987
+Node: Section C.1.6\7f537982
+Node: Section C.1.7\7f540282
+Node: Section C.1.8\7f540651
+Node: Section C.1.9\7f542095
+Node: Section C.1.10\7f543237
+Node: Section C.1.11\7f543839
+Node: Section C.2\7f545564
+Node: Section C.2.1\7f547911
+Node: Section C.2.2\7f548336
+Node: Section C.2.3\7f549349
+Node: Section C.2.4\7f550042
+Node: Section C.2.5\7f550581
+Node: Section C.2.6\7f551111
+Node: Section C.2.7\7f551952
+Node: Section C.2.8\7f552881
+Node: Section C.2.9\7f553540
+Node: Section C.2.10\7f554127
+Node: Section C.2.11\7f554863
+Node: Section C.2.12\7f555186
+Node: Section C.2.13\7f555393
+Node: Section C.2.14\7f555706
+Node: Section C.2.15\7f555953
+Node: Section C.2.16\7f556156
+Node: Section C.2.17\7f556364
+Node: Section C.2.18\7f556621
+Node: Section C.2.19\7f556820
+Node: Section C.2.20\7f557001
+Node: Section C.2.21\7f557182
+Node: Section C.2.22\7f557370
+Node: Section C.2.23\7f557561
+Node: Section C.2.24\7f557771
+Node: Section C.2.25\7f557974
+Node: Section C.2.26\7f558187
+Node: Section C.2.27\7f558366
+Node: Section C.2.28\7f558548
+Node: Section C.2.29\7f558792
+Node: Section C.2.30\7f558996
+Node: Section C.2.31\7f559178
+Node: Section C.2.32\7f559842
+Node: Section C.2.33\7f560152
+Node: Section C.2.34\7f561495
+Node: Section C.2.35\7f561944
+Node: Section C.2.36\7f562245
+Node: Section C.2.37\7f563300
+Node: Section C.2.38\7f563537
+Node: Section C.2.39\7f563868
+Node: Section C.2.40\7f565946
+Node: Section C.2.41\7f573822
+Node: Section C.2.42\7f574310
+Node: Section C.2.43\7f575038
+Node: Section C.2.44\7f575971
+Node: Section C.2.45\7f577069
+Node: Section C.2.46\7f578569
+Node: Section C.2.47\7f578863
+Node: Section C.2.48\7f579191
+Node: Section C.2.49\7f580498
+Node: Section C.2.50\7f580915
+Node: Section C.2.51\7f581846
+Node: Section C.2.52\7f582760
+Node: Section C.2.53\7f583882
+Node: Section C.2.54\7f584288
+Node: Section C.2.55\7f584619
+Node: Section C.3\7f587873
+Node: Section C.3.1\7f588473
+Node: Section C.3.2\7f590132
+Node: Section C.3.3\7f597272
+Node: Section C.3.4\7f601832
+Node: Section C.3.5\7f603782
+Node: Section C.3.6\7f604873
+Node: Section C.3.7\7f606084
+Node: Section C.3.8\7f607145
+Node: Index\7f607442
+\1f
+End Tag Table
diff --git a/doc/info/nasm.info-1 b/doc/info/nasm.info-1
new file mode 100644 (file)
index 0000000..d1896f8
--- /dev/null
@@ -0,0 +1,7484 @@
+This is nasm.info, produced by makeinfo version 4.13 from nasmdoc.texi.
+
+INFO-DIR-SECTION Programming
+START-INFO-DIR-ENTRY
+* NASM: (nasm).                The Netwide Assembler for x86.
+END-INFO-DIR-ENTRY
+
+   This file documents NASM, the Netwide Assembler: an assembler
+targetting the Intel x86 series of processors, with portable source.
+
+   Copyright 1996-2009 The NASM Development Team
+
+   This document is redistributable under the license given in the file
+"COPYING" distributed in the NASM archive.
+
+\1f
+File: nasm.info,  Node: Top,  Next: Chapter 1,  Prev: (dir),  Up: (dir)
+
+The Netwide Assembler for x86
+*****************************
+
+This file documents NASM, the Netwide Assembler: an assembler
+targetting the Intel x86 series of processors, with portable source.
+
+* Menu:
+
+* Chapter 1:: Introduction
+* Chapter 2:: Running NASM
+* Chapter 3:: The NASM Language
+* Chapter 4:: The NASM Preprocessor
+* Chapter 5:: Standard Macro Packages
+* Chapter 6:: Assembler Directives
+* Chapter 7:: Output Formats
+* Chapter 8:: Writing 16-bit Code (DOS, Windows 3/3.1)
+* Chapter 9:: Writing 32-bit Code (Unix, Win32, DJGPP)
+* Chapter 10:: Mixing 16 and 32 Bit Code
+* Chapter 11:: Writing 64-bit Code (Unix, Win64)
+* Chapter 12:: Troubleshooting
+* Appendix A:: Ndisasm
+* Appendix B:: Instruction List
+* Appendix C:: NASM Version History
+* Index::
+
+\1f
+File: nasm.info,  Node: Chapter 1,  Next: Section 1.1,  Prev: Top,  Up: Top
+
+Chapter 1: Introduction
+***********************
+
+* Menu:
+
+* Section 1.1:: What Is NASM?
+* Section 1.2:: Contact Information
+* Section 1.3:: Installation
+
+\1f
+File: nasm.info,  Node: Section 1.1,  Next: Section 1.1.1,  Prev: Chapter 1,  Up: Chapter 1
+
+1.1. What Is NASM?
+==================
+
+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 `*BSD' `a.out', `ELF', `COFF', `Mach-O',
+Microsoft 16-bit `OBJ', `Win32' and `Win64'.  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.
+
+* Menu:
+
+* Section 1.1.1:: Why Yet Another Assembler?
+* Section 1.1.2:: License Conditions
+
+\1f
+File: nasm.info,  Node: Section 1.1.1,  Next: Section 1.1.2,  Prev: Section 1.1,  Up: Section 1.1
+
+1.1.1. Why Yet Another Assembler?
+---------------------------------
+
+The Netwide Assembler grew out of an idea on `comp.lang.asm.x86' (or
+possibly `alt.lang.asm' - I forget which), which was essentially that
+there didn't seem to be a good _free_ x86-series assembler around, and
+that maybe someone ought to write one.
+
+   * `a86' is good, but not free, and in particular you don't get any
+     32- bit capability until you pay. It's DOS only, too.
+
+   * `gas' 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 `gcc', 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 _write_ anything in it. Plus you can't write 16-bit code
+     in it (properly.)
+
+   * `as86' is specific to Minix and Linux, and (my version at least)
+     doesn't seem to have much (or any) documentation.
+
+   * `MASM' isn't very good, and it's (was) expensive, and it runs only
+     under DOS.
+
+   * `TASM' 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.
+
+   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, _please_ 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.
+
+\1f
+File: nasm.info,  Node: Section 1.1.2,  Next: Section 1.2,  Prev: Section 1.1.1,  Up: Section 1.1
+
+1.1.2. License Conditions
+-------------------------
+
+Please see the file `LICENSE', 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.
+
+   Copyright 1996-2009 the NASM Authors - All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+   * 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.
+
+   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.
+
+\1f
+File: nasm.info,  Node: Section 1.2,  Next: Section 1.3,  Prev: Section 1.1.2,  Up: Chapter 1
+
+1.2. Contact Information
+========================
+
+The current version of NASM (since about 0.98.08) is maintained by a
+team of developers, accessible through the `nasm-devel' mailing list
+(see below for the link). If you want to report a bug, please read
+*note Section 12.2:: first.
+
+   NASM has a website at `http://www.nasm.us/'. If it's not there,
+google for us!
+
+   New releases, release candidates, and daily development snapshots of
+NASM are available from the official web site.
+
+   Announcements are posted to `comp.lang.asm.x86', and to the web site
+`http://www.freshmeat.net/'.
+
+   If you want information about the current development status, please
+subscribe to the `nasm-devel' email list; see link from the website.
+
+\1f
+File: nasm.info,  Node: Section 1.3,  Next: Section 1.3.1,  Prev: Section 1.2,  Up: Chapter 1
+
+1.3. Installation
+=================
+
+* Menu:
+
+* Section 1.3.1:: Installing NASM under MS-DOS or Windows
+* Section 1.3.2:: Installing NASM under Unix
+
+\1f
+File: nasm.info,  Node: Section 1.3.1,  Next: Section 1.3.2,  Prev: Section 1.3,  Up: Section 1.3
+
+1.3.1. Installing NASM under MS-DOS or Windows
+----------------------------------------------
+
+Once you've obtained the appropriate archive for NASM,
+`nasm-XXX-dos.zip' or `nasm-XXX-win32.zip' (where `XXX' denotes the
+version number of NASM contained in the archive), unpack it into its
+own directory (for example `c:\nasm').
+
+   The archive will contain a set of executable files: the NASM
+executable file `nasm.exe', the NDISASM executable file `ndisasm.exe',
+and possibly additional utilities to handle the RDOFF file format.
+
+   The only file NASM needs to run is its own executable, so copy
+`nasm.exe' to a directory on your PATH, or alternatively edit
+`autoexec.bat' to add the `nasm' directory to your `PATH' (to do that
+under Windows XP, go to Start > Control Panel > System > Advanced >
+Environment Variables; these instructions may work under other versions
+of Windows as well.)
+
+   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 `PATH'), so you
+can delete it if you need to save space; however, you may want to keep
+the documentation or test programs.
+
+   If you've downloaded the DOS source archive, `nasm-XXX.zip', the
+`nasm' 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 `INSTALL' in the source archive.
+
+   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 www.cpan.org.
+
+\1f
+File: nasm.info,  Node: Section 1.3.2,  Next: Chapter 2,  Prev: Section 1.3.1,  Up: Section 1.3
+
+1.3.2. Installing NASM under Unix
+---------------------------------
+
+Once you've obtained the Unix source archive for NASM,
+`nasm-XXX.tar.gz' (where `XXX' denotes the version number of NASM
+contained in the archive), unpack it into a directory such as
+`/usr/local/src'. The archive, when unpacked, will create its own
+subdirectory `nasm-XXX'.
+
+   NASM is an auto-configuring package: once you've unpacked it, `cd' to
+the directory it's been unpacked into and type `./configure'. This
+shell script will find the best C compiler to use for building NASM and
+set up Makefiles accordingly.
+
+   Once NASM has auto-configured, you can type `make' to build the
+`nasm' and `ndisasm' binaries, and then `make install' to install them
+in `/usr/local/bin' and install the man pages `nasm.1' and `ndisasm.1'
+in `/usr/local/man/man1'.  Alternatively, you can give options such as
+`--prefix' to the configure script (see the file `INSTALL' for more
+details), or install the programs yourself.
+
+   NASM also comes with a set of utilities for handling the `RDOFF'
+custom object-file format, which are in the `rdoff' subdirectory of the
+NASM archive. You can build these with `make rdf' and install them with
+`make rdf_install', if you want them.
+
+\1f
+File: nasm.info,  Node: Chapter 2,  Next: Section 2.1,  Prev: Section 1.3.2,  Up: Top
+
+Chapter 2: Running NASM
+***********************
+
+* Menu:
+
+* Section 2.1:: NASM Command-Line Syntax
+* Section 2.2:: Quick Start for MASM Users
+
+\1f
+File: nasm.info,  Node: Section 2.1,  Next: Section 2.1.1,  Prev: Chapter 2,  Up: Chapter 2
+
+2.1. NASM Command-Line Syntax
+=============================
+
+To assemble a file, you issue a command of the form
+
+     nasm -f <format> <filename> [-o <output>]
+
+   For example,
+
+     nasm -f elf myfile.asm
+
+   will assemble `myfile.asm' into an `ELF' object file `myfile.o'. And
+
+     nasm -f bin myfile.asm -o myfile.com
+
+   will assemble `myfile.asm' into a raw binary file `myfile.com'.
+
+   To produce a listing file, with the hex codes output from NASM
+displayed on the left of the original sources, use the `-l' option to
+give a listing file name, for example:
+
+     nasm -f coff myfile.asm -l myfile.lst
+
+   To get further usage instructions from NASM, try typing
+
+     nasm -h
+
+   As `-hf', this will also list the available output file formats, and
+what they are.
+
+   If you use Linux but aren't sure whether your system is `a.out' or
+`ELF', type
+
+     file nasm
+
+   (in the directory in which you put the NASM binary when you
+installed it).  If it says something like
+
+     nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1
+
+   then your system is `ELF', and you should use the option `-f elf'
+when you want NASM to produce Linux object files. If it says
+
+     nasm: Linux/i386 demand-paged executable (QMAGIC)
+
+   or something similar, your system is `a.out', and you should use `-f
+aout' instead (Linux `a.out' systems have long been obsolete, and are
+rare these days.)
+
+   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.
+
+* Menu:
+
+* Section 2.1.1:: The `-o' Option: Specifying the Output File Name
+* Section 2.1.2:: The `-f' Option: Specifying the Output File Format
+* Section 2.1.3:: The `-l' Option: Generating a Listing File
+* Section 2.1.4:: The `-M' Option: Generate Makefile Dependencies
+* Section 2.1.5:: The `-MG' Option: Generate Makefile Dependencies
+* Section 2.1.6:: The `-MF' Option: Set Makefile Dependency File
+* Section 2.1.7:: The `-MD' Option: Assemble and Generate Dependencies
+* Section 2.1.8:: The `-MT' Option: Dependency Target Name
+* Section 2.1.9:: The `-MQ' Option: Dependency Target Name (Quoted)
+* Section 2.1.10:: The `-MP' Option: Emit phony targets
+* Section 2.1.11:: The `-F' Option: Selecting a Debug Information Format
+* Section 2.1.12:: The `-g' Option: Enabling Debug Information.
+* Section 2.1.13:: The `-X' Option: Selecting an Error Reporting Format
+* Section 2.1.14:: The `-Z' Option: Send Errors to a File
+* Section 2.1.15:: The `-s' Option: Send Errors to `stdout'
+* Section 2.1.16:: The `-i' Option: Include File Search Directories
+* Section 2.1.17:: The `-p' Option: Pre-Include a File
+* Section 2.1.18:: The `-d' Option: Pre-Define a Macro
+* Section 2.1.19:: The `-u' Option: Undefine a Macro
+* Section 2.1.20:: The `-E' Option: Preprocess Only
+* Section 2.1.21:: The `-a' Option: Don't Preprocess At All
+* Section 2.1.22:: The `-O' Option: Specifying Multipass Optimization
+* Section 2.1.23:: The `-t' Option: Enable TASM Compatibility Mode
+* Section 2.1.24:: The `-w' and `-W' Options: Enable or Disable Assembly Warnings
+* Section 2.1.25:: The `-v' Option: Display Version Info
+* Section 2.1.26:: The `-y' Option: Display Available Debug Info Formats
+* Section 2.1.27:: The `--prefix' and `--postfix' Options.
+* Section 2.1.28:: The `NASMENV' Environment Variable
+
+\1f
+File: nasm.info,  Node: Section 2.1.1,  Next: Section 2.1.2,  Prev: Section 2.1,  Up: Section 2.1
+
+2.1.1. The `-o' Option: Specifying the Output File Name
+-------------------------------------------------------
+
+NASM will normally choose the name of your output file for you;
+precisely how it does this is dependent on the object file format. For
+Microsoft object file formats (`obj', `win32' and `win64'), it will
+remove the `.asm' extension (or whatever extension you like to use -
+NASM doesn't care) from your source file name and substitute `.obj'.
+For Unix object file formats (`aout', `as86', `coff', `elf32', `elf64',
+`ieee', `macho32' and `macho64') it will substitute `.o'. For `dbg',
+`rdf', `ith' and `srec', it will use `.dbg', `.rdf', `.ith' and
+`.srec', respectively, and for the `bin' format it will simply remove
+the extension, so that `myfile.asm' produces the output file `myfile'.
+
+   If the output file already exists, NASM will overwrite it, unless it
+has the same name as the input file, in which case it will give a
+warning and use `nasm.out' as the output file name instead.
+
+   For situations in which this behaviour is unacceptable, NASM
+provides the `-o' command-line option, which allows you to specify your
+desired output file name. You invoke `-o' by following it with the name
+you wish for the output file, either with or without an intervening
+space. For example:
+
+     nasm -f bin program.asm -o program.com
+     nasm -f bin driver.asm -odriver.sys
+
+   Note that this is a small o, and is different from a capital O ,
+which is used to specify the number of optimisation passes required. See
+*note Section 2.1.22::.
+
+\1f
+File: nasm.info,  Node: Section 2.1.2,  Next: Section 2.1.3,  Prev: Section 2.1.1,  Up: Section 2.1
+
+2.1.2. The `-f' Option: Specifying the Output File Format
+---------------------------------------------------------
+
+If you do not supply the `-f' option to NASM, it will choose an output
+file format for you itself. In the distribution versions of NASM, the
+default is always `bin'; if you've compiled your own copy of NASM, you
+can redefine `OF_DEFAULT' at compile time and choose what you want the
+default to be.
+
+   Like `-o', the intervening space between `-f' and the output file
+format is optional; so `-f elf' and `-felf' are both valid.
+
+   A complete list of the available output file formats can be given by
+issuing the command `nasm -hf'.
+
+\1f
+File: nasm.info,  Node: Section 2.1.3,  Next: Section 2.1.4,  Prev: Section 2.1.2,  Up: Section 2.1
+
+2.1.3. The `-l' Option: Generating a Listing File
+-------------------------------------------------
+
+If you supply the `-l' 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 *note Section 4.3.10::) on the right. For example:
+
+     nasm -f elf myfile.asm -l myfile.lst
+
+   If a list file is selected, you may turn off listing for a section
+of your source with `[list -]', and turn it back on with `[list +]',
+(the default, obviously). There is no "user form" (without the
+brackets). This can be used to list only sections of interest, avoiding
+excessively long listings.
+
+\1f
+File: nasm.info,  Node: Section 2.1.4,  Next: Section 2.1.5,  Prev: Section 2.1.3,  Up: Section 2.1
+
+2.1.4. The `-M' Option: Generate Makefile Dependencies
+------------------------------------------------------
+
+This option can be used to generate makefile dependencies on stdout.
+This can be redirected to a file for further processing. For example:
+
+     nasm -M myfile.asm > myfile.dep
+
+\1f
+File: nasm.info,  Node: Section 2.1.5,  Next: Section 2.1.6,  Prev: Section 2.1.4,  Up: Section 2.1
+
+2.1.5. The `-MG' Option: Generate Makefile Dependencies
+-------------------------------------------------------
+
+This option can be used to generate makefile dependencies on stdout.
+This differs from the `-M' option in that if a nonexisting file is
+encountered, it is assumed to be a generated file and is added to the
+dependency list without a prefix.
+
+\1f
+File: nasm.info,  Node: Section 2.1.6,  Next: Section 2.1.7,  Prev: Section 2.1.5,  Up: Section 2.1
+
+2.1.6. The `-MF' Option: Set Makefile Dependency File
+-----------------------------------------------------
+
+This option can be used with the `-M' or `-MG' options to send the
+output to a file, rather than to stdout. For example:
+
+     nasm -M -MF myfile.dep myfile.asm
+
+\1f
+File: nasm.info,  Node: Section 2.1.7,  Next: Section 2.1.8,  Prev: Section 2.1.6,  Up: Section 2.1
+
+2.1.7. The `-MD' Option: Assemble and Generate Dependencies
+-----------------------------------------------------------
+
+The `-MD' option acts as the combination of the `-M' and `-MF' options
+(i.e. a filename has to be specified.) However, unlike the `-M' or
+`-MG' options, `-MD' does _not_ inhibit the normal operation of the
+assembler. Use this to automatically generate updated dependencies with
+every assembly session. For example:
+
+     nasm -f elf -o myfile.o -MD myfile.dep myfile.asm
+
+\1f
+File: nasm.info,  Node: Section 2.1.8,  Next: Section 2.1.9,  Prev: Section 2.1.7,  Up: Section 2.1
+
+2.1.8. The `-MT' Option: Dependency Target Name
+-----------------------------------------------
+
+The `-MT' option can be used to override the default name of the
+dependency target. This is normally the same as the output filename,
+specified by the `-o' option.
+
+\1f
+File: nasm.info,  Node: Section 2.1.9,  Next: Section 2.1.10,  Prev: Section 2.1.8,  Up: Section 2.1
+
+2.1.9. The `-MQ' Option: Dependency Target Name (Quoted)
+--------------------------------------------------------
+
+The `-MQ' option acts as the `-MT' option, except it tries to quote
+characters that have special meaning in Makefile syntax. This is not
+foolproof, as not all characters with special meaning are quotable in
+Make.
+
+\1f
+File: nasm.info,  Node: Section 2.1.10,  Next: Section 2.1.11,  Prev: Section 2.1.9,  Up: Section 2.1
+
+2.1.10. The `-MP' Option: Emit phony targets
+--------------------------------------------
+
+When used with any of the dependency generation options, the `-MP'
+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.
+
+\1f
+File: nasm.info,  Node: Section 2.1.11,  Next: Section 2.1.12,  Prev: Section 2.1.10,  Up: Section 2.1
+
+2.1.11. The `-F' Option: Selecting a Debug Information Format
+-------------------------------------------------------------
+
+This option is used to select the format of the debug information
+emitted into the output file, to be used by a debugger (or _will_ be).
+Prior to version 2.03.01, the use of this switch did _not_ enable
+output of the selected debug info format. Use `-g', see *note Section
+2.1.12::, to enable output. Versions 2.03.01 and later automatically
+enable `-g' if `-F' is specified.
+
+   A complete list of the available debug file formats for an output
+format can be seen by issuing the command `nasm -f <format> -y'. Not all
+output formats currently support debugging output. See *note Section
+2.1.26::.
+
+   This should not be confused with the `-f dbg' output format option
+which is not built into NASM by default. For information on how to
+enable it when building from the sources, see *note Section 7.14::.
+
+\1f
+File: nasm.info,  Node: Section 2.1.12,  Next: Section 2.1.13,  Prev: Section 2.1.11,  Up: Section 2.1
+
+2.1.12. The `-g' Option: Enabling Debug Information.
+----------------------------------------------------
+
+This option can be used to generate debugging information in the
+specified format. See *note Section 2.1.11::. Using `-g' without `-F'
+results in emitting debug info in the default format, if any, for the
+selected output format. If no debug information is currently
+implemented in the selected output format, `-g' is _silently ignored_.
+
+\1f
+File: nasm.info,  Node: Section 2.1.13,  Next: Section 2.1.14,  Prev: Section 2.1.12,  Up: Section 2.1
+
+2.1.13. The `-X' Option: Selecting an Error Reporting Format
+------------------------------------------------------------
+
+This option can be used to select an error reporting format for any
+error messages that might be produced by NASM.
+
+   Currently, two error reporting formats may be selected. They are the
+`-Xvc' option and the `-Xgnu' option. The GNU format is the default and
+looks like this:
+
+     filename.asm:65: error: specific error message
+
+   where `filename.asm' is the name of the source file in which the
+error was detected, `65' is the source file line number on which the
+error was detected, `error' is the severity of the error (this could be
+`warning'), and `specific error message' is a more detailed text
+message which should help pinpoint the exact problem.
+
+   The other format, specified by `-Xvc' is the style used by Microsoft
+Visual C++ and some other programs. It looks like this:
+
+     filename.asm(65) : error: specific error message
+
+   where the only difference is that the line number is in parentheses
+instead of being delimited by colons.
+
+   See also the `Visual C++' output format, *note Section 7.5::.
+
+\1f
+File: nasm.info,  Node: Section 2.1.14,  Next: Section 2.1.15,  Prev: Section 2.1.13,  Up: Section 2.1
+
+2.1.14. The `-Z' Option: Send Errors to a File
+----------------------------------------------
+
+Under `MS-DOS' it can be difficult (though there are ways) to redirect
+the standard-error output of a program to a file. Since NASM usually
+produces its warning and error messages on `stderr', this can make it
+hard to capture the errors if (for example) you want to load them into
+an editor.
+
+   NASM therefore provides the `-Z' 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
+
+     nasm -Z myfile.err -f obj myfile.asm
+
+   In earlier versions of NASM, this option was called `-E', but it was
+changed since `-E' is an option conventionally used for preprocessing
+only, with disastrous results. See *note Section 2.1.20::.
+
+\1f
+File: nasm.info,  Node: Section 2.1.15,  Next: Section 2.1.16,  Prev: Section 2.1.14,  Up: Section 2.1
+
+2.1.15. The `-s' Option: Send Errors to `stdout'
+------------------------------------------------
+
+The `-s' option redirects error messages to `stdout' rather than
+`stderr', so it can be redirected under `MS-DOS'. To assemble the file
+`myfile.asm' and pipe its output to the `more' program, you can type:
+
+     nasm -s -f obj myfile.asm | more
+
+   See also the `-Z' option, *note Section 2.1.14::.
+
+\1f
+File: nasm.info,  Node: Section 2.1.16,  Next: Section 2.1.17,  Prev: Section 2.1.15,  Up: Section 2.1
+
+2.1.16. The `-i' Option: Include File Search Directories
+--------------------------------------------------------
+
+When NASM sees the `%include' or `%pathsearch' directive in a source
+file (see *note Section 4.6.1::, *note Section 4.6.2:: or *note Section
+3.2.3::), 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 `-i' option. Therefore you can include files from a macro
+library, for example, by typing
+
+     nasm -ic:\macrolib\ -f obj myfile.asm
+
+   (As usual, a space between `-i' and the path name is allowed, and
+optional).
+
+   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 `-i' 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.
+
+   (You can use this to your advantage, if you're really perverse, by
+noting that the option `-ifoo' will cause `%include "bar.i"' to search
+for the file `foobar.i'...)
+
+   If you want to define a _standard_ include search path, similar to
+`/usr/include' on Unix systems, you should place one or more `-i'
+directives in the `NASMENV' environment variable (see *note Section
+2.1.28::).
+
+   For Makefile compatibility with many C compilers, this option can
+also be specified as `-I'.
+
+\1f
+File: nasm.info,  Node: Section 2.1.17,  Next: Section 2.1.18,  Prev: Section 2.1.16,  Up: Section 2.1
+
+2.1.17. The `-p' Option: Pre-Include a File
+-------------------------------------------
+
+NASM allows you to specify files to be _pre-included_ into your source
+file, by the use of the `-p' option. So running
+
+     nasm myfile.asm -p myinc.inc
+
+   is equivalent to running `nasm myfile.asm' and placing the directive
+`%include "myinc.inc"' at the start of the file.
+
+   For consistency with the `-I', `-D' and `-U' options, this option
+can also be specified as `-P'.
+
+\1f
+File: nasm.info,  Node: Section 2.1.18,  Next: Section 2.1.19,  Prev: Section 2.1.17,  Up: Section 2.1
+
+2.1.18. The `-d' Option: Pre-Define a Macro
+-------------------------------------------
+
+Just as the `-p' option gives an alternative to placing `%include'
+directives at the start of a source file, the `-d' option gives an
+alternative to placing a `%define' directive. You could code
+
+     nasm myfile.asm -dFOO=100
+
+   as an alternative to placing the directive
+
+     %define FOO 100
+
+   at the start of the file. You can miss off the macro value, as well:
+the option `-dFOO' is equivalent to coding `%define FOO'. This form of
+the directive may be useful for selecting assembly-time options which
+are then tested using `%ifdef', for example `-dDEBUG'.
+
+   For Makefile compatibility with many C compilers, this option can
+also be specified as `-D'.
+
+\1f
+File: nasm.info,  Node: Section 2.1.19,  Next: Section 2.1.20,  Prev: Section 2.1.18,  Up: Section 2.1
+
+2.1.19. The `-u' Option: Undefine a Macro
+-----------------------------------------
+
+The `-u' option undefines a macro that would otherwise have been pre-
+defined, either automatically or by a `-p' or `-d' option specified
+earlier on the command lines.
+
+   For example, the following command line:
+
+     nasm myfile.asm -dFOO=100 -uFOO
+
+   would result in `FOO' _not_ being a predefined macro in the program.
+This is useful to override options specified at a different point in a
+Makefile.
+
+   For Makefile compatibility with many C compilers, this option can
+also be specified as `-U'.
+
+\1f
+File: nasm.info,  Node: Section 2.1.20,  Next: Section 2.1.21,  Prev: Section 2.1.19,  Up: Section 2.1
+
+2.1.20. The `-E' Option: Preprocess Only
+----------------------------------------
+
+NASM allows the preprocessor to be run on its own, up to a point. Using
+the `-E' option (which requires no arguments) will cause NASM to
+preprocess its input file, expand all the macro references, remove all
+the comments and preprocessor directives, and print the resulting file
+on standard output (or save it to a file, if the `-o' option is also
+used).
+
+   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
+
+     %assign tablesize ($-tablestart)
+
+   will cause an error in preprocess-only mode.
+
+   For compatiblity with older version of NASM, this option can also be
+written `-e'. `-E' in older versions of NASM was the equivalent of the
+current `-Z' option, *note Section 2.1.14::.
+
+\1f
+File: nasm.info,  Node: Section 2.1.21,  Next: Section 2.1.22,  Prev: Section 2.1.20,  Up: Section 2.1
+
+2.1.21. The `-a' Option: Don't Preprocess At All
+------------------------------------------------
+
+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
+`-a' option, requiring no argument, instructs NASM to replace its
+powerful preprocessor with a stub preprocessor which does nothing.
+
+\1f
+File: nasm.info,  Node: Section 2.1.22,  Next: Section 2.1.23,  Prev: Section 2.1.21,  Up: Section 2.1
+
+2.1.22. The `-O' Option: Specifying Multipass Optimization
+----------------------------------------------------------
+
+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.
+
+   Using the `-O' option, you can tell NASM to carry out different
+levels of optimization. The syntax is:
+
+   * `-O0': No optimization. All operands take their long forms, if a
+     short form is not specified, except conditional jumps. This is
+     intended to match NASM 0.98 behavior.
+
+   * `-O1': Minimal optimization. As above, but immediate operands which
+     will fit in a signed byte are optimized, unless the long form is
+     specified.  Conditional jumps default to the long form unless
+     otherwise specified.
+
+   * `-Ox' (where `x' is the actual letter `x'): Multipass
+     optimization. Minimize branch offsets and signed immediate bytes,
+     overriding size specification unless the `strict' keyword has been
+     used (see *note Section 3.7::). For compatability with earlier
+     releases, the letter `x' may also be any number greater than one.
+     This number has no effect on the actual number of passes.
+
+   The `-Ox' mode is recommended for most uses.
+
+   Note that this is a capital `O', and is different from a small `o',
+which is used to specify the output file name. See *note Section
+2.1.1::.
+
+\1f
+File: nasm.info,  Node: Section 2.1.23,  Next: Section 2.1.24,  Prev: Section 2.1.22,  Up: Section 2.1
+
+2.1.23. The `-t' Option: Enable TASM Compatibility Mode
+-------------------------------------------------------
+
+NASM includes a limited form of compatibility with Borland's `TASM'.
+When NASM's `-t' option is used, the following changes are made:
+
+   * local labels may be prefixed with `@@' instead of `.'
+
+   * 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.  `mov eax,[DWORD val]' is valid syntax in TASM
+     compatibility mode. Note that you lose the ability to override the
+     default address type for the instruction.
+
+   * unprefixed forms of some directives supported (`arg', `elif',
+     `else', `endif', `if', `ifdef', `ifdifi', `ifndef', `include',
+     `local')
+
+\1f
+File: nasm.info,  Node: Section 2.1.24,  Next: Section 2.1.25,  Prev: Section 2.1.23,  Up: Section 2.1
+
+2.1.24. The `-w' and `-W' Options: Enable or Disable Assembly Warnings
+----------------------------------------------------------------------
+
+NASM can observe many conditions during the course of assembly which are
+worth mentioning to the user, but not a sufficiently severe error to
+justify NASM refusing to generate an output file. These conditions are
+reported like errors, but come up with the word `warning' before the
+message. Warnings do not prevent NASM from generating an output file and
+returning a success status to the operating system.
+
+   Some conditions are even less severe than that: they are only
+sometimes worth mentioning to the user. Therefore NASM supports the `-w'
+command-line option, which enables or disables certain classes of
+assembly warning. Such warning classes are described by a name, for
+example `orphan-labels'; you can enable warnings of this class by the
+command- line option `-w+orphan-labels' and disable it by
+`-w-orphan-labels'.
+
+   The suppressible warning classes are:
+
+   * `macro-params' covers warnings about multi-line macros being
+     invoked with the wrong number of parameters. This warning class is
+     enabled by default; see *note Section 4.3.2:: for an example of
+     why you might want to disable it.
+
+   * `macro-selfref' warns if a macro references itself. This warning
+     class is disabled by default.
+
+   * `macro-defaults' warns when a macro has more default parameters
+     than optional parameters. This warning class is enabled by
+     default; see *note Section 4.3.5:: for why you might want to
+     disable it.
+
+   * `orphan-labels' 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 *note
+     Section 3.1:: for more information.
+
+   * `number-overflow' covers warnings about numeric constants which
+     don't fit in 64 bits. This warning class is enabled by default.
+
+   * `gnu-elf-extensions' warns if 8-bit or 16-bit relocations are used
+     in `-f elf' format. The GNU extensions allow this. This warning
+     class is disabled by default.
+
+   * `float-overflow' warns about floating point overflow. Enabled by
+     default.
+
+   * `float-denorm' warns about floating point denormals. Disabled by
+     default.
+
+   * `float-underflow' warns about floating point underflow. Disabled by
+     default.
+
+   * `float-toolong' warns about too many digits in floating-point
+     numbers.  Enabled by default.
+
+   * `user' controls `%warning' directives (see *note Section 4.9::).
+     Enabled by default.
+
+   * `error' causes warnings to be treated as errors. Disabled by
+     default.
+
+   * `all' is an alias for _all_ suppressible warning classes (not
+     including `error'). Thus, `-w+all' enables all available warnings.
+
+   In addition, you can set warning classes across sections. Warning
+classes may be enabled with `[warning +warning-name]', disabled with
+`[warning -warning-name]' or reset to their original value with
+`[warning *warning-name]'. No "user form" (without the brackets) exists.
+
+   Since version 2.00, NASM has also supported the gcc-like syntax
+`-Wwarning' and `-Wno-warning' instead of `-w+warning' and
+`-w-warning', respectively.
+
+\1f
+File: nasm.info,  Node: Section 2.1.25,  Next: Section 2.1.26,  Prev: Section 2.1.24,  Up: Section 2.1
+
+2.1.25. The `-v' Option: Display Version Info
+---------------------------------------------
+
+Typing `NASM -v' will display the version of NASM which you are using,
+and the date on which it was compiled.
+
+   You will need the version number if you report a bug.
+
+\1f
+File: nasm.info,  Node: Section 2.1.26,  Next: Section 2.1.27,  Prev: Section 2.1.25,  Up: Section 2.1
+
+2.1.26. The `-y' Option: Display Available Debug Info Formats
+-------------------------------------------------------------
+
+Typing `nasm -f <option> -y' 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:
+
+     nasm -f elf -y
+
+     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
+
+\1f
+File: nasm.info,  Node: Section 2.1.27,  Next: Section 2.1.28,  Prev: Section 2.1.26,  Up: Section 2.1
+
+2.1.27. The `--prefix' and `--postfix' Options.
+-----------------------------------------------
+
+The `--prefix' and `--postfix' options prepend or append (respectively)
+the given argument to all `global' or `extern' variables. E.g.
+`--prefix _' will prepend the underscore to all global and external
+variables, as C sometimes (but not always) likes it.
+
+\1f
+File: nasm.info,  Node: Section 2.1.28,  Next: Section 2.2,  Prev: Section 2.1.27,  Up: Section 2.1
+
+2.1.28. The `NASMENV' Environment Variable
+------------------------------------------
+
+If you define an environment variable called `NASMENV', the program
+will interpret it as a list of extra command-line options, which are
+processed before the real command line. You can use this to define
+standard search directories for include files, by putting `-i' options
+in the `NASMENV' variable.
+
+   The value of the variable is split up at white space, so that the
+value `-s -ic:\nasmlib\' will be treated as two separate options.
+However, that means that the value `-dNAME="my name"' won't do what you
+might want, because it will be split at the space and the NASM
+command-line processing will get confused by the two nonsensical words
+`-dNAME="my' and `name"'.
+
+   To get round this, NASM provides a feature whereby, if you begin the
+`NASMENV' 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 `NASMENV' variable to the value
+`!-s!-ic:\nasmlib\' is equivalent to setting it to `-s -ic:\nasmlib\',
+but `!-dNAME="my name"' will work.
+
+   This environment variable was previously called `NASM'. This was
+changed with version 0.98.31.
+
+\1f
+File: nasm.info,  Node: Section 2.2,  Next: Section 2.2.1,  Prev: Section 2.1.28,  Up: Chapter 2
+
+2.2. Quick Start for MASM Users
+===============================
+
+If you're used to writing programs with MASM, or with TASM in MASM-
+compatible (non-Ideal) mode, or with `a86', this section attempts to
+outline the major differences between MASM's syntax and NASM's. If
+you're not already used to MASM, it's probably worth skipping this
+section.
+
+* Menu:
+
+* Section 2.2.1:: NASM Is Case-Sensitive
+* Section 2.2.2:: NASM Requires Square Brackets For Memory References
+* Section 2.2.3:: NASM Doesn't Store Variable Types
+* Section 2.2.4:: NASM Doesn't `ASSUME'
+* Section 2.2.5:: NASM Doesn't Support Memory Models
+* Section 2.2.6:: Floating-Point Differences
+* Section 2.2.7:: Other Differences
+
+\1f
+File: nasm.info,  Node: Section 2.2.1,  Next: Section 2.2.2,  Prev: Section 2.2,  Up: Section 2.2
+
+2.2.1. NASM Is Case-Sensitive
+-----------------------------
+
+One simple difference is that NASM is case-sensitive. It makes a
+difference whether you call your label `foo', `Foo' or `FOO'. If you're
+assembling to `DOS' or `OS/2' `.OBJ' files, you can invoke the
+`UPPERCASE' directive (documented in *note Section 7.4::) to ensure
+that all symbols exported to other code modules are forced to be upper
+case; but even then, _within_ a single module, NASM will distinguish
+between labels differing only in case.
+
+\1f
+File: nasm.info,  Node: Section 2.2.2,  Next: Section 2.2.3,  Prev: Section 2.2.1,  Up: Section 2.2
+
+2.2.2. NASM Requires Square Brackets For Memory References
+----------------------------------------------------------
+
+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,
+
+     foo     equ     1
+     bar     dw      2
+
+   then the two lines of code
+
+             mov     ax,foo
+             mov     ax,bar
+
+   generate completely different opcodes, despite having
+identical-looking syntaxes.
+
+   NASM avoids this undesirable situation by having a much simpler
+syntax for memory references. The rule is simply that any access to the
+_contents_ of a memory location requires square brackets around the
+address, and any access to the _address_ of a variable doesn't. So an
+instruction of the form `mov ax,foo' will _always_ refer to a
+compile-time constant, whether it's an `EQU' or the address of a
+variable; and to access the _contents_ of the variable `bar', you must
+code `mov ax,[bar]'.
+
+   This also means that NASM has no need for MASM's `OFFSET' keyword,
+since the MASM code `mov ax,offset bar' means exactly the same thing as
+NASM's `mov ax,bar'. If you're trying to get large amounts of MASM code
+to assemble sensibly under NASM, you can always code `%idefine offset'
+to make the preprocessor treat the `OFFSET' keyword as a no-op.
+
+   This issue is even more confusing in `a86', where declaring a label
+with a trailing colon defines it to be a `label' as opposed to a
+`variable' and causes `a86' to adopt NASM-style semantics; so in `a86',
+`mov ax,var' has different behaviour depending on whether `var' was
+declared as `var: dw 0' (a label) or `var dw 0' (a word-size variable).
+NASM is very simple by comparison: _everything_ is a label.
+
+   NASM, in the interests of simplicity, also does not support the
+hybrid syntaxes supported by MASM and its clones, such as `mov
+ax,table[bx]', where a memory reference is denoted by one portion
+outside square brackets and another portion inside. The correct syntax
+for the above is `mov ax,[table+bx]'. Likewise, `mov ax,es:[di]' is
+wrong and `mov ax,[es:di]' is right.
+
+\1f
+File: nasm.info,  Node: Section 2.2.3,  Next: Section 2.2.4,  Prev: Section 2.2.2,  Up: Section 2.2
+
+2.2.3. NASM Doesn't Store Variable Types
+----------------------------------------
+
+NASM, by design, chooses not to remember the types of variables you
+declare. Whereas MASM will remember, on seeing `var dw 0', that you
+declared `var' as a word-size variable, and will then be able to fill
+in the ambiguity in the size of the instruction `mov var,2', NASM will
+deliberately remember nothing about the symbol `var' except where it
+begins, and so you must explicitly code `mov word [var],2'.
+
+   For this reason, NASM doesn't support the `LODS', `MOVS', `STOS',
+`SCAS', `CMPS', `INS', or `OUTS' instructions, but only supports the
+forms such as `LODSB', `MOVSW', and `SCASD', which explicitly specify
+the size of the components of the strings being manipulated.
+
+\1f
+File: nasm.info,  Node: Section 2.2.4,  Next: Section 2.2.5,  Prev: Section 2.2.3,  Up: Section 2.2
+
+2.2.4. NASM Doesn't `ASSUME'
+----------------------------
+
+As part of NASM's drive for simplicity, it also does not support the
+`ASSUME' directive. NASM will not keep track of what values you choose
+to put in your segment registers, and will never _automatically_
+generate a segment override prefix.
+
+\1f
+File: nasm.info,  Node: Section 2.2.5,  Next: Section 2.2.6,  Prev: Section 2.2.4,  Up: Section 2.2
+
+2.2.5. NASM Doesn't Support Memory Models
+-----------------------------------------
+
+NASM also does not have any directives to support different 16-bit
+memory models. The programmer has to keep track of which functions are
+supposed to be called with a far call and which with a near call, and
+is responsible for putting the correct form of `RET' instruction
+(`RETN' or `RETF'; NASM accepts `RET' itself as an alternate form for
+`RETN'); in addition, the programmer is responsible for coding CALL FAR
+instructions where necessary when calling _external_ functions, and
+must also keep track of which external variable definitions are far and
+which are near.
+
+\1f
+File: nasm.info,  Node: Section 2.2.6,  Next: Section 2.2.7,  Prev: Section 2.2.5,  Up: Section 2.2
+
+2.2.6. Floating-Point Differences
+---------------------------------
+
+NASM uses different names to refer to floating-point registers from
+MASM: where MASM would call them `ST(0)', `ST(1)' and so on, and `a86'
+would call them simply `0', `1' and so on, NASM chooses to call them
+`st0', `st1' etc.
+
+   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.
+
+\1f
+File: nasm.info,  Node: Section 2.2.7,  Next: Chapter 3,  Prev: Section 2.2.6,  Up: Section 2.2
+
+2.2.7. Other Differences
+------------------------
+
+For historical reasons, NASM uses the keyword `TWORD' where MASM and
+compatible assemblers use `TBYTE'.
+
+   NASM does not declare uninitialized storage in the same way as MASM:
+where a MASM programmer might use `stack db 64 dup (?)', NASM requires
+`stack resb 64', intended to be read as `reserve 64 bytes'. For a
+limited amount of compatibility, since NASM treats `?' as a valid
+character in symbol names, you can code `? equ 0' and then writing `dw
+?' will at least do something vaguely useful. `DUP' is still not a
+supported syntax, however.
+
+   In addition to all of this, macros and directives work completely
+differently to MASM. See *note Chapter 4:: and *note Chapter 6:: for
+further details.
+
+\1f
+File: nasm.info,  Node: Chapter 3,  Next: Section 3.1,  Prev: Section 2.2.7,  Up: Top
+
+Chapter 3: The NASM Language
+****************************
+
+* Menu:
+
+* Section 3.1:: Layout of a NASM Source Line
+* Section 3.2:: Pseudo-Instructions
+* Section 3.3:: Effective Addresses
+* Section 3.4:: Constants
+* Section 3.5:: Expressions
+* Section 3.6:: `SEG' and `WRT'
+* Section 3.7:: `STRICT': Inhibiting Optimization
+* Section 3.8:: Critical Expressions
+* Section 3.9:: Local Labels
+
+\1f
+File: nasm.info,  Node: Section 3.1,  Next: Section 3.2,  Prev: Chapter 3,  Up: Chapter 3
+
+3.1. Layout of a NASM Source Line
+=================================
+
+Like most assemblers, each NASM source line contains (unless it is a
+macro, a preprocessor directive or an assembler directive: see *note
+Chapter 4:: and *note Chapter 6::) some combination of the four fields
+
+     label:    instruction operands        ; comment
+
+   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.
+
+   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.
+
+   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 `lodsb' alone on a line, and type
+`lodab' by accident, then that's still a valid source line which does
+nothing but define a label. Running NASM with the command-line option
+`-w+orphan-labels' will cause it to warn you if you define a label
+alone on a line without a trailing colon.)
+
+   Valid characters in labels are letters, numbers, `_', `$', `#', `@',
+`~', `.', and `?'. The only characters which may be used as the _first_
+character of an identifier are letters, `.' (with special meaning: see
+*note Section 3.9::), `_' and `?'. An identifier may also be prefixed
+with a `$' 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 `eax', you can refer to `$eax' in NASM
+code to distinguish the symbol from the register. Maximum length of an
+identifier is 4095 characters.
+
+   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 `LOCK', `REP', `REPE'/`REPZ' or `REPNE'/`REPNZ', in the
+usual way. Explicit address-size and operand-size prefixes `A16',
+`A32', `A64', `O16' and `O32', `O64' are provided - one example of
+their use is given in *note Chapter 10::. You can also use the name of
+a segment register as an instruction prefix: coding `es mov [bx],ax' is
+equivalent to coding `mov [es:bx],ax'. We recommend the latter syntax,
+since it is consistent with other syntactic features of the language,
+but for instructions such as `LODSB', which has no operands and yet can
+require a segment override, there is no clean syntactic way to proceed
+apart from `es lodsb'.
+
+   An instruction is not required to use a prefix: prefixes such as
+`CS', `A32', `LOCK' or `REPE' can appear on a line by themselves, and
+NASM will just generate the prefix bytes.
+
+   In addition to actual machine instructions, NASM also supports a
+number of pseudo-instructions, described in *note Section 3.2::.
+
+   Instruction operands may take a number of forms: they can be
+registers, described simply by the register name (e.g. `ax', `bp',
+`ebx', `cr0': NASM does not use the `gas'-style syntax in which
+register names must be prefixed by a `%' sign), or they can be
+effective addresses (see *note Section 3.3::), constants (*note Section
+3.4::) or expressions (*note Section 3.5::).
+
+   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:
+
+             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
+
+   Almost any x87 floating-point instruction that references memory
+must use one of the prefixes `DWORD', `QWORD' or `TWORD' to indicate
+what size of memory operand it refers to.
+
+\1f
+File: nasm.info,  Node: Section 3.2,  Next: Section 3.2.1,  Prev: Section 3.1,  Up: Chapter 3
+
+3.2. Pseudo-Instructions
+========================
+
+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 `DB', `DW', `DD', `DQ', `DT', `DO' and `DY'; their uninitialized
+counterparts `RESB', `RESW', `RESD', `RESQ', `REST', `RESO' and `RESY';
+the `INCBIN' command, the `EQU' command, and the `TIMES' prefix.
+
+* Menu:
+
+* Section 3.2.1:: `DB' and Friends: Declaring Initialized Data
+* Section 3.2.2:: `RESB' and Friends: Declaring Uninitialized Data
+* Section 3.2.3:: `INCBIN': Including External Binary Files
+* Section 3.2.4:: `EQU': Defining Constants
+* Section 3.2.5:: `TIMES': Repeating Instructions or Data
+
+\1f
+File: nasm.info,  Node: Section 3.2.1,  Next: Section 3.2.2,  Prev: Section 3.2,  Up: Section 3.2
+
+3.2.1. `DB' and Friends: Declaring Initialized Data
+---------------------------------------------------
+
+`DB', `DW', `DD', `DQ', `DT', `DO' and `DY' are used, much as in MASM,
+to declare initialized data in the output file. They can be invoked in
+a wide range of ways:
+
+           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
+
+   `DT', `DO' and `DY' do not accept numeric constants as operands.
+
+\1f
+File: nasm.info,  Node: Section 3.2.2,  Next: Section 3.2.3,  Prev: Section 3.2.1,  Up: Section 3.2
+
+3.2.2. `RESB' and Friends: Declaring Uninitialized Data
+-------------------------------------------------------
+
+`RESB', `RESW', `RESD', `RESQ', `REST', `RESO' and `RESY' are designed
+to be used in the BSS section of a module: they declare _uninitialized_
+storage space. Each takes a single operand, which is the number of
+bytes, words, doublewords or whatever to reserve. As stated in *note
+Section 2.2.7::, NASM does not support the MASM/TASM syntax of
+reserving uninitialized space by writing `DW ?' or similar things: this
+is what it does instead. The operand to a `RESB'-type
+pseudo-instruction is a _critical expression_: see *note Section 3.8::.
+
+   For example:
+
+     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
+
+\1f
+File: nasm.info,  Node: Section 3.2.3,  Next: Section 3.2.4,  Prev: Section 3.2.2,  Up: Section 3.2
+
+3.2.3. `INCBIN': Including External Binary Files
+------------------------------------------------
+
+`INCBIN' 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:
+
+         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
+
+   `INCBIN' 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.
+
+\1f
+File: nasm.info,  Node: Section 3.2.4,  Next: Section 3.2.5,  Prev: Section 3.2.3,  Up: Section 3.2
+
+3.2.4. `EQU': Defining Constants
+--------------------------------
+
+`EQU' defines a symbol to a given constant value: when `EQU' is used,
+the source line must contain a label. The action of `EQU' 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,
+
+     message         db      'hello, world'
+     msglen          equ     $-message
+
+   defines `msglen' to be the constant 12. `msglen' may not then be
+redefined later. This is not a preprocessor definition either: the
+value of `msglen' is evaluated _once_, using the value of `$' (see
+*note Section 3.5:: for an explanation of `$') at the point of
+definition, rather than being evaluated wherever it is referenced and
+using the value of `$' at the point of reference.
+
+\1f
+File: nasm.info,  Node: Section 3.2.5,  Next: Section 3.3,  Prev: Section 3.2.4,  Up: Section 3.2
+
+3.2.5. `TIMES': Repeating Instructions or Data
+----------------------------------------------
+
+The `TIMES' prefix causes the instruction to be assembled multiple
+times. This is partly present as NASM's equivalent of the `DUP' syntax
+supported by MASM-compatible assemblers, in that you can code
+
+     zerobuf:        times 64 db 0
+
+   or similar things; but `TIMES' is more versatile than that. The
+argument to `TIMES' is not just a numeric constant, but a numeric
+_expression_, so you can do things like
+
+     buffer: db      'hello, world'
+             times 64-$+buffer db ' '
+
+   which will store exactly enough spaces to make the total length of
+`buffer' up to 64. Finally, `TIMES' can be applied to ordinary
+instructions, so you can code trivial unrolled loops in it:
+
+             times 100 movsb
+
+   Note that there is no effective difference between `times 100 resb 1'
+and `resb 100', except that the latter will be assembled about 100
+times faster due to the internal structure of the assembler.
+
+   The operand to `TIMES' is a critical expression (*note Section
+3.8::).
+
+   Note also that `TIMES' can't be applied to macros: the reason for
+this is that `TIMES' is processed after the macro phase, which allows
+the argument to `TIMES' to contain expressions such as `64-$+buffer' as
+above. To repeat more than one line of code, or a complex macro, use the
+preprocessor `%rep' directive.
+
+\1f
+File: nasm.info,  Node: Section 3.3,  Next: Section 3.4,  Prev: Section 3.2.5,  Up: Chapter 3
+
+3.3. Effective Addresses
+========================
+
+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:
+
+     wordvar dw      123
+             mov     ax,[wordvar]
+             mov     ax,[wordvar+1]
+             mov     ax,[es:wordvar+bx]
+
+   Anything not conforming to this simple system is not a valid memory
+reference in NASM, for example `es:wordvar[bx]'.
+
+   More complicated effective addresses, such as those involving more
+than one register, work in exactly the same way:
+
+             mov     eax,[ebx*2+ecx+offset]
+             mov     ax,[bp+di+8]
+
+   NASM is capable of doing algebra on these effective addresses, so
+that things which don't necessarily _look_ legal are perfectly all
+right:
+
+         mov     eax,[ebx*5]             ; assembles as [ebx*4+ebx]
+         mov     eax,[label1*2-label2]   ; ie [label1+(label1-label2)]
+
+   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 `[eax*2+0]' and `[eax+eax]', and NASM will generally generate
+the latter on the grounds that the former requires four bytes to store
+a zero offset.
+
+   NASM has a hinting mechanism which will cause `[eax+ebx]' and
+`[ebx+eax]' to generate different opcodes; this is occasionally useful
+because `[esi+ebp]' and `[ebp+esi]' have different default segment
+registers.
+
+   However, you can force NASM to generate an effective address in a
+particular form by the use of the keywords `BYTE', `WORD', `DWORD' and
+`NOSPLIT'. If you need `[eax+3]' to be assembled using a double-word
+offset field instead of the one byte NASM will normally generate, you
+can code `[dword eax+3]'. Similarly, you can force NASM to use a byte
+offset for a small value which it hasn't seen on the first pass (see
+*note Section 3.8:: for an example of such a code fragment) by using
+`[byte eax+offset]'. As special cases, `[byte eax]' will code `[eax+0]'
+with a byte offset of zero, and `[dword eax]' will code it with a
+double-word offset of zero. The normal form, `[eax]', will be coded
+with no offset field.
+
+   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
+(*note Section 10.2::). 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.
+
+   Similarly, NASM will split `[eax*2]' into `[eax+eax]' because that
+allows the offset field to be absent and space to be saved; in fact, it
+will also split `[eax*2+offset]' into `[eax+eax+offset]'. You can
+combat this behaviour by the use of the `NOSPLIT' keyword: `[nosplit
+eax*2]' will force `[eax*2+0]' to be generated literally.
+
+   In 64-bit mode, NASM will by default generate absolute addresses. The
+`REL' keyword makes it produce `RIP'-relative addresses. Since this is
+frequently the normally desired behaviour, see the `DEFAULT' directive
+(*note Section 6.2::). The keyword `ABS' overrides `REL'.
+
+\1f
+File: nasm.info,  Node: Section 3.4,  Next: Section 3.4.1,  Prev: Section 3.3,  Up: Chapter 3
+
+3.4. Constants
+==============
+
+NASM understands four different types of constant: numeric, character,
+string and floating-point.
+
+* Menu:
+
+* Section 3.4.1:: Numeric Constants
+* Section 3.4.2:: Character Strings
+* Section 3.4.3:: Character Constants
+* Section 3.4.4:: String Constants
+* Section 3.4.5:: Unicode Strings
+* Section 3.4.6:: Floating-Point Constants
+* Section 3.4.7:: Packed BCD Constants
+
+\1f
+File: nasm.info,  Node: Section 3.4.1,  Next: Section 3.4.2,  Prev: Section 3.4,  Up: Section 3.4
+
+3.4.1. Numeric Constants
+------------------------
+
+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 `H' or `X', `Q' or `O', and `B' for hexadecimal, octal and
+binary respectively, or you can prefix `0x' for hexadecimal in the
+style of C, or you can prefix `$' for hexadecimal in the style of
+Borland Pascal. Note, though, that the `$' prefix does double duty as a
+prefix on identifiers (see *note Section 3.1::), so a hex number
+prefixed with a `$' sign must have a digit after the `$' rather than a
+letter. In addition, current versions of NASM accept the prefix `0h'
+for hexadecimal, `0o' or `0q' for octal, and `0b' for binary. Please
+note that unlike C, a `0' prefix by itself does _not_ imply an octal
+constant!
+
+   Numeric constants can have underscores (`_') interspersed to break up
+long strings.
+
+   Some examples (all producing exactly the same code):
+
+             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
+
+\1f
+File: nasm.info,  Node: Section 3.4.2,  Next: Section 3.4.3,  Prev: Section 3.4.1,  Up: Section 3.4
+
+3.4.2. Character Strings
+------------------------
+
+A character string consists of up to eight characters enclosed in either
+single quotes (`'...''), double quotes (`"..."') or backquotes
+(``...`'). 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
+`\'-escapes for special characters.
+
+   The following escape sequences are recognized by backquoted strings:
+
+           \'          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
+
+   All other escape sequences are reserved. Note that `\0', meaning a
+`NUL' character (ASCII 0), is a special case of the octal escape
+sequence.
+
+   Unicode characters specified with `\u' or `\U' are converted to
+UTF-8. For example, the following lines are all equivalent:
+
+           db `\u263a`            ; UTF-8 smiley face
+           db `\xe2\x98\xba`      ; UTF-8 smiley face
+           db 0E2h, 098h, 0BAh    ; UTF-8 smiley face
+
+\1f
+File: nasm.info,  Node: Section 3.4.3,  Next: Section 3.4.4,  Prev: Section 3.4.2,  Up: Section 3.4
+
+3.4.3. Character Constants
+--------------------------
+
+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.
+
+   A character constant with more than one byte will be arranged with
+little-endian order in mind: if you code
+
+               mov eax,'abcd'
+
+   then the constant generated is not `0x61626364', but `0x64636261',
+so that if you were then to store the value into memory, it would read
+`abcd' rather than `dcba'. This is also the sense of character
+constants understood by the Pentium's `CPUID' instruction.
+
+\1f
+File: nasm.info,  Node: Section 3.4.4,  Next: Section 3.4.5,  Prev: Section 3.4.3,  Up: Section 3.4
+
+3.4.4. String Constants
+-----------------------
+
+String constants are character strings used in the context of some
+pseudo- instructions, namely the `DB' family and `INCBIN' (where it
+represents a filename.) They are also used in certain preprocessor
+directives.
+
+   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:
+
+           db    'hello'               ; string constant
+           db    'h','e','l','l','o'   ; equivalent character constants
+
+   And the following are also equivalent:
+
+           dd    'ninechars'           ; doubleword string constant
+           dd    'nine','char','s'     ; becomes three doublewords
+           db    'ninechars',0,0,0     ; and really looks like this
+
+   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 `db 'ab'' would have the same
+effect as `db 'a'', which would be silly. Similarly, three-character or
+four-character constants are treated as strings when they are operands
+to `DW', and so forth.
+
+\1f
+File: nasm.info,  Node: Section 3.4.5,  Next: Section 3.4.6,  Prev: Section 3.4.4,  Up: Section 3.4
+
+3.4.5. Unicode Strings
+----------------------
+
+The special operators `__utf16__' and `__utf32__' allows definition of
+Unicode strings. They take a string in UTF-8 format and converts it to
+(littleendian) UTF-16 or UTF-32, respectively.
+
+   For example:
+
+     %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
+
+   `__utf16__' and `__utf32__' can be applied either to strings passed
+to the `DB' family instructions, or to character constants in an
+expression context.
+
+\1f
+File: nasm.info,  Node: Section 3.4.6,  Next: Section 3.4.7,  Prev: Section 3.4.5,  Up: Section 3.4
+
+3.4.6. Floating-Point Constants
+-------------------------------
+
+Floating-point constants are acceptable only as arguments to `DB',
+`DW', `DD', `DQ', `DT', and `DO', or as arguments to the special
+operators `__float8__', `__float16__', `__float32__', `__float64__',
+`__float80m__', `__float80e__', `__float128l__', and `__float128h__'.
+
+   Floating-point constants are expressed in the traditional form:
+digits, then a period, then optionally more digits, then optionally an
+`E' followed by an exponent. The period is mandatory, so that NASM can
+distinguish between `dd 1', which declares an integer constant, and `dd
+1.0' which declares a floating-point constant. NASM also support
+C99-style hexadecimal floating-point: `0x', hexadecimal digits, period,
+optionally more hexadeximal digits, then optionally a `P' followed by a
+_binary_ (not hexadecimal) exponent in decimal notation.
+
+   Underscores to break up groups of digits are permitted in
+floating-point constants as well.
+
+   Some examples:
+
+           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
+
+   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."
+
+   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. `__float80m__' and `__float80e__'
+produce the 64-bit mantissa and 16-bit exponent of an 80-bit
+floating-point number, and `__float128l__' and `__float128h__' produce
+the lower and upper 64-bit halves of a 128-bit floating-point number,
+respectively.
+
+   For example:
+
+           mov    rax,__float64__(3.141592653589793238462)
+
+   ... would assign the binary representation of pi as a 64-bit
+floating point number into `RAX'. This is exactly equivalent to:
+
+           mov    rax,0x400921fb54442d18
+
+   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.
+
+   The special tokens `__Infinity__', `__QNaN__' (or `__NaN__') and
+`__SNaN__' can be used to generate infinities, quiet NaNs, and
+signalling NaNs, respectively. These are normally used as macros:
+
+     %define Inf __Infinity__
+     %define NaN __QNaN__
+
+           dq    +1.5, -Inf, NaN         ; Double-precision constants
+
+\1f
+File: nasm.info,  Node: Section 3.4.7,  Next: Section 3.5,  Prev: Section 3.4.6,  Up: Section 3.4
+
+3.4.7. Packed BCD Constants
+---------------------------
+
+x87-style packed BCD constants can be used in the same contexts as
+80-bit floating-point numbers. They are suffixed with `p' or prefixed
+with `0p', and can include up to 18 decimal digits.
+
+   As with other numeric constants, underscores can be used to separate
+digits.
+
+   For example:
+
+           dt 12_345_678_901_245_678p
+           dt -12_345_678_901_245_678p
+           dt +0p33
+           dt 33p
+
+\1f
+File: nasm.info,  Node: Section 3.5,  Next: Section 3.5.1,  Prev: Section 3.4.7,  Up: Chapter 3
+
+3.5. Expressions
+================
+
+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.
+
+   NASM supports two special tokens in expressions, allowing
+calculations to involve the current assembly position: the `$' and `$$'
+tokens.  `$' evaluates to the assembly position at the beginning of the
+line containing the expression; so you can code an infinite loop using
+`JMP $'. `$$' evaluates to the beginning of the current section; so you
+can tell how far into the section you are by using `($-$$)'.
+
+   The arithmetic operators provided by NASM are listed here, in
+increasing order of precedence.
+
+* Menu:
+
+* Section 3.5.1:: `|': Bitwise OR Operator
+* Section 3.5.2:: `^': Bitwise XOR Operator
+* Section 3.5.3:: `&': Bitwise AND Operator
+* Section 3.5.4:: `<<' and `>>': Bit Shift Operators
+* Section 3.5.5:: `+' and `-': Addition and Subtraction Operators
+* Section 3.5.6:: `*', `/', `//', `%' and `%%': Multiplication and Division
+* Section 3.5.7:: Unary Operators: `+', `-', `~', `!' and `SEG'
+
+\1f
+File: nasm.info,  Node: Section 3.5.1,  Next: Section 3.5.2,  Prev: Section 3.5,  Up: Section 3.5
+
+3.5.1. `|': Bitwise OR Operator
+-------------------------------
+
+The `|' operator gives a bitwise OR, exactly as performed by the `OR'
+machine instruction. Bitwise OR is the lowest-priority arithmetic
+operator supported by NASM.
+
+\1f
+File: nasm.info,  Node: Section 3.5.2,  Next: Section 3.5.3,  Prev: Section 3.5.1,  Up: Section 3.5
+
+3.5.2. `^': Bitwise XOR Operator
+--------------------------------
+
+`^' provides the bitwise XOR operation.
+
+\1f
+File: nasm.info,  Node: Section 3.5.3,  Next: Section 3.5.4,  Prev: Section 3.5.2,  Up: Section 3.5
+
+3.5.3. `&': Bitwise AND Operator
+--------------------------------
+
+`&' provides the bitwise AND operation.
+
+\1f
+File: nasm.info,  Node: Section 3.5.4,  Next: Section 3.5.5,  Prev: Section 3.5.3,  Up: Section 3.5
+
+3.5.4. `<<' and `>>': Bit Shift Operators
+-----------------------------------------
+
+`<<' gives a bit-shift to the left, just as it does in C. So `5<<3'
+evaluates to 5 times 8, or 40. `>>' gives a bit-shift to the right; in
+NASM, such a shift is _always_ 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.
+
+\1f
+File: nasm.info,  Node: Section 3.5.5,  Next: Section 3.5.6,  Prev: Section 3.5.4,  Up: Section 3.5
+
+3.5.5. `+' and `-': Addition and Subtraction Operators
+------------------------------------------------------
+
+The `+' and `-' operators do perfectly ordinary addition and
+subtraction.
+
+\1f
+File: nasm.info,  Node: Section 3.5.6,  Next: Section 3.5.7,  Prev: Section 3.5.5,  Up: Section 3.5
+
+3.5.6. `*', `/', `//', `%' and `%%': Multiplication and Division
+----------------------------------------------------------------
+
+`*' is the multiplication operator. `/' and `//' are both division
+operators: `/' is unsigned division and `//' is signed division.
+Similarly, `%' and `%%' provide unsigned and signed modulo operators
+respectively.
+
+   NASM, like ANSI C, provides no guarantees about the sensible
+operation of the signed modulo operator.
+
+   Since the `%' 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.
+
+\1f
+File: nasm.info,  Node: Section 3.5.7,  Next: Section 3.6,  Prev: Section 3.5.6,  Up: Section 3.5
+
+3.5.7. Unary Operators: `+', `-', `~', `!' and `SEG'
+----------------------------------------------------
+
+The highest-priority operators in NASM's expression grammar are those
+which only apply to one argument. `-' negates its operand, `+' does
+nothing (it's provided for symmetry with `-'), `~' computes the one's
+complement of its operand, `!' is the logical negation operator, and
+`SEG' provides the segment address of its operand (explained in more
+detail in *note Section 3.6::).
+
+\1f
+File: nasm.info,  Node: Section 3.6,  Next: Section 3.7,  Prev: Section 3.5.7,  Up: Chapter 3
+
+3.6. `SEG' and `WRT'
+====================
+
+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 `SEG' operator to perform
+this function.
+
+   The `SEG' operator returns the _preferred_ segment base of a symbol,
+defined as the segment base relative to which the offset of the symbol
+makes sense. So the code
+
+             mov     ax,seg symbol
+             mov     es,ax
+             mov     bx,symbol
+
+   will load `ES:BX' with a valid pointer to the symbol `symbol'.
+
+   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 `WRT' (With Reference To) keyword. So you can
+do things like
+
+             mov     ax,weird_seg        ; weird_seg is a segment base
+             mov     es,ax
+             mov     bx,symbol wrt weird_seg
+
+   to load `ES:BX' with a different, but functionally equivalent,
+pointer to the symbol `symbol'.
+
+   NASM supports far (inter-segment) calls and jumps by means of the
+syntax `call segment:offset', where `segment' and `offset' both
+represent immediate values. So to call a far procedure, you could code
+either of
+
+             call    (seg procedure):procedure
+             call    weird_seg:(procedure wrt weird_seg)
+
+   (The parentheses are included for clarity, to show the intended
+parsing of the above instructions. They are not necessary in practice.)
+
+   NASM supports the syntax `call far procedure' as a synonym for the
+first of the above usages. `JMP' works identically to `CALL' in these
+examples.
+
+   To declare a far pointer to a data item in a data segment, you must
+code
+
+             dw      symbol, seg symbol
+
+   NASM supports no convenient synonym for this, though you can always
+invent one using the macro processor.
+
+\1f
+File: nasm.info,  Node: Section 3.7,  Next: Section 3.8,  Prev: Section 3.6,  Up: Chapter 3
+
+3.7. `STRICT': Inhibiting Optimization
+======================================
+
+When assembling with the optimizer set to level 2 or higher (see *note
+Section 2.1.22::), NASM will use size specifiers (`BYTE', `WORD',
+`DWORD', `QWORD', `TWORD', `OWORD' or `YWORD'), but will give them the
+smallest possible size. The keyword `STRICT' 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 `BITS 16'
+mode,
+
+             push dword 33
+
+   is encoded in three bytes `66 6A 21', whereas
+
+             push strict dword 33
+
+   is encoded in six bytes, with a full dword immediate operand `66 68
+21 00 00 00'.
+
+   With the optimizer off, the same code (six bytes) is generated
+whether the `STRICT' keyword was used or not.
+
+\1f
+File: nasm.info,  Node: Section 3.8,  Next: Section 3.9,  Prev: Section 3.7,  Up: Chapter 3
+
+3.8. Critical Expressions
+=========================
+
+Although NASM has an optional multi-pass optimizer, there are some
+expressions which must be resolvable on the first pass. These are called
+_Critical Expressions_.
+
+   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,
+
+             times (label-$) db 0
+     label:  db      'Where am I?'
+
+   The argument to `TIMES' in this case could equally legally evaluate
+to anything at all; NASM will reject this example because it cannot
+tell the size of the `TIMES' line when it first sees it. It will just
+as firmly reject the slightly paradoxical code
+
+             times (label-$+1) db 0
+     label:  db      'NOW where am I?'
+
+   in which _any_ value for the `TIMES' argument is by definition wrong!
+
+   NASM rejects these examples by means of a concept called a _critical
+expression_, 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 `TIMES'
+prefix is a critical expression.
+
+\1f
+File: nasm.info,  Node: Section 3.9,  Next: Chapter 4,  Prev: Section 3.8,  Up: Chapter 3
+
+3.9. Local Labels
+=================
+
+NASM gives special treatment to symbols beginning with a period. A label
+beginning with a single period is treated as a _local_ label, which
+means that it is associated with the previous non-local label. So, for
+example:
+
+     label1  ; some code
+
+     .loop
+             ; some more code
+
+             jne     .loop
+             ret
+
+     label2  ; some code
+
+     .loop
+             ; some more code
+
+             jne     .loop
+             ret
+
+   In the above code fragment, each `JNE' instruction jumps to the line
+immediately before it, because the two definitions of `.loop' are kept
+separate by virtue of each being associated with the previous non-local
+label.
+
+   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 _defining_ a local label in terms of the previous non-local
+label: the first definition of `.loop' above is really defining a
+symbol called `label1.loop', and the second defines a symbol called
+`label2.loop'. So, if you really needed to, you could write
+
+     label3  ; some more code
+             ; and some more
+
+             jmp label1.loop
+
+   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
+`..@', then it does nothing to the local label mechanism. So you could
+code
+
+     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
+
+   NASM has the capacity to define other special symbols beginning with
+a double period: for example, `..start' is used to specify the entry
+point in the `obj' output format (see *note Section 7.4.6::).
+
+\1f
+File: nasm.info,  Node: Chapter 4,  Next: Section 4.1,  Prev: Section 3.9,  Up: Top
+
+Chapter 4: The NASM Preprocessor
+********************************
+
+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 `%' sign.
+
+   The preprocessor collapses all lines which end with a backslash (\)
+character into a single line. Thus:
+
+     %define THIS_VERY_LONG_MACRO_NAME_IS_DEFINED_TO \
+             THIS_VALUE
+
+   will work like a single-line macro without the backslash-newline
+sequence.
+
+* Menu:
+
+* Section 4.1:: Single-Line Macros
+* Section 4.2:: String Manipulation in Macros
+* Section 4.3:: Multi-Line Macros: `%macro'
+* Section 4.4:: Conditional Assembly
+* Section 4.5:: Preprocessor Loops: `%rep'
+* Section 4.6:: Source Files and Dependencies
+* Section 4.7:: The Context Stack
+* Section 4.8:: Stack Relative Preprocessor Directives
+* Section 4.9:: Reporting User-Defined Errors: `%error', `%warning', `%fatal'
+* Section 4.10:: Other Preprocessor Directives
+* Section 4.11:: Standard Macros
+
+\1f
+File: nasm.info,  Node: Section 4.1,  Next: Section 4.1.1,  Prev: Chapter 4,  Up: Chapter 4
+
+4.1. Single-Line Macros
+=======================
+
+* Menu:
+
+* Section 4.1.1:: The Normal Way: `%define'
+* Section 4.1.2:: Resolving `%define': `%xdefine'
+* Section 4.1.3:: Macro Indirection: `%[...]'
+* Section 4.1.4:: Concatenating Single Line Macro Tokens: `%+'
+* Section 4.1.5:: The Macro Name Itself: `%?' and `%??'
+* Section 4.1.6:: Undefining Single-Line Macros: `%undef'
+* Section 4.1.7:: Preprocessor Variables: `%assign'
+* Section 4.1.8:: Defining Strings: `%defstr'
+* Section 4.1.9:: Defining Tokens: `%deftok'
+
+\1f
+File: nasm.info,  Node: Section 4.1.1,  Next: Section 4.1.2,  Prev: Section 4.1,  Up: Section 4.1
+
+4.1.1. The Normal Way: `%define'
+--------------------------------
+
+Single-line macros are defined using the `%define' preprocessor
+directive. The definitions work in a similar way to C; so you can do
+things like
+
+     %define ctrl    0x1F &
+     %define param(a,b) ((a)+(a)*(b))
+
+             mov     byte [param(2,ebx)], ctrl 'D'
+
+   which will expand to
+
+             mov     byte [(2)+(2)*(ebx)], 0x1F & 'D'
+
+   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
+
+     %define a(x)    1+b(x)
+     %define b(x)    2*x
+
+             mov     ax,a(8)
+
+   will evaluate in the expected way to `mov ax,1+2*8', even though the
+macro `b' wasn't defined at the time of definition of `a'.
+
+   Macros defined with `%define' are case sensitive: after `%define foo
+bar', only `foo' will expand to `bar': `Foo' or `FOO' will not. By
+using `%idefine' instead of `%define' (the `i' stands for
+`insensitive') you can define all the case variants of a macro at once,
+so that `%idefine foo bar' would cause `foo', `Foo', `FOO', `fOO' and
+so on all to expand to `bar'.
+
+   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
+
+     %define a(x)    1+a(x)
+
+             mov     ax,a(3)
+
+   the macro `a(3)' will expand once, becoming `1+a(3)', and will then
+expand no further. This behaviour can be useful: see *note Section 9.1::
+for an example of its use.
+
+   You can overload single-line macros: if you write
+
+     %define foo(x)   1+x
+     %define foo(x,y) 1+x*y
+
+   the preprocessor will be able to handle both types of macro call, by
+counting the parameters you pass; so `foo(3)' will become `1+3' whereas
+`foo(ebx,2)' will become `1+ebx*2'. However, if you define
+
+     %define foo bar
+
+   then no other definition of `foo' will be accepted: a macro with no
+parameters prohibits the definition of the same name as a macro _with_
+parameters, and vice versa.
+
+   This doesn't prevent single-line macros being _redefined_: you can
+perfectly well define a macro with
+
+     %define foo bar
+
+   and then re-define it later in the same source file with
+
+     %define foo baz
+
+   Then everywhere the macro `foo' is invoked, it will be expanded
+according to the most recent definition. This is particularly useful
+when defining single-line macros with `%assign' (see *note Section
+4.1.7::).
+
+   You can pre-define single-line macros using the `-d' option on the
+NASM command line: see *note Section 2.1.18::.
+
+\1f
+File: nasm.info,  Node: Section 4.1.2,  Next: Section 4.1.3,  Prev: Section 4.1.1,  Up: Section 4.1
+
+4.1.2. Resolving `%define': `%xdefine'
+--------------------------------------
+
+To have a reference to an embedded single-line macro resolved at the
+time that the embedding macro is _defined_, as opposed to when the
+embedding macro is _expanded_, you need a different mechanism to the
+one offered by `%define'. The solution is to use `%xdefine', or it's
+case-insensitive counterpart `%ixdefine'.
+
+   Suppose you have the following code:
+
+     %define  isTrue  1
+     %define  isFalse isTrue
+     %define  isTrue  0
+
+     val1:    db      isFalse
+
+     %define  isTrue  1
+
+     val2:    db      isFalse
+
+   In this case, `val1' is equal to 0, and `val2' is equal to 1.  This
+is because, when a single-line macro is defined using `%define', it is
+expanded only when it is called. As `isFalse' expands to `isTrue', the
+expansion will be the current value of `isTrue'.  The first time it is
+called that is 0, and the second time it is 1.
+
+   If you wanted `isFalse' to expand to the value assigned to the
+embedded macro `isTrue' at the time that `isFalse' was defined, you
+need to change the above code to use `%xdefine'.
+
+     %xdefine isTrue  1
+     %xdefine isFalse isTrue
+     %xdefine isTrue  0
+
+     val1:    db      isFalse
+
+     %xdefine isTrue  1
+
+     val2:    db      isFalse
+
+   Now, each time that `isFalse' is called, it expands to 1, as that is
+what the embedded macro `isTrue' expanded to at the time that `isFalse'
+was defined.
+
+\1f
+File: nasm.info,  Node: Section 4.1.3,  Next: Section 4.1.4,  Prev: Section 4.1.2,  Up: Section 4.1
+
+4.1.3. Macro Indirection: `%[...]'
+----------------------------------
+
+The `%[...]' 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 `Foo16', `Foo32'
+and `Foo64', you could write:
+
+          mov ax,Foo%[__BITS__]   ; The Foo value
+
+   to use the builtin macro `__BITS__' (see *note Section 4.11.5::) to
+automatically select between them. Similarly, the two statements:
+
+     %xdefine Bar         Quux    ; Expands due to %xdefine
+     %define  Bar         %[Quux] ; Expands due to %[...]
+
+   have, in fact, exactly the same effect.
+
+   `%[...]' concatenates to adjacent tokens in the same way that multi-
+line macro parameters do, see *note Section 4.3.8:: for details.
+
+\1f
+File: nasm.info,  Node: Section 4.1.4,  Next: Section 4.1.5,  Prev: Section 4.1.3,  Up: Section 4.1
+
+4.1.4. Concatenating Single Line Macro Tokens: `%+'
+---------------------------------------------------
+
+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.
+
+   Please note that a space is required after `%+', in order to
+disambiguate it from the syntax `%+1' used in multiline macros.
+
+   As an example, consider the following:
+
+     %define BDASTART 400h                ; Start of BIOS data area
+
+     struc   tBIOSDA                      ; its structure
+             .COM1addr       RESW    1
+             .COM2addr       RESW    1
+             ; ..and so on
+     endstruc
+
+   Now, if we need to access the elements of tBIOSDA in different
+places, we can end up with:
+
+             mov     ax,BDASTART + tBIOSDA.COM1addr
+             mov     bx,BDASTART + tBIOSDA.COM2addr
+
+   This will become pretty ugly (and tedious) if used in many places,
+and can be reduced in size significantly by using the following macro:
+
+     ; Macro to access BIOS variables by their names (from tBDA):
+
+     %define BDA(x)  BDASTART + tBIOSDA. %+ x
+
+   Now the above code can be written as:
+
+             mov     ax,BDA(COM1addr)
+             mov     bx,BDA(COM2addr)
+
+   Using this feature, we can simplify references to a lot of macros
+(and, in turn, reduce typing errors).
+
+\1f
+File: nasm.info,  Node: Section 4.1.5,  Next: Section 4.1.6,  Prev: Section 4.1.4,  Up: Section 4.1
+
+4.1.5. The Macro Name Itself: `%?' and `%??'
+--------------------------------------------
+
+The special symbols `%?' and `%??' can be used to reference the macro
+name itself inside a macro expansion, this is supported for both
+single-and multi-line macros. `%?' refers to the macro name as
+_invoked_, whereas `%??' refers to the macro name as _declared_. The
+two are always the same for case-sensitive macros, but for
+case-insensitive macros, they can differ.
+
+   For example:
+
+     %idefine Foo mov %?,%??
+
+             foo
+             FOO
+
+   will expand to:
+
+             mov foo,Foo
+             mov FOO,Foo
+
+   The sequence:
+
+     %idefine keyword $%?
+
+   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:
+
+     %idefine pause $%?                  ; Hide the PAUSE instruction
+
+\1f
+File: nasm.info,  Node: Section 4.1.6,  Next: Section 4.1.7,  Prev: Section 4.1.5,  Up: Section 4.1
+
+4.1.6. Undefining Single-Line Macros: `%undef'
+----------------------------------------------
+
+Single-line macros can be removed with the `%undef' directive. For
+example, the following sequence:
+
+     %define foo bar
+     %undef  foo
+
+             mov     eax, foo
+
+   will expand to the instruction `mov eax, foo', since after `%undef'
+the macro `foo' is no longer defined.
+
+   Macros that would otherwise be pre-defined can be undefined on the
+command- line using the `-u' option on the NASM command line: see *note
+Section 2.1.19::.
+
+\1f
+File: nasm.info,  Node: Section 4.1.7,  Next: Section 4.1.8,  Prev: Section 4.1.6,  Up: Section 4.1
+
+4.1.7. Preprocessor Variables: `%assign'
+----------------------------------------
+
+An alternative way to define single-line macros is by means of the
+`%assign' command (and its case-insensitive counterpart `%iassign',
+which differs from `%assign' in exactly the same way that `%idefine'
+differs from `%define').
+
+   `%assign' 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
+`%assign' directive is processed.
+
+   Like `%define', macros defined using `%assign' can be re-defined
+later, so you can do things like
+
+     %assign i i+1
+
+   to increment the numeric value of a macro.
+
+   `%assign' is useful for controlling the termination of `%rep'
+preprocessor loops: see *note Section 4.5:: for an example of this.
+Another use for `%assign' is given in *note Section 8.4:: and *note
+Section 9.1::.
+
+   The expression passed to `%assign' is a critical expression (see
+*note Section 3.8::), 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).
+
+\1f
+File: nasm.info,  Node: Section 4.1.8,  Next: Section 4.1.9,  Prev: Section 4.1.7,  Up: Section 4.1
+
+4.1.8. Defining Strings: `%defstr'
+----------------------------------
+
+`%defstr', and its case-insensitive counterpart `%idefstr', 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.
+
+   For example:
+
+     %defstr test TEST
+
+   is equivalent to
+
+     %define test 'TEST'
+
+   This can be used, for example, with the `%!' construct (see *note
+Section 4.10.2::):
+
+     %defstr PATH %!PATH          ; The operating system PATH variable
+
+\1f
+File: nasm.info,  Node: Section 4.1.9,  Next: Section 4.2,  Prev: Section 4.1.8,  Up: Section 4.1
+
+4.1.9. Defining Tokens: `%deftok'
+---------------------------------
+
+`%deftok', and its case-insensitive counterpart `%ideftok', define or
+redefine a single-line macro without parameters but converts the second
+parameter, after string conversion, to a sequence of tokens.
+
+   For example:
+
+     %deftok test 'TEST'
+
+   is equivalent to
+
+     %define test TEST
+
+\1f
+File: nasm.info,  Node: Section 4.2,  Next: Section 4.2.1,  Prev: Section 4.1.9,  Up: Chapter 4
+
+4.2. String Manipulation in Macros
+==================================
+
+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.
+
+   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 `\'-escapes inside ``'-quoted strings.
+
+* Menu:
+
+* Section 4.2.1:: Concatenating Strings: `%strcat'
+* Section 4.2.2:: String Length: `%strlen'
+* Section 4.2.3:: Extracting Substrings: `%substr'
+
+\1f
+File: nasm.info,  Node: Section 4.2.1,  Next: Section 4.2.2,  Prev: Section 4.2,  Up: Section 4.2
+
+4.2.1. Concatenating Strings: `%strcat'
+---------------------------------------
+
+The `%strcat' operator concatenates quoted strings and assign them to a
+single-line macro.
+
+   For example:
+
+     %strcat alpha "Alpha: ", '12" screen'
+
+   ... would assign the value `'Alpha: 12" screen'' to `alpha'.
+Similarly:
+
+     %strcat beta '"foo"\', "'bar'"
+
+   ... would assign the value ``"foo"\\'bar'`' to `beta'.
+
+   The use of commas to separate strings is permitted but optional.
+
+\1f
+File: nasm.info,  Node: Section 4.2.2,  Next: Section 4.2.3,  Prev: Section 4.2.1,  Up: Section 4.2
+
+4.2.2. String Length: `%strlen'
+-------------------------------
+
+The `%strlen' operator assigns the length of a string to a macro. For
+example:
+
+     %strlen charcnt 'my string'
+
+   In this example, `charcnt' would receive the value 9, just as if an
+`%assign' had been used. In this example, `'my string'' was a literal
+string but it could also have been a single-line macro that expands to
+a string, as in the following example:
+
+     %define sometext 'my string'
+     %strlen charcnt sometext
+
+   As in the first case, this would result in `charcnt' being assigned
+the value of 9.
+
+\1f
+File: nasm.info,  Node: Section 4.2.3,  Next: Section 4.3,  Prev: Section 4.2.2,  Up: Section 4.2
+
+4.2.3. Extracting Substrings: `%substr'
+---------------------------------------
+
+Individual letters or substrings in strings can be extracted using the
+`%substr' operator. An example of its use is probably more useful than
+the description:
+
+     %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'
+
+   As with `%strlen' (see *note Section 4.2.2::), 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 `%strlen' 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. `-1' means until end of
+string, `-2' until one character before, etc.
+
+\1f
+File: nasm.info,  Node: Section 4.3,  Next: Section 4.3.1,  Prev: Section 4.2.3,  Up: Chapter 4
+
+4.3. Multi-Line Macros: `%macro'
+================================
+
+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.
+
+     %macro  prologue 1
+
+             push    ebp
+             mov     ebp,esp
+             sub     esp,%1
+
+     %endmacro
+
+   This defines a C-like function prologue as a macro: so you would
+invoke the macro with a call such as
+
+     myfunc:   prologue 12
+
+   which would expand to the three lines of code
+
+     myfunc: push    ebp
+             mov     ebp,esp
+             sub     esp,12
+
+   The number `1' after the macro name in the `%macro' line defines the
+number of parameters the macro `prologue' expects to receive. The use
+of `%1' 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 `%2', `%3' and so on.
+
+   Multi-line macros, like single-line macros, are case-sensitive,
+unless you define them using the alternative directive `%imacro'.
+
+   If you need to pass a comma as _part_ 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
+
+     %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
+
+* Menu:
+
+* Section 4.3.1:: Recursive Multi-Line Macros: `%rmacro'
+* Section 4.3.2:: Overloading Multi-Line Macros
+* Section 4.3.3:: Macro-Local Labels
+* Section 4.3.4:: Greedy Macro Parameters
+* Section 4.3.5:: Default Macro Parameters
+* Section 4.3.6:: `%0': Macro Parameter Counter
+* Section 4.3.7:: `%rotate': Rotating Macro Parameters
+* Section 4.3.8:: Concatenating Macro Parameters
+* Section 4.3.9:: Condition Codes as Macro Parameters
+* Section 4.3.10:: Disabling Listing Expansion
+* Section 4.3.11:: Undefining Multi-Line Macros: `%unmacro'
+* Section 4.3.12:: Exiting Multi-Line Macros: `%exitmacro'
+
+\1f
+File: nasm.info,  Node: Section 4.3.1,  Next: Section 4.3.2,  Prev: Section 4.3,  Up: Section 4.3
+
+4.3.1. Recursive Multi-Line Macros: `%rmacro'
+---------------------------------------------
+
+A multi-line macro cannot be referenced within itself, in order to
+prevent accidental infinite recursion.
+
+   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.
+
+   As with non-recursive multi-line macros, recursive multi-line macros
+are case-sensitive, unless you define them using the alternative
+directive `%irmacro'.
+
+\1f
+File: nasm.info,  Node: Section 4.3.2,  Next: Section 4.3.3,  Prev: Section 4.3.1,  Up: Section 4.3
+
+4.3.2. Overloading Multi-Line Macros
+------------------------------------
+
+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
+
+     %macro  prologue 0
+
+             push    ebp
+             mov     ebp,esp
+
+     %endmacro
+
+   to define an alternative form of the function prologue which
+allocates no local stack space.
+
+   Sometimes, however, you might want to `overload' a machine
+instruction; for example, you might want to define
+
+     %macro  push 2
+
+             push    %1
+             push    %2
+
+     %endmacro
+
+   so that you could code
+
+             push    ebx             ; this line is not a macro call
+             push    eax,ecx         ; but this one is
+
+   Ordinarily, NASM will give a warning for the first of the above two
+lines, since `push' 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
+`-w-macro-params' command- line option (see *note Section 2.1.24::).
+
+\1f
+File: nasm.info,  Node: Section 4.3.3,  Next: Section 4.3.4,  Prev: Section 4.3.2,  Up: Section 4.3
+
+4.3.3. Macro-Local Labels
+-------------------------
+
+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 `%%' to the label name. So you can invent an instruction
+which executes a `RET' if the `Z' flag is set by doing this:
+
+     %macro  retz 0
+
+             jnz     %%skip
+             ret
+         %%skip:
+
+     %endmacro
+
+   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 `%%skip'. The names NASM invents are of the form
+`..@2345.skip', where the number 2345 changes with every macro call.
+The `..@' prefix prevents macro-local labels from interfering with the
+local label mechanism, as described in *note Section 3.9::. You should
+avoid defining your own labels in this form (the `..@' prefix, then a
+number, then another period) in case they interfere with macro-local
+labels.
+
+\1f
+File: nasm.info,  Node: Section 4.3.4,  Next: Section 4.3.5,  Prev: Section 4.3.3,  Up: Section 4.3
+
+4.3.4. Greedy Macro Parameters
+------------------------------
+
+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
+
+             writefile [filehandle],"hello, world",13,10
+
+   NASM allows you to define the last parameter of a macro to be
+_greedy_, 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:
+
+     %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
+
+   then the example call to `writefile' above will work as expected: the
+text before the first comma, `[filehandle]', is used as the first macro
+parameter and expanded when `%1' is referred to, and all the subsequent
+text is lumped into `%2' and placed after the `db'.
+
+   The greedy nature of the macro is indicated to NASM by the use of the
+`+' sign after the parameter count on the `%macro' line.
+
+   If you define a greedy macro, you are effectively telling NASM how it
+should expand the macro given _any_ 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 `writefile' 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 `writefile'
+taking 4 parameters (for example).
+
+   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
+
+               writefile [filehandle], {"hello, world",13,10}
+
+   NASM provides both mechanisms for putting commas in macro
+parameters, and you choose which one you prefer for each macro
+definition.
+
+   See *note Section 6.3.1:: for a better way to write the above macro.
+
+\1f
+File: nasm.info,  Node: Section 4.3.5,  Next: Section 4.3.6,  Prev: Section 4.3.4,  Up: Section 4.3
+
+4.3.5. Default Macro Parameters
+-------------------------------
+
+NASM also allows you to define a multi-line macro with a _range_ of
+allowable parameter counts. If you do this, you can specify defaults for
+omitted parameters. So, for example:
+
+     %macro  die 0-1 "Painful program death has occurred."
+
+             writefile 2,%1
+             mov     ax,0x4c01
+             int     0x21
+
+     %endmacro
+
+   This macro (which makes use of the `writefile' macro defined in
+*note Section 4.3.4::) 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.
+
+   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
+
+     %macro foobar 1-3 eax,[ebx+2]
+
+   then it could be called with between one and three parameters, and
+`%1' would always be taken from the macro call. `%2', if not specified
+by the macro call, would default to `eax', and `%3' if not specified
+would default to `[ebx+2]'.
+
+   You can provide extra information to a macro by providing too many
+default parameters:
+
+     %macro quux 1 something
+
+   This will trigger a warning by default; see *note Section 2.1.24::
+for more information. When `quux' is invoked, it receives not one but
+two parameters. `something' can be referred to as `%2'. The difference
+between passing `something' this way and writing `something' in the
+macro body is that with this way `something' is evaluated when the
+macro is defined, not when it is expanded.
+
+   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 `%0'
+token (see *note Section 4.3.6::) allows you to determine how many
+parameters were really passed to the macro call.
+
+   This defaulting mechanism can be combined with the greedy-parameter
+mechanism; so the `die' macro above could be made more powerful, and
+more useful, by changing the first line of the definition to
+
+     %macro die 0-1+ "Painful program death has occurred.",13,10
+
+   The maximum parameter count can be infinite, denoted by `*'. In this
+case, of course, it is impossible to provide a _full_ set of default
+parameters. Examples of this usage are shown in *note Section 4.3.7::.
+
+\1f
+File: nasm.info,  Node: Section 4.3.6,  Next: Section 4.3.7,  Prev: Section 4.3.5,  Up: Section 4.3
+
+4.3.6. `%0': Macro Parameter Counter
+------------------------------------
+
+The parameter reference `%0' will return a numeric constant giving the
+number of parameters received, that is, if `%0' is n then `%'n is the
+last parameter. `%0' is mostly useful for macros that can take a
+variable number of parameters. It can be used as an argument to `%rep'
+(see *note Section 4.5::) in order to iterate through all the
+parameters of a macro. Examples are given in *note Section 4.3.7::.
+
+\1f
+File: nasm.info,  Node: Section 4.3.7,  Next: Section 4.3.8,  Prev: Section 4.3.6,  Up: Section 4.3
+
+4.3.7. `%rotate': Rotating Macro Parameters
+-------------------------------------------
+
+Unix shell programmers will be familiar with the `shift' shell command,
+which allows the arguments passed to a shell script (referenced as
+`$1', `$2' and so on) to be moved left by one place, so that the
+argument previously referenced as `$2' becomes available as `$1', and
+the argument previously referenced as `$1' is no longer available at
+all.
+
+   NASM provides a similar mechanism, in the form of `%rotate'. As its
+name suggests, it differs from the Unix `shift' in that no parameters
+are lost: parameters rotated off the left end of the argument list
+reappear on the right, and vice versa.
+
+   `%rotate' 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 `%rotate' is negative, the macro parameters
+are rotated to the right.
+
+   So a pair of macros to save and restore a set of registers might
+work as follows:
+
+     %macro  multipush 1-*
+
+       %rep  %0
+             push    %1
+       %rotate 1
+       %endrep
+
+     %endmacro
+
+   This macro invokes the `PUSH' instruction on each of its arguments in
+turn, from left to right. It begins by pushing its first argument,
+`%1', then invokes `%rotate' to move all the arguments one place to the
+left, so that the original second argument is now available as `%1'.
+Repeating this procedure as many times as there were arguments
+(achieved by supplying `%0' as the argument to `%rep') causes each
+argument in turn to be pushed.
+
+   Note also the use of `*' as the maximum parameter count, indicating
+that there is no upper limit on the number of parameters you may supply
+to the `multipush' macro.
+
+   It would be convenient, when using this macro, to have a `POP'
+equivalent, which _didn't_ require the arguments to be given in reverse
+order. Ideally, you would write the `multipush' 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 `multipop', and the macro would take
+care of popping the registers in the opposite order from the one in
+which they were pushed.
+
+   This can be done by the following definition:
+
+     %macro  multipop 1-*
+
+       %rep %0
+       %rotate -1
+             pop     %1
+       %endrep
+
+     %endmacro
+
+   This macro begins by rotating its arguments one place to the _right_,
+so that the original _last_ argument appears as `%1'. This is then
+popped, and the arguments are rotated right again, so the second-to-
+last argument becomes `%1'. Thus the arguments are iterated through in
+reverse order.
+
+\1f
+File: nasm.info,  Node: Section 4.3.8,  Next: Section 4.3.9,  Prev: Section 4.3.7,  Up: Section 4.3
+
+4.3.8. Concatenating Macro Parameters
+-------------------------------------
+
+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
+
+     %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
+
+   which would expand to
+
+     keytab:
+     keyposF1        equ     $-keytab
+                     db     128+1
+     keyposF2        equ     $-keytab
+                     db      128+2
+     keyposReturn    equ     $-keytab
+                     db      13
+
+   You can just as easily concatenate text on to the other end of a
+macro parameter, by writing `%1foo'.
+
+   If you need to append a _digit_ to a macro parameter, for example
+defining labels `foo1' and `foo2' when passed the parameter `foo', you
+can't code `%11' because that would be taken as the eleventh macro
+parameter. Instead, you must code `%{1}1', which will separate the
+first `1' (giving the number of the macro parameter) from the second
+(literal text to be concatenated to the parameter).
+
+   This concatenation can also be applied to other preprocessor in-line
+objects, such as macro-local labels (*note Section 4.3.3::) and
+context-local labels (*note Section 4.7.2::). In all cases, ambiguities
+in syntax can be resolved by enclosing everything after the `%' sign
+and before the literal text in braces: so `%{%foo}bar' concatenates the
+text `bar' to the end of the real name of the macro-local label
+`%%foo'. (This is unnecessary, since the form NASM uses for the real
+names of macro-local labels means that the two usages `%{%foo}bar' and
+`%%foobar' would both expand to the same thing anyway; nevertheless,
+the capability is there.)
+
+   The single-line macro indirection construct, `%[...]' (*note Section
+4.1.3::), behaves the same way as macro parameters for the purpose of
+concatenation.
+
+   See also the `%+' operator, *note Section 4.1.4::.
+
+\1f
+File: nasm.info,  Node: Section 4.3.9,  Next: Section 4.3.10,  Prev: Section 4.3.8,  Up: Section 4.3
+
+4.3.9. Condition Codes as Macro Parameters
+------------------------------------------
+
+NASM can give special treatment to a macro parameter which contains a
+condition code. For a start, you can refer to the macro parameter `%1'
+by means of the alternative syntax `%+1', 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 _not_ a valid condition code.
+
+   Far more usefully, though, you can refer to the macro parameter by
+means of `%-1', which NASM will expand as the _inverse_ condition code.
+So the `retz' macro defined in *note Section 4.3.3:: can be replaced by
+a general conditional-return macro like this:
+
+     %macro  retc 1
+
+             j%-1    %%skip
+             ret
+       %%skip:
+
+     %endmacro
+
+   This macro can now be invoked using calls like `retc ne', which will
+cause the conditional-jump instruction in the macro expansion to come
+out as `JE', or `retc po' which will make the jump a `JPE'.
+
+   The `%+1' macro-parameter reference is quite happy to interpret the
+arguments `CXZ' and `ECXZ' as valid condition codes; however, `%-1'
+will report an error if passed either of these, because no inverse
+condition code exists.
+
+\1f
+File: nasm.info,  Node: Section 4.3.10,  Next: Section 4.3.11,  Prev: Section 4.3.9,  Up: Section 4.3
+
+4.3.10. Disabling Listing Expansion
+-----------------------------------
+
+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.
+
+   NASM therefore provides the `.nolist' qualifier, which you can
+include in a macro definition to inhibit the expansion of the macro in
+the listing file. The `.nolist' qualifier comes directly after the
+number of parameters, like this:
+
+     %macro foo 1.nolist
+
+   Or like this:
+
+     %macro bar 1-5+.nolist a,b,c,d,e,f,g,h
+
+\1f
+File: nasm.info,  Node: Section 4.3.11,  Next: Section 4.3.12,  Prev: Section 4.3.10,  Up: Section 4.3
+
+4.3.11. Undefining Multi-Line Macros: `%unmacro'
+------------------------------------------------
+
+Multi-line macros can be removed with the `%unmacro' directive. Unlike
+the `%undef' directive, however, `%unmacro' takes an argument
+specification, and will only remove exact matches with that argument
+specification.
+
+   For example:
+
+     %macro foo 1-3
+             ; Do something
+     %endmacro
+     %unmacro foo 1-3
+
+   removes the previously defined macro `foo', but
+
+     %macro bar 1-3
+             ; Do something
+     %endmacro
+     %unmacro bar 1
+
+   does _not_ remove the macro `bar', since the argument specification
+does not match exactly.
+
+\1f
+File: nasm.info,  Node: Section 4.3.12,  Next: Section 4.4,  Prev: Section 4.3.11,  Up: Section 4.3
+
+4.3.12. Exiting Multi-Line Macros: `%exitmacro'
+-----------------------------------------------
+
+Multi-line macro expansions can be arbitrarily terminated with the
+`%exitmacro' directive.
+
+   For example:
+
+     %macro foo 1-3
+             ; Do something
+         %if<condition>
+             %exitmacro
+         %endif
+             ; Do something
+     %endmacro
+
+\1f
+File: nasm.info,  Node: Section 4.4,  Next: Section 4.4.1,  Prev: Section 4.3.12,  Up: Chapter 4
+
+4.4. Conditional Assembly
+=========================
+
+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:
+
+     %if<condition>
+         ; some code which only appears if <condition> is met
+     %elif<condition2>
+         ; only appears if <condition> is not met but <condition2> is
+     %else
+         ; this appears if neither <condition> nor <condition2> was met
+     %endif
+
+   The inverse forms `%ifn' and `%elifn' are also supported.
+
+   The `%else' clause is optional, as is the `%elif' clause. You can
+have more than one `%elif' clause as well.
+
+   There are a number of variants of the `%if' directive. Each has its
+corresponding `%elif', `%ifn', and `%elifn' directives; for example,
+the equivalents to the `%ifdef' directive are `%elifdef', `%ifndef',
+and `%elifndef'.
+
+* Menu:
+
+* Section 4.4.1:: `%ifdef': Testing Single-Line Macro Existence
+* Section 4.4.2:: `%ifmacro': Testing Multi-Line Macro Existence
+* Section 4.4.3:: `%ifctx': Testing the Context Stack
+* Section 4.4.4:: `%if': Testing Arbitrary Numeric Expressions
+* Section 4.4.5:: `%ifidn' and `%ifidni': Testing Exact Text Identity
+* Section 4.4.6:: `%ifid', `%ifnum', `%ifstr': Testing Token Types
+* Section 4.4.7:: `%iftoken': Test for a Single Token
+* Section 4.4.8:: `%ifempty': Test for Empty Expansion
+
+\1f
+File: nasm.info,  Node: Section 4.4.1,  Next: Section 4.4.2,  Prev: Section 4.4,  Up: Section 4.4
+
+4.4.1. `%ifdef': Testing Single-Line Macro Existence
+----------------------------------------------------
+
+Beginning a conditional-assembly block with the line `%ifdef MACRO'
+will assemble the subsequent code if, and only if, a single-line macro
+called `MACRO' is defined. If not, then the `%elif' and `%else' blocks
+(if any) will be processed instead.
+
+   For example, when debugging a program, you might want to write code
+such as
+
+               ; perform some function
+     %ifdef DEBUG
+               writefile 2,"Function performed successfully",13,10
+     %endif
+               ; go and do something else
+
+   Then you could use the command-line option `-dDEBUG' to create a
+version of the program which produced debugging messages, and remove the
+option to generate the final release version of the program.
+
+   You can test for a macro _not_ being defined by using `%ifndef'
+instead of `%ifdef'. You can also test for macro definitions in `%elif'
+blocks by using `%elifdef' and `%elifndef'.
+
+\1f
+File: nasm.info,  Node: Section 4.4.2,  Next: Section 4.4.3,  Prev: Section 4.4.1,  Up: Section 4.4
+
+4.4.2. `%ifmacro': Testing Multi-Line Macro Existence
+-----------------------------------------------------
+
+The `%ifmacro' directive operates in the same way as the `%ifdef'
+directive, except that it checks for the existence of a multi-line
+macro.
+
+   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.
+
+   The `%ifmacro' is considered true if defining a macro with the given
+name and number of arguments would cause a definitions conflict. For
+example:
+
+     %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
+
+   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.
+
+   You can test for the macro not existing by using the `%ifnmacro'
+instead of `%ifmacro'. Additional tests can be performed in `%elif'
+blocks by using `%elifmacro' and `%elifnmacro'.
+
+\1f
+File: nasm.info,  Node: Section 4.4.3,  Next: Section 4.4.4,  Prev: Section 4.4.2,  Up: Section 4.4
+
+4.4.3. `%ifctx': Testing the Context Stack
+------------------------------------------
+
+The conditional-assembly construct `%ifctx' 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 `%ifdef', the inverse and `%elif' forms `%ifnctx', `%elifctx'
+and `%elifnctx' are also supported.
+
+   For more details of the context stack, see *note Section 4.7::. For
+a sample use of `%ifctx', see *note Section 4.7.5::.
+
+\1f
+File: nasm.info,  Node: Section 4.4.4,  Next: Section 4.4.5,  Prev: Section 4.4.3,  Up: Section 4.4
+
+4.4.4. `%if': Testing Arbitrary Numeric Expressions
+---------------------------------------------------
+
+The conditional-assembly construct `%if expr' will cause the subsequent
+code to be assembled if and only if the value of the numeric expression
+`expr' is non-zero. An example of the use of this feature is in
+deciding when to break out of a `%rep' preprocessor loop: see *note
+Section 4.5:: for a detailed example.
+
+   The expression given to `%if', and its counterpart `%elif', is a
+critical expression (see *note Section 3.8::).
+
+   `%if' extends the normal NASM expression syntax, by providing a set
+of relational operators which are not normally available in
+expressions. The operators `=', `<', `>', `<=', `>=' and `<>' test
+equality, less-than, greater-than, less-or-equal, greater-or-equal and
+not-equal respectively. The C-like forms `==' and `!=' are supported as
+alternative forms of `=' and `<>'. In addition, low- priority logical
+operators `&&', `^^' and `||' 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 `^^', 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.
+
+   Like other `%if' constructs, `%if' has a counterpart `%elif', and
+negative forms `%ifn' and `%elifn'.
+
+\1f
+File: nasm.info,  Node: Section 4.4.5,  Next: Section 4.4.6,  Prev: Section 4.4.4,  Up: Section 4.4
+
+4.4.5. `%ifidn' and `%ifidni': Testing Exact Text Identity
+----------------------------------------------------------
+
+The construct `%ifidn text1,text2' will cause the subsequent code to be
+assembled if and only if `text1' and `text2', after expanding
+single-line macros, are identical pieces of text. Differences in white
+space are not counted.
+
+   `%ifidni' is similar to `%ifidn', but is case-insensitive.
+
+   For example, the following macro pushes a register or number on the
+stack, and allows you to treat `IP' as a real register:
+
+     %macro  pushparam 1
+
+       %ifidni %1,ip
+             call    %%label
+       %%label:
+       %else
+             push    %1
+       %endif
+
+     %endmacro
+
+   Like other `%if' constructs, `%ifidn' has a counterpart `%elifidn',
+and negative forms `%ifnidn' and `%elifnidn'.  Similarly, `%ifidni' has
+counterparts `%elifidni', `%ifnidni' and `%elifnidni'.
+
+\1f
+File: nasm.info,  Node: Section 4.4.6,  Next: Section 4.4.7,  Prev: Section 4.4.5,  Up: Section 4.4
+
+4.4.6. `%ifid', `%ifnum', `%ifstr': Testing Token Types
+-------------------------------------------------------
+
+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.
+
+   The conditional assembly construct `%ifid', 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. `%ifnum'
+works similarly, but tests for the token being a numeric constant;
+`%ifstr' tests for it being a string.
+
+   For example, the `writefile' macro defined in *note Section 4.3.4::
+can be extended to take advantage of `%ifstr' in the following fashion:
+
+     %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
+
+   Then the `writefile' macro can cope with being called in either of
+the following two ways:
+
+             writefile [file], strpointer, length
+             writefile [file], "hello", 13, 10
+
+   In the first, `strpointer' is used as the address of an already-
+declared string, and `length' 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.
+
+   Note the use of `%if' inside the `%ifstr': this is to detect whether
+the macro was passed two arguments (so the string would be a single
+string constant, and `db %2' would be adequate) or more (in which case,
+all but the first two would be lumped together into `%3', and `db
+%2,%3' would be required).
+
+   The usual `%elif'..., `%ifn'..., and `%elifn'... versions exist for
+each of `%ifid', `%ifnum' and `%ifstr'.
+
+\1f
+File: nasm.info,  Node: Section 4.4.7,  Next: Section 4.4.8,  Prev: Section 4.4.6,  Up: Section 4.4
+
+4.4.7. `%iftoken': Test for a Single Token
+------------------------------------------
+
+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 `%+')
+versus a multi-token sequence.
+
+   The conditional assembly construct `%iftoken' assembles the
+subsequent code if and only if the expanded parameters consist of
+exactly one token, possibly surrounded by whitespace.
+
+   For example:
+
+     %iftoken 1
+
+   will assemble the subsequent code, but
+
+     %iftoken -1
+
+   will not, since `-1' contains two tokens: the unary minus operator
+`-', and the number `1'.
+
+   The usual `%eliftoken', `%ifntoken', and `%elifntoken' variants are
+also provided.
+
+\1f
+File: nasm.info,  Node: Section 4.4.8,  Next: Section 4.5,  Prev: Section 4.4.7,  Up: Section 4.4
+
+4.4.8. `%ifempty': Test for Empty Expansion
+-------------------------------------------
+
+The conditional assembly construct `%ifempty' assembles the subsequent
+code if and only if the expanded parameters do not contain any tokens at
+all, whitespace excepted.
+
+   The usual `%elifempty', `%ifnempty', and `%elifnempty' variants are
+also provided.
+
+\1f
+File: nasm.info,  Node: Section 4.5,  Next: Section 4.6,  Prev: Section 4.4.8,  Up: Chapter 4
+
+4.5. Preprocessor Loops: `%rep'
+===============================
+
+NASM's `TIMES' 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: `%rep'.
+
+   The directives `%rep' and `%endrep' (`%rep' takes a numeric
+argument, which can be an expression; `%endrep' takes no arguments) can
+be used to enclose a chunk of code, which is then replicated as many
+times as specified by the preprocessor:
+
+     %assign i 0
+     %rep    64
+             inc     word [table+2*i]
+     %assign i i+1
+     %endrep
+
+   This will generate a sequence of 64 `INC' instructions, incrementing
+every word of memory from `[table]' to `[table+126]'.
+
+   For more complex termination conditions, or to break out of a repeat
+loop part way along, you can use the `%exitrep' directive to terminate
+the loop, like this:
+
+     fibonacci:
+     %assign i 0
+     %assign j 1
+     %rep 100
+     %if j > 65535
+         %exitrep
+     %endif
+             dw j
+     %assign k j+i
+     %assign i j
+     %assign j k
+     %endrep
+
+     fib_number equ ($-fibonacci)/2
+
+   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
+`%rep'. 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.
+
+\1f
+File: nasm.info,  Node: Section 4.6,  Next: Section 4.6.1,  Prev: Section 4.5,  Up: Chapter 4
+
+4.6. Source Files and Dependencies
+==================================
+
+These commands allow you to split your sources into multiple files.
+
+* Menu:
+
+* Section 4.6.1:: `%include': Including Other Files
+* Section 4.6.2:: `%pathsearch': Search the Include Path
+* Section 4.6.3:: `%depend': Add Dependent Files
+* Section 4.6.4:: `%use': Include Standard Macro Package
+
+\1f
+File: nasm.info,  Node: Section 4.6.1,  Next: Section 4.6.2,  Prev: Section 4.6,  Up: Section 4.6
+
+4.6.1. `%include': Including Other Files
+----------------------------------------
+
+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 `%include' directive:
+
+     %include "macros.mac"
+
+   will include the contents of the file `macros.mac' into the source
+file containing the `%include' directive.
+
+   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 `-i' option.
+
+   The standard C idiom for preventing a file being included more than
+once is just as applicable in NASM: if the file `macros.mac' has the
+form
+
+     %ifndef MACROS_MAC
+         %define MACROS_MAC
+         ; now define some macros
+     %endif
+
+   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 `MACROS_MAC' will already be defined.
+
+   You can force a file to be included even if there is no `%include'
+directive that explicitly includes it, by using the `-p' option on the
+NASM command line (see *note Section 2.1.17::).
+
+\1f
+File: nasm.info,  Node: Section 4.6.2,  Next: Section 4.6.3,  Prev: Section 4.6.1,  Up: Section 4.6
+
+4.6.2. `%pathsearch': Search the Include Path
+---------------------------------------------
+
+The `%pathsearch' 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.)
+
+   For example,
+
+     %pathsearch MyFoo "foo.bin"
+
+   ... with `-Ibins/' in the include path may end up defining the macro
+`MyFoo' to be `"bins/foo.bin"'.
+
+\1f
+File: nasm.info,  Node: Section 4.6.3,  Next: Section 4.6.4,  Prev: Section 4.6.2,  Up: Section 4.6
+
+4.6.3. `%depend': Add Dependent Files
+-------------------------------------
+
+The `%depend' directive takes a filename and adds it to the list of
+files to be emitted as dependency generation when the `-M' options and
+its relatives (see *note Section 2.1.4::) are used. It produces no
+output.
+
+   This is generally used in conjunction with `%pathsearch'. For
+example, a simplified version of the standard macro wrapper for the
+`INCBIN' directive looks like:
+
+     %imacro incbin 1-2+ 0
+     %pathsearch dep %1
+     %depend dep
+             incbin dep,%2
+     %endmacro
+
+   This first resolves the location of the file into the macro `dep',
+then adds it to the dependency lists, and finally issues the assembler-
+level `INCBIN' directive.
+
+\1f
+File: nasm.info,  Node: Section 4.6.4,  Next: Section 4.7,  Prev: Section 4.6.3,  Up: Section 4.6
+
+4.6.4. `%use': Include Standard Macro Package
+---------------------------------------------
+
+The `%use' directive is similar to `%include', 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 *note Chapter 5::.
+
+   Unlike the `%include' directive, package names for the `%use'
+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:
+
+     %use altreg
+     %use 'altreg'
+
+   Standard macro packages are protected from multiple inclusion. When a
+standard macro package is used, a testable single-line macro of the form
+`__USE_'_package_`__' is also defined, see *note Section 4.11.8::.
+
+\1f
+File: nasm.info,  Node: Section 4.7,  Next: Section 4.7.1,  Prev: Section 4.6.4,  Up: Chapter 4
+
+4.7. The Context Stack
+======================
+
+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 `REPEAT' ... `UNTIL'
+loop, in which the expansion of the `REPEAT' macro would need to be
+able to refer to a label which the `UNTIL' macro had defined. However,
+for such a macro you would also want to be able to nest these loops.
+
+   NASM provides this level of power by means of a _context stack_. The
+preprocessor maintains a stack of _contexts_, each of which is
+characterized by a name. You add a new context to the stack using the
+`%push' directive, and remove one using `%pop'. You can define labels
+that are local to a particular context on the stack.
+
+* Menu:
+
+* Section 4.7.1:: `%push' and `%pop': Creating and Removing Contexts
+* Section 4.7.2:: Context-Local Labels
+* Section 4.7.3:: Context-Local Single-Line Macros
+* Section 4.7.4:: `%repl': Renaming a Context
+* Section 4.7.5:: Example Use of the Context Stack: Block IFs
+
+\1f
+File: nasm.info,  Node: Section 4.7.1,  Next: Section 4.7.2,  Prev: Section 4.7,  Up: Section 4.7
+
+4.7.1. `%push' and `%pop': Creating and Removing Contexts
+---------------------------------------------------------
+
+The `%push' directive is used to create a new context and place it on
+the top of the context stack. `%push' takes an optional argument, which
+is the name of the context. For example:
+
+     %push    foobar
+
+   This pushes a new context called `foobar' 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 `%push' and the `%pop' are inside a single
+macro definition.)
+
+   The directive `%pop', 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.
+
+\1f
+File: nasm.info,  Node: Section 4.7.2,  Next: Section 4.7.3,  Prev: Section 4.7.1,  Up: Section 4.7
+
+4.7.2. Context-Local Labels
+---------------------------
+
+Just as the usage `%%foo' defines a label which is local to the
+particular macro call in which it is used, the usage `%$foo' is used to
+define a label which is local to the context on the top of the context
+stack. So the `REPEAT' and `UNTIL' example given above could be
+implemented by means of:
+
+     %macro repeat 0
+
+         %push   repeat
+         %$begin:
+
+     %endmacro
+
+     %macro until 1
+
+             j%-1    %$begin
+         %pop
+
+     %endmacro
+
+   and invoked by means of, for example,
+
+             mov     cx,string
+             repeat
+             add     cx,3
+             scasb
+             until   e
+
+   which would scan every fourth byte of a string in search of the byte
+in `AL'.
+
+   If you need to define, or access, labels local to the context _below_
+the top one on the stack, you can use `%$$foo', or `%$$$foo' for the
+context below that, and so on.
+
+\1f
+File: nasm.info,  Node: Section 4.7.3,  Next: Section 4.7.4,  Prev: Section 4.7.2,  Up: Section 4.7
+
+4.7.3. Context-Local Single-Line Macros
+---------------------------------------
+
+NASM also allows you to define single-line macros which are local to a
+particular context, in just the same way:
+
+     %define %$localmac 3
+
+   will define the single-line macro `%$localmac' to be local to the top
+context on the stack. Of course, after a subsequent `%push', it can
+then still be accessed by the name `%$$localmac'.
+
+\1f
+File: nasm.info,  Node: Section 4.7.4,  Next: Section 4.7.5,  Prev: Section 4.7.3,  Up: Section 4.7
+
+4.7.4. `%repl': Renaming a Context
+----------------------------------
+
+If you need to change the name of the top context on the stack (in
+order, for example, to have it respond differently to `%ifctx'), you can
+execute a `%pop' followed by a `%push'; but this will have the side
+effect of destroying all context-local labels and macros associated
+with the context that was just popped.
+
+   NASM provides the directive `%repl', which _replaces_ a context with
+a different name, without touching the associated macros and labels.
+So you could replace the destructive code
+
+     %pop
+     %push   newname
+
+   with the non-destructive version `%repl newname'.
+
+\1f
+File: nasm.info,  Node: Section 4.7.5,  Next: Section 4.8,  Prev: Section 4.7.4,  Up: Section 4.7
+
+4.7.5. Example Use of the Context Stack: Block IFs
+--------------------------------------------------
+
+This example makes use of almost all the context-stack features,
+including the conditional-assembly construct `%ifctx', to implement a
+block IF statement as a set of macros.
+
+     %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
+
+   This code is more robust than the `REPEAT' and `UNTIL' macros given
+in *note Section 4.7.2::, because it uses conditional assembly to check
+that the macros are issued in the right order (for example, not calling
+`endif' before `if') and issues a `%error' if they're not.
+
+   In addition, the `endif' macro has to be able to cope with the two
+distinct cases of either directly following an `if', or following an
+`else'. It achieves this, again, by using conditional assembly to do
+different things depending on whether the context on top of the stack is
+`if' or `else'.
+
+   The `else' macro has to preserve the context on the stack, in order
+to have the `%$ifnot' referred to by the `if' macro be the same as the
+one defined by the `endif' macro, but has to change the context's name
+so that `endif' will know there was an intervening `else'.  It does
+this by the use of `%repl'.
+
+   A sample usage of these macros might look like:
+
+             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
+
+   The block-`IF' macros handle nesting quite happily, by means of
+pushing another context, describing the inner `if', on top of the one
+describing the outer `if'; thus `else' and `endif' always refer to the
+last unmatched `if' or `else'.
+
+\1f
+File: nasm.info,  Node: Section 4.8,  Next: Section 4.8.1,  Prev: Section 4.7.5,  Up: Chapter 4
+
+4.8. Stack Relative Preprocessor Directives
+===========================================
+
+The following preprocessor directives provide a way to use labels to
+refer to local variables allocated on the stack.
+
+   * `%arg' (see *note Section 4.8.1::)
+
+   * `%stacksize' (see *note Section 4.8.2::)
+
+   * `%local' (see *note Section 4.8.3::)
+
+* Menu:
+
+* Section 4.8.1:: `%arg' Directive
+* Section 4.8.2:: `%stacksize' Directive
+* Section 4.8.3:: `%local' Directive
+
+\1f
+File: nasm.info,  Node: Section 4.8.1,  Next: Section 4.8.2,  Prev: Section 4.8,  Up: Section 4.8
+
+4.8.1. `%arg' Directive
+-----------------------
+
+The `%arg' 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.
+
+   While NASM has macros which attempt to duplicate this functionality
+(see *note Section 8.4.5::), the syntax is not particularly convenient
+to use. and is not TASM compatible. Here is an example which shows the
+use of `%arg' without any external macros:
+
+     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
+
+   This is similar to the procedure defined in *note Section 8.4.5::
+and adds the value in i to the value pointed to by j_ptr and returns
+the sum in the ax register. See *note Section 4.7.1:: for an
+explanation of `push' and `pop' and the use of context stacks.
+
+\1f
+File: nasm.info,  Node: Section 4.8.2,  Next: Section 4.8.3,  Prev: Section 4.8.1,  Up: Section 4.8
+
+4.8.2. `%stacksize' Directive
+-----------------------------
+
+The `%stacksize' directive is used in conjunction with the `%arg' (see
+*note Section 4.8.1::) and the `%local' (see *note Section 4.8.3::)
+directives. It tells NASM the default size to use for subsequent `%arg'
+and `%local' directives. The `%stacksize' directive takes one required
+argument which is one of `flat', `flat64', `large' or `small'.
+
+     %stacksize flat
+
+   This form causes NASM to use stack-based parameter addressing
+relative to `ebp' and it assumes that a near form of call was used to
+get to this label (i.e. that `eip' is on the stack).
+
+     %stacksize flat64
+
+   This form causes NASM to use stack-based parameter addressing
+relative to `rbp' and it assumes that a near form of call was used to
+get to this label (i.e. that `rip' is on the stack).
+
+     %stacksize large
+
+   This form uses `bp' to do stack-based parameter addressing and
+assumes that a far form of call was used to get to this address (i.e.
+that `ip' and `cs' are on the stack).
+
+     %stacksize small
+
+   This form also uses `bp' to address stack parameters, but it is
+different from `large' because it also assumes that the old value of bp
+is pushed onto the stack (i.e. it expects an `ENTER' instruction).  In
+other words, it expects that `bp', `ip' and `cs' are on the top of the
+stack, underneath any local space which may have been allocated by
+`ENTER'. This form is probably most useful when used in combination
+with the `%local' directive (see *note Section 4.8.3::).
+
+\1f
+File: nasm.info,  Node: Section 4.8.3,  Next: Section 4.9,  Prev: Section 4.8.2,  Up: Section 4.8
+
+4.8.3. `%local' Directive
+-------------------------
+
+The `%local' 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 `%local' directive is
+most useful when used with the `%stacksize' (see *note Section 4.8.2::
+and is also compatible with the `%arg' directive (see *note Section
+4.8.1::). It allows simplified reference to variables on the stack which
+have been allocated typically by using the `ENTER' instruction. An
+example of its use is the following:
+
+     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 & bx
+             mov     [old_dx],dx     ; and swap dx & cx
+             mov     ax,bx
+             mov     dx,cx
+             mov     bx,[old_ax]
+             mov     cx,[old_dx]
+             leave                   ; restore old bp
+             ret                     ;
+
+         %pop                        ; restore original context
+
+   The `%$localsize' variable is used internally by the `%local'
+directive and _must_ be defined within the current context before the
+`%local' directive may be used. Failure to do so will result in one
+expression syntax error for each `%local' variable declared. It then
+may be used in the construction of an appropriately sized ENTER
+instruction as shown in the example.
+
+\1f
+File: nasm.info,  Node: Section 4.9,  Next: Section 4.10,  Prev: Section 4.8.3,  Up: Chapter 4
+
+4.9. Reporting User-Defined Errors: `%error', `%warning', `%fatal'
+==================================================================
+
+The preprocessor directive `%error' 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:
+
+     %ifdef F1
+         ; do some setup
+     %elifdef F2
+         ; do some different setup
+     %else
+         %error "Neither F1 nor F2 was defined."
+     %endif
+
+   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.
+
+   Similarly, `%warning' issues a warning, but allows assembly to
+continue:
+
+     %ifdef F1
+         ; do some setup
+     %elifdef F2
+         ; do some different setup
+     %else
+         %warning "Neither F1 nor F2 was defined, assuming F1."
+         %define F1
+     %endif
+
+   `%error' and `%warning' are issued only on the final assembly pass.
+This makes them safe to use in conjunction with tests that depend on
+symbol values.
+
+   `%fatal' 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.
+
+   It is optional for the message string after `%error', `%warning' or
+`%fatal' to be quoted. If it is _not_, then single-line macros are
+expanded in it, which can be used to display more information to the
+user. For example:
+
+     %if foo > 64
+         %assign foo_over foo-64
+         %error foo is foo_over bytes too large
+     %endif
+
+\1f
+File: nasm.info,  Node: Section 4.10,  Next: Section 4.10.1,  Prev: Section 4.9,  Up: Chapter 4
+
+4.10. Other Preprocessor Directives
+===================================
+
+NASM also has preprocessor directives which allow access to information
+from external sources. Currently they include:
+
+   * `%line' enables NASM to correctly handle the output of another
+     preprocessor (see *note Section 4.10.1::).
+
+   * `%!' enables NASM to read in the value of an environment variable,
+     which can then be used in your program (see *note Section
+     4.10.2::).
+
+* Menu:
+
+* Section 4.10.1:: `%line' Directive
+* Section 4.10.2:: `%!'`<env>': Read an environment variable.
+
+\1f
+File: nasm.info,  Node: Section 4.10.1,  Next: Section 4.10.2,  Prev: Section 4.10,  Up: Section 4.10
+
+4.10.1. `%line' Directive
+-------------------------
+
+The `%line' 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 `%line' 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.
+
+   This preprocessor directive is not generally of use to programmers,
+by may be of interest to preprocessor authors. The usage of the `%line'
+preprocessor directive is as follows:
+
+     %line nnn[+mmm] [filename]
+
+   In this directive, `nnn' identifies the line of the original source
+file which this line corresponds to. `mmm' is an optional parameter
+which specifies a line increment value; each line of the input file
+read in is considered to correspond to `mmm' lines of the original
+source file. Finally, `filename' is an optional parameter which
+specifies the file name of the original source file.
+
+   After reading a `%line' preprocessor directive, NASM will report all
+file name and line numbers relative to the values specified therein.
+
+\1f
+File: nasm.info,  Node: Section 4.10.2,  Next: Section 4.11,  Prev: Section 4.10.1,  Up: Section 4.10
+
+4.10.2. `%!'`<env>': Read an environment variable.
+--------------------------------------------------
+
+The `%!<env>' 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.
+
+   For example, suppose that you have an environment variable `FOO', and
+you want the contents of `FOO' to be embedded in your program. You
+could do that as follows:
+
+     %defstr FOO    %!FOO
+
+   See *note Section 4.1.8:: for notes on the `%defstr' directive.
+
+\1f
+File: nasm.info,  Node: Section 4.11,  Next: Section 4.11.1,  Prev: Section 4.10.2,  Up: Chapter 4
+
+4.11. Standard Macros
+=====================
+
+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 `%clear'
+directive to empty the preprocessor of everything but context-local
+preprocessor variables and single-line macros.
+
+   Most user-level assembler directives (see *note Chapter 6::) are
+implemented as macros which invoke primitive directives; these are
+described in *note Chapter 6::. The rest of the standard macro set is
+described here.
+
+* Menu:
+
+* Section 4.11.1:: NASM Version Macros
+* Section 4.11.2:: `__NASM_VERSION_ID__': NASM Version ID
+* Section 4.11.3:: `__NASM_VER__': NASM Version string
+* Section 4.11.4:: `__FILE__' and `__LINE__': File Name and Line Number
+* Section 4.11.5:: `__BITS__': Current BITS Mode
+* Section 4.11.6:: `__OUTPUT_FORMAT__': Current Output Format
+* Section 4.11.7:: Assembly Date and Time Macros
+* Section 4.11.8:: `__USE_'_package_`__': Package Include Test
+* Section 4.11.9:: `__PASS__': Assembly Pass
+* Section 4.11.10:: `STRUC' and `ENDSTRUC': Declaring Structure Data Types
+* Section 4.11.11:: `ISTRUC', `AT' and `IEND': Declaring Instances of Structures
+* Section 4.11.12:: `ALIGN' and `ALIGNB': Data Alignment
+
+\1f
+File: nasm.info,  Node: Section 4.11.1,  Next: Section 4.11.2,  Prev: Section 4.11,  Up: Section 4.11
+
+4.11.1. NASM Version Macros
+---------------------------
+
+The single-line macros `__NASM_MAJOR__', `__NASM_MINOR__',
+`__NASM_SUBMINOR__' and `___NASM_PATCHLEVEL__' 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, `__NASM_MAJOR__'
+would be defined to be 0, `__NASM_MINOR__' would be defined as 98,
+`__NASM_SUBMINOR__' would be defined to 32, and `___NASM_PATCHLEVEL__'
+would be defined as 1.
+
+   Additionally, the macro `__NASM_SNAPSHOT__' is defined for
+automatically generated snapshot releases _only_.
+
+\1f
+File: nasm.info,  Node: Section 4.11.2,  Next: Section 4.11.3,  Prev: Section 4.11.1,  Up: Section 4.11
+
+4.11.2. `__NASM_VERSION_ID__': NASM Version ID
+----------------------------------------------
+
+The single-line macro `__NASM_VERSION_ID__' expands to a dword integer
+representing the full version number of the version of nasm being used.
+The value is the equivalent to `__NASM_MAJOR__', `__NASM_MINOR__',
+`__NASM_SUBMINOR__' and `___NASM_PATCHLEVEL__' concatenated to produce
+a single doubleword. Hence, for 0.98.32p1, the returned number would be
+equivalent to:
+
+             dd      0x00622001
+
+   or
+
+             db      1,32,98,0
+
+   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.
+
+\1f
+File: nasm.info,  Node: Section 4.11.3,  Next: Section 4.11.4,  Prev: Section 4.11.2,  Up: Section 4.11
+
+4.11.3. `__NASM_VER__': NASM Version string
+-------------------------------------------
+
+The single-line macro `__NASM_VER__' expands to a string which defines
+the version number of nasm being used. So, under NASM 0.98.32 for
+example,
+
+             db      __NASM_VER__
+
+   would expand to
+
+             db      "0.98.32"
+
+\1f
+File: nasm.info,  Node: Section 4.11.4,  Next: Section 4.11.5,  Prev: Section 4.11.3,  Up: Section 4.11
+
+4.11.4. `__FILE__' and `__LINE__': File Name and Line Number
+------------------------------------------------------------
+
+Like the C preprocessor, NASM allows the user to find out the file name
+and line number containing the current instruction. The macro `__FILE__'
+expands to a string constant giving the name of the current input file
+(which may change through the course of assembly if `%include'
+directives are used), and `__LINE__' expands to a numeric constant
+giving the current line number in the input file.
+
+   These macros could be used, for example, to communicate debugging
+information to a macro, since invoking `__LINE__' inside a macro
+definition (either single-line or multi-line) will return the line
+number of the macro _call_, rather than _definition_. So to determine
+where in a piece of code a crash is occurring, for example, one could
+write a routine `stillhere', which is passed a line number in `EAX' and
+outputs something like `line 155: still here'. You could then write a
+macro
+
+     %macro  notdeadyet 0
+
+             push    eax
+             mov     eax,__LINE__
+             call    stillhere
+             pop     eax
+
+     %endmacro
+
+   and then pepper your code with calls to `notdeadyet' until you find
+the crash point.
+
+\1f
+File: nasm.info,  Node: Section 4.11.5,  Next: Section 4.11.6,  Prev: Section 4.11.4,  Up: Section 4.11
+
+4.11.5. `__BITS__': Current BITS Mode
+-------------------------------------
+
+The `__BITS__' standard macro is updated every time that the BITS mode
+is set using the `BITS XX' or `[BITS XX]' directive, where XX is a
+valid mode number of 16, 32 or 64. `__BITS__' receives the specified
+mode number and makes it globally available. This can be very useful for
+those who utilize mode-dependent macros.
+
+\1f
+File: nasm.info,  Node: Section 4.11.6,  Next: Section 4.11.7,  Prev: Section 4.11.5,  Up: Section 4.11
+
+4.11.6. `__OUTPUT_FORMAT__': Current Output Format
+--------------------------------------------------
+
+The `__OUTPUT_FORMAT__' standard macro holds the current Output Format,
+as given by the `-f' option or NASM's default. Type `nasm -hf' for a
+list.
+
+     %ifidn __OUTPUT_FORMAT__, win32
+      %define NEWLINE 13, 10
+     %elifidn __OUTPUT_FORMAT__, elf32
+      %define NEWLINE 10
+     %endif
+
+\1f
+File: nasm.info,  Node: Section 4.11.7,  Next: Section 4.11.8,  Prev: Section 4.11.6,  Up: Section 4.11
+
+4.11.7. Assembly Date and Time Macros
+-------------------------------------
+
+NASM provides a variety of macros that represent the timestamp of the
+assembly session.
+
+   * The `__DATE__' and `__TIME__' macros give the assembly date and
+     time as strings, in ISO 8601 format (`"YYYY-MM-DD"' and
+     `"HH:MM:SS"', respectively.)
+
+   * The `__DATE_NUM__' and `__TIME_NUM__' macros give the assembly
+     date and time in numeric form; in the format `YYYYMMDD' and
+     `HHMMSS' respectively.
+
+   * The `__UTC_DATE__' and `__UTC_TIME__' macros give the assembly
+     date and time in universal time (UTC) as strings, in ISO 8601
+     format (`"YYYY-MM-DD"' and `"HH:MM:SS"', respectively.) If the host
+     platform doesn't provide UTC time, these macros are undefined.
+
+   * The `__UTC_DATE_NUM__' and `__UTC_TIME_NUM__' macros give the
+     assembly date and time universal time (UTC) in numeric form; in
+     the format `YYYYMMDD' and `HHMMSS' respectively. If the host
+     platform doesn't provide UTC time, these macros are undefined.
+
+   * The `__POSIX_TIME__' 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.
+
+   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:
+
+           __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
+
+\1f
+File: nasm.info,  Node: Section 4.11.8,  Next: Section 4.11.9,  Prev: Section 4.11.7,  Up: Section 4.11
+
+4.11.8. `__USE_'_package_`__': Package Include Test
+---------------------------------------------------
+
+When a standard macro package (see *note Chapter 5::) is included with
+the `%use' directive (see *note Section 4.6.4::), a single-line macro
+of the form `__USE_'_package_`__' is automatically defined. This allows
+testing if a particular package is invoked or not.
+
+   For example, if the `altreg' package is included (see *note Section
+5.1::), then the macro `__USE_ALTREG__' is defined.
+
+\1f
+File: nasm.info,  Node: Section 4.11.9,  Next: Section 4.11.10,  Prev: Section 4.11.8,  Up: Section 4.11
+
+4.11.9. `__PASS__': Assembly Pass
+---------------------------------
+
+The macro `__PASS__' is defined to be `1' on preparatory passes, and
+`2' on the final pass. In preprocess-only mode, it is set to `3', and
+when running only to generate dependencies (due to the `-M' or `-MG'
+option, see *note Section 2.1.4::) it is set to `0'.
+
+   _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._
+
+\1f
+File: nasm.info,  Node: Section 4.11.10,  Next: Section 4.11.11,  Prev: Section 4.11.9,  Up: Section 4.11
+
+4.11.10. `STRUC' and `ENDSTRUC': Declaring Structure Data Types
+---------------------------------------------------------------
+
+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
+`STRUC' and `ENDSTRUC' are used to define a structure data type.
+
+   `STRUC' 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 `_size' appended to it is defined as an `EQU' giving the size of
+the structure. Once `STRUC' has been issued, you are defining the
+structure, and should define fields using the `RESB' family of pseudo-
+instructions, and then invoke `ENDSTRUC' to finish the definition.
+
+   For example, to define a structure called `mytype' containing a
+longword, a word, a byte and a string of bytes, you might code
+
+     struc   mytype
+
+       mt_long:      resd    1
+       mt_word:      resw    1
+       mt_byte:      resb    1
+       mt_str:       resb    32
+
+     endstruc
+
+   The above code defines six symbols: `mt_long' as 0 (the offset from
+the beginning of a `mytype' structure to the longword field), `mt_word'
+as 4, `mt_byte' as 6, `mt_str' as 7, `mytype_size' as 39, and `mytype'
+itself as zero.
+
+   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:
+
+     struc mytype
+
+       .long:        resd    1
+       .word:        resw    1
+       .byte:        resb    1
+       .str:         resb    32
+
+     endstruc
+
+   This defines the offsets to the structure fields as `mytype.long',
+`mytype.word', `mytype.byte' and `mytype.str'.
+
+   NASM, since it has no _intrinsic_ 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
+`mov ax,[mystruc.mt_word]' is not valid. `mt_word' is a constant just
+like any other constant, so the correct syntax is `mov
+ax,[mystruc+mt_word]' or `mov ax,[mystruc+mytype.word]'.
+
+   Sometimes you only have the address of the structure displaced by an
+offset. For example, consider this standard stack frame setup:
+
+     push ebp
+     mov ebp, esp
+     sub esp, 40
+
+   In this case, you could access an element by subtracting the offset:
+
+     mov [ebp - 40 + mytype.word], ax
+
+   However, if you do not want to repeat this offset, you can use -40
+as a base offset:
+
+     struc mytype, -40
+
+   And access an element this way:
+
+     mov [ebp + mytype.word], ax
+
+\1f
+File: nasm.info,  Node: Section 4.11.11,  Next: Section 4.11.12,  Prev: Section 4.11.10,  Up: Section 4.11
+
+4.11.11. `ISTRUC', `AT' and `IEND': Declaring Instances of Structures
+---------------------------------------------------------------------
+
+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 `ISTRUC' mechanism. To declare a
+structure of type `mytype' in a program, you code something like this:
+
+     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
+
+   The function of the `AT' macro is to make use of the `TIMES' 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.
+
+   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
+`AT' line. For example:
+
+             at mt_str,  db      123,134,145,156,167,178,189
+                         db      190,100,0
+
+   Depending on personal taste, you can also omit the code part of the
+`AT' line completely, and start the structure field on the next line:
+
+             at mt_str
+                     db      'hello, world'
+                     db      13,10,0
+
+\1f
+File: nasm.info,  Node: Section 4.11.12,  Next: Chapter 5,  Prev: Section 4.11.11,  Up: Section 4.11
+
+4.11.12. `ALIGN' and `ALIGNB': Data Alignment
+---------------------------------------------
+
+The `ALIGN' and `ALIGNB' macros provides a convenient way to align code
+or data on a word, longword, paragraph or other boundary. (Some
+assemblers call this directive `EVEN'.) The syntax of the `ALIGN' and
+`ALIGNB' macros is
+
+             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
+
+   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 `TIMES' prefix to their second argument to perform
+the alignment.
+
+   If the second argument is not specified, the default for `ALIGN' is
+`NOP', and the default for `ALIGNB' is `RESB 1'. So if the second
+argument is specified, the two macros are equivalent. Normally, you can
+just use `ALIGN' in code and data sections and `ALIGNB' in BSS
+sections, and never need the second argument except for special
+purposes.
+
+   `ALIGN' and `ALIGNB', 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.
+
+   `ALIGNB' (or `ALIGN' with a second argument of `RESB 1') can be used
+within structure definitions:
+
+     struc mytype2
+
+       mt_byte:
+             resb 1
+             alignb 2
+       mt_word:
+             resw 1
+             alignb 4
+       mt_long:
+             resd 1
+       mt_str:
+             resb 32
+
+     endstruc
+
+   This will ensure that the structure members are sensibly aligned
+relative to the base of the structure.
+
+   A final caveat: `ALIGN' and `ALIGNB' work relative to the beginning
+of the _section_, 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 `ALIGN' or
+`ALIGNB'.
+
+   See also the `smartalign' standard macro package, *note Section
+5.2::.
+
+\1f
+File: nasm.info,  Node: Chapter 5,  Next: Section 5.1,  Prev: Section 4.11.12,  Up: Top
+
+Chapter 5: Standard Macro Packages
+**********************************
+
+The `%use' directive (see *note Section 4.6.4::) includes one of the
+standard macro packages included with the NASM distribution and compiled
+into the NASM binary. It operates like the `%include' directive (see
+*note Section 4.6.1::), but the included contents is provided by NASM
+itself.
+
+   The names of standard macro packages are case insensitive, and can be
+quoted or not.
+
+* Menu:
+
+* Section 5.1:: `altreg': Alternate Register Names
+* Section 5.2:: `smartalign': Smart `ALIGN' Macro
+
+\1f
+File: nasm.info,  Node: Section 5.1,  Next: Section 5.2,  Prev: Chapter 5,  Up: Chapter 5
+
+5.1. `altreg': Alternate Register Names
+=======================================
+
+The `altreg' standard macro package provides alternate register names.
+It provides numeric register names for all registers (not just `R8'-
+`R15'), the Intel-defined aliases `R8L'-`R15L' for the low bytes of
+register (as opposed to the NASM/AMD standard names `R8B'- `R15B'), and
+the names `R0H'-`R3H' (by analogy with `R0L'-`R3L') for `AH', `CH',
+`DH', and `BH'.
+
+   Example use:
+
+     %use altreg
+
+     proc:
+           mov r0l,r3h                    ; mov al,bh
+           ret
+
+   See also *note Section 11.1::.
+
+\1f
+File: nasm.info,  Node: Section 5.2,  Next: Chapter 6,  Prev: Section 5.1,  Up: Chapter 5
+
+5.2. `smartalign': Smart `ALIGN' Macro
+======================================
+
+The `smartalign' standard macro package provides for an `ALIGN' macro
+which is more powerful than the default (and backwards-compatible) one
+(see *note Section 4.11.12::). When the `smartalign' package is
+enabled, when `ALIGN' is used without a second argument, NASM will
+generate a sequence of instructions more efficient than a series of
+`NOP'. Furthermore, if the padding exceeds a specific threshold, then
+NASM will generate a jump over the entire padding sequence.
+
+   The specific instructions generated can be controlled with the new
+`ALIGNMODE' macro. This macro takes two parameters: one mode, and an
+optional jump threshold override. The modes are as follows:
+
+   * `generic': Works on all x86 CPUs and should have reasonable
+     performance. The default jump threshold is 8. This is the default.
+
+   * `nop': Pad out with `NOP' instructions. The only difference
+     compared to the standard `ALIGN' macro is that NASM can still jump
+     over a large padding area. The default jump threshold is 16.
+
+   * `k7': Optimize for the AMD K7 (Athlon/Althon XP). These
+     instructions should still work on all x86 CPUs. The default jump
+     threshold is 16.
+
+   * `k8': Optimize for the AMD K8 (Opteron/Althon 64). These
+     instructions should still work on all x86 CPUs. The default jump
+     threshold is 16.
+
+   * `p6': Optimize for Intel CPUs. This uses the long `NOP'
+     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.
+
+   The macro `__ALIGNMODE__' is defined to contain the current alignment
+mode. A number of other macros beginning with `__ALIGN_' are used
+internally by this macro package.
+
+\1f
+File: nasm.info,  Node: Chapter 6,  Next: Section 6.1,  Prev: Section 5.2,  Up: Top
+
+Chapter 6: Assembler Directives
+*******************************
+
+NASM, though it attempts to avoid the bureaucracy of assemblers like
+MASM and TASM, is nevertheless forced to support a _few_ directives.
+These are described in this chapter.
+
+   NASM's directives come in two types: _user-level_ directives and
+_primitive_ 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.
+
+   Primitive directives are enclosed in square brackets; user-level
+directives are not.
+
+   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
+_format-specific_ directives are documented along with the formats that
+implement them, in *note Chapter 7::.
+
+* Menu:
+
+* Section 6.1:: `BITS': Specifying Target Processor Mode
+* Section 6.2:: `DEFAULT': Change the assembler defaults
+* Section 6.3:: `SECTION' or `SEGMENT': Changing and Defining Sections
+* Section 6.4:: `ABSOLUTE': Defining Absolute Labels
+* Section 6.5:: `EXTERN': Importing Symbols from Other Modules
+* Section 6.6:: `GLOBAL': Exporting Symbols to Other Modules
+* Section 6.7:: `COMMON': Defining Common Data Areas
+* Section 6.8:: `CPU': Defining CPU Dependencies
+* Section 6.9:: `FLOAT': Handling of floating-point constants
+
+\1f
+File: nasm.info,  Node: Section 6.1,  Next: Section 6.1.1,  Prev: Chapter 6,  Up: Chapter 6
+
+6.1. `BITS': Specifying Target Processor Mode
+=============================================
+
+The `BITS' 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 `BITS XX', where XX is 16, 32 or 64.
+
+   In most cases, you should not need to use `BITS' explicitly. The
+`aout', `coff', `elf', `macho', `win32' and `win64' 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 `obj' object format allows you to specify each segment you define
+as either `USE16' or `USE32', and NASM will set its operating mode
+accordingly, so the use of the `BITS' directive is once again
+unnecessary.
+
+   The most likely reason for using the `BITS' directive is to write 32-
+bit or 64-bit code in a flat binary file; this is because the `bin'
+output format defaults to 16-bit mode in anticipation of it being used
+most frequently to write DOS `.COM' programs, DOS `.SYS' device drivers
+and boot loader software.
+
+   You do _not_ need to specify `BITS 32' 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.
+
+   When NASM is in `BITS 16' 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 `BITS 32' 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.
+
+   When NASM is in `BITS 64' mode, most instructions operate the same as
+they do for `BITS 32' mode. However, there are 8 more general and SSE
+registers, and 16-bit addressing is no longer supported.
+
+   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
+`REX' prefix is used both to select 64-bit operand size, and to access
+the new registers. NASM automatically inserts REX prefixes when
+necessary.
+
+   When the `REX' 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.
+
+   The `BITS' directive has an exactly equivalent primitive form,
+`[BITS 16]', `[BITS 32]' and `[BITS 64]'. The user-level form is a
+macro which has no function other than to call the primitive form.
+
+   Note that the space is neccessary, e.g. `BITS32' will _not_ work!
+
+* Menu:
+
+* Section 6.1.1:: `USE16' & `USE32': Aliases for BITS
+
+\1f
+File: nasm.info,  Node: Section 6.1.1,  Next: Section 6.2,  Prev: Section 6.1,  Up: Section 6.1
+
+6.1.1. `USE16' & `USE32': Aliases for BITS
+------------------------------------------
+
+The ``USE16'' and ``USE32'' directives can be used in place of ``BITS
+16'' and ``BITS 32'', for compatibility with other assemblers.
+
+\1f
+File: nasm.info,  Node: Section 6.2,  Next: Section 6.3,  Prev: Section 6.1.1,  Up: Chapter 6
+
+6.2. `DEFAULT': Change the assembler defaults
+=============================================
+
+The `DEFAULT' 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.
+
+   Currently, the only `DEFAULT' that is settable is whether or not
+registerless instructions in 64-bit mode are `RIP'-relative or not.  By
+default, they are absolute unless overridden with the `REL' specifier
+(see *note Section 3.3::). However, if `DEFAULT REL' is specified,
+`REL' is default, unless overridden with the `ABS' specifier, _except
+when used with an FS or GS segment override_.
+
+   The special handling of `FS' and `GS' 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 `RIP'-relative
+addresses would be extremely confusing.
+
+   `DEFAULT REL' is disabled with `DEFAULT ABS'.
+
+\1f
+File: nasm.info,  Node: Section 6.3,  Next: Section 6.3.1,  Prev: Section 6.2,  Up: Chapter 6
+
+6.3. `SECTION' or `SEGMENT': Changing and Defining Sections
+===========================================================
+
+The `SECTION' directive (`SEGMENT' 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 `SECTION' 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.
+
+   The Unix object formats, and the `bin' object format (but see *note
+Section 7.1.3::, all support the standardized section names `.text',
+`.data' and `.bss' for the code, data and uninitialized-data sections.
+The `obj' 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.
+
+* Menu:
+
+* Section 6.3.1:: The `__SECT__' Macro
+
+\1f
+File: nasm.info,  Node: Section 6.3.1,  Next: Section 6.4,  Prev: Section 6.3,  Up: Section 6.3
+
+6.3.1. The `__SECT__' Macro
+---------------------------
+
+The `SECTION' directive is unusual in that its user-level form
+functions differently from its primitive form. The primitive form,
+`[SECTION xyz]', simply switches the current target section to the one
+given. The user-level form, `SECTION xyz', however, first defines the
+single-line macro `__SECT__' to be the primitive `[SECTION]' directive
+which it is about to issue, and then issues it. So the user-level
+directive
+
+             SECTION .text
+
+   expands to the two lines
+
+     %define __SECT__        [SECTION .text]
+             [SECTION .text]
+
+   Users may find it useful to make use of this in their own macros. For
+example, the `writefile' macro defined in *note Section 4.3.4:: can be
+usefully rewritten in the following more sophisticated form:
+
+     %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
+
+   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 `SECTION' directive so as not to modify
+`__SECT__'. It then declares its string in the data section, and then
+invokes `__SECT__' to switch back to _whichever_ section the user was
+previously working in. It thus avoids the need, in the previous version
+of the macro, to include a `JMP' instruction to jump over the data, and
+also does not fail if, in a complicated `OBJ' format module, the user
+could potentially be assembling the code in any of several separate code
+sections.
+
+\1f
+File: nasm.info,  Node: Section 6.4,  Next: Section 6.5,  Prev: Section 6.3.1,  Up: Chapter 6
+
+6.4. `ABSOLUTE': Defining Absolute Labels
+=========================================
+
+The `ABSOLUTE' directive can be thought of as an alternative form of
+`SECTION': 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 `RESB'
+family.
+
+   `ABSOLUTE' is used as follows:
+
+     absolute 0x1A
+
+         kbuf_chr    resw    1
+         kbuf_free   resw    1
+         kbuf        resw    16
+
+   This example describes a section of the PC BIOS data area, at segment
+address 0x40: the above code defines `kbuf_chr' to be 0x1A, `kbuf_free'
+to be 0x1C, and `kbuf' to be 0x1E.
+
+   The user-level form of `ABSOLUTE', like that of `SECTION', redefines
+the `__SECT__' macro when it is invoked.
+
+   `STRUC' and `ENDSTRUC' are defined as macros which use `ABSOLUTE'
+(and also `__SECT__').
+
+   `ABSOLUTE' doesn't have to take an absolute constant as an argument:
+it can take an expression (actually, a critical expression: see *note
+Section 3.8::) 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:
+
+             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:
+
+   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.
+
+\1f
+File: nasm.info,  Node: Section 6.5,  Next: Section 6.6,  Prev: Section 6.4,  Up: Chapter 6
+
+6.5. `EXTERN': Importing Symbols from Other Modules
+===================================================
+
+`EXTERN' is similar to the MASM directive `EXTRN' and the C keyword
+`extern': 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 `bin' format
+cannot.
+
+   The `EXTERN' directive takes as many arguments as you like. Each
+argument is the name of a symbol:
+
+     extern  _printf
+     extern  _sscanf,_fscanf
+
+   Some object-file formats provide extra features to the `EXTERN'
+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 `obj' format allows you to declare that the default
+segment base of an external should be the group `dgroup' by means of
+the directive
+
+     extern  _variable:wrt dgroup
+
+   The primitive form of `EXTERN' 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.
+
+   You can declare the same variable as `EXTERN' more than once: NASM
+will quietly ignore the second and later redeclarations. You can't
+declare a variable as `EXTERN' as well as something else, though.
+
+\1f
+File: nasm.info,  Node: Section 6.6,  Next: Section 6.7,  Prev: Section 6.5,  Up: Chapter 6
+
+6.6. `GLOBAL': Exporting Symbols to Other Modules
+=================================================
+
+`GLOBAL' is the other end of `EXTERN': if one module declares a symbol
+as `EXTERN' and refers to it, then in order to prevent linker errors,
+some other module must actually _define_ the symbol and declare it as
+`GLOBAL'. Some assemblers use the name `PUBLIC' for this purpose.
+
+   The `GLOBAL' directive applying to a symbol must appear _before_ the
+definition of the symbol.
+
+   `GLOBAL' uses the same syntax as `EXTERN', except that it must refer
+to symbols which _are_ defined in the same module as the `GLOBAL'
+directive. For example:
+
+     global _main
+     _main:
+             ; some code
+
+   `GLOBAL', like `EXTERN', allows object formats to define private
+extensions by means of a colon. The `elf' object format, for example,
+lets you specify whether global data items are functions or data:
+
+     global  hashlookup:function, hashtable:data
+
+   Like `EXTERN', the primitive form of `GLOBAL' differs from the
+user-level form only in that it can take only one argument at a time.
+
+\1f
+File: nasm.info,  Node: Section 6.7,  Next: Section 6.8,  Prev: Section 6.6,  Up: Chapter 6
+
+6.7. `COMMON': Defining Common Data Areas
+=========================================
+
+The `COMMON' directive is used to declare _common variables_. A common
+variable is much like a global variable declared in the uninitialized
+data section, so that
+
+     common  intvar  4
+
+   is similar in function to
+
+     global  intvar
+     section .bss
+
+     intvar  resd    1
+
+   The difference is that if more than one module defines the same
+common variable, then at link time those variables will be _merged_, and
+references to `intvar' in all modules will point at the same piece of
+memory.
+
+   Like `GLOBAL' and `EXTERN', `COMMON' supports object-format specific
+extensions. For example, the `obj' format allows common variables to be
+NEAR or FAR, and the `elf' format allows you to specify the alignment
+requirements of a common variable:
+
+     common  commvar  4:near  ; works in OBJ
+     common  intarray 100:4   ; works in ELF: 4 byte aligned
+
+   Once again, like `EXTERN' and `GLOBAL', the primitive form of
+`COMMON' differs from the user-level form only in that it can take only
+one argument at a time.
+
+\1f
+File: nasm.info,  Node: Section 6.8,  Next: Section 6.9,  Prev: Section 6.7,  Up: Chapter 6
+
+6.8. `CPU': Defining CPU Dependencies
+=====================================
+
+The `CPU' directive restricts assembly to those instructions which are
+available on the specified CPU.
+
+   Options are:
+
+   * `CPU 8086' Assemble only 8086 instruction set
+
+   * `CPU 186' Assemble instructions up to the 80186 instruction set
+
+   * `CPU 286' Assemble instructions up to the 286 instruction set
+
+   * `CPU 386' Assemble instructions up to the 386 instruction set
+
+   * `CPU 486' 486 instruction set
+
+   * `CPU 586' Pentium instruction set
+
+   * `CPU PENTIUM' Same as 586
+
+   * `CPU 686' P6 instruction set
+
+   * `CPU PPRO' Same as 686
+
+   * `CPU P2' Same as 686
+
+   * `CPU P3' Pentium III (Katmai) instruction sets
+
+   * `CPU KATMAI' Same as P3
+
+   * `CPU P4' Pentium 4 (Willamette) instruction set
+
+   * `CPU WILLAMETTE' Same as P4
+
+   * `CPU PRESCOTT' Prescott instruction set
+
+   * `CPU X64' x86-64 (x64/AMD64/Intel 64) instruction set
+
+   * `CPU IA64' IA64 CPU (in x86 mode) instruction set
+
+   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.
+
+\1f
+File: nasm.info,  Node: Section 6.9,  Next: Chapter 7,  Prev: Section 6.8,  Up: Chapter 6
+
+6.9. `FLOAT': Handling of floating-point constants
+==================================================
+
+By default, floating-point constants are rounded to nearest, and IEEE
+denormals are supported. The following options can be set to alter this
+behaviour:
+
+   * `FLOAT DAZ' Flush denormals to zero
+
+   * `FLOAT NODAZ' Do not flush denormals to zero (default)
+
+   * `FLOAT NEAR' Round to nearest (default)
+
+   * `FLOAT UP' Round up (toward +Infinity)
+
+   * `FLOAT DOWN' Round down (toward -Infinity)
+
+   * `FLOAT ZERO' Round toward zero
+
+   * `FLOAT DEFAULT' Restore default settings
+
+   The standard macros `__FLOAT_DAZ__', `__FLOAT_ROUND__', and
+`__FLOAT__' contain the current state, as long as the programmer has
+avoided the use of the brackeded primitive form, (`[FLOAT]').
+
+   `__FLOAT__' contains the full set of floating-point settings; this
+value can be saved away and invoked later to restore the setting.
+
+\1f
+File: nasm.info,  Node: Chapter 7,  Next: Section 7.1,  Prev: Section 6.9,  Up: Top
+
+Chapter 7: Output Formats
+*************************
+
+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 `-f' option on the NASM
+command line. Each of these formats, along with its extensions to the
+base NASM syntax, is detailed in this chapter.
+
+   As stated in *note Section 2.1.1::, 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 (`.asm', `.s',
+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.
+
+* Menu:
+
+* Section 7.1:: `bin': Flat-Form Binary Output
+* Section 7.2:: `ith': Intel Hex Output
+* Section 7.3:: `srec': Motorola S-Records Output
+* Section 7.4:: `obj': Microsoft OMF Object Files
+* Section 7.5:: `win32': Microsoft Win32 Object Files
+* Section 7.6:: `win64': Microsoft Win64 Object Files
+* Section 7.7:: `coff': Common Object File Format
+* Section 7.8:: `macho32' and `macho64': Mach Object File Format
+* Section 7.9:: `elf32' and `elf64': Executable and Linkable Format Object Files
+* Section 7.10:: `aout': Linux `a.out' Object Files
+* Section 7.11:: `aoutb': NetBSD/FreeBSD/OpenBSD `a.out' Object Files
+* Section 7.12:: `as86': Minix/Linux `as86' Object Files
+* Section 7.13:: `rdf': Relocatable Dynamic Object File Format
+* Section 7.14:: `dbg': Debugging Format
+
+\1f
+File: nasm.info,  Node: Section 7.1,  Next: Section 7.1.1,  Prev: Chapter 7,  Up: Chapter 7
+
+7.1. `bin': Flat-Form Binary Output
+===================================
+
+The `bin' 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: `.COM' executables and `.SYS' device drivers are pure
+binary files. Pure binary output is also useful for operating system
+and boot loader development.
+
+   The `bin' format supports multiple section names. For details of how
+NASM handles sections in the `bin' format, see *note Section 7.1.3::.
+
+   Using the `bin' format puts NASM by default into 16-bit mode (see
+*note Section 6.1::). In order to use `bin' to write 32-bit or 64-bit
+code, such as an OS kernel, you need to explicitly issue the `BITS 32'
+or `BITS 64' directive.
+
+   `bin' 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 `binprog.asm' into a binary
+file called `binprog'.
+
+* Menu:
+
+* Section 7.1.1:: `ORG': Binary File Program Origin
+* Section 7.1.2:: `bin' Extensions to the `SECTION' Directive
+* Section 7.1.3:: Multisection Support for the `bin' Format
+* Section 7.1.4:: Map Files
+
+\1f
+File: nasm.info,  Node: Section 7.1.1,  Next: Section 7.1.2,  Prev: Section 7.1,  Up: Section 7.1
+
+7.1.1. `ORG': Binary File Program Origin
+----------------------------------------
+
+The `bin' format provides an additional directive to the list given in
+*note Chapter 6::: `ORG'. The function of the `ORG' directive is to
+specify the origin address which NASM will assume the program begins at
+when it is loaded into memory.
+
+   For example, the following code will generate the longword
+`0x00000104':
+
+             org     0x100
+             dd      label
+     label:
+
+   Unlike the `ORG' 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 `ORG' does exactly what the directive
+says: _origin_. 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 *note Section
+12.1.3:: for further comments.
+
+\1f
+File: nasm.info,  Node: Section 7.1.2,  Next: Section 7.1.3,  Prev: Section 7.1.1,  Up: Section 7.1
+
+7.1.2. `bin' Extensions to the `SECTION' Directive
+--------------------------------------------------
+
+The `bin' output format extends the `SECTION' (or `SEGMENT') directive
+to allow you to specify the alignment requirements of segments.  This
+is done by appending the `ALIGN' qualifier to the end of the
+section-definition line. For example,
+
+     section .data   align=16
+
+   switches to the section `.data' and also specifies that it must be
+aligned on a 16-byte boundary.
+
+   The parameter to `ALIGN' 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.
+
+\1f
+File: nasm.info,  Node: Section 7.1.3,  Next: Section 7.1.4,  Prev: Section 7.1.2,  Up: Section 7.1
+
+7.1.3. Multisection Support for the `bin' Format
+------------------------------------------------
+
+The `bin' format allows the use of multiple sections, of arbitrary
+names, besides the "known" `.text', `.data', and `.bss' names.
+
+   * Sections may be designated `progbits' or `nobits'. Default is
+     `progbits' (except `.bss', which defaults to `nobits', of course).
+
+   * Sections can be aligned at a specified boundary following the
+     previous section with `align=', or at an arbitrary byte-granular
+     position with `start='.
+
+   * Sections can be given a virtual start address, which will be used
+     for the calculation of all memory references within that section
+     with `vstart='.
+
+   * Sections can be ordered using `follows='`<section>' or
+     `vfollows='`<section>' as an alternative to specifying an explicit
+     start address.
+
+   * Arguments to `org', `start', `vstart', and `align=' are critical
+     expressions. See *note Section 3.8::. E.g.  `align=(1 <<
+     ALIGN_SHIFT)' - `ALIGN_SHIFT' must be defined before it is used
+     here.
+
+   * Any code which comes before an explicit `SECTION' directive is
+     directed by default into the `.text' section.
+
+   * If an `ORG' statement is not given, `ORG 0' is used by default.
+
+   * The `.bss' section will be placed after the last `progbits'
+     section, unless `start=', `vstart=', `follows=', or `vfollows='
+     has been specified.
+
+   * All sections are aligned on dword boundaries, unless a different
+     alignment has been specified.
+
+   * Sections may not overlap.
+
+   * NASM creates the `section.<secname>.start' for each section, which
+     may be used in your code.
+
+\1f
+File: nasm.info,  Node: Section 7.1.4,  Next: Section 7.2,  Prev: Section 7.1.3,  Up: Section 7.1
+
+7.1.4. Map Files
+----------------
+
+Map files can be generated in `-f bin' format by means of the `[map]'
+option. Map types of `all' (default), `brief', `sections', `segments',
+or `symbols' may be specified.  Output may be directed to `stdout'
+(default), `stderr', or a specified file. E.g. `[map symbols
+myfile.map]'. No "user form" exists, the square brackets must be used.
+
+\1f
+File: nasm.info,  Node: Section 7.2,  Next: Section 7.3,  Prev: Section 7.1.4,  Up: Chapter 7
+
+7.2. `ith': Intel Hex Output
+============================
+
+The `ith' file format produces Intel hex-format files. Just as the
+`bin' 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.
+
+   All extensions supported by the `bin' file format is also supported
+by the `ith' file format.
+
+   `ith' provides a default output file-name extension of `.ith'.
+
+\1f
+File: nasm.info,  Node: Section 7.3,  Next: Section 7.4,  Prev: Section 7.2,  Up: Chapter 7
+
+7.3. `srec': Motorola S-Records Output
+======================================
+
+The `srec' file format produces Motorola S-records files. Just as the
+`bin' 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.
+
+   All extensions supported by the `bin' file format is also supported
+by the `srec' file format.
+
+   `srec' provides a default output file-name extension of `.srec'.
+
+\1f
+File: nasm.info,  Node: Section 7.4,  Next: Section 7.4.1,  Prev: Section 7.3,  Up: Chapter 7
+
+7.4. `obj': Microsoft OMF Object Files
+======================================
+
+The `obj' file format (NASM calls it `obj' rather than `omf' for
+historical reasons) is the one produced by MASM and TASM, which is
+typically fed to 16-bit DOS linkers to produce `.EXE' files. It is also
+the format used by OS/2.
+
+   `obj' provides a default output file-name extension of `.obj'.
+
+   `obj' is not exclusively a 16-bit format, though: NASM has full
+support for the 32-bit extensions to the format. In particular, 32-bit
+`obj' format files are used by Borland's Win32 compilers, instead of
+using Microsoft's newer `win32' object file format.
+
+   The `obj' format does not define any special segment names: you can
+call your segments anything you like. Typical names for segments in
+`obj' format files are `CODE', `DATA' and `BSS'.
+
+   If your source file contains code before specifying an explicit
+`SEGMENT' directive, then NASM will invent its own segment called
+`__NASMDEFSEG' for you.
+
+   When you define a segment in an `obj' 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:
+
+     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
+
+   The `obj' format also enables the use of the `SEG' and `WRT'
+operators, so that you can write code which does things like
+
+     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
+
+* Menu:
+
+* Section 7.4.1:: `obj' Extensions to the `SEGMENT' Directive
+* Section 7.4.2:: `GROUP': Defining Groups of Segments
+* Section 7.4.3:: `UPPERCASE': Disabling Case Sensitivity in Output
+* Section 7.4.4:: `IMPORT': Importing DLL Symbols
+* Section 7.4.5:: `EXPORT': Exporting DLL Symbols
+* Section 7.4.6:: `..start': Defining the Program Entry Point
+* Section 7.4.7:: `obj' Extensions to the `EXTERN' Directive
+* Section 7.4.8:: `obj' Extensions to the `COMMON' Directive
+
+\1f
+File: nasm.info,  Node: Section 7.4.1,  Next: Section 7.4.2,  Prev: Section 7.4,  Up: Section 7.4
+
+7.4.1. `obj' Extensions to the `SEGMENT' Directive
+--------------------------------------------------
+
+The `obj' output format extends the `SEGMENT' (or `SECTION') 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,
+
+     segment code private align=16
+
+   defines the segment `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.
+
+   The available qualifiers are:
+
+   * `PRIVATE', `PUBLIC', `COMMON' and `STACK' specify the combination
+     characteristics of the segment. `PRIVATE' segments do not get
+     combined with any others by the linker; `PUBLIC' and `STACK'
+     segments get concatenated together at link time; and `COMMON'
+     segments all get overlaid on top of each other rather than stuck
+     end-to-end.
+
+   * `ALIGN' 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.
+
+   * `CLASS' 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.  `CLASS=CODE'.
+
+   * `OVERLAY', like `CLASS', is specified with an arbitrary word as an
+     argument, and provides overlay information to an overlay-capable
+     linker.
+
+   * Segments can be declared as `USE16' or `USE32', 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.
+
+   * When writing OS/2 object files, you should declare 32-bit segments
+     as `FLAT', which causes the default segment base for anything in
+     the segment to be the special group `FLAT', and also defines the
+     group if it is not already defined.
+
+   * The `obj' 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
+     `SEGMENT SCREEN ABSOLUTE=0xB800' if you need to. The `ABSOLUTE'
+     and `ALIGN' keywords are mutually exclusive.
+
+   NASM's default segment attributes are `PUBLIC', `ALIGN=1', no class,
+no overlay, and `USE16'.
+
+\1f
+File: nasm.info,  Node: Section 7.4.2,  Next: Section 7.4.3,  Prev: Section 7.4.1,  Up: Section 7.4
+
+7.4.2. `GROUP': Defining Groups of Segments
+-------------------------------------------
+
+The `obj' 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 `GROUP' directive, whereby you can code
+
+     segment data
+
+             ; some data
+
+     segment bss
+
+             ; some uninitialized data
+
+     group dgroup data bss
+
+   which will define a group called `dgroup' to contain the segments
+`data' and `bss'. Like `SEGMENT', `GROUP' causes the group name to be
+defined as a symbol, so that you can refer to a variable `var' in the
+`data' segment as `var wrt data' or as `var wrt dgroup', depending on
+which segment value is currently in your segment register.
+
+   If you just refer to `var', however, and `var' is declared in a
+segment which is part of a group, then NASM will default to giving you
+the offset of `var' from the beginning of the _group_, not the
+_segment_. Therefore `SEG var', also, will return the group base rather
+than the segment base.
+
+   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.
+
+   A group does not have to contain any segments; you can still make
+`WRT' references to a group which does not contain the variable you are
+referring to. OS/2, for example, defines the special group `FLAT' with
+no segments in it.
+
+\1f
+File: nasm.info,  Node: Section 7.4.3,  Next: Section 7.4.4,  Prev: Section 7.4.2,  Up: Section 7.4
+
+7.4.3. `UPPERCASE': Disabling Case Sensitivity in Output
+--------------------------------------------------------
+
+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 `UPPERCASE' 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.
+
+   `UPPERCASE' is used alone on a line; it requires no parameters.
+
+\1f
+File: nasm.info,  Node: Section 7.4.4,  Next: Section 7.4.5,  Prev: Section 7.4.3,  Up: Section 7.4
+
+7.4.4. `IMPORT': Importing DLL Symbols
+--------------------------------------
+
+The `IMPORT' 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 `EXTERN' as well as using the
+`IMPORT' directive.
+
+   The `IMPORT' 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:
+
+         import  WSAStartup wsock32.dll
+
+   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:
+
+         import  asyncsel wsock32.dll WSAAsyncSelect
+
+\1f
+File: nasm.info,  Node: Section 7.4.5,  Next: Section 7.4.6,  Prev: Section 7.4.4,  Up: Section 7.4
+
+7.4.5. `EXPORT': Exporting DLL Symbols
+--------------------------------------
+
+The `EXPORT' 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 `GLOBAL' as well as using the
+`EXPORT' directive.
+
+   `EXPORT' 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 _external_ 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.
+
+   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:
+
+   * `resident' 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.
+
+   * `nodata' indicates that the exported symbol is a function which
+     does not make use of any initialized data.
+
+   * `parm=NNN', where `NNN' 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.
+
+   * An attribute which is just a number indicates that the symbol
+     should be exported with an identifying number (ordinal), and gives
+     the desired number.
+
+   For example:
+
+         export  myfunc
+         export  myfunc TheRealMoreFormalLookingFunctionName
+         export  myfunc myfunc 1234  ; export by ordinal
+         export  myfunc myfunc resident parm=23 nodata
+
+\1f
+File: nasm.info,  Node: Section 7.4.6,  Next: Section 7.4.7,  Prev: Section 7.4.5,  Up: Section 7.4
+
+7.4.6. `..start': Defining the Program Entry Point
+--------------------------------------------------
+
+`OMF' 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 `..start' at the point where you wish execution to begin.
+
+\1f
+File: nasm.info,  Node: Section 7.4.7,  Next: Section 7.4.8,  Prev: Section 7.4.6,  Up: Section 7.4
+
+7.4.7. `obj' Extensions to the `EXTERN' Directive
+-------------------------------------------------
+
+If you declare an external symbol with the directive
+
+         extern  foo
+
+   then references such as `mov ax,foo' will give you the offset of
+`foo' from its preferred segment base (as specified in whichever module
+`foo' is actually defined in). So to access the contents of `foo' you
+will usually need to do something like
+
+             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
+
+   This is a little unwieldy, particularly if you know that an external
+is going to be accessible from a given segment or group, say `dgroup'.
+So if `DS' already contained `dgroup', you could simply code
+
+             mov     ax,[foo wrt dgroup]
+
+   However, having to type this every time you want to access `foo' can
+be a pain; so NASM allows you to declare `foo' in the alternative form
+
+         extern  foo:wrt dgroup
+
+   This form causes NASM to pretend that the preferred segment base of
+`foo' is in fact `dgroup'; so the expression `seg foo' will now return
+`dgroup', and the expression `foo' is equivalent to `foo wrt dgroup'.
+
+   This default-`WRT' 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 *note Section 7.4.8::.
+
+\1f
+File: nasm.info,  Node: Section 7.4.8,  Next: Section 7.5,  Prev: Section 7.4.7,  Up: Section 7.4
+
+7.4.8. `obj' Extensions to the `COMMON' Directive
+-------------------------------------------------
+
+The `obj' 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
+
+     common  nearvar 2:near   ; `nearvar' is a near common
+     common  farvar  10:far   ; and `farvar' is far
+
+   Far common variables may be greater in size than 64Kb, and so the OMF
+specification says that they are declared as a number of _elements_ 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.
+
+   Some `OMF' 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:
+
+     common  c_5by2  10:far 5        ; two five-byte elements
+     common  c_2by5  10:far 2        ; five two-byte elements
+
+   If no element size is specified, the default is 1. Also, the `FAR'
+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
+
+     common  c_5by2  10:5            ; two five-byte elements
+     common  c_2by5  10:2            ; five two-byte elements
+
+   In addition to these extensions, the `COMMON' directive in `obj'
+also supports default-`WRT' specification like `EXTERN' does (explained
+in *note Section 7.4.7::). So you can also declare things like
+
+     common  foo     10:wrt dgroup
+     common  bar     16:far 2:wrt data
+     common  baz     24:wrt data:6
+
+\1f
+File: nasm.info,  Node: Section 7.5,  Next: Section 7.5.1,  Prev: Section 7.4.8,  Up: Chapter 7
+
+7.5. `win32': Microsoft Win32 Object Files
+==========================================
+
+The `win32' 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 `obj' instead
+(see *note Section 7.4::).
+
+   `win32' provides a default output file-name extension of `.obj'.
+
+   Note that although Microsoft say that Win32 object files follow the
+`COFF' (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 `coff' output format; conversely, the
+`coff' format does not produce object files that Win32 linkers can
+generate correct output from.
+
+* Menu:
+
+* Section 7.5.1:: `win32' Extensions to the `SECTION' Directive
+* Section 7.5.2:: `win32': Safe Structured Exception Handling
+
+\1f
+File: nasm.info,  Node: Section 7.5.1,  Next: Section 7.5.2,  Prev: Section 7.5,  Up: Section 7.5
+
+7.5.1. `win32' Extensions to the `SECTION' Directive
+----------------------------------------------------
+
+Like the `obj' format, `win32' allows you to specify additional
+information on the `SECTION' 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 `.text',
+`.data' and `.bss', but may still be overridden by these qualifiers.
+
+   The available qualifiers are:
+
+   * `code', or equivalently `text', 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.
+
+   * `data' and `bss' define the section to be a data section,
+     analogously to `code'. Data sections are marked as readable and
+     writable, but not executable. `data' declares an initialized data
+     section, whereas `bss' declares an uninitialized data section.
+
+   * `rdata' declares an initialized data section that is readable but
+     not writable. Microsoft compilers use this section to place
+     constants in it.
+
+   * `info' 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 _to_ the linker. For example, declaring
+     an `info'-type section called `.drectve' causes the linker to
+     interpret the contents of the section as command-line options.
+
+   * `align=', used with a trailing number as in `obj', 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.
+
+   The defaults assumed by NASM if you do not specify the above
+qualifiers are:
+
+     section .text    code  align=16
+     section .data    data  align=4
+     section .rdata   rdata align=8
+     section .bss     bss   align=4
+
+   Any other section name is treated by default like `.text'.
+
+\1f
+File: nasm.info,  Node: Section 7.5.2,  Next: Section 7.6,  Prev: Section 7.5.1,  Up: Section 7.5
+
+7.5.2. `win32': Safe Structured Exception Handling
+--------------------------------------------------
+
+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
+`/safeseh' command line option.
+
+   Without regard to this run-time check merits it's natural to expect
+NASM to be capable of generating modules suitable for `/safeseh'
+linking. From developer's viewpoint the problem is two-fold:
+
+   * how to adapt modules not deploying exception handlers of their own;
+
+   * how to adapt/develop modules utilizing custom exception handling;
+
+   Former can be easily achieved with any NASM version by adding
+following line to source code:
+
+     $@feat.00 equ 1
+
+   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.
+
+   Registering custom exception handler on the other hand requires
+certain "magic." As of version 2.03 additional directive is implemented,
+`safeseh', which instructs the assembler to produce appropriately
+formatted input data for above mentioned "safe exception handler table."
+Its typical use would be:
+
+     section .text
+     extern  _MessageBoxA@16
+     %if     __NASM_VERSION_ID__ >= 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 '
+
+   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
+`[fs:0]' 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 `safeseh' 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.
+
+   Finally, all mentions of linker in this paragraph refer to Microsoft
+linker version 7.x and later. Presence of `@feat.00' 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.
+
+\1f
+File: nasm.info,  Node: Section 7.6,  Next: Section 7.6.1,  Prev: Section 7.5.2,  Up: Chapter 7
+
+7.6. `win64': Microsoft Win64 Object Files
+==========================================
+
+The `win64' output format generates Microsoft Win64 object files, which
+is nearly 100% identical to the `win32' object format (*note Section
+7.5::) 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 `win32' object format (*note Section 7.5::), in NASM, with
+regard to this exception.
+
+* Menu:
+
+* Section 7.6.1:: `win64': Writing Position-Independent Code
+* Section 7.6.2:: `win64': Structured Exception Handling
+
+\1f
+File: nasm.info,  Node: Section 7.6.1,  Next: Section 7.6.2,  Prev: Section 7.6,  Up: Section 7.6
+
+7.6.1. `win64': Writing Position-Independent Code
+-------------------------------------------------
+
+While `REL' 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:
+
+             jmp     QWORD[dsptch+rax*8]
+             ...
+     dsptch: dq      case0
+             dq      case1
+             ...
+
+   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 "`'ADDR32' relocation to '.text' invalid without
+/LARGEADDRESSAWARE:NO'".  So [s]he will have to split jmp instruction
+as following:
+
+             lea     rbx,[rel dsptch]
+             jmp     QWORD[rbx+rax*8]
+
+   What happens behind the scene is that effective address in `lea' 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 `caseN' 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:
+
+             lea     rbx,[rel dsptch]
+             add     rbx,QWORD[rbx+rax*8]
+             jmp     rbx
+             ...
+     dsptch: dq      case0-dsptch
+             dq      case1-dsptch
+             ...
+
+   NASM version 2.03 and later provides another alternative, `wrt
+..imagebase' 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
+`IMAGE_DOS_HEADER' structure. Here is how to implement switch with
+these image-relative references:
+
+             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
+
+   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 `wrt ..imagebase' will
+become apparent in next paragraph.
+
+   It should be noted that `wrt ..imagebase' is defined as 32-bit
+operand only:
+
+             dd      label wrt ..imagebase           ; ok
+             dq      label wrt ..imagebase           ; bad
+             mov     eax,label wrt ..imagebase       ; ok
+             mov     rax,label wrt ..imagebase       ; bad
+
+\1f
+File: nasm.info,  Node: Section 7.6.2,  Next: Section 7.7,  Prev: Section 7.6.1,  Up: Section 7.6
+
+7.6.2. `win64': Structured Exception Handling
+---------------------------------------------
+
+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 `UNWIND_INFO' 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 _nor_ 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.
+
+   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
+`UNWIND_INFO' 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.
+
+   Now, when we understand significance of the `UNWIND_INFO' 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"),
+_or_ rest of `UNWIND_INFO' 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 `UNWIND_INFO' 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.
+
+   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:
+
+     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 '
+
+   What you see in `.pdata' section is element of the "table comprising
+start and end addresses of function" along with reference to associated
+`UNWIND_INFO' structure. And what you see in `.xdata' section is
+`UNWIND_INFO' structure describing function with no frame, but with
+designated exception handler. References are _required_ to be image-
+relative (which is the real reason for implementing `wrt ..imagebase'
+operator). It should be noted that `rdata align=n', as well as `wrt
+..imagebase', are optional in these two segments' contexts, i.e.  can
+be omitted. Latter means that _all_ 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 `UNWIND_INFO' 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.
+
+   As already mentioned, in Win64 terms leaf function is one that does
+not call any other function _nor_ 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 `UNWIND_INFO' 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:
+
+     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
+
+   The keyword is that up to `magic_point' original `rsp' value remains
+in chosen volatile register and no non-volatile register, except for
+`rsp', is modified. While past `magic_point' `rsp' remains constant
+till the very end of the `function'. In this case custom
+language-specific exception handler would look like this:
+
+     EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame,
+             CONTEXT *context,DISPATCHER_CONTEXT *disp)
+     {   ULONG64 *rsp;
+         if (context->Rip<(ULONG64)magic_point)
+             rsp = (ULONG64 *)context->Rax;
+         else
+         {   rsp = ((ULONG64 **)context->Rsp)[0];
+             context->Rbp = rsp[-3];
+             context->Rbx = rsp[-2];
+             context->R15 = rsp[-1];
+         }
+         context->Rsp = (ULONG64)rsp;
+
+         memcpy (disp->ContextRecord,context,sizeof(CONTEXT));
+         RtlVirtualUnwind(UNW_FLAG_NHANDLER,disp->ImageBase,
+             dips->ControlPc,disp->FunctionEntry,disp->ContextRecord,
+             &disp->HandlerData,&disp->EstablisherFrame,NULL);
+         return ExceptionContinueSearch;
+     }
+
+   As custom handler mimics leaf function, corresponding `UNWIND_INFO'
+structure does not have to contain any information about stack frame and
+its layout.
+
+\1f
+File: nasm.info,  Node: Section 7.7,  Next: Section 7.8,  Prev: Section 7.6.2,  Up: Chapter 7
+
+7.7. `coff': Common Object File Format
+======================================
+
+The `coff' output type produces `COFF' object files suitable for
+linking with the DJGPP linker.
+
+   `coff' provides a default output file-name extension of `.o'.
+
+   The `coff' format supports the same extensions to the `SECTION'
+directive as `win32' does, except that the `align' qualifier and the
+`info' section type are not supported.
+
+\1f
+File: nasm.info,  Node: Section 7.8,  Next: Section 7.9,  Prev: Section 7.7,  Up: Chapter 7
+
+7.8. `macho32' and `macho64': Mach Object File Format
+=====================================================
+
+The `macho32' and `macho64' output formts produces `Mach-O' object
+files suitable for linking with the MacOS X linker. `macho' is a
+synonym for `macho32'.
+
+   `macho' provides a default output file-name extension of `.o'.
+
+\1f
+File: nasm.info,  Node: Section 7.9,  Next: Section 7.9.1,  Prev: Section 7.8,  Up: Chapter 7
+
+7.9. `elf32' and `elf64': Executable and Linkable Format Object Files
+=====================================================================
+
+The `elf32' and `elf64' output formats generate `ELF32 and ELF64'
+(Executable and Linkable Format) object files, as used by Linux as well
+as Unix System V, including Solaris x86, UnixWare and SCO Unix. `elf'
+provides a default output file-name extension of `.o'. `elf' is a
+synonym for `elf32'.
+
+* Menu:
+
+* Section 7.9.1:: ELF specific directive `osabi'
+* Section 7.9.2:: `elf' Extensions to the `SECTION' Directive
+* Section 7.9.3:: Position-Independent Code: `elf' Special Symbols and `WRT'
+* Section 7.9.4:: Thread Local Storage: `elf' Special Symbols and `WRT'
+* Section 7.9.5:: `elf' Extensions to the `GLOBAL' Directive
+* Section 7.9.6:: `elf' Extensions to the `COMMON' Directive
+* Section 7.9.7:: 16-bit code and ELF
+* Section 7.9.8:: Debug formats and ELF
+
+\1f
+File: nasm.info,  Node: Section 7.9.1,  Next: Section 7.9.2,  Prev: Section 7.9,  Up: Section 7.9
+
+7.9.1. ELF specific directive `osabi'
+-------------------------------------
+
+The ELF header specifies the application binary interface for the target
+operating system (OSABI). This field can be set by using the `osabi'
+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.
+
+\1f
+File: nasm.info,  Node: Section 7.9.2,  Next: Section 7.9.3,  Prev: Section 7.9.1,  Up: Section 7.9
+
+7.9.2. `elf' Extensions to the `SECTION' Directive
+--------------------------------------------------
+
+Like the `obj' format, `elf' allows you to specify additional
+information on the `SECTION' 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.
+
+   The available qualifiers are:
+
+   * `alloc' defines the section to be one which is loaded into memory
+     when the program is run. `noalloc' defines it to be one which is
+     not, such as an informational or comment section.
+
+   * `exec' defines the section to be one which should have execute
+     permission when the program is run. `noexec' defines it as one
+     which should not.
+
+   * `write' defines the section to be one which should be writable when
+     the program is run. `nowrite' defines it as one which should not.
+
+   * `progbits' defines the section to be one with explicit contents
+     stored in the object file: an ordinary code or data section, for
+     example, `nobits' defines the section to be one with no explicit
+     contents given, such as a BSS section.
+
+   * `align=', used with a trailing number as in `obj', gives the
+     alignment requirements of the section.
+
+   * `tls' defines the section to be one which contains thread local
+     variables.
+
+   The defaults assumed by NASM if you do not specify the above
+qualifiers are:
+
+     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
+
+   (Any section name other than those in the above table is treated by
+default like `other' in the above table. Please note that section names
+are case sensitive.)
+
+\1f
+File: nasm.info,  Node: Section 7.9.3,  Next: Section 7.9.4,  Prev: Section 7.9.2,  Up: Section 7.9
+
+7.9.3. Position-Independent Code: `elf' Special Symbols and `WRT'
+-----------------------------------------------------------------
+
+The `ELF' 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.
+
+   Since `ELF' does not support segment-base references, the `WRT'
+operator is not used for its normal purpose; therefore NASM's `elf'
+output format makes use of `WRT' for a different purpose, namely the
+PIC-specific relocation types.
+
+   `elf' defines five special symbols which you can use as the
+right-hand side of the `WRT' operator to obtain PIC relocation types.
+They are `..gotpc', `..gotoff', `..got', `..plt' and `..sym'. Their
+functions are summarized here:
+
+   * Referring to the symbol marking the global offset table base using
+     `wrt ..gotpc' will end up giving the distance from the beginning of
+     the current section to the global offset table.
+     (`_GLOBAL_OFFSET_TABLE_' is the standard symbol name used to refer
+     to the GOT.) So you would then need to add `$$' to the result to
+     get the real address of the GOT.
+
+   * Referring to a location in one of your own sections using `wrt
+     ..gotoff' 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.
+
+   * Referring to an external or global symbol using `wrt ..got' causes
+     the linker to build an entry _in_ 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.
+
+   * Referring to a procedure name using `wrt ..plt' 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 `CALL' or `JMP'), since ELF
+     contains no relocation type to refer to PLT entries absolutely.
+
+   * Referring to a symbol name using `wrt ..sym' 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.
+
+   A fuller explanation of how to use these relocation types to write
+shared libraries entirely in NASM is given in *note Section 9.2::.
+
+\1f
+File: nasm.info,  Node: Section 7.9.4,  Next: Section 7.9.5,  Prev: Section 7.9.3,  Up: Section 7.9
+
+7.9.4. Thread Local Storage: `elf' Special Symbols and `WRT'
+------------------------------------------------------------
+
+   * In ELF32 mode, referring to an external or global symbol using
+     `wrt ..tlsie'  causes the linker to build an entry _in_ 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:
+
+            mov  eax,[tid wrt ..tlsie]
+            mov  [gs:eax],ebx
+
+   * In ELF64 mode, referring to an external or global symbol using
+     `wrt ..gottpoff'  causes the linker to build an entry _in_ 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:
+
+            mov   rax,[rel tid wrt ..gottpoff]
+            mov   rcx,[fs:rax]
+
+\1f
+File: nasm.info,  Node: Section 7.9.5,  Next: Section 7.9.6,  Prev: Section 7.9.4,  Up: Section 7.9
+
+7.9.5. `elf' Extensions to the `GLOBAL' Directive
+-------------------------------------------------
+
+`ELF' 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 `GLOBAL' directive,
+allowing you to specify these features.
+
+   You can specify whether a global variable is a function or a data
+object by suffixing the name with a colon and the word `function' or
+`data'. (`object' is a synonym for `data'.) For example:
+
+     global   hashlookup:function, hashtable:data
+
+   exports the global symbol `hashlookup' as a function and `hashtable'
+as a data object.
+
+   Optionally, you can control the ELF visibility of the symbol. Just
+add one of the visibility keywords: `default', `internal', `hidden', or
+`protected'. The default is `default' of course. For example, to make
+`hashlookup' hidden:
+
+     global   hashlookup:function hidden
+
+   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:
+
+     global  hashtable:data (hashtable.end - hashtable)
+
+     hashtable:
+             db this,that,theother  ; some data here
+     .end:
+
+   This makes NASM automatically calculate the length of the table and
+place that information into the `ELF' symbol table.
+
+   Declaring the type and size of global symbols is necessary when
+writing shared library code. For more information, see *note Section
+9.2.4::.
+
+\1f
+File: nasm.info,  Node: Section 7.9.6,  Next: Section 7.9.7,  Prev: Section 7.9.5,  Up: Section 7.9
+
+7.9.6. `elf' Extensions to the `COMMON' Directive
+-------------------------------------------------
+
+`ELF' 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:
+
+     common  dwordarray 128:4
+
+   This declares the total size of the array to be 128 bytes, and
+requires that it be aligned on a 4-byte boundary.
+
+\1f
+File: nasm.info,  Node: Section 7.9.7,  Next: Section 7.9.8,  Prev: Section 7.9.6,  Up: Section 7.9
+
+7.9.7. 16-bit code and ELF
+--------------------------
+
+The `ELF32' specification doesn't provide relocations for 8- and 16-
+bit values, but the GNU `ld' linker adds these as an extension. NASM
+can generate GNU-compatible relocations, to allow 16-bit code to be
+linked as ELF using GNU `ld'. If NASM is used with the
+`-w+gnu-elf-extensions' option, a warning is issued when one of these
+relocations is generated.
+
+\1f
+File: nasm.info,  Node: Section 7.9.8,  Next: Section 7.10,  Prev: Section 7.9.7,  Up: Section 7.9
+
+7.9.8. Debug formats and ELF
+----------------------------
+
+`ELF32' and `ELF64' provide debug information in `STABS' and `DWARF'
+formats. Line number information is generated for all executable
+sections, but please note that only the ".text" section is executable
+by default.
+
+\1f
+File: nasm.info,  Node: Section 7.10,  Next: Section 7.11,  Prev: Section 7.9.8,  Up: Chapter 7
+
+7.10. `aout': Linux `a.out' Object Files
+========================================
+
+The `aout' format generates `a.out' object files, in the form used by
+early Linux systems (current Linux systems use ELF, see *note Section
+7.9::.) These differ from other `a.out' object files in that the magic
+number in the first four bytes of the file is different; also, some
+implementations of `a.out', for example NetBSD's, support
+position-independent code, which Linux's implementation does not.
+
+   `a.out' provides a default output file-name extension of `.o'.
+
+   `a.out' is a very simple object format. It supports no special
+directives, no special symbols, no use of `SEG' or `WRT', and no
+extensions to any standard directives. It supports only the three
+standard section names `.text', `.data' and `.bss'.
+
+\1f
+File: nasm.info,  Node: Section 7.11,  Next: Section 7.12,  Prev: Section 7.10,  Up: Chapter 7
+
+7.11. `aoutb': NetBSD/FreeBSD/OpenBSD `a.out' Object Files
+==========================================================
+
+The `aoutb' format generates `a.out' object files, in the form used by
+the various free `BSD Unix' clones, `NetBSD', `FreeBSD' and `OpenBSD'.
+For simple object files, this object format is exactly the same as
+`aout' except for the magic number in the first four bytes of the file.
+However, the `aoutb' format supports position-independent code in the
+same way as the `elf' format, so you can use it to write `BSD' shared
+libraries.
+
+   `aoutb' provides a default output file-name extension of `.o'.
+
+   `aoutb' supports no special directives, no special symbols, and only
+the three standard section names `.text', `.data' and `.bss'. However,
+it also supports the same use of `WRT' as `elf' does, to provide
+position-independent code relocation types. See *note Section 7.9.3::
+for full documentation of this feature.
+
+   `aoutb' also supports the same extensions to the `GLOBAL' directive
+as `elf' does: see *note Section 7.9.5:: for documentation of this.
+
+\1f
+File: nasm.info,  Node: Section 7.12,  Next: Section 7.13,  Prev: Section 7.11,  Up: Chapter 7
+
+7.12. `as86': Minix/Linux `as86' Object Files
+=============================================
+
+The Minix/Linux 16-bit assembler `as86' has its own non-standard object
+file format. Although its companion linker `ld86' produces something
+close to ordinary `a.out' binaries as output, the object file format
+used to communicate between `as86' and `ld86' is not itself `a.out'.
+
+   NASM supports this format, just in case it is useful, as `as86'.
+`as86' provides a default output file-name extension of `.o'.
+
+   `as86' is a very simple object format (from the NASM user's point of
+view). It supports no special directives, no use of `SEG' or `WRT', and
+no extensions to any standard directives. It supports only the three
+standard section names `.text', `.data' and `.bss'. The only special
+symbol supported is `..start'.
+
+\1f
+File: nasm.info,  Node: Section 7.13,  Next: Section 7.13.1,  Prev: Section 7.12,  Up: Chapter 7
+
+7.13. `rdf': Relocatable Dynamic Object File Format
+===================================================
+
+The `rdf' output format produces `RDOFF' object files.  `RDOFF'
+(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.
+
+   `RDOFF' is not used by any well-known operating systems. Those
+writing their own systems, however, may well wish to use `RDOFF' as
+their object format, on the grounds that it is designed primarily for
+simplicity and contains very little file-header bureaucracy.
+
+   The Unix NASM archive, and the DOS archive which includes sources,
+both contain an `rdoff' subdirectory holding a set of RDOFF utilities:
+an RDF linker, an `RDF' static-library manager, an RDF file dump
+utility, and a program which will load and execute an RDF executable
+under Linux.
+
+   `rdf' supports only the standard section names `.text', `.data' and
+`.bss'.
+
+* Menu:
+
+* Section 7.13.1:: Requiring a Library: The `LIBRARY' Directive
+* Section 7.13.2:: Specifying a Module Name: The `MODULE' Directive
+* Section 7.13.3:: `rdf' Extensions to the `GLOBAL' Directive
+* Section 7.13.4:: `rdf' Extensions to the `EXTERN' Directive
+
+\1f
+File: nasm.info,  Node: Section 7.13.1,  Next: Section 7.13.2,  Prev: Section 7.13,  Up: Section 7.13
+
+7.13.1. Requiring a Library: The `LIBRARY' Directive
+----------------------------------------------------
+
+`RDOFF' 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 `LIBRARY' directive, which takes one argument which
+is the name of the module:
+
+         library  mylib.rdl
+
+\1f
+File: nasm.info,  Node: Section 7.13.2,  Next: Section 7.13.3,  Prev: Section 7.13.1,  Up: Section 7.13
+
+7.13.2. Specifying a Module Name: The `MODULE' Directive
+--------------------------------------------------------
+
+Special `RDOFF' 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.  `MODULE' directive takes one argument which is the name of
+current module:
+
+         module  mymodname
+
+   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 `$', like:
+
+         module  $kernel.core
+
+\1f
+File: nasm.info,  Node: Section 7.13.3,  Next: Section 7.13.4,  Prev: Section 7.13.2,  Up: Section 7.13
+
+7.13.3. `rdf' Extensions to the `GLOBAL' Directive
+--------------------------------------------------
+
+`RDOFF' 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 `ELF', you can also specify whether an exported symbol is a procedure
+(function) or data object.
+
+   Suffixing the name with a colon and the word `export' you make the
+symbol exported:
+
+         global  sys_open:export
+
+   To specify that exported symbol is a procedure (function), you add
+the word `proc' or `function' after declaration:
+
+         global  sys_open:export proc
+
+   Similarly, to specify exported data object, add the word `data' or
+`object' to the directive:
+
+         global  kernel_ticks:export data
+
+\1f
+File: nasm.info,  Node: Section 7.13.4,  Next: Section 7.14,  Prev: Section 7.13.3,  Up: Section 7.13
+
+7.13.4. `rdf' Extensions to the `EXTERN' Directive
+--------------------------------------------------
+
+By default the `EXTERN' directive in `RDOFF' 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, `RDOFF' offers an additional
+`import' modifier. As in `GLOBAL', you can also specify whether an
+imported symbol is a procedure (function) or data object. For example:
+
+         library $libc
+         extern  _open:import
+         extern  _printf:import proc
+         extern  _errno:import data
+
+   Here the directive `LIBRARY' is also included, which gives the
+dynamic linker a hint as to where to find requested symbols.
+
+\1f
+File: nasm.info,  Node: Section 7.14,  Next: Chapter 8,  Prev: Section 7.13.4,  Up: Chapter 7
+
+7.14. `dbg': Debugging Format
+=============================
+
+The `dbg' 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 `OF_DBG' in `output/outform.h' or on the
+compiler command line, and obtain the `dbg' output format.
+
+   The `dbg' 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.
+
+   For simple files, one can easily use the `dbg' format like this:
+
+     nasm -f dbg filename.asm
+
+   which will generate a diagnostic file called `filename.dbg'. 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 `dbg' format. Therefore it can be useful to run NASM
+twice, in order to do the preprocessing with the native object format
+selected:
+
+     nasm -e -f rdf -o rdfprog.i rdfprog.asm
+     nasm -a -f dbg rdfprog.i
+
+   This preprocesses `rdfprog.asm' into `rdfprog.i', keeping the `rdf'
+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 `dbg' format to generate the final diagnostic output.
+
+   This workaround will still typically not work for programs intended
+for `obj' format, because the `obj' `SEGMENT' and `GROUP' directives
+have side effects of defining the segment and group names as symbols;
+`dbg' will not do this, so the program will not assemble. You will have
+to work around that by defining the symbols yourself (using `EXTERN',
+for example) if you really need to get a `dbg' trace of an
+`obj'-specific source file.
+
+   `dbg' accepts any section name and any directives at all, and logs
+them all to its output file.
+
+\1f
+File: nasm.info,  Node: Chapter 8,  Next: Section 8.1,  Prev: Section 7.14,  Up: Top
+
+Chapter 8: Writing 16-bit Code (DOS, Windows 3/3.1)
+***************************************************
+
+This chapter attempts to cover some of the common issues encountered
+when writing 16-bit code to run under `MS-DOS' or `Windows 3.x'. It
+covers how to link programs to produce `.EXE' or `.COM' files, how to
+write `.SYS' device drivers, and how to interface assembly language
+code with 16-bit C compilers and with Borland Pascal.
+
+* Menu:
+
+* Section 8.1:: Producing `.EXE' Files
+* Section 8.2:: Producing `.COM' Files
+* Section 8.3:: Producing `.SYS' Files
+* Section 8.4:: Interfacing to 16-bit C Programs
+* Section 8.5:: Interfacing to Borland Pascal Programs
+
+\1f
+File: nasm.info,  Node: Section 8.1,  Next: Section 8.1.1,  Prev: Chapter 8,  Up: Chapter 8
+
+8.1. Producing `.EXE' Files
+===========================
+
+Any large program written under DOS needs to be built as a `.EXE' file:
+only `.EXE' files have the necessary internal structure required to
+span more than one 64K segment. Windows programs, also, have to be built
+as `.EXE' files, since Windows does not support the `.COM' format.
+
+   In general, you generate `.EXE' files by using the `obj' output
+format to produce one or more `.OBJ' files, and then linking them
+together using a linker. However, NASM also supports the direct
+generation of simple DOS `.EXE' files using the `bin' output format (by
+using `DB' and `DW' to construct the `.EXE' file header), and a macro
+package is supplied to do this. Thanks to Yann Guidon for contributing
+the code for this.
+
+   NASM may also support `.EXE' natively as another output format in
+future releases.
+
+* Menu:
+
+* Section 8.1.1:: Using the `obj' Format To Generate `.EXE' Files
+* Section 8.1.2:: Using the `bin' Format To Generate `.EXE' Files
+
+\1f
+File: nasm.info,  Node: Section 8.1.1,  Next: Section 8.1.2,  Prev: Section 8.1,  Up: Section 8.1
+
+8.1.1. Using the `obj' Format To Generate `.EXE' Files
+------------------------------------------------------
+
+This section describes the usual method of generating `.EXE' files by
+linking `.OBJ' files together.
+
+   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 `LZH' archive format from `x2ftp.oulu.fi'. An LZH archiver
+can be found at `ftp.simtel.net'. There is another `free' linker
+(though this one doesn't come with sources) called FREELINK, available
+from `www.pcorner.com'. A third, `djlink', written by DJ Delorie, is
+available at `www.delorie.com'. A fourth linker, `ALINK', written by
+Anthony A.J. Williams, is available at `alink.sourceforge.net'.
+
+   When linking several `.OBJ' files into a `.EXE' file, you should
+ensure that exactly one of them has a start point defined (using the
+`..start' special symbol defined by the `obj' format: see *note Section
+7.4.6::). 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 _which_
+value to use.
+
+   An example of a NASM source file which can be assembled to a `.OBJ'
+file and linked on its own to a `.EXE' 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 `test' subdirectory of the NASM archives, under the name
+`objexe.asm'.
+
+     segment code
+
+     ..start:
+             mov     ax,data
+             mov     ds,ax
+             mov     ax,stack
+             mov     ss,ax
+             mov     sp,stacktop
+
+   This initial piece of code sets up `DS' to point to the data segment,
+and initializes `SS' and `SP' to point to the top of the provided
+stack. Notice that interrupts are implicitly disabled for one
+instruction after a move into `SS', precisely for this situation, so
+that there's no chance of an interrupt occurring between the loads of
+`SS' and `SP' and not having a stack to execute on.
+
+   Note also that the special symbol `..start' is defined at the
+beginning of this code, which means that will be the entry point into
+the resulting executable file.
+
+             mov     dx,hello
+             mov     ah,9
+             int     0x21
+
+   The above is the main program: load `DS:DX' with a pointer to the
+greeting message (`hello' is implicitly relative to the segment `data',
+which was loaded into `DS' in the setup code, so the full pointer is
+valid), and call the DOS print-string function.
+
+             mov     ax,0x4c00
+             int     0x21
+
+   This terminates the program using another DOS system call.
+
+     segment data
+
+     hello:  db      'hello, world', 13, 10, '$'
+
+   The data segment contains the string we want to display.
+
+     segment stack stack
+             resb 64
+     stacktop:
+
+   The above code declares a stack segment containing 64 bytes of
+uninitialized stack space, and points `stacktop' at the top of it. The
+directive `segment stack stack' defines a segment _called_ `stack', and
+also of _type_ `STACK'. 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 `STACK'.
+
+   The above file, when assembled into a `.OBJ' file, will link on its
+own to a valid `.EXE' file, which when run will print `hello, world'
+and then exit.
+
+\1f
+File: nasm.info,  Node: Section 8.1.2,  Next: Section 8.2,  Prev: Section 8.1.1,  Up: Section 8.1
+
+8.1.2. Using the `bin' Format To Generate `.EXE' Files
+------------------------------------------------------
+
+The `.EXE' file format is simple enough that it's possible to build a
+`.EXE' 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 `DB' and `DW' commands by NASM itself, so that you can
+use the `bin' output format to directly generate `.EXE' files.
+
+   Included in the NASM archives, in the `misc' subdirectory, is a file
+`exebin.mac' of macros. It defines three macros: `EXE_begin',
+`EXE_stack' and `EXE_end'.
+
+   To produce a `.EXE' file using this method, you should start by using
+`%include' to load the `exebin.mac' macro package into your source
+file. You should then issue the `EXE_begin' macro call (which takes no
+arguments) to generate the file header data. Then write code as normal
+for the `bin' format - you can use all three standard sections `.text',
+`.data' and `.bss'. At the end of the file you should call the
+`EXE_end' macro (again, no arguments), which defines some symbols to
+mark section sizes, and these symbols are referred to in the header
+code generated by `EXE_begin'.
+
+   In this model, the code you end up writing starts at `0x100', just
+like a `.COM' file - in fact, if you strip off the 32-byte header from
+the resulting `.EXE' file, you will have a valid `.COM' program. All
+the segment bases are the same, so you are limited to a 64K program,
+again just like a `.COM' file. Note that an `ORG' directive is issued
+by the `EXE_begin' macro, so you should not explicitly issue one of
+your own.
+
+   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 `CS' instead.
+
+   On entry to your `.EXE' file, `SS:SP' 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 `EXE_stack' macro. For example, to change the stack size of
+your program to 64 bytes, you would call `EXE_stack 64'.
+
+   A sample program which generates a `.EXE' file in this way is given
+in the `test' subdirectory of the NASM archive, as `binexe.asm'.
+
+\1f
+File: nasm.info,  Node: Section 8.2,  Next: Section 8.2.1,  Prev: Section 8.1.2,  Up: Chapter 8
+
+8.2. Producing `.COM' Files
+===========================
+
+While large DOS programs must be written as `.EXE' files, small ones
+are often better written as `.COM' files. `.COM' files are pure binary,
+and therefore most easily produced using the `bin' output format.
+
+* Menu:
+
+* Section 8.2.1:: Using the `bin' Format To Generate `.COM' Files
+* Section 8.2.2:: Using the `obj' Format To Generate `.COM' Files
+
+\1f
+File: nasm.info,  Node: Section 8.2.1,  Next: Section 8.2.2,  Prev: Section 8.2,  Up: Section 8.2
+
+8.2.1. Using the `bin' Format To Generate `.COM' Files
+------------------------------------------------------
+
+`.COM' files expect to be loaded at offset `100h' into their segment
+(though the segment may change). Execution then begins at `100h', i.e.
+right at the start of the program. So to write a `.COM' program, you
+would create a source file looking like
+
+             org 100h
+
+     section .text
+
+     start:
+             ; put your code here
+
+     section .data
+
+             ; put data items here
+
+     section .bss
+
+             ; put uninitialized data here
+
+   The `bin' format puts the `.text' 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.
+
+   The BSS (uninitialized data) section does not take up space in the
+`.COM' 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.
+
+   To assemble the above program, you should use a command line like
+
+     nasm myprog.asm -fbin -o myprog.com
+
+   The `bin' format would produce a file called `myprog' if no explicit
+output file name were specified, so you have to override it and give
+the desired file name.
+
+\1f
+File: nasm.info,  Node: Section 8.2.2,  Next: Section 8.3,  Prev: Section 8.2.1,  Up: Section 8.2
+
+8.2.2. Using the `obj' Format To Generate `.COM' Files
+------------------------------------------------------
+
+If you are writing a `.COM' program as more than one module, you may
+wish to assemble several `.OBJ' files and link them together into a
+`.COM' program. You can do this, provided you have a linker capable of
+outputting `.COM' files directly (TLINK does this), or alternatively a
+converter program such as `EXE2BIN' to transform the `.EXE' file output
+from the linker into a `.COM' file.
+
+   If you do this, you need to take care of several things:
+
+   * The first object file containing code should start its code
+     segment with a line like `RESB 100h'. This is to ensure that the
+     code begins at offset `100h' 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
+     `.COM' file. Other assemblers use an `ORG' directive for this
+     purpose, but `ORG' in NASM is a format-specific directive to the
+     `bin' output format, and does not mean the same thing as it does
+     in MASM-compatible assemblers.
+
+   * You don't need to define a stack segment.
+
+   * 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 `.COM'
+     file is loaded, all the segment registers contain the same value.
+
+\1f
+File: nasm.info,  Node: Section 8.3,  Next: Section 8.4,  Prev: Section 8.2.2,  Up: Chapter 8
+
+8.3. Producing `.SYS' Files
+===========================
+
+MS-DOS device drivers - `.SYS' files - are pure binary files, similar
+to `.COM' files, except that they start at origin zero rather than
+`100h'. Therefore, if you are writing a device driver using the `bin'
+format, you do not need the `ORG' directive, since the default origin
+for `bin' is zero. Similarly, if you are using `obj', you do not need
+the `RESB 100h' at the start of your code segment.
+
+   `.SYS' 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.
+
+   For more information on the format of `.SYS' 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
+`comp.os.msdos.programmer'.
+
+\1f
+File: nasm.info,  Node: Section 8.4,  Next: Section 8.4.1,  Prev: Section 8.3,  Up: Chapter 8
+
+8.4. Interfacing to 16-bit C Programs
+=====================================
+
+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 `.OBJ' file, and link it with your C modules to
+produce a mixed-language program.
+
+* Menu:
+
+* Section 8.4.1:: External Symbol Names
+* Section 8.4.2:: Memory Models
+* Section 8.4.3:: Function Definitions and Function Calls
+* Section 8.4.4:: Accessing Data Items
+* Section 8.4.5:: `c16.mac': Helper Macros for the 16-bit C Interface
+
+\1f
+File: nasm.info,  Node: Section 8.4.1,  Next: Section 8.4.2,  Prev: Section 8.4,  Up: Section 8.4
+
+8.4.1. External Symbol Names
+----------------------------
+
+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 `printf' appears to an assembly language
+programmer as `_printf'. 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.
+
+   If you find the underscores inconvenient, you can define macros to
+replace the `GLOBAL' and `EXTERN' directives as follows:
+
+     %macro  cglobal 1
+
+       global  _%1
+       %define %1 _%1
+
+     %endmacro
+
+     %macro  cextern 1
+
+       extern  _%1
+       %define %1 _%1
+
+     %endmacro
+
+   (These forms of the macros only take one argument at a time; a `%rep'
+construct could solve this.)
+
+   If you then declare an external like this:
+
+     cextern printf
+
+   then the macro will expand it as
+
+     extern  _printf
+     %define printf _printf
+
+   Thereafter, you can reference `printf' as if it was a symbol, and the
+preprocessor will put the leading underscore on where necessary.
+
+   The `cglobal' macro works similarly. You must use `cglobal' before
+defining the symbol in question, but you would have had to do that
+anyway if you used `GLOBAL'.
+
+   Also see *note Section 2.1.27::.
+
+\1f
+File: nasm.info,  Node: Section 8.4.2,  Next: Section 8.4.3,  Prev: Section 8.4.1,  Up: Section 8.4
+
+8.4.2. Memory Models
+--------------------
+
+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:
+
+   * 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 `CS' register
+     never changes its value, and always gives the segment part of the
+     full function address), and that functions are called using
+     ordinary near `CALL' instructions and return using `RETN' (which,
+     in NASM, is synonymous with `RET' anyway). This means both that
+     you should write your own routines to return with `RETN', and that
+     you should call external C routines with near `CALL' instructions.
+
+   * 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 `CALL FAR' (or `CALL
+     seg:offset') and return using `RETF'. Again, you should therefore
+     write your own routines to return with `RETF' and use `CALL FAR'
+     to call external routines.
+
+   * In models using a single data segment (tiny, small and medium),
+     data pointers are 16 bits long, containing only an offset field
+     (the `DS' register doesn't change its value, and always gives the
+     segment part of the full data item address).
+
+   * 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 `DS' in your routines without restoring it
+     afterwards, but `ES' is free for you to use to access the contents
+     of 32-bit data pointers you are passed.
+
+   * 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.
+
+   * In most memory models, there is a _default_ data segment, whose
+     segment address is kept in `DS' throughout the program. This data
+     segment is typically the same segment as the stack, kept in `SS',
+     so that functions' local variables (which are stored on the stack)
+     and global data items can both be accessed easily without changing
+     `DS'.  Particularly large data items are typically stored in other
+     segments.  However, some memory models (though not the standard
+     ones, usually) allow the assumption that `SS' and `DS' hold the
+     same value to be removed. Be careful about functions' local
+     variables in this latter case.
+
+   In models with a single code segment, the segment is called `_TEXT',
+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 `_DATA'.
+
+\1f
+File: nasm.info,  Node: Section 8.4.3,  Next: Section 8.4.4,  Prev: Section 8.4.2,  Up: Section 8.4
+
+8.4.3. Function Definitions and Function Calls
+----------------------------------------------
+
+The C calling convention in 16-bit programs is as follows. In the
+following description, the words _caller_ and _callee_ are used to
+denote the function doing the calling and the function which gets
+called.
+
+   * 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).
+
+   * The caller then executes a `CALL' instruction to pass control to
+     the callee. This `CALL' is either near or far depending on the
+     memory model.
+
+   * 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 `SP' in `BP' so as to be
+     able to use `BP' 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 `BP' must be preserved by
+     any C function. Hence the callee, if it is going to set up `BP' as
+     a _frame pointer_, must push the previous value first.
+
+   * The callee may then access its parameters relative to `BP'. The
+     word at `[BP]' holds the previous value of `BP' as it was pushed;
+     the next word, at `[BP+2]', holds the offset part of the return
+     address, pushed implicitly by `CALL'. In a small-model (near)
+     function, the parameters start after that, at `[BP+4]'; in a
+     large-model (far) function, the segment part of the return address
+     lives at `[BP+4]', and the parameters begin at `[BP+6]'. The
+     leftmost parameter of the function, since it was pushed last, is
+     accessible at this offset from `BP'; the others follow, at
+     successively greater offsets. Thus, in a function such as `printf'
+     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.
+
+   * The callee may also wish to decrease `SP' further, so as to
+     allocate space on the stack for local variables, which will then
+     be accessible at negative offsets from `BP'.
+
+   * The callee, if it wishes to return a value to the caller, should
+     leave the value in `AL', `AX' or `DX:AX' depending on the size of
+     the value. Floating-point results are sometimes (depending on the
+     compiler) returned in `ST0'.
+
+   * Once the callee has finished processing, it restores `SP' from
+     `BP' if it had allocated local stack space, then pops the previous
+     value of `BP', and returns via `RETN' or `RETF' depending on
+     memory model.
+
+   * When the caller regains control from the callee, the function
+     parameters are still on the stack, so it typically adds an
+     immediate constant to `SP' to remove them (instead of executing a
+     number of slow `POP' 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 _knows_ how many parameters it
+     pushed, does the removing.
+
+   It is instructive to compare this calling convention with that for
+Pascal programs (described in *note Section 8.5.1::). 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 `RET' or `RETF' 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.
+
+   Thus, you would define a function in C style in the following way.
+The following example is for small model:
+
+     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
+
+   For a large-model function, you would replace `RET' by `RETF', and
+look for the first parameter at `[BP+6]' instead of `[BP+4]'.  Of
+course, if one of the parameters is a pointer, then the offsets of
+_subsequent_ 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.
+
+   At the other end of the process, to call a C function from your
+assembly code, you would do something like this:
+
+     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 -> %d <- should be 1234',10,0
+
+   This piece of code is the small-model assembly equivalent of the C
+code
+
+         int myint = 1234;
+         printf("This number -> %d <- should be 1234\n", myint);
+
+   In large model, the function-call code might look more like this. In
+this example, it is assumed that `DS' already holds the segment base of
+the segment `_DATA'. If not, you would have to initialize it first.
+
+           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
+
+   The integer value still takes up one word on the stack, since large
+model does not affect the size of the `int' data type. The first
+argument (pushed last) to `printf', 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, `PUSH DS' would have been a shorter instruction than `PUSH WORD
+SEG mystring', if `DS' 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 `SP' has to be increased by 6 rather than 4 afterwards
+to make up for the extra word of parameters.
+
+\1f
+File: nasm.info,  Node: Section 8.4.4,  Next: Section 8.4.5,  Prev: Section 8.4.3,  Up: Section 8.4
+
+8.4.4. Accessing Data Items
+---------------------------
+
+To get at the contents of C variables, or to declare variables which C
+can access, you need only declare the names as `GLOBAL' or `EXTERN'.
+(Again, the names require leading underscores, as stated in *note
+Section 8.4.1::.) Thus, a C variable declared as `int i' can be
+accessed from assembler as
+
+     extern _i
+
+             mov ax,[_i]
+
+   And to declare your own integer variable which C programs can access
+as `extern int j', you do this (making sure you are assembling in the
+`_DATA' segment, if necessary):
+
+     global  _j
+
+     _j      dw      0
+
+   To access a C array, you need to know the size of the components of
+the array. For example, `int' variables are two bytes long, so if a C
+program declares an array as `int a[10]', you can access `a[3]' by
+coding `mov ax,[_a+6]'. (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 `char', 2 for
+`short' and `int', 4 for `long' and `float', and 8 for `double'.
+
+   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 `STRUC'), or by calculating the one offset
+and using just that.
+
+   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 `STRUC' macro, so you have to
+specify alignment yourself if the C compiler generates it. Typically,
+you might find that a structure like
+
+     struct {
+         char c;
+         int i;
+     } foo;
+
+   might be four bytes long rather than three, since the `int' 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 `#pragma' lines, so you have to find out how
+your own compiler does it.
+
+\1f
+File: nasm.info,  Node: Section 8.4.5,  Next: Section 8.5,  Prev: Section 8.4.4,  Up: Section 8.4
+
+8.4.5. `c16.mac': Helper Macros for the 16-bit C Interface
+----------------------------------------------------------
+
+Included in the NASM archives, in the `misc' directory, is a file
+`c16.mac' of macros. It defines three macros: `proc', `arg' and
+`endproc'. 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.
+
+   (An alternative, TASM compatible form of `arg' is also now built into
+NASM's preprocessor. See *note Section 4.8:: for details.)
+
+   An example of an assembly function using the macro set is given here:
+
+     proc    _nearproc
+
+     %$i     arg
+     %$j     arg
+             mov     ax,[bp + %$i]
+             mov     bx,[bp + %$j]
+             add     ax,[bx]
+
+     endproc
+
+   This defines `_nearproc' to be a procedure taking two arguments, the
+first (`i') an integer and the second (`j') a pointer to an integer. It
+returns `i + *j'.
+
+   Note that the `arg' macro has an `EQU' 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 `EQU' works, defining `%$i'
+to be an offset from `BP'. A context-local variable is used, local to
+the context pushed by the `proc' macro and popped by the `endproc'
+macro, so that the same argument name can be used in later procedures.
+Of course, you don't _have_ to do that.
+
+   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 `%define
+FARCODE'. This changes the kind of return instruction generated by
+`endproc', 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.
+
+   `arg' 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 `int'.
+
+   The large-model equivalent of the above function would look like
+this:
+
+     %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
+
+   This makes use of the argument to the `arg' macro to define a
+parameter of size 4, because `j' is now a far pointer. When we load
+from `j', we must load a segment and an offset.
+
+\1f
+File: nasm.info,  Node: Section 8.5,  Next: Section 8.5.1,  Prev: Section 8.4.5,  Up: Chapter 8
+
+8.5. Interfacing to Borland Pascal Programs
+===========================================
+
+Interfacing to Borland Pascal programs is similar in concept to
+interfacing to 16-bit C programs. The differences are:
+
+   * The leading underscore required for interfacing to C programs is
+     not required for Pascal.
+
+   * 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 `DS'
+     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 _pointers_, however, are far.
+
+   * The function calling convention is different - described below.
+
+   * Some data types, such as strings, are stored differently.
+
+   * 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.
+
+* Menu:
+
+* Section 8.5.1:: The Pascal Calling Convention
+* Section 8.5.2:: Borland Pascal Segment Name Restrictions
+* Section 8.5.3:: Using `c16.mac' With Pascal Programs
+
+\1f
+File: nasm.info,  Node: Section 8.5.1,  Next: Section 8.5.2,  Prev: Section 8.5,  Up: Section 8.5
+
+8.5.1. The Pascal Calling Convention
+------------------------------------
+
+The 16-bit Pascal calling convention is as follows. In the following
+description, the words _caller_ and _callee_ are used to denote the
+function doing the calling and the function which gets called.
+
+   * 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).
+
+   * The caller then executes a far `CALL' instruction to pass control
+     to the callee.
+
+   * 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 `SP' in `BP' so as to be
+     able to use `BP' 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 `BP' must be preserved by
+     any function. Hence the callee, if it is going to set up `BP' as a
+     frame pointer, must push the previous value first.
+
+   * The callee may then access its parameters relative to `BP'. The
+     word at `[BP]' holds the previous value of `BP' as it was pushed.
+     The next word, at `[BP+2]', holds the offset part of the return
+     address, and the next one at `[BP+4]' the segment part. The
+     parameters begin at `[BP+6]'. The rightmost parameter of the
+     function, since it was pushed last, is accessible at this offset
+     from `BP'; the others follow, at successively greater offsets.
+
+   * The callee may also wish to decrease `SP' further, so as to
+     allocate space on the stack for local variables, which will then
+     be accessible at negative offsets from `BP'.
+
+   * The callee, if it wishes to return a value to the caller, should
+     leave the value in `AL', `AX' or `DX:AX' depending on the size of
+     the value. Floating-point results are returned in `ST0'. Results
+     of type `Real' (Borland's own custom floating-point data type, not
+     handled directly by the FPU) are returned in `DX:BX:AX'. To return
+     a result of type `String', 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
+     `RETF' instruction.
+
+   * Once the callee has finished processing, it restores `SP' from
+     `BP' if it had allocated local stack space, then pops the previous
+     value of `BP', and returns via `RETF'. It uses the form of `RETF'
+     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.
+
+   * 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.
+
+   Thus, you would define a function in Pascal style, taking two
+`Integer'-type parameters, in the following way:
+
+     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
+
+   At the other end of the process, to call a Pascal function from your
+assembly code, you would do something like this:
+
+     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
+
+   This is equivalent to the Pascal code
+
+     procedure SomeFunc(String: PChar; Int: Integer);
+         SomeFunc(@mystring, myint);
+
+\1f
+File: nasm.info,  Node: Section 8.5.2,  Next: Section 8.5.3,  Prev: Section 8.5.1,  Up: Section 8.5
+
+8.5.2. Borland Pascal Segment Name Restrictions
+-----------------------------------------------
+
+Since Borland Pascal's internal unit file format is completely different
+from `OBJ', it only makes a very sketchy job of actually reading and
+understanding the various information contained in a real `OBJ' file
+when it links that in. Therefore an object file intended to be linked
+to a Pascal program must obey a number of restrictions:
+
+   * Procedures and functions must be in a segment whose name is either
+     `CODE', `CSEG', or something ending in `_TEXT'.
+
+   * initialized data must be in a segment whose name is either `CONST'
+     or something ending in `_DATA'.
+
+   * Uninitialized data must be in a segment whose name is either
+     `DATA', `DSEG', or something ending in `_BSS'.
+
+   * Any other segments in the object file are completely ignored.
+     `GROUP' directives and segment attributes are also ignored.
+
+\1f
+File: nasm.info,  Node: Section 8.5.3,  Next: Chapter 9,  Prev: Section 8.5.2,  Up: Section 8.5
+
+8.5.3. Using `c16.mac' With Pascal Programs
+-------------------------------------------
+
+The `c16.mac' macro package, described in *note Section 8.4.5::, can
+also be used to simplify writing functions to be called from Pascal
+programs, if you code `%define PASCAL'. This definition ensures that
+functions are far (it implies `FARCODE'), and also causes procedure
+return instructions to be generated with an operand.
+
+   Defining `PASCAL' does not change the code which calculates the
+argument offsets; you must declare your function's arguments in reverse
+order. For example:
+
+     %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
+
+   This defines the same routine, conceptually, as the example in *note
+Section 8.4.5::: 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 `PASCAL' is defined instead of
+`FARCODE', and that the arguments are declared in reverse order.
+
+\1f
+File: nasm.info,  Node: Chapter 9,  Next: Section 9.1,  Prev: Section 8.5.3,  Up: Top
+
+Chapter 9: Writing 32-bit Code (Unix, Win32, DJGPP)
+***************************************************
+
+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.
+
+   Almost all 32-bit code, and in particular all code running under
+`Win32', `DJGPP' or any of the PC Unix variants, runs in _flat_ 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 `CALL' and `JMP'
+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.
+
+* Menu:
+
+* Section 9.1:: Interfacing to 32-bit C Programs
+* Section 9.2:: Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries
+
+\1f
+File: nasm.info,  Node: Section 9.1,  Next: Section 9.1.1,  Prev: Chapter 9,  Up: Chapter 9
+
+9.1. Interfacing to 32-bit C Programs
+=====================================
+
+A lot of the discussion in *note Section 8.4::, 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.
+
+* Menu:
+
+* Section 9.1.1:: External Symbol Names
+* Section 9.1.2:: Function Definitions and Function Calls
+* Section 9.1.3:: Accessing Data Items
+* Section 9.1.4:: `c32.mac': Helper Macros for the 32-bit C Interface
+
+\1f
+File: nasm.info,  Node: Section 9.1.1,  Next: Section 9.1.2,  Prev: Section 9.1,  Up: Section 9.1
+
+9.1.1. External Symbol Names
+----------------------------
+
+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 `ELF' specification states
+that C symbols do _not_ have a leading underscore on their
+assembly-language names.
+
+   The older Linux `a.out' C compiler, all `Win32' compilers, `DJGPP',
+and `NetBSD' and `FreeBSD', all use the leading underscore; for these
+compilers, the macros `cextern' and `cglobal', as given in *note
+Section 8.4.1::, will still work. For `ELF', though, the leading
+underscore should not be used.
+
+   See also *note Section 2.1.27::.
+
+\1f
+File: nasm.info,  Node: Section 9.1.2,  Next: Section 9.1.3,  Prev: Section 9.1.1,  Up: Section 9.1
+
+9.1.2. Function Definitions and Function Calls
+----------------------------------------------
+
+The C calling convention in 32-bit programs is as follows. In the
+following description, the words _caller_ and _callee_ are used to
+denote the function doing the calling and the function which gets
+called.
+
+   * 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).
+
+   * The caller then executes a near `CALL' instruction to pass control
+     to the callee.
+
+   * 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 `ESP' in `EBP' so as to
+     be able to use `EBP' 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 `EBP' must be preserved
+     by any C function.  Hence the callee, if it is going to set up
+     `EBP' as a frame pointer, must push the previous value first.
+
+   * The callee may then access its parameters relative to `EBP'. The
+     doubleword at `[EBP]' holds the previous value of `EBP' as it was
+     pushed; the next doubleword, at `[EBP+4]', holds the return
+     address, pushed implicitly by `CALL'. The parameters start after
+     that, at `[EBP+8]'. The leftmost parameter of the function, since
+     it was pushed last, is accessible at this offset from `EBP'; the
+     others follow, at successively greater offsets. Thus, in a
+     function such as `printf' 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.
+
+   * The callee may also wish to decrease `ESP' further, so as to
+     allocate space on the stack for local variables, which will then
+     be accessible at negative offsets from `EBP'.
+
+   * The callee, if it wishes to return a value to the caller, should
+     leave the value in `AL', `AX' or `EAX' depending on the size of the
+     value. Floating-point results are typically returned in `ST0'.
+
+   * Once the callee has finished processing, it restores `ESP' from
+     `EBP' if it had allocated local stack space, then pops the previous
+     value of `EBP', and returns via `RET' (equivalently, `RETN').
+
+   * When the caller regains control from the callee, the function
+     parameters are still on the stack, so it typically adds an
+     immediate constant to `ESP' to remove them (instead of executing a
+     number of slow `POP' 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 _knows_ how many parameters it
+     pushed, does the removing.
+
+   There is an alternative calling convention used by Win32 programs for
+Windows API calls, and also for functions called _by_ the Windows API
+such as window procedures: they follow what Microsoft calls the
+`__stdcall' convention. This is slightly closer to the Pascal
+convention, in that the callee clears the stack by passing a parameter
+to the `RET' instruction. However, the parameters are still pushed in
+right-to-left order.
+
+   Thus, you would define a function in C style in the following way:
+
+     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
+
+   At the other end of the process, to call a C function from your
+assembly code, you would do something like this:
+
+     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 -> %d <- should be 1234',10,0
+
+   This piece of code is the assembly equivalent of the C code
+
+         int myint = 1234;
+         printf("This number -> %d <- should be 1234\n", myint);
+
diff --git a/doc/info/nasm.info-2 b/doc/info/nasm.info-2
new file mode 100644 (file)
index 0000000..dd66a29
--- /dev/null
@@ -0,0 +1,6521 @@
+This is nasm.info, produced by makeinfo version 4.13 from nasmdoc.texi.
+
+INFO-DIR-SECTION Programming
+START-INFO-DIR-ENTRY
+* NASM: (nasm).                The Netwide Assembler for x86.
+END-INFO-DIR-ENTRY
+
+   This file documents NASM, the Netwide Assembler: an assembler
+targetting the Intel x86 series of processors, with portable source.
+
+   Copyright 1996-2009 The NASM Development Team
+
+   This document is redistributable under the license given in the file
+"COPYING" distributed in the NASM archive.
+
+\1f
+File: nasm.info,  Node: Section 9.1.3,  Next: Section 9.1.4,  Prev: Section 9.1.2,  Up: Section 9.1
+
+9.1.3. Accessing Data Items
+---------------------------
+
+To get at the contents of C variables, or to declare variables which C
+can access, you need only declare the names as `GLOBAL' or `EXTERN'.
+(Again, the names require leading underscores, as stated in *note
+Section 9.1.1::.) Thus, a C variable declared as `int i' can be
+accessed from assembler as
+
+               extern _i
+               mov eax,[_i]
+
+   And to declare your own integer variable which C programs can access
+as `extern int j', you do this (making sure you are assembling in the
+`_DATA' segment, if necessary):
+
+               global _j
+     _j        dd 0
+
+   To access a C array, you need to know the size of the components of
+the array. For example, `int' variables are four bytes long, so if a C
+program declares an array as `int a[10]', you can access `a[3]' by
+coding `mov ax,[_a+12]'. (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 `char', 2 for
+`short', 4 for `int', `long' and `float', and 8 for `double'. Pointers,
+being 32-bit addresses, are also 4 bytes long.
+
+   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 `STRUC'), or by calculating the one offset
+and using just that.
+
+   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 `STRUC' macro, so you have to
+specify alignment yourself if the C compiler generates it. Typically,
+you might find that a structure like
+
+     struct {
+         char c;
+         int i;
+     } foo;
+
+   might be eight bytes long rather than five, since the `int' 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 `#pragma' lines, so you have to find out how
+your own compiler does it.
+
+\1f
+File: nasm.info,  Node: Section 9.1.4,  Next: Section 9.2,  Prev: Section 9.1.3,  Up: Section 9.1
+
+9.1.4. `c32.mac': Helper Macros for the 32-bit C Interface
+----------------------------------------------------------
+
+Included in the NASM archives, in the `misc' directory, is a file
+`c32.mac' of macros. It defines three macros: `proc', `arg' and
+`endproc'. 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.
+
+   An example of an assembly function using the macro set is given here:
+
+     proc    _proc32
+
+     %$i     arg
+     %$j     arg
+             mov     eax,[ebp + %$i]
+             mov     ebx,[ebp + %$j]
+             add     eax,[ebx]
+
+     endproc
+
+   This defines `_proc32' to be a procedure taking two arguments, the
+first (`i') an integer and the second (`j') a pointer to an integer. It
+returns `i + *j'.
+
+   Note that the `arg' macro has an `EQU' 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 `EQU' works, defining `%$i'
+to be an offset from `BP'. A context-local variable is used, local to
+the context pushed by the `proc' macro and popped by the `endproc'
+macro, so that the same argument name can be used in later procedures.
+Of course, you don't _have_ to do that.
+
+   `arg' 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 `int' or pointers.
+
+\1f
+File: nasm.info,  Node: Section 9.2,  Next: Section 9.2.1,  Prev: Section 9.1.4,  Up: Chapter 9
+
+9.2. Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries
+==================================================================
+
+`ELF' replaced the older `a.out' object file format under Linux because
+it contains support for position-independent code (PIC), which makes
+writing shared libraries much easier. NASM supports the `ELF'
+position-independent code features, so you can write Linux `ELF' shared
+libraries in NASM.
+
+   NetBSD, and its close cousins FreeBSD and OpenBSD, take a different
+approach by hacking PIC support into the `a.out' format. NASM supports
+this as the `aoutb' output format, so you can write BSD shared
+libraries in NASM too.
+
+   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.
+
+   Therefore, you cannot get at your variables by writing code like
+this:
+
+             mov     eax,[myvar]             ; WRONG
+
+   Instead, the linker provides an area of memory called the _global
+offset table_, 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 `CALL' and `POP' 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.
+
+   The _data_ 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 *note Section 9.2.4:: for a caveat).
+
+* Menu:
+
+* Section 9.2.1:: Obtaining the Address of the GOT
+* Section 9.2.2:: Finding Your Local Data Items
+* Section 9.2.3:: Finding External and Common Data Items
+* Section 9.2.4:: Exporting Symbols to the Library User
+* Section 9.2.5:: Calling Procedures Outside the Library
+* Section 9.2.6:: Generating the Library File
+
+\1f
+File: nasm.info,  Node: Section 9.2.1,  Next: Section 9.2.2,  Prev: Section 9.2,  Up: Section 9.2
+
+9.2.1. Obtaining the Address of the GOT
+---------------------------------------
+
+Each code module in your shared library should define the GOT as an
+external symbol:
+
+     extern  _GLOBAL_OFFSET_TABLE_   ; in ELF
+     extern  __GLOBAL_OFFSET_TABLE_  ; in BSD a.out
+
+   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:
+
+     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
+
+   (For BSD, again, the symbol `_GLOBAL_OFFSET_TABLE' requires a second
+leading underscore.)
+
+   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 `EBX' register, because PIC shared libraries use this
+register to store the address of the GOT.
+
+   The interesting bit is the `CALL' instruction and the following two
+lines. The `CALL' and `POP' combination obtains the address of the
+label `.get_GOT', without having to know in advance where the program
+was loaded (since the `CALL' instruction is encoded relative to the
+current position). The `ADD' instruction makes use of one of the
+special PIC relocation types: GOTPC relocation. With the `WRT ..gotpc'
+qualifier specified, the symbol referenced (here
+`_GLOBAL_OFFSET_TABLE_', the special symbol assigned to the GOT) is
+given as an offset from the beginning of the section. (Actually, `ELF'
+encodes it as the offset from the operand field of the `ADD'
+instruction, but NASM simplifies this deliberately, so you do things the
+same way for both `ELF' and `BSD'.) So the instruction then _adds_ the
+beginning of the section, to get the real address of the GOT, and
+subtracts the value of `.get_GOT' which it knows is in `EBX'.
+Therefore, by the time that instruction has finished, `EBX' contains
+the address of the GOT.
+
+   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:
+
+     %macro  get_GOT 0
+
+             call    %%getgot
+       %%getgot:
+             pop     ebx
+             add     ebx,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc
+
+     %endmacro
+
+\1f
+File: nasm.info,  Node: Section 9.2.2,  Next: Section 9.2.3,  Prev: Section 9.2.1,  Up: Section 9.2
+
+9.2.2. Finding Your Local Data Items
+------------------------------------
+
+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 `..gotoff' special `WRT' type.
+The way this works is like this:
+
+             lea     eax,[ebx+myvar wrt ..gotoff]
+
+   The expression `myvar wrt ..gotoff' is calculated, when the shared
+library is linked, to be the offset to the local variable `myvar' from
+the beginning of the GOT. Therefore, adding it to `EBX' as above will
+place the real address of `myvar' in `EAX'.
+
+   If you declare variables as `GLOBAL' 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 `..gotoff'
+mechanism.
+
+   Note that due to a peculiarity of the way BSD `a.out' 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.
+
+\1f
+File: nasm.info,  Node: Section 9.2.3,  Next: Section 9.2.4,  Prev: Section 9.2.2,  Up: Section 9.2
+
+9.2.3. Finding External and Common Data Items
+---------------------------------------------
+
+If your library needs to get at an external variable (external to the
+_library_, not just to one of the modules within it), you must use the
+`..got' type to get at it. The `..got' 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 _entry_ 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 `extvar' in `EAX', you would
+code
+
+             mov     eax,[ebx+extvar wrt ..got]
+
+   This loads the address of `extvar' out of an entry in the GOT. The
+linker, when it builds the shared library, collects together every
+relocation of type `..got', and builds the GOT so as to ensure it has
+every necessary entry present.
+
+   Common variables must also be accessed in this way.
+
+\1f
+File: nasm.info,  Node: Section 9.2.4,  Next: Section 9.2.5,  Prev: Section 9.2.3,  Up: Section 9.2
+
+9.2.4. Exporting Symbols to the Library User
+--------------------------------------------
+
+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.
+
+   So to export a function to users of the library, you must use
+
+     global  func:function           ; declare it as a function
+
+     func:   push    ebp
+
+             ; etc.
+
+   And to export a data item such as an array, you would have to code
+
+     global  array:data array.end-array      ; give the size too
+
+     array:  resd    128
+     .end:
+
+   Be careful: If you export a variable to the library user, by
+declaring it as `GLOBAL' 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 `..got' mechanism rather than
+`..gotoff', as if it were external (which, effectively, it has become).
+
+   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:
+
+     dataptr:        dd      global_data_item        ; WRONG
+
+   NASM will interpret this code as an ordinary relocation, in which
+`global_data_item' is merely an offset from the beginning of the
+`.data' section (or whatever); so this reference will end up pointing
+at your data section instead of at the exported global which resides
+elsewhere.
+
+   Instead of the above code, then, you must write
+
+     dataptr:        dd      global_data_item wrt ..sym
+
+   which makes use of the special `WRT' type `..sym' to instruct NASM
+to search the symbol table for a particular symbol at that address,
+rather than just relocating by section base.
+
+   Either method will work for functions: referring to one of your
+functions by means of
+
+     funcptr:        dd      my_function
+
+   will give the user the address of the code you wrote, whereas
+
+     funcptr:        dd      my_function wrt .sym
+
+   will give the address of the procedure linkage table for the
+function, which is where the calling program will _believe_ the
+function lives.  Either address is a valid way to call the function.
+
+\1f
+File: nasm.info,  Node: Section 9.2.5,  Next: Section 9.2.6,  Prev: Section 9.2.4,  Up: Section 9.2
+
+9.2.5. Calling Procedures Outside the Library
+---------------------------------------------
+
+Calling procedures outside your shared library has to be done by means
+of a _procedure linkage table_, 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.
+
+   To call an external routine, you must use another special PIC
+relocation type, `WRT ..plt'. This is much easier than the GOT-based
+ones: you simply replace calls such as `CALL printf' with the
+PLT-relative version `CALL printf WRT ..plt'.
+
+\1f
+File: nasm.info,  Node: Section 9.2.6,  Next: Chapter 10,  Prev: Section 9.2.5,  Up: Section 9.2
+
+9.2.6. Generating the Library File
+----------------------------------
+
+Having written some code modules and assembled them to `.o' files, you
+then generate your shared library with a command such as
+
+     ld -shared -o library.so module1.o module2.o       # for ELF
+     ld -Bshareable -o library.so module1.o module2.o   # for BSD
+
+   For ELF, if your shared library is going to reside in system
+directories such as `/usr/lib' or `/lib', it is usually worth using the
+`-soname' flag to the linker, to store the final library file name,
+with a version number, into the library:
+
+     ld -shared -soname library.so.1 -o library.so.1.2 *.o
+
+   You would then copy `library.so.1.2' into the library directory, and
+create `library.so.1' as a symbolic link to it.
+
+\1f
+File: nasm.info,  Node: Chapter 10,  Next: Section 10.1,  Prev: Section 9.2.6,  Up: Top
+
+Chapter 10: Mixing 16 and 32 Bit Code
+*************************************
+
+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.
+
+* Menu:
+
+* Section 10.1:: Mixed-Size Jumps
+* Section 10.2:: Addressing Between Different-Size Segments
+* Section 10.3:: Other Mixed-Size Instructions
+
+\1f
+File: nasm.info,  Node: Section 10.1,  Next: Section 10.2,  Prev: Chapter 10,  Up: Chapter 10
+
+10.1. Mixed-Size Jumps
+======================
+
+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 _only_ 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.
+
+   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,
+
+             jmp     0x1234:0x56789ABC       ; wrong!
+
+   will not work, since the offset part of the address will be
+truncated to `0x9ABC' and the jump will be an ordinary 16-bit far one.
+
+   The Linux kernel setup code gets round the inability of `as86' to
+generate the required instruction by coding it manually, using `DB'
+instructions. NASM can go one better than that, by actually generating
+the right instruction itself. Here's how to do it right:
+
+             jmp     dword 0x1234:0x56789ABC         ; right
+
+   The `DWORD' prefix (strictly speaking, it should come _after_ the
+colon, since it is declaring the _offset_ 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.
+
+   You can do the reverse operation, jumping from a 32-bit segment to a
+16-bit one, by means of the `WORD' prefix:
+
+             jmp     word 0x8765:0x4321      ; 32 to 16 bit
+
+   If the `WORD' prefix is specified in 16-bit mode, or the `DWORD'
+prefix in 32-bit mode, they will be ignored, since each is explicitly
+forcing NASM into a mode it was in anyway.
+
+\1f
+File: nasm.info,  Node: Section 10.2,  Next: Section 10.3,  Prev: Section 10.1,  Up: Chapter 10
+
+10.2. Addressing Between Different-Size Segments
+================================================
+
+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.
+
+   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.
+
+   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
+
+             mov     eax,offset_into_32_bit_segment_specified_by_fs
+             mov     dword [fs:eax],0x11223344
+
+   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?
+
+   It can. As in *note Section 10.1::, you need only prefix the address
+with the `DWORD' keyword, and it will be forced to be a 32-bit address:
+
+             mov     dword [fs:dword my_offset],0x11223344
+
+   Also as in *note Section 10.1::, NASM is not fussy about whether the
+`DWORD' prefix comes before or after the segment override, so arguably
+a nicer-looking way to code the above instruction is
+
+             mov     dword [dword fs:my_offset],0x11223344
+
+   Don't confuse the `DWORD' prefix _outside_ the square brackets,
+which controls the size of the data stored at the address, with the one
+`inside' the square brackets which controls the length of the address
+itself. The two can quite easily be different:
+
+             mov     word [dword 0x12345678],0x9ABC
+
+   This moves 16 bits of data to an address specified by a 32-bit
+offset.
+
+   You can also specify `WORD' or `DWORD' prefixes along with the `FAR'
+prefix to indirect far jumps or calls. For example:
+
+             call    dword far [fs:word 0x4321]
+
+   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.
+
+\1f
+File: nasm.info,  Node: Section 10.3,  Next: Chapter 11,  Prev: Section 10.2,  Up: Chapter 10
+
+10.3. Other Mixed-Size Instructions
+===================================
+
+The other way you might want to access data might be using the string
+instructions (`LODSx', `STOSx' and so on) or the `XLATB' 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.
+
+   This is the purpose of NASM's `a16', `a32' and `a64' prefixes. If
+you are coding `LODSB' 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 `ESI' and then code
+
+             a32     lodsb
+
+   The prefix forces the addressing size to 32 bits, meaning that
+`LODSB' loads from `[DS:ESI]' instead of `[DS:SI]'. To access a string
+in a 16-bit segment when coding in a 32-bit one, the corresponding `a16'
+prefix can be used.
+
+   The `a16', `a32' and `a64' 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: `CMPSx', `SCASx', `LODSx',
+`STOSx', `MOVSx', `INSx', `OUTSx', and `XLATB'. Also, the various push
+and pop instructions (`PUSHA' and `POPF' as well as the more usual
+`PUSH' and `POP') can accept `a16', `a32' or `a64' prefixes to force a
+particular one of `SP', `ESP' or `RSP' to be used as a stack pointer,
+in case the stack segment in use is a different size from the code
+segment.
+
+   `PUSH' and `POP', 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 `o16':
+
+             o16 push    ss
+             o16 push    ds
+
+   This code saves a doubleword of stack space by fitting two segment
+registers into the space which would normally be consumed by pushing
+one.
+
+   (You can also use the `o32' prefix to force the 32-bit behaviour when
+in 16-bit mode, but this seems less useful.)
+
+\1f
+File: nasm.info,  Node: Chapter 11,  Next: Section 11.1,  Prev: Section 10.3,  Up: Top
+
+Chapter 11: Writing 64-bit Code (Unix, Win64)
+*********************************************
+
+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.
+
+   All 64-bit code uses a flat memory model, since segmentation is not
+available in 64-bit mode. The one exception is the `FS' and `GS'
+registers, which still add their bases.
+
+   Position independence in 64-bit mode is significantly simpler, since
+the processor supports `RIP'-relative addressing directly; see the
+`REL' keyword (*note Section 3.3::). On most 64-bit platforms, it is
+probably desirable to make that the default, using the directive
+`DEFAULT REL' (*note Section 6.2::).
+
+   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.
+
+   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 `<inttypes.h>'.
+
+   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.
+
+* Menu:
+
+* Section 11.1:: Register Names in 64-bit Mode
+* Section 11.2:: Immediates and Displacements in 64-bit Mode
+* Section 11.3:: Interfacing to 64-bit C Programs (Unix)
+* Section 11.4:: Interfacing to 64-bit C Programs (Win64)
+
+\1f
+File: nasm.info,  Node: Section 11.1,  Next: Section 11.2,  Prev: Chapter 11,  Up: Chapter 11
+
+11.1. Register Names in 64-bit Mode
+===================================
+
+NASM uses the following names for general-purpose registers in 64-bit
+mode, for 8-, 16-, 32- and 64-bit references, respecitively:
+
+          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
+
+   This is consistent with the AMD documentation and most other
+assemblers.  The Intel documentation, however, uses the names
+`R8L-R15L' 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 `altreg' (see *note Section 5.1::)
+can be used for this purpose.
+
+\1f
+File: nasm.info,  Node: Section 11.2,  Next: Section 11.3,  Prev: Section 11.1,  Up: Chapter 11
+
+11.2. Immediates and Displacements in 64-bit Mode
+=================================================
+
+In 64-bit mode, immediates and displacements are generally only 32 bits
+wide. NASM will therefore truncate most displacements and immediates to
+32 bits.
+
+   The only instruction which takes a full 64-bit immediate is:
+
+          MOV reg64,imm64
+
+   NASM will produce this instruction whenever the programmer uses `MOV'
+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 `DWORD':
+
+          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
+
+   The length of these instructions are 10, 5 and 7 bytes, respectively.
+
+   The only instructions which take a full 64-bit _displacement_ is
+loading or storing, using `MOV', `AL', `AX', `EAX' or `RAX' (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 `QWORD':
+
+          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
+
+   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.
+
+\1f
+File: nasm.info,  Node: Section 11.3,  Next: Section 11.4,  Prev: Section 11.2,  Up: Chapter 11
+
+11.3. Interfacing to 64-bit C Programs (Unix)
+=============================================
+
+On Unix, the 64-bit ABI is defined by the document:
+
+   `http://www.x86-64.org/documentation/abi.pdf'
+
+   Although written for AT&T-syntax assembly, the concepts apply
+equally well for NASM-style assembly. What follows is a simplified
+summary.
+
+   The first six integer arguments (from the left) are passed in `RDI',
+`RSI', `RDX', `RCX', `R8', and `R9', in that order. Additional integer
+arguments are passed on the stack. These registers, plus `RAX', `R10'
+and `R11' are destroyed by function calls, and thus are available for
+use by the function without saving.
+
+   Integer return values are passed in `RAX' and `RDX', in that order.
+
+   Floating point is done using SSE registers, except for `long double'.
+Floating-point arguments are passed in `XMM0' to `XMM7'; return is
+`XMM0' and `XMM1'. `long double' are passed on the stack, and returned
+in `ST0' and `ST1'.
+
+   All SSE and x87 registers are destroyed by function calls.
+
+   On 64-bit Unix, `long' is 64 bits.
+
+   Integer and SSE register arguments are counted separately, so for
+the case of
+
+          void foo(long a, double b, int c)
+
+   `a' is passed in `RDI', `b' in `XMM0', and `c' in `ESI'.
+
+\1f
+File: nasm.info,  Node: Section 11.4,  Next: Chapter 12,  Prev: Section 11.3,  Up: Chapter 11
+
+11.4. Interfacing to 64-bit C Programs (Win64)
+==============================================
+
+The Win64 ABI is described at:
+
+   `http://msdn2.microsoft.com/en-gb/library/ms794533.aspx'
+
+   What follows is a simplified summary.
+
+   The first four integer arguments are passed in `RCX', `RDX', `R8'
+and `R9', in that order. Additional integer arguments are passed on the
+stack. These registers, plus `RAX', `R10' and `R11' are destroyed by
+function calls, and thus are available for use by the function without
+saving.
+
+   Integer return values are passed in `RAX' only.
+
+   Floating point is done using SSE registers, except for `long double'.
+Floating-point arguments are passed in `XMM0' to `XMM3'; return is
+`XMM0' only.
+
+   On Win64, `long' is 32 bits; `long long' or `_int64' is 64 bits.
+
+   Integer and SSE register arguments are counted together, so for the
+case of
+
+          void foo(long long a, double b, int c)
+
+   `a' is passed in `RCX', `b' in `XMM1', and `c' in `R8D'.
+
+\1f
+File: nasm.info,  Node: Chapter 12,  Next: Section 12.1,  Prev: Section 11.4,  Up: Top
+
+Chapter 12: Troubleshooting
+***************************
+
+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.
+
+* Menu:
+
+* Section 12.1:: Common Problems
+* Section 12.2:: Bugs
+
+\1f
+File: nasm.info,  Node: Section 12.1,  Next: Section 12.1.1,  Prev: Chapter 12,  Up: Chapter 12
+
+12.1. Common Problems
+=====================
+
+* Menu:
+
+* Section 12.1.1:: NASM Generates Inefficient Code
+* Section 12.1.2:: My Jumps are Out of Range
+* Section 12.1.3:: `ORG' Doesn't Work
+* Section 12.1.4:: `TIMES' Doesn't Work
+
+\1f
+File: nasm.info,  Node: Section 12.1.1,  Next: Section 12.1.2,  Prev: Section 12.1,  Up: Section 12.1
+
+12.1.1. NASM Generates Inefficient Code
+---------------------------------------
+
+We sometimes get `bug' reports about NASM generating inefficient, or
+even `wrong', code on instructions such as `ADD ESP,8'. This is a
+deliberate design feature, connected to predictability of output: NASM,
+on seeing `ADD ESP,8', will generate the form of the instruction which
+leaves room for a 32-bit offset. You need to code `ADD ESP,BYTE 8' 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 `-O' option (see *note
+Section 2.1.22::).
+
+\1f
+File: nasm.info,  Node: Section 12.1.2,  Next: Section 12.1.3,  Prev: Section 12.1.1,  Up: Section 12.1
+
+12.1.2. My Jumps are Out of Range
+---------------------------------
+
+Similarly, people complain that when they issue conditional jumps (which
+are `SHORT' by default) that try to jump too far, NASM reports `short
+jump out of range' instead of making the jumps longer.
+
+   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 `Jcc NEAR' 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 `JNE' instruction with a very
+short `JE' instruction that jumps over a `JMP NEAR'; this is a sensible
+solution for processors below a 386, but hardly efficient on processors
+which have good branch prediction _and_ could have used `JNE NEAR'
+instead. So, once again, it's up to the user, not the assembler, to
+decide what instructions should be generated. See *note Section
+2.1.22::.
+
+\1f
+File: nasm.info,  Node: Section 12.1.3,  Next: Section 12.1.4,  Prev: Section 12.1.2,  Up: Section 12.1
+
+12.1.3. `ORG' Doesn't Work
+--------------------------
+
+People writing boot sector programs in the `bin' format often complain
+that `ORG' doesn't work the way they'd like: in order to place the
+`0xAA55' signature word at the end of a 512-byte boot sector, people
+who are used to MASM tend to code
+
+             ORG 0
+
+             ; some boot sector code
+
+             ORG 510
+             DW 0xAA55
+
+   This is not the intended use of the `ORG' directive in NASM, and will
+not work. The correct way to solve this problem in NASM is to use the
+`TIMES' directive, like this:
+
+             ORG 0
+
+             ; some boot sector code
+
+             TIMES 510-($-$$) DB 0
+             DW 0xAA55
+
+   The `TIMES' 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.
+
+\1f
+File: nasm.info,  Node: Section 12.1.4,  Next: Section 12.2,  Prev: Section 12.1.3,  Up: Section 12.1
+
+12.1.4. `TIMES' Doesn't Work
+----------------------------
+
+The other common problem with the above code is people who write the
+`TIMES' line as
+
+             TIMES 510-$ DB 0
+
+   by reasoning that `$' should be a pure number, just like 510, so the
+difference between them is also a pure number and can happily be fed to
+`TIMES'.
+
+   NASM is a _modular_ assembler: the various component parts are
+designed to be easily separable for re-use, so they don't exchange
+information unnecessarily. In consequence, the `bin' output format,
+even though it has been told by the `ORG' directive that the `.text'
+section should start at 0, does not pass that information back to the
+expression evaluator. So from the evaluator's point of view, `$' isn't
+a pure number: it's an offset from a section base. Therefore the
+difference between `$' and 510 is also not a pure number, but involves
+a section base. Values involving section bases cannot be passed as
+arguments to `TIMES'.
+
+   The solution, as in the previous section, is to code the `TIMES' line
+in the form
+
+             TIMES 510-($-$$) DB 0
+
+   in which `$' and `$$' are offsets from the same section base, and so
+their difference is a pure number. This will solve the problem and
+generate sensible code.
+
+\1f
+File: nasm.info,  Node: Section 12.2,  Next: Appendix A,  Prev: Section 12.1.4,  Up: Chapter 12
+
+12.2. Bugs
+==========
+
+We have never yet released a version of NASM with any _known_ 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
+`bugtracker' at `https://sourceforge.net/projects/nasm/' (click on
+"Bugs"), or if that fails then through one of the contacts in *note
+Section 1.2::.
+
+   Please read *note Section 2.2:: 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 *note
+Section 12.1::, and don't bother reporting the bug if it's listed there.
+
+   If you do report a bug, _please_ give us all of the following
+information:
+
+   * What operating system you're running NASM under. DOS, Linux,
+     NetBSD, Win16, Win32, VMS (I'd be impressed), whatever.
+
+   * 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.
+
+   * Which version of NASM you're using, and exactly how you invoked
+     it. Give us the precise command line, and the contents of the
+     `NASMENV' environment variable if any.
+
+   * 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.)
+
+   * 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 _only_ 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 _not_ to be
+     mailed large chunks of code anyway. The smaller the file, the
+     better.  A three-line sample file that does nothing useful
+     _except_ demonstrate the problem is much easier to work with than
+     a fully fledged ten-thousand- line program. (Of course, some
+     errors _do_ only crop up in large files, so this may not be
+     possible.)
+
+   * A description of what the problem actually _is_. `It doesn't work'
+     is _not_ 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 _should_ 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'.
+
+   * 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.
+
+   * 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 _both_ object files, so we can see what TASM is doing
+     differently from us.
+
+\1f
+File: nasm.info,  Node: Appendix A,  Next: Section A.1,  Prev: Section 12.2,  Up: Top
+
+Appendix A: Ndisasm
+*******************
+
+The Netwide Disassembler, NDISASM
+
+* Menu:
+
+* Section A.1:: Introduction
+* Section A.2:: Getting Started: Installation
+* Section A.3:: Running NDISASM
+* Section A.4:: Bugs and Improvements
+
+\1f
+File: nasm.info,  Node: Section A.1,  Next: Section A.2,  Prev: Appendix A,  Up: Appendix A
+
+A.1. Introduction
+=================
+
+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.
+
+   The Netwide Disassembler does nothing except to produce
+disassemblies of _binary_ source files. NDISASM does not have any
+understanding of object file formats, like `objdump', and it will not
+understand `DOS .EXE' files like `debug' will. It just disassembles.
+
+\1f
+File: nasm.info,  Node: Section A.2,  Next: Section A.3,  Prev: Section A.1,  Up: Appendix A
+
+A.2. Getting Started: Installation
+==================================
+
+See *note Section 1.3:: for installation instructions. NDISASM, like
+NASM, has a `man page' which you may want to put somewhere useful, if
+you are on a Unix system.
+
+\1f
+File: nasm.info,  Node: Section A.3,  Next: Section A.3.1,  Prev: Section A.2,  Up: Appendix A
+
+A.3. Running NDISASM
+====================
+
+To disassemble a file, you will typically use a command of the form
+
+            ndisasm -b {16|32|64} filename
+
+   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 `-b' switch is present, NDISASM works in 16-bit mode by
+default. The `-u' switch (for USE32) also invokes 32-bit mode.
+
+   Two more command line options are `-r' which reports the version
+number of NDISASM you are running, and `-h' which gives a short summary
+of command line options.
+
+* Menu:
+
+* Section A.3.1:: COM Files: Specifying an Origin
+* Section A.3.2:: Code Following Data: Synchronisation
+* Section A.3.3:: Mixed Code and Data: Automatic (Intelligent) Synchronisation
+* Section A.3.4:: Other Options
+
+\1f
+File: nasm.info,  Node: Section A.3.1,  Next: Section A.3.2,  Prev: Section A.3,  Up: Section A.3
+
+A.3.1. COM Files: Specifying an Origin
+--------------------------------------
+
+To disassemble a `DOS .COM' file correctly, a disassembler must assume
+that the first instruction in the file is loaded at address `0x100',
+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.
+
+   The `-o' 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 ``$'' or ``0x''
+or ends in ``H'' it's `hex', if it ends in ``Q'' it's `octal', and if
+it ends in ``B'' it's `binary'.
+
+   Hence, to disassemble a `.COM' file:
+
+            ndisasm -o100h filename.com
+
+   will do the trick.
+
+\1f
+File: nasm.info,  Node: Section A.3.2,  Next: Section A.3.3,  Prev: Section A.3.1,  Up: Section A.3
+
+A.3.2. Code Following Data: Synchronisation
+-------------------------------------------
+
+Suppose you are disassembling a file which contains some data which
+isn't machine code, and _then_ 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. ``FS OR AX,0x240A''), and
+generating `DB' instructions ever so often if it's totally stumped.
+Then it will reach the code section.
+
+   Supposing NDISASM has just finished generating a strange machine
+instruction from part of the data section, and its file position is now
+one byte _before_ 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.
+
+   To avoid this, you can specify a ``synchronisation'' 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 ``db'' instead. So it _will_ start disassembly
+exactly from the sync point, and so you _will_ see all the instructions
+in your code section.
+
+   Sync points are specified using the `-s' 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 `.COM' file, you would have to do
+
+            ndisasm -o100h -s120h file.com
+
+   rather than
+
+            ndisasm -o100h -s20h file.com
+
+   As stated above, you can specify multiple sync markers if you need
+to, just by repeating the `-s' option.
+
+\1f
+File: nasm.info,  Node: Section A.3.3,  Next: Section A.3.4,  Prev: Section A.3.2,  Up: Section A.3
+
+A.3.3. Mixed Code and Data: Automatic (Intelligent) Synchronisation
+-------------------------------------------------------------------
+
+Suppose you are disassembling the boot sector of a `DOS' 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 `JMP' instruction, then some data, then the rest of the code.
+So there is a very good chance of NDISASM being _misaligned_ when the
+data ends and the code begins. Hence a sync point is needed.
+
+   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 `JMP' instruction, and then to use its
+target address as a sync point. So can NDISASM do that for you?
+
+   The answer, of course, is yes: using either of the synonymous
+switches `-a' (for automatic sync) or `-i' (for intelligent sync) will
+enable `auto-sync' 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...)
+
+   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).
+
+   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 _not_ guaranteed to catch all the sync points, and you may
+still have to place some manually.
+
+   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 `-i' _and_ some `-s'
+options.
+
+   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 `-k' option (documented below) to suppress
+disassembly of the data area.
+
+\1f
+File: nasm.info,  Node: Section A.3.4,  Next: Section A.4,  Prev: Section A.3.3,  Up: Section A.3
+
+A.3.4. Other Options
+--------------------
+
+The `-e' option skips a header on the file, by ignoring the first N
+bytes. This means that the header is _not_ counted towards the
+disassembly offset: if you give `-e10 -o10', disassembly will start at
+byte 10 in the file, and this will be given offset 10, not 20.
+
+   The `-k' 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 _will_ 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.
+
+\1f
+File: nasm.info,  Node: Section A.4,  Next: Appendix B,  Prev: Section A.3.4,  Up: Appendix A
+
+A.4. Bugs and Improvements
+==========================
+
+There are no known bugs. However, any you find, with patches if
+possible, should be sent to `nasm-bugs@lists.sourceforge.net', or to the
+developer's site at `https://sourceforge.net/projects/nasm/' and we'll
+try to fix them. Feel free to send contributions and new features as
+well.
+
+\1f
+File: nasm.info,  Node: Appendix B,  Next: Section B.1,  Prev: Section A.4,  Up: Top
+
+Appendix B: Instruction List
+****************************
+
+* Menu:
+
+* Section B.1:: Introduction
+
+\1f
+File: nasm.info,  Node: Section B.1,  Next: Section B.1.1,  Prev: Appendix B,  Up: Appendix B
+
+B.1. Introduction
+=================
+
+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.
+
+* Menu:
+
+* Section B.1.1:: Special instructions...
+* Section B.1.2:: Conventional instructions
+* Section B.1.3:: Katmai Streaming SIMD instructions (SSE ---- a.k.a. KNI, XMM, MMX2)
+* Section B.1.4:: Introduced in Deschutes but necessary for SSE support
+* Section B.1.5:: XSAVE group (AVX and extended state)
+* Section B.1.6:: Generic memory operations
+* Section B.1.7:: New MMX instructions introduced in Katmai
+* Section B.1.8:: AMD Enhanced 3DNow! (Athlon) instructions
+* Section B.1.9:: Willamette SSE2 Cacheability Instructions
+* Section B.1.10:: Willamette MMX instructions (SSE2 SIMD Integer Instructions)
+* Section B.1.11:: Willamette Streaming SIMD instructions (SSE2)
+* Section B.1.12:: Prescott New Instructions (SSE3)
+* Section B.1.13:: VMX Instructions
+* Section B.1.14:: Extended Page Tables VMX instructions
+* Section B.1.15:: Tejas New Instructions (SSSE3)
+* Section B.1.16:: AMD SSE4A
+* Section B.1.17:: New instructions in Barcelona
+* Section B.1.18:: Penryn New Instructions (SSE4.1)
+* Section B.1.19:: Nehalem New Instructions (SSE4.2)
+* Section B.1.20:: Intel SMX
+* Section B.1.21:: Geode (Cyrix) 3DNow! additions
+* Section B.1.22:: Intel new instructions in ???
+* Section B.1.23:: Intel AES instructions
+* Section B.1.24:: Intel AVX AES instructions
+* Section B.1.25:: Intel AVX instructions
+* Section B.1.26:: Intel Carry-Less Multiplication instructions (CLMUL)
+* Section B.1.27:: Intel AVX Carry-Less Multiplication instructions (CLMUL)
+* Section B.1.28:: Intel Fused Multiply-Add instructions (FMA)
+* Section B.1.29:: VIA (Centaur) security instructions
+* Section B.1.30:: AMD Lightweight Profiling (LWP) instructions
+* Section B.1.31:: AMD XOP, FMA4 and CVT16 instructions (SSE5)
+* Section B.1.32:: Systematic names for the hinting nop instructions
+
+\1f
+File: nasm.info,  Node: Section B.1.1,  Next: Section B.1.2,  Prev: Section B.1,  Up: Section B.1
+
+B.1.1. Special instructions...
+------------------------------
+
+     DB
+     DW
+     DD
+     DQ
+     DT
+     DO
+     DY
+     RESB             imm                      8086
+     RESW
+     RESD
+     RESQ
+     REST
+     RESO
+     RESY
+
+\1f
+File: nasm.info,  Node: Section B.1.2,  Next: Section B.1.3,  Prev: Section B.1.1,  Up: Section B.1
+
+B.1.2. Conventional instructions
+--------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.3,  Next: Section B.1.4,  Prev: Section B.1.2,  Up: Section B.1
+
+B.1.3. Katmai Streaming SIMD instructions (SSE --- a.k.a. KNI, XMM, MMX2)
+-------------------------------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.4,  Next: Section B.1.5,  Prev: Section B.1.3,  Up: Section B.1
+
+B.1.4. Introduced in Deschutes but necessary for SSE support
+------------------------------------------------------------
+
+     FXRSTOR          mem                      P6,SSE,FPU
+     FXSAVE           mem                      P6,SSE,FPU
+
+\1f
+File: nasm.info,  Node: Section B.1.5,  Next: Section B.1.6,  Prev: Section B.1.4,  Up: Section B.1
+
+B.1.5. XSAVE group (AVX and extended state)
+-------------------------------------------
+
+     XGETBV                                    NEHALEM
+     XSETBV                                    NEHALEM,PRIV
+     XSAVE            mem                      NEHALEM
+     XRSTOR           mem                      NEHALEM
+
+\1f
+File: nasm.info,  Node: Section B.1.6,  Next: Section B.1.7,  Prev: Section B.1.5,  Up: Section B.1
+
+B.1.6. Generic memory operations
+--------------------------------
+
+     PREFETCHNTA      mem                      KATMAI
+     PREFETCHT0       mem                      KATMAI
+     PREFETCHT1       mem                      KATMAI
+     PREFETCHT2       mem                      KATMAI
+     SFENCE                                    KATMAI
+
+\1f
+File: nasm.info,  Node: Section B.1.7,  Next: Section B.1.8,  Prev: Section B.1.6,  Up: Section B.1
+
+B.1.7. New MMX instructions introduced in Katmai
+------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.8,  Next: Section B.1.9,  Prev: Section B.1.7,  Up: Section B.1
+
+B.1.8. AMD Enhanced 3DNow! (Athlon) instructions
+------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.9,  Next: Section B.1.10,  Prev: Section B.1.8,  Up: Section B.1
+
+B.1.9. Willamette SSE2 Cacheability Instructions
+------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.10,  Next: Section B.1.11,  Prev: Section B.1.9,  Up: Section B.1
+
+B.1.10. Willamette MMX instructions (SSE2 SIMD Integer Instructions)
+--------------------------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.11,  Next: Section B.1.12,  Prev: Section B.1.10,  Up: Section B.1
+
+B.1.11. Willamette Streaming SIMD instructions (SSE2)
+-----------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.12,  Next: Section B.1.13,  Prev: Section B.1.11,  Up: Section B.1
+
+B.1.12. Prescott New Instructions (SSE3)
+----------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.13,  Next: Section B.1.14,  Prev: Section B.1.12,  Up: Section B.1
+
+B.1.13. VMX Instructions
+------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.14,  Next: Section B.1.15,  Prev: Section B.1.13,  Up: Section B.1
+
+B.1.14. Extended Page Tables VMX instructions
+---------------------------------------------
+
+     INVEPT           reg32,mem                VMX,SO,NOLONG
+     INVEPT           reg64,mem                VMX,SO,LONG
+     INVVPID          reg32,mem                VMX,SO,NOLONG
+     INVVPID          reg64,mem                VMX,SO,LONG
+
+\1f
+File: nasm.info,  Node: Section B.1.15,  Next: Section B.1.16,  Prev: Section B.1.14,  Up: Section B.1
+
+B.1.15. Tejas New Instructions (SSSE3)
+--------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.16,  Next: Section B.1.17,  Prev: Section B.1.15,  Up: Section B.1
+
+B.1.16. AMD SSE4A
+-----------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.17,  Next: Section B.1.18,  Prev: Section B.1.16,  Up: Section B.1
+
+B.1.17. New instructions in Barcelona
+-------------------------------------
+
+     LZCNT            reg16,rm16               P6,AMD
+     LZCNT            reg32,rm32               P6,AMD
+     LZCNT            reg64,rm64               X64,AMD
+
+\1f
+File: nasm.info,  Node: Section B.1.18,  Next: Section B.1.19,  Prev: Section B.1.17,  Up: Section B.1
+
+B.1.18. Penryn New Instructions (SSE4.1)
+----------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.19,  Next: Section B.1.20,  Prev: Section B.1.18,  Up: Section B.1
+
+B.1.19. Nehalem New Instructions (SSE4.2)
+-----------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.20,  Next: Section B.1.21,  Prev: Section B.1.19,  Up: Section B.1
+
+B.1.20. Intel SMX
+-----------------
+
+     GETSEC                                    KATMAI
+
+\1f
+File: nasm.info,  Node: Section B.1.21,  Next: Section B.1.22,  Prev: Section B.1.20,  Up: Section B.1
+
+B.1.21. Geode (Cyrix) 3DNow! additions
+--------------------------------------
+
+     PFRCPV           mmxreg,mmxrm             PENT,3DNOW,CYRIX
+     PFRSQRTV         mmxreg,mmxrm             PENT,3DNOW,CYRIX
+
+\1f
+File: nasm.info,  Node: Section B.1.22,  Next: Section B.1.23,  Prev: Section B.1.21,  Up: Section B.1
+
+B.1.22. Intel new instructions in ???
+-------------------------------------
+
+     MOVBE            reg16,mem16              NEHALEM
+     MOVBE            reg32,mem32              NEHALEM
+     MOVBE            reg64,mem64              NEHALEM
+     MOVBE            mem16,reg16              NEHALEM
+     MOVBE            mem32,reg32              NEHALEM
+     MOVBE            mem64,reg64              NEHALEM
+
+\1f
+File: nasm.info,  Node: Section B.1.23,  Next: Section B.1.24,  Prev: Section B.1.22,  Up: Section B.1
+
+B.1.23. Intel AES instructions
+------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.24,  Next: Section B.1.25,  Prev: Section B.1.23,  Up: Section B.1
+
+B.1.24. Intel AVX AES instructions
+----------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.25,  Next: Section B.1.26,  Prev: Section B.1.24,  Up: Section B.1
+
+B.1.25. Intel AVX instructions
+------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.26,  Next: Section B.1.27,  Prev: Section B.1.25,  Up: Section B.1
+
+B.1.26. Intel Carry-Less Multiplication instructions (CLMUL)
+------------------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.27,  Next: Section B.1.28,  Prev: Section B.1.26,  Up: Section B.1
+
+B.1.27. Intel AVX Carry-Less Multiplication instructions (CLMUL)
+----------------------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.28,  Next: Section B.1.29,  Prev: Section B.1.27,  Up: Section B.1
+
+B.1.28. Intel Fused Multiply-Add instructions (FMA)
+---------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.29,  Next: Section B.1.30,  Prev: Section B.1.28,  Up: Section B.1
+
+B.1.29. VIA (Centaur) security instructions
+-------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.30,  Next: Section B.1.31,  Prev: Section B.1.29,  Up: Section B.1
+
+B.1.30. AMD Lightweight Profiling (LWP) instructions
+----------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.31,  Next: Section B.1.32,  Prev: Section B.1.30,  Up: Section B.1
+
+B.1.31. AMD XOP, FMA4 and CVT16 instructions (SSE5)
+---------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Section B.1.32,  Next: Appendix C,  Prev: Section B.1.31,  Up: Section B.1
+
+B.1.32. Systematic names for the hinting nop instructions
+---------------------------------------------------------
+
+     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
+
+\1f
+File: nasm.info,  Node: Appendix C,  Next: Section C.1,  Prev: Section B.1.32,  Up: Top
+
+Appendix C: NASM Version History
+********************************
+
+* Menu:
+
+* Section C.1:: NASM 2 Series
+* Section C.2:: NASM 0.98 Series
+* Section C.3:: NASM 0.9 Series
+
+\1f
+File: nasm.info,  Node: Section C.1,  Next: Section C.1.1,  Prev: Appendix C,  Up: Appendix C
+
+C.1. NASM 2 Series
+==================
+
+The NASM 2 series support x86-64, and is the production version of NASM
+since 2007.
+
+* Menu:
+
+* Section C.1.1:: Version 2.08
+* Section C.1.2:: Version 2.07
+* Section C.1.3:: Version 2.06
+* Section C.1.4:: Version 2.05.01
+* Section C.1.5:: Version 2.05
+* Section C.1.6:: Version 2.04
+* Section C.1.7:: Version 2.03.01
+* Section C.1.8:: Version 2.03
+* Section C.1.9:: Version 2.02
+* Section C.1.10:: Version 2.01
+* Section C.1.11:: Version 2.00
+
+\1f
+File: nasm.info,  Node: Section C.1.1,  Next: Section C.1.2,  Prev: Section C.1,  Up: Section C.1
+
+C.1.1. Version 2.08
+-------------------
+
+   * A number of enhancements/fixes in macros area.
+
+   * Support for arbitrarily terminating macro expansions `%exitmacro'.
+     See *note Section 4.3.12::.
+
+   * Support for recursive macro expansion `%rmacro/irmacro'. See *note
+     Section 4.3.1::.
+
+   * Support for converting strings to tokens. See *note Section
+     4.1.9::.
+
+   * Fuzzy operand size logic introduced.
+
+   * Fix COFF stack overrun on too long export identifiers.
+
+   * Fix Macho-O alignment bug.
+
+   * Fix crashes with -fwin32 on file with many exports.
+
+   * Fix stack overrun for too long [DEBUG id].
+
+   * Fix incorrect sbyte usage in IMUL (hit only if optimization flag
+     passed).
+
+   * Append ending token for `.stabs' records in the ELF output format.
+
+   * New NSIS script which uses ModernUI and MultiUser approach.
+
+   * Visual Studio 2008 NASM integration (rules file).
+
+   * Warn a user if a constant is too long (and as result will be
+     stripped).
+
+   * The obsoleted pre-XOP AMD SSE5 instruction set which was never
+     actualized was removed.
+
+   * Fix stack overrun on too long error file name passed from the
+     command line.
+
+   * Bind symbols to the .text section by default (ie in case if SECTION
+     directive was omitted) in the ELF output format.
+
+   * Fix sync points array index wrapping.
+
+   * A few fixes for FMA4 and XOP instruction templates.
+
+   * Add AMD Lightweight Profiling (LWP) instructions.
+
+\1f
+File: nasm.info,  Node: Section C.1.2,  Next: Section C.1.3,  Prev: Section C.1.1,  Up: Section C.1
+
+C.1.2. Version 2.07
+-------------------
+
+   * NASM is now under the 2-clause BSD license. See *note Section
+     1.1.2::.
+
+   * Fix the section type for the `.strtab' section in the `elf64'
+     output format.
+
+   * Fix the handling of `COMMON' directives in the `obj' output format.
+
+   * New `ith' and `srec' output formats; these are variants of the
+     `bin' output format which output Intel hex and Motorola S-records,
+     respectively. See *note Section 7.2:: and *note Section 7.3::.
+
+   * `rdf2ihx' replaced with an enhanced `rdf2bin', which can output
+     binary, COM, Intel hex or Motorola S-records.
+
+   * The Windows installer now puts the NASM directory first in the
+     `PATH' of the "NASM Shell".
+
+   * Revert the early expansion behavior of `%+' to pre-2.06 behavior:
+     `%+' is only expanded late.
+
+   * Yet another Mach-O alignment fix.
+
+   * Don't delete the list file on errors. Also, include error and
+     warning information in the list file.
+
+   * Support for 64-bit Mach-O output, see *note Section 7.8::.
+
+   * Fix assert failure on certain operations that involve strings with
+     high-bit bytes.
+
+\1f
+File: nasm.info,  Node: Section C.1.3,  Next: Section C.1.4,  Prev: Section C.1.2,  Up: Section C.1
+
+C.1.3. Version 2.06
+-------------------
+
+   * This release is dedicated to the memory of Charles A. Crayne, long
+     time NASM developer as well as moderator of `comp.lang.asm.x86'
+     and author of the book _Serious Assembler_. We miss you, Chuck.
+
+   * Support for indirect macro expansion (`%[...]'). See *note Section
+     4.1.3::.
+
+   * `%pop' can now take an argument, see *note Section 4.7.1::.
+
+   * The argument to `%use' is no longer macro-expanded. Use `%[...]'
+     if macro expansion is desired.
+
+   * Support for thread-local storage in ELF32 and ELF64. See *note
+     Section 7.9.4::.
+
+   * Fix crash on `%ifmacro' without an argument.
+
+   * Correct the arguments to the `POPCNT' instruction.
+
+   * Fix section alignment in the Mach-O format.
+
+   * Update AVX support to version 5 of the Intel specification.
+
+   * Fix the handling of accesses to context-local macros from higher
+     levels in the context stack.
+
+   * Treat `WAIT' as a prefix rather than as an instruction, thereby
+     allowing constructs like `O16 FSAVE' to work correctly.
+
+   * Support for structures with a non-zero base offset. See *note
+     Section 4.11.10::.
+
+   * Correctly handle preprocessor token concatenation (see *note
+     Section 4.3.8::) involving floating-point numbers.
+
+   * The `PINSR' series of instructions have been corrected and
+     rationalized.
+
+   * Removed AMD SSE5, replaced with the new XOP/FMA4/CVT16 (rev 3.03)
+     spec.
+
+   * The ELF backends no longer automatically generate a `.comment'
+     section.
+
+   * Add additional "well-known" ELF sections with default attributes.
+     See *note Section 7.9.2::.
+
+\1f
+File: nasm.info,  Node: Section C.1.4,  Next: Section C.1.5,  Prev: Section C.1.3,  Up: Section C.1
+
+C.1.4. Version 2.05.01
+----------------------
+
+   * Fix the `-w'/`-W' option parsing, which was broken in NASM 2.05.
+
+\1f
+File: nasm.info,  Node: Section C.1.5,  Next: Section C.1.6,  Prev: Section C.1.4,  Up: Section C.1
+
+C.1.5. Version 2.05
+-------------------
+
+   * Fix redundant REX.W prefix on `JMP reg64'.
+
+   * Make the behaviour of `-O0' match NASM 0.98 legacy behavior. See
+     *note Section 2.1.22::.
+
+   * `-w-user' can be used to suppress the output of `%warning'
+     directives. See *note Section 2.1.24::.
+
+   * Fix bug where `ALIGN' would issue a full alignment datum instead of
+     zero bytes.
+
+   * Fix offsets in list files.
+
+   * Fix `%include' inside multi-line macros or loops.
+
+   * Fix error where NASM would generate a spurious warning on valid
+     optimizations of immediate values.
+
+   * Fix arguments to a number of the `CVT' SSE instructions.
+
+   * Fix RIP-relative offsets when the instruction carries an immediate.
+
+   * Massive overhaul of the ELF64 backend for spec compliance.
+
+   * Fix the Geode `PFRCPV' and `PFRSQRTV' instruction.
+
+   * Fix the SSE 4.2 `CRC32' instruction.
+
+\1f
+File: nasm.info,  Node: Section C.1.6,  Next: Section C.1.7,  Prev: Section C.1.5,  Up: Section C.1
+
+C.1.6. Version 2.04
+-------------------
+
+   * Sanitize macro handing in the `%error' directive.
+
+   * New `%warning' directive to issue user-controlled warnings.
+
+   * `%error' directives are now deferred to the final assembly phase.
+
+   * New `%fatal' directive to immediately terminate assembly.
+
+   * New `%strcat' directive to join quoted strings together.
+
+   * New `%use' macro directive to support standard macro directives.
+     See *note Section 4.6.4::.
+
+   * Excess default parameters to `%macro' now issues a warning by
+     default.  See *note Section 4.3::.
+
+   * Fix `%ifn' and `%elifn'.
+
+   * Fix nested `%else' clauses.
+
+   * Correct the handling of nested `%rep's.
+
+   * New `%unmacro' directive to undeclare a multi-line macro. See
+     *note Section 4.3.11::.
+
+   * Builtin macro `__PASS__' which expands to the current assembly
+     pass.  See *note Section 4.11.9::.
+
+   * `__utf16__' and `__utf32__' operators to generate UTF-16 and UTF-
+     32 strings. See *note Section 3.4.5::.
+
+   * Fix bug in case-insensitive matching when compiled on platforms
+     that don't use the `configure' script. Of the official release
+     binaries, that only affected the OS/2 binary.
+
+   * Support for x87 packed BCD constants. See *note Section 3.4.7::.
+
+   * Correct the `LTR' and `SLDT' instructions in 64-bit mode.
+
+   * Fix unnecessary REX.W prefix on indirect jumps in 64-bit mode.
+
+   * Add AVX versions of the AES instructions (`VAES'...).
+
+   * Fix the 256-bit FMA instructions.
+
+   * Add 256-bit AVX stores per the latest AVX spec.
+
+   * VIA XCRYPT instructions can now be written either with or without
+     `REP', apparently different versions of the VIA spec wrote them
+     differently.
+
+   * Add missing 64-bit `MOVNTI' instruction.
+
+   * Fix the operand size of `VMREAD' and `VMWRITE'.
+
+   * Numerous bug fixes, especially to the AES, AVX and VTX
+     instructions.
+
+   * 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.
+
+   * `%push' no longer needs a context identifier; omitting the context
+     identifier results in an anonymous context.
+
+\1f
+File: nasm.info,  Node: Section C.1.7,  Next: Section C.1.8,  Prev: Section C.1.6,  Up: Section C.1
+
+C.1.7. Version 2.03.01
+----------------------
+
+   * Fix buffer overflow in the listing module.
+
+   * Fix the handling of hexadecimal escape codes in `...` strings.
+
+   * The Postscript/PDF documentation has been reformatted.
+
+   * The `-F' option now implies `-g'.
+
+\1f
+File: nasm.info,  Node: Section C.1.8,  Next: Section C.1.9,  Prev: Section C.1.7,  Up: Section C.1
+
+C.1.8. Version 2.03
+-------------------
+
+   * Add support for Intel AVX, CLMUL and FMA instructions, including
+     YMM registers.
+
+   * `dy', `resy' and `yword' for 32-byte operands.
+
+   * Fix some SSE5 instructions.
+
+   * Intel `INVEPT', `INVVPID' and `MOVBE' instructions.
+
+   * Fix checking for critical expressions when the optimizer is
+     enabled.
+
+   * Support the DWARF debugging format for ELF targets.
+
+   * Fix optimizations of signed bytes.
+
+   * Fix operation on bigendian machines.
+
+   * Fix buffer overflow in the preprocessor.
+
+   * `SAFESEH' support for Win32, `IMAGEREL' for Win64 (SEH).
+
+   * `%?' and `%??' to refer to the name of a macro itself. In
+     particular, `%idefine keyword $%?' can be used to make a keyword
+     "disappear".
+
+   * New options for dependency generation: `-MD', `-MF', `-MP', `-MT',
+     `-MQ'.
+
+   * New preprocessor directives `%pathsearch' and `%depend'; INCBIN
+     reimplemented as a macro.
+
+   * `%include' now resolves macros in a sane manner.
+
+   * `%substr' can now be used to get other than one-character
+     substrings.
+
+   * New type of character/string constants, using backquotes (``...`'),
+     which support C-style escape sequences.
+
+   * `%defstr' and `%idefstr' to stringize macro definitions before
+     creation.
+
+   * Fix forward references used in `EQU' statements.
+
+\1f
+File: nasm.info,  Node: Section C.1.9,  Next: Section C.1.10,  Prev: Section C.1.8,  Up: Section C.1
+
+C.1.9. Version 2.02
+-------------------
+
+   * Additional fixes for MMX operands with explicit `qword', as well as
+     (hopefully) SSE operands with `oword'.
+
+   * Fix handling of truncated strings with `DO'.
+
+   * Fix segfaults due to memory overwrites when floating-point
+     constants were used.
+
+   * Fix segfaults due to missing include files.
+
+   * Fix OpenWatcom Makefiles for DOS and OS/2.
+
+   * Add autogenerated instruction list back into the documentation.
+
+   * ELF: Fix segfault when generating stabs, and no symbols have been
+     defined.
+
+   * ELF: Experimental support for DWARF debugging information.
+
+   * New compile date and time standard macros.
+
+   * `%ifnum' now returns true for negative numbers.
+
+   * New `%iftoken' test for a single token.
+
+   * New `%ifempty' test for empty expansion.
+
+   * Add support for the `XSAVE' instruction group.
+
+   * Makefile for Netware/gcc.
+
+   * Fix issue with some warnings getting emitted way too many times.
+
+   * Autogenerated instruction list added to the documentation.
+
+\1f
+File: nasm.info,  Node: Section C.1.10,  Next: Section C.1.11,  Prev: Section C.1.9,  Up: Section C.1
+
+C.1.10. Version 2.01
+--------------------
+
+   * Fix the handling of MMX registers with explicit `qword' tags on
+     memory (broken in 2.00 due to 64-bit changes.)
+
+   * Fix the PREFETCH instructions.
+
+   * Fix the documentation.
+
+   * Fix debugging info when using `-f elf' (backwards compatibility
+     alias for `-f elf32').
+
+   * Man pages for rdoff tools (from the Debian project.)
+
+   * ELF: handle large numbers of sections.
+
+   * Fix corrupt output when the optimizer runs out of passes.
+
+\1f
+File: nasm.info,  Node: Section C.1.11,  Next: Section C.2,  Prev: Section C.1.10,  Up: Section C.1
+
+C.1.11. Version 2.00
+--------------------
+
+   * Added c99 data-type compliance.
+
+   * Added general x86-64 support.
+
+   * Added win64 (x86-64 COFF) output format.
+
+   * Added `__BITS__' standard macro.
+
+   * Renamed the `elf' output format to `elf32' for clarity.
+
+   * Added `elf64' and `macho' (MacOS X) output formats.
+
+   * Added Numeric constants in `dq' directive.
+
+   * Added `oword', `do' and `reso' pseudo operands.
+
+   * Allow underscores in numbers.
+
+   * Added 8-, 16- and 128-bit floating-point formats.
+
+   * Added binary, octal and hexadecimal floating-point.
+
+   * Correct the generation of floating-point constants.
+
+   * Added floating-point option control.
+
+   * Added Infinity and NaN floating point support.
+
+   * Added ELF Symbol Visibility support.
+
+   * Added setting OSABI value in ELF header directive.
+
+   * Added Generate Makefile Dependencies option.
+
+   * Added Unlimited Optimization Passes option.
+
+   * Added `%IFN' and `%ELIFN' support.
+
+   * Added Logical Negation Operator.
+
+   * Enhanced Stack Relative Preprocessor Directives.
+
+   * Enhanced ELF Debug Formats.
+
+   * Enhanced Send Errors to a File option.
+
+   * Added SSSE3, SSE4.1, SSE4.2, SSE5 support.
+
+   * Added a large number of additional instructions.
+
+   * Significant performance improvements.
+
+   * `-w+warning' and `-w-warning' can now be written as -Wwarning and
+     -Wno-warning, respectively. See *note Section 2.1.24::.
+
+   * Add `-w+error' to treat warnings as errors. See *note Section
+     2.1.24::.
+
+   * Add `-w+all' and `-w-all' to enable or disable all suppressible
+     warnings. See *note Section 2.1.24::.
+
+\1f
+File: nasm.info,  Node: Section C.2,  Next: Section C.2.1,  Prev: Section C.1.11,  Up: Appendix C
+
+C.2. NASM 0.98 Series
+=====================
+
+The 0.98 series was the production versions of NASM from 1999 to 2007.
+
+* Menu:
+
+* Section C.2.1:: Version 0.98.39
+* Section C.2.2:: Version 0.98.38
+* Section C.2.3:: Version 0.98.37
+* Section C.2.4:: Version 0.98.36
+* Section C.2.5:: Version 0.98.35
+* Section C.2.6:: Version 0.98.34
+* Section C.2.7:: Version 0.98.33
+* Section C.2.8:: Version 0.98.32
+* Section C.2.9:: Version 0.98.31
+* Section C.2.10:: Version 0.98.30
+* Section C.2.11:: Version 0.98.28
+* Section C.2.12:: Version 0.98.26
+* Section C.2.13:: Version 0.98.25alt
+* Section C.2.14:: Version 0.98.25
+* Section C.2.15:: Version 0.98.24p1
+* Section C.2.16:: Version 0.98.24
+* Section C.2.17:: Version 0.98.23
+* Section C.2.18:: Version 0.98.22
+* Section C.2.19:: Version 0.98.21
+* Section C.2.20:: Version 0.98.20
+* Section C.2.21:: Version 0.98.19
+* Section C.2.22:: Version 0.98.18
+* Section C.2.23:: Version 0.98.17
+* Section C.2.24:: Version 0.98.16
+* Section C.2.25:: Version 0.98.15
+* Section C.2.26:: Version 0.98.14
+* Section C.2.27:: Version 0.98.13
+* Section C.2.28:: Version 0.98.12
+* Section C.2.29:: Version 0.98.11
+* Section C.2.30:: Version 0.98.10
+* Section C.2.31:: Version 0.98.09
+* Section C.2.32:: Version 0.98.08
+* Section C.2.33:: Version 0.98.09b with John Coffman patches released 28-Oct-2001
+* Section C.2.34:: Version 0.98.07 released 01/28/01
+* Section C.2.35:: Version 0.98.06f released 01/18/01
+* Section C.2.36:: Version 0.98.06e released 01/09/01
+* Section C.2.37:: Version 0.98p1
+* Section C.2.38:: Version 0.98bf (bug-fixed)
+* Section C.2.39:: Version 0.98.03 with John Coffman's changes released 27-Jul-2000
+* Section C.2.40:: Version 0.98.03
+* Section C.2.41:: Version 0.98
+* Section C.2.42:: Version 0.98p9
+* Section C.2.43:: Version 0.98p8
+* Section C.2.44:: Version 0.98p7
+* Section C.2.45:: Version 0.98p6
+* Section C.2.46:: Version 0.98p3.7
+* Section C.2.47:: Version 0.98p3.6
+* Section C.2.48:: Version 0.98p3.5
+* Section C.2.49:: Version 0.98p3.4
+* Section C.2.50:: Version 0.98p3.3
+* Section C.2.51:: Version 0.98p3.2
+* Section C.2.52:: Version 0.98p3-hpa
+* Section C.2.53:: Version 0.98 pre-release 3
+* Section C.2.54:: Version 0.98 pre-release 2
+* Section C.2.55:: Version 0.98 pre-release 1
+
+\1f
+File: nasm.info,  Node: Section C.2.1,  Next: Section C.2.2,  Prev: Section C.2,  Up: Section C.2
+
+C.2.1. Version 0.98.39
+----------------------
+
+   * fix buffer overflow
+
+   * fix outas86's `.bss' handling
+
+   * "make spotless" no longer deletes config.h.in.
+
+   * `%(el)if(n)idn' insensitivity to string quotes difference
+     (#809300).
+
+   * (nasm.c)`__OUTPUT_FORMAT__' changed to string value instead of
+     symbol.
+
+\1f
+File: nasm.info,  Node: Section C.2.2,  Next: Section C.2.3,  Prev: Section C.2.1,  Up: Section C.2
+
+C.2.2. Version 0.98.38
+----------------------
+
+   * Add Makefile for 16-bit DOS binaries under OpenWatcom, and modify
+     `mkdep.pl' to be able to generate completely pathless
+     dependencies, as required by OpenWatcom wmake (it supports path
+     searches, but not explicit paths.)
+
+   * Fix the `STR' instruction.
+
+   * Fix the ELF output format, which was broken under certain
+     circumstances due to the addition of stabs support.
+
+   * Quick-fix Borland format debug-info for `-f obj'
+
+   * Fix for `%rep' with no arguments (#560568)
+
+   * Fix concatenation of preprocessor function call (#794686)
+
+   * Fix long label causes coredump (#677841)
+
+   * Use autoheader as well as autoconf to keep configure from
+     generating ridiculously long command lines.
+
+   * Make sure that all of the formats which support debugging output
+     actually will suppress debugging output when `-g' not specified.
+
+\1f
+File: nasm.info,  Node: Section C.2.3,  Next: Section C.2.4,  Prev: Section C.2.2,  Up: Section C.2
+
+C.2.3. Version 0.98.37
+----------------------
+
+   * Paths given in `-I' switch searched for `incbin'-ed as well as
+     `%include'-ed files.
+
+   * Added stabs debugging for the ELF output format, patch from Martin
+     Wawro.
+
+   * Fix `output/outbin.c' to allow origin > 80000000h.
+
+   * Make `-U' switch work.
+
+   * Fix the use of relative offsets with explicit prefixes, e.g.  `a32
+     loop foo'.
+
+   * Remove `backslash()'.
+
+   * Fix the `SMSW' and `SLDT' instructions.
+
+   * `-O2' and `-O3' are no longer aliases for `-O10' and `-O15'. If
+     you mean the latter, please say so! :)
+
+\1f
+File: nasm.info,  Node: Section C.2.4,  Next: Section C.2.5,  Prev: Section C.2.3,  Up: Section C.2
+
+C.2.4. Version 0.98.36
+----------------------
+
+   * Update rdoff - librarian/archiver - common rec - docs!
+
+   * Fix signed/unsigned problems.
+
+   * Fix `JMP FAR label' and `CALL FAR label'.
+
+   * Add new multisection support - map files - fix align bug
+
+   * Fix sysexit, movhps/movlps reg,reg bugs in insns.dat
+
+   * `Q' or `O' suffixes indicate octal
+
+   * Support Prescott new instructions (PNI).
+
+   * Cyrix `XSTORE' instruction.
+
+\1f
+File: nasm.info,  Node: Section C.2.5,  Next: Section C.2.6,  Prev: Section C.2.4,  Up: Section C.2
+
+C.2.5. Version 0.98.35
+----------------------
+
+   * Fix build failure on 16-bit DOS (Makefile.bc3 workaround for
+     compiler bug.)
+
+   * Fix dependencies and compiler warnings.
+
+   * Add "const" in a number of places.
+
+   * Add -X option to specify error reporting format (use -Xvc to
+     integrate with Microsoft Visual Studio.)
+
+   * Minor changes for code legibility.
+
+   * Drop use of tmpnam() in rdoff (security fix.)
+
+\1f
+File: nasm.info,  Node: Section C.2.6,  Next: Section C.2.7,  Prev: Section C.2.5,  Up: Section C.2
+
+C.2.6. Version 0.98.34
+----------------------
+
+   * Correct additional address-size vs. operand-size confusions.
+
+   * Generate dependencies for all Makefiles automatically.
+
+   * 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.
+
+   * Correct some disassembler bugs related to redundant address-size
+     prefixes.  Some work still remains in this area.
+
+   * Correctly generate an error for things like "SEG eax".
+
+   * Add the JMPE instruction, enabled by "CPU IA64".
+
+   * Correct compilation on newer gcc/glibc platforms.
+
+   * Issue an error on things like "jmp far eax".
+
+\1f
+File: nasm.info,  Node: Section C.2.7,  Next: Section C.2.8,  Prev: Section C.2.6,  Up: Section C.2
+
+C.2.7. Version 0.98.33
+----------------------
+
+   * 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).
+
+   * New keyword "strict" to disable the optimization of specific
+     operands.
+
+   * Fix the handing of size overrides with JMP instructions
+     (instructions such as "jmp dword foo".)
+
+   * Fix the handling of "ABSOLUTE label", where "label" points into a
+     relocatable segment.
+
+   * Fix OBJ output format with lots of externs.
+
+   * More documentation updates.
+
+   * Add -Ov option to get verbose information about optimizations.
+
+   * Undo a braindead change which broke `%elif' directives.
+
+   * Makefile updates.
+
+\1f
+File: nasm.info,  Node: Section C.2.8,  Next: Section C.2.9,  Prev: Section C.2.7,  Up: Section C.2
+
+C.2.8. Version 0.98.32
+----------------------
+
+   * Fix NASM crashing when `%macro' directives were left unterminated.
+
+   * Lots of documentation updates.
+
+   * Complete rewrite of the PostScript/PDF documentation generator.
+
+   * The MS Visual C++ Makefile was updated and corrected.
+
+   * Recognize .rodata as a standard section name in ELF.
+
+   * Fix some obsolete Perl4-isms in Perl scripts.
+
+   * Fix configure.in to work with autoconf 2.5x.
+
+   * Fix a couple of "make cleaner" misses.
+
+   * Make the normal "./configure && make" work with Cygwin.
+
+\1f
+File: nasm.info,  Node: Section C.2.9,  Next: Section C.2.10,  Prev: Section C.2.8,  Up: Section C.2
+
+C.2.9. Version 0.98.31
+----------------------
+
+   * Correctly build in a separate object directory again.
+
+   * Derive all references to the version number from the version file.
+
+   * New standard macros __NASM_SUBMINOR__ and __NASM_VER__ macros.
+
+   * Lots of Makefile updates and bug fixes.
+
+   * New `%ifmacro' directive to test for multiline macros.
+
+   * Documentation updates.
+
+   * Fixes for 16-bit OBJ format output.
+
+   * Changed the NASM environment variable to NASMENV.
+
+\1f
+File: nasm.info,  Node: Section C.2.10,  Next: Section C.2.11,  Prev: Section C.2.9,  Up: Section C.2
+
+C.2.10. Version 0.98.30
+-----------------------
+
+   * Changed doc files a lot: completely removed old READMExx and
+     Wishlist files, incorporating all information in CHANGES and TODO.
+
+   * I waited a long time to rename zoutieee.c to (original) outieee.c
+
+   * moved all output modules to output/ subdirectory.
+
+   * Added 'make strip' target to strip debug info from nasm & ndisasm.
+
+   * Added INSTALL file with installation instructions.
+
+   * Added -v option description to nasm man.
+
+   * Added dist makefile target to produce source distributions.
+
+   * 16-bit support for ELF output format (GNU extension, but useful.)
+
+\1f
+File: nasm.info,  Node: Section C.2.11,  Next: Section C.2.12,  Prev: Section C.2.10,  Up: Section C.2
+
+C.2.11. Version 0.98.28
+-----------------------
+
+   * 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.
+
+\1f
+File: nasm.info,  Node: Section C.2.12,  Next: Section C.2.13,  Prev: Section C.2.11,  Up: Section C.2
+
+C.2.12. Version 0.98.26
+-----------------------
+
+   * Reorganised files even better from 0.98.25alt
+
+\1f
+File: nasm.info,  Node: Section C.2.13,  Next: Section C.2.14,  Prev: Section C.2.12,  Up: Section C.2
+
+C.2.13. Version 0.98.25alt
+--------------------------
+
+   * Prettified the source tree. Moved files to more reasonable places.
+
+   * Added findleak.pl script to misc/ directory.
+
+   * Attempted to fix doc.
+
+\1f
+File: nasm.info,  Node: Section C.2.14,  Next: Section C.2.15,  Prev: Section C.2.13,  Up: Section C.2
+
+C.2.14. Version 0.98.25
+-----------------------
+
+   * Line continuation character `\'.
+
+   * Docs inadvertantly reverted - "dos packaging".
+
+\1f
+File: nasm.info,  Node: Section C.2.15,  Next: Section C.2.16,  Prev: Section C.2.14,  Up: Section C.2
+
+C.2.15. Version 0.98.24p1
+-------------------------
+
+   * FIXME: Someone, document this please.
+
+\1f
+File: nasm.info,  Node: Section C.2.16,  Next: Section C.2.17,  Prev: Section C.2.15,  Up: Section C.2
+
+C.2.16. Version 0.98.24
+-----------------------
+
+   * Documentation - Ndisasm doc added to Nasm.doc.
+
+\1f
+File: nasm.info,  Node: Section C.2.17,  Next: Section C.2.18,  Prev: Section C.2.16,  Up: Section C.2
+
+C.2.17. Version 0.98.23
+-----------------------
+
+   * Attempted to remove rdoff version1
+
+   * Lino Mastrodomenico's patches to preproc.c (%$$ bug?).
+
+\1f
+File: nasm.info,  Node: Section C.2.18,  Next: Section C.2.19,  Prev: Section C.2.17,  Up: Section C.2
+
+C.2.18. Version 0.98.22
+-----------------------
+
+   * Update rdoff2 - attempt to remove v1.
+
+\1f
+File: nasm.info,  Node: Section C.2.19,  Next: Section C.2.20,  Prev: Section C.2.18,  Up: Section C.2
+
+C.2.19. Version 0.98.21
+-----------------------
+
+   * Optimization fixes.
+
+\1f
+File: nasm.info,  Node: Section C.2.20,  Next: Section C.2.21,  Prev: Section C.2.19,  Up: Section C.2
+
+C.2.20. Version 0.98.20
+-----------------------
+
+   * Optimization fixes.
+
+\1f
+File: nasm.info,  Node: Section C.2.21,  Next: Section C.2.22,  Prev: Section C.2.20,  Up: Section C.2
+
+C.2.21. Version 0.98.19
+-----------------------
+
+   * H. J. Lu's patch back out.
+
+\1f
+File: nasm.info,  Node: Section C.2.22,  Next: Section C.2.23,  Prev: Section C.2.21,  Up: Section C.2
+
+C.2.22. Version 0.98.18
+-----------------------
+
+   * Added ".rdata" to "-f win32".
+
+\1f
+File: nasm.info,  Node: Section C.2.23,  Next: Section C.2.24,  Prev: Section C.2.22,  Up: Section C.2
+
+C.2.23. Version 0.98.17
+-----------------------
+
+   * H. J. Lu's "bogus elf" patch. (Red Hat problem?)
+
+\1f
+File: nasm.info,  Node: Section C.2.24,  Next: Section C.2.25,  Prev: Section C.2.23,  Up: Section C.2
+
+C.2.24. Version 0.98.16
+-----------------------
+
+   * Fix whitespace before "[section ..." bug.
+
+\1f
+File: nasm.info,  Node: Section C.2.25,  Next: Section C.2.26,  Prev: Section C.2.24,  Up: Section C.2
+
+C.2.25. Version 0.98.15
+-----------------------
+
+   * Rdoff changes (?).
+
+   * Fix fixes to memory leaks.
+
+\1f
+File: nasm.info,  Node: Section C.2.26,  Next: Section C.2.27,  Prev: Section C.2.25,  Up: Section C.2
+
+C.2.26. Version 0.98.14
+-----------------------
+
+   * Fix memory leaks.
+
+\1f
+File: nasm.info,  Node: Section C.2.27,  Next: Section C.2.28,  Prev: Section C.2.26,  Up: Section C.2
+
+C.2.27. Version 0.98.13
+-----------------------
+
+   * There was no 0.98.13
+
+\1f
+File: nasm.info,  Node: Section C.2.28,  Next: Section C.2.29,  Prev: Section C.2.27,  Up: Section C.2
+
+C.2.28. Version 0.98.12
+-----------------------
+
+   * Update optimization (new function of "-O1")
+
+   * Changes to test/bintest.asm (?).
+
+\1f
+File: nasm.info,  Node: Section C.2.29,  Next: Section C.2.30,  Prev: Section C.2.28,  Up: Section C.2
+
+C.2.29. Version 0.98.11
+-----------------------
+
+   * Optimization changes.
+
+   * Ndisasm fixed.
+
+\1f
+File: nasm.info,  Node: Section C.2.30,  Next: Section C.2.31,  Prev: Section C.2.29,  Up: Section C.2
+
+C.2.30. Version 0.98.10
+-----------------------
+
+   * There was no 0.98.10
+
+\1f
+File: nasm.info,  Node: Section C.2.31,  Next: Section C.2.32,  Prev: Section C.2.30,  Up: Section C.2
+
+C.2.31. Version 0.98.09
+-----------------------
+
+   * Add multiple sections support to "-f bin".
+
+   * Changed GLOBAL_TEMP_BASE in outelf.c from 6 to 15.
+
+   * Add "-v" as an alias to the "-r" switch.
+
+   * Remove "#ifdef" from Tasm compatibility options.
+
+   * Remove redundant size-overrides on "mov ds, ex", etc.
+
+   * Fixes to SSE2, other insns.dat (?).
+
+   * Enable uppercase "I" and "P" switches.
+
+   * Case insinsitive "seg" and "wrt".
+
+   * Update install.sh (?).
+
+   * Allocate tokens in blocks.
+
+   * Improve "invalid effective address" messages.
+
+\1f
+File: nasm.info,  Node: Section C.2.32,  Next: Section C.2.33,  Prev: Section C.2.31,  Up: Section C.2
+
+C.2.32. Version 0.98.08
+-----------------------
+
+   * Add "`%strlen'" and "`%substr'" macro operators
+
+   * Fixed broken c16.mac.
+
+   * Unterminated string error reported.
+
+   * Fixed bugs as per 0.98bf
+
+\1f
+File: nasm.info,  Node: Section C.2.33,  Next: Section C.2.34,  Prev: Section C.2.32,  Up: Section C.2
+
+C.2.33. Version 0.98.09b with John Coffman patches released 28-Oct-2001
+-----------------------------------------------------------------------
+
+Changes from 0.98.07 release to 98.09b as of 28-Oct-2001
+
+   * 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.
+
+   * 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).
+
+   * Changed definition of the optimization flag:
+
+   -O0 strict two-pass assembly, JMP and Jcc are handled more like 0.98,
+except that back- ward JMPs are short, if possible.
+
+   -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.
+
+   -O2 multi-pass optimization, minimize branch offsets; also will
+minimize signed immed- iate bytes, overriding size specification.
+
+   -O3 like -O2, but more passes taken, if needed
+
+\1f
+File: nasm.info,  Node: Section C.2.34,  Next: Section C.2.35,  Prev: Section C.2.33,  Up: Section C.2
+
+C.2.34. Version 0.98.07 released 01/28/01
+-----------------------------------------
+
+   * 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"
+
+   01/28/01
+
+   * Cosmetic modifications to nasm.c, nasm.h, AUTHORS, MODIFIED
+
+\1f
+File: nasm.info,  Node: Section C.2.35,  Next: Section C.2.36,  Prev: Section C.2.34,  Up: Section C.2
+
+C.2.35. Version 0.98.06f released 01/18/01
+------------------------------------------
+
+   * - Add "metalbrain"s jecxz bug fix in insns.dat - alter nasmdoc.src
+     to match - version "0.98.06f"
+
+\1f
+File: nasm.info,  Node: Section C.2.36,  Next: Section C.2.37,  Prev: Section C.2.35,  Up: Section C.2
+
+C.2.36. Version 0.98.06e released 01/09/01
+------------------------------------------
+
+   * Removed the "outforms.h" file - it appears to be someone's old
+     backup of "outform.h". version "0.98.06e"
+
+   01/09/01
+
+   * 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...
+
+   * Nelson Rush resigns from the group. Big thanks to Nelson for his
+     leadership and enthusiasm in getting these changes incorporated
+     into Nasm!
+
+   * fbk - [list +], [list -] directives - ineptly implemented, should
+     be re- written or removed, perhaps.
+
+   * Brian Raiter / fbk - "elfso bug" fix - applied to aoutb format as
+     well - testing might be desirable...
+
+   08/07/00
+
+   * James Seter - -postfix, -prefix command line switches.
+
+   * Yuri Zaporogets - rdoff utility changes.
+
+\1f
+File: nasm.info,  Node: Section C.2.37,  Next: Section C.2.38,  Prev: Section C.2.36,  Up: Section C.2
+
+C.2.37. Version 0.98p1
+----------------------
+
+   * GAS-like palign (Panos Minos)
+
+   * FIXME: Someone, fill this in with details
+
+\1f
+File: nasm.info,  Node: Section C.2.38,  Next: Section C.2.39,  Prev: Section C.2.37,  Up: Section C.2
+
+C.2.38. Version 0.98bf (bug-fixed)
+----------------------------------
+
+   * Fixed - elf and aoutb bug - shared libraries - multiple "%include"
+     bug in "-f obj" - jcxz, jecxz bug - unrecognized option bug in
+     ndisasm
+
+\1f
+File: nasm.info,  Node: Section C.2.39,  Next: Section C.2.40,  Prev: Section C.2.38,  Up: Section C.2
+
+C.2.39. Version 0.98.03 with John Coffman's changes released 27-Jul-2000
+------------------------------------------------------------------------
+
+   * 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.
+
+   * 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.
+
+   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.
+
+   * 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'.
+
+   * 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)
+
+   * 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)
+
+\1f
+File: nasm.info,  Node: Section C.2.40,  Next: Section C.2.41,  Prev: Section C.2.39,  Up: Section C.2
+
+C.2.40. Version 0.98.03
+-----------------------
+
+"Integrated patchfile 0.98-0.98.01. I call this version 0.98.03 for
+historical reasons: 0.98.02 was trashed." ---John Coffman
+<johninsd@san.rr.com>, 27-Jul-2000
+
+   * Kendall Bennett's SciTech MGL changes
+
+   * Note that you must define "TASM_COMPAT" at compile-time to get the
+     Tasm Ideal Mode compatibility.
+
+   * 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.
+
+   * standard.mac, macros.c: Added macros to ignore TASM directives
+     before first include
+
+   * nasm.h: Added extern declaration for tasm_compatible_mode
+
+   * nasm.c: Added global variable tasm_compatible_mode
+
+   * Added command line switch for TASM compatible mode (-t)
+
+   * Changed version command line to reflect when compiled with TASM
+     additions
+
+   * Added response file processing to allow all arguments on a single
+     line (response file is @resp rather than -@resp for NASM format).
+
+   * labels.c: Changes islocal() macro to support TASM style @@local
+     labels.
+
+   * Added islocalchar() macro to support TASM style @@local labels.
+
+   * parser.c: Added support for TASM style memory references (ie: mov
+     [DWORD eax],10 rather than the NASM style mov DWORD [eax],10).
+
+   * preproc.c: Added new directives, `%arg', `%local', `%stacksize' to
+     directives table
+
+   * Added support for TASM style directives without a leading % symbol.
+
+   * Integrated a block of changes from Andrew Zabolotny
+     <bit@eltech.ru>:
+
+   * A new keyword `%xdefine' and its case-insensitive counterpart
+     `%ixdefine'. They work almost the same way as `%define' and
+     `%idefine' but expand the definition immediately, not on the
+     invocation. Something like a cross between `%define' and
+     `%assign'. The "x" suffix stands for "eXpand", so "xdefine" can be
+     deciphered as "expand-and-define". Thus you can do things like
+     this:
+
+          %assign ofs     0
+
+          %macro  arg     1
+                  %xdefine %1 dword [esp+ofs]
+                  %assign ofs ofs+4
+          %endmacro
+
+   * 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:
+
+          %macro  abc     1
+                  %define %1 hello
+          %endm
+
+          abc     %$here
+          %$here
+
+   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.
+
+   * Added a check for "cstk" in smacro_defined() before calling
+     get_ctx() - this allows for things like:
+
+          %ifdef %$abc
+          %endif
+
+   to work without warnings even in no context.
+
+   * Added a check for "cstk" in %if*ctx and %elif*ctx directives -
+     this allows to use `%ifctx' without excessive warnings. If there
+     is no active context, `%ifctx' goes through "false" branch.
+
+   * Removed "user error: " prefix with `%error' 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.
+
+   * Added expansion of string that is output by `%error' directive. Now
+     you can do things like:
+
+          %define hello(x) Hello, x!
+
+          %define %$name andy
+          %error "hello(%$name)"
+
+   Same happened with `%include' directive.
+
+   * 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
+
+          %define %$abc hello
+          %define __%$abc goodbye
+          __%$abc
+
+   would produce "incorrect" output: last line will expand to
+
+          hello goodbyehello
+
+   Not quite what you expected, eh? :-) The answer is that preprocessor
+treats the `%define' construct as if it would be
+
+          %define __ %$abc goodbye
+
+   (note the white space between __ and %$abc). After my "fix" it will
+"correctly" expand into
+
+          goodbye
+
+   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
+:-).
+
+   Same change was applied to:
+`%push',`%macro',`%imacro',`%define',`%idefine',`%xdefine',`%ixdefine',
+`%assign',`%iassign',`%undef'
+
+   * 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).
+
+   * 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:
+
+            [WARNING macro-selfref]
+
+            %macro          push    1-*
+                    %rep    %0
+                            push    %1
+                            %rotate 1
+                    %endrep
+            %endmacro
+
+                            push    eax,ebx,ecx
+
+   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).
+
+   * 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.
+
+   * Added the %+ operator in single-line macros for concatenating two
+     identifiers. Usage example:
+
+            %define _myfunc _otherfunc
+            %define cextern(x) _ %+ x
+            cextern (myfunc)
+
+   After first expansion, third line will become "_myfunc". After this
+expansion is performed again so it becomes "_otherunc".
+
+   * Now if preprocessor is in a non-emitting state, no warning or
+     error will be emitted. Example:
+
+            %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
+
+   * Context-local variables on expansion as a last resort are looked
+     up in outer contexts. For example, the following piece:
+
+            %push   outer
+            %define %$a [esp]
+
+                    %push   inner
+                    %$a
+                    %pop
+            %pop
+
+   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 `%ifdef' won't look in outer contexts.
+
+   This behaviour is needed because we don't want nested contexts to
+act on already defined local macros. Example:
+
+            %define %$arg1  [esp+4]
+            test    eax,eax
+            if      nz
+                    mov     eax,%$arg1
+            endif
+
+   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.
+
+   * Fixed memory leak in `%undef'. The origline wasn't freed before
+     exiting on success.
+
+   * Fixed trap in preprocessor when line expanded to empty set of
+     tokens. This happens, for example, in the following case:
+
+            #define SOMETHING
+            SOMETHING
+
+\1f
+File: nasm.info,  Node: Section C.2.41,  Next: Section C.2.42,  Prev: Section C.2.40,  Up: Section C.2
+
+C.2.41. Version 0.98
+--------------------
+
+All changes since NASM 0.98p3 have been produced by H. Peter Anvin
+<hpa@zytor.com>.
+
+   * The documentation comment delimiter is
+
+   * Allow EQU definitions to refer to external labels; reported by
+     Pedro Gimeno.
+
+   * Re-enable support for RDOFF v1; reported by Pedro Gimeno.
+
+   * Updated License file per OK from Simon and Julian.
+
+\1f
+File: nasm.info,  Node: Section C.2.42,  Next: Section C.2.43,  Prev: Section C.2.41,  Up: Section C.2
+
+C.2.42. Version 0.98p9
+----------------------
+
+   * Update documentation (although the instruction set reference will
+     have to wait; I don't want to hold up the 0.98 release for it.)
+
+   * 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.
+
+   * Fix handling of implicit sizes in PSHUFW and PINSRW, reported by
+     Stefan Hoffmeister.
+
+   * Resurrect the -s option, which was removed when changing the
+     diagnostic output to stdout.
+
+\1f
+File: nasm.info,  Node: Section C.2.43,  Next: Section C.2.44,  Prev: Section C.2.42,  Up: Section C.2
+
+C.2.43. Version 0.98p8
+----------------------
+
+   * Fix for "DB" when NASM is running on a bigendian machine.
+
+   * Invoke insns.pl once for each output script, making Makefile.in
+     legal for "make -j".
+
+   * Improve the Unix configure-based makefiles to make package
+     creation easier.
+
+   * Included an RPM .spec file for building RPM (RedHat Package
+     Manager) packages on Linux or Unix systems.
+
+   * Fix Makefile dependency problems.
+
+   * Change src/rdsrc.pl to include sectioning information in info
+     output; required for install-info to work.
+
+   * Updated the RDOFF distribution to version 2 from Jules; minor
+     massaging to make it compile in my environment.
+
+   * Split doc files that can be built by anyone with a Perl
+     interpreter off into a separate archive.
+
+   * "Dress rehearsal" release!
+
+\1f
+File: nasm.info,  Node: Section C.2.44,  Next: Section C.2.45,  Prev: Section C.2.43,  Up: Section C.2
+
+C.2.44. Version 0.98p7
+----------------------
+
+   * Fixed opcodes with a third byte-sized immediate argument to not
+     complain if given "byte" on the immediate.
+
+   * Allow `%undef' to remove single-line macros with arguments. This
+     matches the behaviour of #undef in the C preprocessor.
+
+   * 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.
+
+   * Minor cleanups.
+
+   * Went through the list of Katmai instructions and hopefully fixed
+     the (rather few) mistakes in it.
+
+   * (Hopefully) fixed a number of disassembler bugs related to
+     ambiguous instructions (disambiguated by -p) and SSE instructions
+     with REP.
+
+   * Fix for bug reported by Mark Junger: "call dword 0x12345678"
+     should work and may add an OSP (affected CALL, JMP, Jcc).
+
+   * Fix for environments when "stderr" isn't a compile-time constant.
+
+\1f
+File: nasm.info,  Node: Section C.2.45,  Next: Section C.2.46,  Prev: Section C.2.44,  Up: Section C.2
+
+C.2.45. Version 0.98p6
+----------------------
+
+   * 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.
+
+   * 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.
+
+   * Recognize "idt" or "centaur" for the -p option to ndisasm.
+
+   * Changed error messages back to stderr where they belong, but add
+     an -E option to redirect them elsewhere (the DOS shell cannot
+     redirect stderr.)
+
+   * -M option to generate Makefile dependencies (based on code from
+     Alex Verstak.)
+
+   * `%undef' preprocessor directive, and -u option, that undefines a
+     single-line macro.
+
+   * OS/2 Makefile (Mkfiles/Makefile.os2) for Borland under OS/2; from
+     Chuck Crayne.
+
+   * Various minor bugfixes (reported by): - Dangling `%s' in preproc.c
+     (Martin Junker)
+
+   * 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.
+
+   * Updated the License file per agreement with Simon and Jules to
+     include a GPL distribution clause.
+
+\1f
+File: nasm.info,  Node: Section C.2.46,  Next: Section C.2.47,  Prev: Section C.2.45,  Up: Section C.2
+
+C.2.46. Version 0.98p3.7
+------------------------
+
+   * (Hopefully) fixed the canned Makefiles to include the outrdf2 and
+     zoutieee modules.
+
+   * Renamed changes.asm to changed.asm.
+
+\1f
+File: nasm.info,  Node: Section C.2.47,  Next: Section C.2.48,  Prev: Section C.2.46,  Up: Section C.2
+
+C.2.47. Version 0.98p3.6
+------------------------
+
+   * 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.
+
+\1f
+File: nasm.info,  Node: Section C.2.48,  Next: Section C.2.49,  Prev: Section C.2.47,  Up: Section C.2
+
+C.2.48. Version 0.98p3.5
+------------------------
+
+   * 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.
+
+   * 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.
+
+   * 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.
+
+   * Added AMD-only SYSCALL and SYSRET instructions.
+
+   * Make SSE actually work, and add new Katmai MMX instructions.
+
+   * Added a -p (preferred vendor) option to ndisasm so that it can
+     distinguish e.g. Cyrix opcodes also used in SSE. For example:
+
+          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]
+
+   * Added a bunch of Cyrix-specific instructions.
+
+\1f
+File: nasm.info,  Node: Section C.2.49,  Next: Section C.2.50,  Prev: Section C.2.48,  Up: Section C.2
+
+C.2.49. Version 0.98p3.4
+------------------------
+
+   * 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.
+
+   * DOS DJGPP+"Opus Make" Makefile from John S. Fine.
+
+   * changes.asm changes from John S. Fine.
+
+\1f
+File: nasm.info,  Node: Section C.2.50,  Next: Section C.2.51,  Prev: Section C.2.49,  Up: Section C.2
+
+C.2.50. Version 0.98p3.3
+------------------------
+
+   * Patch from Conan Brink to allow nesting of `%rep' directives.
+
+   * 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.
+
+   * Updated changes.asm to include the latest changes.
+
+   * Tried to clean up the <CR>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.
+
+   * We would silently generate broken tools if insns.dat wasn't sorted
+     properly. Change insns.pl so that the order doesn't matter.
+
+   * 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".
+
+\1f
+File: nasm.info,  Node: Section C.2.51,  Next: Section C.2.52,  Prev: Section C.2.50,  Up: Section C.2
+
+C.2.51. Version 0.98p3.2
+------------------------
+
+   * Merged in John S. Fine's changes from his 0.98-J4 prerelease; see
+     http://www.csoft.net/cz/johnfine/
+
+   * 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.
+
+   * Removed BASIC programs from distribution. Get a Perl interpreter
+     instead (see below.)
+
+   * Calling this "pre-release 3.2" rather than "p3-hpa2" because of
+     John's contributions.
+
+   * 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".
+
+\1f
+File: nasm.info,  Node: Section C.2.52,  Next: Section C.2.53,  Prev: Section C.2.51,  Up: Section C.2
+
+C.2.52. Version 0.98p3-hpa
+--------------------------
+
+   * Merged nasm098p3.zip with nasm-0.97.tar.gz to create a fully
+     buildable version for Unix systems (Makefile.in updates, etc.)
+
+   * 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.
+
+   * 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.)
+
+   * MAX_SYMBOL was defined to be 9, but LOADALL286 and LOADALL386 are
+     10 characters long. Now MAX_SYMBOL is derived from insns.dat.
+
+   * 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 http://www.cpan.org/ports/index.html.
+
+\1f
+File: nasm.info,  Node: Section C.2.53,  Next: Section C.2.54,  Prev: Section C.2.52,  Up: Section C.2
+
+C.2.53. Version 0.98 pre-release 3
+----------------------------------
+
+   * added response file support, improved command line handling, new
+     layout help screen
+
+   * fixed limit checking bug, 'OUT byte nn, reg' bug, and a couple of
+     rdoff related bugs, updated Wishlist; 0.98 Prerelease 3.
+
+\1f
+File: nasm.info,  Node: Section C.2.54,  Next: Section C.2.55,  Prev: Section C.2.53,  Up: Section C.2
+
+C.2.54. Version 0.98 pre-release 2
+----------------------------------
+
+   * 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
+
+\1f
+File: nasm.info,  Node: Section C.2.55,  Next: Section C.3,  Prev: Section C.2.54,  Up: Section C.2
+
+C.2.55. Version 0.98 pre-release 1
+----------------------------------
+
+   * Fixed a bug whereby STRUC didn't work at all in RDF.
+
+   * Fixed a problem with group specification in PUBDEFs in OBJ.
+
+   * Improved ease of adding new output formats. Contribution due to
+     Fox Cutter.
+
+   * 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.
+
+   * 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.
+
+   * 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.
+
+   * Fixed a stale-pointer bug in the handling of the NASM environment
+     variable.  Thanks to Thomas McWilliams.
+
+   * ELF had a hard limit on the number of sections which caused
+     segfaults when transgressed. Fixed.
+
+   * Added ability for ndisasm to read from stdin by using `-' as the
+     filename.
+
+   * ndisasm wasn't outputting the TO keyword. Fixed.
+
+   * Fixed error cascade on bogus expression in `%if' - an error in
+     evaluation was causing the entire `%if' to be discarded, thus
+     creating trouble later when the `%else' or `%endif' was
+     encountered.
+
+   * 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.
+
+   * All messages now appear on stdout, as sending them to stderr
+     serves no useful purpose other than to make redirection difficult.
+
+   * Fixed the problem with EQUs pointing to an external symbol - this
+     now generates an error message.
+
+   * Allowed multiple size prefixes to an operand, of which only the
+     first is taken into account.
+
+   * 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.
+
+   * Reformatted a lot of the source code to be more readable. Included
+     'coding.txt' as a guideline for how to format code for
+     contributors.
+
+   * Stopped nested `%reps' causing a panic - they now cause a slightly
+     more friendly error message instead.
+
+   * Fixed floating point constant problems (patch by Pedro Gimeno)
+
+   * Fixed the return value of insn_size() not being checked for -1,
+     indicating an error.
+
+   * Incorporated 3Dnow! instructions.
+
+   * Fixed the 'mov eax, eax + ebx' bug.
+
+   * Fixed the GLOBAL EQU bug in ELF. Released developers release 3.
+
+   * Incorporated John Fine's command line parsing changes
+
+   * Incorporated David Lindauer's OMF debug support
+
+   * Made changes for LCC 4.0 support (`__NASM_CDecl__', removed
+     register size specification warning when sizes agree).
+
+\1f
+File: nasm.info,  Node: Section C.3,  Next: Section C.3.1,  Prev: Section C.2.55,  Up: Appendix C
+
+C.3. NASM 0.9 Series
+====================
+
+Revisions before 0.98.
+
+* Menu:
+
+* Section C.3.1:: Version 0.97 released December 1997
+* Section C.3.2:: Version 0.96 released November 1997
+* Section C.3.3:: Version 0.95 released July 1997
+* Section C.3.4:: Version 0.94 released April 1997
+* Section C.3.5:: Version 0.93 released January 1997
+* Section C.3.6:: Version 0.92 released January 1997
+* Section C.3.7:: Version 0.91 released November 1996
+* Section C.3.8:: Version 0.90 released October 1996
+
+\1f
+File: nasm.info,  Node: Section C.3.1,  Next: Section C.3.2,  Prev: Section C.3,  Up: Section C.3
+
+C.3.1. Version 0.97 released December 1997
+------------------------------------------
+
+   * This was entirely a bug-fix release to 0.96, which seems to have
+     got cursed. Silly me.
+
+   * Fixed stupid mistake in OBJ which caused `MOV EAX,<constant>' to
+     fail.  Caused by an error in the `MOV EAX,<segment>' support.
+
+   * ndisasm hung at EOF when compiled with lcc on Linux because lcc on
+     Linux somehow breaks feof(). ndisasm now does not rely on feof().
+
+   * A heading in the documentation was missing due to a markup error
+     in the indexing. Fixed.
+
+   * 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,...'
+
+   * 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.
+
+   * Added internal.doc back in to the distribution archives - it was
+     missing in 0.96 *blush*
+
+   * Fixed bug causing 0.96 to be unable to assemble its own test files,
+     specifically objtest.asm. *blush again*
+
+   * Fixed seg-faults and bogus error messages caused by mismatching
+     `%rep' and `%endrep' within multi-line macro definitions.
+
+   * Fixed a problem with buffer overrun in OBJ, which was causing
+     corruption at ends of long PUBDEF records.
+
+   * Separated DOS archives into main-program and documentation to
+     reduce download size.
+
+\1f
+File: nasm.info,  Node: Section C.3.2,  Next: Section C.3.3,  Prev: Section C.3.1,  Up: Section C.3
+
+C.3.2. Version 0.96 released November 1997
+------------------------------------------
+
+   * 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.
+
+   * 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.
+
+   * 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.
+
+   * 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.
+
+   * 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'.
+
+   * 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.
+
+   * 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.
+
+   * Fixed some buffer overrun problems with large OBJ output files.
+     Thanks to DJ Delorie for the bug report and fix.
+
+   * Made preprocess-only mode actually listen to the `%line' markers
+     as it prints them, so that it can report errors more sanely.
+
+   * Re-designed the evaluator to keep more sensible track of
+     expressions involving forward references: can now cope with
+     previously-nightmare situations such as:
+
+       mov ax,foo | bar
+       foo equ 1
+       bar equ 2
+
+   * Added the ALIGN and ALIGNB standard macros.
+
+   * Added PIC support in ELF: use of WRT to obtain the four extra
+     relocation types needed.
+
+   * Added the ability for output file formats to define their own
+     extensions to the GLOBAL, COMMON and EXTERN directives.
+
+   * Implemented common-variable alignment, and global-symbol type and
+     size declarations, in ELF.
+
+   * Implemented NEAR and FAR keywords for common variables, plus
+     far-common element size specification, in OBJ.
+
+   * Added a feature whereby EXTERNs and COMMONs in OBJ can be given a
+     default WRT specification (either a segment or a group).
+
+   * Transformed the Unix NASM archive into an auto-configuring package.
+
+   * 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.
+
+   * Added the ability, in OBJ format, to deal with `MOV EAX,<segment>'
+     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.
+
+   * Added the ability to specify sections' alignment requirements in
+     Win32 object files and pure binary files.
+
+   * Added preprocess-time expression evaluation: the `%assign' (and
+     `%iassign') directive and the bare `%if' (and `%elif')
+     conditional. Added relational operators to the evaluator, for use
+     only in `%if' constructs: the standard relationals = < > <= >= <>
+     (and C-like synonyms == and !=) plus low-precedence logical
+     operators &&, ^^ and ||.
+
+   * Added a preprocessor repeat construct: `%rep' / `%exitrep' /
+     `%endrep'.
+
+   * Added the __FILE__ and __LINE__ standard macros.
+
+   * Added a sanity check for number constants being greater than
+     0xFFFFFFFF.  The warning can be disabled.
+
+   * Added the %0 token whereby a variadic multi-line macro can tell
+     how many parameters it's been given in a specific invocation.
+
+   * Added `%rotate', allowing multi-line macro parameters to be cycled.
+
+   * Added the `*' option for the maximum parameter count on multi-line
+     macros, allowing them to take arbitrarily many parameters.
+
+   * Added the ability for the user-level forms of EXTERN, GLOBAL and
+     COMMON to take more than one argument.
+
+   * Added the IMPORT and EXPORT directives in OBJ format, to deal with
+     Windows DLLs.
+
+   * Added some more preprocessor `%if' constructs: `%ifidn' /
+     `%ifidni' (exact textual identity), and `%ifid' / `%ifnum' /
+     `%ifstr' (token type testing).
+
+   * 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).
+
+   * Added NetBSD/FreeBSD/OpenBSD's variant of a.out format, complete
+     with PIC shared library features.
+
+   * 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.
+
+   * 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.
+
+   * Added the ability for a variable to be declared as EXTERN multiple
+     times, and the subsequent definitions are just ignored.
+
+   * We now allow instruction prefixes (CS, DS, LOCK, REPZ etc) to be
+     alone on a line (without a following instruction).
+
+   * Improved sanity checks on whether the arguments to EXTERN, GLOBAL
+     and COMMON are valid identifiers.
+
+   * 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.
+
+   * ndisasm forgot to check whether the input file had been
+     successfully opened. Now it does. Doh!
+
+   * Added the Cyrix extensions to the MMX instruction set.
+
+   * 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.
+
+   * Added support for the PharLap OMF extension for 4096-byte segment
+     alignment.
+
diff --git a/doc/info/nasm.info-3 b/doc/info/nasm.info-3
new file mode 100644 (file)
index 0000000..f70d131
--- /dev/null
@@ -0,0 +1,1284 @@
+This is nasm.info, produced by makeinfo version 4.13 from nasmdoc.texi.
+
+INFO-DIR-SECTION Programming
+START-INFO-DIR-ENTRY
+* NASM: (nasm).                The Netwide Assembler for x86.
+END-INFO-DIR-ENTRY
+
+   This file documents NASM, the Netwide Assembler: an assembler
+targetting the Intel x86 series of processors, with portable source.
+
+   Copyright 1996-2009 The NASM Development Team
+
+   This document is redistributable under the license given in the file
+"COPYING" distributed in the NASM archive.
+
+\1f
+File: nasm.info,  Node: Section C.3.3,  Next: Section C.3.4,  Prev: Section C.3.2,  Up: Section C.3
+
+C.3.3. Version 0.95 released July 1997
+--------------------------------------
+
+   * 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.
+
+   * Added makefiles (for NASM and the RDF tools) to build Win32
+     console apps under Symantec C++. Donated by Mark Junker.
+
+   * 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.
+
+   * 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.
+
+   * Added `@' to the list of valid characters to begin an identifier
+     with.
+
+   * Documentary changes, notably the addition of the `Common Problems'
+     section in nasm.doc.
+
+   * Fixed a bug relating to 32-bit PC-relative fixups in OBJ.
+
+   * Fixed a bug in perm_copy() in labels.c which was causing
+     exceptions in cleanup_labels() on some systems.
+
+   * Positivity sanity check in TIMES argument changed from a warning
+     to an error following a further complaint.
+
+   * Changed the acceptable limits on byte and word operands to allow
+     things like `~10111001b' to work.
+
+   * Fixed a major problem in the preprocessor which caused seg-faults
+     if macro definitions contained blank lines or comment-only lines.
+
+   * Fixed inadequate error checking on the commas separating the
+     arguments to `db', `dw' etc.
+
+   * Fixed a crippling bug in the handling of macros with operand
+     counts defined with a `+' modifier.
+
+   * 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.
+
+   * Removed [INC] and [INCLUDE] support for good, since they were
+     obsolete anyway.
+
+   * 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.
+
+   * Added, tentatively, OS/2 object file support (as a minor variant
+     on OBJ).
+
+   * Updates to Fox Cutter's Borland C makefile, Makefile.bc2.
+
+   * Removed a spurious second fclose() on the output file.
+
+   * Added the `-s' command line option to redirect all messages which
+     would go to stderr (errors, help text) to stdout instead.
+
+   * Added the `-w' command line option to selectively suppress some
+     classes of assembly warning messages.
+
+   * Added the `-p' pre-include and `-d' pre-define command-line
+     options.
+
+   * Added an include file search path: the `-i' command line option.
+
+   * Fixed a silly little preprocessor bug whereby starting a line with
+     a `%!'  environment-variable reference caused an `unknown
+     directive' error.
+
+   * Added the long-awaited listing file support: the `-l' command line
+     option.
+
+   * 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.
+
+   * Added the NASM environment variable.
+
+   * 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.
+
+   * Added `return 0;' to test/objlink.c to prevent compiler warnings.
+
+   * Added the __NASM_MAJOR__ and __NASM_MINOR__ standard defines.
+
+   * Added an alternative memory-reference syntax in which prefixing an
+     operand with `&' is equivalent to enclosing it in square brackets,
+     at the request of Fox Cutter.
+
+   * Errors in pass two now cause the program to return a non-zero
+     error code, which they didn't before.
+
+   * 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.
+
+   * 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.
+
+\1f
+File: nasm.info,  Node: Section C.3.4,  Next: Section C.3.5,  Prev: Section C.3.3,  Up: Section C.3
+
+C.3.4. Version 0.94 released April 1997
+---------------------------------------
+
+   * Major item: added the macro processor.
+
+   * 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.
+
+   * Fixed two more stupid bugs in ELF, which were causing `ld' to
+     continue to seg-fault in a lot of non-trivial cases.
+
+   * Fixed a seg-fault in the label manager.
+
+   * Stopped FBLD and FBSTP from _requiring_ the TWORD keyword, which
+     is the only option for BCD loads/stores in any case.
+
+   * 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.
+
+   * 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...
+
+   * Another minor phase error (insofar as a phase error can _ever_ be
+     minor) fixed, this one occurring in code of the form
+
+       rol ax,forward_reference
+       forward_reference equ 1
+
+   * 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).
+
+   * Added Watcom C makefiles, and misc/pmw.bat, donated by Dominik
+     Behr.
+
+   * Added the INCBIN pseudo-opcode.
+
+   * 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.
+
+   * Fixed a bug in OBJ format, which caused incorrect object records
+     to be output when absolute labels were made global.
+
+   * Updates to RDOFF subdirectory, and changes to outrdf.c.
+
+\1f
+File: nasm.info,  Node: Section C.3.5,  Next: Section C.3.6,  Prev: Section C.3.4,  Up: Section C.3
+
+C.3.5. Version 0.93 released January 1997
+-----------------------------------------
+
+This release went out in a great hurry after semi-crippling bugs were
+found in 0.92.
+
+   * Really _did_ fix the stack overflows this time. *blush*
+
+   * 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.
+
+   * 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.
+
+   * Included a new Borland C makefile, Makefile.bc2, donated by Fox
+     Cutter <lmb@comtch.iea.com>.
+
+\1f
+File: nasm.info,  Node: Section C.3.6,  Next: Section C.3.7,  Prev: Section C.3.5,  Up: Section C.3
+
+C.3.6. Version 0.92 released January 1997
+-----------------------------------------
+
+   * The FDIVP/FDIVRP and FSUBP/FSUBRP pairs had been inverted: this
+     was fixed.  This also affected the LCC driver.
+
+   * Fixed a bug regarding 32-bit effective addresses of the form
+     `[other_register+ESP]'.
+
+   * Documentary changes, notably documentation of the fact that
+     Borland Win32 compilers use `obj' rather than `win32' object
+     format.
+
+   * Fixed the COMENT record in OBJ files, which was formatted
+     incorrectly.
+
+   * Fixed a bug causing segfaults in large RDF files.
+
+   * OBJ format now strips initial periods from segment and group
+     definitions, in order to avoid complications with the local label
+     syntax.
+
+   * Fixed a bug in disassembling far calls and jumps in NDISASM.
+
+   * Added support for user-defined sections in COFF and ELF files.
+
+   * Compiled the DOS binaries with a sensible amount of stack, to
+     prevent stack overflows on any arithmetic expression containing
+     parentheses.
+
+   * Fixed a bug in handling of files that do not terminate in a
+     newline.
+
+\1f
+File: nasm.info,  Node: Section C.3.7,  Next: Section C.3.8,  Prev: Section C.3.6,  Up: Section C.3
+
+C.3.7. Version 0.91 released November 1996
+------------------------------------------
+
+   * Loads of bug fixes.
+
+   * Support for RDF added.
+
+   * Support for DBG debugging format added.
+
+   * Support for 32-bit extensions to Microsoft OBJ format added.
+
+   * Revised for Borland C: some variable names changed, makefile added.
+
+   * LCC support revised to actually work.
+
+   * JMP/CALL NEAR/FAR notation added.
+
+   * `a16', `o16', `a32' and `o32' prefixes added.
+
+   * Range checking on short jumps implemented.
+
+   * MMX instruction support added.
+
+   * Negative floating point constant support added.
+
+   * Memory handling improved to bypass 64K barrier under DOS.
+
+   * `$' prefix to force treatment of reserved words as identifiers
+     added.
+
+   * Default-size mechanism for object formats added.
+
+   * Compile-time configurability added.
+
+   * `#', `@', `~' and c{?} are now valid characters in labels.
+
+   * `-e' and `-k' options in NDISASM added.
+
+\1f
+File: nasm.info,  Node: Section C.3.8,  Prev: Section C.3.7,  Up: Section C.3
+
+C.3.8. Version 0.90 released October 1996
+-----------------------------------------
+
+First release version. First support for object file output. Other
+changes from previous version (0.3x) too numerous to document.
+
+\1f
+File: nasm.info,  Node: Index,  Up: Top
+
+Index
+*****
+
+* Menu:
+
+* `!' operator, unary                      (1): Section 3.5.7.
+* `!=' operator                            (1): Section 4.4.4.
+* `$$' token                               (1): Section 3.5.
+* `$$' token                               (2): Section 7.9.3.
+* `$', Here token                          (1): Section 3.5.
+* `$', prefix                              (1): Section 3.1.
+* `$', prefix                              (2): Section 3.4.1.
+* `$', prefix                              (3): Section 7.13.2.
+* `%' operator                             (1): Section 3.5.6.
+* `%!'                                     (1): Section 4.10.2.
+* `%$' and `%$$' prefixes                  (1): Section 4.7.2.
+* `%%' operator                            (1): Section 3.5.6.
+* `%%' operator                            (2): Section 4.3.3.
+* `%+'                                     (1): Section 4.1.4.
+* `%?'                                     (1): Section 4.1.5.
+* `%??'                                    (1): Section 4.1.5.
+* `%['                                     (1): Section 4.1.3.
+* `&' operator                             (1): Section 3.5.3.
+* `&&' operator                            (1): Section 4.4.4.
+* `*' operator                             (1): Section 3.5.6.
+* `+' modifier                             (1): Section 4.3.4.
+* `+' operator, binary                     (1): Section 3.5.5.
+* `+' operator, unary                      (1): Section 3.5.7.
+* `-' operator, binary                     (1): Section 3.5.5.
+* `-' operator, unary                      (1): Section 3.5.7.
+* `..@' symbol prefix                      (1): Section 3.9.
+* `..@' symbol prefix                      (2): Section 4.3.3.
+* `/' operator                             (1): Section 3.5.6.
+* `//' operator                            (1): Section 3.5.6.
+* `<' operator                             (1): Section 4.4.4.
+* `<<' operator                            (1): Section 3.5.4.
+* `<=' operator                            (1): Section 4.4.4.
+* `<>' operator                            (1): Section 4.4.4.
+* `=' operator                             (1): Section 4.4.4.
+* `==' operator                            (1): Section 4.4.4.
+* `>' operator                             (1): Section 4.4.4.
+* `>=' operator                            (1): Section 4.4.4.
+* `>>' operator                            (1): Section 3.5.4.
+* `?' MASM syntax                          (1): Section 3.2.2.
+* `^' operator                             (1): Section 3.5.2.
+* `^^' operator                            (1): Section 4.4.4.
+* `|' operator                             (1): Section 3.5.1.
+* `||' operator                            (1): Section 4.4.4.
+* `~' operator                             (1): Section 3.5.7.
+* `%0' parameter count                     (1): Section 4.3.5.
+* `%0' parameter count                     (2): Section 4.3.6.
+* `%+1' and `%-1' syntax                   (1): Section 4.3.9.
+* 16-bit mode, versus 32-bit mode          (1): Section 6.1.
+* 64-bit displacement                      (1): Section 11.2.
+* 64-bit immediate                         (1): Section 11.2.
+* `-a' option                              (1): Section 2.1.21.
+* `-a' option                              (2): Section A.3.3.
+* `A16'                                    (1): Section 3.1.
+* `a16'                                    (1): Section 10.3.
+* `A32'                                    (1): Section 3.1.
+* `a32'                                    (1): Section 10.3.
+* `A64'                                    (1): Section 3.1.
+* `a64'                                    (1): Section 10.3.
+* `a86'                                    (1): Section 1.1.1.
+* `a86'                                    (2): Section 2.2.
+* `a86'                                    (3): Section 2.2.2.
+* `a86'                                    (4): Section 2.2.6.
+* `ABS'                                    (1): Section 3.3.
+* `ABSOLUTE'                               (1): Section 6.4.
+* `ABSOLUTE'                               (2): Section 7.4.1.
+* addition                                 (1): Section 3.5.5.
+* addressing, mixed-size                   (1): Section 10.2.
+* address-size prefixes                    (1): Section 3.1.
+* algebra                                  (1): Section 3.3.
+* `ALIGN'                                  (1): Section 4.11.12.
+* `ALIGN'                                  (2): Section 5.2.
+* `ALIGN'                                  (3): Section 7.1.2.
+* `ALIGN'                                  (4): Section 7.4.1.
+* `ALIGN', smart                           (1): Section 5.2.
+* `ALIGNB'                                 (1): Section 4.11.12.
+* alignment, in `bin' sections             (1): Section 7.1.2.
+* alignment, in `elf' sections             (1): Section 7.9.2.
+* alignment, in `obj' sections             (1): Section 7.4.1.
+* alignment, in `win32' sections           (1): Section 7.5.1.
+* alignment, of `elf' common variables     (1): Section 7.9.6.
+* `ALIGNMODE'                              (1): Section 5.2.
+* `__ALIGNMODE__'                          (1): Section 5.2.
+* `ALINK'                                  (1): Section 8.1.1.
+* `alink.sourceforge.net'                  (1): Section 8.1.1.
+* `all'                                    (1): Section 2.1.24.
+* `alloc'                                  (1): Section 7.9.2.
+* alternate register names                 (1): Section 5.1.
+* `alt.lang.asm'                           (1): Section 1.1.1.
+* `altreg'                                 (1): Section 5.1.
+* ambiguity                                (1): Section 2.2.3.
+* `a.out', BSD version                     (1): Section 7.11.
+* `a.out', Linux version                   (1): Section 7.10.
+* `aout'                                   (1): Section 7.10.
+* `aoutb'                                  (1): Section 7.11.
+* `aoutb'                                  (2): Section 9.2.
+* `%arg'                                   (1): Section 4.8.1.
+* `arg'                                    (1): Section 8.4.5.
+* `arg'                                    (2): Section 9.1.4.
+* `as86'                                   (1): Section 1.1.1.
+* `as86'                                   (2): Section 7.12.
+* assembler directives                     (1): Chapter 6.
+* assembly-time options                    (1): Section 2.1.18.
+* `%assign'                                (1): Section 4.1.7.
+* `ASSUME'                                 (1): Section 2.2.4.
+* `AT'                                     (1): Section 4.11.11.
+* Autoconf                                 (1): Section 1.3.2.
+* `autoexec.bat'                           (1): Section 1.3.1.
+* `auto-sync'                              (1): Section A.3.3.
+* `-b'                                     (1): Section A.3.
+* bin                                      (1): Section 2.1.2.
+* bin                                      (2): Section 7.1.
+* bin, multisection                        (1): Section 7.1.3.
+* binary                                   (1): Section 3.4.1.
+* binary files                             (1): Section 3.2.3.
+* bit shift                                (1): Section 3.5.4.
+* `BITS'                                   (1): Section 6.1.
+* `BITS'                                   (2): Section 7.1.
+* `__BITS__'                               (1): Section 4.11.5.
+* bitwise AND                              (1): Section 3.5.3.
+* bitwise OR                               (1): Section 3.5.1.
+* bitwise XOR                              (1): Section 3.5.2.
+* block IFs                                (1): Section 4.7.5.
+* boot loader                              (1): Section 7.1.
+* boot sector                              (1): Section 12.1.3.
+* Borland, Pascal                          (1): Section 8.5.
+* Borland, Win32 compilers                 (1): Section 7.4.
+* braces, after `%' sign                   (1): Section 4.3.8.
+* braces, around macro parameters          (1): Section 4.3.
+* BSD                                      (1): Section 9.2.
+* `.bss'                                   (1): Section 7.9.2.
+* `.bss'                                   (2): Section 7.10.
+* `.bss'                                   (3): Section 7.11.
+* `.bss'                                   (4): Section 7.12.
+* `.bss'                                   (5): Section 7.13.
+* bugs                                     (1): Section 12.2.
+* `bugtracker'                             (1): Section 12.2.
+* `BYTE'                                   (1): Section 12.1.1.
+* C calling convention                     (1): Section 8.4.3.
+* C calling convention                     (2): Section 9.1.2.
+* C symbol names                           (1): Section 8.4.1.
+* `c16.mac'                                (1): Section 8.4.5.
+* `c16.mac'                                (2): Section 8.5.3.
+* `c32.mac'                                (1): Section 9.1.4.
+* `CALL FAR'                               (1): Section 3.6.
+* case sensitivity                         (1): Section 2.2.1.
+* case sensitivity                         (2): Section 4.1.1.
+* case sensitivity                         (3): Section 4.1.2.
+* case sensitivity                         (4): Section 4.1.7.
+* case sensitivity                         (5): Section 4.3.
+* case sensitivity                         (6): Section 4.3.1.
+* case sensitivity                         (7): Section 4.4.5.
+* case sensitivity                         (8): Section 7.4.3.
+* changing sections                        (1): Section 6.3.
+* character constant                       (1): Section 3.2.1.
+* character constant                       (2): Section 3.4.3.
+* character strings                        (1): Section 3.4.2.
+* circular references                      (1): Section 4.1.1.
+* `CLASS'                                  (1): Section 7.4.1.
+* `%clear'                                 (1): Section 4.11.
+* `coff'                                   (1): Section 7.7.
+* colon                                    (1): Section 3.1.
+* `.COM'                                   (1): Section 7.1.
+* `.COM'                                   (2): Section 8.2.
+* command-line                             (1): Section 2.1.
+* command-line                             (2): Chapter 7.
+* commas in macro parameters               (1): Section 4.3.4.
+* `.comment'                               (1): Section 7.9.2.
+* `COMMON'                                 (1): Section 6.7.
+* `COMMON'                                 (2): Section 7.4.1.
+* `COMMON', `elf' extensions to            (1): Section 7.9.6.
+* `COMMON', `obj' extensions to            (1): Section 7.4.8.
+* Common Object File Format                (1): Section 7.7.
+* common variables                         (1): Section 6.7.
+* common variables, alignment in `elf'     (1): Section 7.9.6.
+* common variables, element size           (1): Section 7.4.8.
+* `comp.lang.asm.x86'                      (1): Section 1.1.1.
+* `comp.lang.asm.x86'                      (2): Section 1.2.
+* `comp.os.msdos.programmer'               (1): Section 8.3.
+* concatenating macro parameters           (1): Section 4.3.8.
+* concatenating strings                    (1): Section 4.2.1.
+* condition codes as macro parameters      (1): Section 4.3.9.
+* conditional assembly                     (1): Section 4.4.
+* conditional jumps                        (1): Section 12.1.2.
+* conditional-return macro                 (1): Section 4.3.9.
+* `configure'                              (1): Section 1.3.2.
+* constants                                (1): Section 3.4.
+* context stack                            (1): Section 4.7.
+* context stack                            (2): Section 4.7.5.
+* context-local labels                     (1): Section 4.7.2.
+* context-local single-line macros         (1): Section 4.7.3.
+* counting macro parameters                (1): Section 4.3.6.
+* `CPU'                                    (1): Section 6.8.
+* `CPUID'                                  (1): Section 3.4.3.
+* creating contexts                        (1): Section 4.7.1.
+* critical expression                      (1): Section 3.2.2.
+* critical expression                      (2): Section 3.8.
+* critical expression                      (3): Section 4.1.7.
+* critical expression                      (4): Section 6.4.
+* `-D' option                              (1): Section 2.1.18.
+* `-d' option                              (1): Section 2.1.18.
+* daily development snapshots              (1): Section 1.2.
+* `.data'                                  (1): Section 7.9.2.
+* `.data'                                  (2): Section 7.10.
+* `.data'                                  (3): Section 7.11.
+* `.data'                                  (4): Section 7.12.
+* `.data'                                  (5): Section 7.13.
+* `_DATA'                                  (1): Section 8.4.2.
+* `data'                                   (1): Section 7.9.5.
+* `data'                                   (2): Section 7.13.3.
+* data structure                           (1): Section 8.4.4.
+* data structure                           (2): Section 9.1.3.
+* `__DATE__'                               (1): Section 4.11.7.
+* `__DATE_NUM__'                           (1): Section 4.11.7.
+* `DB'                                     (1): Section 3.2.
+* `DB'                                     (2): Section 3.2.1.
+* `DB'                                     (3): Section 3.4.4.
+* `DB'                                     (4): Section 3.4.6.
+* `dbg'                                    (1): Section 7.14.
+* `DD'                                     (1): Section 3.2.
+* `DD'                                     (2): Section 3.2.1.
+* `DD'                                     (3): Section 3.4.4.
+* `DD'                                     (4): Section 3.4.6.
+* debug information                        (1): Section 2.1.12.
+* debug information format                 (1): Section 2.1.11.
+* declaring structures                     (1): Section 4.11.10.
+* `DEFAULT'                                (1): Section 6.2.
+* `default'                                (1): Section 7.9.5.
+* default macro parameters                 (1): Section 4.3.5.
+* default name                             (1): Chapter 7.
+* default-`WRT' mechanism                  (1): Section 7.4.7.
+* `%define'                                (1): Section 2.1.18.
+* `%define'                                (2): Section 4.1.1.
+* defining sections                        (1): Section 6.3.
+* `%defstr'                                (1): Section 4.1.8.
+* `%deftok'                                (1): Section 4.1.9.
+* `%depend'                                (1): Section 4.6.3.
+* design goals                             (1): Section 2.2.2.
+* DevPac                                   (1): Section 3.2.3.
+* DevPac                                   (2): Section 3.9.
+* disabling listing expansion              (1): Section 4.3.10.
+* division                                 (1): Section 3.5.6.
+* DJGPP                                    (1): Section 7.7.
+* DJGPP                                    (2): Chapter 9.
+* `djlink'                                 (1): Section 8.1.1.
+* DLL symbols, exporting                   (1): Section 7.4.5.
+* DLL symbols, importing                   (1): Section 7.4.4.
+* `DO'                                     (1): Section 3.2.
+* `DO'                                     (2): Section 3.2.1.
+* `DO'                                     (3): Section 3.4.4.
+* `DO'                                     (4): Section 3.4.6.
+* DOS                                      (1): Section 1.3.1.
+* DOS                                      (2): Section 2.1.14.
+* DOS                                      (3): Section 2.1.15.
+* DOS source archive                       (1): Section 1.3.1.
+* `DQ'                                     (1): Section 3.2.
+* `DQ'                                     (2): Section 3.2.1.
+* `DQ'                                     (3): Section 3.4.4.
+* `DQ'                                     (4): Section 3.4.6.
+* `.drectve'                               (1): Section 7.5.1.
+* `DT'                                     (1): Section 3.2.
+* `DT'                                     (2): Section 3.2.1.
+* `DT'                                     (3): Section 3.4.4.
+* `DT'                                     (4): Section 3.4.6.
+* `DUP'                                    (1): Section 2.2.7.
+* `DUP'                                    (2): Section 3.2.5.
+* `DW'                                     (1): Section 3.2.
+* `DW'                                     (2): Section 3.2.1.
+* `DW'                                     (3): Section 3.4.4.
+* `DW'                                     (4): Section 3.4.6.
+* `DWORD'                                  (1): Section 3.1.
+* `DY'                                     (1): Section 3.2.
+* `DY'                                     (2): Section 3.2.1.
+* `DY'                                     (3): Section 3.4.4.
+* `-E' option                              (1): Section 2.1.20.
+* `-e' option                              (1): Section 2.1.20.
+* `-e' option                              (2): Section A.3.4.
+* effective addresses                      (1): Section 3.1.
+* effective addresses                      (2): Section 3.3.
+* element size, in common variables        (1): Section 7.4.8.
+* ELF                                      (1): Section 7.9.
+* ELF, shared libraries                    (1): Section 7.9.3.
+* ELF, 16-bit code and                     (1): Section 7.9.7.
+* elf, debug formats and                   (1): Section 7.9.8.
+* `elf32'                                  (1): Section 7.9.
+* `elf64'                                  (1): Section 7.9.
+* `%elif'                                  (1): Section 4.4.
+* `%elif'                                  (2): Section 4.4.4.
+* `%elifctx'                               (1): Section 4.4.3.
+* `%elifdef'                               (1): Section 4.4.1.
+* `%elifempty'                             (1): Section 4.4.8.
+* `%elifid'                                (1): Section 4.4.6.
+* `%elifidn'                               (1): Section 4.4.5.
+* `%elifidni'                              (1): Section 4.4.5.
+* `%elifmacro'                             (1): Section 4.4.2.
+* `%elifn'                                 (1): Section 4.4.
+* `%elifn'                                 (2): Section 4.4.4.
+* `%elifnctx'                              (1): Section 4.4.3.
+* `%elifndef'                              (1): Section 4.4.1.
+* `%elifnempty'                            (1): Section 4.4.8.
+* `%elifnid'                               (1): Section 4.4.6.
+* `%elifnidn'                              (1): Section 4.4.5.
+* `%elifnidni'                             (1): Section 4.4.5.
+* `%elifnmacro'                            (1): Section 4.4.2.
+* `%elifnnum'                              (1): Section 4.4.6.
+* `%elifnstr'                              (1): Section 4.4.6.
+* `%elifntoken'                            (1): Section 4.4.7.
+* `%elifnum'                               (1): Section 4.4.6.
+* `%elifstr'                               (1): Section 4.4.6.
+* `%eliftoken'                             (1): Section 4.4.7.
+* `%else'                                  (1): Section 4.4.
+* `endproc'                                (1): Section 8.4.5.
+* `endproc'                                (2): Section 9.1.4.
+* `%endrep'                                (1): Section 4.5.
+* `ENDSTRUC'                               (1): Section 4.11.10.
+* `ENDSTRUC'                               (2): Section 6.4.
+* environment                              (1): Section 2.1.28.
+* `EQU'                                    (1): Section 3.2.
+* `EQU'                                    (2): Section 3.2.4.
+* `%error'                                 (1): Section 4.9.
+* `error'                                  (1): Section 2.1.24.
+* error messages                           (1): Section 2.1.14.
+* error messages                           (2): Section 2.1.15.
+* error reporting format                   (1): Section 2.1.13.
+* escape sequences                         (1): Section 3.4.2.
+* `EVEN'                                   (1): Section 4.11.12.
+* exact matches                            (1): Section 4.3.11.
+* `.EXE'                                   (1): Section 7.4.
+* `.EXE'                                   (2): Section 8.1.
+* `EXE2BIN'                                (1): Section 8.2.2.
+* `EXE_begin'                              (1): Section 8.1.2.
+* `exebin.mac'                             (1): Section 8.1.2.
+* `exec'                                   (1): Section 7.9.2.
+* Executable and Linkable Format           (1): Section 7.9.
+* `EXE_end'                                (1): Section 8.1.2.
+* `EXE_stack'                              (1): Section 8.1.2.
+* `%exitmacro'                             (1): Section 4.3.12.
+* `%exitrep'                               (1): Section 4.5.
+* `EXPORT'                                 (1): Section 7.4.5.
+* `export'                                 (1): Section 7.13.3.
+* exporting symbols                        (1): Section 6.6.
+* expressions                              (1): Section 2.1.20.
+* expressions                              (2): Section 3.5.
+* extension                                (1): Section 2.1.1.
+* extension                                (2): Chapter 7.
+* `EXTERN'                                 (1): Section 6.5.
+* `EXTERN', `obj' extensions to            (1): Section 7.4.7.
+* `EXTERN', `rdf' extensions to            (1): Section 7.13.4.
+* extracting substrings                    (1): Section 4.2.3.
+* `-F' option                              (1): Section 2.1.11.
+* `-f' option                              (1): Section 2.1.2.
+* `-f' option                              (2): Chapter 7.
+* far call                                 (1): Section 2.2.5.
+* far common variables                     (1): Section 7.4.8.
+* far pointer                              (1): Section 3.6.
+* `FARCODE'                                (1): Section 8.4.5.
+* `FARCODE'                                (2): Section 8.5.3.
+* `%fatal'                                 (1): Section 4.9.
+* `__FILE__'                               (1): Section 4.11.4.
+* `FLAT'                                   (1): Section 7.4.1.
+* flat memory model                        (1): Chapter 9.
+* flat-form binary                         (1): Section 7.1.
+* `FLOAT'                                  (1): Section 6.9.
+* `__FLOAT__'                              (1): Section 6.9.
+* `__float128h__'                          (1): Section 3.4.6.
+* `__float128l__'                          (1): Section 3.4.6.
+* `__float16__'                            (1): Section 3.4.6.
+* `__float32__'                            (1): Section 3.4.6.
+* `__float64__'                            (1): Section 3.4.6.
+* `__float8__'                             (1): Section 3.4.6.
+* `__float80e__'                           (1): Section 3.4.6.
+* `__float80m__'                           (1): Section 3.4.6.
+* `__FLOAT_DAZ__'                          (1): Section 6.9.
+* `float-denorm'                           (1): Section 2.1.24.
+* floating-point, constants                (1): Section 3.4.6.
+* floating-point, constants                (2): Section 6.9.
+* floating-point, packed BCD constants     (1): Section 3.4.7.
+* floating-point                           (1): Section 2.2.6.
+* floating-point                           (2): Section 3.1.
+* floating-point                           (3): Section 3.2.1.
+* floating-point                           (4): Section 3.4.6.
+* `float-overflow'                         (1): Section 2.1.24.
+* `__FLOAT_ROUND__'                        (1): Section 6.9.
+* `float-toolong'                          (1): Section 2.1.24.
+* `float-underflow'                        (1): Section 2.1.24.
+* `follows='                               (1): Section 7.1.3.
+* format-specific directives               (1): Chapter 6.
+* frame pointer                            (1): Section 8.4.3.
+* frame pointer                            (2): Section 8.5.1.
+* frame pointer                            (3): Section 9.1.2.
+* FreeBSD                                  (1): Section 7.11.
+* FreeBSD                                  (2): Section 9.2.
+* FreeLink                                 (1): Section 8.1.1.
+* `ftp.simtel.net'                         (1): Section 8.1.1.
+* `function'                               (1): Section 7.9.5.
+* `function'                               (2): Section 7.13.3.
+* functions, C calling convention          (1): Section 8.4.3.
+* functions, C calling convention          (2): Section 9.1.2.
+* functions, Pascal calling convention     (1): Section 8.5.1.
+* `-g' option                              (1): Section 2.1.12.
+* `gas'                                    (1): Section 1.1.1.
+* `gcc'                                    (1): Section 1.1.1.
+* `GLOBAL'                                 (1): Section 6.6.
+* `GLOBAL', `aoutb' extensions to          (1): Section 7.9.5.
+* `GLOBAL', `elf' extensions to            (1): Section 7.9.5.
+* `GLOBAL', `rdf' extensions to            (1): Section 7.13.3.
+* global offset table                      (1): Section 9.2.
+* `_GLOBAL_OFFSET_TABLE_'                  (1): Section 7.9.3.
+* `gnu-elf-extensions'                     (1): Section 2.1.24.
+* `..got'                                  (1): Section 7.9.3.
+* `GOT' relocations                        (1): Section 9.2.3.
+* GOT                                      (1): Section 7.9.3.
+* GOT                                      (2): Section 9.2.
+* `..gotoff'                               (1): Section 7.9.3.
+* `GOTOFF' relocations                     (1): Section 9.2.2.
+* `..gotpc'                                (1): Section 7.9.3.
+* `GOTPC' relocations                      (1): Section 9.2.1.
+* `..gottpoff'                             (1): Section 7.9.4.
+* graphics                                 (1): Section 3.2.3.
+* greedy macro parameters                  (1): Section 4.3.4.
+* `GROUP'                                  (1): Section 7.4.2.
+* groups                                   (1): Section 3.6.
+* `-h'                                     (1): Section A.3.
+* hexadecimal                              (1): Section 3.4.1.
+* `hidden'                                 (1): Section 7.9.5.
+* hybrid syntaxes                          (1): Section 2.2.2.
+* `-I' option                              (1): Section 2.1.16.
+* `-i' option                              (1): Section 2.1.16.
+* `-i' option                              (2): Section A.3.3.
+* `%iassign'                               (1): Section 4.1.7.
+* `%idefine'                               (1): Section 4.1.1.
+* `%idefstr'                               (1): Section 4.1.8.
+* `%ideftok'                               (1): Section 4.1.9.
+* `IEND'                                   (1): Section 4.11.11.
+* `%if'                                    (1): Section 4.4.
+* `%if'                                    (2): Section 4.4.4.
+* `%ifctx'                                 (1): Section 4.4.3.
+* `%ifctx'                                 (2): Section 4.7.5.
+* `%ifdef'                                 (1): Section 4.4.1.
+* `%ifempty'                               (1): Section 4.4.8.
+* `%ifid'                                  (1): Section 4.4.6.
+* `%ifidn'                                 (1): Section 4.4.5.
+* `%ifidni'                                (1): Section 4.4.5.
+* `%ifmacro'                               (1): Section 4.4.2.
+* `%ifn'                                   (1): Section 4.4.
+* `%ifn'                                   (2): Section 4.4.4.
+* `%ifnctx'                                (1): Section 4.4.3.
+* `%ifndef'                                (1): Section 4.4.1.
+* `%ifnempty'                              (1): Section 4.4.8.
+* `%ifnid'                                 (1): Section 4.4.6.
+* `%ifnidn'                                (1): Section 4.4.5.
+* `%ifnidni'                               (1): Section 4.4.5.
+* `%ifnmacro'                              (1): Section 4.4.2.
+* `%ifnnum'                                (1): Section 4.4.6.
+* `%ifnstr'                                (1): Section 4.4.6.
+* `%ifntoken'                              (1): Section 4.4.7.
+* `%ifnum'                                 (1): Section 4.4.6.
+* `%ifstr'                                 (1): Section 4.4.6.
+* `%iftoken'                               (1): Section 4.4.7.
+* `%imacro'                                (1): Section 4.3.
+* `IMPORT'                                 (1): Section 7.4.4.
+* import library                           (1): Section 7.4.4.
+* importing symbols                        (1): Section 6.5.
+* `INCBIN'                                 (1): Section 3.2.
+* `INCBIN'                                 (2): Section 3.2.3.
+* `INCBIN'                                 (3): Section 3.4.4.
+* `%include'                               (1): Section 2.1.16.
+* `%include'                               (2): Section 2.1.17.
+* `%include'                               (3): Section 4.6.1.
+* include search path                      (1): Section 2.1.16.
+* including other files                    (1): Section 4.6.1.
+* inefficient code                         (1): Section 12.1.1.
+* infinite loop                            (1): Section 3.5.
+* `__Infinity__'                           (1): Section 3.4.6.
+* infinity                                 (1): Section 3.4.6.
+* informational section                    (1): Section 7.5.1.
+* `INSTALL'                                (1): Section 1.3.2.
+* installing                               (1): Section 1.3.1.
+* instances of structures                  (1): Section 4.11.11.
+* instruction list                         (1): Appendix B.
+* intel hex                                (1): Section 7.2.
+* Intel number formats                     (1): Section 3.4.6.
+* `internal'                               (1): Section 7.9.5.
+* `%irmacro'                               (1): Section 4.3.1.
+* `ISTRUC'                                 (1): Section 4.11.11.
+* iterating over macro parameters          (1): Section 4.3.7.
+* `ith'                                    (1): Section 7.2.
+* `%ixdefine'                              (1): Section 4.1.2.
+* `Jcc NEAR'                               (1): Section 12.1.2.
+* `JMP DWORD'                              (1): Section 10.1.
+* jumps, mixed-size                        (1): Section 10.1.
+* `-k'                                     (1): Section A.3.4.
+* `-l' option                              (1): Section 2.1.3.
+* label prefix                             (1): Section 3.9.
+* `.lbss'                                  (1): Section 7.9.2.
+* `ld86'                                   (1): Section 7.12.
+* `.ldata'                                 (1): Section 7.9.2.
+* `LIBRARY'                                (1): Section 7.13.1.
+* license                                  (1): Section 1.1.2.
+* `%line'                                  (1): Section 4.10.1.
+* `__LINE__'                               (1): Section 4.11.4.
+* linker, free                             (1): Section 8.1.1.
+* Linux, `a.out'                           (1): Section 7.10.
+* Linux, `as86'                            (1): Section 7.12.
+* Linux, ELF                               (1): Section 7.9.
+* listing file                             (1): Section 2.1.3.
+* little-endian                            (1): Section 3.4.3.
+* `%local'                                 (1): Section 4.8.3.
+* local labels                             (1): Section 3.9.
+* logical AND                              (1): Section 4.4.4.
+* logical negation                         (1): Section 3.5.7.
+* logical OR                               (1): Section 4.4.4.
+* logical XOR                              (1): Section 4.4.4.
+* `.lrodata'                               (1): Section 7.9.2.
+* `-M' option                              (1): Section 2.1.4.
+* Mach, object file format                 (1): Section 7.8.
+* Mach-O                                   (1): Section 7.8.
+* `macho'                                  (1): Section 7.8.
+* `macho32'                                (1): Section 7.8.
+* `macho64'                                (1): Section 7.8.
+* MacOS X                                  (1): Section 7.8.
+* `%macro'                                 (1): Section 4.3.
+* macro indirection                        (1): Section 4.1.3.
+* macro library                            (1): Section 2.1.16.
+* macro processor                          (1): Chapter 4.
+* `macro-defaults'                         (1): Section 2.1.24.
+* macro-local labels                       (1): Section 4.3.3.
+* `macro-params'                           (1): Section 2.1.24.
+* macros                                   (1): Section 3.2.5.
+* `macro-selfref'                          (1): Section 2.1.24.
+* `make'                                   (1): Section 1.3.2.
+* makefile dependencies                    (1): Section 2.1.4.
+* makefile dependencies                    (2): Section 2.1.5.
+* makefiles                                (1): Section 1.3.1.
+* makefiles                                (2): Section 1.3.2.
+* man pages                                (1): Section 1.3.2.
+* map files                                (1): Section 7.1.4.
+* `MASM'                                   (1): Section 1.1.1.
+* MASM                                     (1): Section 2.2.
+* MASM                                     (2): Section 3.2.5.
+* MASM                                     (3): Section 7.4.
+* `-MD' option                             (1): Section 2.1.7.
+* memory models                            (1): Section 2.2.5.
+* memory models                            (2): Section 8.4.2.
+* memory operand                           (1): Section 3.1.
+* memory references                        (1): Section 2.2.2.
+* memory references                        (2): Section 3.3.
+* `-MF' option                             (1): Section 2.1.6.
+* `-MG' option                             (1): Section 2.1.5.
+* Microsoft OMF                            (1): Section 7.4.
+* minifloat                                (1): Section 3.4.6.
+* Minix                                    (1): Section 7.12.
+* `misc' subdirectory                      (1): Section 8.1.2.
+* `misc' subdirectory                      (2): Section 8.4.5.
+* `misc' subdirectory                      (3): Section 9.1.4.
+* mixed-language program                   (1): Section 8.4.
+* mixed-size addressing                    (1): Section 10.2.
+* mixed-size instruction                   (1): Section 10.1.
+* `MODULE'                                 (1): Section 7.13.2.
+* modulo operators                         (1): Section 3.5.6.
+* motorola s-records                       (1): Section 7.3.
+* `-MP' option                             (1): Section 2.1.10.
+* `-MQ' option                             (1): Section 2.1.9.
+* MS-DOS                                   (1): Section 7.1.
+* MS-DOS device drivers                    (1): Section 8.3.
+* `-MT' option                             (1): Section 2.1.8.
+* multi-line macros                        (1): Section 2.1.24.
+* multi-line macros                        (2): Section 4.3.
+* multipass optimization                   (1): Section 2.1.22.
+* multiple section names                   (1): Section 7.1.
+* multiplication                           (1): Section 3.5.6.
+* `multipush' macro                        (1): Section 4.3.7.
+* multisection                             (1): Section 7.1.3.
+* `__NaN__'                                (1): Section 3.4.6.
+* NaN                                      (1): Section 3.4.6.
+* NASM version                             (1): Section 4.11.1.
+* nasm version history                     (1): Appendix C.
+* nasm version id                          (1): Section 4.11.2.
+* nasm version string                      (1): Section 4.11.3.
+* `nasm.1'                                 (1): Section 1.3.2.
+* `__NASMDEFSEG'                           (1): Section 7.4.
+* `nasm-devel'                             (1): Section 1.2.
+* `NASMENV'                                (1): Section 2.1.28.
+* `nasm.exe'                               (1): Section 1.3.1.
+* `nasm -hf'                               (1): Section 2.1.2.
+* `__NASM_MAJOR__'                         (1): Section 4.11.1.
+* `__NASM_MINOR__'                         (1): Section 4.11.1.
+* `nasm.out'                               (1): Section 2.1.1.
+* `___NASM_PATCHLEVEL__'                   (1): Section 4.11.1.
+* `__NASM_SNAPSHOT__'                      (1): Section 4.11.1.
+* `__NASM_SUBMINOR__'                      (1): Section 4.11.1.
+* `__NASM_VER__'                           (1): Section 4.11.3.
+* `__NASM_VERSION_ID__'                    (1): Section 4.11.2.
+* `nasm-XXX-dos.zip'                       (1): Section 1.3.1.
+* `nasm-XXX.tar.gz'                        (1): Section 1.3.2.
+* `nasm-XXX-win32.zip'                     (1): Section 1.3.1.
+* `nasm-XXX.zip'                           (1): Section 1.3.1.
+* ndisasm                                  (1): Appendix A.
+* `ndisasm.1'                              (1): Section 1.3.2.
+* `ndisasm.exe'                            (1): Section 1.3.1.
+* near call                                (1): Section 2.2.5.
+* near common variables                    (1): Section 7.4.8.
+* NetBSD                                   (1): Section 7.11.
+* NetBSD                                   (2): Section 9.2.
+* new releases                             (1): Section 1.2.
+* `noalloc'                                (1): Section 7.9.2.
+* `nobits'                                 (1): Section 7.1.3.
+* `nobits'                                 (2): Section 7.9.2.
+* `noexec'                                 (1): Section 7.9.2.
+* `.nolist'                                (1): Section 4.3.10.
+* `nowait'                                 (1): Section 2.2.6.
+* `nowrite'                                (1): Section 7.9.2.
+* `number-overflow'                        (1): Section 2.1.24.
+* numeric constants                        (1): Section 3.2.1.
+* numeric constants                        (2): Section 3.4.1.
+* `-O' option                              (1): Section 2.1.22.
+* `-o' option                              (1): Section 2.1.1.
+* `-o' option                              (2): Section A.3.1.
+* `O16'                                    (1): Section 3.1.
+* `o16'                                    (1): Section 10.3.
+* `O32'                                    (1): Section 3.1.
+* `o32'                                    (1): Section 10.3.
+* `O64'                                    (1): Section 3.1.
+* `.OBJ'                                   (1): Section 8.1.
+* `obj'                                    (1): Section 7.4.
+* `object'                                 (1): Section 7.9.5.
+* `object'                                 (2): Section 7.13.3.
+* octal                                    (1): Section 3.4.1.
+* `OF_DBG'                                 (1): Section 7.14.
+* `OF_DEFAULT'                             (1): Section 2.1.2.
+* `OFFSET'                                 (1): Section 2.2.2.
+* OMF                                      (1): Section 7.4.
+* omitted parameters                       (1): Section 4.3.5.
+* one's complement                         (1): Section 3.5.7.
+* OpenBSD                                  (1): Section 7.11.
+* OpenBSD                                  (2): Section 9.2.
+* operands                                 (1): Section 3.1.
+* operand-size prefixes                    (1): Section 3.1.
+* operating system                         (1): Section 7.1.
+* operating system, writing                (1): Section 10.1.
+* operators                                (1): Section 3.5.
+* `ORG'                                    (1): Section 7.1.1.
+* `ORG'                                    (2): Section 8.2.1.
+* `ORG'                                    (3): Section 8.2.2.
+* `ORG'                                    (4): Section 12.1.3.
+* `orphan-labels'                          (1): Section 2.1.24.
+* `orphan-labels'                          (2): Section 3.1.
+* OS/2                                     (1): Section 7.4.
+* OS/2                                     (2): Section 7.4.1.
+* `osabi'                                  (1): Section 7.9.1.
+* other preprocessor directives            (1): Section 4.10.
+* out of range, jumps                      (1): Section 12.1.2.
+* output file format                       (1): Section 2.1.2.
+* output formats                           (1): Chapter 7.
+* `__OUTPUT_FORMAT__'                      (1): Section 4.11.6.
+* overlapping segments                     (1): Section 3.6.
+* `OVERLAY'                                (1): Section 7.4.1.
+* overloading, multi-line macros           (1): Section 4.3.2.
+* overloading, single-line macros          (1): Section 4.1.1.
+* `-P' option                              (1): Section 2.1.17.
+* `-p' option                              (1): Section 2.1.17.
+* `-p' option                              (2): Section 4.6.1.
+* paradox                                  (1): Section 3.8.
+* `PASCAL'                                 (1): Section 8.5.3.
+* Pascal calling convention                (1): Section 8.5.1.
+* `__PASS__'                               (1): Section 4.11.9.
+* `PATH'                                   (1): Section 1.3.1.
+* `%pathsearch'                            (1): Section 2.1.16.
+* `%pathsearch'                            (2): Section 4.6.2.
+* period                                   (1): Section 3.9.
+* Perl                                     (1): Section 1.3.1.
+* perverse                                 (1): Section 2.1.16.
+* PharLap                                  (1): Section 7.4.1.
+* PIC                                      (1): Section 7.9.3.
+* PIC                                      (2): Section 7.11.
+* PIC                                      (3): Section 9.2.
+* `..plt'                                  (1): Section 7.9.3.
+* `PLT' relocations                        (1): Section 7.9.3.
+* `PLT' relocations                        (2): Section 9.2.4.
+* `PLT' relocations                        (3): Section 9.2.5.
+* plt relocations                          (1): Section 9.2.5.
+* `%pop'                                   (1): Section 4.7.
+* `%pop'                                   (2): Section 4.7.1.
+* position-independent code                (1): Section 7.9.3.
+* position-independent code                (2): Section 7.11.
+* position-independent code                (3): Section 9.2.
+* `--postfix'                              (1): Section 2.1.27.
+* precedence                               (1): Section 3.5.
+* pre-defining macros                      (1): Section 2.1.18.
+* pre-defining macros                      (2): Section 4.1.1.
+* preferred                                (1): Section 3.6.
+* `--prefix'                               (1): Section 2.1.27.
+* pre-including files                      (1): Section 2.1.17.
+* preprocess-only mode                     (1): Section 2.1.20.
+* preprocessor                             (1): Section 2.1.20.
+* preprocessor                             (2): Section 2.1.21.
+* preprocessor                             (3): Section 3.2.4.
+* preprocessor                             (4): Section 3.5.6.
+* preprocessor                             (5): Chapter 4.
+* preprocessor expressions                 (1): Section 2.1.20.
+* preprocessor loops                       (1): Section 4.5.
+* preprocessor variables                   (1): Section 4.1.7.
+* primitive directives                     (1): Chapter 6.
+* `PRIVATE'                                (1): Section 7.4.1.
+* `proc'                                   (1): Section 7.13.3.
+* `proc'                                   (2): Section 8.4.5.
+* `proc'                                   (3): Section 9.1.4.
+* procedure linkage table                  (1): Section 7.9.3.
+* procedure linkage table                  (2): Section 9.2.4.
+* procedure linkage table                  (3): Section 9.2.5.
+* processor mode                           (1): Section 6.1.
+* `progbits'                               (1): Section 7.1.3.
+* `progbits'                               (2): Section 7.9.2.
+* program entry point                      (1): Section 7.4.6.
+* program entry point                      (2): Section 8.1.1.
+* program origin                           (1): Section 7.1.1.
+* `protected'                              (1): Section 7.9.5.
+* pseudo-instructions                      (1): Section 3.2.
+* `PUBLIC'                                 (1): Section 6.6.
+* `PUBLIC'                                 (2): Section 7.4.1.
+* pure binary                              (1): Section 7.1.
+* `%push'                                  (1): Section 4.7.
+* `%push'                                  (2): Section 4.7.1.
+* `__QNaN__'                               (1): Section 3.4.6.
+* quick start                              (1): Section 2.2.
+* `QWORD'                                  (1): Section 3.1.
+* `-r'                                     (1): Section A.3.
+* `rdf'                                    (1): Section 7.13.
+* `rdoff' subdirectory                     (1): Section 1.3.2.
+* `rdoff' subdirectory                     (2): Section 7.13.
+* recursive multi-line macros              (1): Section 4.3.1.
+* redirecting errors                       (1): Section 2.1.14.
+* `REL'                                    (1): Section 3.3.
+* `REL'                                    (2): Section 6.2.
+* relational operators                     (1): Section 4.4.4.
+* release candidates                       (1): Section 1.2.
+* Relocatable Dynamic Object File Format   (1): Section 7.13.
+* relocations, PIC-specific                (1): Section 7.9.3.
+* removing contexts                        (1): Section 4.7.1.
+* renaming contexts                        (1): Section 4.7.4.
+* `%rep'                                   (1): Section 3.2.5.
+* `%rep'                                   (2): Section 4.5.
+* repeating                                (1): Section 3.2.5.
+* repeating                                (2): Section 4.5.
+* `%repl'                                  (1): Section 4.7.4.
+* reporting bugs                           (1): Section 12.2.
+* `RESB'                                   (1): Section 2.2.7.
+* `RESB'                                   (2): Section 3.2.
+* `RESB'                                   (3): Section 3.2.2.
+* `RESD'                                   (1): Section 3.2.
+* `RESD'                                   (2): Section 3.2.2.
+* `RESO'                                   (1): Section 3.2.
+* `RESO'                                   (2): Section 3.2.2.
+* `RESQ'                                   (1): Section 3.2.
+* `RESQ'                                   (2): Section 3.2.2.
+* `REST'                                   (1): Section 3.2.
+* `REST'                                   (2): Section 3.2.2.
+* `RESW'                                   (1): Section 3.2.
+* `RESW'                                   (2): Section 3.2.2.
+* `RESY'                                   (1): Section 3.2.
+* `RESY'                                   (2): Section 3.2.2.
+* `%rmacro'                                (1): Section 4.3.1.
+* `.rodata'                                (1): Section 7.9.2.
+* `%rotate'                                (1): Section 4.3.7.
+* rotating macro parameters                (1): Section 4.3.7.
+* `-s' option                              (1): Section 2.1.15.
+* `-s' option                              (2): Section A.3.2.
+* searching for include files              (1): Section 4.6.1.
+* `__SECT__'                               (1): Section 6.3.1.
+* `__SECT__'                               (2): Section 6.4.
+* `SECTION'                                (1): Section 6.3.
+* `SECTION', `elf' extensions to           (1): Section 7.9.2.
+* `SECTION', `win32' extensions to         (1): Section 7.5.1.
+* section alignment, in `bin'              (1): Section 7.1.2.
+* section alignment, in `elf'              (1): Section 7.9.2.
+* section alignment, in `obj'              (1): Section 7.4.1.
+* section alignment, in `win32'            (1): Section 7.5.1.
+* section, bin extensions to               (1): Section 7.1.2.
+* `SEG'                                    (1): Section 3.5.7.
+* `SEG'                                    (2): Section 3.6.
+* `SEG'                                    (3): Section 7.4.
+* `SEGMENT'                                (1): Section 6.3.
+* `SEGMENT', `elf' extensions to           (1): Section 7.4.1.
+* segment address                          (1): Section 3.5.7.
+* segment address                          (2): Section 3.6.
+* segment alignment, in `bin'              (1): Section 7.1.2.
+* segment alignment, in `obj'              (1): Section 7.4.1.
+* segment names, Borland Pascal            (1): Section 8.5.2.
+* segment override                         (1): Section 2.2.4.
+* segment override                         (2): Section 3.1.
+* segments                                 (1): Section 3.6.
+* segments, groups of                      (1): Section 7.4.2.
+* separator character                      (1): Section 2.1.28.
+* shared libraries                         (1): Section 7.11.
+* shared libraries                         (2): Section 9.2.
+* shared library                           (1): Section 7.9.5.
+* `shift' command                          (1): Section 4.3.7.
+* signed division                          (1): Section 3.5.6.
+* signed modulo                            (1): Section 3.5.6.
+* single-line macros                       (1): Section 4.1.
+* size, of symbols                         (1): Section 7.9.5.
+* `smartalign'                             (1): Section 5.2.
+* `__SNaN__'                               (1): Section 3.4.6.
+* snapshots, daily development             (1): Section 1.2.
+* Solaris x86                              (1): Section 7.9.
+* `-soname'                                (1): Section 9.2.6.
+* sound                                    (1): Section 3.2.3.
+* source code                              (1): Section 1.3.1.
+* source-listing file                      (1): Section 2.1.3.
+* square brackets                          (1): Section 2.2.2.
+* square brackets                          (2): Section 3.3.
+* `srec'                                   (1): Section 7.3.
+* `STACK'                                  (1): Section 7.4.1.
+* stack relative preprocessor directives   (1): Section 4.8.
+* `%stacksize'                             (1): Section 4.8.2.
+* standard macro packages                  (1): Chapter 5.
+* standard macros                          (1): Section 4.11.
+* standardized section names               (1): Section 6.3.
+* standardized section names               (2): Section 7.5.1.
+* standardized section names               (3): Section 7.9.2.
+* standardized section names               (4): Section 7.10.
+* standardized section names               (5): Section 7.11.
+* standardized section names               (6): Section 7.12.
+* standardized section names               (7): Section 7.13.
+* `..start'                                (1): Section 7.4.6.
+* `..start'                                (2): Section 8.1.1.
+* `start='                                 (1): Section 7.1.3.
+* `stderr'                                 (1): Section 2.1.14.
+* `stdout'                                 (1): Section 2.1.15.
+* `%strcat'                                (1): Section 4.2.1.
+* `STRICT'                                 (1): Section 3.7.
+* string constant                          (1): Section 3.2.1.
+* string constants                         (1): Section 3.4.4.
+* string length                            (1): Section 4.2.2.
+* string manipulation in macros            (1): Section 4.2.
+* strings                                  (1): Section 3.4.2.
+* `%strlen'                                (1): Section 4.2.2.
+* `STRUC'                                  (1): Section 4.11.10.
+* `STRUC'                                  (2): Section 6.4.
+* `STRUC'                                  (3): Section 8.4.4.
+* `STRUC'                                  (4): Section 9.1.3.
+* stub preprocessor                        (1): Section 2.1.21.
+* `%substr'                                (1): Section 4.2.3.
+* subtraction                              (1): Section 3.5.5.
+* suppressible warning                     (1): Section 2.1.24.
+* suppressing preprocessing                (1): Section 2.1.21.
+* switching between sections               (1): Section 6.3.
+* `..sym'                                  (1): Section 7.9.3.
+* symbol sizes, specifying                 (1): Section 7.9.5.
+* symbol types, specifying                 (1): Section 7.9.5.
+* symbols, exporting from DLLs             (1): Section 7.4.5.
+* symbols, importing from DLLs             (1): Section 7.4.4.
+* `synchronisation'                        (1): Section A.3.2.
+* `.SYS'                                   (1): Section 7.1.
+* `.SYS'                                   (2): Section 8.3.
+* `-t'                                     (1): Section 2.1.23.
+* `TASM'                                   (1): Section 1.1.1.
+* `TASM'                                   (2): Section 2.1.23.
+* tasm                                     (1): Section 2.2.
+* tasm                                     (2): Section 7.4.
+* `.tbss'                                  (1): Section 7.9.2.
+* `TBYTE'                                  (1): Section 2.2.7.
+* `.tdata'                                 (1): Section 7.9.2.
+* `test' subdirectory                      (1): Section 8.1.1.
+* testing, arbitrary numeric expressions   (1): Section 4.4.4.
+* testing, context stack                   (1): Section 4.4.3.
+* testing, exact text identity             (1): Section 4.4.5.
+* testing, multi-line macro existence      (1): Section 4.4.2.
+* testing, single-line macro existence     (1): Section 4.4.1.
+* testing, token types                     (1): Section 4.4.6.
+* `.text'                                  (1): Section 7.9.2.
+* `.text'                                  (2): Section 7.10.
+* `.text'                                  (3): Section 7.11.
+* `.text'                                  (4): Section 7.12.
+* `.text'                                  (5): Section 7.13.
+* `_TEXT'                                  (1): Section 8.4.2.
+* thread local storage                     (1): Section 7.9.4.
+* `__TIME__'                               (1): Section 4.11.7.
+* `__TIME_NUM__'                           (1): Section 4.11.7.
+* `TIMES'                                  (1): Section 3.2.
+* `TIMES'                                  (2): Section 3.2.5.
+* `TIMES'                                  (3): Section 3.8.
+* `TIMES'                                  (4): Section 12.1.3.
+* `TIMES'                                  (5): Section 12.1.4.
+* `TLINK'                                  (1): Section 8.2.2.
+* `tls'                                    (1): Section 7.9.2.
+* `tls'                                    (2): Section 7.9.4.
+* `..tlsie'                                (1): Section 7.9.4.
+* trailing colon                           (1): Section 3.1.
+* `TWORD'                                  (1): Section 2.2.7.
+* `TWORD'                                  (2): Section 3.1.
+* type, of symbols                         (1): Section 7.9.5.
+* `-U' option                              (1): Section 2.1.19.
+* `-u' option                              (1): Section 2.1.19.
+* `-u' option                              (2): Section A.3.
+* unary operators                          (1): Section 3.5.7.
+* `%undef'                                 (1): Section 2.1.19.
+* `%undef'                                 (2): Section 4.1.6.
+* undefining macros                        (1): Section 2.1.19.
+* underscore, in C symbols                 (1): Section 8.4.1.
+* Unicode                                  (1): Section 3.4.2.
+* Unicode                                  (2): Section 3.4.5.
+* uninitialized                            (1): Section 3.2.
+* uninitialized                            (2): Section 3.2.2.
+* uninitialized storage                    (1): Section 2.2.7.
+* Unix                                     (1): Section 1.3.2.
+* Unix, SCO                                (1): Section 7.9.
+* Unix, source archive                     (1): Section 1.3.2.
+* Unix, System V                           (1): Section 7.9.
+* UnixWare                                 (1): Section 7.9.
+* `%unmacro'                               (1): Section 4.3.11.
+* unrolled loops                           (1): Section 3.2.5.
+* unsigned division                        (1): Section 3.5.6.
+* unsigned modulo                          (1): Section 3.5.6.
+* `UPPERCASE'                              (1): Section 2.2.1.
+* `UPPERCASE'                              (2): Section 7.4.3.
+* `%use'                                   (1): Section 4.6.4.
+* `%use'                                   (2): Chapter 5.
+* `__USE_*__'                              (1): Section 4.11.8.
+* `USE16'                                  (1): Section 6.1.1.
+* `USE16'                                  (2): Section 7.4.1.
+* `USE32'                                  (1): Section 6.1.1.
+* `USE32'                                  (2): Section 7.4.1.
+* `user'                                   (1): Section 2.1.24.
+* user-defined errors                      (1): Section 4.9.
+* user-level assembler directives          (1): Section 4.11.
+* user-level directives                    (1): Chapter 6.
+* `__UTC_DATE__'                           (1): Section 4.11.7.
+* `__UTC_DATE_NUM__'                       (1): Section 4.11.7.
+* `__UTC_TIME__'                           (1): Section 4.11.7.
+* `__UTC_TIME_NUM__'                       (1): Section 4.11.7.
+* UTF-16                                   (1): Section 3.4.5.
+* UTF-32                                   (1): Section 3.4.5.
+* UTF-8                                    (1): Section 3.4.2.
+* `__utf16__'                              (1): Section 3.4.5.
+* `__utf32__'                              (1): Section 3.4.5.
+* `-v' option                              (1): Section 2.1.25.
+* VAL                                      (1): Section 8.1.1.
+* valid characters                         (1): Section 3.1.
+* variable types                           (1): Section 2.2.3.
+* version                                  (1): Section 2.1.25.
+* version number of NASM                   (1): Section 4.11.1.
+* `vfollows='                              (1): Section 7.1.3.
+* Visual C++                               (1): Section 7.5.
+* `vstart='                                (1): Section 7.1.3.
+* `-W' option                              (1): Section 2.1.24.
+* `-w' option                              (1): Section 2.1.24.
+* `%warning'                               (1): Section 4.9.
+* warnings                                 (1): Section 2.1.24.
+* `[warning *warning-name]'                (1): Section 2.1.24.
+* `[warning +warning-name]'                (1): Section 2.1.24.
+* `[warning -warning-name]'                (1): Section 2.1.24.
+* website                                  (1): Section 1.2.
+* `win64'                                  (1): Section 7.6.
+* `win64'                                  (2): Chapter 11.
+* Win64                                    (1): Section 7.4.
+* Win64                                    (2): Section 7.5.
+* Win64                                    (3): Chapter 9.
+* Windows                                  (1): Section 8.1.
+* `write'                                  (1): Section 7.9.2.
+* writing operating systems                (1): Section 10.1.
+* `WRT'                                    (1): Section 3.6.
+* `WRT'                                    (2): Section 7.4.
+* `WRT'                                    (3): Section 7.9.3.
+* `WRT'                                    (4): Section 7.9.4.
+* `WRT'                                    (5): Section 7.11.
+* `WRT ..got'                              (1): Section 9.2.3.
+* `WRT ..gotoff'                           (1): Section 9.2.2.
+* `WRT ..gotpc'                            (1): Section 9.2.1.
+* `WRT ..plt'                              (1): Section 9.2.5.
+* `WRT ..sym'                              (1): Section 9.2.4.
+* `www.cpan.org'                           (1): Section 1.3.1.
+* `www.delorie.com'                        (1): Section 8.1.1.
+* `www.pcorner.com'                        (1): Section 8.1.1.
+* `-X' option                              (1): Section 2.1.13.
+* `x2ftp.oulu.fi'                          (1): Section 8.1.1.
+* `%xdefine'                               (1): Section 4.1.2.
+* `-y' option                              (1): Section 2.1.26.
+* `-Z' option                              (1): Section 2.1.14.
+
+
diff --git a/doc/inslist.src b/doc/inslist.src
new file mode 100644 (file)
index 0000000..a5c7155
--- /dev/null
@@ -0,0 +1,3130 @@
+
+\S{} Special instructions...
+
+\c DB                                        
+\c DW                                        
+\c DD                                        
+\c DQ                                        
+\c DT                                        
+\c DO                                        
+\c DY                                        
+\c RESB             imm                      8086
+\c RESW                                      
+\c RESD                                      
+\c RESQ                                      
+\c REST                                      
+\c RESO                                      
+\c RESY                                      
+
+\S{} Conventional instructions
+
+\c AAA                                       8086,NOLONG
+\c AAD                                       8086,NOLONG
+\c AAD              imm                      8086,NOLONG
+\c AAM                                       8086,NOLONG
+\c AAM              imm                      8086,NOLONG
+\c AAS                                       8086,NOLONG
+\c ADC              mem,reg8                 8086
+\c ADC              reg8,reg8                8086
+\c ADC              mem,reg16                8086
+\c ADC              reg16,reg16              8086
+\c ADC              mem,reg32                386
+\c ADC              reg32,reg32              386
+\c ADC              mem,reg64                X64
+\c ADC              reg64,reg64              X64
+\c ADC              reg8,mem                 8086
+\c ADC              reg8,reg8                8086
+\c ADC              reg16,mem                8086
+\c ADC              reg16,reg16              8086
+\c ADC              reg32,mem                386
+\c ADC              reg32,reg32              386
+\c ADC              reg64,mem                X64
+\c ADC              reg64,reg64              X64
+\c ADC              rm16,imm8                8086
+\c ADC              rm32,imm8                386
+\c ADC              rm64,imm8                X64
+\c ADC              reg_al,imm               8086
+\c ADC              reg_ax,sbyte16           8086
+\c ADC              reg_ax,imm               8086
+\c ADC              reg_eax,sbyte32          386
+\c ADC              reg_eax,imm              386
+\c ADC              reg_rax,sbyte64          X64
+\c ADC              reg_rax,imm              X64
+\c ADC              rm8,imm                  8086
+\c ADC              rm16,imm                 8086
+\c ADC              rm32,imm                 386
+\c ADC              rm64,imm                 X64
+\c ADC              mem,imm8                 8086
+\c ADC              mem,imm16                8086
+\c ADC              mem,imm32                386
+\c ADD              mem,reg8                 8086
+\c ADD              reg8,reg8                8086
+\c ADD              mem,reg16                8086
+\c ADD              reg16,reg16              8086
+\c ADD              mem,reg32                386
+\c ADD              reg32,reg32              386
+\c ADD              mem,reg64                X64
+\c ADD              reg64,reg64              X64
+\c ADD              reg8,mem                 8086
+\c ADD              reg8,reg8                8086
+\c ADD              reg16,mem                8086
+\c ADD              reg16,reg16              8086
+\c ADD              reg32,mem                386
+\c ADD              reg32,reg32              386
+\c ADD              reg64,mem                X64
+\c ADD              reg64,reg64              X64
+\c ADD              rm16,imm8                8086
+\c ADD              rm32,imm8                386
+\c ADD              rm64,imm8                X64
+\c ADD              reg_al,imm               8086
+\c ADD              reg_ax,sbyte16           8086
+\c ADD              reg_ax,imm               8086
+\c ADD              reg_eax,sbyte32          386
+\c ADD              reg_eax,imm              386
+\c ADD              reg_rax,sbyte64          X64
+\c ADD              reg_rax,imm              X64
+\c ADD              rm8,imm                  8086
+\c ADD              rm16,imm                 8086
+\c ADD              rm32,imm                 386
+\c ADD              rm64,imm                 X64
+\c ADD              mem,imm8                 8086
+\c ADD              mem,imm16                8086
+\c ADD              mem,imm32                386
+\c AND              mem,reg8                 8086
+\c AND              reg8,reg8                8086
+\c AND              mem,reg16                8086
+\c AND              reg16,reg16              8086
+\c AND              mem,reg32                386
+\c AND              reg32,reg32              386
+\c AND              mem,reg64                X64
+\c AND              reg64,reg64              X64
+\c AND              reg8,mem                 8086
+\c AND              reg8,reg8                8086
+\c AND              reg16,mem                8086
+\c AND              reg16,reg16              8086
+\c AND              reg32,mem                386
+\c AND              reg32,reg32              386
+\c AND              reg64,mem                X64
+\c AND              reg64,reg64              X64
+\c AND              rm16,imm8                8086
+\c AND              rm32,imm8                386
+\c AND              rm64,imm8                X64
+\c AND              reg_al,imm               8086
+\c AND              reg_ax,sbyte16           8086
+\c AND              reg_ax,imm               8086
+\c AND              reg_eax,sbyte32          386
+\c AND              reg_eax,imm              386
+\c AND              reg_rax,sbyte64          X64
+\c AND              reg_rax,imm              X64
+\c AND              rm8,imm                  8086
+\c AND              rm16,imm                 8086
+\c AND              rm32,imm                 386
+\c AND              rm64,imm                 X64
+\c AND              mem,imm8                 8086
+\c AND              mem,imm16                8086
+\c AND              mem,imm32                386
+\c ARPL             mem,reg16                286,PROT,NOLONG
+\c ARPL             reg16,reg16              286,PROT,NOLONG
+\c BB0_RESET                                 PENT,CYRIX,ND
+\c BB1_RESET                                 PENT,CYRIX,ND
+\c BOUND            reg16,mem                186,NOLONG
+\c BOUND            reg32,mem                386,NOLONG
+\c BSF              reg16,mem                386
+\c BSF              reg16,reg16              386
+\c BSF              reg32,mem                386
+\c BSF              reg32,reg32              386
+\c BSF              reg64,mem                X64
+\c BSF              reg64,reg64              X64
+\c BSR              reg16,mem                386
+\c BSR              reg16,reg16              386
+\c BSR              reg32,mem                386
+\c BSR              reg32,reg32              386
+\c BSR              reg64,mem                X64
+\c BSR              reg64,reg64              X64
+\c BSWAP            reg32                    486
+\c BSWAP            reg64                    X64
+\c BT               mem,reg16                386
+\c BT               reg16,reg16              386
+\c BT               mem,reg32                386
+\c BT               reg32,reg32              386
+\c BT               mem,reg64                X64
+\c BT               reg64,reg64              X64
+\c BT               rm16,imm                 386
+\c BT               rm32,imm                 386
+\c BT               rm64,imm                 X64
+\c BTC              mem,reg16                386
+\c BTC              reg16,reg16              386
+\c BTC              mem,reg32                386
+\c BTC              reg32,reg32              386
+\c BTC              mem,reg64                X64
+\c BTC              reg64,reg64              X64
+\c BTC              rm16,imm                 386
+\c BTC              rm32,imm                 386
+\c BTC              rm64,imm                 X64
+\c BTR              mem,reg16                386
+\c BTR              reg16,reg16              386
+\c BTR              mem,reg32                386
+\c BTR              reg32,reg32              386
+\c BTR              mem,reg64                X64
+\c BTR              reg64,reg64              X64
+\c BTR              rm16,imm                 386
+\c BTR              rm32,imm                 386
+\c BTR              rm64,imm                 X64
+\c BTS              mem,reg16                386
+\c BTS              reg16,reg16              386
+\c BTS              mem,reg32                386
+\c BTS              reg32,reg32              386
+\c BTS              mem,reg64                X64
+\c BTS              reg64,reg64              X64
+\c BTS              rm16,imm                 386
+\c BTS              rm32,imm                 386
+\c BTS              rm64,imm                 X64
+\c CALL             imm                      8086
+\c CALL             imm|near                 8086
+\c CALL             imm|far                  8086,ND,NOLONG
+\c CALL             imm16                    8086
+\c CALL             imm16|near               8086
+\c CALL             imm16|far                8086,ND,NOLONG
+\c CALL             imm32                    386
+\c CALL             imm32|near               386
+\c CALL             imm32|far                386,ND,NOLONG
+\c CALL             imm:imm                  8086,NOLONG
+\c CALL             imm16:imm                8086,NOLONG
+\c CALL             imm:imm16                8086,NOLONG
+\c CALL             imm32:imm                386,NOLONG
+\c CALL             imm:imm32                386,NOLONG
+\c CALL             mem|far                  8086,NOLONG
+\c CALL             mem|far                  X64
+\c CALL             mem16|far                8086
+\c CALL             mem32|far                386
+\c CALL             mem64|far                X64
+\c CALL             mem|near                 8086
+\c CALL             mem16|near               8086
+\c CALL             mem32|near               386,NOLONG
+\c CALL             mem64|near               X64
+\c CALL             reg16                    8086
+\c CALL             reg32                    386,NOLONG
+\c CALL             reg64                    X64
+\c CALL             mem                      8086
+\c CALL             mem16                    8086
+\c CALL             mem32                    386,NOLONG
+\c CALL             mem64                    X64
+\c CBW                                       8086
+\c CDQ                                       386
+\c CDQE                                      X64
+\c CLC                                       8086
+\c CLD                                       8086
+\c CLGI                                      X64,AMD
+\c CLI                                       8086
+\c CLTS                                      286,PRIV
+\c CMC                                       8086
+\c CMP              mem,reg8                 8086
+\c CMP              reg8,reg8                8086
+\c CMP              mem,reg16                8086
+\c CMP              reg16,reg16              8086
+\c CMP              mem,reg32                386
+\c CMP              reg32,reg32              386
+\c CMP              mem,reg64                X64
+\c CMP              reg64,reg64              X64
+\c CMP              reg8,mem                 8086
+\c CMP              reg8,reg8                8086
+\c CMP              reg16,mem                8086
+\c CMP              reg16,reg16              8086
+\c CMP              reg32,mem                386
+\c CMP              reg32,reg32              386
+\c CMP              reg64,mem                X64
+\c CMP              reg64,reg64              X64
+\c CMP              rm16,imm8                8086
+\c CMP              rm32,imm8                386
+\c CMP              rm64,imm8                X64
+\c CMP              reg_al,imm               8086
+\c CMP              reg_ax,sbyte16           8086
+\c CMP              reg_ax,imm               8086
+\c CMP              reg_eax,sbyte32          386
+\c CMP              reg_eax,imm              386
+\c CMP              reg_rax,sbyte64          X64
+\c CMP              reg_rax,imm              X64
+\c CMP              rm8,imm                  8086
+\c CMP              rm16,imm                 8086
+\c CMP              rm32,imm                 386
+\c CMP              rm64,imm                 X64
+\c CMP              mem,imm8                 8086
+\c CMP              mem,imm16                8086
+\c CMP              mem,imm32                386
+\c CMPSB                                     8086
+\c CMPSD                                     386
+\c CMPSQ                                     X64
+\c CMPSW                                     8086
+\c CMPXCHG          mem,reg8                 PENT
+\c CMPXCHG          reg8,reg8                PENT
+\c CMPXCHG          mem,reg16                PENT
+\c CMPXCHG          reg16,reg16              PENT
+\c CMPXCHG          mem,reg32                PENT
+\c CMPXCHG          reg32,reg32              PENT
+\c CMPXCHG          mem,reg64                X64
+\c CMPXCHG          reg64,reg64              X64
+\c CMPXCHG486       mem,reg8                 486,UNDOC,ND
+\c CMPXCHG486       reg8,reg8                486,UNDOC,ND
+\c CMPXCHG486       mem,reg16                486,UNDOC,ND
+\c CMPXCHG486       reg16,reg16              486,UNDOC,ND
+\c CMPXCHG486       mem,reg32                486,UNDOC,ND
+\c CMPXCHG486       reg32,reg32              486,UNDOC,ND
+\c CMPXCHG8B        mem                      PENT
+\c CMPXCHG16B       mem                      X64
+\c CPUID                                     PENT
+\c CPU_READ                                  PENT,CYRIX
+\c CPU_WRITE                                 PENT,CYRIX
+\c CQO                                       X64
+\c CWD                                       8086
+\c CWDE                                      386
+\c DAA                                       8086,NOLONG
+\c DAS                                       8086,NOLONG
+\c DEC              reg16                    8086,NOLONG
+\c DEC              reg32                    386,NOLONG
+\c DEC              rm8                      8086
+\c DEC              rm16                     8086
+\c DEC              rm32                     386
+\c DEC              rm64                     X64
+\c DIV              rm8                      8086
+\c DIV              rm16                     8086
+\c DIV              rm32                     386
+\c DIV              rm64                     X64
+\c DMINT                                     P6,CYRIX
+\c EMMS                                      PENT,MMX
+\c ENTER            imm,imm                  186
+\c EQU              imm                      8086
+\c EQU              imm:imm                  8086
+\c F2XM1                                     8086,FPU
+\c FABS                                      8086,FPU
+\c FADD             mem32                    8086,FPU
+\c FADD             mem64                    8086,FPU
+\c FADD             fpureg|to                8086,FPU
+\c FADD             fpureg                   8086,FPU
+\c FADD             fpureg,fpu0              8086,FPU
+\c FADD             fpu0,fpureg              8086,FPU
+\c FADD                                      8086,FPU,ND
+\c FADDP            fpureg                   8086,FPU
+\c FADDP            fpureg,fpu0              8086,FPU
+\c FADDP                                     8086,FPU,ND
+\c FBLD             mem80                    8086,FPU
+\c FBLD             mem                      8086,FPU
+\c FBSTP            mem80                    8086,FPU
+\c FBSTP            mem                      8086,FPU
+\c FCHS                                      8086,FPU
+\c FCLEX                                     8086,FPU
+\c FCMOVB           fpureg                   P6,FPU
+\c FCMOVB           fpu0,fpureg              P6,FPU
+\c FCMOVB                                    P6,FPU,ND
+\c FCMOVBE          fpureg                   P6,FPU
+\c FCMOVBE          fpu0,fpureg              P6,FPU
+\c FCMOVBE                                   P6,FPU,ND
+\c FCMOVE           fpureg                   P6,FPU
+\c FCMOVE           fpu0,fpureg              P6,FPU
+\c FCMOVE                                    P6,FPU,ND
+\c FCMOVNB          fpureg                   P6,FPU
+\c FCMOVNB          fpu0,fpureg              P6,FPU
+\c FCMOVNB                                   P6,FPU,ND
+\c FCMOVNBE         fpureg                   P6,FPU
+\c FCMOVNBE         fpu0,fpureg              P6,FPU
+\c FCMOVNBE                                  P6,FPU,ND
+\c FCMOVNE          fpureg                   P6,FPU
+\c FCMOVNE          fpu0,fpureg              P6,FPU
+\c FCMOVNE                                   P6,FPU,ND
+\c FCMOVNU          fpureg                   P6,FPU
+\c FCMOVNU          fpu0,fpureg              P6,FPU
+\c FCMOVNU                                   P6,FPU,ND
+\c FCMOVU           fpureg                   P6,FPU
+\c FCMOVU           fpu0,fpureg              P6,FPU
+\c FCMOVU                                    P6,FPU,ND
+\c FCOM             mem32                    8086,FPU
+\c FCOM             mem64                    8086,FPU
+\c FCOM             fpureg                   8086,FPU
+\c FCOM             fpu0,fpureg              8086,FPU
+\c FCOM                                      8086,FPU,ND
+\c FCOMI            fpureg                   P6,FPU
+\c FCOMI            fpu0,fpureg              P6,FPU
+\c FCOMI                                     P6,FPU,ND
+\c FCOMIP           fpureg                   P6,FPU
+\c FCOMIP           fpu0,fpureg              P6,FPU
+\c FCOMIP                                    P6,FPU,ND
+\c FCOMP            mem32                    8086,FPU
+\c FCOMP            mem64                    8086,FPU
+\c FCOMP            fpureg                   8086,FPU
+\c FCOMP            fpu0,fpureg              8086,FPU
+\c FCOMP                                     8086,FPU,ND
+\c FCOMPP                                    8086,FPU
+\c FCOS                                      386,FPU
+\c FDECSTP                                   8086,FPU
+\c FDISI                                     8086,FPU
+\c FDIV             mem32                    8086,FPU
+\c FDIV             mem64                    8086,FPU
+\c FDIV             fpureg|to                8086,FPU
+\c FDIV             fpureg                   8086,FPU
+\c FDIV             fpureg,fpu0              8086,FPU
+\c FDIV             fpu0,fpureg              8086,FPU
+\c FDIV                                      8086,FPU,ND
+\c FDIVP            fpureg                   8086,FPU
+\c FDIVP            fpureg,fpu0              8086,FPU
+\c FDIVP                                     8086,FPU,ND
+\c FDIVR            mem32                    8086,FPU
+\c FDIVR            mem64                    8086,FPU
+\c FDIVR            fpureg|to                8086,FPU
+\c FDIVR            fpureg,fpu0              8086,FPU
+\c FDIVR            fpureg                   8086,FPU
+\c FDIVR            fpu0,fpureg              8086,FPU
+\c FDIVR                                     8086,FPU,ND
+\c FDIVRP           fpureg                   8086,FPU
+\c FDIVRP           fpureg,fpu0              8086,FPU
+\c FDIVRP                                    8086,FPU,ND
+\c FEMMS                                     PENT,3DNOW
+\c FENI                                      8086,FPU
+\c FFREE            fpureg                   8086,FPU
+\c FFREE                                     8086,FPU
+\c FFREEP           fpureg                   286,FPU,UNDOC
+\c FFREEP                                    286,FPU,UNDOC
+\c FIADD            mem32                    8086,FPU
+\c FIADD            mem16                    8086,FPU
+\c FICOM            mem32                    8086,FPU
+\c FICOM            mem16                    8086,FPU
+\c FICOMP           mem32                    8086,FPU
+\c FICOMP           mem16                    8086,FPU
+\c FIDIV            mem32                    8086,FPU
+\c FIDIV            mem16                    8086,FPU
+\c FIDIVR           mem32                    8086,FPU
+\c FIDIVR           mem16                    8086,FPU
+\c FILD             mem32                    8086,FPU
+\c FILD             mem16                    8086,FPU
+\c FILD             mem64                    8086,FPU
+\c FIMUL            mem32                    8086,FPU
+\c FIMUL            mem16                    8086,FPU
+\c FINCSTP                                   8086,FPU
+\c FINIT                                     8086,FPU
+\c FIST             mem32                    8086,FPU
+\c FIST             mem16                    8086,FPU
+\c FISTP            mem32                    8086,FPU
+\c FISTP            mem16                    8086,FPU
+\c FISTP            mem64                    8086,FPU
+\c FISTTP           mem16                    PRESCOTT,FPU
+\c FISTTP           mem32                    PRESCOTT,FPU
+\c FISTTP           mem64                    PRESCOTT,FPU
+\c FISUB            mem32                    8086,FPU
+\c FISUB            mem16                    8086,FPU
+\c FISUBR           mem32                    8086,FPU
+\c FISUBR           mem16                    8086,FPU
+\c FLD              mem32                    8086,FPU
+\c FLD              mem64                    8086,FPU
+\c FLD              mem80                    8086,FPU
+\c FLD              fpureg                   8086,FPU
+\c FLD                                       8086,FPU,ND
+\c FLD1                                      8086,FPU
+\c FLDCW            mem                      8086,FPU,SW
+\c FLDENV           mem                      8086,FPU
+\c FLDL2E                                    8086,FPU
+\c FLDL2T                                    8086,FPU
+\c FLDLG2                                    8086,FPU
+\c FLDLN2                                    8086,FPU
+\c FLDPI                                     8086,FPU
+\c FLDZ                                      8086,FPU
+\c FMUL             mem32                    8086,FPU
+\c FMUL             mem64                    8086,FPU
+\c FMUL             fpureg|to                8086,FPU
+\c FMUL             fpureg,fpu0              8086,FPU
+\c FMUL             fpureg                   8086,FPU
+\c FMUL             fpu0,fpureg              8086,FPU
+\c FMUL                                      8086,FPU,ND
+\c FMULP            fpureg                   8086,FPU
+\c FMULP            fpureg,fpu0              8086,FPU
+\c FMULP                                     8086,FPU,ND
+\c FNCLEX                                    8086,FPU
+\c FNDISI                                    8086,FPU
+\c FNENI                                     8086,FPU
+\c FNINIT                                    8086,FPU
+\c FNOP                                      8086,FPU
+\c FNSAVE           mem                      8086,FPU
+\c FNSTCW           mem                      8086,FPU,SW
+\c FNSTENV          mem                      8086,FPU
+\c FNSTSW           mem                      8086,FPU,SW
+\c FNSTSW           reg_ax                   286,FPU
+\c FPATAN                                    8086,FPU
+\c FPREM                                     8086,FPU
+\c FPREM1                                    386,FPU
+\c FPTAN                                     8086,FPU
+\c FRNDINT                                   8086,FPU
+\c FRSTOR           mem                      8086,FPU
+\c FSAVE            mem                      8086,FPU
+\c FSCALE                                    8086,FPU
+\c FSETPM                                    286,FPU
+\c FSIN                                      386,FPU
+\c FSINCOS                                   386,FPU
+\c FSQRT                                     8086,FPU
+\c FST              mem32                    8086,FPU
+\c FST              mem64                    8086,FPU
+\c FST              fpureg                   8086,FPU
+\c FST                                       8086,FPU,ND
+\c FSTCW            mem                      8086,FPU,SW
+\c FSTENV           mem                      8086,FPU
+\c FSTP             mem32                    8086,FPU
+\c FSTP             mem64                    8086,FPU
+\c FSTP             mem80                    8086,FPU
+\c FSTP             fpureg                   8086,FPU
+\c FSTP                                      8086,FPU,ND
+\c FSTSW            mem                      8086,FPU,SW
+\c FSTSW            reg_ax                   286,FPU
+\c FSUB             mem32                    8086,FPU
+\c FSUB             mem64                    8086,FPU
+\c FSUB             fpureg|to                8086,FPU
+\c FSUB             fpureg,fpu0              8086,FPU
+\c FSUB             fpureg                   8086,FPU
+\c FSUB             fpu0,fpureg              8086,FPU
+\c FSUB                                      8086,FPU,ND
+\c FSUBP            fpureg                   8086,FPU
+\c FSUBP            fpureg,fpu0              8086,FPU
+\c FSUBP                                     8086,FPU,ND
+\c FSUBR            mem32                    8086,FPU
+\c FSUBR            mem64                    8086,FPU
+\c FSUBR            fpureg|to                8086,FPU
+\c FSUBR            fpureg,fpu0              8086,FPU
+\c FSUBR            fpureg                   8086,FPU
+\c FSUBR            fpu0,fpureg              8086,FPU
+\c FSUBR                                     8086,FPU,ND
+\c FSUBRP           fpureg                   8086,FPU
+\c FSUBRP           fpureg,fpu0              8086,FPU
+\c FSUBRP                                    8086,FPU,ND
+\c FTST                                      8086,FPU
+\c FUCOM            fpureg                   386,FPU
+\c FUCOM            fpu0,fpureg              386,FPU
+\c FUCOM                                     386,FPU,ND
+\c FUCOMI           fpureg                   P6,FPU
+\c FUCOMI           fpu0,fpureg              P6,FPU
+\c FUCOMI                                    P6,FPU,ND
+\c FUCOMIP          fpureg                   P6,FPU
+\c FUCOMIP          fpu0,fpureg              P6,FPU
+\c FUCOMIP                                   P6,FPU,ND
+\c FUCOMP           fpureg                   386,FPU
+\c FUCOMP           fpu0,fpureg              386,FPU
+\c FUCOMP                                    386,FPU,ND
+\c FUCOMPP                                   386,FPU
+\c FXAM                                      8086,FPU
+\c FXCH             fpureg                   8086,FPU
+\c FXCH             fpureg,fpu0              8086,FPU
+\c FXCH             fpu0,fpureg              8086,FPU
+\c FXCH                                      8086,FPU,ND
+\c FXTRACT                                   8086,FPU
+\c FYL2X                                     8086,FPU
+\c FYL2XP1                                   8086,FPU
+\c HLT                                       8086,PRIV
+\c IBTS             mem,reg16                386,SW,UNDOC,ND
+\c IBTS             reg16,reg16              386,UNDOC,ND
+\c IBTS             mem,reg32                386,SD,UNDOC,ND
+\c IBTS             reg32,reg32              386,UNDOC,ND
+\c ICEBP                                     386,ND
+\c IDIV             rm8                      8086
+\c IDIV             rm16                     8086
+\c IDIV             rm32                     386
+\c IDIV             rm64                     X64
+\c IMUL             rm8                      8086
+\c IMUL             rm16                     8086
+\c IMUL             rm32                     386
+\c IMUL             rm64                     X64
+\c IMUL             reg16,mem                386
+\c IMUL             reg16,reg16              386
+\c IMUL             reg32,mem                386
+\c IMUL             reg32,reg32              386
+\c IMUL             reg64,mem                X64
+\c IMUL             reg64,reg64              X64
+\c IMUL             reg16,mem,imm8           186
+\c IMUL             reg16,mem,sbyte16        186,ND
+\c IMUL             reg16,mem,imm16          186
+\c IMUL             reg16,mem,imm            186,ND
+\c IMUL             reg16,reg16,imm8         186
+\c IMUL             reg16,reg16,sbyte16      186,ND
+\c IMUL             reg16,reg16,imm16        186
+\c IMUL             reg16,reg16,imm          186,ND
+\c IMUL             reg32,mem,imm8           386
+\c IMUL             reg32,mem,sbyte32        386,ND
+\c IMUL             reg32,mem,imm32          386
+\c IMUL             reg32,mem,imm            386,ND
+\c IMUL             reg32,reg32,imm8         386
+\c IMUL             reg32,reg32,sbyte32      386,ND
+\c IMUL             reg32,reg32,imm32        386
+\c IMUL             reg32,reg32,imm          386,ND
+\c IMUL             reg64,mem,imm8           X64
+\c IMUL             reg64,mem,sbyte64        X64,ND
+\c IMUL             reg64,mem,imm32          X64
+\c IMUL             reg64,mem,imm            X64,ND
+\c IMUL             reg64,reg64,imm8         X64
+\c IMUL             reg64,reg64,sbyte64      X64,ND
+\c IMUL             reg64,reg64,imm32        X64
+\c IMUL             reg64,reg64,imm          X64,ND
+\c IMUL             reg16,imm8               186
+\c IMUL             reg16,sbyte16            186,ND
+\c IMUL             reg16,imm16              186
+\c IMUL             reg16,imm                186,ND
+\c IMUL             reg32,imm8               386
+\c IMUL             reg32,sbyte32            386,ND
+\c IMUL             reg32,imm32              386
+\c IMUL             reg32,imm                386,ND
+\c IMUL             reg64,imm8               X64
+\c IMUL             reg64,sbyte64            X64,ND
+\c IMUL             reg64,imm32              X64
+\c IMUL             reg64,imm                X64,ND
+\c IN               reg_al,imm               8086
+\c IN               reg_ax,imm               8086
+\c IN               reg_eax,imm              386
+\c IN               reg_al,reg_dx            8086
+\c IN               reg_ax,reg_dx            8086
+\c IN               reg_eax,reg_dx           386
+\c INC              reg16                    8086,NOLONG
+\c INC              reg32                    386,NOLONG
+\c INC              rm8                      8086
+\c INC              rm16                     8086
+\c INC              rm32                     386
+\c INC              rm64                     X64
+\c INCBIN                                    
+\c INSB                                      186
+\c INSD                                      386
+\c INSW                                      186
+\c INT              imm                      8086
+\c INT01                                     386,ND
+\c INT1                                      386
+\c INT03                                     8086,ND
+\c INT3                                      8086
+\c INTO                                      8086,NOLONG
+\c INVD                                      486,PRIV
+\c INVLPG           mem                      486,PRIV
+\c INVLPGA          reg_ax,reg_ecx           X86_64,AMD,NOLONG
+\c INVLPGA          reg_eax,reg_ecx          X86_64,AMD
+\c INVLPGA          reg_rax,reg_ecx          X64,AMD
+\c INVLPGA                                   X86_64,AMD
+\c IRET                                      8086
+\c IRETD                                     386
+\c IRETQ                                     X64
+\c IRETW                                     8086
+\c JCXZ             imm                      8086,NOLONG
+\c JECXZ            imm                      386
+\c JRCXZ            imm                      X64
+\c JMP              imm|short                8086
+\c JMP              imm                      8086,ND
+\c JMP              imm                      8086
+\c JMP              imm|near                 8086,ND
+\c JMP              imm|far                  8086,ND,NOLONG
+\c JMP              imm16                    8086
+\c JMP              imm16|near               8086,ND
+\c JMP              imm16|far                8086,ND,NOLONG
+\c JMP              imm32                    386
+\c JMP              imm32|near               386,ND
+\c JMP              imm32|far                386,ND,NOLONG
+\c JMP              imm:imm                  8086,NOLONG
+\c JMP              imm16:imm                8086,NOLONG
+\c JMP              imm:imm16                8086,NOLONG
+\c JMP              imm32:imm                386,NOLONG
+\c JMP              imm:imm32                386,NOLONG
+\c JMP              mem|far                  8086,NOLONG
+\c JMP              mem|far                  X64
+\c JMP              mem16|far                8086
+\c JMP              mem32|far                386
+\c JMP              mem64|far                X64
+\c JMP              mem|near                 8086
+\c JMP              mem16|near               8086
+\c JMP              mem32|near               386,NOLONG
+\c JMP              mem64|near               X64
+\c JMP              reg16                    8086
+\c JMP              reg32                    386,NOLONG
+\c JMP              reg64                    X64
+\c JMP              mem                      8086
+\c JMP              mem16                    8086
+\c JMP              mem32                    386,NOLONG
+\c JMP              mem64                    X64
+\c JMPE             imm                      IA64
+\c JMPE             imm16                    IA64
+\c JMPE             imm32                    IA64
+\c JMPE             rm16                     IA64
+\c JMPE             rm32                     IA64
+\c LAHF                                      8086
+\c LAR              reg16,mem                286,PROT,SW
+\c LAR              reg16,reg16              286,PROT
+\c LAR              reg16,reg32              386,PROT
+\c LAR              reg16,reg64              X64,PROT,ND
+\c LAR              reg32,mem                386,PROT,SW
+\c LAR              reg32,reg16              386,PROT
+\c LAR              reg32,reg32              386,PROT
+\c LAR              reg32,reg64              X64,PROT,ND
+\c LAR              reg64,mem                X64,PROT,SW
+\c LAR              reg64,reg16              X64,PROT
+\c LAR              reg64,reg32              X64,PROT
+\c LAR              reg64,reg64              X64,PROT
+\c LDS              reg16,mem                8086,NOLONG
+\c LDS              reg32,mem                386,NOLONG
+\c LEA              reg16,mem                8086
+\c LEA              reg32,mem                386
+\c LEA              reg64,mem                X64
+\c LEAVE                                     186
+\c LES              reg16,mem                8086,NOLONG
+\c LES              reg32,mem                386,NOLONG
+\c LFENCE                                    X64,AMD
+\c LFS              reg16,mem                386
+\c LFS              reg32,mem                386
+\c LGDT             mem                      286,PRIV
+\c LGS              reg16,mem                386
+\c LGS              reg32,mem                386
+\c LIDT             mem                      286,PRIV
+\c LLDT             mem                      286,PROT,PRIV
+\c LLDT             mem16                    286,PROT,PRIV
+\c LLDT             reg16                    286,PROT,PRIV
+\c LMSW             mem                      286,PRIV
+\c LMSW             mem16                    286,PRIV
+\c LMSW             reg16                    286,PRIV
+\c LOADALL                                   386,UNDOC
+\c LOADALL286                                286,UNDOC
+\c LODSB                                     8086
+\c LODSD                                     386
+\c LODSQ                                     X64
+\c LODSW                                     8086
+\c LOOP             imm                      8086
+\c LOOP             imm,reg_cx               8086,NOLONG
+\c LOOP             imm,reg_ecx              386
+\c LOOP             imm,reg_rcx              X64
+\c LOOPE            imm                      8086
+\c LOOPE            imm,reg_cx               8086,NOLONG
+\c LOOPE            imm,reg_ecx              386
+\c LOOPE            imm,reg_rcx              X64
+\c LOOPNE           imm                      8086
+\c LOOPNE           imm,reg_cx               8086,NOLONG
+\c LOOPNE           imm,reg_ecx              386
+\c LOOPNE           imm,reg_rcx              X64
+\c LOOPNZ           imm                      8086
+\c LOOPNZ           imm,reg_cx               8086,NOLONG
+\c LOOPNZ           imm,reg_ecx              386
+\c LOOPNZ           imm,reg_rcx              X64
+\c LOOPZ            imm                      8086
+\c LOOPZ            imm,reg_cx               8086,NOLONG
+\c LOOPZ            imm,reg_ecx              386
+\c LOOPZ            imm,reg_rcx              X64
+\c LSL              reg16,mem                286,PROT,SW
+\c LSL              reg16,reg16              286,PROT
+\c LSL              reg16,reg32              386,PROT
+\c LSL              reg16,reg64              X64,PROT,ND
+\c LSL              reg32,mem                386,PROT,SW
+\c LSL              reg32,reg16              386,PROT
+\c LSL              reg32,reg32              386,PROT
+\c LSL              reg32,reg64              X64,PROT,ND
+\c LSL              reg64,mem                X64,PROT,SW
+\c LSL              reg64,reg16              X64,PROT
+\c LSL              reg64,reg32              X64,PROT
+\c LSL              reg64,reg64              X64,PROT
+\c LSS              reg16,mem                386
+\c LSS              reg32,mem                386
+\c LTR              mem                      286,PROT,PRIV
+\c LTR              mem16                    286,PROT,PRIV
+\c LTR              reg16                    286,PROT,PRIV
+\c MFENCE                                    X64,AMD
+\c MONITOR                                   PRESCOTT
+\c MONITOR          reg_eax,reg_ecx,reg_edx  PRESCOTT,ND
+\c MONITOR          reg_rax,reg_ecx,reg_edx  X64,ND
+\c MOV              mem,reg_sreg             8086
+\c MOV              reg16,reg_sreg           8086
+\c MOV              reg32,reg_sreg           386
+\c MOV              reg_sreg,mem             8086
+\c MOV              reg_sreg,reg16           8086
+\c MOV              reg_sreg,reg32           386
+\c MOV              reg_al,mem_offs          8086
+\c MOV              reg_ax,mem_offs          8086
+\c MOV              reg_eax,mem_offs         386
+\c MOV              reg_rax,mem_offs         X64
+\c MOV              mem_offs,reg_al          8086
+\c MOV              mem_offs,reg_ax          8086
+\c MOV              mem_offs,reg_eax         386
+\c MOV              mem_offs,reg_rax         X64
+\c MOV              reg32,reg_creg           386,PRIV,NOLONG
+\c MOV              reg64,reg_creg           X64,PRIV
+\c MOV              reg_creg,reg32           386,PRIV,NOLONG
+\c MOV              reg_creg,reg64           X64,PRIV
+\c MOV              reg32,reg_dreg           386,PRIV,NOLONG
+\c MOV              reg64,reg_dreg           X64,PRIV
+\c MOV              reg_dreg,reg32           386,PRIV,NOLONG
+\c MOV              reg_dreg,reg64           X64,PRIV
+\c MOV              reg32,reg_treg           386,NOLONG,ND
+\c MOV              reg_treg,reg32           386,NOLONG,ND
+\c MOV              mem,reg8                 8086
+\c MOV              reg8,reg8                8086
+\c MOV              mem,reg16                8086
+\c MOV              reg16,reg16              8086
+\c MOV              mem,reg32                386
+\c MOV              reg32,reg32              386
+\c MOV              mem,reg64                X64
+\c MOV              reg64,reg64              X64
+\c MOV              reg8,mem                 8086
+\c MOV              reg8,reg8                8086
+\c MOV              reg16,mem                8086
+\c MOV              reg16,reg16              8086
+\c MOV              reg32,mem                386
+\c MOV              reg32,reg32              386
+\c MOV              reg64,mem                X64
+\c MOV              reg64,reg64              X64
+\c MOV              reg8,imm                 8086
+\c MOV              reg16,imm                8086
+\c MOV              reg32,imm                386
+\c MOV              reg64,imm                X64
+\c MOV              reg64,imm32              X64
+\c MOV              rm8,imm                  8086
+\c MOV              rm16,imm                 8086
+\c MOV              rm32,imm                 386
+\c MOV              rm64,imm                 X64
+\c MOV              mem,imm8                 8086
+\c MOV              mem,imm16                8086
+\c MOV              mem,imm32                386
+\c MOVD             mmxreg,mem               PENT,MMX,SD
+\c MOVD             mmxreg,reg32             PENT,MMX
+\c MOVD             mem,mmxreg               PENT,MMX,SD
+\c MOVD             reg32,mmxreg             PENT,MMX
+\c MOVD             xmmreg,mem               X64,SD
+\c MOVD             xmmreg,reg32             X64
+\c MOVD             mem,xmmreg               X64,SD
+\c MOVD             reg32,xmmreg             X64,SSE
+\c MOVQ             mmxreg,mmxrm             PENT,MMX
+\c MOVQ             mmxrm,mmxreg             PENT,MMX
+\c MOVQ             mmxreg,rm64              X64,MMX
+\c MOVQ             rm64,mmxreg              X64,MMX
+\c MOVSB                                     8086
+\c MOVSD                                     386
+\c MOVSQ                                     X64
+\c MOVSW                                     8086
+\c MOVSX            reg16,mem                386
+\c MOVSX            reg16,reg8               386
+\c MOVSX            reg32,rm8                386
+\c MOVSX            reg32,rm16               386
+\c MOVSX            reg64,rm8                X64
+\c MOVSX            reg64,rm16               X64
+\c MOVSXD           reg64,rm32               X64
+\c MOVSX            reg64,rm32               X64,ND
+\c MOVZX            reg16,mem                386
+\c MOVZX            reg16,reg8               386
+\c MOVZX            reg32,rm8                386
+\c MOVZX            reg32,rm16               386
+\c MOVZX            reg64,rm8                X64
+\c MOVZX            reg64,rm16               X64
+\c MUL              rm8                      8086
+\c MUL              rm16                     8086
+\c MUL              rm32                     386
+\c MUL              rm64                     X64
+\c MWAIT                                     PRESCOTT
+\c MWAIT            reg_eax,reg_ecx          PRESCOTT,ND
+\c NEG              rm8                      8086
+\c NEG              rm16                     8086
+\c NEG              rm32                     386
+\c NEG              rm64                     X64
+\c NOP                                       8086
+\c NOP              rm16                     P6
+\c NOP              rm32                     P6
+\c NOP              rm64                     X64
+\c NOT              rm8                      8086
+\c NOT              rm16                     8086
+\c NOT              rm32                     386
+\c NOT              rm64                     X64
+\c OR               mem,reg8                 8086
+\c OR               reg8,reg8                8086
+\c OR               mem,reg16                8086
+\c OR               reg16,reg16              8086
+\c OR               mem,reg32                386
+\c OR               reg32,reg32              386
+\c OR               mem,reg64                X64
+\c OR               reg64,reg64              X64
+\c OR               reg8,mem                 8086
+\c OR               reg8,reg8                8086
+\c OR               reg16,mem                8086
+\c OR               reg16,reg16              8086
+\c OR               reg32,mem                386
+\c OR               reg32,reg32              386
+\c OR               reg64,mem                X64
+\c OR               reg64,reg64              X64
+\c OR               rm16,imm8                8086
+\c OR               rm32,imm8                386
+\c OR               rm64,imm8                X64
+\c OR               reg_al,imm               8086
+\c OR               reg_ax,sbyte16           8086
+\c OR               reg_ax,imm               8086
+\c OR               reg_eax,sbyte32          386
+\c OR               reg_eax,imm              386
+\c OR               reg_rax,sbyte64          X64
+\c OR               reg_rax,imm              X64
+\c OR               rm8,imm                  8086
+\c OR               rm16,imm                 8086
+\c OR               rm32,imm                 386
+\c OR               rm64,imm                 X64
+\c OR               mem,imm8                 8086
+\c OR               mem,imm16                8086
+\c OR               mem,imm32                386
+\c OUT              imm,reg_al               8086
+\c OUT              imm,reg_ax               8086
+\c OUT              imm,reg_eax              386
+\c OUT              reg_dx,reg_al            8086
+\c OUT              reg_dx,reg_ax            8086
+\c OUT              reg_dx,reg_eax           386
+\c OUTSB                                     186
+\c OUTSD                                     386
+\c OUTSW                                     186
+\c PACKSSDW         mmxreg,mmxrm             PENT,MMX
+\c PACKSSWB         mmxreg,mmxrm             PENT,MMX
+\c PACKUSWB         mmxreg,mmxrm             PENT,MMX
+\c PADDB            mmxreg,mmxrm             PENT,MMX
+\c PADDD            mmxreg,mmxrm             PENT,MMX
+\c PADDSB           mmxreg,mmxrm             PENT,MMX
+\c PADDSIW          mmxreg,mmxrm             PENT,MMX,CYRIX
+\c PADDSW           mmxreg,mmxrm             PENT,MMX
+\c PADDUSB          mmxreg,mmxrm             PENT,MMX
+\c PADDUSW          mmxreg,mmxrm             PENT,MMX
+\c PADDW            mmxreg,mmxrm             PENT,MMX
+\c PAND             mmxreg,mmxrm             PENT,MMX
+\c PANDN            mmxreg,mmxrm             PENT,MMX
+\c PAUSE                                     8086
+\c PAVEB            mmxreg,mmxrm             PENT,MMX,CYRIX
+\c PAVGUSB          mmxreg,mmxrm             PENT,3DNOW
+\c PCMPEQB          mmxreg,mmxrm             PENT,MMX
+\c PCMPEQD          mmxreg,mmxrm             PENT,MMX
+\c PCMPEQW          mmxreg,mmxrm             PENT,MMX
+\c PCMPGTB          mmxreg,mmxrm             PENT,MMX
+\c PCMPGTD          mmxreg,mmxrm             PENT,MMX
+\c PCMPGTW          mmxreg,mmxrm             PENT,MMX
+\c PDISTIB          mmxreg,mem               PENT,MMX,CYRIX
+\c PF2ID            mmxreg,mmxrm             PENT,3DNOW
+\c PFACC            mmxreg,mmxrm             PENT,3DNOW
+\c PFADD            mmxreg,mmxrm             PENT,3DNOW
+\c PFCMPEQ          mmxreg,mmxrm             PENT,3DNOW
+\c PFCMPGE          mmxreg,mmxrm             PENT,3DNOW
+\c PFCMPGT          mmxreg,mmxrm             PENT,3DNOW
+\c PFMAX            mmxreg,mmxrm             PENT,3DNOW
+\c PFMIN            mmxreg,mmxrm             PENT,3DNOW
+\c PFMUL            mmxreg,mmxrm             PENT,3DNOW
+\c PFRCP            mmxreg,mmxrm             PENT,3DNOW
+\c PFRCPIT1         mmxreg,mmxrm             PENT,3DNOW
+\c PFRCPIT2         mmxreg,mmxrm             PENT,3DNOW
+\c PFRSQIT1         mmxreg,mmxrm             PENT,3DNOW
+\c PFRSQRT          mmxreg,mmxrm             PENT,3DNOW
+\c PFSUB            mmxreg,mmxrm             PENT,3DNOW
+\c PFSUBR           mmxreg,mmxrm             PENT,3DNOW
+\c PI2FD            mmxreg,mmxrm             PENT,3DNOW
+\c PMACHRIW         mmxreg,mem               PENT,MMX,CYRIX
+\c PMADDWD          mmxreg,mmxrm             PENT,MMX
+\c PMAGW            mmxreg,mmxrm             PENT,MMX,CYRIX
+\c PMULHRIW         mmxreg,mmxrm             PENT,MMX,CYRIX
+\c PMULHRWA         mmxreg,mmxrm             PENT,3DNOW
+\c PMULHRWC         mmxreg,mmxrm             PENT,MMX,CYRIX
+\c PMULHW           mmxreg,mmxrm             PENT,MMX
+\c PMULLW           mmxreg,mmxrm             PENT,MMX
+\c PMVGEZB          mmxreg,mem               PENT,MMX,CYRIX
+\c PMVLZB           mmxreg,mem               PENT,MMX,CYRIX
+\c PMVNZB           mmxreg,mem               PENT,MMX,CYRIX
+\c PMVZB            mmxreg,mem               PENT,MMX,CYRIX
+\c POP              reg16                    8086
+\c POP              reg32                    386,NOLONG
+\c POP              reg64                    X64
+\c POP              rm16                     8086
+\c POP              rm32                     386,NOLONG
+\c POP              rm64                     X64
+\c POP              reg_cs                   8086,UNDOC,ND
+\c POP              reg_dess                 8086,NOLONG
+\c POP              reg_fsgs                 386
+\c POPA                                      186,NOLONG
+\c POPAD                                     386,NOLONG
+\c POPAW                                     186,NOLONG
+\c POPF                                      8086
+\c POPFD                                     386,NOLONG
+\c POPFQ                                     X64
+\c POPFW                                     8086
+\c POR              mmxreg,mmxrm             PENT,MMX
+\c PREFETCH         mem                      PENT,3DNOW
+\c PREFETCHW        mem                      PENT,3DNOW
+\c PSLLD            mmxreg,mmxrm             PENT,MMX
+\c PSLLD            mmxreg,imm               PENT,MMX
+\c PSLLQ            mmxreg,mmxrm             PENT,MMX
+\c PSLLQ            mmxreg,imm               PENT,MMX
+\c PSLLW            mmxreg,mmxrm             PENT,MMX
+\c PSLLW            mmxreg,imm               PENT,MMX
+\c PSRAD            mmxreg,mmxrm             PENT,MMX
+\c PSRAD            mmxreg,imm               PENT,MMX
+\c PSRAW            mmxreg,mmxrm             PENT,MMX
+\c PSRAW            mmxreg,imm               PENT,MMX
+\c PSRLD            mmxreg,mmxrm             PENT,MMX
+\c PSRLD            mmxreg,imm               PENT,MMX
+\c PSRLQ            mmxreg,mmxrm             PENT,MMX
+\c PSRLQ            mmxreg,imm               PENT,MMX
+\c PSRLW            mmxreg,mmxrm             PENT,MMX
+\c PSRLW            mmxreg,imm               PENT,MMX
+\c PSUBB            mmxreg,mmxrm             PENT,MMX
+\c PSUBD            mmxreg,mmxrm             PENT,MMX
+\c PSUBSB           mmxreg,mmxrm             PENT,MMX
+\c PSUBSIW          mmxreg,mmxrm             PENT,MMX,CYRIX
+\c PSUBSW           mmxreg,mmxrm             PENT,MMX
+\c PSUBUSB          mmxreg,mmxrm             PENT,MMX
+\c PSUBUSW          mmxreg,mmxrm             PENT,MMX
+\c PSUBW            mmxreg,mmxrm             PENT,MMX
+\c PUNPCKHBW        mmxreg,mmxrm             PENT,MMX
+\c PUNPCKHDQ        mmxreg,mmxrm             PENT,MMX
+\c PUNPCKHWD        mmxreg,mmxrm             PENT,MMX
+\c PUNPCKLBW        mmxreg,mmxrm             PENT,MMX
+\c PUNPCKLDQ        mmxreg,mmxrm             PENT,MMX
+\c PUNPCKLWD        mmxreg,mmxrm             PENT,MMX
+\c PUSH             reg16                    8086
+\c PUSH             reg32                    386,NOLONG
+\c PUSH             reg64                    X64
+\c PUSH             rm16                     8086
+\c PUSH             rm32                     386,NOLONG
+\c PUSH             rm64                     X64
+\c PUSH             reg_cs                   8086,NOLONG
+\c PUSH             reg_dess                 8086,NOLONG
+\c PUSH             reg_fsgs                 386
+\c PUSH             imm8                     186
+\c PUSH             imm16                    186,AR0,SZ
+\c PUSH             imm32                    386,NOLONG,AR0,SZ
+\c PUSH             imm32                    386,NOLONG,SD
+\c PUSH             imm64                    X64,AR0,SZ
+\c PUSHA                                     186,NOLONG
+\c PUSHAD                                    386,NOLONG
+\c PUSHAW                                    186,NOLONG
+\c PUSHF                                     8086
+\c PUSHFD                                    386,NOLONG
+\c PUSHFQ                                    X64
+\c PUSHFW                                    8086
+\c PXOR             mmxreg,mmxrm             PENT,MMX
+\c RCL              rm8,unity                8086
+\c RCL              rm8,reg_cl               8086
+\c RCL              rm8,imm                  186
+\c RCL              rm16,unity               8086
+\c RCL              rm16,reg_cl              8086
+\c RCL              rm16,imm                 186
+\c RCL              rm32,unity               386
+\c RCL              rm32,reg_cl              386
+\c RCL              rm32,imm                 386
+\c RCL              rm64,unity               X64
+\c RCL              rm64,reg_cl              X64
+\c RCL              rm64,imm                 X64
+\c RCR              rm8,unity                8086
+\c RCR              rm8,reg_cl               8086
+\c RCR              rm8,imm                  186
+\c RCR              rm16,unity               8086
+\c RCR              rm16,reg_cl              8086
+\c RCR              rm16,imm                 186
+\c RCR              rm32,unity               386
+\c RCR              rm32,reg_cl              386
+\c RCR              rm32,imm                 386
+\c RCR              rm64,unity               X64
+\c RCR              rm64,reg_cl              X64
+\c RCR              rm64,imm                 X64
+\c RDSHR            rm32                     P6,CYRIXM
+\c RDMSR                                     PENT,PRIV
+\c RDPMC                                     P6
+\c RDTSC                                     PENT
+\c RDTSCP                                    X86_64
+\c RET                                       8086
+\c RET              imm                      8086,SW
+\c RETF                                      8086
+\c RETF             imm                      8086,SW
+\c RETN                                      8086
+\c RETN             imm                      8086,SW
+\c ROL              rm8,unity                8086
+\c ROL              rm8,reg_cl               8086
+\c ROL              rm8,imm                  186
+\c ROL              rm16,unity               8086
+\c ROL              rm16,reg_cl              8086
+\c ROL              rm16,imm                 186
+\c ROL              rm32,unity               386
+\c ROL              rm32,reg_cl              386
+\c ROL              rm32,imm                 386
+\c ROL              rm64,unity               X64
+\c ROL              rm64,reg_cl              X64
+\c ROL              rm64,imm                 X64
+\c ROR              rm8,unity                8086
+\c ROR              rm8,reg_cl               8086
+\c ROR              rm8,imm                  186
+\c ROR              rm16,unity               8086
+\c ROR              rm16,reg_cl              8086
+\c ROR              rm16,imm                 186
+\c ROR              rm32,unity               386
+\c ROR              rm32,reg_cl              386
+\c ROR              rm32,imm                 386
+\c ROR              rm64,unity               X64
+\c ROR              rm64,reg_cl              X64
+\c ROR              rm64,imm                 X64
+\c RDM                                       P6,CYRIX,ND
+\c RSDC             reg_sreg,mem80           486,CYRIXM
+\c RSLDT            mem80                    486,CYRIXM
+\c RSM                                       PENTM
+\c RSTS             mem80                    486,CYRIXM
+\c SAHF                                      8086
+\c SAL              rm8,unity                8086,ND
+\c SAL              rm8,reg_cl               8086,ND
+\c SAL              rm8,imm                  186,ND
+\c SAL              rm16,unity               8086,ND
+\c SAL              rm16,reg_cl              8086,ND
+\c SAL              rm16,imm                 186,ND
+\c SAL              rm32,unity               386,ND
+\c SAL              rm32,reg_cl              386,ND
+\c SAL              rm32,imm                 386,ND
+\c SAL              rm64,unity               X64,ND
+\c SAL              rm64,reg_cl              X64,ND
+\c SAL              rm64,imm                 X64,ND
+\c SALC                                      8086,UNDOC
+\c SAR              rm8,unity                8086
+\c SAR              rm8,reg_cl               8086
+\c SAR              rm8,imm                  186
+\c SAR              rm16,unity               8086
+\c SAR              rm16,reg_cl              8086
+\c SAR              rm16,imm                 186
+\c SAR              rm32,unity               386
+\c SAR              rm32,reg_cl              386
+\c SAR              rm32,imm                 386
+\c SAR              rm64,unity               X64
+\c SAR              rm64,reg_cl              X64
+\c SAR              rm64,imm                 X64
+\c SBB              mem,reg8                 8086
+\c SBB              reg8,reg8                8086
+\c SBB              mem,reg16                8086
+\c SBB              reg16,reg16              8086
+\c SBB              mem,reg32                386
+\c SBB              reg32,reg32              386
+\c SBB              mem,reg64                X64
+\c SBB              reg64,reg64              X64
+\c SBB              reg8,mem                 8086
+\c SBB              reg8,reg8                8086
+\c SBB              reg16,mem                8086
+\c SBB              reg16,reg16              8086
+\c SBB              reg32,mem                386
+\c SBB              reg32,reg32              386
+\c SBB              reg64,mem                X64
+\c SBB              reg64,reg64              X64
+\c SBB              rm16,imm8                8086
+\c SBB              rm32,imm8                386
+\c SBB              rm64,imm8                X64
+\c SBB              reg_al,imm               8086
+\c SBB              reg_ax,sbyte16           8086
+\c SBB              reg_ax,imm               8086
+\c SBB              reg_eax,sbyte32          386
+\c SBB              reg_eax,imm              386
+\c SBB              reg_rax,sbyte64          X64
+\c SBB              reg_rax,imm              X64
+\c SBB              rm8,imm                  8086
+\c SBB              rm16,imm                 8086
+\c SBB              rm32,imm                 386
+\c SBB              rm64,imm                 X64
+\c SBB              mem,imm8                 8086
+\c SBB              mem,imm16                8086
+\c SBB              mem,imm32                386
+\c SCASB                                     8086
+\c SCASD                                     386
+\c SCASQ                                     X64
+\c SCASW                                     8086
+\c SFENCE                                    X64,AMD
+\c SGDT             mem                      286
+\c SHL              rm8,unity                8086
+\c SHL              rm8,reg_cl               8086
+\c SHL              rm8,imm                  186
+\c SHL              rm16,unity               8086
+\c SHL              rm16,reg_cl              8086
+\c SHL              rm16,imm                 186
+\c SHL              rm32,unity               386
+\c SHL              rm32,reg_cl              386
+\c SHL              rm32,imm                 386
+\c SHL              rm64,unity               X64
+\c SHL              rm64,reg_cl              X64
+\c SHL              rm64,imm                 X64
+\c SHLD             mem,reg16,imm            3862
+\c SHLD             reg16,reg16,imm          3862
+\c SHLD             mem,reg32,imm            3862
+\c SHLD             reg32,reg32,imm          3862
+\c SHLD             mem,reg64,imm            X642
+\c SHLD             reg64,reg64,imm          X642
+\c SHLD             mem,reg16,reg_cl         386
+\c SHLD             reg16,reg16,reg_cl       386
+\c SHLD             mem,reg32,reg_cl         386
+\c SHLD             reg32,reg32,reg_cl       386
+\c SHLD             mem,reg64,reg_cl         X64
+\c SHLD             reg64,reg64,reg_cl       X64
+\c SHR              rm8,unity                8086
+\c SHR              rm8,reg_cl               8086
+\c SHR              rm8,imm                  186
+\c SHR              rm16,unity               8086
+\c SHR              rm16,reg_cl              8086
+\c SHR              rm16,imm                 186
+\c SHR              rm32,unity               386
+\c SHR              rm32,reg_cl              386
+\c SHR              rm32,imm                 386
+\c SHR              rm64,unity               X64
+\c SHR              rm64,reg_cl              X64
+\c SHR              rm64,imm                 X64
+\c SHRD             mem,reg16,imm            3862
+\c SHRD             reg16,reg16,imm          3862
+\c SHRD             mem,reg32,imm            3862
+\c SHRD             reg32,reg32,imm          3862
+\c SHRD             mem,reg64,imm            X642
+\c SHRD             reg64,reg64,imm          X642
+\c SHRD             mem,reg16,reg_cl         386
+\c SHRD             reg16,reg16,reg_cl       386
+\c SHRD             mem,reg32,reg_cl         386
+\c SHRD             reg32,reg32,reg_cl       386
+\c SHRD             mem,reg64,reg_cl         X64
+\c SHRD             reg64,reg64,reg_cl       X64
+\c SIDT             mem                      286
+\c SLDT             mem                      286
+\c SLDT             mem16                    286
+\c SLDT             reg16                    286
+\c SLDT             reg32                    386
+\c SLDT             reg64                    X64,ND
+\c SLDT             reg64                    X64
+\c SKINIT                                    X64
+\c SMI                                       386,UNDOC
+\c SMINT                                     P6,CYRIX,ND
+\c SMINTOLD                                  486,CYRIX,ND
+\c SMSW             mem                      286
+\c SMSW             mem16                    286
+\c SMSW             reg16                    286
+\c SMSW             reg32                    386
+\c STC                                       8086
+\c STD                                       8086
+\c STGI                                      X64
+\c STI                                       8086
+\c STOSB                                     8086
+\c STOSD                                     386
+\c STOSQ                                     X64
+\c STOSW                                     8086
+\c STR              mem                      286,PROT
+\c STR              mem16                    286,PROT
+\c STR              reg16                    286,PROT
+\c STR              reg32                    386,PROT
+\c STR              reg64                    X64
+\c SUB              mem,reg8                 8086
+\c SUB              reg8,reg8                8086
+\c SUB              mem,reg16                8086
+\c SUB              reg16,reg16              8086
+\c SUB              mem,reg32                386
+\c SUB              reg32,reg32              386
+\c SUB              mem,reg64                X64
+\c SUB              reg64,reg64              X64
+\c SUB              reg8,mem                 8086
+\c SUB              reg8,reg8                8086
+\c SUB              reg16,mem                8086
+\c SUB              reg16,reg16              8086
+\c SUB              reg32,mem                386
+\c SUB              reg32,reg32              386
+\c SUB              reg64,mem                X64
+\c SUB              reg64,reg64              X64
+\c SUB              rm16,imm8                8086
+\c SUB              rm32,imm8                386
+\c SUB              rm64,imm8                X64
+\c SUB              reg_al,imm               8086
+\c SUB              reg_ax,sbyte16           8086
+\c SUB              reg_ax,imm               8086
+\c SUB              reg_eax,sbyte32          386
+\c SUB              reg_eax,imm              386
+\c SUB              reg_rax,sbyte64          X64
+\c SUB              reg_rax,imm              X64
+\c SUB              rm8,imm                  8086
+\c SUB              rm16,imm                 8086
+\c SUB              rm32,imm                 386
+\c SUB              rm64,imm                 X64
+\c SUB              mem,imm8                 8086
+\c SUB              mem,imm16                8086
+\c SUB              mem,imm32                386
+\c SVDC             mem80,reg_sreg           486,CYRIXM
+\c SVLDT            mem80                    486,CYRIXM,ND
+\c SVTS             mem80                    486,CYRIXM
+\c SWAPGS                                    X64
+\c SYSCALL                                   P6,AMD
+\c SYSENTER                                  P6
+\c SYSEXIT                                   P6,PRIV
+\c SYSRET                                    P6,PRIV,AMD
+\c TEST             mem,reg8                 8086
+\c TEST             reg8,reg8                8086
+\c TEST             mem,reg16                8086
+\c TEST             reg16,reg16              8086
+\c TEST             mem,reg32                386
+\c TEST             reg32,reg32              386
+\c TEST             mem,reg64                X64
+\c TEST             reg64,reg64              X64
+\c TEST             reg8,mem                 8086
+\c TEST             reg16,mem                8086
+\c TEST             reg32,mem                386
+\c TEST             reg64,mem                X64
+\c TEST             reg_al,imm               8086
+\c TEST             reg_ax,imm               8086
+\c TEST             reg_eax,imm              386
+\c TEST             reg_rax,imm              X64
+\c TEST             rm8,imm                  8086
+\c TEST             rm16,imm                 8086
+\c TEST             rm32,imm                 386
+\c TEST             rm64,imm                 X64
+\c TEST             mem,imm8                 8086
+\c TEST             mem,imm16                8086
+\c TEST             mem,imm32                386
+\c UD0                                       186,UNDOC
+\c UD1                                       186,UNDOC
+\c UD2B                                      186,UNDOC,ND
+\c UD2                                       186
+\c UD2A                                      186,ND
+\c UMOV             mem,reg8                 386,UNDOC,ND
+\c UMOV             reg8,reg8                386,UNDOC,ND
+\c UMOV             mem,reg16                386,UNDOC,ND
+\c UMOV             reg16,reg16              386,UNDOC,ND
+\c UMOV             mem,reg32                386,UNDOC,ND
+\c UMOV             reg32,reg32              386,UNDOC,ND
+\c UMOV             reg8,mem                 386,UNDOC,ND
+\c UMOV             reg8,reg8                386,UNDOC,ND
+\c UMOV             reg16,mem                386,UNDOC,ND
+\c UMOV             reg16,reg16              386,UNDOC,ND
+\c UMOV             reg32,mem                386,UNDOC,ND
+\c UMOV             reg32,reg32              386,UNDOC,ND
+\c VERR             mem                      286,PROT
+\c VERR             mem16                    286,PROT
+\c VERR             reg16                    286,PROT
+\c VERW             mem                      286,PROT
+\c VERW             mem16                    286,PROT
+\c VERW             reg16                    286,PROT
+\c FWAIT                                     8086
+\c WBINVD                                    486,PRIV
+\c WRSHR            rm32                     P6,CYRIXM
+\c WRMSR                                     PENT,PRIV
+\c XADD             mem,reg8                 486
+\c XADD             reg8,reg8                486
+\c XADD             mem,reg16                486
+\c XADD             reg16,reg16              486
+\c XADD             mem,reg32                486
+\c XADD             reg32,reg32              486
+\c XADD             mem,reg64                X64
+\c XADD             reg64,reg64              X64
+\c XBTS             reg16,mem                386,SW,UNDOC,ND
+\c XBTS             reg16,reg16              386,UNDOC,ND
+\c XBTS             reg32,mem                386,SD,UNDOC,ND
+\c XBTS             reg32,reg32              386,UNDOC,ND
+\c XCHG             reg_ax,reg16             8086
+\c XCHG             reg_eax,reg32na          386
+\c XCHG             reg_rax,reg64            X64
+\c XCHG             reg16,reg_ax             8086
+\c XCHG             reg32na,reg_eax          386
+\c XCHG             reg64,reg_rax            X64
+\c XCHG             reg_eax,reg_eax          386,NOLONG
+\c XCHG             reg8,mem                 8086
+\c XCHG             reg8,reg8                8086
+\c XCHG             reg16,mem                8086
+\c XCHG             reg16,reg16              8086
+\c XCHG             reg32,mem                386
+\c XCHG             reg32,reg32              386
+\c XCHG             reg64,mem                X64
+\c XCHG             reg64,reg64              X64
+\c XCHG             mem,reg8                 8086
+\c XCHG             reg8,reg8                8086
+\c XCHG             mem,reg16                8086
+\c XCHG             reg16,reg16              8086
+\c XCHG             mem,reg32                386
+\c XCHG             reg32,reg32              386
+\c XCHG             mem,reg64                X64
+\c XCHG             reg64,reg64              X64
+\c XLATB                                     8086
+\c XLAT                                      8086
+\c XOR              mem,reg8                 8086
+\c XOR              reg8,reg8                8086
+\c XOR              mem,reg16                8086
+\c XOR              reg16,reg16              8086
+\c XOR              mem,reg32                386
+\c XOR              reg32,reg32              386
+\c XOR              mem,reg64                X64
+\c XOR              reg64,reg64              X64
+\c XOR              reg8,mem                 8086
+\c XOR              reg8,reg8                8086
+\c XOR              reg16,mem                8086
+\c XOR              reg16,reg16              8086
+\c XOR              reg32,mem                386
+\c XOR              reg32,reg32              386
+\c XOR              reg64,mem                X64
+\c XOR              reg64,reg64              X64
+\c XOR              rm16,imm8                8086
+\c XOR              rm32,imm8                386
+\c XOR              rm64,imm8                X64
+\c XOR              reg_al,imm               8086
+\c XOR              reg_ax,sbyte16           8086
+\c XOR              reg_ax,imm               8086
+\c XOR              reg_eax,sbyte32          386
+\c XOR              reg_eax,imm              386
+\c XOR              reg_rax,sbyte64          X64
+\c XOR              reg_rax,imm              X64
+\c XOR              rm8,imm                  8086
+\c XOR              rm16,imm                 8086
+\c XOR              rm32,imm                 386
+\c XOR              rm64,imm                 X64
+\c XOR              mem,imm8                 8086
+\c XOR              mem,imm16                8086
+\c XOR              mem,imm32                386
+\c CMOVcc           reg16,mem                P6
+\c CMOVcc           reg16,reg16              P6
+\c CMOVcc           reg32,mem                P6
+\c CMOVcc           reg32,reg32              P6
+\c CMOVcc           reg64,mem                X64
+\c CMOVcc           reg64,reg64              X64
+\c Jcc              imm|near                 386
+\c Jcc              imm16|near               386
+\c Jcc              imm32|near               386
+\c Jcc              imm|short                8086,ND
+\c Jcc              imm                      8086,ND
+\c Jcc              imm                      386,ND
+\c Jcc              imm                      8086,ND
+\c Jcc              imm                      8086
+\c SETcc            mem                      386
+\c SETcc            reg8                     386
+
+\S{} Katmai Streaming SIMD instructions (SSE -- a.k.a. KNI, XMM, MMX2)
+
+\c ADDPS            xmmreg,xmmrm             KATMAI,SSE
+\c ADDSS            xmmreg,xmmrm             KATMAI,SSE,SD
+\c ANDNPS           xmmreg,xmmrm             KATMAI,SSE
+\c ANDPS            xmmreg,xmmrm             KATMAI,SSE
+\c CMPEQPS          xmmreg,xmmrm             KATMAI,SSE
+\c CMPEQSS          xmmreg,xmmrm             KATMAI,SSE
+\c CMPLEPS          xmmreg,xmmrm             KATMAI,SSE
+\c CMPLESS          xmmreg,xmmrm             KATMAI,SSE
+\c CMPLTPS          xmmreg,xmmrm             KATMAI,SSE
+\c CMPLTSS          xmmreg,xmmrm             KATMAI,SSE
+\c CMPNEQPS         xmmreg,xmmrm             KATMAI,SSE
+\c CMPNEQSS         xmmreg,xmmrm             KATMAI,SSE
+\c CMPNLEPS         xmmreg,xmmrm             KATMAI,SSE
+\c CMPNLESS         xmmreg,xmmrm             KATMAI,SSE
+\c CMPNLTPS         xmmreg,xmmrm             KATMAI,SSE
+\c CMPNLTSS         xmmreg,xmmrm             KATMAI,SSE
+\c CMPORDPS         xmmreg,xmmrm             KATMAI,SSE
+\c CMPORDSS         xmmreg,xmmrm             KATMAI,SSE
+\c CMPUNORDPS       xmmreg,xmmrm             KATMAI,SSE
+\c CMPUNORDSS       xmmreg,xmmrm             KATMAI,SSE
+\c CMPPS            xmmreg,mem,imm           KATMAI,SSE
+\c CMPPS            xmmreg,xmmreg,imm        KATMAI,SSE
+\c CMPSS            xmmreg,mem,imm           KATMAI,SSE
+\c CMPSS            xmmreg,xmmreg,imm        KATMAI,SSE
+\c COMISS           xmmreg,xmmrm             KATMAI,SSE
+\c CVTPI2PS         xmmreg,mmxrm             KATMAI,SSE,MMX
+\c CVTPS2PI         mmxreg,xmmrm             KATMAI,SSE,MMX
+\c CVTSI2SS         xmmreg,mem               KATMAI,SSE,SD,AR1,ND
+\c CVTSI2SS         xmmreg,rm32              KATMAI,SSE,SD,AR1
+\c CVTSI2SS         xmmreg,rm64              X64,SSE,AR1
+\c CVTSS2SI         reg32,xmmreg             KATMAI,SSE,SD,AR1
+\c CVTSS2SI         reg32,mem                KATMAI,SSE,SD,AR1
+\c CVTSS2SI         reg64,xmmreg             X64,SSE,SD,AR1
+\c CVTSS2SI         reg64,mem                X64,SSE,SD,AR1
+\c CVTTPS2PI        mmxreg,xmmrm             KATMAI,SSE,MMX
+\c CVTTSS2SI        reg32,xmmrm              KATMAI,SSE,SD,AR1
+\c CVTTSS2SI        reg64,xmmrm              X64,SSE,SD,AR1
+\c DIVPS            xmmreg,xmmrm             KATMAI,SSE
+\c DIVSS            xmmreg,xmmrm             KATMAI,SSE
+\c LDMXCSR          mem                      KATMAI,SSE,SD
+\c MAXPS            xmmreg,xmmrm             KATMAI,SSE
+\c MAXSS            xmmreg,xmmrm             KATMAI,SSE
+\c MINPS            xmmreg,xmmrm             KATMAI,SSE
+\c MINSS            xmmreg,xmmrm             KATMAI,SSE
+\c MOVAPS           xmmreg,mem               KATMAI,SSE
+\c MOVAPS           mem,xmmreg               KATMAI,SSE
+\c MOVAPS           xmmreg,xmmreg            KATMAI,SSE
+\c MOVAPS           xmmreg,xmmreg            KATMAI,SSE
+\c MOVHPS           xmmreg,mem               KATMAI,SSE
+\c MOVHPS           mem,xmmreg               KATMAI,SSE
+\c MOVLHPS          xmmreg,xmmreg            KATMAI,SSE
+\c MOVLPS           xmmreg,mem               KATMAI,SSE
+\c MOVLPS           mem,xmmreg               KATMAI,SSE
+\c MOVHLPS          xmmreg,xmmreg            KATMAI,SSE
+\c MOVMSKPS         reg32,xmmreg             KATMAI,SSE
+\c MOVMSKPS         reg64,xmmreg             X64,SSE
+\c MOVNTPS          mem,xmmreg               KATMAI,SSE
+\c MOVSS            xmmreg,mem               KATMAI,SSE
+\c MOVSS            mem,xmmreg               KATMAI,SSE
+\c MOVSS            xmmreg,xmmreg            KATMAI,SSE
+\c MOVSS            xmmreg,xmmreg            KATMAI,SSE
+\c MOVUPS           xmmreg,mem               KATMAI,SSE
+\c MOVUPS           mem,xmmreg               KATMAI,SSE
+\c MOVUPS           xmmreg,xmmreg            KATMAI,SSE
+\c MOVUPS           xmmreg,xmmreg            KATMAI,SSE
+\c MULPS            xmmreg,xmmrm             KATMAI,SSE
+\c MULSS            xmmreg,xmmrm             KATMAI,SSE
+\c ORPS             xmmreg,xmmrm             KATMAI,SSE
+\c RCPPS            xmmreg,xmmrm             KATMAI,SSE
+\c RCPSS            xmmreg,xmmrm             KATMAI,SSE
+\c RSQRTPS          xmmreg,xmmrm             KATMAI,SSE
+\c RSQRTSS          xmmreg,xmmrm             KATMAI,SSE
+\c SHUFPS           xmmreg,mem,imm           KATMAI,SSE
+\c SHUFPS           xmmreg,xmmreg,imm        KATMAI,SSE
+\c SQRTPS           xmmreg,xmmrm             KATMAI,SSE
+\c SQRTSS           xmmreg,xmmrm             KATMAI,SSE
+\c STMXCSR          mem                      KATMAI,SSE,SD
+\c SUBPS            xmmreg,xmmrm             KATMAI,SSE
+\c SUBSS            xmmreg,xmmrm             KATMAI,SSE
+\c UCOMISS          xmmreg,xmmrm             KATMAI,SSE
+\c UNPCKHPS         xmmreg,xmmrm             KATMAI,SSE
+\c UNPCKLPS         xmmreg,xmmrm             KATMAI,SSE
+\c XORPS            xmmreg,xmmrm             KATMAI,SSE
+
+\S{} Introduced in Deschutes but necessary for SSE support
+
+\c FXRSTOR          mem                      P6,SSE,FPU
+\c FXSAVE           mem                      P6,SSE,FPU
+
+\S{} XSAVE group (AVX and extended state)
+
+\c XGETBV                                    NEHALEM
+\c XSETBV                                    NEHALEM,PRIV
+\c XSAVE            mem                      NEHALEM
+\c XRSTOR           mem                      NEHALEM
+
+\S{} Generic memory operations
+
+\c PREFETCHNTA      mem                      KATMAI
+\c PREFETCHT0       mem                      KATMAI
+\c PREFETCHT1       mem                      KATMAI
+\c PREFETCHT2       mem                      KATMAI
+\c SFENCE                                    KATMAI
+
+\S{} New MMX instructions introduced in Katmai
+
+\c MASKMOVQ         mmxreg,mmxreg            KATMAI,MMX
+\c MOVNTQ           mem,mmxreg               KATMAI,MMX
+\c PAVGB            mmxreg,mmxrm             KATMAI,MMX
+\c PAVGW            mmxreg,mmxrm             KATMAI,MMX
+\c PEXTRW           reg32,mmxreg,imm         KATMAI,MMX
+\c PINSRW           mmxreg,mem,imm           KATMAI,MMX
+\c PINSRW           mmxreg,rm16,imm          KATMAI,MMX
+\c PINSRW           mmxreg,reg32,imm         KATMAI,MMX
+\c PMAXSW           mmxreg,mmxrm             KATMAI,MMX
+\c PMAXUB           mmxreg,mmxrm             KATMAI,MMX
+\c PMINSW           mmxreg,mmxrm             KATMAI,MMX
+\c PMINUB           mmxreg,mmxrm             KATMAI,MMX
+\c PMOVMSKB         reg32,mmxreg             KATMAI,MMX
+\c PMULHUW          mmxreg,mmxrm             KATMAI,MMX
+\c PSADBW           mmxreg,mmxrm             KATMAI,MMX
+\c PSHUFW           mmxreg,mmxrm,imm         KATMAI,MMX2
+
+\S{} AMD Enhanced 3DNow! (Athlon) instructions
+
+\c PF2IW            mmxreg,mmxrm             PENT,3DNOW
+\c PFNACC           mmxreg,mmxrm             PENT,3DNOW
+\c PFPNACC          mmxreg,mmxrm             PENT,3DNOW
+\c PI2FW            mmxreg,mmxrm             PENT,3DNOW
+\c PSWAPD           mmxreg,mmxrm             PENT,3DNOW
+
+\S{} Willamette SSE2 Cacheability Instructions
+
+\c MASKMOVDQU       xmmreg,xmmreg            WILLAMETTE,SSE2
+\c CLFLUSH          mem                      WILLAMETTE,SSE2
+\c MOVNTDQ          mem,xmmreg               WILLAMETTE,SSE2,SO
+\c MOVNTI           mem,reg32                WILLAMETTE,SD
+\c MOVNTI           mem,reg64                X64
+\c MOVNTPD          mem,xmmreg               WILLAMETTE,SSE2,SO
+\c LFENCE                                    WILLAMETTE,SSE2
+\c MFENCE                                    WILLAMETTE,SSE2
+
+\S{} Willamette MMX instructions (SSE2 SIMD Integer Instructions)
+
+\c MOVD             mem,xmmreg               WILLAMETTE,SSE2,SD
+\c MOVD             xmmreg,mem               WILLAMETTE,SSE2,SD
+\c MOVD             xmmreg,rm32              WILLAMETTE,SSE2
+\c MOVD             rm32,xmmreg              WILLAMETTE,SSE2
+\c MOVDQA           xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVDQA           mem,xmmreg               WILLAMETTE,SSE2,SO
+\c MOVDQA           xmmreg,mem               WILLAMETTE,SSE2,SO
+\c MOVDQA           xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVDQU           xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVDQU           mem,xmmreg               WILLAMETTE,SSE2,SO
+\c MOVDQU           xmmreg,mem               WILLAMETTE,SSE2,SO
+\c MOVDQU           xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVDQ2Q          mmxreg,xmmreg            WILLAMETTE,SSE2
+\c MOVQ             xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVQ             xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVQ             mem,xmmreg               WILLAMETTE,SSE2
+\c MOVQ             xmmreg,mem               WILLAMETTE,SSE2
+\c MOVQ             xmmreg,rm64              X64,SSE2
+\c MOVQ             rm64,xmmreg              X64,SSE2
+\c MOVQ2DQ          xmmreg,mmxreg            WILLAMETTE,SSE2
+\c PACKSSWB         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PACKSSDW         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PACKUSWB         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PADDB            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PADDW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PADDD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PADDQ            mmxreg,mmxrm             WILLAMETTE,MMX
+\c PADDQ            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PADDSB           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PADDSW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PADDUSB          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PADDUSW          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PAND             xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PANDN            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PAVGB            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PAVGW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PCMPEQB          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PCMPEQW          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PCMPEQD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PCMPGTB          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PCMPGTW          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PCMPGTD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PEXTRW           reg32,xmmreg,imm         WILLAMETTE,SSE2
+\c PINSRW           xmmreg,reg16,imm         WILLAMETTE,SSE2
+\c PINSRW           xmmreg,reg32,imm         WILLAMETTE,SSE2,ND
+\c PINSRW           xmmreg,mem,imm           WILLAMETTE,SSE2
+\c PINSRW           xmmreg,mem16,imm         WILLAMETTE,SSE2
+\c PMADDWD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PMAXSW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PMAXUB           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PMINSW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PMINUB           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PMOVMSKB         reg32,xmmreg             WILLAMETTE,SSE2
+\c PMULHUW          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PMULHW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PMULLW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PMULUDQ          mmxreg,mmxrm             WILLAMETTE,SSE2,SO
+\c PMULUDQ          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c POR              xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSADBW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSHUFD           xmmreg,xmmreg,imm        WILLAMETTE,SSE2
+\c PSHUFD           xmmreg,mem,imm           WILLAMETTE,SSE22
+\c PSHUFHW          xmmreg,xmmreg,imm        WILLAMETTE,SSE2
+\c PSHUFHW          xmmreg,mem,imm           WILLAMETTE,SSE22
+\c PSHUFLW          xmmreg,xmmreg,imm        WILLAMETTE,SSE2
+\c PSHUFLW          xmmreg,mem,imm           WILLAMETTE,SSE22
+\c PSLLDQ           xmmreg,imm               WILLAMETTE,SSE2,AR1
+\c PSLLW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSLLW            xmmreg,imm               WILLAMETTE,SSE2,AR1
+\c PSLLD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSLLD            xmmreg,imm               WILLAMETTE,SSE2,AR1
+\c PSLLQ            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSLLQ            xmmreg,imm               WILLAMETTE,SSE2,AR1
+\c PSRAW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSRAW            xmmreg,imm               WILLAMETTE,SSE2,AR1
+\c PSRAD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSRAD            xmmreg,imm               WILLAMETTE,SSE2,AR1
+\c PSRLDQ           xmmreg,imm               WILLAMETTE,SSE2,AR1
+\c PSRLW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSRLW            xmmreg,imm               WILLAMETTE,SSE2,AR1
+\c PSRLD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSRLD            xmmreg,imm               WILLAMETTE,SSE2,AR1
+\c PSRLQ            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSRLQ            xmmreg,imm               WILLAMETTE,SSE2,AR1
+\c PSUBB            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSUBW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSUBD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSUBQ            mmxreg,mmxrm             WILLAMETTE,SSE2,SO
+\c PSUBQ            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSUBSB           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSUBSW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSUBUSB          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PSUBUSW          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PUNPCKHBW        xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PUNPCKHWD        xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PUNPCKHDQ        xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PUNPCKHQDQ       xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PUNPCKLBW        xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PUNPCKLWD        xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PUNPCKLDQ        xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PUNPCKLQDQ       xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c PXOR             xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+
+\S{} Willamette Streaming SIMD instructions (SSE2)
+
+\c ADDPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c ADDSD            xmmreg,xmmrm             WILLAMETTE,SSE2
+\c ANDNPD           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c ANDPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CMPEQPD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CMPEQSD          xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CMPLEPD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CMPLESD          xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CMPLTPD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CMPLTSD          xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CMPNEQPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CMPNEQSD         xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CMPNLEPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CMPNLESD         xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CMPNLTPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CMPNLTSD         xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CMPORDPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CMPORDSD         xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CMPUNORDPD       xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CMPUNORDSD       xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CMPPD            xmmreg,xmmrm,imm         WILLAMETTE,SSE22
+\c CMPSD            xmmreg,xmmrm,imm         WILLAMETTE,SSE2
+\c COMISD           xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CVTDQ2PD         xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CVTDQ2PS         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CVTPD2DQ         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CVTPD2PI         mmxreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CVTPD2PS         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CVTPI2PD         xmmreg,mmxrm             WILLAMETTE,SSE2
+\c CVTPS2DQ         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CVTPS2PD         xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CVTSD2SI         reg32,xmmreg             WILLAMETTE,SSE2,AR1
+\c CVTSD2SI         reg32,mem                WILLAMETTE,SSE2,AR1
+\c CVTSD2SI         reg64,xmmreg             X64,SSE2,AR1
+\c CVTSD2SI         reg64,mem                X64,SSE2,AR1
+\c CVTSD2SS         xmmreg,xmmrm             WILLAMETTE,SSE2
+\c CVTSI2SD         xmmreg,mem               WILLAMETTE,SSE2,SD,AR1,ND
+\c CVTSI2SD         xmmreg,rm32              WILLAMETTE,SSE2,SD,AR1
+\c CVTSI2SD         xmmreg,rm64              X64,SSE2,AR1
+\c CVTSS2SD         xmmreg,xmmrm             WILLAMETTE,SSE2,SD
+\c CVTTPD2PI        mmxreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CVTTPD2DQ        xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CVTTPS2DQ        xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c CVTTSD2SI        reg32,xmmreg             WILLAMETTE,SSE2,AR1
+\c CVTTSD2SI        reg32,mem                WILLAMETTE,SSE2,AR1
+\c CVTTSD2SI        reg64,xmmreg             X64,SSE2,AR1
+\c CVTTSD2SI        reg64,mem                X64,SSE2,AR1
+\c DIVPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c DIVSD            xmmreg,xmmrm             WILLAMETTE,SSE2
+\c MAXPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c MAXSD            xmmreg,xmmrm             WILLAMETTE,SSE2
+\c MINPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c MINSD            xmmreg,xmmrm             WILLAMETTE,SSE2
+\c MOVAPD           xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVAPD           xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVAPD           mem,xmmreg               WILLAMETTE,SSE2,SO
+\c MOVAPD           xmmreg,mem               WILLAMETTE,SSE2,SO
+\c MOVHPD           mem,xmmreg               WILLAMETTE,SSE2
+\c MOVHPD           xmmreg,mem               WILLAMETTE,SSE2
+\c MOVLPD           mem,xmmreg               WILLAMETTE,SSE2
+\c MOVLPD           xmmreg,mem               WILLAMETTE,SSE2
+\c MOVMSKPD         reg32,xmmreg             WILLAMETTE,SSE2
+\c MOVMSKPD         reg64,xmmreg             X64,SSE2
+\c MOVSD            xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVSD            xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVSD            mem,xmmreg               WILLAMETTE,SSE2
+\c MOVSD            xmmreg,mem               WILLAMETTE,SSE2
+\c MOVUPD           xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVUPD           xmmreg,xmmreg            WILLAMETTE,SSE2
+\c MOVUPD           mem,xmmreg               WILLAMETTE,SSE2,SO
+\c MOVUPD           xmmreg,mem               WILLAMETTE,SSE2,SO
+\c MULPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c MULSD            xmmreg,xmmrm             WILLAMETTE,SSE2
+\c ORPD             xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c SHUFPD           xmmreg,xmmreg,imm        WILLAMETTE,SSE2
+\c SHUFPD           xmmreg,mem,imm           WILLAMETTE,SSE2
+\c SQRTPD           xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c SQRTSD           xmmreg,xmmrm             WILLAMETTE,SSE2
+\c SUBPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c SUBSD            xmmreg,xmmrm             WILLAMETTE,SSE2
+\c UCOMISD          xmmreg,xmmrm             WILLAMETTE,SSE2
+\c UNPCKHPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c UNPCKLPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+\c XORPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO
+
+\S{} Prescott New Instructions (SSE3)
+
+\c ADDSUBPD         xmmreg,xmmrm             PRESCOTT,SSE3,SO
+\c ADDSUBPS         xmmreg,xmmrm             PRESCOTT,SSE3,SO
+\c HADDPD           xmmreg,xmmrm             PRESCOTT,SSE3,SO
+\c HADDPS           xmmreg,xmmrm             PRESCOTT,SSE3,SO
+\c HSUBPD           xmmreg,xmmrm             PRESCOTT,SSE3,SO
+\c HSUBPS           xmmreg,xmmrm             PRESCOTT,SSE3,SO
+\c LDDQU            xmmreg,mem               PRESCOTT,SSE3,SO
+\c MOVDDUP          xmmreg,xmmrm             PRESCOTT,SSE3
+\c MOVSHDUP         xmmreg,xmmrm             PRESCOTT,SSE3
+\c MOVSLDUP         xmmreg,xmmrm             PRESCOTT,SSE3
+
+\S{} VMX Instructions
+
+\c VMCALL                                    VMX
+\c VMCLEAR          mem                      VMX
+\c VMLAUNCH                                  VMX
+\c VMLOAD                                    X64,VMX
+\c VMMCALL                                   X64,VMX
+\c VMPTRLD          mem                      VMX
+\c VMPTRST          mem                      VMX
+\c VMREAD           rm32,reg32               VMX,NOLONG,SD
+\c VMREAD           rm64,reg64               X64,VMX
+\c VMRESUME                                  VMX
+\c VMRUN                                     X64,VMX
+\c VMSAVE                                    X64,VMX
+\c VMWRITE          reg32,rm32               VMX,NOLONG,SD
+\c VMWRITE          reg64,rm64               X64,VMX
+\c VMXOFF                                    VMX
+\c VMXON            mem                      VMX
+
+\S{} Extended Page Tables VMX instructions
+
+\c INVEPT           reg32,mem                VMX,SO,NOLONG
+\c INVEPT           reg64,mem                VMX,SO,LONG
+\c INVVPID          reg32,mem                VMX,SO,NOLONG
+\c INVVPID          reg64,mem                VMX,SO,LONG
+
+\S{} Tejas New Instructions (SSSE3)
+
+\c PABSB            mmxreg,mmxrm             SSSE3,MMX
+\c PABSB            xmmreg,xmmrm             SSSE3
+\c PABSW            mmxreg,mmxrm             SSSE3,MMX
+\c PABSW            xmmreg,xmmrm             SSSE3
+\c PABSD            mmxreg,mmxrm             SSSE3,MMX
+\c PABSD            xmmreg,xmmrm             SSSE3
+\c PALIGNR          mmxreg,mmxrm,imm         SSSE3,MMX
+\c PALIGNR          xmmreg,xmmrm,imm         SSSE3
+\c PHADDW           mmxreg,mmxrm             SSSE3,MMX
+\c PHADDW           xmmreg,xmmrm             SSSE3
+\c PHADDD           mmxreg,mmxrm             SSSE3,MMX
+\c PHADDD           xmmreg,xmmrm             SSSE3
+\c PHADDSW          mmxreg,mmxrm             SSSE3,MMX
+\c PHADDSW          xmmreg,xmmrm             SSSE3
+\c PHSUBW           mmxreg,mmxrm             SSSE3,MMX
+\c PHSUBW           xmmreg,xmmrm             SSSE3
+\c PHSUBD           mmxreg,mmxrm             SSSE3,MMX
+\c PHSUBD           xmmreg,xmmrm             SSSE3
+\c PHSUBSW          mmxreg,mmxrm             SSSE3,MMX
+\c PHSUBSW          xmmreg,xmmrm             SSSE3
+\c PMADDUBSW        mmxreg,mmxrm             SSSE3,MMX
+\c PMADDUBSW        xmmreg,xmmrm             SSSE3
+\c PMULHRSW         mmxreg,mmxrm             SSSE3,MMX
+\c PMULHRSW         xmmreg,xmmrm             SSSE3
+\c PSHUFB           mmxreg,mmxrm             SSSE3,MMX
+\c PSHUFB           xmmreg,xmmrm             SSSE3
+\c PSIGNB           mmxreg,mmxrm             SSSE3,MMX
+\c PSIGNB           xmmreg,xmmrm             SSSE3
+\c PSIGNW           mmxreg,mmxrm             SSSE3,MMX
+\c PSIGNW           xmmreg,xmmrm             SSSE3
+\c PSIGND           mmxreg,mmxrm             SSSE3,MMX
+\c PSIGND           xmmreg,xmmrm             SSSE3
+
+\S{} AMD SSE4A
+
+\c EXTRQ            xmmreg,imm,imm           SSE4A,AMD
+\c EXTRQ            xmmreg,xmmreg            SSE4A,AMD
+\c INSERTQ          xmmreg,xmmreg,imm,imm    SSE4A,AMD
+\c INSERTQ          xmmreg,xmmreg            SSE4A,AMD
+\c MOVNTSD          mem,xmmreg               SSE4A,AMD
+\c MOVNTSS          mem,xmmreg               SSE4A,AMD,SD
+
+\S{} New instructions in Barcelona
+
+\c LZCNT            reg16,rm16               P6,AMD
+\c LZCNT            reg32,rm32               P6,AMD
+\c LZCNT            reg64,rm64               X64,AMD
+
+\S{} Penryn New Instructions (SSE4.1)
+
+\c BLENDPD          xmmreg,xmmrm,imm         SSE41
+\c BLENDPS          xmmreg,xmmrm,imm         SSE41
+\c BLENDVPD         xmmreg,xmmrm,xmm0        SSE41
+\c BLENDVPS         xmmreg,xmmrm,xmm0        SSE41
+\c DPPD             xmmreg,xmmrm,imm         SSE41
+\c DPPS             xmmreg,xmmrm,imm         SSE41
+\c EXTRACTPS        rm32,xmmreg,imm          SSE41
+\c EXTRACTPS        reg64,xmmreg,imm         SSE41,X64
+\c INSERTPS         xmmreg,xmmrm,imm         SSE41,SD
+\c MOVNTDQA         xmmreg,mem               SSE41
+\c MPSADBW          xmmreg,xmmrm,imm         SSE41
+\c PACKUSDW         xmmreg,xmmrm             SSE41
+\c PBLENDVB         xmmreg,xmmrm,xmm0        SSE41
+\c PBLENDW          xmmreg,xmmrm,imm         SSE41
+\c PCMPEQQ          xmmreg,xmmrm             SSE41
+\c PEXTRB           reg32,xmmreg,imm         SSE41
+\c PEXTRB           mem8,xmmreg,imm          SSE41
+\c PEXTRB           reg64,xmmreg,imm         SSE41,X64
+\c PEXTRD           rm32,xmmreg,imm          SSE41
+\c PEXTRQ           rm64,xmmreg,imm          SSE41,X64
+\c PEXTRW           reg32,xmmreg,imm         SSE41
+\c PEXTRW           mem16,xmmreg,imm         SSE41
+\c PEXTRW           reg64,xmmreg,imm         SSE41,X64
+\c PHMINPOSUW       xmmreg,xmmrm             SSE41
+\c PINSRB           xmmreg,mem,imm           SSE41
+\c PINSRB           xmmreg,rm8,imm           SSE41
+\c PINSRB           xmmreg,reg32,imm         SSE41
+\c PINSRD           xmmreg,mem,imm           SSE41
+\c PINSRD           xmmreg,rm32,imm          SSE41
+\c PINSRQ           xmmreg,mem,imm           SSE41,X64
+\c PINSRQ           xmmreg,rm64,imm          SSE41,X64
+\c PMAXSB           xmmreg,xmmrm             SSE41
+\c PMAXSD           xmmreg,xmmrm             SSE41
+\c PMAXUD           xmmreg,xmmrm             SSE41
+\c PMAXUW           xmmreg,xmmrm             SSE41
+\c PMINSB           xmmreg,xmmrm             SSE41
+\c PMINSD           xmmreg,xmmrm             SSE41
+\c PMINUD           xmmreg,xmmrm             SSE41
+\c PMINUW           xmmreg,xmmrm             SSE41
+\c PMOVSXBW         xmmreg,xmmrm             SSE41
+\c PMOVSXBD         xmmreg,xmmrm             SSE41,SD
+\c PMOVSXBQ         xmmreg,xmmrm             SSE41,SW
+\c PMOVSXWD         xmmreg,xmmrm             SSE41
+\c PMOVSXWQ         xmmreg,xmmrm             SSE41,SD
+\c PMOVSXDQ         xmmreg,xmmrm             SSE41
+\c PMOVZXBW         xmmreg,xmmrm             SSE41
+\c PMOVZXBD         xmmreg,xmmrm             SSE41,SD
+\c PMOVZXBQ         xmmreg,xmmrm             SSE41,SW
+\c PMOVZXWD         xmmreg,xmmrm             SSE41
+\c PMOVZXWQ         xmmreg,xmmrm             SSE41,SD
+\c PMOVZXDQ         xmmreg,xmmrm             SSE41
+\c PMULDQ           xmmreg,xmmrm             SSE41
+\c PMULLD           xmmreg,xmmrm             SSE41
+\c PTEST            xmmreg,xmmrm             SSE41
+\c ROUNDPD          xmmreg,xmmrm,imm         SSE41
+\c ROUNDPS          xmmreg,xmmrm,imm         SSE41
+\c ROUNDSD          xmmreg,xmmrm,imm         SSE41
+\c ROUNDSS          xmmreg,xmmrm,imm         SSE41
+
+\S{} Nehalem New Instructions (SSE4.2)
+
+\c CRC32            reg32,rm8                SSE42
+\c CRC32            reg32,rm16               SSE42
+\c CRC32            reg32,rm32               SSE42
+\c CRC32            reg64,rm8                SSE42,X64
+\c CRC32            reg64,rm64               SSE42,X64
+\c PCMPESTRI        xmmreg,xmmrm,imm         SSE42
+\c PCMPESTRM        xmmreg,xmmrm,imm         SSE42
+\c PCMPISTRI        xmmreg,xmmrm,imm         SSE42
+\c PCMPISTRM        xmmreg,xmmrm,imm         SSE42
+\c PCMPGTQ          xmmreg,xmmrm             SSE42
+\c POPCNT           reg16,rm16               NEHALEM,SW
+\c POPCNT           reg32,rm32               NEHALEM,SD
+\c POPCNT           reg64,rm64               NEHALEM,X64
+
+\S{} Intel SMX
+
+\c GETSEC                                    KATMAI
+
+\S{} Geode (Cyrix) 3DNow! additions
+
+\c PFRCPV           mmxreg,mmxrm             PENT,3DNOW,CYRIX
+\c PFRSQRTV         mmxreg,mmxrm             PENT,3DNOW,CYRIX
+
+\S{} Intel new instructions in ???
+
+\c MOVBE            reg16,mem16              NEHALEM
+\c MOVBE            reg32,mem32              NEHALEM
+\c MOVBE            reg64,mem64              NEHALEM
+\c MOVBE            mem16,reg16              NEHALEM
+\c MOVBE            mem32,reg32              NEHALEM
+\c MOVBE            mem64,reg64              NEHALEM
+
+\S{} Intel AES instructions
+
+\c AESENC           xmmreg,xmmrm128          SSE,WESTMERE
+\c AESENCLAST       xmmreg,xmmrm128          SSE,WESTMERE
+\c AESDEC           xmmreg,xmmrm128          SSE,WESTMERE
+\c AESDECLAST       xmmreg,xmmrm128          SSE,WESTMERE
+\c AESIMC           xmmreg,xmmrm128          SSE,WESTMERE
+\c AESKEYGENASSIST  xmmreg,xmmrm128,imm8     SSE,WESTMERE
+
+\S{} Intel AVX AES instructions
+
+\c VAESENC          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VAESENCLAST      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VAESDEC          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VAESDECLAST      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VAESIMC          xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VAESKEYGENASSIST xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+
+\S{} Intel AVX instructions
+
+\c VADDPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VADDPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VADDPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VADDPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VADDSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VADDSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VADDSUBPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VADDSUBPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VADDSUBPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VADDSUBPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VANDPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VANDPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VANDPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VANDPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VANDNPD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VANDNPD          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VANDNPS          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VANDNPS          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VBLENDPD         xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VBLENDPD         ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+\c VBLENDPS         xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VBLENDPS         ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+\c VBLENDVPD        xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+\c VBLENDVPD        xmmreg,xmmrm128,xmm0     AVX,SANDYBRIDGE
+\c VBLENDVPD        ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+\c VBLENDVPD        ymmreg,ymmrm256,ymm0     AVX,SANDYBRIDGE
+\c VBLENDVPS        xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+\c VBLENDVPS        xmmreg,xmmrm128,xmm0     AVX,SANDYBRIDGE
+\c VBLENDVPS        ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+\c VBLENDVPD        ymmreg,ymmrm256,ymm0     AVX,SANDYBRIDGE
+\c VBROADCASTSS     xmmreg,mem32             AVX,SANDYBRIDGE
+\c VBROADCASTSS     ymmreg,mem32             AVX,SANDYBRIDGE
+\c VBROADCASTSD     ymmreg,mem64             AVX,SANDYBRIDGE
+\c VBROADCASTF128   ymmreg,mem128            AVX,SANDYBRIDGE
+\c VCMPEQPD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPEQPD         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPLTPD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPLTPD         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPLEPD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPLEPD         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPUNORDPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPUNORDPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNEQPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNEQPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNLTPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNLTPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNLEPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNLEPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPORDPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPORDPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPEQ_UQPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPEQ_UQPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNGEPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNGEPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNGTPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNGTPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPFALSEPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPFALSEPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNEQ_OQPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNEQ_OQPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPGEPD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPGEPD         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPGTPD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPGTPD         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPTRUEPD       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPTRUEPD       ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPEQ_OSPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPEQ_OSPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPLT_OQPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPLT_OQPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPLE_OQPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPLE_OQPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPUNORD_SPD    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPUNORD_SPD    ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNEQ_USPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNEQ_USPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNLT_UQPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNLT_UQPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNLE_UQPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNLE_UQPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPORD_SPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPORD_SPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPEQ_USPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPEQ_USPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNGE_UQPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNGE_UQPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNGT_UQPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNGT_UQPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPFALSE_OSPD   xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPFALSE_OSPD   ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNEQ_OSPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNEQ_OSPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPGE_OQPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPGE_OQPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPGT_OQPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPGT_OQPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPTRUE_USPD    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPTRUE_USPD    ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPPD           xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VCMPPD           ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+\c VCMPEQPS         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPEQPS         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPLTPS         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPLTPS         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPLEPS         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPLEPS         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPUNORDPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPUNORDPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNEQPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNEQPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNLTPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNLTPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNLEPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNLEPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPORDPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPORDPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPEQ_UQPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPEQ_UQPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNGEPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNGEPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNGTPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNGTPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPFALSEPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPFALSEPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNEQ_OQPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNEQ_OQPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPGEPS         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPGEPS         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPGTPS         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPGTPS         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPTRUEPS       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPTRUEPS       ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPEQ_OSPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPEQ_OSPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPLT_OQPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPLT_OQPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPLE_OQPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPLE_OQPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPUNORD_SPS    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPUNORD_SPS    ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNEQ_USPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNEQ_USPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNLT_UQPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNLT_UQPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNLE_UQPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNLE_UQPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPORD_SPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPORD_SPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPEQ_USPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPEQ_USPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNGE_UQPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNGE_UQPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNGT_UQPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNGT_UQPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPFALSE_OSPS   xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPFALSE_OSPS   ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPNEQ_OSPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPNEQ_OSPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPGE_OQPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPGE_OQPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPGT_OQPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPGT_OQPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPTRUE_USPS    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VCMPTRUE_USPS    ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VCMPPS           xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VCMPPS           ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+\c VCMPEQSD         xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPLTSD         xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPLESD         xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPUNORDSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNEQSD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNLTSD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNLESD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPORDSD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPEQ_UQSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNGESD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNGTSD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPFALSESD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNEQ_OQSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPGESD         xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPGTSD         xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPTRUESD       xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPEQ_OSSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPLT_OQSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPLE_OQSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPUNORD_SSD    xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNEQ_USSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNLT_UQSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNLE_UQSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPORD_SSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPEQ_USSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNGE_UQSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNGT_UQSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPFALSE_OSSD   xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPNEQ_OSSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPGE_OQSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPGT_OQSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPTRUE_USSD    xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCMPSD           xmmreg,xmmreg*,xmmrm64,imm8 AVX,SANDYBRIDGE
+\c VCMPEQSS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPLTSS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPLESS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPUNORDSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNEQSS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNLTSS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNLESS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPORDSS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPEQ_UQSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNGESS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNGTSS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPFALSESS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNEQ_OQSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPGESS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPGTSS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPTRUESS       xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPEQ_OSSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPLT_OQSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPLE_OQSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPUNORD_SSS    xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNEQ_USSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNLT_UQSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNLE_UQSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPORD_SSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPEQ_USSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNGE_UQSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNGT_UQSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPFALSE_OSSS   xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPNEQ_OSSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPGE_OQSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPGT_OQSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPTRUE_USSS    xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCMPSS           xmmreg,xmmreg*,xmmrm32,imm8 AVX,SANDYBRIDGE
+\c VCOMISD          xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VCOMISS          xmmreg,xmmrm32           AVX,SANDYBRIDGE
+\c VCVTDQ2PD        xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VCVTDQ2PD        ymmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VCVTDQ2PS        xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VCVTDQ2PS        ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VCVTPD2DQ        xmmreg,xmmreg            AVX,SANDYBRIDGE
+\c VCVTPD2DQ        xmmreg,mem128            AVX,SANDYBRIDGE,SO
+\c VCVTPD2DQ        xmmreg,ymmreg            AVX,SANDYBRIDGE
+\c VCVTPD2DQ        xmmreg,mem256            AVX,SANDYBRIDGE,SY
+\c VCVTPD2PS        xmmreg,xmmreg            AVX,SANDYBRIDGE
+\c VCVTPD2PS        xmmreg,mem128            AVX,SANDYBRIDGE,SO
+\c VCVTPD2PS        xmmreg,ymmreg            AVX,SANDYBRIDGE
+\c VCVTPD2PS        xmmreg,mem256            AVX,SANDYBRIDGE,SY
+\c VCVTPS2DQ        xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VCVTPS2DQ        ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VCVTPS2PD        xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VCVTPS2PD        ymmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VCVTSD2SI        reg32,xmmrm64            AVX,SANDYBRIDGE
+\c VCVTSD2SI        reg64,xmmrm64            AVX,SANDYBRIDGE,LONG
+\c VCVTSD2SS        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VCVTSI2SD        xmmreg,xmmreg*,rm32      AVX,SANDYBRIDGE,SD
+\c VCVTSI2SD        xmmreg,xmmreg*,mem32     AVX,SANDYBRIDGE,ND,SD
+\c VCVTSI2SD        xmmreg,xmmreg*,rm64      AVX,SANDYBRIDGE,LONG
+\c VCVTSI2SS        xmmreg,xmmreg*,rm32      AVX,SANDYBRIDGE,SD
+\c VCVTSI2SS        xmmreg,xmmreg*,mem32     AVX,SANDYBRIDGE,ND,SD
+\c VCVTSI2SS        xmmreg,xmmreg*,rm64      AVX,SANDYBRIDGE,LONG
+\c VCVTSS2SD        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VCVTSS2SI        reg32,xmmrm32            AVX,SANDYBRIDGE
+\c VCVTSS2SI        reg64,xmmrm32            AVX,SANDYBRIDGE,LONG
+\c VCVTTPD2DQ       xmmreg,xmmreg            AVX,SANDYBRIDGE
+\c VCVTTPD2DQ       xmmreg,mem128            AVX,SANDYBRIDGE,SO
+\c VCVTTPD2DQ       xmmreg,ymmreg            AVX,SANDYBRIDGE
+\c VCVTTPD2DQ       xmmreg,mem256            AVX,SANDYBRIDGE,SY
+\c VCVTTPS2DQ       xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VCVTTPS2DQ       ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VCVTTSD2SI       reg32,xmmrm64            AVX,SANDYBRIDGE
+\c VCVTTSD2SI       reg64,xmmrm64            AVX,SANDYBRIDGE,LONG
+\c VCVTTSS2SI       reg32,xmmrm32            AVX,SANDYBRIDGE
+\c VCVTTSS2SI       reg64,xmmrm32            AVX,SANDYBRIDGE,LONG
+\c VDIVPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VDIVPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VDIVPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VDIVPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VDIVSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VDIVSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VDPPD            xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VDPPS            xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VDPPS            ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+\c VEXTRACTF128     xmmrm128,xmmreg,imm8     AVX,SANDYBRIDGE
+\c VEXTRACTPS       rm32,xmmreg,imm8         AVX,SANDYBRIDGE
+\c VHADDPD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VHADDPD          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VHADDPS          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VHADDPS          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VHSUBPD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VHSUBPD          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VHSUBPS          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VHSUBPS          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VINSERTF128      ymmreg,ymmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VINSERTPS        xmmreg,xmmreg*,xmmrm32,imm8 AVX,SANDYBRIDGE
+\c VLDDQU           xmmreg,mem128            AVX,SANDYBRIDGE
+\c VLDQQU           ymmreg,mem256            AVX,SANDYBRIDGE
+\c VLDDQU           ymmreg,mem256            AVX,SANDYBRIDGE
+\c VLDMXCSR         mem32                    AVX,SANDYBRIDGE
+\c VMASKMOVDQU      xmmreg,xmmreg            AVX,SANDYBRIDGE
+\c VMASKMOVPS       xmmreg,xmmreg,mem128     AVX,SANDYBRIDGE
+\c VMASKMOVPS       ymmreg,ymmreg,mem256     AVX,SANDYBRIDGE
+\c VMASKMOVPS       mem128,xmmreg,xmmreg     AVX,SANDYBRIDGE,SO
+\c VMASKMOVPS       mem256,xmmreg,xmmreg     AVX,SANDYBRIDGE,SY
+\c VMASKMOVPD       xmmreg,xmmreg,mem128     AVX,SANDYBRIDGE
+\c VMASKMOVPD       ymmreg,ymmreg,mem256     AVX,SANDYBRIDGE
+\c VMASKMOVPD       mem128,xmmreg,xmmreg     AVX,SANDYBRIDGE
+\c VMASKMOVPD       mem256,ymmreg,ymmreg     AVX,SANDYBRIDGE
+\c VMAXPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VMAXPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VMAXPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VMAXPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VMAXSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VMAXSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VMINPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VMINPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VMINPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VMINPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VMINSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VMINSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VMOVAPD          xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VMOVAPD          xmmrm128,xmmreg          AVX,SANDYBRIDGE
+\c VMOVAPD          ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VMOVAPD          ymmrm256,ymmreg          AVX,SANDYBRIDGE
+\c VMOVAPS          xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VMOVAPS          xmmrm128,xmmreg          AVX,SANDYBRIDGE
+\c VMOVAPS          ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VMOVAPS          ymmrm256,ymmreg          AVX,SANDYBRIDGE
+\c VMOVQ            xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VMOVQ            xmmrm64,xmmreg           AVX,SANDYBRIDGE
+\c VMOVQ            xmmreg,rm64              AVX,SANDYBRIDGE,LONG
+\c VMOVQ            rm64,xmmreg              AVX,SANDYBRIDGE,LONG
+\c VMOVD            xmmreg,rm32              AVX,SANDYBRIDGE
+\c VMOVD            rm32,xmmreg              AVX,SANDYBRIDGE
+\c VMOVDDUP         xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VMOVDDUP         ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VMOVDQA          xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VMOVDQA          xmmrm128,xmmreg          AVX,SANDYBRIDGE
+\c VMOVQQA          ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VMOVQQA          ymmrm256,ymmreg          AVX,SANDYBRIDGE
+\c VMOVDQA          ymmreg,ymmrm             AVX,SANDYBRIDGE
+\c VMOVDQA          ymmrm256,ymmreg          AVX,SANDYBRIDGE
+\c VMOVDQU          xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VMOVDQU          xmmrm128,xmmreg          AVX,SANDYBRIDGE
+\c VMOVQQU          ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VMOVQQU          ymmrm256,ymmreg          AVX,SANDYBRIDGE
+\c VMOVDQU          ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VMOVDQU          ymmrm256,ymmreg          AVX,SANDYBRIDGE
+\c VMOVHLPS         xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE
+\c VMOVHPD          xmmreg,xmmreg*,mem64     AVX,SANDYBRIDGE
+\c VMOVHPD          mem64,xmmreg             AVX,SANDYBRIDGE
+\c VMOVHPS          xmmreg,xmmreg*,mem64     AVX,SANDYBRIDGE
+\c VMOVHPS          mem64,xmmreg             AVX,SANDYBRIDGE
+\c VMOVLHPS         xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE
+\c VMOVLPD          xmmreg,xmmreg*,mem64     AVX,SANDYBRIDGE
+\c VMOVLPD          mem64,xmmreg             AVX,SANDYBRIDGE
+\c VMOVLPS          xmmreg,xmmreg*,mem64     AVX,SANDYBRIDGE
+\c VMOVLPS          mem64,xmmreg             AVX,SANDYBRIDGE
+\c VMOVMSKPD        reg64,xmmreg             AVX,SANDYBRIDGE,LONG
+\c VMOVMSKPD        reg32,xmmreg             AVX,SANDYBRIDGE
+\c VMOVMSKPD        reg64,ymmreg             AVX,SANDYBRIDGE,LONG
+\c VMOVMSKPD        reg32,ymmreg             AVX,SANDYBRIDGE
+\c VMOVMSKPS        reg64,xmmreg             AVX,SANDYBRIDGE,LONG
+\c VMOVMSKPS        reg32,xmmreg             AVX,SANDYBRIDGE
+\c VMOVMSKPS        reg64,ymmreg             AVX,SANDYBRIDGE,LONG
+\c VMOVMSKPS        reg32,ymmreg             AVX,SANDYBRIDGE
+\c VMOVNTDQ         mem128,xmmreg            AVX,SANDYBRIDGE
+\c VMOVNTQQ         mem256,ymmreg            AVX,SANDYBRIDGE
+\c VMOVNTDQ         mem256,ymmreg            AVX,SANDYBRIDGE
+\c VMOVNTDQA        xmmreg,mem128            AVX,SANDYBRIDGE
+\c VMOVNTPD         mem128,xmmreg            AVX,SANDYBRIDGE
+\c VMOVNTPD         mem256,ymmreg            AVX,SANDYBRIDGE
+\c VMOVNTPS         mem128,xmmreg            AVX,SANDYBRIDGE
+\c VMOVNTPS         mem128,ymmreg            AVX,SANDYBRIDGE
+\c VMOVSD           xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE
+\c VMOVSD           xmmreg,mem64             AVX,SANDYBRIDGE
+\c VMOVSD           xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE
+\c VMOVSD           mem64,xmmreg             AVX,SANDYBRIDGE
+\c VMOVSHDUP        xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VMOVSHDUP        ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VMOVSLDUP        xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VMOVSLDUP        ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VMOVSS           xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE
+\c VMOVSS           xmmreg,mem64             AVX,SANDYBRIDGE
+\c VMOVSS           xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE
+\c VMOVSS           mem64,xmmreg             AVX,SANDYBRIDGE
+\c VMOVUPD          xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VMOVUPD          xmmrm128,xmmreg          AVX,SANDYBRIDGE
+\c VMOVUPD          ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VMOVUPD          ymmrm256,ymmreg          AVX,SANDYBRIDGE
+\c VMOVUPS          xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VMOVUPS          xmmrm128,xmmreg          AVX,SANDYBRIDGE
+\c VMOVUPS          ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VMOVUPS          ymmrm256,ymmreg          AVX,SANDYBRIDGE
+\c VMPSADBW         xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VMULPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VMULPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VMULPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VMULPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VMULSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VMULSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VORPD            xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VORPD            ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VORPS            xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VORPS            ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VPABSB           xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VPABSW           xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VPABSD           xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VPACKSSWB        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPACKSSDW        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPACKUSWB        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPACKUSDW        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPADDB           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPADDW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPADDD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPADDQ           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPADDSB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPADDSW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPADDUSB         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPADDUSW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPALIGNR         xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VPAND            xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPANDN           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPAVGB           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPAVGW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPBLENDVB        xmmreg,xmmreg*,xmmrm128,xmmreg AVX,SANDYBRIDGE
+\c VPBLENDW         xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VPCMPESTRI       xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+\c VPCMPESTRM       xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+\c VPCMPISTRI       xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+\c VPCMPISTRM       xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+\c VPCMPEQB         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPCMPEQW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPCMPEQD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPCMPEQQ         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPCMPGTB         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPCMPGTW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPCMPGTD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPCMPGTQ         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPERMILPD        xmmreg,xmmreg,xmmrm128   AVX,SANDYBRIDGE
+\c VPERMILPD        ymmreg,ymmreg,ymmrm256   AVX,SANDYBRIDGE
+\c VPERMILPD        xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+\c VPERMILPD        ymmreg,ymmrm256,imm8     AVX,SANDYBRIDGE
+\c VPERMILTD2PD     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+\c VPERMILTD2PD     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+\c VPERMILTD2PD     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+\c VPERMILTD2PD     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+\c VPERMILMO2PD     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+\c VPERMILMO2PD     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+\c VPERMILMO2PD     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+\c VPERMILMO2PD     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+\c VPERMILMZ2PD     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+\c VPERMILMZ2PD     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+\c VPERMILMZ2PD     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+\c VPERMILMZ2PD     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+\c VPERMIL2PD       xmmreg,xmmreg,xmmrm128,xmmreg,imm8 AVX,SANDYBRIDGE
+\c VPERMIL2PD       xmmreg,xmmreg,xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VPERMIL2PD       ymmreg,ymmreg,ymmrm256,ymmreg,imm8 AVX,SANDYBRIDGE
+\c VPERMIL2PD       ymmreg,ymmreg,ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE
+\c VPERMILPS        xmmreg,xmmreg,xmmrm128   AVX,SANDYBRIDGE
+\c VPERMILPS        ymmreg,ymmreg,ymmrm256   AVX,SANDYBRIDGE
+\c VPERMILPS        xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+\c VPERMILPS        ymmreg,ymmrm256,imm8     AVX,SANDYBRIDGE
+\c VPERMILTD2PS     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+\c VPERMILTD2PS     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+\c VPERMILTD2PS     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+\c VPERMILTD2PS     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+\c VPERMILMO2PS     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+\c VPERMILMO2PS     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+\c VPERMILMO2PS     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+\c VPERMILMO2PS     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+\c VPERMILMZ2PS     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE
+\c VPERMILMZ2PS     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE
+\c VPERMILMZ2PS     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE
+\c VPERMILMZ2PS     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE
+\c VPERMIL2PS       xmmreg,xmmreg,xmmrm128,xmmreg,imm8 AVX,SANDYBRIDGE
+\c VPERMIL2PS       xmmreg,xmmreg,xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VPERMIL2PS       ymmreg,ymmreg,ymmrm256,ymmreg,imm8 AVX,SANDYBRIDGE
+\c VPERMIL2PS       ymmreg,ymmreg,ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE
+\c VPERM2F128       ymmreg,ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE
+\c VPEXTRB          reg64,xmmreg,imm8        AVX,SANDYBRIDGE,LONG
+\c VPEXTRB          reg32,xmmreg,imm8        AVX,SANDYBRIDGE
+\c VPEXTRB          mem8,xmmreg,imm8         AVX,SANDYBRIDGE
+\c VPEXTRW          reg64,xmmreg,imm8        AVX,SANDYBRIDGE,LONG
+\c VPEXTRW          reg32,xmmreg,imm8        AVX,SANDYBRIDGE
+\c VPEXTRW          mem16,xmmreg,imm8        AVX,SANDYBRIDGE
+\c VPEXTRW          reg64,xmmreg,imm8        AVX,SANDYBRIDGE,LONG
+\c VPEXTRW          reg32,xmmreg,imm8        AVX,SANDYBRIDGE
+\c VPEXTRW          mem16,xmmreg,imm8        AVX,SANDYBRIDGE
+\c VPEXTRD          reg64,xmmreg,imm8        AVX,SANDYBRIDGE,LONG
+\c VPEXTRD          rm32,xmmreg,imm8         AVX,SANDYBRIDGE
+\c VPEXTRQ          rm64,xmmreg,imm8         AVX,SANDYBRIDGE,LONG
+\c VPHADDW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPHADDD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPHADDSW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPHMINPOSUW      xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VPHSUBW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPHSUBD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPHSUBSW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPINSRB          xmmreg,xmmreg*,mem8,imm8 AVX,SANDYBRIDGE
+\c VPINSRB          xmmreg,xmmreg*,rm8,imm8  AVX,SANDYBRIDGE
+\c VPINSRB          xmmreg,xmmreg*,reg32,imm8 AVX,SANDYBRIDGE
+\c VPINSRW          xmmreg,xmmreg*,mem16,imm8 AVX,SANDYBRIDGE
+\c VPINSRW          xmmreg,xmmreg*,rm16,imm8 AVX,SANDYBRIDGE
+\c VPINSRW          xmmreg,xmmreg*,reg32,imm8 AVX,SANDYBRIDGE
+\c VPINSRD          xmmreg,xmmreg*,mem32,imm8 AVX,SANDYBRIDGE
+\c VPINSRD          xmmreg,xmmreg*,rm32,imm8 AVX,SANDYBRIDGE
+\c VPINSRQ          xmmreg,xmmreg*,mem64,imm8 AVX,SANDYBRIDGE,LONG
+\c VPINSRQ          xmmreg,xmmreg*,rm64,imm8 AVX,SANDYBRIDGE,LONG
+\c VPMADDWD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMADDUBSW       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMAXSB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMAXSW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMAXSD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMAXUB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMAXUW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMAXUD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMINSB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMINSW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMINSD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMINUB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMINUW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMINUD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMOVMSKB        reg64,xmmreg             AVX,SANDYBRIDGE,LONG
+\c VPMOVMSKB        reg32,xmmreg             AVX,SANDYBRIDGE
+\c VPMOVSXBW        xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VPMOVSXBD        xmmreg,xmmrm32           AVX,SANDYBRIDGE
+\c VPMOVSXBQ        xmmreg,xmmrm16           AVX,SANDYBRIDGE
+\c VPMOVSXWD        xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VPMOVSXWQ        xmmreg,xmmrm32           AVX,SANDYBRIDGE
+\c VPMOVSXDQ        xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VPMOVZXBW        xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VPMOVZXBD        xmmreg,xmmrm32           AVX,SANDYBRIDGE
+\c VPMOVZXBQ        xmmreg,xmmrm16           AVX,SANDYBRIDGE
+\c VPMOVZXWD        xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VPMOVZXWQ        xmmreg,xmmrm32           AVX,SANDYBRIDGE
+\c VPMOVZXDQ        xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VPMULHUW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMULHRSW        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMULHW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMULLW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMULLD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMULUDQ         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPMULDQ          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPOR             xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSADBW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSHUFB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSHUFD          xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+\c VPSHUFHW         xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+\c VPSHUFLW         xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+\c VPSIGNB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSIGNW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSIGND          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSLLDQ          xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE
+\c VPSRLDQ          xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE
+\c VPSLLW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSLLW           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE
+\c VPSLLD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSLLD           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE
+\c VPSLLQ           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSLLQ           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE
+\c VPSRAW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSRAW           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE
+\c VPSRAD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSRAD           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE
+\c VPSRLW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSRLW           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE
+\c VPSRLD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSRLD           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE
+\c VPSRLQ           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSRLQ           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE
+\c VPTEST           xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VPTEST           ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VPSUBB           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSUBW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSUBD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSUBQ           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSUBSB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSUBSW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSUBUSB         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPSUBUSW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPUNPCKHBW       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPUNPCKHWD       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPUNPCKHDQ       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPUNPCKHQDQ      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPUNPCKLBW       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPUNPCKLWD       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPUNPCKLDQ       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPUNPCKLQDQ      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPXOR            xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VRCPPS           xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VRCPPS           ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VRCPSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VRSQRTPS         xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VRSQRTPS         ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VRSQRTSS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VROUNDPD         xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+\c VROUNDPD         ymmreg,ymmrm256,imm8     AVX,SANDYBRIDGE
+\c VROUNDPS         xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE
+\c VROUNDPS         ymmreg,ymmrm256,imm8     AVX,SANDYBRIDGE
+\c VROUNDSD         xmmreg,xmmreg*,xmmrm64,imm8 AVX,SANDYBRIDGE
+\c VROUNDSS         xmmreg,xmmreg*,xmmrm32,imm8 AVX,SANDYBRIDGE
+\c VSHUFPD          xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VSHUFPD          ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+\c VSHUFPS          xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+\c VSHUFPS          ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE
+\c VSQRTPD          xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VSQRTPD          ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VSQRTPS          xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VSQRTPS          ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VSQRTSD          xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VSQRTSS          xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VSTMXCSR         mem32                    AVX,SANDYBRIDGE
+\c VSUBPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VSUBPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VSUBPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VSUBPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VSUBSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE
+\c VSUBSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE
+\c VTESTPS          xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VTESTPS          ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VTESTPD          xmmreg,xmmrm128          AVX,SANDYBRIDGE
+\c VTESTPD          ymmreg,ymmrm256          AVX,SANDYBRIDGE
+\c VUCOMISD         xmmreg,xmmrm64           AVX,SANDYBRIDGE
+\c VUCOMISS         xmmreg,xmmrm32           AVX,SANDYBRIDGE
+\c VUNPCKHPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VUNPCKHPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VUNPCKHPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VUNPCKHPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VUNPCKLPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VUNPCKLPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VUNPCKLPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VUNPCKLPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VXORPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VXORPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VXORPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VXORPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE
+\c VZEROALL                                  AVX,SANDYBRIDGE
+\c VZEROUPPER                                AVX,SANDYBRIDGE
+
+\S{} Intel Carry-Less Multiplication instructions (CLMUL)
+
+\c PCLMULLQLQDQ     xmmreg,xmmrm128          SSE,WESTMERE
+\c PCLMULHQLQDQ     xmmreg,xmmrm128          SSE,WESTMERE
+\c PCLMULLQHQDQ     xmmreg,xmmrm128          SSE,WESTMERE
+\c PCLMULHQHQDQ     xmmreg,xmmrm128          SSE,WESTMERE
+\c PCLMULQDQ        xmmreg,xmmrm128,imm8     SSE,WESTMERE
+
+\S{} Intel AVX Carry-Less Multiplication instructions (CLMUL)
+
+\c VPCLMULLQLQDQ    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPCLMULHQLQDQ    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPCLMULLQHQDQ    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPCLMULHQHQDQ    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE
+\c VPCLMULQDQ       xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE
+
+\S{} Intel Fused Multiply-Add instructions (FMA)
+
+\c VFMADD132PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD132PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD132PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD132PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD312PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD312PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD312PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD312PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD213PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD213PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD213PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD213PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD123PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD123PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD123PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD123PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD231PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD231PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD231PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD231PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD321PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD321PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD321PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADD321PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB132PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB132PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB132PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB132PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB312PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB312PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB312PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB312PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB213PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB213PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB213PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB213PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB123PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB123PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB123PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB123PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB231PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB231PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB231PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB231PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB321PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB321PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADDSUB321PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMADDSUB321PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB132PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB132PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB132PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB132PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB312PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB312PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB312PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB312PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB213PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB213PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB213PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB213PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB123PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB123PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB123PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB123PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB231PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB231PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB231PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB231PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB321PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB321PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUB321PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUB321PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD132PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD132PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD132PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD132PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD312PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD312PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD312PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD312PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD213PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD213PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD213PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD213PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD123PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD123PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD123PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD123PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD231PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD231PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD231PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD231PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD321PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD321PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMSUBADD321PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFMSUBADD321PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD132PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD132PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD132PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD132PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD312PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD312PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD312PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD312PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD213PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD213PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD213PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD213PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD123PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD123PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD123PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD123PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD231PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD231PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD231PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD231PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD321PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD321PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMADD321PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMADD321PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB132PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB132PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB132PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB132PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB312PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB312PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB312PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB312PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB213PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB213PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB213PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB213PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB123PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB123PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB123PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB123PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB231PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB231PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB231PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB231PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB321PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB321PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFNMSUB321PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE
+\c VFNMSUB321PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE
+\c VFMADD132SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMADD132SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFMADD312SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMADD312SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFMADD213SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMADD213SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFMADD123SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMADD123SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFMADD231SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMADD231SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFMADD321SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMADD321SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFMSUB132SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMSUB132SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFMSUB312SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMSUB312SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFMSUB213SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMSUB213SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFMSUB123SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMSUB123SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFMSUB231SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMSUB231SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFMSUB321SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFMSUB321SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMADD132SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMADD132SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMADD312SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMADD312SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMADD213SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMADD213SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMADD123SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMADD123SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMADD231SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMADD231SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMADD321SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMADD321SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMSUB132SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMSUB132SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMSUB312SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMSUB312SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMSUB213SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMSUB213SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMSUB123SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMSUB123SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMSUB231SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMSUB231SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+\c VFNMSUB321SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE
+\c VFNMSUB321SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE
+
+\S{} VIA (Centaur) security instructions
+
+\c XSTORE                                    PENT,CYRIX
+\c XCRYPTECB                                 PENT,CYRIX
+\c XCRYPTCBC                                 PENT,CYRIX
+\c XCRYPTCTR                                 PENT,CYRIX
+\c XCRYPTCFB                                 PENT,CYRIX
+\c XCRYPTOFB                                 PENT,CYRIX
+\c MONTMUL                                   PENT,CYRIX
+\c XSHA1                                     PENT,CYRIX
+\c XSHA256                                   PENT,CYRIX
+
+\S{} AMD Lightweight Profiling (LWP) instructions
+
+\c LLWPCB           reg16                    AMD
+\c LLWPCB           reg32                    AMD,386
+\c LLWPCB           reg64                    AMD,X64
+\c SLWPCB           reg16                    AMD
+\c SLWPCB           reg32                    AMD,386
+\c SLWPCB           reg64                    AMD,X64
+\c LWPVAL           reg16,rm32,imm16         AMD,386
+\c LWPVAL           reg32,rm32,imm32         AMD,386
+\c LWPVAL           reg64,rm32,imm32         AMD,X64
+\c LWPINS           reg16,rm32,imm16         AMD,386
+\c LWPINS           reg32,rm32,imm32         AMD,386
+\c LWPINS           reg64,rm32,imm32         AMD,X64
+
+\S{} AMD XOP, FMA4 and CVT16 instructions (SSE5)
+
+\c VCVTPH2PS        xmmreg,xmmrm64*,imm8     AMD,SSE5
+\c VCVTPH2PS        ymmreg,xmmrm128,imm8     AMD,SSE5
+\c VCVTPH2PS        ymmreg,ymmrm128*,imm8    AMD,SSE5
+\c VCVTPS2PH        xmmrm64,xmmreg*,imm8     AMD,SSE5
+\c VCVTPS2PH        xmmrm128,ymmreg,imm8     AMD,SSE5
+\c VCVTPS2PH        ymmrm128,ymmreg*,imm8    AMD,SSE5
+\c VFMADDPD         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFMADDPD         ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFMADDPD         xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFMADDPD         ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFMADDPS         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFMADDPS         ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFMADDPS         xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFMADDPS         ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFMADDSD         xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5
+\c VFMADDSD         xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5
+\c VFMADDSS         xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5
+\c VFMADDSS         xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5
+\c VFMADDSUBPD      xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFMADDSUBPD      ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFMADDSUBPD      xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFMADDSUBPD      ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFMADDSUBPS      xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFMADDSUBPS      ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFMADDSUBPS      xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFMADDSUBPS      ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFMSUBADDPD      xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFMSUBADDPD      ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFMSUBADDPD      xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFMSUBADDPD      ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFMSUBADDPS      xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFMSUBADDPS      ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFMSUBADDPS      xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFMSUBADDPS      ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFMSUBPD         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFMSUBPD         ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFMSUBPD         xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFMSUBPD         ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFMSUBPS         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFMSUBPS         ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFMSUBPS         xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFMSUBPS         ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFMSUBSD         xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5
+\c VFMSUBSD         xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5
+\c VFMSUBSS         xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5
+\c VFMSUBSS         xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5
+\c VFNMADDPD        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFNMADDPD        ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFNMADDPD        xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFNMADDPD        ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFNMADDPS        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFNMADDPS        ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFNMADDPS        xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFNMADDPS        ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFNMADDSD        xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5
+\c VFNMADDSD        xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5
+\c VFNMADDSS        xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5
+\c VFNMADDSS        xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5
+\c VFNMSUBPD        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFNMSUBPD        ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFNMSUBPD        xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFNMSUBPD        ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFNMSUBPS        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VFNMSUBPS        ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VFNMSUBPS        xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VFNMSUBPS        ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VFNMSUBSD        xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5
+\c VFNMSUBSD        xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5
+\c VFNMSUBSS        xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5
+\c VFNMSUBSS        xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5
+\c VFRCZPD          xmmreg,xmmrm128*         AMD,SSE5
+\c VFRCZPD          ymmreg,ymmrm256*         AMD,SSE5
+\c VFRCZPS          xmmreg,xmmrm128*         AMD,SSE5
+\c VFRCZPS          ymmreg,ymmrm256*         AMD,SSE5
+\c VFRCZSD          xmmreg,xmmrm64*          AMD,SSE5
+\c VFRCZSS          xmmreg,xmmrm32*          AMD,SSE5
+\c VPCMOV           xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPCMOV           ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5
+\c VPCMOV           xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VPCMOV           ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5
+\c VPCOMB           xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+\c VPCOMD           xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+\c VPCOMQ           xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+\c VPCOMUB          xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+\c VPCOMUD          xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+\c VPCOMUQ          xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+\c VPCOMUW          xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+\c VPCOMW           xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5
+\c VPHADDBD         xmmreg,xmmrm128*         AMD,SSE5
+\c VPHADDBQ         xmmreg,xmmrm128*         AMD,SSE5
+\c VPHADDBW         xmmreg,xmmrm128*         AMD,SSE5
+\c VPHADDDQ         xmmreg,xmmrm128*         AMD,SSE5
+\c VPHADDUBD        xmmreg,xmmrm128*         AMD,SSE5
+\c VPHADDUBQ        xmmreg,xmmrm128*         AMD,SSE5
+\c VPHADDUBW        xmmreg,xmmrm128*         AMD,SSE5
+\c VPHADDUDQ        xmmreg,xmmrm128*         AMD,SSE5
+\c VPHADDUWD        xmmreg,xmmrm128*         AMD,SSE5
+\c VPHADDUWQ        xmmreg,xmmrm128*         AMD,SSE5
+\c VPHADDWD         xmmreg,xmmrm128*         AMD,SSE5
+\c VPHADDWQ         xmmreg,xmmrm128*         AMD,SSE5
+\c VPHSUBBW         xmmreg,xmmrm128*         AMD,SSE5
+\c VPHSUBDQ         xmmreg,xmmrm128*         AMD,SSE5
+\c VPHSUBWD         xmmreg,xmmrm128*         AMD,SSE5
+\c VPMACSDD         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPMACSDQH        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPMACSDQL        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPMACSSDD        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPMACSSDQH       xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPMACSSDQL       xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPMACSSWD        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPMACSSWW        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPMACSWD         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPMACSWW         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPMADCSSWD       xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPMADCSWD        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPPERM           xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5
+\c VPPERM           xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5
+\c VPROTB           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPROTB           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+\c VPROTB           xmmreg,xmmrm128*,imm8    AMD,SSE5
+\c VPROTD           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPROTD           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+\c VPROTD           xmmreg,xmmrm128*,imm8    AMD,SSE5
+\c VPROTQ           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPROTQ           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+\c VPROTQ           xmmreg,xmmrm128*,imm8    AMD,SSE5
+\c VPROTW           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPROTW           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+\c VPROTW           xmmreg,xmmrm128*,imm8    AMD,SSE5
+\c VPSHAB           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPSHAB           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+\c VPSHAD           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPSHAD           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+\c VPSHAQ           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPSHAQ           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+\c VPSHAW           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPSHAW           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+\c VPSHLB           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPSHLB           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+\c VPSHLD           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPSHLD           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+\c VPSHLQ           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPSHLQ           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+\c VPSHLW           xmmreg,xmmrm128*,xmmreg  AMD,SSE5
+\c VPSHLW           xmmreg,xmmreg*,xmmrm128  AMD,SSE5
+
+\S{} Systematic names for the hinting nop instructions
+
+\c HINT_NOP0        rm16                     P6,UNDOC
+\c HINT_NOP0        rm32                     P6,UNDOC
+\c HINT_NOP0        rm64                     X64,UNDOC
+\c HINT_NOP1        rm16                     P6,UNDOC
+\c HINT_NOP1        rm32                     P6,UNDOC
+\c HINT_NOP1        rm64                     X64,UNDOC
+\c HINT_NOP2        rm16                     P6,UNDOC
+\c HINT_NOP2        rm32                     P6,UNDOC
+\c HINT_NOP2        rm64                     X64,UNDOC
+\c HINT_NOP3        rm16                     P6,UNDOC
+\c HINT_NOP3        rm32                     P6,UNDOC
+\c HINT_NOP3        rm64                     X64,UNDOC
+\c HINT_NOP4        rm16                     P6,UNDOC
+\c HINT_NOP4        rm32                     P6,UNDOC
+\c HINT_NOP4        rm64                     X64,UNDOC
+\c HINT_NOP5        rm16                     P6,UNDOC
+\c HINT_NOP5        rm32                     P6,UNDOC
+\c HINT_NOP5        rm64                     X64,UNDOC
+\c HINT_NOP6        rm16                     P6,UNDOC
+\c HINT_NOP6        rm32                     P6,UNDOC
+\c HINT_NOP6        rm64                     X64,UNDOC
+\c HINT_NOP7        rm16                     P6,UNDOC
+\c HINT_NOP7        rm32                     P6,UNDOC
+\c HINT_NOP7        rm64                     X64,UNDOC
+\c HINT_NOP8        rm16                     P6,UNDOC
+\c HINT_NOP8        rm32                     P6,UNDOC
+\c HINT_NOP8        rm64                     X64,UNDOC
+\c HINT_NOP9        rm16                     P6,UNDOC
+\c HINT_NOP9        rm32                     P6,UNDOC
+\c HINT_NOP9        rm64                     X64,UNDOC
+\c HINT_NOP10       rm16                     P6,UNDOC
+\c HINT_NOP10       rm32                     P6,UNDOC
+\c HINT_NOP10       rm64                     X64,UNDOC
+\c HINT_NOP11       rm16                     P6,UNDOC
+\c HINT_NOP11       rm32                     P6,UNDOC
+\c HINT_NOP11       rm64                     X64,UNDOC
+\c HINT_NOP12       rm16                     P6,UNDOC
+\c HINT_NOP12       rm32                     P6,UNDOC
+\c HINT_NOP12       rm64                     X64,UNDOC
+\c HINT_NOP13       rm16                     P6,UNDOC
+\c HINT_NOP13       rm32                     P6,UNDOC
+\c HINT_NOP13       rm64                     X64,UNDOC
+\c HINT_NOP14       rm16                     P6,UNDOC
+\c HINT_NOP14       rm32                     P6,UNDOC
+\c HINT_NOP14       rm64                     X64,UNDOC
+\c HINT_NOP15       rm16                     P6,UNDOC
+\c HINT_NOP15       rm32                     P6,UNDOC
+\c HINT_NOP15       rm64                     X64,UNDOC
+\c HINT_NOP16       rm16                     P6,UNDOC
+\c HINT_NOP16       rm32                     P6,UNDOC
+\c HINT_NOP16       rm64                     X64,UNDOC
+\c HINT_NOP17       rm16                     P6,UNDOC
+\c HINT_NOP17       rm32                     P6,UNDOC
+\c HINT_NOP17       rm64                     X64,UNDOC
+\c HINT_NOP18       rm16                     P6,UNDOC
+\c HINT_NOP18       rm32                     P6,UNDOC
+\c HINT_NOP18       rm64                     X64,UNDOC
+\c HINT_NOP19       rm16                     P6,UNDOC
+\c HINT_NOP19       rm32                     P6,UNDOC
+\c HINT_NOP19       rm64                     X64,UNDOC
+\c HINT_NOP20       rm16                     P6,UNDOC
+\c HINT_NOP20       rm32                     P6,UNDOC
+\c HINT_NOP20       rm64                     X64,UNDOC
+\c HINT_NOP21       rm16                     P6,UNDOC
+\c HINT_NOP21       rm32                     P6,UNDOC
+\c HINT_NOP21       rm64                     X64,UNDOC
+\c HINT_NOP22       rm16                     P6,UNDOC
+\c HINT_NOP22       rm32                     P6,UNDOC
+\c HINT_NOP22       rm64                     X64,UNDOC
+\c HINT_NOP23       rm16                     P6,UNDOC
+\c HINT_NOP23       rm32                     P6,UNDOC
+\c HINT_NOP23       rm64                     X64,UNDOC
+\c HINT_NOP24       rm16                     P6,UNDOC
+\c HINT_NOP24       rm32                     P6,UNDOC
+\c HINT_NOP24       rm64                     X64,UNDOC
+\c HINT_NOP25       rm16                     P6,UNDOC
+\c HINT_NOP25       rm32                     P6,UNDOC
+\c HINT_NOP25       rm64                     X64,UNDOC
+\c HINT_NOP26       rm16                     P6,UNDOC
+\c HINT_NOP26       rm32                     P6,UNDOC
+\c HINT_NOP26       rm64                     X64,UNDOC
+\c HINT_NOP27       rm16                     P6,UNDOC
+\c HINT_NOP27       rm32                     P6,UNDOC
+\c HINT_NOP27       rm64                     X64,UNDOC
+\c HINT_NOP28       rm16                     P6,UNDOC
+\c HINT_NOP28       rm32                     P6,UNDOC
+\c HINT_NOP28       rm64                     X64,UNDOC
+\c HINT_NOP29       rm16                     P6,UNDOC
+\c HINT_NOP29       rm32                     P6,UNDOC
+\c HINT_NOP29       rm64                     X64,UNDOC
+\c HINT_NOP30       rm16                     P6,UNDOC
+\c HINT_NOP30       rm32                     P6,UNDOC
+\c HINT_NOP30       rm64                     X64,UNDOC
+\c HINT_NOP31       rm16                     P6,UNDOC
+\c HINT_NOP31       rm32                     P6,UNDOC
+\c HINT_NOP31       rm64                     X64,UNDOC
+\c HINT_NOP32       rm16                     P6,UNDOC
+\c HINT_NOP32       rm32                     P6,UNDOC
+\c HINT_NOP32       rm64                     X64,UNDOC
+\c HINT_NOP33       rm16                     P6,UNDOC
+\c HINT_NOP33       rm32                     P6,UNDOC
+\c HINT_NOP33       rm64                     X64,UNDOC
+\c HINT_NOP34       rm16                     P6,UNDOC
+\c HINT_NOP34       rm32                     P6,UNDOC
+\c HINT_NOP34       rm64                     X64,UNDOC
+\c HINT_NOP35       rm16                     P6,UNDOC
+\c HINT_NOP35       rm32                     P6,UNDOC
+\c HINT_NOP35       rm64                     X64,UNDOC
+\c HINT_NOP36       rm16                     P6,UNDOC
+\c HINT_NOP36       rm32                     P6,UNDOC
+\c HINT_NOP36       rm64                     X64,UNDOC
+\c HINT_NOP37       rm16                     P6,UNDOC
+\c HINT_NOP37       rm32                     P6,UNDOC
+\c HINT_NOP37       rm64                     X64,UNDOC
+\c HINT_NOP38       rm16                     P6,UNDOC
+\c HINT_NOP38       rm32                     P6,UNDOC
+\c HINT_NOP38       rm64                     X64,UNDOC
+\c HINT_NOP39       rm16                     P6,UNDOC
+\c HINT_NOP39       rm32                     P6,UNDOC
+\c HINT_NOP39       rm64                     X64,UNDOC
+\c HINT_NOP40       rm16                     P6,UNDOC
+\c HINT_NOP40       rm32                     P6,UNDOC
+\c HINT_NOP40       rm64                     X64,UNDOC
+\c HINT_NOP41       rm16                     P6,UNDOC
+\c HINT_NOP41       rm32                     P6,UNDOC
+\c HINT_NOP41       rm64                     X64,UNDOC
+\c HINT_NOP42       rm16                     P6,UNDOC
+\c HINT_NOP42       rm32                     P6,UNDOC
+\c HINT_NOP42       rm64                     X64,UNDOC
+\c HINT_NOP43       rm16                     P6,UNDOC
+\c HINT_NOP43       rm32                     P6,UNDOC
+\c HINT_NOP43       rm64                     X64,UNDOC
+\c HINT_NOP44       rm16                     P6,UNDOC
+\c HINT_NOP44       rm32                     P6,UNDOC
+\c HINT_NOP44       rm64                     X64,UNDOC
+\c HINT_NOP45       rm16                     P6,UNDOC
+\c HINT_NOP45       rm32                     P6,UNDOC
+\c HINT_NOP45       rm64                     X64,UNDOC
+\c HINT_NOP46       rm16                     P6,UNDOC
+\c HINT_NOP46       rm32                     P6,UNDOC
+\c HINT_NOP46       rm64                     X64,UNDOC
+\c HINT_NOP47       rm16                     P6,UNDOC
+\c HINT_NOP47       rm32                     P6,UNDOC
+\c HINT_NOP47       rm64                     X64,UNDOC
+\c HINT_NOP48       rm16                     P6,UNDOC
+\c HINT_NOP48       rm32                     P6,UNDOC
+\c HINT_NOP48       rm64                     X64,UNDOC
+\c HINT_NOP49       rm16                     P6,UNDOC
+\c HINT_NOP49       rm32                     P6,UNDOC
+\c HINT_NOP49       rm64                     X64,UNDOC
+\c HINT_NOP50       rm16                     P6,UNDOC
+\c HINT_NOP50       rm32                     P6,UNDOC
+\c HINT_NOP50       rm64                     X64,UNDOC
+\c HINT_NOP51       rm16                     P6,UNDOC
+\c HINT_NOP51       rm32                     P6,UNDOC
+\c HINT_NOP51       rm64                     X64,UNDOC
+\c HINT_NOP52       rm16                     P6,UNDOC
+\c HINT_NOP52       rm32                     P6,UNDOC
+\c HINT_NOP52       rm64                     X64,UNDOC
+\c HINT_NOP53       rm16                     P6,UNDOC
+\c HINT_NOP53       rm32                     P6,UNDOC
+\c HINT_NOP53       rm64                     X64,UNDOC
+\c HINT_NOP54       rm16                     P6,UNDOC
+\c HINT_NOP54       rm32                     P6,UNDOC
+\c HINT_NOP54       rm64                     X64,UNDOC
+\c HINT_NOP55       rm16                     P6,UNDOC
+\c HINT_NOP55       rm32                     P6,UNDOC
+\c HINT_NOP55       rm64                     X64,UNDOC
+\c HINT_NOP56       rm16                     P6,UNDOC
+\c HINT_NOP56       rm32                     P6,UNDOC
+\c HINT_NOP56       rm64                     X64,UNDOC
+\c HINT_NOP57       rm16                     P6,UNDOC
+\c HINT_NOP57       rm32                     P6,UNDOC
+\c HINT_NOP57       rm64                     X64,UNDOC
+\c HINT_NOP58       rm16                     P6,UNDOC
+\c HINT_NOP58       rm32                     P6,UNDOC
+\c HINT_NOP58       rm64                     X64,UNDOC
+\c HINT_NOP59       rm16                     P6,UNDOC
+\c HINT_NOP59       rm32                     P6,UNDOC
+\c HINT_NOP59       rm64                     X64,UNDOC
+\c HINT_NOP60       rm16                     P6,UNDOC
+\c HINT_NOP60       rm32                     P6,UNDOC
+\c HINT_NOP60       rm64                     X64,UNDOC
+\c HINT_NOP61       rm16                     P6,UNDOC
+\c HINT_NOP61       rm32                     P6,UNDOC
+\c HINT_NOP61       rm64                     X64,UNDOC
+\c HINT_NOP62       rm16                     P6,UNDOC
+\c HINT_NOP62       rm32                     P6,UNDOC
+\c HINT_NOP62       rm64                     X64,UNDOC
+\c HINT_NOP63       rm16                     P6,UNDOC
+\c HINT_NOP63       rm32                     P6,UNDOC
+\c HINT_NOP63       rm64                     X64,UNDOC
+
diff --git a/doc/nasmdoc.pdf b/doc/nasmdoc.pdf
new file mode 100644 (file)
index 0000000..0dbf46a
Binary files /dev/null and b/doc/nasmdoc.pdf differ
diff --git a/doc/nasmdoc.ps b/doc/nasmdoc.ps
new file mode 100644 (file)
index 0000000..e7d0040
--- /dev/null
@@ -0,0 +1,12251 @@
+%!PS-Adobe-3.0
+%%Pages: 213
+%%BoundingBox: 0 0 595 792
+%%Creator: (NASM psflow.pl)
+%%DocumentData: Clean7Bit
+%%DocumentFonts: Times-Italic Times-Bold Courier Times-Roman Courier-Bold Times-BoldItalic
+%%DocumentNeededFonts: Times-Italic Times-Bold Courier Times-Roman Courier-Bold Times-BoldItalic
+%%Orientation: Portrait
+%%PageOrder: Ascend
+%%EndComments
+%%BeginProlog
+/tocind 12 def
+/pymarg 50 def
+/idxindent 24 def
+/pageheight 792 def
+/pagewidth 595 def
+/idxcolumns 2 def
+/tocpnz 24 def
+/bulladj 12 def
+/plmarg 50 def
+/idxgutter 24 def
+/lmarg 100 def
+/topmarg 100 def
+/botmarg 100 def
+/prmarg 0 def
+/startcopyright 75 def
+/tocdots 8 def
+/rmarg 50 def
+/idxspace 24 def
+/colorlinks false def
+/NASMEncoding [ /.notdef  /.notdef  /.notdef  /.notdef  /.notdef  
+ /.notdef  /.notdef  /.notdef  /.notdef  /.notdef  /.notdef  /.notdef  
+ /.notdef  /.notdef  /.notdef  /.notdef  /dotlessi /grave /acute 
+ /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef  /ring 
+ /cedilla /.notdef  /hungarumlaut /ogonek /caron /space /exclam 
+ /quotedbl /numbersign /dollar /percent /ampersand /quoteright 
+ /parenleft /parenright /asterisk /plus /comma /minus /period /slash 
+ /zero /one /two /three /four /five /six /seven /eight /nine /colon 
+ /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H 
+ /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft 
+ /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c 
+ /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z 
+ /braceleft /bar /braceright /asciitilde /.notdef  /.notdef  /.notdef  
+ /quotesinglbase /florin /quotedblbase /ellipsis /dagger /dbldagger 
+ /circumflex /perthousand /Scaron /guilsinglleft /OE /.notdef  /Zcaron 
+ /.notdef  /.notdef  /grave /quotesingle /quotedblleft /quotedblright 
+ /bullet /endash /emdash /tilde /trademark /scaron /guilsignlright /oe 
+ /.notdef  /zcaron /Ydieresis /space /exclamdown /cent /sterling 
+ /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine 
+ /guillemotleft /logicalnot /hyphen /registered /macron /degree 
+ /plusminus /twosuperior /threesuperior /acute /mu /paragraph 
+ /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright 
+ /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute 
+ /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute 
+ /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth 
+ /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply 
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn 
+ /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae 
+ /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute 
+ /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex 
+ /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex 
+ /udieresis /yacute /thorn /ydieresis ] def
+/nasmenc {
+  findfont dup length dict begin
+    { 1 index /FID ne {def}{pop pop} ifelse } forall
+    /Encoding NASMEncoding def
+    currentdict
+  end
+  definefont pop
+} def
+/Times-Italic-NASM /Times-Italic nasmenc
+/Times-Bold-NASM /Times-Bold nasmenc
+/Courier-NASM /Courier nasmenc
+/Times-Roman-NASM /Times-Roman nasmenc
+/Courier-Bold-NASM /Courier-Bold nasmenc
+/Times-BoldItalic-NASM /Times-BoldItalic nasmenc
+/tfont0 /Times-Bold-NASM findfont 20 scalefont def
+/tfont1 /Times-BoldItalic-NASM findfont 20 scalefont def
+/tfont2 /Courier-Bold-NASM findfont 20 scalefont def
+/tfont [tfont0 tfont1 tfont2] def
+/cfont0 /Times-Bold-NASM findfont 18 scalefont def
+/cfont1 /Times-BoldItalic-NASM findfont 18 scalefont def
+/cfont2 /Courier-Bold-NASM findfont 18 scalefont def
+/cfont [cfont0 cfont1 cfont2] def
+/hfont0 /Times-Bold-NASM findfont 14 scalefont def
+/hfont1 /Times-BoldItalic-NASM findfont 14 scalefont def
+/hfont2 /Courier-Bold-NASM findfont 14 scalefont def
+/hfont [hfont0 hfont1 hfont2] def
+/sfont0 /Times-Bold-NASM findfont 12 scalefont def
+/sfont1 /Times-BoldItalic-NASM findfont 12 scalefont def
+/sfont2 /Courier-Bold-NASM findfont 12 scalefont def
+/sfont [sfont0 sfont1 sfont2] def
+/bfont0 /Times-Roman-NASM findfont 10 scalefont def
+/bfont1 /Times-Italic-NASM findfont 10 scalefont def
+/bfont2 /Courier-NASM findfont 10 scalefont def
+/bfont [bfont0 bfont1 bfont2] def
+/bullet [(\225)] def
+%
+% PostScript header for NASM documentation
+%
+
+% Avoid barfing on old PS implementations
+/pdfmark where
+{pop} {userdict /pdfmark /cleartomark load put} ifelse
+/setpagedevice where
+{pop} {userdict /setpagedevice /pop load put} ifelse
+
+% Useful definition
+/space 32 def
+
+%
+% This asks the PostScript interpreter for the proper size paper
+%
+/setpagesize {
+  1 dict dup /PageSize [pagewidth pageheight] put setpagedevice
+} def
+
+%
+% Code to handle links
+%
+/min { 2 copy gt { exch } if pop } def
+/max { 2 copy lt { exch } if pop } def
+
+/lkbegun 0 def
+/lktype null def
+/lkury 0 def
+/lkurx 0 def
+/lklly 0 def
+/lkllx 0 def
+/lkxmarg 1 def % Extra space for link in x dir
+/lkymarg 1 def % Extra space for link in y dir
+/lktarget () def
+
+% target type --
+/linkbegin {
+  userdict begin
+    /lkbegun 1 def
+    /lktype exch def
+    /lktarget exch def
+    colorlinks { 0 0 0.4 setrgbcolor } if
+  end
+} def
+
+% target --
+/linkbegindest {
+  /Dest linkbegin
+} def
+
+% uristring --
+/linkbeginuri {
+  /URI linkbegin
+} def
+
+% pageno --
+/linkbeginpage {
+  /Page linkbegin
+} def
+
+% string spacepadding --
+/linkshow {
+  userdict begin
+    /lspad exch def /lss exch def
+    lkbegun 0 ne {
+      gsave lss true charpath flattenpath pathbbox grestore
+      lkbegun 1 eq {
+        /lkury exch def
+        lss spacecount lspad mul add /lkurx exch def
+        /lklly exch def
+        /lkllx exch def
+        /lkbegun 2 def
+      } {
+        lkury max /lkury exch def
+        lss spacecount lspad mul add lkurx max /lkurx exch def
+        lklly min /lklly exch def
+        lkllx min /lkllx exch def
+      } ifelse
+    } if
+    lspad 0 space lss widthshow
+  end
+} def
+
+% --
+/linkend {
+  userdict begin
+    [ lktype /URI eq {
+        /Action 2 dict dup /Subtype /URI put dup /URI lktarget put
+      } {
+       /Dest lktarget
+      } ifelse
+      /Border [0 0 0]
+      /Rect [ lkllx lkxmarg sub
+              lklly lkymarg sub
+              lkurx lkxmarg add
+              lkury lkymarg add ]
+      /Subtype /Link
+      /ANN pdfmark
+    /lkbegun 0 def
+    colorlinks { 0 setgray } if
+  end
+} def
+
+% targetname --
+/linkdest {
+  [ /Dest 3 -1 roll
+    /View [ /XYZ currentpoint null ]
+    /DEST pdfmark
+} def
+
+% A "fontset" is an array of fonts; a "stream" is an array of strings
+% and numbers or procedures:
+% [ 0 (Foo) ( ) (mani) ( ) 1 (padme) 0 ( ) (hum.) ]
+% A number choses a font from the current fontset.
+% A procedure is invoked as-is when printing the stream.
+%
+% When printing justified, an equal amount of space is added in
+% between each string.
+
+% string -- spacecount
+% Count space characters in a string
+/spacecount {
+  0 exch {
+    space eq { 1 add } if
+  } forall
+} def
+
+% stream fontset -- spacecount width
+% Get the width of a stream in the given fontset, and the
+% number of space characters in the stream
+/streamwidth {
+  gsave
+    6 dict begin
+      /f exch def
+      /w 0 def
+      /s 0 def
+      f 0 get setfont
+      /integertype {
+        f exch get setfont
+      } def
+      /stringtype {
+        dup stringwidth pop w add /w exch def
+        spacecount s add /s exch def
+      } def
+      /arraytype { pop } def
+      % The input stream is on the top of the stack now
+      {
+        dup type exec
+      } forall
+      s w
+    end
+  grestore
+} def
+
+% stream fontset spacer --
+% Show the stream in the given fontset, but add a certain amount
+% of space to each space character
+/showstreamspc {
+  5 dict begin
+    /spc exch def
+    /f exch def
+    f 0 get setfont
+    /integertype {
+      f exch get setfont
+    } def
+    /stringtype {
+      spc linkshow
+    } def
+    /arraytype {
+      exec
+    } def
+    % Now stream is on the top of the stack
+    {
+      dup type exec
+    } forall
+  end
+} def
+
+% stream fontset --
+% Show the stream in the given fontset, with no extra spacing
+/showstream {
+  0 showstreamspc
+} def
+
+% stream fontset totalspace --
+% Show the stream justified to fit into a certain number of pixels
+/showstreamjust {
+  userdict begin
+    /ts exch def /fs exch def /st exch def
+      st fs
+        st fs streamwidth ts exch sub exch
+       dup 0 gt { div } { pop } ifelse
+      showstreamspc
+    end
+} def
+
+/bullmarg lmarg bulladj add def
+/lwidth pagewidth lmarg sub rmarg sub def
+/bwidth lwidth bulladj sub def
+
+%
+% The various paragraph types
+% The number at the end indicates start (1) of para, end (2) of para
+%
+/chapline {
+       currentpoint exch pop 10 sub lmarg exch moveto
+       0 setlinecap 3 setlinewidth
+       lwidth 0 rlineto stroke
+} def
+
+/chap0 { lmarg exch moveto cfont lwidth showstreamjust } def
+/chap1 { lmarg exch moveto cfont lwidth showstreamjust } def
+/chap2 { lmarg exch moveto cfont showstream chapline } def
+/chap3 { lmarg exch moveto cfont showstream chapline } def
+
+/appn0 {chap0} def
+/appn1 {chap1} def
+/appn2 {chap2} def
+/appn3 {chap3} def
+
+% lbl ypos fontset -- ypos
+/headlbl {
+  3 -1 roll [exch (  )] exch % ypos strm fontset
+  2 copy % ypos strm fontset strm fontset
+  streamwidth % ypos strm fontset spccount width
+  lmarg exch sub % ypos strm fontset spccount xpos
+  4 index % ypos strm fontset spccount xpos ypos
+  moveto % ypos strm fontset spccount
+  pop % ypos strm fontset spccount
+  showstream % ypos
+} def
+
+/head0 { lmarg exch moveto hfont lwidth showstreamjust } def
+/head1 { hfont headlbl lmarg exch moveto hfont lwidth showstreamjust } def
+/head2 { lmarg exch moveto hfont showstream } def
+/head3 { hfont headlbl lmarg exch moveto hfont showstream } def
+
+/subh0 { lmarg exch moveto sfont lwidth showstreamjust } def
+/subh1 { sfont headlbl lmarg exch moveto sfont lwidth showstreamjust } def
+/subh2 { lmarg exch moveto sfont showstream } def
+/subh3 { sfont headlbl lmarg exch moveto sfont showstream } def
+
+/norm0 { lmarg exch moveto bfont lwidth showstreamjust } def
+/norm1 { lmarg exch moveto bfont lwidth showstreamjust } def
+/norm2 { lmarg exch moveto bfont showstream } def
+/norm3 { lmarg exch moveto bfont showstream } def
+
+/code0 { lmarg exch moveto bfont showstream } def
+/code1 { lmarg exch moveto bfont showstream } def
+/code2 { lmarg exch moveto bfont showstream } def
+/code3 { lmarg exch moveto bfont showstream } def
+
+/bull0 { bullmarg exch moveto bfont bwidth showstreamjust } def
+/bull1 { dup lmarg exch moveto bullet bfont showstream
+        bullmarg exch moveto bfont bwidth showstreamjust } def
+/bull2 { bullmarg exch moveto bfont showstream } def
+/bull3 { dup lmarg exch moveto bullet bfont showstream
+        bullmarg exch moveto bfont showstream } def
+
+/tocw0 lwidth tocpnz sub def
+/tocw1 tocw0 tocind sub def
+/tocw2 tocw1 tocind sub def
+
+/tocx0 lmarg def
+/tocx1 tocx0 tocind add def
+/tocx2 tocx1 tocind add def
+
+/tocpn {
+  bfont0 setfont
+  3 dict begin
+    /s exch def
+    /x s stringwidth pop pagewidth rmarg sub exch sub def
+    currentpoint /y exch def
+    lmarg sub tocdots div ceiling tocdots mul lmarg add
+    tocdots x {
+      y moveto (.) 0 linkshow
+    } for
+    x y moveto s 0 linkshow
+  end
+  linkend
+} def
+
+/toc00 { tocx0 exch moveto 0 rmoveto bfont showstream } def
+/toc01 { tocx0 exch moveto
+        linkbegindest bfont0 setfont 0 linkshow bfont showstream } def
+/toc02 { tocx0 exch moveto 3 1 roll
+        0 rmoveto bfont showstream tocpn } def
+/toc03 { tocx0 exch moveto 4 1 roll
+        linkbegindest bfont0 setfont 0 linkshow bfont showstream tocpn } def
+
+/toc10 { tocx1 exch moveto 0 rmoveto bfont showstream } def
+/toc11 { tocx1 exch moveto
+        linkbegindest bfont0 setfont 0 linkshow bfont showstream } def
+/toc12 { tocx1 exch moveto 3 1 roll
+        0 rmoveto bfont showstream tocpn } def
+/toc13 { tocx1 exch moveto 4 1 roll
+        linkbegindest bfont0 setfont 0 linkshow bfont showstream tocpn } def
+
+/toc20 { tocx2 exch moveto 0 rmoveto bfont showstream } def
+/toc21 { tocx2 exch moveto
+        linkbegindest bfont0 setfont 0 linkshow bfont showstream } def
+/toc22 { tocx2 exch moveto 3 1 roll
+        0 rmoveto bfont showstream tocpn } def
+/toc23 { tocx2 exch moveto 4 1 roll
+        linkbegindest bfont0 setfont 0 linkshow bfont showstream tocpn } def
+
+% Spacing between index columns
+/indexcolumn pagewidth lmarg sub rmarg sub idxgutter add idxcolumns div def
+% Width of an individual index column
+/indexcolwid indexcolumn idxgutter sub def
+
+/idx03 {
+  2 dict begin
+    indexcolumn mul lmarg add
+    /x exch def /y exch def x y moveto
+    exch bfont showstream
+    dup bfont streamwidth
+    x indexcolwid add exch sub exch pop y moveto
+    bfont showstream
+  end
+} def
+/idx00 {idx03} def
+/idx01 {idx03} def
+/idx02 {idx03} def
+
+/idx13 {
+  2 dict begin
+    indexcolumn mul lmarg add idxindent add
+    /x exch def /y exch def x y moveto
+    exch bfont showstream
+    dup bfont streamwidth
+    x indexcolwid idxindent sub add exch sub exch pop y moveto
+    bfont showstream
+  end
+} def
+/idx10 {idx13} def
+/idx11 {idx13} def
+/idx12 {idx13} def
+
+%
+% Page numbers
+%
+/pagey botmarg pymarg sub def
+/pagel lmarg plmarg sub def
+/pager pagewidth rmarg sub prmarg add def
+
+/pageeven { pagel pagey moveto bfont1 setfont show } def
+/pageodd  { bfont1 setfont dup stringwidth pop pager exch sub
+           pagey moveto show } def
+
+%
+% Functions invoked during parsing
+%
+/xa { linkdest } def
+/pa { 0 pageheight moveto linkdest } def
+/xl { linkbegindest } def
+/wl { linkbeginuri } def
+/pl { linkbeginpage } def
+/el { linkend } def
+
+%
+% PDF viewer options
+%
+[/PageMode /UseOutlines /DOCVIEW pdfmark       % Display bookmarks
+
+%
+% Functions to include EPS
+%
+/BeginEPSF {
+  /Before_EPSF_State save def
+  /dict_count countdictstack def
+  /op_count count 1 sub def
+  userdict begin
+  /showpage {} def
+  0 setgray 0 setlinecap
+  1 setlinewidth 0 setlinejoin
+  10 setmiterlimit [ ] 0 setdash newpath
+  /languagelevel where
+  {
+    pop languagelevel
+    1 ne {
+      false setstrokeadjust false setoverprint
+    } if
+  } if
+} bind def
+/EndEPSF {
+  count op_count sub {pop} repeat
+  countdictstack dict_count sub {end} repeat
+  Before_EPSF_State restore
+} bind def
+%%EndProlog
+%%BeginSetup
+[/Title (Title)
+/Dest /title /OUT pdfmark
+[/Title (Contents)
+/Dest /contents /OUT pdfmark
+[/Title (Introduction)
+/Count -3 /Dest /chapter-1 /OUT pdfmark
+[/Title (What Is NASM?)
+/Count -2 /Dest /section-1.1 /OUT pdfmark
+[/Title (Why Yet Another Assembler?)
+/Dest /section-1.1.1 /OUT pdfmark
+[/Title (License Conditions)
+/Dest /section-1.1.2 /OUT pdfmark
+[/Title (Contact Information)
+/Dest /section-1.2 /OUT pdfmark
+[/Title (Installation)
+/Count -2 /Dest /section-1.3 /OUT pdfmark
+[/Title (Installing NASM under MS-DOS or Windows)
+/Dest /section-1.3.1 /OUT pdfmark
+[/Title (Installing NASM under Unix)
+/Dest /section-1.3.2 /OUT pdfmark
+[/Title (Running NASM)
+/Count -2 /Dest /chapter-2 /OUT pdfmark
+[/Title (NASM Command-Line Syntax)
+/Count -28 /Dest /section-2.1 /OUT pdfmark
+[/Title (The -o Option: Specifying the Output File Name)
+/Dest /section-2.1.1 /OUT pdfmark
+[/Title (The -f Option: Specifying the Output File Format)
+/Dest /section-2.1.2 /OUT pdfmark
+[/Title (The -l Option: Generating a Listing File)
+/Dest /section-2.1.3 /OUT pdfmark
+[/Title (The -M Option: Generate Makefile Dependencies)
+/Dest /section-2.1.4 /OUT pdfmark
+[/Title (The -MG Option: Generate Makefile Dependencies)
+/Dest /section-2.1.5 /OUT pdfmark
+[/Title (The -MF Option: Set Makefile Dependency File)
+/Dest /section-2.1.6 /OUT pdfmark
+[/Title (The -MD Option: Assemble and Generate Dependencies)
+/Dest /section-2.1.7 /OUT pdfmark
+[/Title (The -MT Option: Dependency Target Name)
+/Dest /section-2.1.8 /OUT pdfmark
+[/Title (The -MQ Option: Dependency Target Name \(Quoted\))
+/Dest /section-2.1.9 /OUT pdfmark
+[/Title (The -MP Option: Emit phony targets)
+/Dest /section-2.1.10 /OUT pdfmark
+[/Title (The -F Option: Selecting a Debug Information Format)
+/Dest /section-2.1.11 /OUT pdfmark
+[/Title (The -g Option: Enabling Debug Information.)
+/Dest /section-2.1.12 /OUT pdfmark
+[/Title (The -X Option: Selecting an Error Reporting Format)
+/Dest /section-2.1.13 /OUT pdfmark
+[/Title (The -Z Option: Send Errors to a File)
+/Dest /section-2.1.14 /OUT pdfmark
+[/Title (The -s Option: Send Errors to stdout)
+/Dest /section-2.1.15 /OUT pdfmark
+[/Title (The -i Option: Include File Search Directories)
+/Dest /section-2.1.16 /OUT pdfmark
+[/Title (The -p Option: Pre-Include a File)
+/Dest /section-2.1.17 /OUT pdfmark
+[/Title (The -d Option: Pre-Define a Macro)
+/Dest /section-2.1.18 /OUT pdfmark
+[/Title (The -u Option: Undefine a Macro)
+/Dest /section-2.1.19 /OUT pdfmark
+[/Title (The -E Option: Preprocess Only)
+/Dest /section-2.1.20 /OUT pdfmark
+[/Title (The -a Option: Don't Preprocess At All)
+/Dest /section-2.1.21 /OUT pdfmark
+[/Title (The -O Option: Specifying Multipass Optimization)
+/Dest /section-2.1.22 /OUT pdfmark
+[/Title (The -t Option: Enable TASM Compatibility Mode)
+/Dest /section-2.1.23 /OUT pdfmark
+[/Title (The -w and -W Options: Enable or Disable Assembly Warnings)
+/Dest /section-2.1.24 /OUT pdfmark
+[/Title (The -v Option: Display Version Info)
+/Dest /section-2.1.25 /OUT pdfmark
+[/Title (The -y Option: Display Available Debug Info Formats)
+/Dest /section-2.1.26 /OUT pdfmark
+[/Title (The --prefix and --postfix Options.)
+/Dest /section-2.1.27 /OUT pdfmark
+[/Title (The NASMENV Environment Variable)
+/Dest /section-2.1.28 /OUT pdfmark
+[/Title (Quick Start for MASM Users)
+/Count -7 /Dest /section-2.2 /OUT pdfmark
+[/Title (NASM Is Case-Sensitive)
+/Dest /section-2.2.1 /OUT pdfmark
+[/Title (NASM Requires Square Brackets For Memory References)
+/Dest /section-2.2.2 /OUT pdfmark
+[/Title (NASM Doesn't Store Variable Types)
+/Dest /section-2.2.3 /OUT pdfmark
+[/Title (NASM Doesn't ASSUME)
+/Dest /section-2.2.4 /OUT pdfmark
+[/Title (NASM Doesn't Support Memory Models)
+/Dest /section-2.2.5 /OUT pdfmark
+[/Title (Floating-Point Differences)
+/Dest /section-2.2.6 /OUT pdfmark
+[/Title (Other Differences)
+/Dest /section-2.2.7 /OUT pdfmark
+[/Title (The NASM Language)
+/Count -9 /Dest /chapter-3 /OUT pdfmark
+[/Title (Layout of a NASM Source Line)
+/Dest /section-3.1 /OUT pdfmark
+[/Title (Pseudo-Instructions)
+/Count -5 /Dest /section-3.2 /OUT pdfmark
+[/Title (DB and Friends: Declaring Initialized Data)
+/Dest /section-3.2.1 /OUT pdfmark
+[/Title (RESB and Friends: Declaring Uninitialized Data)
+/Dest /section-3.2.2 /OUT pdfmark
+[/Title (INCBIN: Including External Binary Files)
+/Dest /section-3.2.3 /OUT pdfmark
+[/Title (EQU: Defining Constants)
+/Dest /section-3.2.4 /OUT pdfmark
+[/Title (TIMES: Repeating Instructions or Data)
+/Dest /section-3.2.5 /OUT pdfmark
+[/Title (Effective Addresses)
+/Dest /section-3.3 /OUT pdfmark
+[/Title (Constants)
+/Count -7 /Dest /section-3.4 /OUT pdfmark
+[/Title (Numeric Constants)
+/Dest /section-3.4.1 /OUT pdfmark
+[/Title (Character Strings)
+/Dest /section-3.4.2 /OUT pdfmark
+[/Title (Character Constants)
+/Dest /section-3.4.3 /OUT pdfmark
+[/Title (String Constants)
+/Dest /section-3.4.4 /OUT pdfmark
+[/Title (Unicode Strings)
+/Dest /section-3.4.5 /OUT pdfmark
+[/Title (Floating-Point Constants)
+/Dest /section-3.4.6 /OUT pdfmark
+[/Title (Packed BCD Constants)
+/Dest /section-3.4.7 /OUT pdfmark
+[/Title (Expressions)
+/Count -7 /Dest /section-3.5 /OUT pdfmark
+[/Title (|: Bitwise OR Operator)
+/Dest /section-3.5.1 /OUT pdfmark
+[/Title (^: Bitwise XOR Operator)
+/Dest /section-3.5.2 /OUT pdfmark
+[/Title (&: Bitwise AND Operator)
+/Dest /section-3.5.3 /OUT pdfmark
+[/Title (<< and >>: Bit Shift Operators)
+/Dest /section-3.5.4 /OUT pdfmark
+[/Title (+ and -: Addition and Subtraction Operators)
+/Dest /section-3.5.5 /OUT pdfmark
+[/Title (*, /, //, % and %%: Multiplication and Division)
+/Dest /section-3.5.6 /OUT pdfmark
+[/Title (Unary Operators: +, -, ~, ! and SEG)
+/Dest /section-3.5.7 /OUT pdfmark
+[/Title (SEG and WRT)
+/Dest /section-3.6 /OUT pdfmark
+[/Title (STRICT: Inhibiting Optimization)
+/Dest /section-3.7 /OUT pdfmark
+[/Title (Critical Expressions)
+/Dest /section-3.8 /OUT pdfmark
+[/Title (Local Labels)
+/Dest /section-3.9 /OUT pdfmark
+[/Title (The NASM Preprocessor)
+/Count -11 /Dest /chapter-4 /OUT pdfmark
+[/Title (Single-Line Macros)
+/Count -9 /Dest /section-4.1 /OUT pdfmark
+[/Title (The Normal Way: %define)
+/Dest /section-4.1.1 /OUT pdfmark
+[/Title (Resolving %define: %xdefine)
+/Dest /section-4.1.2 /OUT pdfmark
+[/Title (Macro Indirection: %[...])
+/Dest /section-4.1.3 /OUT pdfmark
+[/Title (Concatenating Single Line Macro Tokens: %+)
+/Dest /section-4.1.4 /OUT pdfmark
+[/Title (The Macro Name Itself: %? and %??)
+/Dest /section-4.1.5 /OUT pdfmark
+[/Title (Undefining Single-Line Macros: %undef)
+/Dest /section-4.1.6 /OUT pdfmark
+[/Title (Preprocessor Variables: %assign)
+/Dest /section-4.1.7 /OUT pdfmark
+[/Title (Defining Strings: %defstr)
+/Dest /section-4.1.8 /OUT pdfmark
+[/Title (Defining Tokens: %deftok)
+/Dest /section-4.1.9 /OUT pdfmark
+[/Title (String Manipulation in Macros)
+/Count -3 /Dest /section-4.2 /OUT pdfmark
+[/Title (Concatenating Strings: %strcat)
+/Dest /section-4.2.1 /OUT pdfmark
+[/Title (String Length: %strlen)
+/Dest /section-4.2.2 /OUT pdfmark
+[/Title (Extracting Substrings: %substr)
+/Dest /section-4.2.3 /OUT pdfmark
+[/Title (Multi-Line Macros: %macro)
+/Count -12 /Dest /section-4.3 /OUT pdfmark
+[/Title (Recursive Multi-Line Macros: %rmacro)
+/Dest /section-4.3.1 /OUT pdfmark
+[/Title (Overloading Multi-Line Macros)
+/Dest /section-4.3.2 /OUT pdfmark
+[/Title (Macro-Local Labels)
+/Dest /section-4.3.3 /OUT pdfmark
+[/Title (Greedy Macro Parameters)
+/Dest /section-4.3.4 /OUT pdfmark
+[/Title (Default Macro Parameters)
+/Dest /section-4.3.5 /OUT pdfmark
+[/Title (%0: Macro Parameter Counter)
+/Dest /section-4.3.6 /OUT pdfmark
+[/Title (%rotate: Rotating Macro Parameters)
+/Dest /section-4.3.7 /OUT pdfmark
+[/Title (Concatenating Macro Parameters)
+/Dest /section-4.3.8 /OUT pdfmark
+[/Title (Condition Codes as Macro Parameters)
+/Dest /section-4.3.9 /OUT pdfmark
+[/Title (Disabling Listing Expansion)
+/Dest /section-4.3.10 /OUT pdfmark
+[/Title (Undefining Multi-Line Macros: %unmacro)
+/Dest /section-4.3.11 /OUT pdfmark
+[/Title (Exiting Multi-Line Macros: %exitmacro)
+/Dest /section-4.3.12 /OUT pdfmark
+[/Title (Conditional Assembly)
+/Count -8 /Dest /section-4.4 /OUT pdfmark
+[/Title (%ifdef: Testing Single-Line Macro Existence)
+/Dest /section-4.4.1 /OUT pdfmark
+[/Title (%ifmacro: Testing Multi-Line Macro Existence)
+/Dest /section-4.4.2 /OUT pdfmark
+[/Title (%ifctx: Testing the Context Stack)
+/Dest /section-4.4.3 /OUT pdfmark
+[/Title (%if: Testing Arbitrary Numeric Expressions)
+/Dest /section-4.4.4 /OUT pdfmark
+[/Title (%ifidn and %ifidni: Testing Exact Text Identity)
+/Dest /section-4.4.5 /OUT pdfmark
+[/Title (%ifid, %ifnum, %ifstr: Testing Token Types)
+/Dest /section-4.4.6 /OUT pdfmark
+[/Title (%iftoken: Test for a Single Token)
+/Dest /section-4.4.7 /OUT pdfmark
+[/Title (%ifempty: Test for Empty Expansion)
+/Dest /section-4.4.8 /OUT pdfmark
+[/Title (Preprocessor Loops: %rep)
+/Dest /section-4.5 /OUT pdfmark
+[/Title (Source Files and Dependencies)
+/Count -4 /Dest /section-4.6 /OUT pdfmark
+[/Title (%include: Including Other Files)
+/Dest /section-4.6.1 /OUT pdfmark
+[/Title (%pathsearch: Search the Include Path)
+/Dest /section-4.6.2 /OUT pdfmark
+[/Title (%depend: Add Dependent Files)
+/Dest /section-4.6.3 /OUT pdfmark
+[/Title (%use: Include Standard Macro Package)
+/Dest /section-4.6.4 /OUT pdfmark
+[/Title (The Context Stack)
+/Count -5 /Dest /section-4.7 /OUT pdfmark
+[/Title (%push and %pop: Creating and Removing Contexts)
+/Dest /section-4.7.1 /OUT pdfmark
+[/Title (Context-Local Labels)
+/Dest /section-4.7.2 /OUT pdfmark
+[/Title (Context-Local Single-Line Macros)
+/Dest /section-4.7.3 /OUT pdfmark
+[/Title (%repl: Renaming a Context)
+/Dest /section-4.7.4 /OUT pdfmark
+[/Title (Example Use of the Context Stack: Block IFs)
+/Dest /section-4.7.5 /OUT pdfmark
+[/Title (Stack Relative Preprocessor Directives)
+/Count -3 /Dest /section-4.8 /OUT pdfmark
+[/Title (%arg Directive)
+/Dest /section-4.8.1 /OUT pdfmark
+[/Title (%stacksize Directive)
+/Dest /section-4.8.2 /OUT pdfmark
+[/Title (%local Directive)
+/Dest /section-4.8.3 /OUT pdfmark
+[/Title (Reporting User-Defined Errors: %error, %warning, %fatal)
+/Dest /section-4.9 /OUT pdfmark
+[/Title (Other Preprocessor Directives)
+/Count -2 /Dest /section-4.10 /OUT pdfmark
+[/Title (%line Directive)
+/Dest /section-4.10.1 /OUT pdfmark
+[/Title (%!<env>: Read an environment variable.)
+/Dest /section-4.10.2 /OUT pdfmark
+[/Title (Standard Macros)
+/Count -12 /Dest /section-4.11 /OUT pdfmark
+[/Title (NASM Version Macros)
+/Dest /section-4.11.1 /OUT pdfmark
+[/Title (__NASM_VERSION_ID__: NASM Version ID)
+/Dest /section-4.11.2 /OUT pdfmark
+[/Title (__NASM_VER__: NASM Version string)
+/Dest /section-4.11.3 /OUT pdfmark
+[/Title (__FILE__ and __LINE__: File Name and Line Number)
+/Dest /section-4.11.4 /OUT pdfmark
+[/Title (__BITS__: Current BITS Mode)
+/Dest /section-4.11.5 /OUT pdfmark
+[/Title (__OUTPUT_FORMAT__: Current Output Format)
+/Dest /section-4.11.6 /OUT pdfmark
+[/Title (Assembly Date and Time Macros)
+/Dest /section-4.11.7 /OUT pdfmark
+[/Title (__USE_package__: Package Include Test)
+/Dest /section-4.11.8 /OUT pdfmark
+[/Title (__PASS__: Assembly Pass)
+/Dest /section-4.11.9 /OUT pdfmark
+[/Title (STRUC and ENDSTRUC: Declaring Structure Data Types)
+/Dest /section-4.11.10 /OUT pdfmark
+[/Title (ISTRUC, AT and IEND: Declaring Instances of Structures)
+/Dest /section-4.11.11 /OUT pdfmark
+[/Title (ALIGN and ALIGNB: Data Alignment)
+/Dest /section-4.11.12 /OUT pdfmark
+[/Title (Standard Macro Packages)
+/Count -2 /Dest /chapter-5 /OUT pdfmark
+[/Title (altreg: Alternate Register Names)
+/Dest /section-5.1 /OUT pdfmark
+[/Title (smartalign: Smart ALIGN Macro)
+/Dest /section-5.2 /OUT pdfmark
+[/Title (Assembler Directives)
+/Count -9 /Dest /chapter-6 /OUT pdfmark
+[/Title (BITS: Specifying Target Processor Mode)
+/Count -1 /Dest /section-6.1 /OUT pdfmark
+[/Title (USE16 & USE32: Aliases for BITS)
+/Dest /section-6.1.1 /OUT pdfmark
+[/Title (DEFAULT: Change the assembler defaults)
+/Dest /section-6.2 /OUT pdfmark
+[/Title (SECTION or SEGMENT: Changing and Defining Sections)
+/Count -1 /Dest /section-6.3 /OUT pdfmark
+[/Title (The __SECT__ Macro)
+/Dest /section-6.3.1 /OUT pdfmark
+[/Title (ABSOLUTE: Defining Absolute Labels)
+/Dest /section-6.4 /OUT pdfmark
+[/Title (EXTERN: Importing Symbols from Other Modules)
+/Dest /section-6.5 /OUT pdfmark
+[/Title (GLOBAL: Exporting Symbols to Other Modules)
+/Dest /section-6.6 /OUT pdfmark
+[/Title (COMMON: Defining Common Data Areas)
+/Dest /section-6.7 /OUT pdfmark
+[/Title (CPU: Defining CPU Dependencies)
+/Dest /section-6.8 /OUT pdfmark
+[/Title (FLOAT: Handling of floating-point constants)
+/Dest /section-6.9 /OUT pdfmark
+[/Title (Output Formats)
+/Count -14 /Dest /chapter-7 /OUT pdfmark
+[/Title (bin: Flat-Form Binary Output)
+/Count -4 /Dest /section-7.1 /OUT pdfmark
+[/Title (ORG: Binary File Program Origin)
+/Dest /section-7.1.1 /OUT pdfmark
+[/Title (bin Extensions to the SECTION Directive)
+/Dest /section-7.1.2 /OUT pdfmark
+[/Title (Multisection Support for the bin Format)
+/Dest /section-7.1.3 /OUT pdfmark
+[/Title (Map Files)
+/Dest /section-7.1.4 /OUT pdfmark
+[/Title (ith: Intel Hex Output)
+/Dest /section-7.2 /OUT pdfmark
+[/Title (srec: Motorola S-Records Output)
+/Dest /section-7.3 /OUT pdfmark
+[/Title (obj: Microsoft OMF Object Files)
+/Count -8 /Dest /section-7.4 /OUT pdfmark
+[/Title (obj Extensions to the SEGMENT Directive)
+/Dest /section-7.4.1 /OUT pdfmark
+[/Title (GROUP: Defining Groups of Segments)
+/Dest /section-7.4.2 /OUT pdfmark
+[/Title (UPPERCASE: Disabling Case Sensitivity in Output)
+/Dest /section-7.4.3 /OUT pdfmark
+[/Title (IMPORT: Importing DLL Symbols)
+/Dest /section-7.4.4 /OUT pdfmark
+[/Title (EXPORT: Exporting DLL Symbols)
+/Dest /section-7.4.5 /OUT pdfmark
+[/Title (..start: Defining the Program Entry Point)
+/Dest /section-7.4.6 /OUT pdfmark
+[/Title (obj Extensions to the EXTERN Directive)
+/Dest /section-7.4.7 /OUT pdfmark
+[/Title (obj Extensions to the COMMON Directive)
+/Dest /section-7.4.8 /OUT pdfmark
+[/Title (win32: Microsoft Win32 Object Files)
+/Count -2 /Dest /section-7.5 /OUT pdfmark
+[/Title (win32 Extensions to the SECTION Directive)
+/Dest /section-7.5.1 /OUT pdfmark
+[/Title (win32: Safe Structured Exception Handling)
+/Dest /section-7.5.2 /OUT pdfmark
+[/Title (win64: Microsoft Win64 Object Files)
+/Count -2 /Dest /section-7.6 /OUT pdfmark
+[/Title (win64: Writing Position-Independent Code)
+/Dest /section-7.6.1 /OUT pdfmark
+[/Title (win64: Structured Exception Handling)
+/Dest /section-7.6.2 /OUT pdfmark
+[/Title (coff: Common Object File Format)
+/Dest /section-7.7 /OUT pdfmark
+[/Title (macho32 and macho64: Mach Object File Format)
+/Dest /section-7.8 /OUT pdfmark
+[/Title (elf32 and elf64: Executable and Linkable Format Object Files)
+/Count -8 /Dest /section-7.9 /OUT pdfmark
+[/Title (ELF specific directive osabi)
+/Dest /section-7.9.1 /OUT pdfmark
+[/Title (elf Extensions to the SECTION Directive)
+/Dest /section-7.9.2 /OUT pdfmark
+[/Title (Position-Independent Code: elf Special Symbols and WRT)
+/Dest /section-7.9.3 /OUT pdfmark
+[/Title (Thread Local Storage: elf Special Symbols and WRT)
+/Dest /section-7.9.4 /OUT pdfmark
+[/Title (elf Extensions to the GLOBAL Directive)
+/Dest /section-7.9.5 /OUT pdfmark
+[/Title (elf Extensions to the COMMON Directive )
+/Dest /section-7.9.6 /OUT pdfmark
+[/Title (16-bit code and ELF )
+/Dest /section-7.9.7 /OUT pdfmark
+[/Title (Debug formats and ELF )
+/Dest /section-7.9.8 /OUT pdfmark
+[/Title (aout: Linux a.out Object Files)
+/Dest /section-7.10 /OUT pdfmark
+[/Title (aoutb: NetBSD/FreeBSD/OpenBSD a.out Object Files)
+/Dest /section-7.11 /OUT pdfmark
+[/Title (as86: Minix/Linux as86 Object Files)
+/Dest /section-7.12 /OUT pdfmark
+[/Title (rdf: Relocatable Dynamic Object File Format)
+/Count -4 /Dest /section-7.13 /OUT pdfmark
+[/Title (Requiring a Library: The LIBRARY Directive)
+/Dest /section-7.13.1 /OUT pdfmark
+[/Title (Specifying a Module Name: The MODULE Directive)
+/Dest /section-7.13.2 /OUT pdfmark
+[/Title (rdf Extensions to the GLOBAL Directive)
+/Dest /section-7.13.3 /OUT pdfmark
+[/Title (rdf Extensions to the EXTERN Directive)
+/Dest /section-7.13.4 /OUT pdfmark
+[/Title (dbg: Debugging Format)
+/Dest /section-7.14 /OUT pdfmark
+[/Title (Writing 16-bit Code \(DOS, Windows 3/3.1\))
+/Count -5 /Dest /chapter-8 /OUT pdfmark
+[/Title (Producing .EXE Files)
+/Count -2 /Dest /section-8.1 /OUT pdfmark
+[/Title (Using the obj Format To Generate .EXE Files)
+/Dest /section-8.1.1 /OUT pdfmark
+[/Title (Using the bin Format To Generate .EXE Files)
+/Dest /section-8.1.2 /OUT pdfmark
+[/Title (Producing .COM Files)
+/Count -2 /Dest /section-8.2 /OUT pdfmark
+[/Title (Using the bin Format To Generate .COM Files)
+/Dest /section-8.2.1 /OUT pdfmark
+[/Title (Using the obj Format To Generate .COM Files)
+/Dest /section-8.2.2 /OUT pdfmark
+[/Title (Producing .SYS Files)
+/Dest /section-8.3 /OUT pdfmark
+[/Title (Interfacing to 16-bit C Programs)
+/Count -5 /Dest /section-8.4 /OUT pdfmark
+[/Title (External Symbol Names)
+/Dest /section-8.4.1 /OUT pdfmark
+[/Title (Memory Models)
+/Dest /section-8.4.2 /OUT pdfmark
+[/Title (Function Definitions and Function Calls)
+/Dest /section-8.4.3 /OUT pdfmark
+[/Title (Accessing Data Items)
+/Dest /section-8.4.4 /OUT pdfmark
+[/Title (c16.mac: Helper Macros for the 16-bit C Interface)
+/Dest /section-8.4.5 /OUT pdfmark
+[/Title (Interfacing to Borland Pascal Programs)
+/Count -3 /Dest /section-8.5 /OUT pdfmark
+[/Title (The Pascal Calling Convention)
+/Dest /section-8.5.1 /OUT pdfmark
+[/Title (Borland Pascal Segment Name Restrictions)
+/Dest /section-8.5.2 /OUT pdfmark
+[/Title (Using c16.mac With Pascal Programs)
+/Dest /section-8.5.3 /OUT pdfmark
+[/Title (Writing 32-bit Code \(Unix, Win32, DJGPP\))
+/Count -2 /Dest /chapter-9 /OUT pdfmark
+[/Title (Interfacing to 32-bit C Programs)
+/Count -4 /Dest /section-9.1 /OUT pdfmark
+[/Title (External Symbol Names)
+/Dest /section-9.1.1 /OUT pdfmark
+[/Title (Function Definitions and Function Calls)
+/Dest /section-9.1.2 /OUT pdfmark
+[/Title (Accessing Data Items)
+/Dest /section-9.1.3 /OUT pdfmark
+[/Title (c32.mac: Helper Macros for the 32-bit C Interface)
+/Dest /section-9.1.4 /OUT pdfmark
+[/Title (Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries)
+/Count -6 /Dest /section-9.2 /OUT pdfmark
+[/Title (Obtaining the Address of the GOT)
+/Dest /section-9.2.1 /OUT pdfmark
+[/Title (Finding Your Local Data Items)
+/Dest /section-9.2.2 /OUT pdfmark
+[/Title (Finding External and Common Data Items)
+/Dest /section-9.2.3 /OUT pdfmark
+[/Title (Exporting Symbols to the Library User)
+/Dest /section-9.2.4 /OUT pdfmark
+[/Title (Calling Procedures Outside the Library)
+/Dest /section-9.2.5 /OUT pdfmark
+[/Title (Generating the Library File)
+/Dest /section-9.2.6 /OUT pdfmark
+[/Title (Mixing 16 and 32 Bit Code)
+/Count -3 /Dest /chapter-10 /OUT pdfmark
+[/Title (Mixed-Size Jumps)
+/Dest /section-10.1 /OUT pdfmark
+[/Title (Addressing Between Different-Size Segments)
+/Dest /section-10.2 /OUT pdfmark
+[/Title (Other Mixed-Size Instructions)
+/Dest /section-10.3 /OUT pdfmark
+[/Title (Writing 64-bit Code \(Unix, Win64\))
+/Count -4 /Dest /chapter-11 /OUT pdfmark
+[/Title (Register Names in 64-bit Mode)
+/Dest /section-11.1 /OUT pdfmark
+[/Title (Immediates and Displacements in 64-bit Mode)
+/Dest /section-11.2 /OUT pdfmark
+[/Title (Interfacing to 64-bit C Programs \(Unix\))
+/Dest /section-11.3 /OUT pdfmark
+[/Title (Interfacing to 64-bit C Programs \(Win64\))
+/Dest /section-11.4 /OUT pdfmark
+[/Title (Troubleshooting)
+/Count -2 /Dest /chapter-12 /OUT pdfmark
+[/Title (Common Problems)
+/Count -4 /Dest /section-12.1 /OUT pdfmark
+[/Title (NASM Generates Inefficient Code)
+/Dest /section-12.1.1 /OUT pdfmark
+[/Title (My Jumps are Out of Range)
+/Dest /section-12.1.2 /OUT pdfmark
+[/Title (ORG Doesn't Work)
+/Dest /section-12.1.3 /OUT pdfmark
+[/Title (TIMES Doesn't Work)
+/Dest /section-12.1.4 /OUT pdfmark
+[/Title (Bugs)
+/Dest /section-12.2 /OUT pdfmark
+[/Title (Ndisasm)
+/Count -4 /Dest /appendix-A /OUT pdfmark
+[/Title (Introduction)
+/Dest /section-A.1 /OUT pdfmark
+[/Title (Getting Started: Installation)
+/Dest /section-A.2 /OUT pdfmark
+[/Title (Running NDISASM)
+/Count -4 /Dest /section-A.3 /OUT pdfmark
+[/Title (COM Files: Specifying an Origin)
+/Dest /section-A.3.1 /OUT pdfmark
+[/Title (Code Following Data: Synchronisation)
+/Dest /section-A.3.2 /OUT pdfmark
+[/Title (Mixed Code and Data: Automatic \(Intelligent\) Synchronisation )
+/Dest /section-A.3.3 /OUT pdfmark
+[/Title (Other Options)
+/Dest /section-A.3.4 /OUT pdfmark
+[/Title (Bugs and Improvements)
+/Dest /section-A.4 /OUT pdfmark
+[/Title (Instruction List)
+/Count -1 /Dest /appendix-B /OUT pdfmark
+[/Title (Introduction)
+/Count -32 /Dest /section-B.1 /OUT pdfmark
+[/Title (Special instructions...)
+/Dest /section-B.1.1 /OUT pdfmark
+[/Title (Conventional instructions)
+/Dest /section-B.1.2 /OUT pdfmark
+[/Title (Katmai Streaming SIMD instructions \(SSE \226\226 a.k.a. KNI, XMM, MMX2\))
+/Dest /section-B.1.3 /OUT pdfmark
+[/Title (Introduced in Deschutes but necessary for SSE support)
+/Dest /section-B.1.4 /OUT pdfmark
+[/Title (XSAVE group \(AVX and extended state\))
+/Dest /section-B.1.5 /OUT pdfmark
+[/Title (Generic memory operations)
+/Dest /section-B.1.6 /OUT pdfmark
+[/Title (New MMX instructions introduced in Katmai)
+/Dest /section-B.1.7 /OUT pdfmark
+[/Title (AMD Enhanced 3DNow! \(Athlon\) instructions)
+/Dest /section-B.1.8 /OUT pdfmark
+[/Title (Willamette SSE2 Cacheability Instructions)
+/Dest /section-B.1.9 /OUT pdfmark
+[/Title (Willamette MMX instructions \(SSE2 SIMD Integer Instructions\))
+/Dest /section-B.1.10 /OUT pdfmark
+[/Title (Willamette Streaming SIMD instructions \(SSE2\))
+/Dest /section-B.1.11 /OUT pdfmark
+[/Title (Prescott New Instructions \(SSE3\))
+/Dest /section-B.1.12 /OUT pdfmark
+[/Title (VMX Instructions)
+/Dest /section-B.1.13 /OUT pdfmark
+[/Title (Extended Page Tables VMX instructions)
+/Dest /section-B.1.14 /OUT pdfmark
+[/Title (Tejas New Instructions \(SSSE3\))
+/Dest /section-B.1.15 /OUT pdfmark
+[/Title (AMD SSE4A)
+/Dest /section-B.1.16 /OUT pdfmark
+[/Title (New instructions in Barcelona)
+/Dest /section-B.1.17 /OUT pdfmark
+[/Title (Penryn New Instructions \(SSE4.1\))
+/Dest /section-B.1.18 /OUT pdfmark
+[/Title (Nehalem New Instructions \(SSE4.2\))
+/Dest /section-B.1.19 /OUT pdfmark
+[/Title (Intel SMX)
+/Dest /section-B.1.20 /OUT pdfmark
+[/Title (Geode \(Cyrix\) 3DNow! additions)
+/Dest /section-B.1.21 /OUT pdfmark
+[/Title (Intel new instructions in ???)
+/Dest /section-B.1.22 /OUT pdfmark
+[/Title (Intel AES instructions)
+/Dest /section-B.1.23 /OUT pdfmark
+[/Title (Intel AVX AES instructions)
+/Dest /section-B.1.24 /OUT pdfmark
+[/Title (Intel AVX instructions)
+/Dest /section-B.1.25 /OUT pdfmark
+[/Title (Intel Carry-Less Multiplication instructions \(CLMUL\))
+/Dest /section-B.1.26 /OUT pdfmark
+[/Title (Intel AVX Carry-Less Multiplication instructions \(CLMUL\))
+/Dest /section-B.1.27 /OUT pdfmark
+[/Title (Intel Fused Multiply-Add instructions \(FMA\))
+/Dest /section-B.1.28 /OUT pdfmark
+[/Title (VIA \(Centaur\) security instructions)
+/Dest /section-B.1.29 /OUT pdfmark
+[/Title (AMD Lightweight Profiling \(LWP\) instructions)
+/Dest /section-B.1.30 /OUT pdfmark
+[/Title (AMD XOP, FMA4 and CVT16 instructions \(SSE5\))
+/Dest /section-B.1.31 /OUT pdfmark
+[/Title (Systematic names for the hinting nop instructions)
+/Dest /section-B.1.32 /OUT pdfmark
+[/Title (NASM Version History)
+/Count -3 /Dest /appendix-C /OUT pdfmark
+[/Title (NASM 2 Series)
+/Count -11 /Dest /section-C.1 /OUT pdfmark
+[/Title (Version 2.08)
+/Dest /section-C.1.1 /OUT pdfmark
+[/Title (Version 2.07)
+/Dest /section-C.1.2 /OUT pdfmark
+[/Title (Version 2.06)
+/Dest /section-C.1.3 /OUT pdfmark
+[/Title (Version 2.05.01)
+/Dest /section-C.1.4 /OUT pdfmark
+[/Title (Version 2.05)
+/Dest /section-C.1.5 /OUT pdfmark
+[/Title (Version 2.04)
+/Dest /section-C.1.6 /OUT pdfmark
+[/Title (Version 2.03.01)
+/Dest /section-C.1.7 /OUT pdfmark
+[/Title (Version 2.03)
+/Dest /section-C.1.8 /OUT pdfmark
+[/Title (Version 2.02)
+/Dest /section-C.1.9 /OUT pdfmark
+[/Title (Version 2.01)
+/Dest /section-C.1.10 /OUT pdfmark
+[/Title (Version 2.00)
+/Dest /section-C.1.11 /OUT pdfmark
+[/Title (NASM 0.98 Series)
+/Count -55 /Dest /section-C.2 /OUT pdfmark
+[/Title (Version 0.98.39)
+/Dest /section-C.2.1 /OUT pdfmark
+[/Title (Version 0.98.38)
+/Dest /section-C.2.2 /OUT pdfmark
+[/Title (Version 0.98.37)
+/Dest /section-C.2.3 /OUT pdfmark
+[/Title (Version 0.98.36)
+/Dest /section-C.2.4 /OUT pdfmark
+[/Title (Version 0.98.35)
+/Dest /section-C.2.5 /OUT pdfmark
+[/Title (Version 0.98.34)
+/Dest /section-C.2.6 /OUT pdfmark
+[/Title (Version 0.98.33)
+/Dest /section-C.2.7 /OUT pdfmark
+[/Title (Version 0.98.32)
+/Dest /section-C.2.8 /OUT pdfmark
+[/Title (Version 0.98.31)
+/Dest /section-C.2.9 /OUT pdfmark
+[/Title (Version 0.98.30)
+/Dest /section-C.2.10 /OUT pdfmark
+[/Title (Version 0.98.28)
+/Dest /section-C.2.11 /OUT pdfmark
+[/Title (Version 0.98.26)
+/Dest /section-C.2.12 /OUT pdfmark
+[/Title (Version 0.98.25alt)
+/Dest /section-C.2.13 /OUT pdfmark
+[/Title (Version 0.98.25)
+/Dest /section-C.2.14 /OUT pdfmark
+[/Title (Version 0.98.24p1)
+/Dest /section-C.2.15 /OUT pdfmark
+[/Title (Version 0.98.24)
+/Dest /section-C.2.16 /OUT pdfmark
+[/Title (Version 0.98.23)
+/Dest /section-C.2.17 /OUT pdfmark
+[/Title (Version 0.98.22)
+/Dest /section-C.2.18 /OUT pdfmark
+[/Title (Version 0.98.21)
+/Dest /section-C.2.19 /OUT pdfmark
+[/Title (Version 0.98.20)
+/Dest /section-C.2.20 /OUT pdfmark
+[/Title (Version 0.98.19)
+/Dest /section-C.2.21 /OUT pdfmark
+[/Title (Version 0.98.18)
+/Dest /section-C.2.22 /OUT pdfmark
+[/Title (Version 0.98.17)
+/Dest /section-C.2.23 /OUT pdfmark
+[/Title (Version 0.98.16)
+/Dest /section-C.2.24 /OUT pdfmark
+[/Title (Version 0.98.15)
+/Dest /section-C.2.25 /OUT pdfmark
+[/Title (Version 0.98.14)
+/Dest /section-C.2.26 /OUT pdfmark
+[/Title (Version 0.98.13)
+/Dest /section-C.2.27 /OUT pdfmark
+[/Title (Version 0.98.12)
+/Dest /section-C.2.28 /OUT pdfmark
+[/Title (Version 0.98.11)
+/Dest /section-C.2.29 /OUT pdfmark
+[/Title (Version 0.98.10)
+/Dest /section-C.2.30 /OUT pdfmark
+[/Title (Version 0.98.09)
+/Dest /section-C.2.31 /OUT pdfmark
+[/Title (Version 0.98.08)
+/Dest /section-C.2.32 /OUT pdfmark
+[/Title (Version 0.98.09b with John Coffman patches released 28-Oct-2001)
+/Dest /section-C.2.33 /OUT pdfmark
+[/Title (Version 0.98.07 released 01/28/01)
+/Dest /section-C.2.34 /OUT pdfmark
+[/Title (Version 0.98.06f released 01/18/01)
+/Dest /section-C.2.35 /OUT pdfmark
+[/Title (Version 0.98.06e released 01/09/01)
+/Dest /section-C.2.36 /OUT pdfmark
+[/Title (Version 0.98p1)
+/Dest /section-C.2.37 /OUT pdfmark
+[/Title (Version 0.98bf \(bug-fixed\))
+/Dest /section-C.2.38 /OUT pdfmark
+[/Title (Version 0.98.03 with John Coffman's changes released 27-Jul-2000)
+/Dest /section-C.2.39 /OUT pdfmark
+[/Title (Version 0.98.03)
+/Dest /section-C.2.40 /OUT pdfmark
+[/Title (Version 0.98)
+/Dest /section-C.2.41 /OUT pdfmark
+[/Title (Version 0.98p9)
+/Dest /section-C.2.42 /OUT pdfmark
+[/Title (Version 0.98p8)
+/Dest /section-C.2.43 /OUT pdfmark
+[/Title (Version 0.98p7)
+/Dest /section-C.2.44 /OUT pdfmark
+[/Title (Version 0.98p6)
+/Dest /section-C.2.45 /OUT pdfmark
+[/Title (Version 0.98p3.7)
+/Dest /section-C.2.46 /OUT pdfmark
+[/Title (Version 0.98p3.6)
+/Dest /section-C.2.47 /OUT pdfmark
+[/Title (Version 0.98p3.5)
+/Dest /section-C.2.48 /OUT pdfmark
+[/Title (Version 0.98p3.4)
+/Dest /section-C.2.49 /OUT pdfmark
+[/Title (Version 0.98p3.3)
+/Dest /section-C.2.50 /OUT pdfmark
+[/Title (Version 0.98p3.2)
+/Dest /section-C.2.51 /OUT pdfmark
+[/Title (Version 0.98p3-hpa)
+/Dest /section-C.2.52 /OUT pdfmark
+[/Title (Version 0.98 pre-release 3)
+/Dest /section-C.2.53 /OUT pdfmark
+[/Title (Version 0.98 pre-release 2)
+/Dest /section-C.2.54 /OUT pdfmark
+[/Title (Version 0.98 pre-release 1)
+/Dest /section-C.2.55 /OUT pdfmark
+[/Title (NASM 0.9 Series)
+/Count -8 /Dest /section-C.3 /OUT pdfmark
+[/Title (Version 0.97 released December 1997)
+/Dest /section-C.3.1 /OUT pdfmark
+[/Title (Version 0.96 released November 1997)
+/Dest /section-C.3.2 /OUT pdfmark
+[/Title (Version 0.95 released July 1997)
+/Dest /section-C.3.3 /OUT pdfmark
+[/Title (Version 0.94 released April 1997)
+/Dest /section-C.3.4 /OUT pdfmark
+[/Title (Version 0.93 released January 1997)
+/Dest /section-C.3.5 /OUT pdfmark
+[/Title (Version 0.92 released January 1997)
+/Dest /section-C.3.6 /OUT pdfmark
+[/Title (Version 0.91 released November 1996)
+/Dest /section-C.3.7 /OUT pdfmark
+[/Title (Version 0.90 released October 1996)
+/Dest /section-C.3.8 /OUT pdfmark
+[/Title (Index)
+/Dest /index /OUT pdfmark
+setpagesize
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+save
+%%EndPageSetup
+/1 pa
+/ti (NASM \227 The Netwide Assembler) def
+/sti (version\2402.08rc7) def
+lmarg pageheight 2 mul 3 div moveto
+tfont0 setfont
+/title linkdest ti show
+lmarg pageheight 2 mul 3 div 10 sub moveto
+0 setlinecap 3 setlinewidth
+pagewidth lmarg sub rmarg sub 0 rlineto currentpoint stroke moveto
+hfont1 setfont sti stringwidth pop neg -15.4 rmoveto
+sti show
+BeginEPSF
+154.5 363 translate
+-99 -45 translate
+99 45 moveto
+385 45 lineto
+385 111 lineto
+99 111 lineto
+99 45 lineto clip newpath
+%%BeginDocument: (nasmlogo.eps)
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 99 45 385 111
+%%DocumentData: Clean7Bit
+%%DocumentFonts: Courier-Bold
+%%DocumentNeededFonts: Courier-Bold
+%%Title: (NASM logo)
+%%EndComments
+%%Page 1 1
+%%BeginPageSetup
+save
+newpath
+%%EndPageSetup
+% x y pointsize --
+/nasmlogo {
+gsave 1 dict begin
+/sz exch def
+/Courier-Bold findfont sz scalefont setfont
+moveto
+0.85 1.22 scale
+[(-~~..~:#;L       .-:#;L,.-   .~:#:;.T  -~~.~:;. .~:;. )
+( E8+U    *T     +U'   *T#  .97     *L   E8+'  *;T'  *;, )
+( D97     `*L  .97     '*L   "T;E+:,     D9     *L    *L )
+( H7       I#  T7       I#        "*:.   H7     I#    I# )
+( U:       :8  *#+    , :8  T,      79   U:     :8    :8 )
+(,#B.     .IE,  "T;E*  .IE, J *+;#:T*"  ,#B.   .IE,  .IE,)] {
+currentpoint 3 -1 roll
+sz -0.10 mul 0 3 -1 roll ashow
+sz 0.72 mul sub moveto
+} forall
+end grestore
+} def
+0.6 setgray 100 100 12 nasmlogo
+%%PageTrailer
+restore
+%%EndDocument
+EndEPSF
+restore showpage
+%%Page: 2 2
+%%BeginPageSetup
+save
+%%EndPageSetup
+/2 pa
+[(\251 1996-2009 The NASM Development Team \227 All Rights Reserved)]164 norm3
+[(This document is redistributable under the license given in the file "COPYING" distributed in the NASM)]147 norm1
+[(archive.)]136 norm2
+[(This release is dedicated to the memory of Charles A. Crayne.  We miss you, Chuck.)]119 norm3
+restore showpage
+%%Page: 3 3
+%%BeginPageSetup
+save
+%%EndPageSetup
+/3 pa
+[{/contents xa}(Contents)]642.8 chap3
+[(Introduction)](Chapter 1: )/chapter-1 (14)607.8 toc03
+[(What Is NASM?)](1.1 )/section-1.1 (14)590.8 toc13
+[(Why Yet Another Assembler?)](1.1.1 )/section-1.1.1 (14)573.8 toc23
+[(License Conditions)](1.1.2 )/section-1.1.2 (14)556.8 toc23
+[(Contact Information)](1.2 )/section-1.2 (15)539.8 toc13
+[(Installation)](1.3 )/section-1.3 (15)522.8 toc13
+[(Installing NASM under MS-DOS or Windows)](1.3.1 )/section-1.3.1 (15)505.8 toc23
+[(Installing NASM under Unix)](1.3.2 )/section-1.3.2 (16)488.8 toc23
+[(Running NASM)](Chapter 2: )/chapter-2 (17)471.8 toc03
+[(NASM Command-Line Syntax)](2.1 )/section-2.1 (17)454.8 toc13
+[(The )2(-o)0( Option: Specifying the Output File Name)](2.1.1 )/section-2.1.1 (17)437.8 toc23
+[(The )2(-f)0( Option: Specifying the Output File Format)](2.1.2 )/section-2.1.2 (18)420.8 toc23
+[(The )2(-l)0( Option: Generating a Listing File)](2.1.3 )/section-2.1.3 (18)403.8 toc23
+[(The )2(-M)0( Option: Generate Makefile Dependencies)](2.1.4 )/section-2.1.4 (18)386.8 toc23
+[(The )2(-MG)0( Option: Generate Makefile Dependencies)](2.1.5 )/section-2.1.5 (18)369.8 toc23
+[(The )2(-MF)0( Option: Set Makefile Dependency File)](2.1.6 )/section-2.1.6 (18)352.8 toc23
+[(The )2(-MD)0( Option: Assemble and Generate Dependencies)](2.1.7 )/section-2.1.7 (18)335.8 toc23
+[(The )2(-MT)0( Option: Dependency Target Name)](2.1.8 )/section-2.1.8 (19)318.8 toc23
+[(The )2(-MQ)0( Option: Dependency Target Name \(Quoted\))](2.1.9 )/section-2.1.9 (19)301.8 toc23
+[(The )2(-MP)0( Option: Emit phony targets)](2.1.10 )/section-2.1.10 (19)284.8 toc23
+[(The )2(-F)0( Option: Selecting a Debug Information Format)](2.1.11 )/section-2.1.11 (19)267.8 toc23
+[(The )2(-g)0( Option: Enabling Debug Information.)](2.1.12 )/section-2.1.12 (19)250.8 toc23
+[(The )2(-X)0( Option: Selecting an Error Reporting Format)](2.1.13 )/section-2.1.13 (19)233.8 toc23
+[(The )2(-Z)0( Option: Send Errors to a File)](2.1.14 )/section-2.1.14 (20)216.8 toc23
+[(The )2(-s)0( Option: Send Errors to )2(stdout)](2.1.15 )/section-2.1.15 (20)199.8 toc23
+[(The )2(-i)0( Option: Include File Search Directories)](2.1.16 )/section-2.1.16 (20)182.8 toc23
+[(The )2(-p)0( Option: Pre-Include a File)](2.1.17 )/section-2.1.17 (20)165.8 toc23
+[(The )2(-d)0( Option: Pre-Define a Macro)](2.1.18 )/section-2.1.18 (20)148.8 toc23
+[(The )2(-u)0( Option: Undefine a Macro)](2.1.19 )/section-2.1.19 (21)131.8 toc23
+[(The )2(-E)0( Option: Preprocess Only)](2.1.20 )/section-2.1.20 (21)114.8 toc23
+(3)pageodd
+restore showpage
+%%Page: 4 4
+%%BeginPageSetup
+save
+%%EndPageSetup
+/4 pa
+[(The )2(-a)0( Option: Don't Preprocess At All)](2.1.21 )/section-2.1.21 (21)681 toc23
+[(The )2(-O)0( Option: Specifying Multipass Optimization)](2.1.22 )/section-2.1.22 (21)664 toc23
+[(The )2(-t)0( Option: Enable TASM Compatibility Mode)](2.1.23 )/section-2.1.23 (22)647 toc23
+[(The )2(-w)0( and )2(-W)0( Options: Enable or Disable Assembly Warnings)](2.1.24 )/section-2.1.24 (22)630 toc23
+[(The )2(-v)0( Option: Display Version Info)](2.1.25 )/section-2.1.25 (23)613 toc23
+[(The )2(-y)0( Option: Display Available Debug Info Formats)](2.1.26 )/section-2.1.26 (23)596 toc23
+[(The )2(--prefix)0( and )2(--postfix)0( Options.)](2.1.27 )/section-2.1.27 (23)579 toc23
+[(The )2(NASMENV)0( Environment Variable)](2.1.28 )/section-2.1.28 (23)562 toc23
+[(Quick Start for MASM Users)](2.2 )/section-2.2 (24)545 toc13
+[(NASM Is Case-Sensitive)](2.2.1 )/section-2.2.1 (24)528 toc23
+[(NASM Requires Square Brackets For Memory References)](2.2.2 )/section-2.2.2 (24)511 toc23
+[(NASM Doesn't Store Variable Types)](2.2.3 )/section-2.2.3 (24)494 toc23
+[(NASM Doesn't )2(ASSUME)](2.2.4 )/section-2.2.4 (25)477 toc23
+[(NASM Doesn't Support Memory Models)](2.2.5 )/section-2.2.5 (25)460 toc23
+[(Floating-Point Differences)](2.2.6 )/section-2.2.6 (25)443 toc23
+[(Other Differences)](2.2.7 )/section-2.2.7 (25)426 toc23
+[(The NASM Language)](Chapter 3: )/chapter-3 (26)409 toc03
+[(Layout of a NASM Source Line)](3.1 )/section-3.1 (26)392 toc13
+[(Pseudo-Instructions)](3.2 )/section-3.2 (27)375 toc13
+[2(DB)0( and Friends: Declaring Initialized Data)](3.2.1 )/section-3.2.1 (27)358 toc23
+[2(RESB)0( and Friends: Declaring Uninitialized Data)](3.2.2 )/section-3.2.2 (27)341 toc23
+[2(INCBIN)0(: Including External Binary Files)](3.2.3 )/section-3.2.3 (27)324 toc23
+[2(EQU)0(: Defining Constants)](3.2.4 )/section-3.2.4 (28)307 toc23
+[2(TIMES)0(: Repeating Instructions or Data)](3.2.5 )/section-3.2.5 (28)290 toc23
+[(Effective Addresses)](3.3 )/section-3.3 (28)273 toc13
+[(Constants)](3.4 )/section-3.4 (29)256 toc13
+[(Numeric Constants)](3.4.1 )/section-3.4.1 (29)239 toc23
+[(Character Strings)](3.4.2 )/section-3.4.2 (30)222 toc23
+[(Character Constants)](3.4.3 )/section-3.4.3 (31)205 toc23
+[(String Constants)](3.4.4 )/section-3.4.4 (31)188 toc23
+[(Unicode Strings)](3.4.5 )/section-3.4.5 (31)171 toc23
+[(Floating-Point Constants)](3.4.6 )/section-3.4.6 (31)154 toc23
+[(Packed BCD Constants)](3.4.7 )/section-3.4.7 (33)137 toc23
+[(Expressions)](3.5 )/section-3.5 (33)120 toc13
+[2(|)0(: Bitwise OR Operator)](3.5.1 )/section-3.5.1 (33)103 toc23
+(4)pageeven
+restore showpage
+%%Page: 5 5
+%%BeginPageSetup
+save
+%%EndPageSetup
+/5 pa
+[2(^)0(: Bitwise XOR Operator)](3.5.2 )/section-3.5.2 (33)681 toc23
+[2(&)0(: Bitwise AND Operator)](3.5.3 )/section-3.5.3 (33)664 toc23
+[2(<<)0( and )2(>>)0(: Bit Shift Operators)](3.5.4 )/section-3.5.4 (33)647 toc23
+[2(+)0( and )2(-)0(: Addition and Subtraction Operators)](3.5.5 )/section-3.5.5 (33)630 toc23
+[2(*)0(, )2(/)0(, )2(//)0(, )2(%)0( and )2(%%)0(: Multiplication and Division)](3.5.6 )/section-3.5.6 (33)613 toc23
+[(Unary Operators: )2(+)0(, )2(-)0(, )2(~)0(, )2(!)0( and )2(SEG)](3.5.7 )/section-3.5.7 (34)596 toc23
+[2(SEG)0( and )2(WRT)](3.6 )/section-3.6 (34)579 toc13
+[2(STRICT)0(: Inhibiting Optimization)](3.7 )/section-3.7 (34)562 toc13
+[(Critical Expressions)](3.8 )/section-3.8 (35)545 toc13
+[(Local Labels)](3.9 )/section-3.9 (35)528 toc13
+[(The NASM Preprocessor)](Chapter 4: )/chapter-4 (37)511 toc03
+[(Single-Line Macros)](4.1 )/section-4.1 (37)494 toc13
+[(The Normal Way: )2(%define)](4.1.1 )/section-4.1.1 (37)477 toc23
+[(Resolving )2(%define)0(: )2(%xdefine)](4.1.2 )/section-4.1.2 (38)460 toc23
+[(Macro Indirection: )2(%[...])](4.1.3 )/section-4.1.3 (39)443 toc23
+[(Concatenating Single Line Macro Tokens: )2(%+)](4.1.4 )/section-4.1.4 (39)426 toc23
+[(The Macro Name Itself: )2(%?)0( and )2(%??)](4.1.5 )/section-4.1.5 (39)409 toc23
+[(Undefining Single-Line Macros: )2(%undef)](4.1.6 )/section-4.1.6 (40)392 toc23
+[(Preprocessor Variables: )2(%assign)](4.1.7 )/section-4.1.7 (40)375 toc23
+[(Defining Strings: )2(%defstr)](4.1.8 )/section-4.1.8 (41)358 toc23
+[(Defining Tokens: )2(%deftok)](4.1.9 )/section-4.1.9 (41)341 toc23
+[(String Manipulation in Macros)](4.2 )/section-4.2 (41)324 toc13
+[(Concatenating Strings: )2(%strcat)](4.2.1 )/section-4.2.1 (41)307 toc23
+[(String Length: )2(%strlen)](4.2.2 )/section-4.2.2 (41)290 toc23
+[(Extracting Substrings: )2(%substr)](4.2.3 )/section-4.2.3 (42)273 toc23
+[(Multi-Line Macros: )2(%macro)](4.3 )/section-4.3 (42)256 toc13
+[(Recursive Multi-Line Macros: )2(%rmacro)](4.3.1 )/section-4.3.1 (43)239 toc23
+[(Overloading Multi-Line Macros)](4.3.2 )/section-4.3.2 (43)222 toc23
+[(Macro-Local Labels)](4.3.3 )/section-4.3.3 (43)205 toc23
+[(Greedy Macro Parameters)](4.3.4 )/section-4.3.4 (44)188 toc23
+[(Default Macro Parameters)](4.3.5 )/section-4.3.5 (45)171 toc23
+[2(%0)0(: Macro Parameter Counter)](4.3.6 )/section-4.3.6 (45)154 toc23
+[2(%rotate)0(: Rotating Macro Parameters)](4.3.7 )/section-4.3.7 (46)137 toc23
+[(Concatenating Macro Parameters)](4.3.8 )/section-4.3.8 (46)120 toc23
+[(Condition Codes as Macro Parameters)](4.3.9 )/section-4.3.9 (47)103 toc23
+(5)pageodd
+restore showpage
+%%Page: 6 6
+%%BeginPageSetup
+save
+%%EndPageSetup
+/6 pa
+[(Disabling Listing Expansion)](4.3.10 )/section-4.3.10 (48)681 toc23
+[(Undefining Multi-Line Macros: )2(%unmacro)](4.3.11 )/section-4.3.11 (48)664 toc23
+[(Exiting Multi-Line Macros: )2(%exitmacro)](4.3.12 )/section-4.3.12 (48)647 toc23
+[(Conditional Assembly)](4.4 )/section-4.4 (49)630 toc13
+[2(%ifdef)0(: Testing Single-Line Macro Existence)](4.4.1 )/section-4.4.1 (49)613 toc23
+[2(%ifmacro)0(: Testing Multi-Line Macro Existence)](4.4.2 )/section-4.4.2 (49)596 toc23
+[2(%ifctx)0(: Testing the Context Stack)](4.4.3 )/section-4.4.3 (50)579 toc23
+[2(%if)0(: Testing Arbitrary Numeric Expressions)](4.4.4 )/section-4.4.4 (50)562 toc23
+[2(%ifidn)0( and )2(%ifidni)0(: Testing Exact Text Identity)](4.4.5 )/section-4.4.5 (50)545 toc23
+[2(%ifid)0(, )2(%ifnum)0(, )2(%ifstr)0(: Testing Token Types)](4.4.6 )/section-4.4.6 (51)528 toc23
+[2(%iftoken)0(: Test for a Single Token)](4.4.7 )/section-4.4.7 (52)511 toc23
+[2(%ifempty)0(: Test for Empty Expansion)](4.4.8 )/section-4.4.8 (52)494 toc23
+[(Preprocessor Loops: )2(%rep)](4.5 )/section-4.5 (52)477 toc13
+[(Source Files and Dependencies)](4.6 )/section-4.6 (53)460 toc13
+[2(%include)0(: Including Other Files)](4.6.1 )/section-4.6.1 (53)443 toc23
+[2(%pathsearch)0(: Search the Include Path)](4.6.2 )/section-4.6.2 (53)426 toc23
+[2(%depend)0(: Add Dependent Files)](4.6.3 )/section-4.6.3 (53)409 toc23
+[2(%use)0(: Include Standard Macro Package)](4.6.4 )/section-4.6.4 (54)392 toc23
+[(The Context Stack)](4.7 )/section-4.7 (54)375 toc13
+[2(%push)0( and )2(%pop)0(: Creating and Removing Contexts)](4.7.1 )/section-4.7.1 (54)358 toc23
+[(Context-Local Labels)](4.7.2 )/section-4.7.2 (54)341 toc23
+[(Context-Local Single-Line Macros)](4.7.3 )/section-4.7.3 (55)324 toc23
+[2(%repl)0(: Renaming a Context)](4.7.4 )/section-4.7.4 (55)307 toc23
+[(Example Use of the Context Stack: Block IFs)](4.7.5 )/section-4.7.5 (55)290 toc23
+[(Stack Relative Preprocessor Directives)](4.8 )/section-4.8 (57)273 toc13
+[2(%arg)0( Directive)](4.8.1 )/section-4.8.1 (57)256 toc23
+[2(%stacksize)0( Directive)](4.8.2 )/section-4.8.2 (57)239 toc23
+[2(%local)0( Directive)](4.8.3 )/section-4.8.3 (58)222 toc23
+[(Reporting User-Defined Errors: )2(%error)0(, )2(%warning)0(, )2(%fatal)](4.9 )/section-4.9 (58)205 toc13
+[(Other Preprocessor Directives)](4.10 )/section-4.10 (59)188 toc13
+[2(%line)0( Directive)](4.10.1 )/section-4.10.1 (59)171 toc23
+[2(%!<env>)0(: Read an environment variable.)](4.10.2 )/section-4.10.2 (60)154 toc23
+[(Standard Macros)](4.11 )/section-4.11 (60)137 toc13
+[(NASM Version Macros)](4.11.1 )/section-4.11.1 (60)120 toc23
+[2(__NASM_VERSION_ID__)0(: NASM Version ID)](4.11.2 )/section-4.11.2 (60)103 toc23
+(6)pageeven
+restore showpage
+%%Page: 7 7
+%%BeginPageSetup
+save
+%%EndPageSetup
+/7 pa
+[2(__NASM_VER__)0(: NASM Version string)](4.11.3 )/section-4.11.3 (60)681 toc23
+[2(__FILE__)0( and )2(__LINE__)0(: File Name and Line Number)](4.11.4 )/section-4.11.4 (61)664 toc23
+[2(__BITS__)0(: Current BITS Mode)](4.11.5 )/section-4.11.5 (61)647 toc23
+[2(__OUTPUT_FORMAT__)0(: Current Output Format)](4.11.6 )/section-4.11.6 (61)630 toc23
+[(Assembly Date and Time Macros)](4.11.7 )/section-4.11.7 (61)613 toc23
+[2(__USE_)1(package)2(__)0(: Package Include Test)](4.11.8 )/section-4.11.8 (62)596 toc23
+[2(__PASS__)0(: Assembly Pass)](4.11.9 )/section-4.11.9 (62)579 toc23
+[2(STRUC)0( and )2(ENDSTRUC)0(: Declaring Structure Data Types)](4.11.10 )/section-4.11.10 (62)562 toc23
+[2(ISTRUC)0(, )2(AT)0( and )2(IEND)0(: Declaring Instances of Structures)](4.11.11 )/section-4.11.11 (63)545 toc23
+[2(ALIGN)0( and )2(ALIGNB)0(: Data Alignment)](4.11.12 )/section-4.11.12 (64)528 toc23
+[(Standard Macro Packages)](Chapter 5: )/chapter-5 (66)511 toc03
+[2(altreg)0(: Alternate Register Names)](5.1 )/section-5.1 (66)494 toc13
+[2(smartalign)0(: Smart )2(ALIGN)0( Macro)](5.2 )/section-5.2 (66)477 toc13
+[(Assembler Directives)](Chapter 6: )/chapter-6 (67)460 toc03
+[2(BITS)0(: Specifying Target Processor Mode)](6.1 )/section-6.1 (67)443 toc13
+[2(USE16)0( & )2(USE32)0(: Aliases for BITS)](6.1.1 )/section-6.1.1 (68)426 toc23
+[2(DEFAULT)0(: Change the assembler defaults)](6.2 )/section-6.2 (68)409 toc13
+[2(SECTION)0( or )2(SEGMENT)0(: Changing and Defining Sections)](6.3 )/section-6.3 (68)392 toc13
+[(The )2(__SECT__)0( Macro)](6.3.1 )/section-6.3.1 (68)375 toc23
+[2(ABSOLUTE)0(: Defining Absolute Labels)](6.4 )/section-6.4 (69)358 toc13
+[2(EXTERN)0(: Importing Symbols from Other Modules)](6.5 )/section-6.5 (70)341 toc13
+[2(GLOBAL)0(: Exporting Symbols to Other Modules)](6.6 )/section-6.6 (70)324 toc13
+[2(COMMON)0(: Defining Common Data Areas)](6.7 )/section-6.7 (70)307 toc13
+[2(CPU)0(: Defining CPU Dependencies)](6.8 )/section-6.8 (71)290 toc13
+[2(FLOAT)0(: Handling of floating-point constants)](6.9 )/section-6.9 (71)273 toc13
+[(Output Formats)](Chapter 7: )/chapter-7 (73)256 toc03
+[2(bin)0(: Flat-Form Binary Output)](7.1 )/section-7.1 (73)239 toc13
+[2(ORG)0(: Binary File Program Origin)](7.1.1 )/section-7.1.1 (73)222 toc23
+[2(bin)0( Extensions to the )2(SECTION)0( Directive)](7.1.2 )/section-7.1.2 (73)205 toc23
+[(Multisection Support for the )2(bin)0( Format)](7.1.3 )/section-7.1.3 (74)188 toc23
+[(Map Files)](7.1.4 )/section-7.1.4 (74)171 toc23
+[2(ith)0(: Intel Hex Output)](7.2 )/section-7.2 (74)154 toc13
+[2(srec)0(: Motorola S-Records Output)](7.3 )/section-7.3 (74)137 toc13
+[2(obj)0(: Microsoft OMF Object Files)](7.4 )/section-7.4 (75)120 toc13
+[2(obj)0( Extensions to the )2(SEGMENT)0( Directive)](7.4.1 )/section-7.4.1 (75)103 toc23
+(7)pageodd
+restore showpage
+%%Page: 8 8
+%%BeginPageSetup
+save
+%%EndPageSetup
+/8 pa
+[2(GROUP)0(: Defining Groups of Segments)](7.4.2 )/section-7.4.2 (76)681 toc23
+[2(UPPERCASE)0(: Disabling Case Sensitivity in Output)](7.4.3 )/section-7.4.3 (77)664 toc23
+[2(IMPORT)0(: Importing DLL Symbols)](7.4.4 )/section-7.4.4 (77)647 toc23
+[2(EXPORT)0(: Exporting DLL Symbols)](7.4.5 )/section-7.4.5 (77)630 toc23
+[2(..start)0(: Defining the Program Entry Point)](7.4.6 )/section-7.4.6 (78)613 toc23
+[2(obj)0( Extensions to the )2(EXTERN)0( Directive)](7.4.7 )/section-7.4.7 (78)596 toc23
+[2(obj)0( Extensions to the )2(COMMON)0( Directive)](7.4.8 )/section-7.4.8 (78)579 toc23
+[2(win32)0(: Microsoft Win32 Object Files)](7.5 )/section-7.5 (79)562 toc13
+[2(win32)0( Extensions to the )2(SECTION)0( Directive)](7.5.1 )/section-7.5.1 (79)545 toc23
+[2(win32)0(: Safe Structured Exception Handling)](7.5.2 )/section-7.5.2 (80)528 toc23
+[2(win64)0(: Microsoft Win64 Object Files)](7.6 )/section-7.6 (81)511 toc13
+[2(win64)0(: Writing Position-Independent Code)](7.6.1 )/section-7.6.1 (81)494 toc23
+[2(win64)0(: Structured Exception Handling)](7.6.2 )/section-7.6.2 (82)477 toc23
+[2(coff)0(: Common Object File Format)](7.7 )/section-7.7 (85)460 toc13
+[2(macho32)0( and )2(macho64)0(: Mach Object File Format)](7.8 )/section-7.8 (85)443 toc13
+[2(elf32)0( and )2(elf64)0(: Executable and Linkable Format Object Files)](7.9 )/section-7.9 (85)426 toc13
+[(ELF specific directive )2(osabi)](7.9.1 )/section-7.9.1 (85)409 toc23
+[2(elf)0( Extensions to the )2(SECTION)0( Directive)](7.9.2 )/section-7.9.2 (85)392 toc23
+[(Position-Independent Code: )2(elf)0( Special Symbols and )2(WRT)](7.9.3 )/section-7.9.3 (86)375 toc23
+[(Thread Local Storage: )2(elf)0( Special Symbols and )2(WRT)](7.9.4 )/section-7.9.4 (87)358 toc23
+[2(elf)0( Extensions to the )2(GLOBAL)0( Directive)](7.9.5 )/section-7.9.5 (87)341 toc23
+[2(elf)0( Extensions to the )2(COMMON)0( Directive )](7.9.6 )/section-7.9.6 (87)324 toc23
+[(16-bit code and ELF )](7.9.7 )/section-7.9.7 (88)307 toc23
+[(Debug formats and ELF )](7.9.8 )/section-7.9.8 (88)290 toc23
+[2(aout)0(: Linux )2(a.out)0( Object Files)](7.10 )/section-7.10 (88)273 toc13
+[2(aoutb)0(: NetBSD/FreeBSD/OpenBSD )2(a.out)0( Object Files)](7.11 )/section-7.11 (88)256 toc13
+[2(as86)0(: Minix/Linux )2(as86)0( Object Files)](7.12 )/section-7.12 (88)239 toc13
+[2(rdf)0(: Relocatable Dynamic Object File Format)](7.13 )/section-7.13 (88)222 toc13
+[(Requiring a Library: The )2(LIBRARY)0( Directive)](7.13.1 )/section-7.13.1 (89)205 toc23
+[(Specifying a Module Name: The )2(MODULE)0( Directive)](7.13.2 )/section-7.13.2 (89)188 toc23
+[2(rdf)0( Extensions to the )2(GLOBAL)0( Directive)](7.13.3 )/section-7.13.3 (89)171 toc23
+[2(rdf)0( Extensions to the )2(EXTERN)0( Directive)](7.13.4 )/section-7.13.4 (89)154 toc23
+[2(dbg)0(: Debugging Format)](7.14 )/section-7.14 (90)137 toc13
+[(Writing 16-bit Code \(DOS, Windows 3/3.1\))](Chapter 8: )/chapter-8 (91)120 toc03
+[(Producing )2(.EXE)0( Files)](8.1 )/section-8.1 (91)103 toc13
+(8)pageeven
+restore showpage
+%%Page: 9 9
+%%BeginPageSetup
+save
+%%EndPageSetup
+/9 pa
+[(Using the )2(obj)0( Format To Generate )2(.EXE)0( Files)](8.1.1 )/section-8.1.1 (91)681 toc23
+[(Using the )2(bin)0( Format To Generate )2(.EXE)0( Files)](8.1.2 )/section-8.1.2 (92)664 toc23
+[(Producing )2(.COM)0( Files)](8.2 )/section-8.2 (93)647 toc13
+[(Using the )2(bin)0( Format To Generate )2(.COM)0( Files)](8.2.1 )/section-8.2.1 (93)630 toc23
+[(Using the )2(obj)0( Format To Generate )2(.COM)0( Files)](8.2.2 )/section-8.2.2 (93)613 toc23
+[(Producing )2(.SYS)0( Files)](8.3 )/section-8.3 (94)596 toc13
+[(Interfacing to 16-bit C Programs)](8.4 )/section-8.4 (94)579 toc13
+[(External Symbol Names)](8.4.1 )/section-8.4.1 (94)562 toc23
+[(Memory Models)](8.4.2 )/section-8.4.2 (95)545 toc23
+[(Function Definitions and Function Calls)](8.4.3 )/section-8.4.3 (96)528 toc23
+[(Accessing Data Items)](8.4.4 )/section-8.4.4 (98)511 toc23
+[2(c16.mac)0(: Helper Macros for the 16-bit C Interface)](8.4.5 )/section-8.4.5 (98)494 toc23
+[(Interfacing to Borland Pascal Programs)](8.5 )/section-8.5 (99)477 toc13
+[(The Pascal Calling Convention)](8.5.1 )/section-8.5.1 (100)460 toc23
+[(Borland Pascal Segment Name Restrictions)](8.5.2 )/section-8.5.2 (101)443 toc23
+[(Using )2(c16.mac)0( With Pascal Programs)](8.5.3 )/section-8.5.3 (101)426 toc23
+[(Writing 32-bit Code \(Unix, Win32, DJGPP\))](Chapter 9: )/chapter-9 (103)409 toc03
+[(Interfacing to 32-bit C Programs)](9.1 )/section-9.1 (103)392 toc13
+[(External Symbol Names)](9.1.1 )/section-9.1.1 (103)375 toc23
+[(Function Definitions and Function Calls)](9.1.2 )/section-9.1.2 (103)358 toc23
+[(Accessing Data Items)](9.1.3 )/section-9.1.3 (105)341 toc23
+[2(c32.mac)0(: Helper Macros for the 32-bit C Interface)](9.1.4 )/section-9.1.4 (105)324 toc23
+[(Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries)](9.2 )/section-9.2 (106)307 toc13
+[(Obtaining the Address of the GOT)](9.2.1 )/section-9.2.1 (106)290 toc23
+[(Finding Your Local Data Items)](9.2.2 )/section-9.2.2 (107)273 toc23
+[(Finding External and Common Data Items)](9.2.3 )/section-9.2.3 (107)256 toc23
+[(Exporting Symbols to the Library User)](9.2.4 )/section-9.2.4 (108)239 toc23
+[(Calling Procedures Outside the Library)](9.2.5 )/section-9.2.5 (109)222 toc23
+[(Generating the Library File)](9.2.6 )/section-9.2.6 (109)205 toc23
+[(Mixing 16 and 32 Bit Code)](Chapter 10: )/chapter-10 (110)188 toc03
+[(Mixed-Size Jumps)](10.1 )/section-10.1 (110)171 toc13
+[(Addressing Between Different-Size Segments)](10.2 )/section-10.2 (110)154 toc13
+[(Other Mixed-Size Instructions)](10.3 )/section-10.3 (111)137 toc13
+[(Writing 64-bit Code \(Unix, Win64\))](Chapter 11: )/chapter-11 (113)120 toc03
+[(Register Names in 64-bit Mode)](11.1 )/section-11.1 (113)103 toc13
+(9)pageodd
+restore showpage
+%%Page: 10 10
+%%BeginPageSetup
+save
+%%EndPageSetup
+/10 pa
+[(Immediates and Displacements in 64-bit Mode)](11.2 )/section-11.2 (113)681 toc13
+[(Interfacing to 64-bit C Programs \(Unix\))](11.3 )/section-11.3 (114)664 toc13
+[(Interfacing to 64-bit C Programs \(Win64\))](11.4 )/section-11.4 (114)647 toc13
+[(Troubleshooting)](Chapter 12: )/chapter-12 (116)630 toc03
+[(Common Problems)](12.1 )/section-12.1 (116)613 toc13
+[(NASM Generates Inefficient Code)](12.1.1 )/section-12.1.1 (116)596 toc23
+[(My Jumps are Out of Range)](12.1.2 )/section-12.1.2 (116)579 toc23
+[2(ORG)0( Doesn't Work)](12.1.3 )/section-12.1.3 (116)562 toc23
+[2(TIMES)0( Doesn't Work)](12.1.4 )/section-12.1.4 (117)545 toc23
+[(Bugs)](12.2 )/section-12.2 (117)528 toc13
+[(Ndisasm)](Appendix A: )/appendix-A (119)511 toc03
+[(Introduction)](A.1 )/section-A.1 (119)494 toc13
+[(Getting Started: Installation)](A.2 )/section-A.2 (119)477 toc13
+[(Running NDISASM)](A.3 )/section-A.3 (119)460 toc13
+[(COM Files: Specifying an Origin)](A.3.1 )/section-A.3.1 (119)443 toc23
+[(Code Following Data: Synchronisation)](A.3.2 )/section-A.3.2 (119)426 toc23
+[(Mixed Code and Data: Automatic \(Intelligent\) Synchronisation )](A.3.3 )/section-A.3.3 (120)409 toc23
+[(Other Options)](A.3.4 )/section-A.3.4 (121)392 toc23
+[(Bugs and Improvements)](A.4 )/section-A.4 (121)375 toc13
+[(Instruction List)](Appendix B: )/appendix-B (122)358 toc03
+[(Introduction)](B.1 )/section-B.1 (122)341 toc13
+[(Special instructions...)](B.1.1 )/section-B.1.1 (122)324 toc23
+[(Conventional instructions)](B.1.2 )/section-B.1.2 (122)307 toc23
+[(Katmai Streaming SIMD instructions \(SSE \226\226 a.k.a. KNI, XMM, MMX2\))](B.1.3 )/section-B.1.3 (148)290 toc23
+[(Introduced in Deschutes but necessary for SSE support)](B.1.4 )/section-B.1.4 (149)273 toc23
+[(XSAVE group \(AVX and extended state\))](B.1.5 )/section-B.1.5 (149)256 toc23
+[(Generic memory operations)](B.1.6 )/section-B.1.6 (149)239 toc23
+[(New MMX instructions introduced in Katmai)](B.1.7 )/section-B.1.7 (150)222 toc23
+[(AMD Enhanced 3DNow! \(Athlon\) instructions)](B.1.8 )/section-B.1.8 (150)205 toc23
+[(Willamette SSE2 Cacheability Instructions)](B.1.9 )/section-B.1.9 (150)188 toc23
+[(Willamette MMX instructions \(SSE2 SIMD Integer Instructions\))](B.1.10 )/section-B.1.10 (150)171 toc23
+[(Willamette Streaming SIMD instructions \(SSE2\))](B.1.11 )/section-B.1.11 (152)154 toc23
+[(Prescott New Instructions \(SSE3\))](B.1.12 )/section-B.1.12 (154)137 toc23
+[(VMX Instructions)](B.1.13 )/section-B.1.13 (154)120 toc23
+[(Extended Page Tables VMX instructions)](B.1.14 )/section-B.1.14 (154)103 toc23
+(10)pageeven
+restore showpage
+%%Page: 11 11
+%%BeginPageSetup
+save
+%%EndPageSetup
+/11 pa
+[(Tejas New Instructions \(SSSE3\))](B.1.15 )/section-B.1.15 (155)681 toc23
+[(AMD SSE4A)](B.1.16 )/section-B.1.16 (155)664 toc23
+[(New instructions in Barcelona)](B.1.17 )/section-B.1.17 (155)647 toc23
+[(Penryn New Instructions \(SSE4.1\))](B.1.18 )/section-B.1.18 (155)630 toc23
+[(Nehalem New Instructions \(SSE4.2\))](B.1.19 )/section-B.1.19 (157)613 toc23
+[(Intel SMX)](B.1.20 )/section-B.1.20 (157)596 toc23
+[(Geode \(Cyrix\) 3DNow! additions)](B.1.21 )/section-B.1.21 (157)579 toc23
+[(Intel new instructions in ???)](B.1.22 )/section-B.1.22 (157)562 toc23
+[(Intel AES instructions)](B.1.23 )/section-B.1.23 (157)545 toc23
+[(Intel AVX AES instructions)](B.1.24 )/section-B.1.24 (157)528 toc23
+[(Intel AVX instructions)](B.1.25 )/section-B.1.25 (158)511 toc23
+[(Intel Carry-Less Multiplication instructions \(CLMUL\))](B.1.26 )/section-B.1.26 (170)494 toc23
+[(Intel AVX Carry-Less Multiplication instructions \(CLMUL\))](B.1.27 )/section-B.1.27 (170)477 toc23
+[(Intel Fused Multiply-Add instructions \(FMA\))](B.1.28 )/section-B.1.28 (170)460 toc23
+[(VIA \(Centaur\) security instructions)](B.1.29 )/section-B.1.29 (174)443 toc23
+[(AMD Lightweight Profiling \(LWP\) instructions)](B.1.30 )/section-B.1.30 (174)426 toc23
+[(AMD XOP, FMA4 and CVT16 instructions \(SSE5\))](B.1.31 )/section-B.1.31 (174)409 toc23
+[(Systematic names for the hinting nop instructions)](B.1.32 )/section-B.1.32 (177)392 toc23
+[(NASM Version History)](Appendix C: )/appendix-C (181)375 toc03
+[(NASM 2 Series)](C.1 )/section-C.1 (181)358 toc13
+[(Version 2.08)](C.1.1 )/section-C.1.1 (181)341 toc23
+[(Version 2.07)](C.1.2 )/section-C.1.2 (181)324 toc23
+[(Version 2.06)](C.1.3 )/section-C.1.3 (182)307 toc23
+[(Version 2.05.01)](C.1.4 )/section-C.1.4 (182)290 toc23
+[(Version 2.05)](C.1.5 )/section-C.1.5 (182)273 toc23
+[(Version 2.04)](C.1.6 )/section-C.1.6 (183)256 toc23
+[(Version 2.03.01)](C.1.7 )/section-C.1.7 (184)239 toc23
+[(Version 2.03)](C.1.8 )/section-C.1.8 (184)222 toc23
+[(Version 2.02)](C.1.9 )/section-C.1.9 (184)205 toc23
+[(Version 2.01)](C.1.10 )/section-C.1.10 (185)188 toc23
+[(Version 2.00)](C.1.11 )/section-C.1.11 (185)171 toc23
+[(NASM 0.98 Series)](C.2 )/section-C.2 (186)154 toc13
+[(Version 0.98.39)](C.2.1 )/section-C.2.1 (186)137 toc23
+[(Version 0.98.38)](C.2.2 )/section-C.2.2 (186)120 toc23
+[(Version 0.98.37)](C.2.3 )/section-C.2.3 (187)103 toc23
+(11)pageodd
+restore showpage
+%%Page: 12 12
+%%BeginPageSetup
+save
+%%EndPageSetup
+/12 pa
+[(Version 0.98.36)](C.2.4 )/section-C.2.4 (187)681 toc23
+[(Version 0.98.35)](C.2.5 )/section-C.2.5 (187)664 toc23
+[(Version 0.98.34)](C.2.6 )/section-C.2.6 (187)647 toc23
+[(Version 0.98.33)](C.2.7 )/section-C.2.7 (188)630 toc23
+[(Version 0.98.32)](C.2.8 )/section-C.2.8 (188)613 toc23
+[(Version 0.98.31)](C.2.9 )/section-C.2.9 (188)596 toc23
+[(Version 0.98.30)](C.2.10 )/section-C.2.10 (189)579 toc23
+[(Version 0.98.28)](C.2.11 )/section-C.2.11 (189)562 toc23
+[(Version 0.98.26)](C.2.12 )/section-C.2.12 (189)545 toc23
+[(Version 0.98.25alt)](C.2.13 )/section-C.2.13 (189)528 toc23
+[(Version 0.98.25)](C.2.14 )/section-C.2.14 (189)511 toc23
+[(Version 0.98.24p1)](C.2.15 )/section-C.2.15 (189)494 toc23
+[(Version 0.98.24)](C.2.16 )/section-C.2.16 (189)477 toc23
+[(Version 0.98.23)](C.2.17 )/section-C.2.17 (189)460 toc23
+[(Version 0.98.22)](C.2.18 )/section-C.2.18 (189)443 toc23
+[(Version 0.98.21)](C.2.19 )/section-C.2.19 (189)426 toc23
+[(Version 0.98.20)](C.2.20 )/section-C.2.20 (190)409 toc23
+[(Version 0.98.19)](C.2.21 )/section-C.2.21 (190)392 toc23
+[(Version 0.98.18)](C.2.22 )/section-C.2.22 (190)375 toc23
+[(Version 0.98.17)](C.2.23 )/section-C.2.23 (190)358 toc23
+[(Version 0.98.16)](C.2.24 )/section-C.2.24 (190)341 toc23
+[(Version 0.98.15)](C.2.25 )/section-C.2.25 (190)324 toc23
+[(Version 0.98.14)](C.2.26 )/section-C.2.26 (190)307 toc23
+[(Version 0.98.13)](C.2.27 )/section-C.2.27 (190)290 toc23
+[(Version 0.98.12)](C.2.28 )/section-C.2.28 (190)273 toc23
+[(Version 0.98.11)](C.2.29 )/section-C.2.29 (190)256 toc23
+[(Version 0.98.10)](C.2.30 )/section-C.2.30 (190)239 toc23
+[(Version 0.98.09)](C.2.31 )/section-C.2.31 (190)222 toc23
+[(Version 0.98.08)](C.2.32 )/section-C.2.32 (191)205 toc23
+[(Version 0.98.09b with John Coffman patches released 28-Oct-2001)](C.2.33 )/section-C.2.33 (191)188 toc23
+[(Version 0.98.07 released 01/28/01)](C.2.34 )/section-C.2.34 (191)171 toc23
+[(Version 0.98.06f released 01/18/01)](C.2.35 )/section-C.2.35 (191)154 toc23
+[(Version 0.98.06e released 01/09/01)](C.2.36 )/section-C.2.36 (191)137 toc23
+[(Version 0.98p1)](C.2.37 )/section-C.2.37 (192)120 toc23
+[(Version 0.98bf \(bug-fixed\))](C.2.38 )/section-C.2.38 (192)103 toc23
+(12)pageeven
+restore showpage
+%%Page: 13 13
+%%BeginPageSetup
+save
+%%EndPageSetup
+/13 pa
+[(Version 0.98.03 with John Coffman's changes released 27-Jul-2000)](C.2.39 )/section-C.2.39 (192)681 toc23
+[(Version 0.98.03)](C.2.40 )/section-C.2.40 (192)664 toc23
+[(Version 0.98)](C.2.41 )/section-C.2.41 (195)647 toc23
+[(Version 0.98p9)](C.2.42 )/section-C.2.42 (196)630 toc23
+[(Version 0.98p8)](C.2.43 )/section-C.2.43 (196)613 toc23
+[(Version 0.98p7)](C.2.44 )/section-C.2.44 (196)596 toc23
+[(Version 0.98p6)](C.2.45 )/section-C.2.45 (197)579 toc23
+[(Version 0.98p3.7)](C.2.46 )/section-C.2.46 (197)562 toc23
+[(Version 0.98p3.6)](C.2.47 )/section-C.2.47 (197)545 toc23
+[(Version 0.98p3.5)](C.2.48 )/section-C.2.48 (197)528 toc23
+[(Version 0.98p3.4)](C.2.49 )/section-C.2.49 (198)511 toc23
+[(Version 0.98p3.3)](C.2.50 )/section-C.2.50 (198)494 toc23
+[(Version 0.98p3.2)](C.2.51 )/section-C.2.51 (198)477 toc23
+[(Version 0.98p3-hpa)](C.2.52 )/section-C.2.52 (198)460 toc23
+[(Version 0.98 pre-release 3)](C.2.53 )/section-C.2.53 (198)443 toc23
+[(Version 0.98 pre-release 2)](C.2.54 )/section-C.2.54 (199)426 toc23
+[(Version 0.98 pre-release 1)](C.2.55 )/section-C.2.55 (199)409 toc23
+[(NASM 0.9 Series)](C.3 )/section-C.3 (200)392 toc13
+[(Version 0.97 released December 1997)](C.3.1 )/section-C.3.1 (200)375 toc23
+[(Version 0.96 released November 1997)](C.3.2 )/section-C.3.2 (200)358 toc23
+[(Version 0.95 released July 1997)](C.3.3 )/section-C.3.3 (202)341 toc23
+[(Version 0.94 released April 1997)](C.3.4 )/section-C.3.4 (204)324 toc23
+[(Version 0.93 released January 1997)](C.3.5 )/section-C.3.5 (204)307 toc23
+[(Version 0.92 released January 1997)](C.3.6 )/section-C.3.6 (205)290 toc23
+[(Version 0.91 released November 1996)](C.3.7 )/section-C.3.7 (205)273 toc23
+[(Version 0.90 released October 1996)](C.3.8 )/section-C.3.8 (205)256 toc23
+(13)pageodd
+restore showpage
+%%Page: 14 14
+%%BeginPageSetup
+save
+%%EndPageSetup
+/14 pa
+[{/chapter-1 xa}(Chapter 1: Introduction)]642.8 chap3
+[{/section-1.1 xa}(What Is NASM?)](1.1)603.4 head3
+[(The Netwide Assembler, NASM, is an 80x86 and x86-64 assembler designed for portability and modularity.)]586.4 norm1
+[(It supports a range of object file formats, including Linux and )2(*BSD)0( )2(a.out)0(, )2(ELF)0(, )2(COFF)0(, )2(Mach-O)0(,)]575.4 norm0
+[(Microsoft 16-bit )2(OBJ)0(, )2(Win32)0( and )2(Win64)0(. It will also output plain binary files. Its syntax is designed to be)]564.4 norm0
+[(simple and easy to understand, similar to Intel's but less complex. It supports all currently known x86)]553.4 norm0
+[(architectural extensions, and has strong support for macros.)]542.4 norm2
+[{/section-1.1.1 xa}(Why Yet Another Assembler?)](1.1.1)523.2 subh3
+[(The Netwide Assembler grew out of an idea on )2(comp.lang.asm.x86)0( \(or possibly )2(alt.lang.asm)0( \226 I)]506.2 norm1
+[(forget which\), which was essentially that there didn't seem to be a good )1(free)0( x86-series assembler around,)]495.2 norm0
+[(and that maybe someone ought to write one.)]484.2 norm2
+[2(a86)0( is good, but not free, and in particular you don't get any 32-bit capability until you pay. It's DOS)]467.2 bull1
+[(only, too.)]456.2 bull2
+[2(gas)0( 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)]439.2 bull1
+[2(gcc)0(, which always feeds it correct code. So its error checking is minimal. Also, its syntax is horrible, from)]428.2 bull0
+[(the point of view of anyone trying to actually )1(write)0( anything in it. Plus you can't write 16-bit code in it)]417.2 bull0
+[(\(properly.\))]406.2 bull2
+[2(as86)0( is specific to Minix and Linux, and \(my version at least\) doesn't seem to have much \(or any\))]389.2 bull1
+[(documentation.)]378.2 bull2
+[2(MASM)0( isn't very good, and it's \(was\) expensive, and it runs only under DOS.)]361.2 bull3
+[2(TASM)0( is better, but still strives for MASM compatibility, which means millions of directives and tons of)]344.2 bull1
+[(red tape. And its syntax is essentially MASM's, with the contradictions and quirks that entails \(although it)]333.2 bull0
+[(sorts out some of those by means of Ideal mode.\) It's expensive too. And it's DOS-only.)]322.2 bull2
+[(So here, for your coding pleasure, is NASM. At present it's still in prototype stage \226 we don't promise that it)]305.2 norm1
+[(can outperform any of these assemblers. But please, )1(please)0( send us bug reports, fixes, helpful information,)]294.2 norm0
+[(and anything else you can get your hands on \(and thanks to the many people who've done this already! You)]283.2 norm0
+[(all know who you are\), and we'll improve it out of all recognition. Again.)]272.2 norm2
+[{/section-1.1.2 xa}(License Conditions)](1.1.2)253 subh3
+[(Please see the file )2(LICENSE)0(, supplied as part of any NASM distribution archive, for the license conditions)]236 norm1
+[(under which you may use NASM. NASM is now under the so-called 2-clause BSD license, also known as)]225 norm0
+[(the simplified BSD license.)]214 norm2
+[(Copyright 1996-2009 the NASM Authors \226 All rights reserved.)]197 norm3
+[(Redistribution and use in source and binary forms, with or without modification, are permitted provided that)]180 norm1
+[(the following conditions are met:)]169 norm2
+[(Redistributions of source code must retain the above copyright notice, this list of conditions and the)]152 bull1
+[(following disclaimer.)]141 bull2
+[(Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the)]124 bull1
+[(following disclaimer in the documentation and/or other materials provided with the distribution.)]113 bull2
+(14)pageeven
+restore showpage
+%%Page: 15 15
+%%BeginPageSetup
+save
+%%EndPageSetup
+/15 pa
+[(THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS")]681 norm1
+[(AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE)]670 norm0
+[(IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE)]659 norm0
+[(ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE)]648 norm0
+[(LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR)]637 norm0
+[(CONSEQUENTIAL DAMAGES \(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF)]626 norm0
+[(SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS)]615 norm0
+[(INTERRUPTION\) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN)]604 norm0
+[(CONTRACT, STRICT LIABILITY, OR TORT \(INCLUDING NEGLIGENCE OR OTHERWISE\))]593 norm0
+[(ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE)]582 norm0
+[(POSSIBILITY OF SUCH DAMAGE.)]571 norm2
+[{/section-1.2 xa}(Contact Information)](1.2)549.6 head3
+[(The current version of NASM \(since about 0.98.08\) is maintained by a team of developers, accessible through)]532.6 norm1
+[(the )2(nasm-devel)0( mailing list \(see below for the link\). If you want to report a bug, please read ){/section-12.2 xl}(section 12.2){el}]521.6 norm0
+[(first.)]510.6 norm2
+[(NASM has a )(website at ){(http://www.nasm.us/)wl}2(http://www.nasm.us/){el}0(. If it's not there, google for us!)]493.6 norm3
+[(New releases, )(release candidates, and )(daily development snapshots of NASM are available from the official)]476.6 norm1
+[(web site.)]465.6 norm2
+[(Announcements are posted to ){(news:comp.lang.asm.x86)wl}2(comp.lang.asm.x86){el}0(, and to the web site)]448.6 norm1
+[{(http://www.freshmeat.net/)wl}2(http://www.freshmeat.net/){el}0(.)]437.6 norm2
+[(If you want information about the current development status, please subscribe to the )2(nasm-devel)0( email)]420.6 norm1
+[(list; see link from the website.)]409.6 norm2
+[{/section-1.3 xa}(Installation)](1.3)388.2 head3
+[{/section-1.3.1 xa}(Installing NASM under MS-)(DOS or Windows)](1.3.1)369 subh3
+[(Once you've obtained the appropriate archive for NASM, )2(nasm-XXX-dos.zip)0( or)]352 norm1
+[2(nasm-XXX-win32.zip)0( \(where )2(XXX)0( denotes the version number of NASM contained in the archive\),)]341 norm0
+[(unpack it into its own directory \(for example )2(c:\\nasm)0(\).)]330 norm2
+[(The archive will contain a set of executable files: the NASM executable file )2(nasm.exe)0(, the NDISASM)]313 norm1
+[(executable file )2(ndisasm.exe)0(, and possibly additional utilities to handle the RDOFF file format.)]302 norm2
+[(The only file NASM needs to run is its own executable, so copy )2(nasm.exe)0( to a directory on your PATH, or)]285 norm1
+[(alternatively edit )2(autoexec.bat)0( to add the )2(nasm)0( directory to your )2(PATH)0( \(to do that under Windows XP,)]274 norm0
+[(go to Start > Control Panel > System > Advanced > Environment Variables; these instructions may work)]263 norm0
+[(under other versions of Windows as well.\))]252 norm2
+[(That's it \226 NASM is installed. You don't need the nasm directory to be present to run NASM \(unless you've)]235 norm1
+[(added it to your )2(PATH)0(\), so you can delete it if you need to save space; however, you may want to keep the)]224 norm0
+[(documentation or test programs.)]213 norm2
+[(If you've downloaded the )(DOS source archive, )2(nasm-XXX.zip)0(, the )2(nasm)0( directory will also contain the)]196 norm1
+[(full NASM )(source code, and a selection of )(Makefiles you can \(hopefully\) use to rebuild your copy of NASM)]185 norm0
+[(from scratch. See the file )2(INSTALL)0( in the source archive.)]174 norm2
+[(Note that a number of files are generated from other files by Perl scripts. Although the NASM source)]157 norm1
+[(distribution includes these generated files, you will need to rebuild them \(and hence, will need a Perl)]146 norm0
+[(interpreter\) if you change insns.dat, standard.mac or the documentation. It is possible future source)]135 norm0
+[(distributions may not include these files at all. Ports of )(Perl for a variety of platforms, including DOS and)]124 norm0
+[(Windows, are available from ){(http://www.cpan.org/ports/)wl}(www.cpan.org){el}(.)]113 norm2
+(15)pageodd
+restore showpage
+%%Page: 16 16
+%%BeginPageSetup
+save
+%%EndPageSetup
+/16 pa
+[{/section-1.3.2 xa}(Installing NASM under )(Unix)](1.3.2)678.8 subh3
+[(Once you've obtained the )(Unix source archive for NASM, )2(nasm-XXX.tar.gz)0( \(where )2(XXX)0( denotes the)]661.8 norm1
+[(version number of NASM contained in the archive\), unpack it into a directory such as )2(/usr/local/src)0(.)]650.8 norm0
+[(The archive, when unpacked, will create its own subdirectory )2(nasm-XXX)0(.)]639.8 norm2
+[(NASM is an )(auto-configuring package: once you've unpacked it, )2(cd)0( to the directory it's been unpacked into)]622.8 norm1
+[(and type )2(./configure)0(. This shell script will find the best C compiler to use for building NASM and set up)]611.8 norm0
+[(Makefiles accordingly.)]600.8 norm2
+[(Once NASM has auto-configured, you can type )2(make)0( to build the )2(nasm)0( and )2(ndisasm)0( binaries, and then)]583.8 norm1
+[2(make install)0( to install them in )2(/usr/local/bin)0( and install the )(man pages )2(nasm.1)0( and)]572.8 norm0
+[2(ndisasm.1)0( in )2(/usr/local/man/man1)0(. Alternatively, you can give options such as )2(--prefix)0( to the)]561.8 norm0
+[(configure script \(see the file )2(INSTALL)0( for more details\), or install the programs yourself.)]550.8 norm2
+[(NASM also comes with a set of utilities for handling the )2(RDOFF)0( custom object-file format, which are in the)]533.8 norm1
+[2(rdoff)0( subdirectory of the NASM archive. You can build these with )2(make rdf)0( and install them with)]522.8 norm0
+[2(make rdf_install)0(, if you want them.)]511.8 norm2
+(16)pageeven
+restore showpage
+%%Page: 17 17
+%%BeginPageSetup
+save
+%%EndPageSetup
+/17 pa
+[{/chapter-2 xa}(Chapter 2: Running NASM)]642.8 chap3
+[{/section-2.1 xa}(NASM )(Command-Line Syntax)](2.1)603.4 head3
+[(To assemble a file, you issue a command of the form)]586.4 norm3
+[2(nasm -f <format> <filename> [-o <output>])]569.4 code3
+[(For example,)]552.4 norm3
+[2(nasm -f elf myfile.asm)]535.4 code3
+[(will assemble )2(myfile.asm)0( into an )2(ELF)0( object file )2(myfile.o)0(. And)]518.4 norm3
+[2(nasm -f bin myfile.asm -o myfile.com)]501.4 code3
+[(will assemble )2(myfile.asm)0( into a raw binary file )2(myfile.com)0(.)]484.4 norm3
+[(To produce a listing file, with the hex codes output from NASM displayed on the left of the original sources,)]467.4 norm1
+[(use the )2(-l)0( option to give a listing file name, for example:)]456.4 norm2
+[2(nasm -f coff myfile.asm -l myfile.lst)]439.4 code3
+[(To get further usage instructions from NASM, try typing)]422.4 norm3
+[2(nasm -h)]405.4 code3
+[(As )2(-hf)0(, this will also list the available output file formats, and what they are.)]388.4 norm3
+[(If you use Linux but aren't sure whether your system is )2(a.out)0( or )2(ELF)0(, type)]371.4 norm3
+[2(file nasm)]354.4 code3
+[(\(in the directory in which you put the NASM binary when you installed it\). If it says something like)]337.4 norm3
+[2(nasm: ELF 32-bit LSB executable i386 \(386 and up\) Version 1)]320.4 code3
+[(then your system is )2(ELF)0(, and you should use the option )2(-f elf)0( when you want NASM to produce Linux)]303.4 norm1
+[(object files. If it says)]292.4 norm2
+[2(nasm: Linux/i386 demand-paged executable \(QMAGIC\))]275.4 code3
+[(or something similar, your system is )2(a.out)0(, and you should use )2(-f aout)0( instead \(Linux )2(a.out)0( systems)]258.4 norm1
+[(have long been obsolete, and are rare these days.\))]247.4 norm2
+[(Like Unix compilers and assemblers, NASM is silent unless it goes wrong: you won't see any output at all,)]230.4 norm1
+[(unless it gives error messages.)]219.4 norm2
+[{/section-2.1.1 xa}(The )2(-o)0( Option: Specifying the Output File Name)](2.1.1)200.2 subh3
+[(NASM will normally choose the name of your output file for you; precisely how it does this is dependent on)]183.2 norm1
+[(the object file format. For Microsoft object file formats \()2(obj)0(, )2(win32)0( and )2(win64)0(\), it will remove the )2(.asm)]172.2 norm0
+[(extension \(or whatever extension you like to use \226 NASM doesn't care\) from your source file name and)]161.2 norm0
+[(substitute )2(.obj)0(. For Unix object file formats \()2(aout)0(, )2(as86)0(, )2(coff)0(, )2(elf32)0(, )2(elf64)0(, )2(ieee)0(, )2(macho32)0( and)]150.2 norm0
+[2(macho64)0(\) it will substitute )2(.o)0(. For )2(dbg)0(, )2(rdf)0(, )2(ith)0( and )2(srec)0(, it will use )2(.dbg)0(, )2(.rdf)0(, )2(.ith)0( and )2(.srec)0(,)]139.2 norm0
+[(respectively, and for the )2(bin)0( format it will simply remove the extension, so that )2(myfile.asm)0( produces the)]128.2 norm0
+[(output file )2(myfile)0(.)]117.2 norm2
+(17)pageodd
+restore showpage
+%%Page: 18 18
+%%BeginPageSetup
+save
+%%EndPageSetup
+/18 pa
+[(If the output file already exists, NASM will overwrite it, unless it has the same name as the input file, in)]681 norm1
+[(which case it will give a warning and use )2(nasm.out)0( as the output file name instead.)]670 norm2
+[(For situations in which this behaviour is unacceptable, NASM provides the )2(-o)0( command-line option, which)]653 norm1
+[(allows you to specify your desired output file name. You invoke )2(-o)0( by following it with the name you wish)]642 norm0
+[(for the output file, either with or without an intervening space. For example:)]631 norm2
+[2(nasm -f bin program.asm -o program.com )]614 code1
+[2(nasm -f bin driver.asm -odriver.sys)]603 code2
+[(Note that this is a small o, and is different from a capital O , which is used to specify the number of)]586 norm1
+[(optimisation passes required. See ){/section-2.1.22 xl}(section 2.1.22){el}(.)]575 norm2
+[{/section-2.1.2 xa}(The )2(-f)0( Option: Specifying the )(Output File Format)](2.1.2)555.8 subh3
+[(If you do not supply the )2(-f)0( option to NASM, it will choose an output file format for you itself. In the)]538.8 norm1
+[(distribution versions of NASM, the default is always )2(bin)0(; if you've compiled your own copy of NASM, you)]527.8 norm0
+[(can redefine )2(OF_DEFAULT)0( at compile time and choose what you want the default to be.)]516.8 norm2
+[(Like )2(-o)0(, the intervening space between )2(-f)0( and the output file format is optional; so )2(-f elf)0( and )2(-felf)0( are)]499.8 norm1
+[(both valid.)]488.8 norm2
+[(A complete list of the available output file formats can be given by issuing the command )2(nasm -hf)0(.)]471.8 norm3
+[{/section-2.1.3 xa}(The )2(-l)0( Option: Generating a )(Listing File)](2.1.3)452.6 subh3
+[(If you supply the )2(-l)0( option to NASM, followed \(with the usual optional space\) by a file name, NASM will)]435.6 norm1
+[(generate a )(source-listing file for you, in which addresses and generated code are listed on the left, and the)]424.6 norm0
+[(actual source code, with expansions of multi-line macros \(except those which specifically request no)]413.6 norm0
+[(expansion in source listings: see ){/section-4.3.10 xl}(section 4.3.10){el}(\) on the right. For example:)]402.6 norm2
+[2(nasm -f elf myfile.asm -l myfile.lst)]385.6 code3
+[(If a list file is selected, you may turn off listing for a section of your source with )2([list -])0(, and turn it back)]368.6 norm1
+[(on with )2([list +])0(, \(the default, obviously\). There is no "user form" \(without the brackets\). This can be used)]357.6 norm0
+[(to list only sections of interest, avoiding excessively long listings.)]346.6 norm2
+[{/section-2.1.4 xa}(The )2(-M)0( Option: Generate )(Makefile Dependencies)](2.1.4)327.4 subh3
+[(This option can be used to generate makefile dependencies on stdout. This can be redirected to a file for)]310.4 norm1
+[(further processing. For example:)]299.4 norm2
+[2(nasm -M myfile.asm > myfile.dep)]282.4 code3
+[{/section-2.1.5 xa}(The )2(-MG)0( Option: Generate )(Makefile Dependencies)](2.1.5)263.2 subh3
+[(This option can be used to generate makefile dependencies on stdout. This differs from the )2(-M)0( option in that if)]246.2 norm1
+[(a nonexisting file is encountered, it is assumed to be a generated file and is added to the dependency list)]235.2 norm0
+[(without a prefix.)]224.2 norm2
+[{/section-2.1.6 xa}(The )2(-MF)0( Option: Set Makefile Dependency File)](2.1.6)205 subh3
+[(This option can be used with the )2(-M)0( or )2(-MG)0( options to send the output to a file, rather than to stdout. For)]188 norm1
+[(example:)]177 norm2
+[2(nasm -M -MF myfile.dep myfile.asm)]160 code3
+[{/section-2.1.7 xa}(The )2(-MD)0( Option: Assemble and Generate Dependencies)](2.1.7)140.8 subh3
+[(The )2(-MD)0( option acts as the combination of the )2(-M)0( and )2(-MF)0( options \(i.e. a filename has to be specified.\))]123.8 norm1
+[(However, unlike the )2(-M)0( or )2(-MG)0( options, )2(-MD)0( does )1(not)0( inhibit the normal operation of the assembler. Use this)]112.8 norm0
+[(to automatically generate updated dependencies with every assembly session. For example:)]101.8 norm2
+(18)pageeven
+restore showpage
+%%Page: 19 19
+%%BeginPageSetup
+save
+%%EndPageSetup
+/19 pa
+[2(nasm -f elf -o myfile.o -MD myfile.dep myfile.asm)]681 code3
+[{/section-2.1.8 xa}(The )2(-MT)0( Option: Dependency Target Name)](2.1.8)661.8 subh3
+[(The )2(-MT)0( option can be used to override the default name of the dependency target. This is normally the same)]644.8 norm1
+[(as the output filename, specified by the )2(-o)0( option.)]633.8 norm2
+[{/section-2.1.9 xa}(The )2(-MQ)0( Option: Dependency Target Name \(Quoted\))](2.1.9)614.6 subh3
+[(The )2(-MQ)0( option acts as the )2(-MT)0( option, except it tries to quote characters that have special meaning in)]597.6 norm1
+[(Makefile syntax. This is not foolproof, as not all characters with special meaning are quotable in Make.)]586.6 norm2
+[{/section-2.1.10 xa}(The )2(-MP)0( Option: Emit phony targets)](2.1.10)567.4 subh3
+[(When used with any of the dependency generation options, the )2(-MP)0( option causes NASM to emit a phony)]550.4 norm1
+[(target without dependencies for each header file. This prevents Make from complaining if a header file has)]539.4 norm0
+[(been removed.)]528.4 norm2
+[{/section-2.1.11 xa}(The )2(-F)0( Option: Selecting a )(Debug Information Format)](2.1.11)509.2 subh3
+[(This option is used to select the format of the debug information emitted into the output file, to be used by a)]492.2 norm1
+[(debugger \(or )1(will)0( be\). Prior to version 2.03.01, the use of this switch did )1(not)0( enable output of the selected)]481.2 norm0
+[(debug info format. Use )2(-g)0(, see ){/section-2.1.12 xl}(section 2.1.12){el}(, to enable output. Versions 2.03.01 and later automatically)]470.2 norm0
+[(enable )2(-g)0( if )2(-F)0( is specified.)]459.2 norm2
+[(A complete list of the available debug file formats for an output format can be seen by issuing the command)]442.2 norm1
+[2(nasm -f <format> -y)0(. Not all output formats currently support debugging output. See ){/section-2.1.26 xl}(section 2.1.26){el}(.)]431.2 norm2
+[(This should not be confused with the )2(-f dbg)0( output format option which is not built into NASM by default.)]414.2 norm1
+[(For information on how to enable it when building from the sources, see ){/section-7.14 xl}(section 7.14){el}(.)]403.2 norm2
+[{/section-2.1.12 xa}(The )2(-g)0( Option: Enabling )(Debug Information.)](2.1.12)384 subh3
+[(This option can be used to generate debugging information in the specified format. See ){/section-2.1.11 xl}(section 2.1.11){el}(. Using)]367 norm1
+[2(-g)0( without )2(-F)0( results in emitting debug info in the default format, if any, for the selected output format. If no)]356 norm0
+[(debug information is currently implemented in the selected output format, )2(-g)0( is )1(silently ignored)0(.)]345 norm2
+[{/section-2.1.13 xa}(The )2(-X)0( Option: Selecting an )(Error Reporting Format)](2.1.13)325.8 subh3
+[(This option can be used to select an error reporting format for any error messages that might be produced by)]308.8 norm1
+[(NASM.)]297.8 norm2
+[(Currently, two error reporting formats may be selected. They are the )2(-Xvc)0( option and the )2(-Xgnu)0( option. The)]280.8 norm1
+[(GNU format is the default and looks like this:)]269.8 norm2
+[2(filename.asm:65: error: specific error message)]252.8 code3
+[(where )2(filename.asm)0( is the name of the source file in which the error was detected, )2(65)0( is the source file)]235.8 norm1
+[(line number on which the error was detected, )2(error)0( is the severity of the error \(this could be )2(warning)0(\),)]224.8 norm0
+[(and )2(specific error message)0( is a more detailed text message which should help pinpoint the exact)]213.8 norm0
+[(problem.)]202.8 norm2
+[(The other format, specified by )2(-Xvc)0( is the style used by Microsoft Visual C++ and some other programs. It)]185.8 norm1
+[(looks like this:)]174.8 norm2
+[2(filename.asm\(65\) : error: specific error message)]157.8 code3
+[(where the only difference is that the line number is in parentheses instead of being delimited by colons.)]140.8 norm3
+[(See also the )2(Visual C++)0( output format, ){/section-7.5 xl}(section 7.5){el}(.)]123.8 norm3
+(19)pageodd
+restore showpage
+%%Page: 20 20
+%%BeginPageSetup
+save
+%%EndPageSetup
+/20 pa
+[{/section-2.1.14 xa}(The )2(-Z)0( Option: Send Errors to a File)](2.1.14)678.8 subh3
+[(Under )2(MS-DOS)0( it can be difficult \(though there are ways\) to redirect the standard-error output of a program)]661.8 norm1
+[(to a file. Since NASM usually produces its warning and )(error messages on )2(stderr)0(, this can make it hard to)]650.8 norm0
+[(capture the errors if \(for example\) you want to load them into an editor.)]639.8 norm2
+[(NASM therefore provides the )2(-Z)0( option, taking a filename argument which causes errors to be sent to the)]622.8 norm1
+[(specified files rather than standard error. Therefore you can )(redirect the errors into a file by typing)]611.8 norm2
+[2(nasm -Z myfile.err -f obj myfile.asm)]594.8 code3
+[(In earlier versions of NASM, this option was called )2(-E)0(, but it was changed since )2(-E)0( is an option)]577.8 norm1
+[(conventionally used for preprocessing only, with disastrous results. See ){/section-2.1.20 xl}(section 2.1.20){el}(.)]566.8 norm2
+[{/section-2.1.15 xa}(The )2(-s)0( Option: Send Errors to )2(stdout)](2.1.15)547.6 subh3
+[(The )2(-s)0( option redirects )(error messages to )2(stdout)0( rather than )2(stderr)0(, so it can be redirected under)]530.6 norm1
+[2(MS-DOS)0(. To assemble the file )2(myfile.asm)0( and pipe its output to the )2(more)0( program, you can type:)]519.6 norm2
+[2(nasm -s -f obj myfile.asm | more)]502.6 code3
+[(See also the )2(-Z)0( option, ){/section-2.1.14 xl}(section 2.1.14){el}(.)]485.6 norm3
+[{/section-2.1.16 xa}(The )2(-i)0( Option: Include File Search Directories)](2.1.16)466.4 subh3
+[(When NASM sees the )2(%include)0( or )2(%pathsearch)0( directive in a source file \(see ){/section-4.6.1 xl}(section 4.6.1){el}(, ){/section-4.6.2 xl}(section){el}]449.4 norm1
+[{/section-4.6.2 xl}(4.6.2){el}( or ){/section-3.2.3 xl}(section 3.2.3){el}(\), it will search for the given file not only in the current directory, but also in any)]438.4 norm0
+[(directories specified on the command line by the use of the )2(-i)0( option. Therefore you can include files from a)]427.4 norm0
+[(macro library, for example, by typing)]416.4 norm2
+[2(nasm -ic:\\macrolib\\ -f obj myfile.asm)]399.4 code3
+[(\(As usual, a space between )2(-i)0( and the path name is allowed, and optional\).)]382.4 norm3
+[(NASM, in the interests of complete source-code portability, does not understand the file naming conventions)]365.4 norm1
+[(of the OS it is running on; the string you provide as an argument to the )2(-i)0( option will be prepended exactly as)]354.4 norm0
+[(written to the name of the include file. Therefore the trailing backslash in the above example is necessary.)]343.4 norm0
+[(Under Unix, a trailing forward slash is similarly necessary.)]332.4 norm2
+[(\(You can use this to your advantage, if you're really )(perverse, by noting that the option )2(-ifoo)0( will cause)]315.4 norm1
+[2(%include "bar.i")0( to search for the file )2(foobar.i)0(...\))]304.4 norm2
+[(If you want to define a )1(standard)0( )(include search path, similar to )2(/usr/include)0( on Unix systems, you)]287.4 norm1
+[(should place one or more )2(-i)0( directives in the )2(NASMENV)0( environment variable \(see ){/section-2.1.28 xl}(section 2.1.28){el}(\).)]276.4 norm2
+[(For Makefile compatibility with many C compilers, this option can also be specified as )2(-I)0(.)]259.4 norm3
+[{/section-2.1.17 xa}(The )2(-p)0( Option: )(Pre-Include a File)](2.1.17)240.2 subh3
+[(NASM allows you to specify files to be )1(pre-included)0( into your source file, by the use of the )2(-p)0( option. So)]223.2 norm1
+[(running)]212.2 norm2
+[2(nasm myfile.asm -p myinc.inc)]195.2 code3
+[(is equivalent to running )2(nasm myfile.asm)0( and placing the directive )2(%include "myinc.inc")0( at the)]178.2 norm1
+[(start of the file.)]167.2 norm2
+[(For consistency with the )2(-I)0(, )2(-D)0( and )2(-U)0( options, this option can also be specified as )2(-P)0(.)]150.2 norm3
+[{/section-2.1.18 xa}(The )2(-d)0( Option: )(Pre-Define a Macro)](2.1.18)131 subh3
+[(Just as the )2(-p)0( option gives an alternative to placing )2(%include)0( directives at the start of a source file, the )2(-d)]114 norm1
+[(option gives an alternative to placing a )2(%define)0( directive. You could code)]103 norm2
+(20)pageeven
+restore showpage
+%%Page: 21 21
+%%BeginPageSetup
+save
+%%EndPageSetup
+/21 pa
+[2(nasm myfile.asm -dFOO=100)]681 code3
+[(as an alternative to placing the directive)]664 norm3
+[2(%define FOO 100)]647 code3
+[(at the start of the file. You can miss off the macro value, as well: the option )2(-dFOO)0( is equivalent to coding)]630 norm1
+[2(%define FOO)0(. This form of the directive may be useful for selecting )(assembly-time options which are then)]619 norm0
+[(tested using )2(%ifdef)0(, for example )2(-dDEBUG)0(.)]608 norm2
+[(For Makefile compatibility with many C compilers, this option can also be specified as )2(-D)0(.)]591 norm3
+[{/section-2.1.19 xa}(The )2(-u)0( Option: )(Undefine a Macro)](2.1.19)571.8 subh3
+[(The )2(-u)0( option undefines a macro that would otherwise have been pre-defined, either automatically or by a)]554.8 norm1
+[2(-p)0( or )2(-d)0( option specified earlier on the command lines.)]543.8 norm2
+[(For example, the following command line:)]526.8 norm3
+[2(nasm myfile.asm -dFOO=100 -uFOO)]509.8 code3
+[(would result in )2(FOO)0( )1(not)0( being a predefined macro in the program. This is useful to override options specified)]492.8 norm1
+[(at a different point in a Makefile.)]481.8 norm2
+[(For Makefile compatibility with many C compilers, this option can also be specified as )2(-U)0(.)]464.8 norm3
+[{/section-2.1.20 xa}(The )2(-E)0( Option: Preprocess Only)](2.1.20)445.6 subh3
+[(NASM allows the )(preprocessor to be run on its own, up to a point. Using the )2(-E)0( option \(which requires no)]428.6 norm1
+[(arguments\) will cause NASM to preprocess its input file, expand all the macro references, remove all the)]417.6 norm0
+[(comments and preprocessor directives, and print the resulting file on standard output \(or save it to a file, if the)]406.6 norm0
+[2(-o)0( option is also used\).)]395.6 norm2
+[(This option cannot be applied to programs which require the preprocessor to evaluate )(expressions which)]378.6 norm1
+[(depend on the values of symbols: so code such as)]367.6 norm2
+[2(%assign tablesize \($-tablestart\))]350.6 code3
+[(will cause an error in )(preprocess-only mode.)]333.6 norm3
+[(For compatiblity with older version of NASM, this option can also be written )2(-e)0(. )2(-E)0( in older versions of)]316.6 norm1
+[(NASM was the equivalent of the current )2(-Z)0( option, ){/section-2.1.14 xl}(section 2.1.14){el}(.)]305.6 norm2
+[{/section-2.1.21 xa}(The )2(-a)0( Option: Don't Preprocess At All)](2.1.21)286.4 subh3
+[(If NASM is being used as the back end to a compiler, it might be desirable to )(suppress preprocessing)]269.4 norm1
+[(completely and assume the compiler has already done it, to save time and increase compilation speeds. The)]258.4 norm0
+[2(-a)0( option, requiring no argument, instructs NASM to replace its powerful )(preprocessor with a )(stub)]247.4 norm0
+[(preprocessor which does nothing.)]236.4 norm2
+[{/section-2.1.22 xa}(The )2(-O)0( Option: Specifying )(Multipass Optimization)](2.1.22)217.2 subh3
+[(NASM defaults to not optimizing operands which can fit into a signed byte. This means that if you want the)]200.2 norm1
+[(shortest possible object code, you have to enable optimization.)]189.2 norm2
+[(Using the )2(-O)0( option, you can tell NASM to carry out different levels of optimization. The syntax is:)]172.2 norm3
+[2(-O0)0(: No optimization. All operands take their long forms, if a short form is not specified, except)]155.2 bull1
+[(conditional jumps. This is intended to match NASM 0.98 behavior.)]144.2 bull2
+[2(-O1)0(: Minimal optimization. As above, but immediate operands which will fit in a signed byte are)]127.2 bull1
+[(optimized, unless the long form is specified. Conditional jumps default to the long form unless otherwise)]116.2 bull0
+[(specified.)]105.2 bull2
+(21)pageodd
+restore showpage
+%%Page: 22 22
+%%BeginPageSetup
+save
+%%EndPageSetup
+/22 pa
+[2(-Ox)0( \(where )2(x)0( is the actual letter )2(x)0(\): Multipass optimization. Minimize branch offsets and signed)]681 bull1
+[(immediate bytes, overriding size specification unless the )2(strict)0( keyword has been used \(see ){/section-3.7 xl}(section){el}]670 bull0
+[{/section-3.7 xl}(3.7){el}(\). For compatability with earlier releases, the letter )2(x)0( may also be any number greater than one. This)]659 bull0
+[(number has no effect on the actual number of passes.)]648 bull2
+[(The )2(-Ox)0( mode is recommended for most uses.)]631 norm3
+[(Note that this is a capital )2(O)0(, and is different from a small )2(o)0(, which is used to specify the output file name. See)]614 norm1
+[{/section-2.1.1 xl}(section 2.1.1){el}(.)]603 norm2
+[{/section-2.1.23 xa}(The )2(-t)0( Option: Enable TASM Compatibility Mode)](2.1.23)583.8 subh3
+[(NASM includes a limited form of compatibility with Borland's )2(TASM)0(. When NASM's )2(-t)0( option is used, the)]566.8 norm1
+[(following changes are made:)]555.8 norm2
+[(local labels may be prefixed with )2(@@)0( instead of )2(.)]538.8 bull3
+[(size override is supported within brackets. In TASM compatible mode, a size override inside square)]521.8 bull1
+[(brackets changes the size of the operand, and not the address type of the operand as it does in NASM)]510.8 bull0
+[(syntax. E.g. )2(mov eax,[DWORD val])0( is valid syntax in TASM compatibility mode. Note that you lose)]499.8 bull0
+[(the ability to override the default address type for the instruction.)]488.8 bull2
+[(unprefixed forms of some directives supported \()2(arg)0(, )2(elif)0(, )2(else)0(, )2(endif)0(, )2(if)0(, )2(ifdef)0(, )2(ifdifi)0(,)]471.8 bull1
+[2(ifndef)0(, )2(include)0(, )2(local)0(\))]460.8 bull2
+[{/section-2.1.24 xa}(The )2(-w)0( and )2(-W)0( Options: Enable or Disable Assembly )(Warnings)](2.1.24)441.6 subh3
+[(NASM can observe many conditions during the course of assembly which are worth mentioning to the user,)]424.6 norm1
+[(but not a sufficiently severe error to justify NASM refusing to generate an output file. These conditions are)]413.6 norm0
+[(reported like errors, but come up with the word `warning' before the message. Warnings do not prevent)]402.6 norm0
+[(NASM from generating an output file and returning a success status to the operating system.)]391.6 norm2
+[(Some conditions are even less severe than that: they are only sometimes worth mentioning to the user.)]374.6 norm1
+[(Therefore NASM supports the )2(-w)0( command-line option, which enables or disables certain classes of)]363.6 norm0
+[(assembly warning. Such warning classes are described by a name, for example )2(orphan-labels)0(; you can)]352.6 norm0
+[(enable warnings of this class by the command-line option )2(-w+orphan-labels)0( and disable it by)]341.6 norm0
+[2(-w-orphan-labels)0(.)]330.6 norm2
+[(The )(suppressible warning classes are:)]313.6 norm3
+[2(macro-params)0( covers warnings about )(multi-line macros being invoked with the wrong number of)]296.6 bull1
+[(parameters. This warning class is enabled by default; see ){/section-4.3.2 xl}(section 4.3.2){el}( for an example of why you might)]285.6 bull0
+[(want to disable it.)]274.6 bull2
+[2(macro-selfref)0( warns if a macro references itself. This warning class is disabled by default.)]257.6 bull3
+[2(macro-defaults)0( warns when a macro has more default parameters than optional parameters. This)]240.6 bull1
+[(warning class is enabled by default; see ){/section-4.3.5 xl}(section 4.3.5){el}( for why you might want to disable it.)]229.6 bull2
+[2(orphan-labels)0( covers warnings about source lines which contain no instruction but define a label)]212.6 bull1
+[(without a trailing colon. NASM warns about this somewhat obscure condition by default; see ){/section-3.1 xl}(section 3.1){el}]201.6 bull0
+[(for more information.)]190.6 bull2
+[2(number-overflow)0( covers warnings about numeric constants which don't fit in 64 bits. This warning)]173.6 bull1
+[(class is enabled by default.)]162.6 bull2
+[2(gnu-elf-extensions)0( warns if 8-bit or 16-bit relocations are used in )2(-f elf)0( format. The GNU)]145.6 bull1
+[(extensions allow this. This warning class is disabled by default.)]134.6 bull2
+[2(float-overflow)0( warns about floating point overflow. Enabled by default.)]117.6 bull3
+[2(float-denorm)0( warns about floating point denormals. Disabled by default.)]100.6 bull3
+(22)pageeven
+restore showpage
+%%Page: 23 23
+%%BeginPageSetup
+save
+%%EndPageSetup
+/23 pa
+[2(float-underflow)0( warns about floating point underflow. Disabled by default.)]681 bull3
+[2(float-toolong)0( warns about too many digits in floating-point numbers. Enabled by default.)]664 bull3
+[2(user)0( controls )2(%warning)0( directives \(see ){/section-4.9 xl}(section 4.9){el}(\). Enabled by default.)]647 bull3
+[2(error)0( causes warnings to be treated as errors. Disabled by default.)]630 bull3
+[2(all)0( is an alias for )1(all)0( suppressible warning classes \(not including )2(error)0(\). Thus, )2(-w+all)0( enables all)]613 bull1
+[(available warnings.)]602 bull2
+[(In addition, you can set warning classes across sections. Warning classes may be enabled with)]585 norm1
+[2([warning +warning-name])0(, disabled with )2([warning -warning-name])0( or reset to their original)]574 norm0
+[(value with )2([warning *warning-name])0(. No "user form" \(without the brackets\) exists.)]563 norm2
+[(Since version 2.00, NASM has also supported the gcc-like syntax )2(-Wwarning)0( and )2(-Wno-warning)]546 norm1
+[(instead of )2(-w+warning)0( and )2(-w-warning)0(, respectively.)]535 norm2
+[{/section-2.1.25 xa}(The )2(-v)0( Option: Display )(Version Info)](2.1.25)515.8 subh3
+[(Typing )2(NASM -v)0( will display the version of NASM which you are using, and the date on which it was)]498.8 norm1
+[(compiled.)]487.8 norm2
+[(You will need the version number if you report a bug.)]470.8 norm3
+[{/section-2.1.26 xa}(The )2(-y)0( Option: Display Available Debug Info Formats)](2.1.26)451.6 subh3
+[(Typing )2(nasm -f <option> -y)0( will display a list of the available debug info formats for the given output)]434.6 norm1
+[(format. The default format is indicated by an asterisk. For example:)]423.6 norm2
+[2(nasm -f elf -y)]406.6 code3
+[2(valid debug formats for 'elf32' output format are )]389.6 code1
+[2(  \('*' denotes default\): )]378.6 code0
+[2(  * stabs     ELF32 \(i386\) stabs debug format for Linux )]367.6 code0
+[2(    dwarf     elf32 \(i386\) dwarf debug format for Linux)]356.6 code2
+[{/section-2.1.27 xa}(The )2(--prefix)0( and )2(--postfix)0( Options.)](2.1.27)337.4 subh3
+[(The )2(--prefix)0( and )2(--postfix)0( options prepend or append \(respectively\) the given argument to all)]320.4 norm1
+[2(global)0( or )2(extern)0( variables. E.g. )2(--prefix _)0( will prepend the underscore to all global and external)]309.4 norm0
+[(variables, as C sometimes \(but not always\) likes it.)]298.4 norm2
+[{/section-2.1.28 xa}(The )2(NASMENV)0( )(Environment Variable)](2.1.28)279.2 subh3
+[(If you define an environment variable called )2(NASMENV)0(, the program will interpret it as a list of extra)]262.2 norm1
+[(command-line options, which are processed before the real command line. You can use this to define)]251.2 norm0
+[(standard search directories for include files, by putting )2(-i)0( options in the )2(NASMENV)0( variable.)]240.2 norm2
+[(The value of the variable is split up at white space, so that the value )2(-s -ic:\\nasmlib\\)0( will be treated as)]223.2 norm1
+[(two separate options. However, that means that the value )2(-dNAME="my name")0( won't do what you might)]212.2 norm0
+[(want, because it will be split at the space and the NASM command-line processing will get confused by the)]201.2 norm0
+[(two nonsensical words )2(-dNAME="my)0( and )2(name")0(.)]190.2 norm2
+[(To get round this, NASM provides a feature whereby, if you begin the )2(NASMENV)0( environment variable with)]173.2 norm1
+[(some character that isn't a minus sign, then NASM will treat this character as the )(separator character for)]162.2 norm0
+[(options. So setting the )2(NASMENV)0( variable to the value )2(!-s!-ic:\\nasmlib\\)0( is equivalent to setting it to)]151.2 norm0
+[2(-s -ic:\\nasmlib\\)0(, but )2(!-dNAME="my name")0( will work.)]140.2 norm2
+[(This environment variable was previously called )2(NASM)0(. This was changed with version 0.98.31.)]123.2 norm3
+(23)pageodd
+restore showpage
+%%Page: 24 24
+%%BeginPageSetup
+save
+%%EndPageSetup
+/24 pa
+[{/section-2.2 xa}(Quick Start for )(MASM Users)](2.2)676.6 head3
+[(If you're used to writing programs with MASM, or with )(TASM in MASM-compatible \(non-Ideal\) mode, or)]659.6 norm1
+[(with )2(a86)0(, this section attempts to outline the major differences between MASM's syntax and NASM's. If)]648.6 norm0
+[(you're not already used to MASM, it's probably worth skipping this section.)]637.6 norm2
+[{/section-2.2.1 xa}(NASM Is )(Case-Sensitive)](2.2.1)618.4 subh3
+[(One simple difference is that NASM is case-sensitive. It makes a difference whether you call your label )2(foo)0(,)]601.4 norm1
+[2(Foo)0( or )2(FOO)0(. If you're assembling to )2(DOS)0( or )2(OS/2)0( )2(.OBJ)0( files, you can invoke the )2(UPPERCASE)0( directive)]590.4 norm0
+[(\(documented in ){/section-7.4 xl}(section 7.4){el}(\) to ensure that all symbols exported to other code modules are forced to be upper)]579.4 norm0
+[(case; but even then, )1(within)0( a single module, NASM will distinguish between labels differing only in case.)]568.4 norm2
+[{/section-2.2.2 xa}(NASM Requires )(Square Brackets For )(Memory References)](2.2.2)549.2 subh3
+[(NASM was designed with simplicity of syntax in mind. One of the )(design goals of NASM is that it should be)]532.2 norm1
+[(possible, as far as is practical, for the user to look at a single line of NASM code and tell what opcode is)]521.2 norm0
+[(generated by it. You can't do this in MASM: if you declare, for example,)]510.2 norm2
+[2(foo     equ     1 )]493.2 code1
+[2(bar     dw      2)]482.2 code2
+[(then the two lines of code)]465.2 norm3
+[2(        mov     ax,foo )]448.2 code1
+[2(        mov     ax,bar)]437.2 code2
+[(generate completely different opcodes, despite having identical-looking syntaxes.)]420.2 norm3
+[(NASM avoids this undesirable situation by having a much simpler syntax for memory references. The rule is)]403.2 norm1
+[(simply that any access to the )1(contents)0( of a memory location requires square brackets around the address, and)]392.2 norm0
+[(any access to the )1(address)0( of a variable doesn't. So an instruction of the form )2(mov ax,foo)0( will )1(always)0( refer)]381.2 norm0
+[(to a compile-time constant, whether it's an )2(EQU)0( or the address of a variable; and to access the )1(contents)0( of the)]370.2 norm0
+[(variable )2(bar)0(, you must code )2(mov ax,[bar])0(.)]359.2 norm2
+[(This also means that NASM has no need for MASM's )2(OFFSET)0( keyword, since the MASM code)]342.2 norm1
+[2(mov ax,offset bar)0( means exactly the same thing as NASM's )2(mov ax,bar)0(. If you're trying to get)]331.2 norm0
+[(large amounts of MASM code to assemble sensibly under NASM, you can always code)]320.2 norm0
+[2(%idefine offset)0( to make the preprocessor treat the )2(OFFSET)0( keyword as a no-op.)]309.2 norm2
+[(This issue is even more confusing in )2(a86)0(, where declaring a label with a trailing colon defines it to be a)]292.2 norm1
+[(`label' as opposed to a `variable' and causes )2(a86)0( to adopt NASM-style semantics; so in )2(a86)0(, )2(mov ax,var)]281.2 norm0
+[(has different behaviour depending on whether )2(var)0( was declared as )2(var: dw 0)0( \(a label\) or )2(var dw 0)0( \(a)]270.2 norm0
+[(word-size variable\). NASM is very simple by comparison: )1(everything)0( is a label.)]259.2 norm2
+[(NASM, in the interests of simplicity, also does not support the )(hybrid syntaxes supported by MASM and its)]242.2 norm1
+[(clones, such as )2(mov ax,table[bx])0(, where a memory reference is denoted by one portion outside square)]231.2 norm0
+[(brackets and another portion inside. The correct syntax for the above is )2(mov ax,[table+bx])0(. Likewise,)]220.2 norm0
+[2(mov ax,es:[di])0( is wrong and )2(mov ax,[es:di])0( is right.)]209.2 norm2
+[{/section-2.2.3 xa}(NASM Doesn't Store )(Variable Types)](2.2.3)190 subh3
+[(NASM, by design, chooses not to remember the types of variables you declare. Whereas MASM will)]173 norm1
+[(remember, on seeing )2(var dw 0)0(, that you declared )2(var)0( as a word-size variable, and will then be able to fill)]162 norm0
+[(in the )(ambiguity in the size of the instruction )2(mov var,2)0(, NASM will deliberately remember nothing about)]151 norm0
+[(the symbol )2(var)0( except where it begins, and so you must explicitly code )2(mov word [var],2)0(.)]140 norm2
+[(For this reason, NASM doesn't support the )2(LODS)0(, )2(MOVS)0(, )2(STOS)0(, )2(SCAS)0(, )2(CMPS)0(, )2(INS)0(, or )2(OUTS)0( instructions,)]123 norm1
+[(but only supports the forms such as )2(LODSB)0(, )2(MOVSW)0(, and )2(SCASD)0(, which explicitly specify the size of the)]112 norm0
+[(components of the strings being manipulated.)]101 norm2
+(24)pageeven
+restore showpage
+%%Page: 25 25
+%%BeginPageSetup
+save
+%%EndPageSetup
+/25 pa
+[{/section-2.2.4 xa}(NASM Doesn't )2(ASSUME)](2.2.4)678.8 subh3
+[(As part of NASM's drive for simplicity, it also does not support the )2(ASSUME)0( directive. NASM will not keep)]661.8 norm1
+[(track of what values you choose to put in your segment registers, and will never )1(automatically)0( generate a)]650.8 norm0
+[(segment override prefix.)]639.8 norm2
+[{/section-2.2.5 xa}(NASM Doesn't Support )(Memory Models)](2.2.5)620.6 subh3
+[(NASM also does not have any directives to support different 16-bit memory models. The programmer has to)]603.6 norm1
+[(keep track of which functions are supposed to be called with a )(far call and which with a )(near call, and is)]592.6 norm0
+[(responsible for putting the correct form of )2(RET)0( instruction \()2(RETN)0( or )2(RETF)0(; NASM accepts )2(RET)0( itself as an)]581.6 norm0
+[(alternate form for )2(RETN)0(\); in addition, the programmer is responsible for coding CALL FAR instructions)]570.6 norm0
+[(where necessary when calling )1(external)0( functions, and must also keep track of which external variable)]559.6 norm0
+[(definitions are far and which are near.)]548.6 norm2
+[{/section-2.2.6 xa}(Floating-Point Differences)](2.2.6)529.4 subh3
+[(NASM uses different names to refer to floating-point registers from MASM: where MASM would call them)]512.4 norm1
+[2(ST\(0\))0(, )2(ST\(1\))0( and so on, and )2(a86)0( would call them simply )2(0)0(, )2(1)0( and so on, NASM chooses to call them)]501.4 norm0
+[2(st0)0(, )2(st1)0( etc.)]490.4 norm2
+[(As of version 0.96, NASM now treats the instructions with )(`nowait' forms in the same way as)]473.4 norm1
+[(MASM-compatible assemblers. The idiosyncratic treatment employed by 0.95 and earlier was based on a)]462.4 norm0
+[(misunderstanding by the authors.)]451.4 norm2
+[{/section-2.2.7 xa}(Other Differences)](2.2.7)432.2 subh3
+[(For historical reasons, NASM uses the keyword )2(TWORD)0( where MASM and compatible assemblers use)]415.2 norm1
+[2(TBYTE)0(.)]404.2 norm2
+[(NASM does not declare )(uninitialized storage in the same way as MASM: where a MASM programmer might)]387.2 norm1
+[(use )2(stack db 64 dup \(?\))0(, NASM requires )2(stack resb 64)0(, intended to be read as `reserve 64)]376.2 norm0
+[(bytes'. For a limited amount of compatibility, since NASM treats )2(?)0( as a valid character in symbol names, you)]365.2 norm0
+[(can code )2(? equ 0)0( and then writing )2(dw ?)0( will at least do something vaguely useful. )2(DUP)0( is still not a)]354.2 norm0
+[(supported syntax, however.)]343.2 norm2
+[(In addition to all of this, macros and directives work completely differently to MASM. See ){/chapter-4 xl}(chapter 4){el}( and)]326.2 norm1
+[{/chapter-6 xl}(chapter 6){el}( for further details.)]315.2 norm2
+(25)pageodd
+restore showpage
+%%Page: 26 26
+%%BeginPageSetup
+save
+%%EndPageSetup
+/26 pa
+[{/chapter-3 xa}(Chapter 3: The NASM Language)]642.8 chap3
+[{/section-3.1 xa}(Layout of a NASM Source Line)](3.1)603.4 head3
+[(Like most assemblers, each NASM source line contains \(unless it is a macro, a preprocessor directive or an)]586.4 norm1
+[(assembler directive: see ){/chapter-4 xl}(chapter 4){el}( and ){/chapter-6 xl}(chapter 6){el}(\) some combination of the four fields)]575.4 norm2
+[2(label:    instruction operands        ; comment)]558.4 code3
+[(As usual, most of these fields are optional; the presence or absence of any combination of a label, an)]541.4 norm1
+[(instruction and a comment is allowed. Of course, the operand field is either required or forbidden by the)]530.4 norm0
+[(presence and nature of the instruction field.)]519.4 norm2
+[(NASM uses backslash \(\\\) as the line continuation character; if a line ends with backslash, the next line is)]502.4 norm1
+[(considered to be a part of the backslash-ended line.)]491.4 norm2
+[(NASM places no restrictions on white space within a line: labels may have white space before them, or)]474.4 norm1
+[(instructions may have no space before them, or anything. The )(colon after a label is also optional. \(Note that)]463.4 norm0
+[(this means that if you intend to code )2(lodsb)0( alone on a line, and type )2(lodab)0( by accident, then that's still a)]452.4 norm0
+[(valid source line which does nothing but define a label. Running NASM with the command-line option)]441.4 norm0
+[2(-w+orphan-labels)0( will cause it to warn you if you define a label alone on a line without a )(trailing colon.\))]430.4 norm2
+[(Valid characters in labels are letters, numbers, )2(_)0(, )2($)0(, )2(#)0(, )2(@)0(, )2(~)0(, )2(.)0(, and )2(?)0(. The only characters which may be used)]413.4 norm1
+[(as the )1(first)0( character of an identifier are letters, )2(.)0( \(with special meaning: see ){/section-3.9 xl}(section 3.9){el}(\), )2(_)0( and )2(?)0(. An)]402.4 norm0
+[(identifier may also be prefixed with a )2($)0( to indicate that it is intended to be read as an identifier and not a)]391.4 norm0
+[(reserved word; thus, if some other module you are linking with defines a symbol called )2(eax)0(, you can refer to)]380.4 norm0
+[2($eax)0( in NASM code to distinguish the symbol from the register. Maximum length of an identifier is 4095)]369.4 norm0
+[(characters.)]358.4 norm2
+[(The instruction field may contain any machine instruction: Pentium and P6 instructions, FPU instructions,)]341.4 norm1
+[(MMX instructions and even undocumented instructions are all supported. The instruction may be prefixed by)]330.4 norm0
+[2(LOCK)0(, )2(REP)0(, )2(REPE)0(/)2(REPZ)0( or )2(REPNE)0(/)2(REPNZ)0(, in the usual way. Explicit )(address-size and )(operand-size)]319.4 norm0
+[(prefixes )2(A16)0(, )2(A32)0(, )2(A64)0(, )2(O16)0( and )2(O32)0(, )2(O64)0( are provided \226 one example of their use is given in ){/chapter-10 xl}(chapter 10){el}(.)]308.4 norm0
+[(You can also use the name of a )(segment register as an instruction prefix: coding )2(es mov [bx],ax)0( is)]297.4 norm0
+[(equivalent to coding )2(mov [es:bx],ax)0(. We recommend the latter syntax, since it is consistent with other)]286.4 norm0
+[(syntactic features of the language, but for instructions such as )2(LODSB)0(, which has no operands and yet can)]275.4 norm0
+[(require a segment override, there is no clean syntactic way to proceed apart from )2(es lodsb)0(.)]264.4 norm2
+[(An instruction is not required to use a prefix: prefixes such as )2(CS)0(, )2(A32)0(, )2(LOCK)0( or )2(REPE)0( can appear on a line)]247.4 norm1
+[(by themselves, and NASM will just generate the prefix bytes.)]236.4 norm2
+[(In addition to actual machine instructions, NASM also supports a number of pseudo-instructions, described in)]219.4 norm1
+[{/section-3.2 xl}(section 3.2){el}(.)]208.4 norm2
+[(Instruction )(operands may take a number of forms: they can be registers, described simply by the register name)]191.4 norm1
+[(\(e.g. )2(ax)0(, )2(bp)0(, )2(ebx)0(, )2(cr0)0(: NASM does not use the )2(gas)0(\226style syntax in which register names must be prefixed)]180.4 norm0
+[(by a )2(%)0( sign\), or they can be )(effective addresses \(see ){/section-3.3 xl}(section 3.3){el}(\), constants \(){/section-3.4 xl}(section 3.4){el}(\) or expressions)]169.4 norm0
+[(\(){/section-3.5 xl}(section 3.5){el}(\).)]158.4 norm2
+[(For x87 )(floating-point instructions, NASM accepts a wide range of syntaxes: you can use two-operand forms)]141.4 norm1
+[(like MASM supports, or you can use NASM's native single-operand forms in most cases. For example, you)]130.4 norm0
+[(can code:)]119.4 norm2
+(26)pageeven
+restore showpage
+%%Page: 27 27
+%%BeginPageSetup
+save
+%%EndPageSetup
+/27 pa
+[2(        fadd    st1             ; this sets st0 := st0 + st1 )]681 code1
+[2(        fadd    st0,st1         ; so does this )]670 code0
+[2()]659 code0
+[2(        fadd    st1,st0         ; this sets st1 := st1 + st0 )]648 code0
+[2(        fadd    to st1          ; so does this)]637 code2
+[(Almost any x87 floating-point instruction that references memory must use one of the prefixes )2(DWORD)0(,)]620 norm1
+[2(QWORD)0( or )2(TWORD)0( to indicate what size of )(memory operand it refers to.)]609 norm2
+[{/section-3.2 xa}(Pseudo-Instructions)](3.2)587.6 head3
+[(Pseudo-instructions are things which, though not real x86 machine instructions, are used in the instruction)]570.6 norm1
+[(field anyway because that's the most convenient place to put them. The current pseudo-instructions are )2(DB)0(,)]559.6 norm0
+[2(DW)0(, )2(DD)0(, )2(DQ)0(, )2(DT)0(, )2(DO)0( and )2(DY)0(; their )(uninitialized counterparts )2(RESB)0(, )2(RESW)0(, )2(RESD)0(, )2(RESQ)0(, )2(REST)0(, )2(RESO)0( and)]548.6 norm0
+[2(RESY)0(; the )2(INCBIN)0( command, the )2(EQU)0( command, and the )2(TIMES)0( prefix.)]537.6 norm2
+[{/section-3.2.1 xa}2(DB)0( and Friends: Declaring Initialized Data)](3.2.1)518.4 subh3
+[2(DB)0(, )2(DW)0(, )2(DD)0(, )2(DQ)0(, )2(DT)0(, )2(DO)0( and )2(DY)0( are used, much as in MASM, to declare initialized data in the output file.)]501.4 norm1
+[(They can be invoked in a wide range of ways: )]490.4 norm2
+[2(      db    0x55                ; just the byte 0x55 )]473.4 code1
+[2(      db    0x55,0x56,0x57      ; three bytes in succession )]462.4 code0
+[2(      db    'a',0x55            ; character constants are OK )]451.4 code0
+[2(      db    'hello',13,10,'$'   ; so are string constants )]440.4 code0
+[2(      dw    0x1234              ; 0x34 0x12 )]429.4 code0
+[2(      dw    'a'                 ; 0x61 0x00 \(it's just a number\) )]418.4 code0
+[2(      dw    'ab'                ; 0x61 0x62 \(character constant\) )]407.4 code0
+[2(      dw    'abc'               ; 0x61 0x62 0x63 0x00 \(string\) )]396.4 code0
+[2(      dd    0x12345678          ; 0x78 0x56 0x34 0x12 )]385.4 code0
+[2(      dd    1.234567e20         ; floating-point constant )]374.4 code0
+[2(      dq    0x123456789abcdef0  ; eight byte constant )]363.4 code0
+[2(      dq    1.234567e20         ; double-precision float )]352.4 code0
+[2(      dt    1.234567e20         ; extended-precision float)]341.4 code2
+[2(DT)0(, )2(DO)0( and )2(DY)0( do not accept )(numeric constants as operands.)]324.4 norm3
+[{/section-3.2.2 xa}2(RESB)0( and Friends: Declaring )(Uninitialized Data)](3.2.2)305.2 subh3
+[2(RESB)0(, )2(RESW)0(, )2(RESD)0(, )2(RESQ)0(, )2(REST)0(, )2(RESO)0( and )2(RESY)0( are designed to be used in the BSS section of a module:)]288.2 norm1
+[(they declare )1(uninitialized)0( storage space. Each takes a single operand, which is the number of bytes, words,)]277.2 norm0
+[(doublewords or whatever to reserve. As stated in ){/section-2.2.7 xl}(section 2.2.7){el}(, NASM does not support the MASM/TASM)]266.2 norm0
+[(syntax of reserving uninitialized space by writing )2(DW ?)0( or similar things: this is what it does instead. The)]255.2 norm0
+[(operand to a )2(RESB)0(\226type pseudo-instruction is a )1(critical expression)0(: see ){/section-3.8 xl}(section 3.8){el}(.)]244.2 norm2
+[(For example:)]227.2 norm3
+[2(buffer:         resb    64              ; reserve 64 bytes )]210.2 code1
+[2(wordvar:        resw    1               ; reserve a word )]199.2 code0
+[2(realarray       resq    10              ; array of ten reals )]188.2 code0
+[2(ymmval:         resy    1               ; one YMM register)]177.2 code2
+[{/section-3.2.3 xa}2(INCBIN)0(: Including External )(Binary Files)](3.2.3)158 subh3
+[2(INCBIN)0( is borrowed from the old Amiga assembler )(DevPac: it includes a binary file verbatim into the output)]141 norm1
+[(file. This can be handy for \(for example\) including )(graphics and )(sound data directly into a game executable)]130 norm0
+[(file. It can be called in one of these three ways:)]119 norm2
+(27)pageodd
+restore showpage
+%%Page: 28 28
+%%BeginPageSetup
+save
+%%EndPageSetup
+/28 pa
+[2(    incbin  "file.dat"             ; include the whole file )]681 code1
+[2(    incbin  "file.dat",1024        ; skip the first 1024 bytes )]670 code0
+[2(    incbin  "file.dat",1024,512    ; skip the first 1024, and )]659 code0
+[2(                                   ; actually include at most 512)]648 code2
+[2(INCBIN)0( is both a directive and a standard macro; the standard macro version searches for the file in the)]631 norm1
+[(include file search path and adds the file to the dependency lists. This macro can be overridden if desired.)]620 norm2
+[{/section-3.2.4 xa}2(EQU)0(: Defining Constants)](3.2.4)600.8 subh3
+[2(EQU)0( defines a symbol to a given constant value: when )2(EQU)0( is used, the source line must contain a label. The)]583.8 norm1
+[(action of )2(EQU)0( is to define the given label name to the value of its \(only\) operand. This definition is absolute,)]572.8 norm0
+[(and cannot change later. So, for example,)]561.8 norm2
+[2(message         db      'hello, world' )]544.8 code1
+[2(msglen          equ     $-message)]533.8 code2
+[(defines )2(msglen)0( to be the constant 12. )2(msglen)0( may not then be redefined later. This is not a )(preprocessor)]516.8 norm1
+[(definition either: the value of )2(msglen)0( is evaluated )1(once)0(, using the value of )2($)0( \(see ){/section-3.5 xl}(section 3.5){el}( for an)]505.8 norm0
+[(explanation of )2($)0(\) at the point of definition, rather than being evaluated wherever it is referenced and using the)]494.8 norm0
+[(value of )2($)0( at the point of reference.)]483.8 norm2
+[{/section-3.2.5 xa}2(TIMES)0(: )(Repeating Instructions or Data)](3.2.5)464.6 subh3
+[(The )2(TIMES)0( prefix causes the instruction to be assembled multiple times. This is partly present as NASM's)]447.6 norm1
+[(equivalent of the )2(DUP)0( syntax supported by )(MASM\226compatible assemblers, in that you can code)]436.6 norm2
+[2(zerobuf:        times 64 db 0)]419.6 code3
+[(or similar things; but )2(TIMES)0( is more versatile than that. The argument to )2(TIMES)0( is not just a numeric)]402.6 norm1
+[(constant, but a numeric )1(expression)0(, so you can do things like)]391.6 norm2
+[2(buffer: db      'hello, world' )]374.6 code1
+[2(        times 64-$+buffer db ' ')]363.6 code2
+[(which will store exactly enough spaces to make the total length of )2(buffer)0( up to 64. Finally, )2(TIMES)0( can be)]346.6 norm1
+[(applied to ordinary instructions, so you can code trivial )(unrolled loops in it:)]335.6 norm2
+[2(        times 100 movsb)]318.6 code3
+[(Note that there is no effective difference between )2(times 100 resb 1)0( and )2(resb 100)0(, except that the)]301.6 norm1
+[(latter will be assembled about 100 times faster due to the internal structure of the assembler.)]290.6 norm2
+[(The operand to )2(TIMES)0( is a critical expression \(){/section-3.8 xl}(section 3.8){el}(\).)]273.6 norm3
+[(Note also that )2(TIMES)0( can't be applied to )(macros: the reason for this is that )2(TIMES)0( is processed after the)]256.6 norm1
+[(macro phase, which allows the argument to )2(TIMES)0( to contain expressions such as )2(64-$+buffer)0( as above.)]245.6 norm0
+[(To repeat more than one line of code, or a complex macro, use the preprocessor )2(%rep)0( directive.)]234.6 norm2
+[{/section-3.3 xa}(Effective Addresses)](3.3)213.2 head3
+[(An )(effective address is any operand to an instruction which )(references memory. Effective addresses, in)]196.2 norm1
+[(NASM, have a very simple syntax: they consist of an expression evaluating to the desired address, enclosed in)]185.2 norm0
+[(square brackets. For example:)]174.2 norm2
+[2(wordvar dw      123 )]157.2 code1
+[2(        mov     ax,[wordvar] )]146.2 code0
+[2(        mov     ax,[wordvar+1] )]135.2 code0
+[2(        mov     ax,[es:wordvar+bx])]124.2 code2
+(28)pageeven
+restore showpage
+%%Page: 29 29
+%%BeginPageSetup
+save
+%%EndPageSetup
+/29 pa
+[(Anything not conforming to this simple system is not a valid memory reference in NASM, for example)]681 norm1
+[2(es:wordvar[bx])0(.)]670 norm2
+[(More complicated effective addresses, such as those involving more than one register, work in exactly the)]653 norm1
+[(same way:)]642 norm2
+[2(        mov     eax,[ebx*2+ecx+offset] )]625 code1
+[2(        mov     ax,[bp+di+8])]614 code2
+[(NASM is capable of doing )(algebra on these effective addresses, so that things which don't necessarily )1(look)]597 norm1
+[(legal are perfectly all right:)]586 norm2
+[2(    mov     eax,[ebx*5]             ; assembles as [ebx*4+ebx] )]569 code1
+[2(    mov     eax,[label1*2-label2]   ; ie [label1+\(label1-label2\)])]558 code2
+[(Some forms of effective address have more than one assembled form; in most such cases NASM will generate)]541 norm1
+[(the smallest form it can. For example, there are distinct assembled forms for the 32-bit effective addresses)]530 norm0
+[2([eax*2+0])0( and )2([eax+eax])0(, and NASM will generally generate the latter on the grounds that the former)]519 norm0
+[(requires four bytes to store a zero offset.)]508 norm2
+[(NASM has a hinting mechanism which will cause )2([eax+ebx])0( and )2([ebx+eax])0( to generate different)]491 norm1
+[(opcodes; this is occasionally useful because )2([esi+ebp])0( and )2([ebp+esi])0( have different default segment)]480 norm0
+[(registers.)]469 norm2
+[(However, you can force NASM to generate an effective address in a particular form by the use of the)]452 norm1
+[(keywords )2(BYTE)0(, )2(WORD)0(, )2(DWORD)0( and )2(NOSPLIT)0(. If you need )2([eax+3])0( to be assembled using a double-word)]441 norm0
+[(offset field instead of the one byte NASM will normally generate, you can code )2([dword eax+3])0(.)]430 norm0
+[(Similarly, you can force NASM to use a byte offset for a small value which it hasn't seen on the first pass \(see)]419 norm0
+[{/section-3.8 xl}(section 3.8){el}( for an example of such a code fragment\) by using )2([byte eax+offset])0(. As special cases,)]408 norm0
+[2([byte eax])0( will code )2([eax+0])0( with a byte offset of zero, and )2([dword eax])0( will code it with a)]397 norm0
+[(double-word offset of zero. The normal form, )2([eax])0(, will be coded with no offset field.)]386 norm2
+[(The form described in the previous paragraph is also useful if you are trying to access data in a 32-bit)]369 norm1
+[(segment from within 16 bit code. For more information on this see the section on mixed-size addressing)]358 norm0
+[(\(){/section-10.2 xl}(section 10.2){el}(\). In particular, if you need to access data with a known offset that is larger than will fit in a)]347 norm0
+[(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)]336 norm0
+[(lost.)]325 norm2
+[(Similarly, NASM will split )2([eax*2])0( into )2([eax+eax])0( because that allows the offset field to be absent and)]308 norm1
+[(space to be saved; in fact, it will also split )2([eax*2+offset])0( into )2([eax+eax+offset])0(. You can combat)]297 norm0
+[(this behaviour by the use of the )2(NOSPLIT)0( keyword: )2([nosplit eax*2])0( will force )2([eax*2+0])0( to be)]286 norm0
+[(generated literally.)]275 norm2
+[(In 64-bit mode, NASM will by default generate absolute addresses. The )2(REL)0( keyword makes it produce)]258 norm1
+[2(RIP)0(\226relative addresses. Since this is frequently the normally desired behaviour, see the )2(DEFAULT)0( directive)]247 norm0
+[(\(){/section-6.2 xl}(section 6.2){el}(\). The keyword )2(ABS)0( overrides )2(REL)0(.)]236 norm2
+[{/section-3.4 xa}(Constants)](3.4)214.6 head3
+[(NASM understands four different types of constant: numeric, character, string and floating-point.)]197.6 norm3
+[{/section-3.4.1 xa}(Numeric Constants)](3.4.1)178.4 subh3
+[(A numeric constant is simply a number. NASM allows you to specify numbers in a variety of number bases,)]161.4 norm1
+[(in a variety of ways: you can suffix )2(H)0( or )2(X)0(, )2(Q)0( or )2(O)0(, and )2(B)0( for )(hexadecimal, )(octal and )(binary respectively, or)]150.4 norm0
+[(you can prefix )2(0x)0( for hexadecimal in the style of C, or you can prefix )2($)0( for hexadecimal in the style of)]139.4 norm0
+[(Borland Pascal. Note, though, that the )2($)0( prefix does double duty as a prefix on identifiers \(see ){/section-3.1 xl}(section 3.1){el}(\), so)]128.4 norm0
+[(a hex number prefixed with a )2($)0( sign must have a digit after the )2($)0( rather than a letter. In addition, current)]117.4 norm0
+(29)pageodd
+restore showpage
+%%Page: 30 30
+%%BeginPageSetup
+save
+%%EndPageSetup
+/30 pa
+[(versions of NASM accept the prefix )2(0h)0( for hexadecimal, )2(0o)0( or )2(0q)0( for octal, and )2(0b)0( for binary. Please note)]681 norm0
+[(that unlike C, a )2(0)0( prefix by itself does )1(not)0( imply an octal constant!)]670 norm2
+[(Numeric constants can have underscores \()2(_)0(\) interspersed to break up long strings.)]653 norm3
+[(Some examples \(all producing exactly the same code\):)]636 norm3
+[2(        mov     ax,200          ; decimal )]619 code1
+[2(        mov     ax,0200         ; still decimal )]608 code0
+[2(        mov     ax,0200d        ; explicitly decimal )]597 code0
+[2(        mov     ax,0d200        ; also decimal )]586 code0
+[2(        mov     ax,0c8h         ; hex )]575 code0
+[2(        mov     ax,$0c8         ; hex again: the 0 is required )]564 code0
+[2(        mov     ax,0xc8         ; hex yet again )]553 code0
+[2(        mov     ax,0hc8         ; still hex )]542 code0
+[2(        mov     ax,310q         ; octal )]531 code0
+[2(        mov     ax,310o         ; octal again )]520 code0
+[2(        mov     ax,0o310        ; octal yet again )]509 code0
+[2(        mov     ax,0q310        ; hex yet again )]498 code0
+[2(        mov     ax,11001000b    ; binary )]487 code0
+[2(        mov     ax,1100_1000b   ; same binary constant )]476 code0
+[2(        mov     ax,0b1100_1000  ; same binary constant yet again)]465 code2
+[{/section-3.4.2 xa}(Character Strings)](3.4.2)445.8 subh3
+[(A character string consists of up to eight characters enclosed in either single quotes \()2('...')0(\), double quotes)]428.8 norm1
+[(\()2("...")0(\) or backquotes \()2(`...`)0(\). Single or double quotes are equivalent to NASM \(except of course that)]417.8 norm0
+[(surrounding the constant with single quotes allows double quotes to appear within it and vice versa\); the)]406.8 norm0
+[(contents of those are represented verbatim. Strings enclosed in backquotes support C-style )2(\\)0(\226escapes for)]395.8 norm0
+[(special characters.)]384.8 norm2
+[(The following )(escape sequences are recognized by backquoted strings:)]367.8 norm3
+[2(      \\'          single quote \('\) )]350.8 code1
+[2(      \\"          double quote \("\) )]339.8 code0
+[2(      \\`          backquote \(`\) )]328.8 code0
+[2(      \\\\          backslash \(\\\) )]317.8 code0
+[2(      \\?          question mark \(?\) )]306.8 code0
+[2(      \\a          BEL \(ASCII 7\) )]295.8 code0
+[2(      \\b          BS  \(ASCII 8\) )]284.8 code0
+[2(      \\t          TAB \(ASCII 9\) )]273.8 code0
+[2(      \\n          LF  \(ASCII 10\) )]262.8 code0
+[2(      \\v          VT  \(ASCII 11\) )]251.8 code0
+[2(      \\f          FF  \(ASCII 12\) )]240.8 code0
+[2(      \\r          CR  \(ASCII 13\) )]229.8 code0
+[2(      \\e          ESC \(ASCII 27\) )]218.8 code0
+[2(      \\377        Up to 3 octal digits - literal byte )]207.8 code0
+[2(      \\xFF        Up to 2 hexadecimal digits - literal byte )]196.8 code0
+[2(      \\u1234      4 hexadecimal digits - Unicode character )]185.8 code0
+[2(      \\U12345678  8 hexadecimal digits - Unicode character)]174.8 code2
+[(All other escape sequences are reserved. Note that )2(\\0)0(, meaning a )2(NUL)0( character \(ASCII 0\), is a special case)]157.8 norm1
+[(of the octal escape sequence.)]146.8 norm2
+[(Unicode characters specified with )2(\\u)0( or )2(\\U)0( are converted to )(UTF-8. For example, the following lines are all)]129.8 norm1
+[(equivalent:)]118.8 norm2
+(30)pageeven
+restore showpage
+%%Page: 31 31
+%%BeginPageSetup
+save
+%%EndPageSetup
+/31 pa
+[2(      db `\\u263a`            ; UTF-8 smiley face )]681 code1
+[2(      db `\\xe2\\x98\\xba`      ; UTF-8 smiley face )]670 code0
+[2(      db 0E2h, 098h, 0BAh    ; UTF-8 smiley face)]659 code2
+[{/section-3.4.3 xa}(Character Constants)](3.4.3)639.8 subh3
+[(A character constant consists of a string up to eight bytes long, used in an expression context. It is treated as if)]622.8 norm1
+[(it was an integer.)]611.8 norm2
+[(A character constant with more than one byte will be arranged with )(little-endian order in mind: if you code)]594.8 norm3
+[2(          mov eax,'abcd')]577.8 code3
+[(then the constant generated is not )2(0x61626364)0(, but )2(0x64636261)0(, so that if you were then to store the)]560.8 norm1
+[(value into memory, it would read )2(abcd)0( rather than )2(dcba)0(. This is also the sense of character constants)]549.8 norm0
+[(understood by the Pentium's )2(CPUID)0( instruction.)]538.8 norm2
+[{/section-3.4.4 xa}(String Constants)](3.4.4)519.6 subh3
+[(String constants are character strings used in the context of some pseudo-instructions, namely the )2(DB)0( family)]502.6 norm1
+[(and )2(INCBIN)0( \(where it represents a filename.\) They are also used in certain preprocessor directives.)]491.6 norm2
+[(A string constant looks like a character constant, only longer. It is treated as a concatenation of)]474.6 norm1
+[(maximum-size character constants for the conditions. So the following are equivalent:)]463.6 norm2
+[2(      db    'hello'               ; string constant )]446.6 code1
+[2(      db    'h','e','l','l','o'   ; equivalent character constants)]435.6 code2
+[(And the following are also equivalent:)]418.6 norm3
+[2(      dd    'ninechars'           ; doubleword string constant )]401.6 code1
+[2(      dd    'nine','char','s'     ; becomes three doublewords )]390.6 code0
+[2(      db    'ninechars',0,0,0     ; and really looks like this)]379.6 code2
+[(Note that when used in a string-supporting context, quoted strings are treated as a string constants even if)]362.6 norm1
+[(they are short enough to be a character constant, because otherwise )2(db 'ab')0( would have the same effect as)]351.6 norm0
+[2(db 'a')0(, which would be silly. Similarly, three-character or four-character constants are treated as strings)]340.6 norm0
+[(when they are operands to )2(DW)0(, and so forth.)]329.6 norm2
+[{/section-3.4.5 xa}(Unicode Strings)](3.4.5)310.4 subh3
+[(The special operators )2(__utf16__)0( and )2(__utf32__)0( allows definition of Unicode strings. They take a string)]293.4 norm1
+[(in UTF-8 format and converts it to \(littleendian\) UTF-16 or UTF-32, respectively.)]282.4 norm2
+[(For example:)]265.4 norm3
+[2(%define u\(x\) __utf16__\(x\) )]248.4 code1
+[2(%define w\(x\) __utf32__\(x\) )]237.4 code0
+[2()]226.4 code0
+[2(      dw u\('C:\\WINDOWS'\), 0       ; Pathname in UTF-16 )]215.4 code0
+[2(      dd w\(`A + B = \\u206a`\), 0   ; String in UTF-32)]204.4 code2
+[2(__utf16__)0( and )2(__utf32__)0( can be applied either to strings passed to the )2(DB)0( family instructions, or to)]187.4 norm1
+[(character constants in an expression context.)]176.4 norm2
+[{/section-3.4.6 xa}(Floating-Point Constants)](3.4.6)157.2 subh3
+[(Floating-point constants are acceptable only as arguments to )2(DB)0(, )2(DW)0(, )2(DD)0(, )2(DQ)0(, )2(DT)0(, and )2(DO)0(, or as arguments to)]140.2 norm1
+[(the special operators )2(__float8__)0(, )2(__float16__)0(, )2(__float32__)0(, )2(__float64__)0(, )2(__float80m__)0(,)]129.2 norm0
+[2(__float80e__)0(, )2(__float128l__)0(, and )2(__float128h__)0(.)]118.2 norm2
+(31)pageodd
+restore showpage
+%%Page: 32 32
+%%BeginPageSetup
+save
+%%EndPageSetup
+/32 pa
+[(Floating-point constants are expressed in the traditional form: digits, then a period, then optionally more)]681 norm1
+[(digits, then optionally an )2(E)0( followed by an exponent. The period is mandatory, so that NASM can distinguish)]670 norm0
+[(between )2(dd 1)0(, which declares an integer constant, and )2(dd 1.0)0( which declares a floating-point constant.)]659 norm0
+[(NASM also support C99-style hexadecimal floating-point: )2(0x)0(, hexadecimal digits, period, optionally more)]648 norm0
+[(hexadeximal digits, then optionally a )2(P)0( followed by a )1(binary)0( \(not hexadecimal\) exponent in decimal notation.)]637 norm2
+[(Underscores to break up groups of digits are permitted in floating-point constants as well.)]620 norm3
+[(Some examples:)]603 norm3
+[2(      db    -0.2                    ; "Quarter precision" )]586 code1
+[2(      dw    -0.5                    ; IEEE 754r/SSE5 half precision )]575 code0
+[2(      dd    1.2                     ; an easy one )]564 code0
+[2(      dd    1.222_222_222           ; underscores are permitted )]553 code0
+[2(      dd    0x1p+2                  ; 1.0x2^2 = 4.0 )]542 code0
+[2(      dq    0x1p+32                 ; 1.0x2^32 = 4 294 967 296.0 )]531 code0
+[2(      dq    1.e10                   ; 10 000 000 000.0 )]520 code0
+[2(      dq    1.e+10                  ; synonymous with 1.e10 )]509 code0
+[2(      dq    1.e-10                  ; 0.000 000 000 1 )]498 code0
+[2(      dt    3.141592653589793238462 ; pi )]487 code0
+[2(      do    1.e+4000                ; IEEE 754r quad precision)]476 code2
+[(The 8-bit "quarter-precision" floating-point format is sign:exponent:mantissa = 1:4:3 with an exponent bias)]459 norm1
+[(of 7. This appears to be the most frequently used 8-bit floating-point format, although it is not covered by)]448 norm0
+[(any formal standard. This is sometimes called a ")(minifloat.")]437 norm2
+[(The special operators are used to produce floating-point numbers in other contexts. They produce the binary)]420 norm1
+[(representation of a specific floating-point number as an integer, and can use anywhere integer constants are)]409 norm0
+[(used in an expression. )2(__float80m__)0( and )2(__float80e__)0( produce the 64-bit mantissa and 16-bit)]398 norm0
+[(exponent of an 80-bit floating-point number, and )2(__float128l__)0( and )2(__float128h__)0( produce the)]387 norm0
+[(lower and upper 64-bit halves of a 128-bit floating-point number, respectively.)]376 norm2
+[(For example:)]359 norm3
+[2(      mov    rax,__float64__\(3.141592653589793238462\))]342 code3
+[(... would assign the binary representation of pi as a 64-bit floating point number into )2(RAX)0(. This is exactly)]325 norm1
+[(equivalent to:)]314 norm2
+[2(      mov    rax,0x400921fb54442d18)]297 code3
+[(NASM cannot do compile-time arithmetic on floating-point constants. This is because NASM is designed to)]280 norm1
+[(be portable \226 although it always generates code to run on x86 processors, the assembler itself can run on any)]269 norm0
+[(system with an ANSI C compiler. Therefore, the assembler cannot guarantee the presence of a floating-point)]258 norm0
+[(unit capable of handling the )(Intel number formats, and so for NASM to be able to do floating arithmetic it)]247 norm0
+[(would have to include its own complete set of floating-point routines, which would significantly increase the)]236 norm0
+[(size of the assembler for very little benefit.)]225 norm2
+[(The special tokens )2(__Infinity__)0(, )2(__QNaN__)0( \(or )2(__NaN__)0(\) and )2(__SNaN__)0( can be used to generate)]208 norm1
+[(infinities, quiet )(NaNs, and signalling NaNs, respectively. These are normally used as macros:)]197 norm2
+[2(%define Inf __Infinity__ )]180 code1
+[2(%define NaN __QNaN__ )]169 code0
+[2()]158 code0
+[2(      dq    +1.5, -Inf, NaN         ; Double-precision constants)]147 code2
+(32)pageeven
+restore showpage
+%%Page: 33 33
+%%BeginPageSetup
+save
+%%EndPageSetup
+/33 pa
+[{/section-3.4.7 xa}(Packed BCD Constants)](3.4.7)678.8 subh3
+[(x87-style packed BCD constants can be used in the same contexts as 80-bit floating-point numbers. They)]661.8 norm1
+[(are suffixed with )2(p)0( or prefixed with )2(0p)0(, and can include up to 18 decimal digits.)]650.8 norm2
+[(As with other numeric constants, underscores can be used to separate digits.)]633.8 norm3
+[(For example:)]616.8 norm3
+[2(      dt 12_345_678_901_245_678p )]599.8 code1
+[2(      dt -12_345_678_901_245_678p )]588.8 code0
+[2(      dt +0p33 )]577.8 code0
+[2(      dt 33p)]566.8 code2
+[{/section-3.5 xa}(Expressions)](3.5)545.4 head3
+[(Expressions in NASM are similar in syntax to those in C. Expressions are evaluated as 64-bit integers which)]528.4 norm1
+[(are then adjusted to the appropriate size.)]517.4 norm2
+[(NASM supports two special tokens in expressions, allowing calculations to involve the current assembly)]500.4 norm1
+[(position: the )2($)0( and )2($$)0( tokens. )2($)0( evaluates to the assembly position at the beginning of the line containing the)]489.4 norm0
+[(expression; so you can code an )(infinite loop using )2(JMP $)0(. )2($$)0( evaluates to the beginning of the current)]478.4 norm0
+[(section; so you can tell how far into the section you are by using )2(\($-$$\))0(.)]467.4 norm2
+[(The arithmetic )(operators provided by NASM are listed here, in increasing order of )(precedence.)]450.4 norm3
+[{/section-3.5.1 xa}2(|)0(: )(Bitwise OR Operator)](3.5.1)431.2 subh3
+[(The )2(|)0( operator gives a bitwise OR, exactly as performed by the )2(OR)0( machine instruction. Bitwise OR is the)]414.2 norm1
+[(lowest-priority arithmetic operator supported by NASM.)]403.2 norm2
+[{/section-3.5.2 xa}2(^)0(: )(Bitwise XOR Operator)](3.5.2)384 subh3
+[2(^)0( provides the bitwise XOR operation.)]367 norm3
+[{/section-3.5.3 xa}2(&)0(: )(Bitwise AND Operator)](3.5.3)347.8 subh3
+[2(&)0( provides the bitwise AND operation.)]330.8 norm3
+[{/section-3.5.4 xa}2(<<)0( and )2(>>)0(: )(Bit Shift Operators)](3.5.4)311.6 subh3
+[2(<<)0( gives a bit-shift to the left, just as it does in C. So )2(5<<3)0( evaluates to 5 times 8, or 40. )2(>>)0( gives a bit-shift)]294.6 norm1
+[(to the right; in NASM, such a shift is )1(always)0( unsigned, so that the bits shifted in from the left-hand end are)]283.6 norm0
+[(filled with zero rather than a sign-extension of the previous highest bit.)]272.6 norm2
+[{/section-3.5.5 xa}2(+)0( and )2(-)0(: )(Addition and )(Subtraction Operators)](3.5.5)253.4 subh3
+[(The )2(+)0( and )2(-)0( operators do perfectly ordinary addition and subtraction.)]236.4 norm3
+[{/section-3.5.6 xa}2(*)0(, )2(/)0(, )2(//)0(, )2(%)0( and )2(%%)0(: )(Multiplication and )(Division)](3.5.6)217.2 subh3
+[2(*)0( is the multiplication operator. )2(/)0( and )2(//)0( are both division operators: )2(/)0( is )(unsigned division and )2(//)0( is )(signed)]200.2 norm1
+[(division. Similarly, )2(%)0( and )2(%%)0( provide )(unsigned and )(signed modulo operators respectively.)]189.2 norm2
+[(NASM, like ANSI C, provides no guarantees about the sensible operation of the signed modulo operator.)]172.2 norm3
+[(Since the )2(%)0( character is used extensively by the macro )(preprocessor, you should ensure that both the signed)]155.2 norm1
+[(and unsigned modulo operators are followed by white space wherever they appear.)]144.2 norm2
+(33)pageodd
+restore showpage
+%%Page: 34 34
+%%BeginPageSetup
+save
+%%EndPageSetup
+/34 pa
+[{/section-3.5.7 xa}(Unary Operators: )2(+)0(, )2(-)0(, )2(~)0(, )2(!)0( and )2(SEG)](3.5.7)678.8 subh3
+[(The highest-priority operators in NASM's expression grammar are those which only apply to one argument.)]661.8 norm1
+[2(-)0( negates its operand, )2(+)0( does nothing \(it's provided for symmetry with )2(-)0(\), )2(~)0( computes the )(one's complement)]650.8 norm0
+[(of its operand, )2(!)0( is the )(logical negation operator, and )2(SEG)0( provides the )(segment address of its operand)]639.8 norm0
+[(\(explained in more detail in ){/section-3.6 xl}(section 3.6){el}(\).)]628.8 norm2
+[{/section-3.6 xa}2(SEG)0( and )2(WRT)](3.6)607.4 head3
+[(When writing large 16-bit programs, which must be split into multiple )(segments, it is often necessary to be)]590.4 norm1
+[(able to refer to the )(segment part of the address of a symbol. NASM supports the )2(SEG)0( operator to perform this)]579.4 norm0
+[(function.)]568.4 norm2
+[(The )2(SEG)0( operator returns the )1(preferred)0( segment base of a symbol, defined as the segment base relative to)]551.4 norm1
+[(which the offset of the symbol makes sense. So the code)]540.4 norm2
+[2(        mov     ax,seg symbol )]523.4 code1
+[2(        mov     es,ax )]512.4 code0
+[2(        mov     bx,symbol)]501.4 code2
+[(will load )2(ES:BX)0( with a valid pointer to the symbol )2(symbol)0(.)]484.4 norm3
+[(Things can be more complex than this: since 16-bit segments and )(groups may )(overlap, you might)]467.4 norm1
+[(occasionally want to refer to some symbol using a different segment base from the preferred one. NASM lets)]456.4 norm0
+[(you do this, by the use of the )2(WRT)0( \(With Reference To\) keyword. So you can do things like)]445.4 norm2
+[2(        mov     ax,weird_seg        ; weird_seg is a segment base )]428.4 code1
+[2(        mov     es,ax )]417.4 code0
+[2(        mov     bx,symbol wrt weird_seg)]406.4 code2
+[(to load )2(ES:BX)0( with a different, but functionally equivalent, pointer to the symbol )2(symbol)0(.)]389.4 norm3
+[(NASM supports far \(inter-segment\) calls and jumps by means of the syntax )2(call segment:offset)0(,)]372.4 norm1
+[(where )2(segment)0( and )2(offset)0( both represent immediate values. So to call a far procedure, you could code)]361.4 norm0
+[(either of)]350.4 norm2
+[2(        call    \(seg procedure\):procedure )]333.4 code1
+[2(        call    weird_seg:\(procedure wrt weird_seg\))]322.4 code2
+[(\(The parentheses are included for clarity, to show the intended parsing of the above instructions. They are not)]305.4 norm1
+[(necessary in practice.\))]294.4 norm2
+[(NASM supports the syntax )2(call far procedure)0( as a synonym for the first of the above usages. )2(JMP)]277.4 norm1
+[(works identically to )2(CALL)0( in these examples.)]266.4 norm2
+[(To declare a )(far pointer to a data item in a data segment, you must code)]249.4 norm3
+[2(        dw      symbol, seg symbol)]232.4 code3
+[(NASM supports no convenient synonym for this, though you can always invent one using the macro)]215.4 norm1
+[(processor.)]204.4 norm2
+[{/section-3.7 xa}2(STRICT)0(: Inhibiting Optimization)](3.7)183 head3
+[(When assembling with the optimizer set to level 2 or higher \(see ){/section-2.1.22 xl}(section 2.1.22){el}(\), NASM will use size)]166 norm1
+[(specifiers \()2(BYTE)0(, )2(WORD)0(, )2(DWORD)0(, )2(QWORD)0(, )2(TWORD)0(, )2(OWORD)0( or )2(YWORD)0(\), but will give them the smallest)]155 norm0
+[(possible size. The keyword )2(STRICT)0( can be used to inhibit optimization and force a particular operand to be)]144 norm0
+[(emitted in the specified size. For example, with the optimizer on, and in )2(BITS 16)0( mode,)]133 norm2
+[2(        push dword 33)]116 code3
+(34)pageeven
+restore showpage
+%%Page: 35 35
+%%BeginPageSetup
+save
+%%EndPageSetup
+/35 pa
+[(is encoded in three bytes )2(66 6A 21)0(, whereas)]681 norm3
+[2(        push strict dword 33)]664 code3
+[(is encoded in six bytes, with a full dword immediate operand )2(66 68 21 00 00 00)0(.)]647 norm3
+[(With the optimizer off, the same code \(six bytes\) is generated whether the )2(STRICT)0( keyword was used or not.)]630 norm3
+[{/section-3.8 xa}(Critical Expressions)](3.8)608.6 head3
+[(Although NASM has an optional multi-pass optimizer, there are some expressions which must be resolvable)]591.6 norm1
+[(on the first pass. These are called )1(Critical Expressions)0(.)]580.6 norm2
+[(The first pass is used to determine the size of all the assembled code and data, so that the second pass, when)]563.6 norm1
+[(generating all the code, knows all the symbol addresses the code refers to. So one thing NASM can't handle is)]552.6 norm0
+[(code whose size depends on the value of a symbol declared after the code in question. For example,)]541.6 norm2
+[2(        times \(label-$\) db 0 )]524.6 code1
+[2(label:  db      'Where am I?')]513.6 code2
+[(The argument to )2(TIMES)0( in this case could equally legally evaluate to anything at all; NASM will reject this)]496.6 norm1
+[(example because it cannot tell the size of the )2(TIMES)0( line when it first sees it. It will just as firmly reject the)]485.6 norm0
+[(slightly )(paradoxical code)]474.6 norm2
+[2(        times \(label-$+1\) db 0 )]457.6 code1
+[2(label:  db      'NOW where am I?')]446.6 code2
+[(in which )1(any)0( value for the )2(TIMES)0( argument is by definition wrong!)]429.6 norm3
+[(NASM rejects these examples by means of a concept called a )1(critical expression)0(, which is defined to be an)]412.6 norm1
+[(expression whose value is required to be computable in the first pass, and which must therefore depend only)]401.6 norm0
+[(on symbols defined before it. The argument to the )2(TIMES)0( prefix is a critical expression.)]390.6 norm2
+[{/section-3.9 xa}(Local Labels)](3.9)369.2 head3
+[(NASM gives special treatment to symbols beginning with a )(period. A label beginning with a single period is)]352.2 norm1
+[(treated as a )1(local)0( label, which means that it is associated with the previous non-local label. So, for example:)]341.2 norm2
+[2(label1  ; some code )]324.2 code1
+[2()]313.2 code0
+[2(.loop )]302.2 code0
+[2(        ; some more code )]291.2 code0
+[2()]280.2 code0
+[2(        jne     .loop )]269.2 code0
+[2(        ret )]258.2 code0
+[2()]247.2 code0
+[2(label2  ; some code )]236.2 code0
+[2()]225.2 code0
+[2(.loop )]214.2 code0
+[2(        ; some more code )]203.2 code0
+[2()]192.2 code0
+[2(        jne     .loop )]181.2 code0
+[2(        ret)]170.2 code2
+[(In the above code fragment, each )2(JNE)0( instruction jumps to the line immediately before it, because the two)]153.2 norm1
+[(definitions of )2(.loop)0( are kept separate by virtue of each being associated with the previous non-local label.)]142.2 norm2
+[(This form of local label handling is borrowed from the old Amiga assembler )(DevPac; however, NASM goes)]125.2 norm1
+[(one step further, in allowing access to local labels from other parts of the code. This is achieved by means of)]114.2 norm0
+[1(defining)0( a local label in terms of the previous non-local label: the first definition of )2(.loop)0( above is really)]103.2 norm0
+(35)pageodd
+restore showpage
+%%Page: 36 36
+%%BeginPageSetup
+save
+%%EndPageSetup
+/36 pa
+[(defining a symbol called )2(label1.loop)0(, and the second defines a symbol called )2(label2.loop)0(. So, if you)]681 norm0
+[(really needed to, you could write)]670 norm2
+[2(label3  ; some more code )]653 code1
+[2(        ; and some more )]642 code0
+[2()]631 code0
+[2(        jmp label1.loop)]620 code2
+[(Sometimes it is useful \226 in a macro, for instance \226 to be able to define a label which can be referenced from)]603 norm1
+[(anywhere but which doesn't interfere with the normal local-label mechanism. Such a label can't be non-local)]592 norm0
+[(because it would interfere with subsequent definitions of, and references to, local labels; and it can't be local)]581 norm0
+[(because the macro that defined it wouldn't know the label's full name. NASM therefore introduces a third)]570 norm0
+[(type of label, which is probably only useful in macro definitions: if a label begins with the )(special prefix )2(..@)0(,)]559 norm0
+[(then it does nothing to the local label mechanism. So you could code)]548 norm2
+[2(label1:                         ; a non-local label )]531 code1
+[2(.local:                         ; this is really label1.local )]520 code0
+[2(..@foo:                         ; this is a special symbol )]509 code0
+[2(label2:                         ; another non-local label )]498 code0
+[2(.local:                         ; this is really label2.local )]487 code0
+[2()]476 code0
+[2(        jmp     ..@foo          ; this will jump three lines up)]465 code2
+[(NASM has the capacity to define other special symbols beginning with a double period: for example,)]448 norm1
+[2(..start)0( is used to specify the entry point in the )2(obj)0( output format \(see ){/section-7.4.6 xl}(section 7.4.6){el}(\).)]437 norm2
+(36)pageeven
+restore showpage
+%%Page: 37 37
+%%BeginPageSetup
+save
+%%EndPageSetup
+/37 pa
+[{/chapter-4 xa}(Chapter 4: The NASM )(Preprocessor)]642.8 chap3
+[(NASM contains a powerful )(macro processor, which supports conditional assembly, multi-level file inclusion,)]607.8 norm1
+[(two forms of macro \(single-line and multi-line\), and a `context stack' mechanism for extra macro power.)]596.8 norm0
+[(Preprocessor directives all begin with a )2(%)0( sign.)]585.8 norm2
+[(The preprocessor collapses all lines which end with a backslash \(\\\) character into a single line. Thus:)]568.8 norm3
+[2(%define THIS_VERY_LONG_MACRO_NAME_IS_DEFINED_TO \\ )]551.8 code1
+[2(        THIS_VALUE)]540.8 code2
+[(will work like a single-line macro without the backslash-newline sequence.)]523.8 norm3
+[{/section-4.1 xa}(Single-Line Macros)](4.1)502.4 head3
+[{/section-4.1.1 xa}(The Normal Way: )2(%define)](4.1.1)483.2 subh3
+[(Single-line macros are defined using the )2(%define)0( preprocessor directive. The definitions work in a similar)]466.2 norm1
+[(way to C; so you can do things like)]455.2 norm2
+[2(%define ctrl    0x1F & )]438.2 code1
+[2(%define param\(a,b\) \(\(a\)+\(a\)*\(b\)\) )]427.2 code0
+[2()]416.2 code0
+[2(        mov     byte [param\(2,ebx\)], ctrl 'D')]405.2 code2
+[(which will expand to)]388.2 norm3
+[2(        mov     byte [\(2\)+\(2\)*\(ebx\)], 0x1F & 'D')]371.2 code3
+[(When the expansion of a single-line macro contains tokens which invoke another macro, the expansion is)]354.2 norm1
+[(performed at invocation time, not at definition time. Thus the code)]343.2 norm2
+[2(%define a\(x\)    1+b\(x\) )]326.2 code1
+[2(%define b\(x\)    2*x )]315.2 code0
+[2()]304.2 code0
+[2(        mov     ax,a\(8\))]293.2 code2
+[(will evaluate in the expected way to )2(mov ax,1+2*8)0(, even though the macro )2(b)0( wasn't defined at the time of)]276.2 norm1
+[(definition of )2(a)0(.)]265.2 norm2
+[(Macros defined with )2(%define)0( are )(case sensitive: after )2(%define foo bar)0(, only )2(foo)0( will expand to )2(bar)0(:)]248.2 norm1
+[2(Foo)0( or )2(FOO)0( will not. By using )2(%idefine)0( instead of )2(%define)0( \(the `i' stands for `insensitive'\) you can)]237.2 norm0
+[(define all the case variants of a macro at once, so that )2(%idefine foo bar)0( would cause )2(foo)0(, )2(Foo)0(, )2(FOO)0(,)]226.2 norm0
+[2(fOO)0( and so on all to expand to )2(bar)0(.)]215.2 norm2
+[(There is a mechanism which detects when a macro call has occurred as a result of a previous expansion of the)]198.2 norm1
+[(same macro, to guard against )(circular references and infinite loops. If this happens, the preprocessor will only)]187.2 norm0
+[(expand the first occurrence of the macro. Hence, if you code)]176.2 norm2
+[2(%define a\(x\)    1+a\(x\) )]159.2 code1
+[2()]148.2 code0
+[2(        mov     ax,a\(3\))]137.2 code2
+[(the macro )2(a\(3\))0( will expand once, becoming )2(1+a\(3\))0(, and will then expand no further. This behaviour can)]120.2 norm1
+[(be useful: see ){/section-9.1 xl}(section 9.1){el}( for an example of its use.)]109.2 norm2
+(37)pageodd
+restore showpage
+%%Page: 38 38
+%%BeginPageSetup
+save
+%%EndPageSetup
+/38 pa
+[(You can )(overload single-line macros: if you write)]681 norm3
+[2(%define foo\(x\)   1+x )]664 code1
+[2(%define foo\(x,y\) 1+x*y)]653 code2
+[(the preprocessor will be able to handle both types of macro call, by counting the parameters you pass; so)]636 norm1
+[2(foo\(3\))0( will become )2(1+3)0( whereas )2(foo\(ebx,2\))0( will become )2(1+ebx*2)0(. However, if you define)]625 norm2
+[2(%define foo bar)]608 code3
+[(then no other definition of )2(foo)0( will be accepted: a macro with no parameters prohibits the definition of the)]591 norm1
+[(same name as a macro )1(with)0( parameters, and vice versa.)]580 norm2
+[(This doesn't prevent single-line macros being )1(redefined)0(: you can perfectly well define a macro with)]563 norm3
+[2(%define foo bar)]546 code3
+[(and then re-define it later in the same source file with)]529 norm3
+[2(%define foo baz)]512 code3
+[(Then everywhere the macro )2(foo)0( is invoked, it will be expanded according to the most recent definition. This)]495 norm1
+[(is particularly useful when defining single-line macros with )2(%assign)0( \(see ){/section-4.1.7 xl}(section 4.1.7){el}(\).)]484 norm2
+[(You can )(pre-define single-line macros using the `-d' option on the NASM command line: see ){/section-2.1.18 xl}(section 2.1.18){el}(.)]467 norm3
+[{/section-4.1.2 xa}(Resolving )2(%define)0(: )2(%xdefine)](4.1.2)447.8 subh3
+[(To have a reference to an embedded single-line macro resolved at the time that the embedding macro is)]430.8 norm1
+[1(defined)0(, as opposed to when the embedding macro is )1(expanded)0(, you need a different mechanism to the one)]419.8 norm0
+[(offered by )2(%define)0(. The solution is to use )2(%xdefine)0(, or it's )(case-insensitive counterpart )2(%ixdefine)0(.)]408.8 norm2
+[(Suppose you have the following code:)]391.8 norm3
+[2(%define  isTrue  1 )]374.8 code1
+[2(%define  isFalse isTrue )]363.8 code0
+[2(%define  isTrue  0 )]352.8 code0
+[2()]341.8 code0
+[2(val1:    db      isFalse )]330.8 code0
+[2()]319.8 code0
+[2(%define  isTrue  1 )]308.8 code0
+[2()]297.8 code0
+[2(val2:    db      isFalse)]286.8 code2
+[(In this case, )2(val1)0( is equal to 0, and )2(val2)0( is equal to 1. This is because, when a single-line macro is defined)]269.8 norm1
+[(using )2(%define)0(, it is expanded only when it is called. As )2(isFalse)0( expands to )2(isTrue)0(, the expansion will)]258.8 norm0
+[(be the current value of )2(isTrue)0(. The first time it is called that is 0, and the second time it is 1.)]247.8 norm2
+[(If you wanted )2(isFalse)0( to expand to the value assigned to the embedded macro )2(isTrue)0( at the time that)]230.8 norm1
+[2(isFalse)0( was defined, you need to change the above code to use )2(%xdefine)0(.)]219.8 norm2
+[2(%xdefine isTrue  1 )]202.8 code1
+[2(%xdefine isFalse isTrue )]191.8 code0
+[2(%xdefine isTrue  0 )]180.8 code0
+[2()]169.8 code0
+[2(val1:    db      isFalse )]158.8 code0
+[2()]147.8 code0
+[2(%xdefine isTrue  1 )]136.8 code0
+[2()]125.8 code0
+[2(val2:    db      isFalse)]114.8 code2
+(38)pageeven
+restore showpage
+%%Page: 39 39
+%%BeginPageSetup
+save
+%%EndPageSetup
+/39 pa
+[(Now, each time that )2(isFalse)0( is called, it expands to 1, as that is what the embedded macro )2(isTrue)]681 norm1
+[(expanded to at the time that )2(isFalse)0( was defined.)]670 norm2
+[{/section-4.1.3 xa}(Macro Indirection: )2(%[...])](4.1.3)650.8 subh3
+[(The )2(%[...])0( construct can be used to expand macros in contexts where macro expansion would otherwise)]633.8 norm1
+[(not occur, including in the names other macros. For example, if you have a set of macros named )2(Foo16)0(,)]622.8 norm0
+[2(Foo32)0( and )2(Foo64)0(, you could write:)]611.8 norm2
+[2(     mov ax,Foo%[__BITS__]   ; The Foo value)]594.8 code3
+[(to use the builtin macro )2(__BITS__)0( \(see ){/section-4.11.5 xl}(section 4.11.5){el}(\) to automatically select between them. Similarly, the)]577.8 norm1
+[(two statements:)]566.8 norm2
+[2(%xdefine Bar         Quux    ; Expands due to %xdefine )]549.8 code1
+[2(%define  Bar         %[Quux] ; Expands due to %[...])]538.8 code2
+[(have, in fact, exactly the same effect.)]521.8 norm3
+[2(%[...])0( concatenates to adjacent tokens in the same way that multi-line macro parameters do, see ){/section-4.3.8 xl}(section){el}]504.8 norm1
+[{/section-4.3.8 xl}(4.3.8){el}( for details.)]493.8 norm2
+[{/section-4.1.4 xa}(Concatenating Single Line Macro Tokens: )2(%+)](4.1.4)474.6 subh3
+[(Individual tokens in single line macros can be concatenated, to produce longer tokens for later processing.)]457.6 norm1
+[(This can be useful if there are several similar macros that perform similar functions.)]446.6 norm2
+[(Please note that a space is required after )2(%+)0(, in order to disambiguate it from the syntax )2(%+1)0( used in multiline)]429.6 norm1
+[(macros.)]418.6 norm2
+[(As an example, consider the following:)]401.6 norm3
+[2(%define BDASTART 400h                ; Start of BIOS data area)]384.6 code3
+[2(struc   tBIOSDA                      ; its structure )]367.6 code1
+[2(        .COM1addr       RESW    1 )]356.6 code0
+[2(        .COM2addr       RESW    1 )]345.6 code0
+[2(        ; ..and so on )]334.6 code0
+[2(endstruc)]323.6 code2
+[(Now, if we need to access the elements of tBIOSDA in different places, we can end up with:)]306.6 norm3
+[2(        mov     ax,BDASTART + tBIOSDA.COM1addr )]289.6 code1
+[2(        mov     bx,BDASTART + tBIOSDA.COM2addr)]278.6 code2
+[(This will become pretty ugly \(and tedious\) if used in many places, and can be reduced in size significantly by)]261.6 norm1
+[(using the following macro:)]250.6 norm2
+[2(; Macro to access BIOS variables by their names \(from tBDA\):)]233.6 code3
+[2(%define BDA\(x\)  BDASTART + tBIOSDA. %+ x)]216.6 code3
+[(Now the above code can be written as:)]199.6 norm3
+[2(        mov     ax,BDA\(COM1addr\) )]182.6 code1
+[2(        mov     bx,BDA\(COM2addr\))]171.6 code2
+[(Using this feature, we can simplify references to a lot of macros \(and, in turn, reduce typing errors\).)]154.6 norm3
+[{/section-4.1.5 xa}(The Macro Name Itself: )2(%?)0( and )2(%??)](4.1.5)135.4 subh3
+[(The special symbols )2(%?)0( and )2(%??)0( can be used to reference the macro name itself inside a macro expansion,)]118.4 norm1
+[(this is supported for both single-and multi-line macros. )2(%?)0( refers to the macro name as )1(invoked)0(, whereas)]107.4 norm0
+(39)pageodd
+restore showpage
+%%Page: 40 40
+%%BeginPageSetup
+save
+%%EndPageSetup
+/40 pa
+[2(%??)0( refers to the macro name as )1(declared)0(. The two are always the same for case-sensitive macros, but for)]681 norm0
+[(case-insensitive macros, they can differ.)]670 norm2
+[(For example:)]653 norm3
+[2(%idefine Foo mov %?,%?? )]636 code1
+[2()]625 code0
+[2(        foo )]614 code0
+[2(        FOO)]603 code2
+[(will expand to:)]586 norm3
+[2(        mov foo,Foo )]569 code1
+[2(        mov FOO,Foo)]558 code2
+[(The sequence:)]541 norm3
+[2(%idefine keyword $%?)]524 code3
+[(can be used to make a keyword "disappear", for example in case a new instruction has been used as a label in)]507 norm1
+[(older code. For example:)]496 norm2
+[2(%idefine pause $%?                  ; Hide the PAUSE instruction)]479 code3
+[{/section-4.1.6 xa}(Undefining Single-Line Macros: )2(%undef)](4.1.6)459.8 subh3
+[(Single-line macros can be removed with the )2(%undef)0( directive. For example, the following sequence:)]442.8 norm3
+[2(%define foo bar )]425.8 code1
+[2(%undef  foo )]414.8 code0
+[2()]403.8 code0
+[2(        mov     eax, foo)]392.8 code2
+[(will expand to the instruction )2(mov eax, foo)0(, since after )2(%undef)0( the macro )2(foo)0( is no longer defined.)]375.8 norm3
+[(Macros that would otherwise be pre-defined can be undefined on the command-line using the `-u' option on)]358.8 norm1
+[(the NASM command line: see ){/section-2.1.19 xl}(section 2.1.19){el}(.)]347.8 norm2
+[{/section-4.1.7 xa}(Preprocessor Variables: )2(%assign)](4.1.7)328.6 subh3
+[(An alternative way to define single-line macros is by means of the )2(%assign)0( command \(and its)]311.6 norm1
+[(case-insensitive counterpart )2(%iassign)0(, which differs from )2(%assign)0( in exactly the same way that)]300.6 norm0
+[2(%idefine)0( differs from )2(%define)0(\).)]289.6 norm2
+[2(%assign)0( is used to define single-line macros which take no parameters and have a numeric value. This)]272.6 norm1
+[(value can be specified in the form of an expression, and it will be evaluated once, when the )2(%assign)]261.6 norm0
+[(directive is processed.)]250.6 norm2
+[(Like )2(%define)0(, macros defined using )2(%assign)0( can be re-defined later, so you can do things like)]233.6 norm3
+[2(%assign i i+1)]216.6 code3
+[(to increment the numeric value of a macro.)]199.6 norm3
+[2(%assign)0( is useful for controlling the termination of )2(%rep)0( preprocessor loops: see ){/section-4.5 xl}(section 4.5){el}( for an)]182.6 norm1
+[(example of this. Another use for )2(%assign)0( is given in ){/section-8.4 xl}(section 8.4){el}( and ){/section-9.1 xl}(section 9.1){el}(.)]171.6 norm2
+[(The expression passed to )2(%assign)0( is a )(critical expression \(see ){/section-3.8 xl}(section 3.8){el}(\), and must also evaluate to a pure)]154.6 norm1
+[(number \(rather than a relocatable reference such as a code or data address, or anything involving a register\).)]143.6 norm2
+(40)pageeven
+restore showpage
+%%Page: 41 41
+%%BeginPageSetup
+save
+%%EndPageSetup
+/41 pa
+[{/section-4.1.8 xa}(Defining Strings: )2(%defstr)](4.1.8)678.8 subh3
+[2(%defstr)0(, and its case-insensitive counterpart )2(%idefstr)0(, define or redefine a single-line macro without)]661.8 norm1
+[(parameters but converts the entire right-hand side, after macro expansion, to a quoted string before definition.)]650.8 norm2
+[(For example:)]633.8 norm3
+[2(%defstr test TEST)]616.8 code3
+[(is equivalent to)]599.8 norm3
+[2(%define test 'TEST')]582.8 code3
+[(This can be used, for example, with the )2(%!)0( construct \(see ){/section-4.10.2 xl}(section 4.10.2){el}(\):)]565.8 norm3
+[2(%defstr PATH %!PATH          ; The operating system PATH variable)]548.8 code3
+[{/section-4.1.9 xa}(Defining Tokens: )2(%deftok)](4.1.9)529.6 subh3
+[2(%deftok)0(, and its case-insensitive counterpart )2(%ideftok)0(, define or redefine a single-line macro without)]512.6 norm1
+[(parameters but converts the second parameter, after string conversion, to a sequence of tokens.)]501.6 norm2
+[(For example:)]484.6 norm3
+[2(%deftok test 'TEST')]467.6 code3
+[(is equivalent to)]450.6 norm3
+[2(%define test TEST)]433.6 code3
+[{/section-4.2 xa}(String Manipulation in Macros)](4.2)412.2 head3
+[(It's often useful to be able to handle strings in macros. NASM supports a few simple string handling macro)]395.2 norm1
+[(operators from which more complex operations can be constructed.)]384.2 norm2
+[(All the string operators define or redefine a value \(either a string or a numeric value\) to a single-line macro.)]367.2 norm1
+[(When producing a string value, it may change the style of quoting of the input string or strings, and possibly)]356.2 norm0
+[(use )2(\\)0(\226escapes inside )2(`)0(\226quoted strings.)]345.2 norm2
+[{/section-4.2.1 xa}(Concatenating Strings: )2(%strcat)](4.2.1)326 subh3
+[(The )2(%strcat)0( operator concatenates quoted strings and assign them to a single-line macro.)]309 norm3
+[(For example:)]292 norm3
+[2(%strcat alpha "Alpha: ", '12" screen')]275 code3
+[(... would assign the value )2('Alpha: 12" screen')0( to )2(alpha)0(. Similarly:)]258 norm3
+[2(%strcat beta '"foo"\\', "'bar'")]241 code3
+[(... would assign the value )2(`"foo"\\\\'bar'`)0( to )2(beta)0(.)]224 norm3
+[(The use of commas to separate strings is permitted but optional.)]207 norm3
+[{/section-4.2.2 xa}(String Length: )2(%strlen)](4.2.2)187.8 subh3
+[(The )2(%strlen)0( operator assigns the length of a string to a macro. For example:)]170.8 norm3
+[2(%strlen charcnt 'my string')]153.8 code3
+[(In this example, )2(charcnt)0( would receive the value 9, just as if an )2(%assign)0( had been used. In this example,)]136.8 norm1
+[2('my string')0( was a literal string but it could also have been a single-line macro that expands to a string, as)]125.8 norm0
+[(in the following example:)]114.8 norm2
+(41)pageodd
+restore showpage
+%%Page: 42 42
+%%BeginPageSetup
+save
+%%EndPageSetup
+/42 pa
+[2(%define sometext 'my string' )]681 code1
+[2(%strlen charcnt sometext)]670 code2
+[(As in the first case, this would result in )2(charcnt)0( being assigned the value of 9.)]653 norm3
+[{/section-4.2.3 xa}(Extracting Substrings: )2(%substr)](4.2.3)633.8 subh3
+[(Individual letters or substrings in strings can be extracted using the )2(%substr)0( operator. An example of its use)]616.8 norm1
+[(is probably more useful than the description:)]605.8 norm2
+[2(%substr mychar 'xyzw' 1       ; equivalent to %define mychar 'x' )]588.8 code1
+[2(%substr mychar 'xyzw' 2       ; equivalent to %define mychar 'y' )]577.8 code0
+[2(%substr mychar 'xyzw' 3       ; equivalent to %define mychar 'z' )]566.8 code0
+[2(%substr mychar 'xyzw' 2,2     ; equivalent to %define mychar 'yz' )]555.8 code0
+[2(%substr mychar 'xyzw' 2,-1    ; equivalent to %define mychar 'yzw' )]544.8 code0
+[2(%substr mychar 'xyzw' 2,-2    ; equivalent to %define mychar 'yz')]533.8 code2
+[(As with )2(%strlen)0( \(see ){/section-4.2.2 xl}(section 4.2.2){el}(\), the first parameter is the single-line macro to be created and the)]516.8 norm1
+[(second is the string. The third parameter specifies the first character to be selected, and the optional fourth)]505.8 norm0
+[(parameter preceeded by comma\) is the length. Note that the first index is 1, not 0 and the last index is equal to)]494.8 norm0
+[(the value that )2(%strlen)0( would assign given the same string. Index values out of range result in an empty)]483.8 norm0
+[(string. A negative length means "until N-1 characters before the end of string", i.e. )2(-1)0( means until end of)]472.8 norm0
+[(string, )2(-2)0( until one character before, etc.)]461.8 norm2
+[{/section-4.3 xa}(Multi-Line Macros: )2(%macro)](4.3)440.4 head3
+[(Multi-line macros are much more like the type of macro seen in MASM and TASM: a multi-line macro)]423.4 norm1
+[(definition in NASM looks something like this.)]412.4 norm2
+[2(%macro  prologue 1 )]395.4 code1
+[2()]384.4 code0
+[2(        push    ebp )]373.4 code0
+[2(        mov     ebp,esp )]362.4 code0
+[2(        sub     esp,%1 )]351.4 code0
+[2()]340.4 code0
+[2(%endmacro)]329.4 code2
+[(This defines a C-like function prologue as a macro: so you would invoke the macro with a call such as)]312.4 norm3
+[2(myfunc:   prologue 12)]295.4 code3
+[(which would expand to the three lines of code)]278.4 norm3
+[2(myfunc: push    ebp )]261.4 code1
+[2(        mov     ebp,esp )]250.4 code0
+[2(        sub     esp,12)]239.4 code2
+[(The number )2(1)0( after the macro name in the )2(%macro)0( line defines the number of parameters the macro)]222.4 norm1
+[2(prologue)0( expects to receive. The use of )2(%1)0( inside the macro definition refers to the first parameter to the)]211.4 norm0
+[(macro call. With a macro taking more than one parameter, subsequent parameters would be referred to as )2(%2)0(,)]200.4 norm0
+[2(%3)0( and so on.)]189.4 norm2
+[(Multi-line macros, like single-line macros, are )(case-sensitive, unless you define them using the alternative)]172.4 norm1
+[(directive )2(%imacro)0(.)]161.4 norm2
+[(If you need to pass a comma as )1(part)0( of a parameter to a multi-line macro, you can do that by enclosing the)]144.4 norm1
+[(entire parameter in )(braces. So you could code things like)]133.4 norm2
+[2(%macro  silly 2 )]116.4 code1
+[2()]105.4 code0
+(42)pageeven
+restore showpage
+%%Page: 43 43
+%%BeginPageSetup
+save
+%%EndPageSetup
+/43 pa
+[2(    %2: db      %1 )]681 code0
+[2()]670 code0
+[2(%endmacro )]659 code0
+[2()]648 code0
+[2(        silly 'a', letter_a             ; letter_a:  db 'a' )]637 code0
+[2(        silly 'ab', string_ab           ; string_ab: db 'ab' )]626 code0
+[2(        silly {13,10}, crlf             ; crlf:      db 13,10)]615 code2
+[{/section-4.3.1 xa}(Recursive Multi-Line Macros: )2(%rmacro)](4.3.1)595.8 subh3
+[(A multi-line macro cannot be referenced within itself, in order to prevent accidental infinite recursion.)]578.8 norm3
+[(Recursive multi-line macros allow for self-referencing, with the caveat that the user is aware of the)]561.8 norm1
+[(existence, use and purpose of recursive multi-line macros. There is also a generous, but sane, upper limit to)]550.8 norm0
+[(the number of recursions, in order to prevent run-away memory consumption in case of accidental infinite)]539.8 norm0
+[(recursion.)]528.8 norm2
+[(As with non-recursive multi-line macros, recursive multi-line macros are )(case-sensitive, unless you define)]511.8 norm1
+[(them using the alternative directive )2(%irmacro)0(.)]500.8 norm2
+[{/section-4.3.2 xa}(Overloading Multi-Line Macros)](4.3.2)481.6 subh3
+[(As with single-line macros, multi-line macros can be overloaded by defining the same macro name several)]464.6 norm1
+[(times with different numbers of parameters. This time, no exception is made for macros with no parameters at)]453.6 norm0
+[(all. So you could define)]442.6 norm2
+[2(%macro  prologue 0 )]425.6 code1
+[2()]414.6 code0
+[2(        push    ebp )]403.6 code0
+[2(        mov     ebp,esp )]392.6 code0
+[2()]381.6 code0
+[2(%endmacro)]370.6 code2
+[(to define an alternative form of the function prologue which allocates no local stack space.)]353.6 norm3
+[(Sometimes, however, you might want to `overload' a machine instruction; for example, you might want to)]336.6 norm1
+[(define)]325.6 norm2
+[2(%macro  push 2 )]308.6 code1
+[2()]297.6 code0
+[2(        push    %1 )]286.6 code0
+[2(        push    %2 )]275.6 code0
+[2()]264.6 code0
+[2(%endmacro)]253.6 code2
+[(so that you could code)]236.6 norm3
+[2(        push    ebx             ; this line is not a macro call )]219.6 code1
+[2(        push    eax,ecx         ; but this one is)]208.6 code2
+[(Ordinarily, NASM will give a warning for the first of the above two lines, since )2(push)0( is now defined to be a)]191.6 norm1
+[(macro, and is being invoked with a number of parameters for which no definition has been given. The correct)]180.6 norm0
+[(code will still be generated, but the assembler will give a warning. This warning can be disabled by the use of)]169.6 norm0
+[(the )2(-w-macro-params)0( command-line option \(see ){/section-2.1.24 xl}(section 2.1.24){el}(\).)]158.6 norm2
+[{/section-4.3.3 xa}(Macro-Local Labels)](4.3.3)139.4 subh3
+[(NASM allows you to define labels within a multi-line macro definition in such a way as to make them local)]122.4 norm1
+[(to the macro call: so calling the same macro multiple times will use a different label each time. You do this by)]111.4 norm0
+(43)pageodd
+restore showpage
+%%Page: 44 44
+%%BeginPageSetup
+save
+%%EndPageSetup
+/44 pa
+[(prefixing )2(%%)0( to the label name. So you can invent an instruction which executes a )2(RET)0( if the )2(Z)0( flag is set by)]681 norm0
+[(doing this:)]670 norm2
+[2(%macro  retz 0 )]653 code1
+[2()]642 code0
+[2(        jnz     %%skip )]631 code0
+[2(        ret )]620 code0
+[2(    %%skip: )]609 code0
+[2()]598 code0
+[2(%endmacro)]587 code2
+[(You can call this macro as many times as you want, and every time you call it NASM will make up a different)]570 norm1
+[(`real' name to substitute for the label )2(%%skip)0(. The names NASM invents are of the form )2(..@2345.skip)0(,)]559 norm0
+[(where the number 2345 changes with every macro call. The )2(..@)0( prefix prevents macro-local labels from)]548 norm0
+[(interfering with the local label mechanism, as described in ){/section-3.9 xl}(section 3.9){el}(. You should avoid defining your own)]537 norm0
+[(labels in this form \(the )2(..@)0( prefix, then a number, then another period\) in case they interfere with)]526 norm0
+[(macro-local labels.)]515 norm2
+[{/section-4.3.4 xa}(Greedy Macro Parameters)](4.3.4)495.8 subh3
+[(Occasionally it is useful to define a macro which lumps its entire command line into one parameter definition,)]478.8 norm1
+[(possibly after extracting one or two smaller parameters from the front. An example might be a macro to write)]467.8 norm0
+[(a text string to a file in MS-DOS, where you might want to be able to write)]456.8 norm2
+[2(        writefile [filehandle],"hello, world",13,10)]439.8 code3
+[(NASM allows you to define the last parameter of a macro to be )1(greedy)0(, meaning that if you invoke the macro)]422.8 norm1
+[(with more parameters than it expects, all the spare parameters get lumped into the last defined one along with)]411.8 norm0
+[(the separating commas. So if you code:)]400.8 norm2
+[2(%macro  writefile 2+ )]383.8 code1
+[2()]372.8 code0
+[2(        jmp     %%endstr )]361.8 code0
+[2(  %%str:        db      %2 )]350.8 code0
+[2(  %%endstr: )]339.8 code0
+[2(        mov     dx,%%str )]328.8 code0
+[2(        mov     cx,%%endstr-%%str )]317.8 code0
+[2(        mov     bx,%1 )]306.8 code0
+[2(        mov     ah,0x40 )]295.8 code0
+[2(        int     0x21 )]284.8 code0
+[2()]273.8 code0
+[2(%endmacro)]262.8 code2
+[(then the example call to )2(writefile)0( above will work as expected: the text before the first comma,)]245.8 norm1
+[2([filehandle])0(, is used as the first macro parameter and expanded when )2(%1)0( is referred to, and all the)]234.8 norm0
+[(subsequent text is lumped into )2(%2)0( and placed after the )2(db)0(.)]223.8 norm2
+[(The greedy nature of the macro is indicated to NASM by the use of the )2(+)0( sign after the parameter count on the)]206.8 norm1
+[2(%macro)0( line.)]195.8 norm2
+[(If you define a greedy macro, you are effectively telling NASM how it should expand the macro given )1(any)]178.8 norm1
+[(number of parameters from the actual number specified up to infinity; in this case, for example, NASM now)]167.8 norm0
+[(knows what to do when it sees a call to )2(writefile)0( with 2, 3, 4 or more parameters. NASM will take this)]156.8 norm0
+[(into account when overloading macros, and will not allow you to define another form of )2(writefile)0( taking)]145.8 norm0
+[(4 parameters \(for example\).)]134.8 norm2
+[(Of course, the above macro could have been implemented as a non-greedy macro, in which case the call to it)]117.8 norm1
+[(would have had to look like)]106.8 norm2
+(44)pageeven
+restore showpage
+%%Page: 45 45
+%%BeginPageSetup
+save
+%%EndPageSetup
+/45 pa
+[2(          writefile [filehandle], {"hello, world",13,10})]681 code3
+[(NASM provides both mechanisms for putting )(commas in macro parameters, and you choose which one you)]664 norm1
+[(prefer for each macro definition.)]653 norm2
+[(See ){/section-6.3.1 xl}(section 6.3.1){el}( for a better way to write the above macro.)]636 norm3
+[{/section-4.3.5 xa}(Default Macro Parameters)](4.3.5)616.8 subh3
+[(NASM also allows you to define a multi-line macro with a )1(range)0( of allowable parameter counts. If you do)]599.8 norm1
+[(this, you can specify defaults for )(omitted parameters. So, for example:)]588.8 norm2
+[2(%macro  die 0-1 "Painful program death has occurred." )]571.8 code1
+[2()]560.8 code0
+[2(        writefile 2,%1 )]549.8 code0
+[2(        mov     ax,0x4c01 )]538.8 code0
+[2(        int     0x21 )]527.8 code0
+[2()]516.8 code0
+[2(%endmacro)]505.8 code2
+[(This macro \(which makes use of the )2(writefile)0( macro defined in ){/section-4.3.4 xl}(section 4.3.4){el}(\) can be called with an)]488.8 norm1
+[(explicit error message, which it will display on the error output stream before exiting, or it can be called with)]477.8 norm0
+[(no parameters, in which case it will use the default error message supplied in the macro definition.)]466.8 norm2
+[(In general, you supply a minimum and maximum number of parameters for a macro of this type; the)]449.8 norm1
+[(minimum number of parameters are then required in the macro call, and then you provide defaults for the)]438.8 norm0
+[(optional ones. So if a macro definition began with the line)]427.8 norm2
+[2(%macro foobar 1-3 eax,[ebx+2])]410.8 code3
+[(then it could be called with between one and three parameters, and )2(%1)0( would always be taken from the macro)]393.8 norm1
+[(call. )2(%2)0(, if not specified by the macro call, would default to )2(eax)0(, and )2(%3)0( if not specified would default to)]382.8 norm0
+[2([ebx+2])0(.)]371.8 norm2
+[(You can provide extra information to a macro by providing too many default parameters:)]354.8 norm3
+[2(%macro quux 1 something)]337.8 code3
+[(This will trigger a warning by default; see ){/section-2.1.24 xl}(section 2.1.24){el}( for more information. When )2(quux)0( is invoked, it)]320.8 norm1
+[(receives not one but two parameters. )2(something)0( can be referred to as )2(%2)0(. The difference between passing)]309.8 norm0
+[2(something)0( this way and writing )2(something)0( in the macro body is that with this way )2(something)0( is)]298.8 norm0
+[(evaluated when the macro is defined, not when it is expanded.)]287.8 norm2
+[(You may omit parameter defaults from the macro definition, in which case the parameter default is taken to be)]270.8 norm1
+[(blank. This can be useful for macros which can take a variable number of parameters, since the )2(%0)0( token \(see)]259.8 norm0
+[{/section-4.3.6 xl}(section 4.3.6){el}(\) allows you to determine how many parameters were really passed to the macro call.)]248.8 norm2
+[(This defaulting mechanism can be combined with the greedy-parameter mechanism; so the )2(die)0( macro above)]231.8 norm1
+[(could be made more powerful, and more useful, by changing the first line of the definition to)]220.8 norm2
+[2(%macro die 0-1+ "Painful program death has occurred.",13,10)]203.8 code3
+[(The maximum parameter count can be infinite, denoted by )2(*)0(. In this case, of course, it is impossible to)]186.8 norm1
+[(provide a )1(full)0( set of default parameters. Examples of this usage are shown in ){/section-4.3.7 xl}(section 4.3.7){el}(.)]175.8 norm2
+[{/section-4.3.6 xa}2(%0)0(: )(Macro Parameter Counter)](4.3.6)156.6 subh3
+[(The parameter reference )2(%0)0( will return a numeric constant giving the number of parameters received, that is,)]139.6 norm1
+[(if )2(%0)0( is n then )2(%)0(n is the last parameter. )2(%0)0( is mostly useful for macros that can take a variable number of)]128.6 norm0
+[(parameters. It can be used as an argument to )2(%rep)0( \(see ){/section-4.5 xl}(section 4.5){el}(\) in order to iterate through all the)]117.6 norm0
+[(parameters of a macro. Examples are given in ){/section-4.3.7 xl}(section 4.3.7){el}(.)]106.6 norm2
+(45)pageodd
+restore showpage
+%%Page: 46 46
+%%BeginPageSetup
+save
+%%EndPageSetup
+/46 pa
+[{/section-4.3.7 xa}2(%rotate)0(: )(Rotating Macro Parameters)](4.3.7)678.8 subh3
+[(Unix shell programmers will be familiar with the )2(shift)0( shell command, which allows the arguments passed)]661.8 norm1
+[(to a shell script \(referenced as )2($1)0(, )2($2)0( and so on\) to be moved left by one place, so that the argument)]650.8 norm0
+[(previously referenced as )2($2)0( becomes available as )2($1)0(, and the argument previously referenced as )2($1)0( is no)]639.8 norm0
+[(longer available at all.)]628.8 norm2
+[(NASM provides a similar mechanism, in the form of )2(%rotate)0(. As its name suggests, it differs from the)]611.8 norm1
+[(Unix )2(shift)0( in that no parameters are lost: parameters rotated off the left end of the argument list reappear on)]600.8 norm0
+[(the right, and vice versa.)]589.8 norm2
+[2(%rotate)0( is invoked with a single numeric argument \(which may be an expression\). The macro parameters)]572.8 norm1
+[(are rotated to the left by that many places. If the argument to )2(%rotate)0( is negative, the macro parameters are)]561.8 norm0
+[(rotated to the right.)]550.8 norm2
+[(So a pair of macros to save and restore a set of registers might work as follows:)]533.8 norm3
+[2(%macro  multipush 1-* )]516.8 code1
+[2()]505.8 code0
+[2(  %rep  %0 )]494.8 code0
+[2(        push    %1 )]483.8 code0
+[2(  %rotate 1 )]472.8 code0
+[2(  %endrep )]461.8 code0
+[2()]450.8 code0
+[2(%endmacro)]439.8 code2
+[(This macro invokes the )2(PUSH)0( instruction on each of its arguments in turn, from left to right. It begins by)]422.8 norm1
+[(pushing its first argument, )2(%1)0(, then invokes )2(%rotate)0( to move all the arguments one place to the left, so that)]411.8 norm0
+[(the original second argument is now available as )2(%1)0(. Repeating this procedure as many times as there were)]400.8 norm0
+[(arguments \(achieved by supplying )2(%0)0( as the argument to )2(%rep)0(\) causes each argument in turn to be pushed.)]389.8 norm2
+[(Note also the use of )2(*)0( as the maximum parameter count, indicating that there is no upper limit on the number)]372.8 norm1
+[(of parameters you may supply to the )2(multipush)0( macro.)]361.8 norm2
+[(It would be convenient, when using this macro, to have a )2(POP)0( equivalent, which )1(didn't)0( require the arguments)]344.8 norm1
+[(to be given in reverse order. Ideally, you would write the )2(multipush)0( macro call, then cut-and-paste the)]333.8 norm0
+[(line to where the pop needed to be done, and change the name of the called macro to )2(multipop)0(, and the)]322.8 norm0
+[(macro would take care of popping the registers in the opposite order from the one in which they were pushed.)]311.8 norm2
+[(This can be done by the following definition:)]294.8 norm3
+[2(%macro  multipop 1-* )]277.8 code1
+[2()]266.8 code0
+[2(  %rep %0 )]255.8 code0
+[2(  %rotate -1 )]244.8 code0
+[2(        pop     %1 )]233.8 code0
+[2(  %endrep )]222.8 code0
+[2()]211.8 code0
+[2(%endmacro)]200.8 code2
+[(This macro begins by rotating its arguments one place to the )1(right)0(, so that the original )1(last)0( argument appears)]183.8 norm1
+[(as )2(%1)0(. This is then popped, and the arguments are rotated right again, so the second-to-last argument)]172.8 norm0
+[(becomes )2(%1)0(. Thus the arguments are iterated through in reverse order.)]161.8 norm2
+[{/section-4.3.8 xa}(Concatenating Macro Parameters)](4.3.8)142.6 subh3
+[(NASM can concatenate macro parameters and macro indirection constructs on to other text surrounding them.)]125.6 norm1
+[(This allows you to declare a family of symbols, for example, in a macro definition. If, for example, you)]114.6 norm0
+[(wanted to generate a table of key codes along with offsets into the table, you could code something like)]103.6 norm2
+(46)pageeven
+restore showpage
+%%Page: 47 47
+%%BeginPageSetup
+save
+%%EndPageSetup
+/47 pa
+[2(%macro keytab_entry 2 )]681 code1
+[2()]670 code0
+[2(    keypos%1    equ     $-keytab )]659 code0
+[2(                db      %2 )]648 code0
+[2()]637 code0
+[2(%endmacro )]626 code0
+[2()]615 code0
+[2(keytab: )]604 code0
+[2(          keytab_entry F1,128+1 )]593 code0
+[2(          keytab_entry F2,128+2 )]582 code0
+[2(          keytab_entry Return,13)]571 code2
+[(which would expand to)]554 norm3
+[2(keytab: )]537 code1
+[2(keyposF1        equ     $-keytab )]526 code0
+[2(                db     128+1 )]515 code0
+[2(keyposF2        equ     $-keytab )]504 code0
+[2(                db      128+2 )]493 code0
+[2(keyposReturn    equ     $-keytab )]482 code0
+[2(                db      13)]471 code2
+[(You can just as easily concatenate text on to the other end of a macro parameter, by writing )2(%1foo)0(.)]454 norm3
+[(If you need to append a )1(digit)0( to a macro parameter, for example defining labels )2(foo1)0( and )2(foo2)0( when passed)]437 norm1
+[(the parameter )2(foo)0(, you can't code )2(%11)0( because that would be taken as the eleventh macro parameter.)]426 norm0
+[(Instead, you must code )2(%{1}1)0(, which will separate the first )2(1)0( \(giving the number of the macro parameter\))]415 norm0
+[(from the second \(literal text to be concatenated to the parameter\).)]404 norm2
+[(This concatenation can also be applied to other preprocessor in-line objects, such as macro-local labels)]387 norm1
+[(\(){/section-4.3.3 xl}(section 4.3.3){el}(\) and context-local labels \(){/section-4.7.2 xl}(section 4.7.2){el}(\). In all cases, ambiguities in syntax can be resolved by)]376 norm0
+[(enclosing everything after the )2(%)0( sign and before the literal text in braces: so )2(%{%foo}bar)0( concatenates the)]365 norm0
+[(text )2(bar)0( to the end of the real name of the macro-local label )2(%%foo)0(. \(This is unnecessary, since the form)]354 norm0
+[(NASM uses for the real names of macro-local labels means that the two usages )2(%{%foo}bar)0( and)]343 norm0
+[2(%%foobar)0( would both expand to the same thing anyway; nevertheless, the capability is there.\))]332 norm2
+[(The single-line macro indirection construct, )2(%[...])0( \(){/section-4.1.3 xl}(section 4.1.3){el}(\), behaves the same way as macro)]315 norm1
+[(parameters for the purpose of concatenation.)]304 norm2
+[(See also the )2(%+)0( operator, ){/section-4.1.4 xl}(section 4.1.4){el}(.)]287 norm3
+[{/section-4.3.9 xa}(Condition Codes as Macro Parameters)](4.3.9)267.8 subh3
+[(NASM can give special treatment to a macro parameter which contains a condition code. For a start, you can)]250.8 norm1
+[(refer to the macro parameter )2(%1)0( by means of the alternative syntax )2(%+1)0(, which informs NASM that this)]239.8 norm0
+[(macro parameter is supposed to contain a condition code, and will cause the preprocessor to report an error)]228.8 norm0
+[(message if the macro is called with a parameter which is )1(not)0( a valid condition code.)]217.8 norm2
+[(Far more usefully, though, you can refer to the macro parameter by means of )2(%-1)0(, which NASM will expand)]200.8 norm1
+[(as the )1(inverse)0( condition code. So the )2(retz)0( macro defined in ){/section-4.3.3 xl}(section 4.3.3){el}( can be replaced by a general)]189.8 norm0
+[(conditional-return macro like this:)]178.8 norm2
+[2(%macro  retc 1 )]161.8 code1
+[2()]150.8 code0
+[2(        j%-1    %%skip )]139.8 code0
+[2(        ret )]128.8 code0
+[2(  %%skip: )]117.8 code0
+(47)pageodd
+restore showpage
+%%Page: 48 48
+%%BeginPageSetup
+save
+%%EndPageSetup
+/48 pa
+[2()]681 code0
+[2(%endmacro)]670 code2
+[(This macro can now be invoked using calls like )2(retc ne)0(, which will cause the conditional-jump instruction)]653 norm1
+[(in the macro expansion to come out as )2(JE)0(, or )2(retc po)0( which will make the jump a )2(JPE)0(.)]642 norm2
+[(The )2(%+1)0( macro-parameter reference is quite happy to interpret the arguments )2(CXZ)0( and )2(ECXZ)0( as valid)]625 norm1
+[(condition codes; however, )2(%-1)0( will report an error if passed either of these, because no inverse condition)]614 norm0
+[(code exists.)]603 norm2
+[{/section-4.3.10 xa}(Disabling Listing Expansion)](4.3.10)583.8 subh3
+[(When NASM is generating a listing file from your program, it will generally expand multi-line macros by)]566.8 norm1
+[(means of writing the macro call and then listing each line of the expansion. This allows you to see which)]555.8 norm0
+[(instructions in the macro expansion are generating what code; however, for some macros this clutters the)]544.8 norm0
+[(listing up unnecessarily.)]533.8 norm2
+[(NASM therefore provides the )2(.nolist)0( qualifier, which you can include in a macro definition to inhibit the)]516.8 norm1
+[(expansion of the macro in the listing file. The )2(.nolist)0( qualifier comes directly after the number of)]505.8 norm0
+[(parameters, like this:)]494.8 norm2
+[2(%macro foo 1.nolist)]477.8 code3
+[(Or like this:)]460.8 norm3
+[2(%macro bar 1-5+.nolist a,b,c,d,e,f,g,h)]443.8 code3
+[{/section-4.3.11 xa}(Undefining Multi-Line Macros: )2(%unmacro)](4.3.11)424.6 subh3
+[(Multi-line macros can be removed with the )2(%unmacro)0( directive. Unlike the )2(%undef)0( directive, however,)]407.6 norm1
+[2(%unmacro)0( takes an argument specification, and will only remove )(exact matches with that argument)]396.6 norm0
+[(specification.)]385.6 norm2
+[(For example:)]368.6 norm3
+[2(%macro foo 1-3 )]351.6 code1
+[2(        ; Do something )]340.6 code0
+[2(%endmacro )]329.6 code0
+[2(%unmacro foo 1-3)]318.6 code2
+[(removes the previously defined macro )2(foo)0(, but)]301.6 norm3
+[2(%macro bar 1-3 )]284.6 code1
+[2(        ; Do something )]273.6 code0
+[2(%endmacro )]262.6 code0
+[2(%unmacro bar 1)]251.6 code2
+[(does )1(not)0( remove the macro )2(bar)0(, since the argument specification does not match exactly.)]234.6 norm3
+[{/section-4.3.12 xa}(Exiting Multi-Line Macros: )2(%exitmacro)](4.3.12)215.4 subh3
+[(Multi-line macro expansions can be arbitrarily terminated with the )2(%exitmacro)0( directive.)]198.4 norm3
+[(For example:)]181.4 norm3
+[2(%macro foo 1-3 )]164.4 code1
+[2(        ; Do something )]153.4 code0
+[2(    %if<condition> )]142.4 code0
+[2(        %exitmacro )]131.4 code0
+[2(    %endif )]120.4 code0
+(48)pageeven
+restore showpage
+%%Page: 49 49
+%%BeginPageSetup
+save
+%%EndPageSetup
+/49 pa
+[2(        ; Do something )]681 code0
+[2(%endmacro)]670 code2
+[{/section-4.4 xa}(Conditional Assembly)](4.4)648.6 head3
+[(Similarly to the C preprocessor, NASM allows sections of a source file to be assembled only if certain)]631.6 norm1
+[(conditions are met. The general syntax of this feature looks like this:)]620.6 norm2
+[2(%if<condition> )]603.6 code1
+[2(    ; some code which only appears if <condition> is met )]592.6 code0
+[2(%elif<condition2> )]581.6 code0
+[2(    ; only appears if <condition> is not met but <condition2> is )]570.6 code0
+[2(%else )]559.6 code0
+[2(    ; this appears if neither <condition> nor <condition2> was met )]548.6 code0
+[2(%endif)]537.6 code2
+[(The inverse forms )2(%ifn)0( and )2(%elifn)0( are also supported.)]520.6 norm3
+[(The )2(%else)0( clause is optional, as is the )2(%elif)0( clause. You can have more than one )2(%elif)0( clause as well.)]503.6 norm3
+[(There are a number of variants of the )2(%if)0( directive. Each has its corresponding )2(%elif)0(, )2(%ifn)0(, and )2(%elifn)]486.6 norm1
+[(directives; for example, the equivalents to the )2(%ifdef)0( directive are )2(%elifdef)0(, )2(%ifndef)0(, and)]475.6 norm0
+[2(%elifndef)0(.)]464.6 norm2
+[{/section-4.4.1 xa}2(%ifdef)0(: Testing Single-Line Macro Existence)](4.4.1)445.4 subh3
+[(Beginning a conditional-assembly block with the line )2(%ifdef MACRO)0( will assemble the subsequent code if,)]428.4 norm1
+[(and only if, a single-line macro called )2(MACRO)0( is defined. If not, then the )2(%elif)0( and )2(%else)0( blocks \(if any\))]417.4 norm0
+[(will be processed instead.)]406.4 norm2
+[(For example, when debugging a program, you might want to write code such as)]389.4 norm3
+[2(          ; perform some function )]372.4 code1
+[2(%ifdef DEBUG )]361.4 code0
+[2(          writefile 2,"Function performed successfully",13,10 )]350.4 code0
+[2(%endif )]339.4 code0
+[2(          ; go and do something else)]328.4 code2
+[(Then you could use the command-line option )2(-dDEBUG)0( to create a version of the program which produced)]311.4 norm1
+[(debugging messages, and remove the option to generate the final release version of the program.)]300.4 norm2
+[(You can test for a macro )1(not)0( being defined by using )2(%ifndef)0( instead of )2(%ifdef)0(. You can also test for)]283.4 norm1
+[(macro definitions in )2(%elif)0( blocks by using )2(%elifdef)0( and )2(%elifndef)0(.)]272.4 norm2
+[{/section-4.4.2 xa}2(%ifmacro)0(: Testing Multi-Line Macro Existence)](4.4.2)253.2 subh3
+[(The )2(%ifmacro)0( directive operates in the same way as the )2(%ifdef)0( directive, except that it checks for the)]236.2 norm1
+[(existence of a multi-line macro.)]225.2 norm2
+[(For example, you may be working with a large project and not have control over the macros in a library. You)]208.2 norm1
+[(may want to create a macro with one name if it doesn't already exist, and another name if one with that name)]197.2 norm0
+[(does exist.)]186.2 norm2
+[(The )2(%ifmacro)0( is considered true if defining a macro with the given name and number of arguments would)]169.2 norm1
+[(cause a definitions conflict. For example:)]158.2 norm2
+[2(%ifmacro MyMacro 1-3 )]141.2 code1
+[2()]130.2 code0
+[2(     %error "MyMacro 1-3" causes a conflict with an existing macro. )]119.2 code0
+[2()]108.2 code0
+(49)pageodd
+restore showpage
+%%Page: 50 50
+%%BeginPageSetup
+save
+%%EndPageSetup
+/50 pa
+[2(%else )]681 code0
+[2()]670 code0
+[2(     %macro MyMacro 1-3 )]659 code0
+[2()]648 code0
+[2(             ; insert code to define the macro )]637 code0
+[2()]626 code0
+[2(     %endmacro )]615 code0
+[2()]604 code0
+[2(%endif)]593 code2
+[(This will create the macro "MyMacro 1-3" if no macro already exists which would conflict with it, and emits)]576 norm1
+[(a warning if there would be a definition conflict.)]565 norm2
+[(You can test for the macro not existing by using the )2(%ifnmacro)0( instead of )2(%ifmacro)0(. Additional tests can)]548 norm1
+[(be performed in )2(%elif)0( blocks by using )2(%elifmacro)0( and )2(%elifnmacro)0(.)]537 norm2
+[{/section-4.4.3 xa}2(%ifctx)0(: Testing the Context Stack)](4.4.3)517.8 subh3
+[(The conditional-assembly construct )2(%ifctx)0( will cause the subsequent code to be assembled if and only if)]500.8 norm1
+[(the top context on the preprocessor's context stack has the same name as one of the arguments. As with)]489.8 norm0
+[2(%ifdef)0(, the inverse and )2(%elif)0( forms )2(%ifnctx)0(, )2(%elifctx)0( and )2(%elifnctx)0( are also supported.)]478.8 norm2
+[(For more details of the context stack, see ){/section-4.7 xl}(section 4.7){el}(. For a sample use of )2(%ifctx)0(, see ){/section-4.7.5 xl}(section 4.7.5){el}(.)]461.8 norm3
+[{/section-4.4.4 xa}2(%if)0(: Testing Arbitrary Numeric Expressions)](4.4.4)442.6 subh3
+[(The conditional-assembly construct )2(%if expr)0( will cause the subsequent code to be assembled if and only if)]425.6 norm1
+[(the value of the numeric expression )2(expr)0( is non-zero. An example of the use of this feature is in deciding)]414.6 norm0
+[(when to break out of a )2(%rep)0( preprocessor loop: see ){/section-4.5 xl}(section 4.5){el}( for a detailed example.)]403.6 norm2
+[(The expression given to )2(%if)0(, and its counterpart )2(%elif)0(, is a critical expression \(see ){/section-3.8 xl}(section 3.8){el}(\).)]386.6 norm3
+[2(%if)0( extends the normal NASM expression syntax, by providing a set of )(relational operators which are not)]369.6 norm1
+[(normally available in expressions. The operators )2(=)0(, )2(<)0(, )2(>)0(, )2(<=)0(, )2(>=)0( and )2(<>)0( test equality, less-than, greater-than,)]358.6 norm0
+[(less-or-equal, greater-or-equal and not-equal respectively. The C-like forms )2(==)0( and )2(!=)0( are supported as)]347.6 norm0
+[(alternative forms of )2(=)0( and )2(<>)0(. In addition, low-priority logical operators )2(&&)0(, )2(^^)0( and )2(||)0( are provided,)]336.6 norm0
+[(supplying )(logical AND, )(logical XOR and )(logical OR. These work like the C logical operators \(although C has)]325.6 norm0
+[(no logical XOR\), in that they always return either 0 or 1, and treat any non-zero input as 1 \(so that )2(^^)0(, for)]314.6 norm0
+[(example, returns 1 if exactly one of its inputs is zero, and 0 otherwise\). The relational operators also return 1)]303.6 norm0
+[(for true and 0 for false.)]292.6 norm2
+[(Like other )2(%if)0( constructs, )2(%if)0( has a counterpart )2(%elif)0(, and negative forms )2(%ifn)0( and )2(%elifn)0(.)]275.6 norm3
+[{/section-4.4.5 xa}2(%ifidn)0( and )2(%ifidni)0(: Testing Exact Text Identity)](4.4.5)256.4 subh3
+[(The construct )2(%ifidn text1,text2)0( will cause the subsequent code to be assembled if and only if)]239.4 norm1
+[2(text1)0( and )2(text2)0(, after expanding single-line macros, are identical pieces of text. Differences in white)]228.4 norm0
+[(space are not counted.)]217.4 norm2
+[2(%ifidni)0( is similar to )2(%ifidn)0(, but is )(case-insensitive.)]200.4 norm3
+[(For example, the following macro pushes a register or number on the stack, and allows you to treat )2(IP)0( as a)]183.4 norm1
+[(real register:)]172.4 norm2
+[2(%macro  pushparam 1 )]155.4 code1
+[2()]144.4 code0
+[2(  %ifidni %1,ip )]133.4 code0
+[2(        call    %%label )]122.4 code0
+[2(  %%label: )]111.4 code0
+[2(  %else )]100.4 code0
+(50)pageeven
+restore showpage
+%%Page: 51 51
+%%BeginPageSetup
+save
+%%EndPageSetup
+/51 pa
+[2(        push    %1 )]681 code0
+[2(  %endif )]670 code0
+[2()]659 code0
+[2(%endmacro)]648 code2
+[(Like other )2(%if)0( constructs, )2(%ifidn)0( has a counterpart )2(%elifidn)0(, and negative forms )2(%ifnidn)0( and)]631 norm1
+[2(%elifnidn)0(. Similarly, )2(%ifidni)0( has counterparts )2(%elifidni)0(, )2(%ifnidni)0( and )2(%elifnidni)0(.)]620 norm2
+[{/section-4.4.6 xa}2(%ifid)0(, )2(%ifnum)0(, )2(%ifstr)0(: Testing Token Types)](4.4.6)600.8 subh3
+[(Some macros will want to perform different tasks depending on whether they are passed a number, a string, or)]583.8 norm1
+[(an identifier. For example, a string output macro might want to be able to cope with being passed either a)]572.8 norm0
+[(string constant or a pointer to an existing string.)]561.8 norm2
+[(The conditional assembly construct )2(%ifid)0(, taking one parameter \(which may be blank\), assembles the)]544.8 norm1
+[(subsequent code if and only if the first token in the parameter exists and is an identifier. )2(%ifnum)0( works)]533.8 norm0
+[(similarly, but tests for the token being a numeric constant; )2(%ifstr)0( tests for it being a string.)]522.8 norm2
+[(For example, the )2(writefile)0( macro defined in ){/section-4.3.4 xl}(section 4.3.4){el}( can be extended to take advantage of )2(%ifstr)]505.8 norm1
+[(in the following fashion:)]494.8 norm2
+[2(%macro writefile 2-3+ )]477.8 code1
+[2()]466.8 code0
+[2(  %ifstr %2 )]455.8 code0
+[2(        jmp     %%endstr )]444.8 code0
+[2(    %if %0 = 3 )]433.8 code0
+[2(      %%str:    db      %2,%3 )]422.8 code0
+[2(    %else )]411.8 code0
+[2(      %%str:    db      %2 )]400.8 code0
+[2(    %endif )]389.8 code0
+[2(      %%endstr: mov     dx,%%str )]378.8 code0
+[2(                mov     cx,%%endstr-%%str )]367.8 code0
+[2(  %else )]356.8 code0
+[2(                mov     dx,%2 )]345.8 code0
+[2(                mov     cx,%3 )]334.8 code0
+[2(  %endif )]323.8 code0
+[2(                mov     bx,%1 )]312.8 code0
+[2(                mov     ah,0x40 )]301.8 code0
+[2(                int     0x21 )]290.8 code0
+[2()]279.8 code0
+[2(%endmacro)]268.8 code2
+[(Then the )2(writefile)0( macro can cope with being called in either of the following two ways:)]251.8 norm3
+[2(        writefile [file], strpointer, length )]234.8 code1
+[2(        writefile [file], "hello", 13, 10)]223.8 code2
+[(In the first, )2(strpointer)0( is used as the address of an already-declared string, and )2(length)0( is used as its)]206.8 norm1
+[(length; in the second, a string is given to the macro, which therefore declares it itself and works out the)]195.8 norm0
+[(address and length for itself.)]184.8 norm2
+[(Note the use of )2(%if)0( inside the )2(%ifstr)0(: this is to detect whether the macro was passed two arguments \(so the)]167.8 norm1
+[(string would be a single string constant, and )2(db %2)0( would be adequate\) or more \(in which case, all but the)]156.8 norm0
+[(first two would be lumped together into )2(%3)0(, and )2(db %2,%3)0( would be required\).)]145.8 norm2
+[(The usual )2(%elif)0(..., )2(%ifn)0(..., and )2(%elifn)0(... versions exist for each of )2(%ifid)0(, )2(%ifnum)0( and )2(%ifstr)0(.)]128.8 norm3
+(51)pageodd
+restore showpage
+%%Page: 52 52
+%%BeginPageSetup
+save
+%%EndPageSetup
+/52 pa
+[{/section-4.4.7 xa}2(%iftoken)0(: Test for a Single Token)](4.4.7)678.8 subh3
+[(Some macros will want to do different things depending on if it is passed a single token \(e.g. paste it to)]661.8 norm1
+[(something else using )2(%+)0(\) versus a multi-token sequence.)]650.8 norm2
+[(The conditional assembly construct )2(%iftoken)0( assembles the subsequent code if and only if the expanded)]633.8 norm1
+[(parameters consist of exactly one token, possibly surrounded by whitespace.)]622.8 norm2
+[(For example:)]605.8 norm3
+[2(%iftoken 1)]588.8 code3
+[(will assemble the subsequent code, but)]571.8 norm3
+[2(%iftoken -1)]554.8 code3
+[(will not, since )2(-1)0( contains two tokens: the unary minus operator )2(-)0(, and the number )2(1)0(.)]537.8 norm3
+[(The usual )2(%eliftoken)0(, )2(%ifntoken)0(, and )2(%elifntoken)0( variants are also provided.)]520.8 norm3
+[{/section-4.4.8 xa}2(%ifempty)0(: Test for Empty Expansion)](4.4.8)501.6 subh3
+[(The conditional assembly construct )2(%ifempty)0( assembles the subsequent code if and only if the expanded)]484.6 norm1
+[(parameters do not contain any tokens at all, whitespace excepted.)]473.6 norm2
+[(The usual )2(%elifempty)0(, )2(%ifnempty)0(, and )2(%elifnempty)0( variants are also provided.)]456.6 norm3
+[{/section-4.5 xa}(Preprocessor Loops)(: )2(%rep)](4.5)435.2 head3
+[(NASM's )2(TIMES)0( prefix, though useful, cannot be used to invoke a multi-line macro multiple times, because)]418.2 norm1
+[(it is processed by NASM after macros have already been expanded. Therefore NASM provides another form)]407.2 norm0
+[(of loop, this time at the preprocessor level: )2(%rep)0(.)]396.2 norm2
+[(The directives )2(%rep)0( and )2(%endrep)0( \()2(%rep)0( takes a numeric argument, which can be an expression; )2(%endrep)]379.2 norm1
+[(takes no arguments\) can be used to enclose a chunk of code, which is then replicated as many times as)]368.2 norm0
+[(specified by the preprocessor:)]357.2 norm2
+[2(%assign i 0 )]340.2 code1
+[2(%rep    64 )]329.2 code0
+[2(        inc     word [table+2*i] )]318.2 code0
+[2(%assign i i+1 )]307.2 code0
+[2(%endrep)]296.2 code2
+[(This will generate a sequence of 64 )2(INC)0( instructions, incrementing every word of memory from )2([table])0( to)]279.2 norm1
+[2([table+126])0(.)]268.2 norm2
+[(For more complex termination conditions, or to break out of a repeat loop part way along, you can use the)]251.2 norm1
+[2(%exitrep)0( directive to terminate the loop, like this:)]240.2 norm2
+[2(fibonacci: )]223.2 code1
+[2(%assign i 0 )]212.2 code0
+[2(%assign j 1 )]201.2 code0
+[2(%rep 100 )]190.2 code0
+[2(%if j > 65535 )]179.2 code0
+[2(    %exitrep )]168.2 code0
+[2(%endif )]157.2 code0
+[2(        dw j )]146.2 code0
+[2(%assign k j+i )]135.2 code0
+[2(%assign i j )]124.2 code0
+[2(%assign j k )]113.2 code0
+[2(%endrep )]102.2 code0
+(52)pageeven
+restore showpage
+%%Page: 53 53
+%%BeginPageSetup
+save
+%%EndPageSetup
+/53 pa
+[2()]681 code0
+[2(fib_number equ \($-fibonacci\)/2)]670 code2
+[(This produces a list of all the Fibonacci numbers that will fit in 16 bits. Note that a maximum repeat count)]653 norm1
+[(must still be given to )2(%rep)0(. This is to prevent the possibility of NASM getting into an infinite loop in the)]642 norm0
+[(preprocessor, which \(on multitasking or multi-user systems\) would typically cause all the system memory to)]631 norm0
+[(be gradually used up and other applications to start crashing.)]620 norm2
+[{/section-4.6 xa}(Source Files and Dependencies)](4.6)598.6 head3
+[(These commands allow you to split your sources into multiple files.)]581.6 norm3
+[{/section-4.6.1 xa}2(%include)0(: )(Including Other Files)](4.6.1)562.4 subh3
+[(Using, once again, a very similar syntax to the C preprocessor, NASM's preprocessor lets you include other)]545.4 norm1
+[(source files into your code. This is done by the use of the )2(%include)0( directive:)]534.4 norm2
+[2(%include "macros.mac")]517.4 code3
+[(will include the contents of the file )2(macros.mac)0( into the source file containing the )2(%include)0( directive.)]500.4 norm3
+[(Include files are )(searched for in the current directory \(the directory you're in when you run NASM, as)]483.4 norm1
+[(opposed to the location of the NASM executable or the location of the source file\), plus any directories)]472.4 norm0
+[(specified on the NASM command line using the )2(-i)0( option.)]461.4 norm2
+[(The standard C idiom for preventing a file being included more than once is just as applicable in NASM: if)]444.4 norm1
+[(the file )2(macros.mac)0( has the form)]433.4 norm2
+[2(%ifndef MACROS_MAC )]416.4 code1
+[2(    %define MACROS_MAC )]405.4 code0
+[2(    ; now define some macros )]394.4 code0
+[2(%endif)]383.4 code2
+[(then including the file more than once will not cause errors, because the second time the file is included)]366.4 norm1
+[(nothing will happen because the macro )2(MACROS_MAC)0( will already be defined.)]355.4 norm2
+[(You can force a file to be included even if there is no )2(%include)0( directive that explicitly includes it, by using)]338.4 norm1
+[(the )2(-p)0( option on the NASM command line \(see ){/section-2.1.17 xl}(section 2.1.17){el}(\).)]327.4 norm2
+[{/section-4.6.2 xa}2(%pathsearch)0(: Search the Include Path)](4.6.2)308.2 subh3
+[(The )2(%pathsearch)0( directive takes a single-line macro name and a filename, and declare or redefines the)]291.2 norm1
+[(specified single-line macro to be the include-path-resolved version of the filename, if the file exists)]280.2 norm0
+[(\(otherwise, it is passed unchanged.\))]269.2 norm2
+[(For example,)]252.2 norm3
+[2(%pathsearch MyFoo "foo.bin")]235.2 code3
+[(... with )2(-Ibins/)0( in the include path may end up defining the macro )2(MyFoo)0( to be )2("bins/foo.bin")0(.)]218.2 norm3
+[{/section-4.6.3 xa}2(%depend)0(: Add Dependent Files)](4.6.3)199 subh3
+[(The )2(%depend)0( directive takes a filename and adds it to the list of files to be emitted as dependency generation)]182 norm1
+[(when the )2(-M)0( options and its relatives \(see ){/section-2.1.4 xl}(section 2.1.4){el}(\) are used. It produces no output.)]171 norm2
+[(This is generally used in conjunction with )2(%pathsearch)0(. For example, a simplified version of the standard)]154 norm1
+[(macro wrapper for the )2(INCBIN)0( directive looks like:)]143 norm2
+[2(%imacro incbin 1-2+ 0 )]126 code1
+[2(%pathsearch dep %1 )]115 code0
+[2(%depend dep )]104 code0
+(53)pageodd
+restore showpage
+%%Page: 54 54
+%%BeginPageSetup
+save
+%%EndPageSetup
+/54 pa
+[2(        incbin dep,%2 )]681 code0
+[2(%endmacro)]670 code2
+[(This first resolves the location of the file into the macro )2(dep)0(, then adds it to the dependency lists, and finally)]653 norm1
+[(issues the assembler-level )2(INCBIN)0( directive.)]642 norm2
+[{/section-4.6.4 xa}2(%use)0(: Include Standard Macro Package)](4.6.4)622.8 subh3
+[(The )2(%use)0( directive is similar to )2(%include)0(, but rather than including the contents of a file, it includes a)]605.8 norm1
+[(named standard macro package. The standard macro packages are part of NASM, and are described in ){/chapter-5 xl}(chapter){el}]594.8 norm0
+[{/chapter-5 xl}(5){el}(.)]583.8 norm2
+[(Unlike the )2(%include)0( directive, package names for the )2(%use)0( directive do not require quotes, but quotes are)]566.8 norm1
+[(permitted. In NASM 2.04 and 2.05 the unquoted form would be macro-expanded; this is no longer true. Thus,)]555.8 norm0
+[(the following lines are equivalent:)]544.8 norm2
+[2(%use altreg )]527.8 code1
+[2(%use 'altreg')]516.8 code2
+[(Standard macro packages are protected from multiple inclusion. When a standard macro package is used, a)]499.8 norm1
+[(testable single-line macro of the form )2(__USE_)1(package)2(__)0( is also defined, see ){/section-4.11.8 xl}(section 4.11.8){el}(.)]488.8 norm2
+[{/section-4.7 xa}(The )(Context Stack)](4.7)467.4 head3
+[(Having labels that are local to a macro definition is sometimes not quite powerful enough: sometimes you)]450.4 norm1
+[(want to be able to share labels between several macro calls. An example might be a )2(REPEAT)0( ... )2(UNTIL)0( loop,)]439.4 norm0
+[(in which the expansion of the )2(REPEAT)0( macro would need to be able to refer to a label which the )2(UNTIL)]428.4 norm0
+[(macro had defined. However, for such a macro you would also want to be able to nest these loops.)]417.4 norm2
+[(NASM provides this level of power by means of a )1(context stack)0(. The preprocessor maintains a stack of)]400.4 norm1
+[1(contexts)0(, each of which is characterized by a name. You add a new context to the stack using the )2(%push)]389.4 norm0
+[(directive, and remove one using )2(%pop)0(. You can define labels that are local to a particular context on the stack.)]378.4 norm2
+[{/section-4.7.1 xa}2(%push)0( and )2(%pop)0(: )(Creating and Removing Contexts)](4.7.1)359.2 subh3
+[(The )2(%push)0( directive is used to create a new context and place it on the top of the context stack. )2(%push)0( takes)]342.2 norm1
+[(an optional argument, which is the name of the context. For example:)]331.2 norm2
+[2(%push    foobar)]314.2 code3
+[(This pushes a new context called )2(foobar)0( on the stack. You can have several contexts on the stack with the)]297.2 norm1
+[(same name: they can still be distinguished. If no name is given, the context is unnamed \(this is normally used)]286.2 norm0
+[(when both the )2(%push)0( and the )2(%pop)0( are inside a single macro definition.\))]275.2 norm2
+[(The directive )2(%pop)0(, taking one optional argument, removes the top context from the context stack and)]258.2 norm1
+[(destroys it, along with any labels associated with it. If an argument is given, it must match the name of the)]247.2 norm0
+[(current context, otherwise it will issue an error.)]236.2 norm2
+[{/section-4.7.2 xa}(Context-Local Labels)](4.7.2)217 subh3
+[(Just as the usage )2(%%foo)0( defines a label which is local to the particular macro call in which it is used, the)]200 norm1
+[(usage )2(%$foo)0( is used to define a label which is local to the context on the top of the context stack. So the)]189 norm0
+[2(REPEAT)0( and )2(UNTIL)0( example given above could be implemented by means of:)]178 norm2
+[2(%macro repeat 0 )]161 code1
+[2()]150 code0
+[2(    %push   repeat )]139 code0
+[2(    %$begin: )]128 code0
+[2()]117 code0
+[2(%endmacro )]106 code0
+(54)pageeven
+restore showpage
+%%Page: 55 55
+%%BeginPageSetup
+save
+%%EndPageSetup
+/55 pa
+[2()]681 code0
+[2(%macro until 1 )]670 code0
+[2()]659 code0
+[2(        j%-1    %$begin )]648 code0
+[2(    %pop )]637 code0
+[2()]626 code0
+[2(%endmacro)]615 code2
+[(and invoked by means of, for example,)]598 norm3
+[2(        mov     cx,string )]581 code1
+[2(        repeat )]570 code0
+[2(        add     cx,3 )]559 code0
+[2(        scasb )]548 code0
+[2(        until   e)]537 code2
+[(which would scan every fourth byte of a string in search of the byte in )2(AL)0(.)]520 norm3
+[(If you need to define, or access, labels local to the context )1(below)0( the top one on the stack, you can use)]503 norm1
+[2(%$$foo)0(, or )2(%$$$foo)0( for the context below that, and so on.)]492 norm2
+[{/section-4.7.3 xa}(Context-Local Single-Line Macros)](4.7.3)472.8 subh3
+[(NASM also allows you to define single-line macros which are local to a particular context, in just the same)]455.8 norm1
+[(way:)]444.8 norm2
+[2(%define %$localmac 3)]427.8 code3
+[(will define the single-line macro )2(%$localmac)0( to be local to the top context on the stack. Of course, after a)]410.8 norm1
+[(subsequent )2(%push)0(, it can then still be accessed by the name )2(%$$localmac)0(.)]399.8 norm2
+[{/section-4.7.4 xa}2(%repl)0(: )(Renaming a Context)](4.7.4)380.6 subh3
+[(If you need to change the name of the top context on the stack \(in order, for example, to have it respond)]363.6 norm1
+[(differently to )2(%ifctx)0(\), you can execute a )2(%pop)0( followed by a )2(%push)0(; but this will have the side effect of)]352.6 norm0
+[(destroying all context-local labels and macros associated with the context that was just popped.)]341.6 norm2
+[(NASM provides the directive )2(%repl)0(, which )1(replaces)0( a context with a different name, without touching the)]324.6 norm1
+[(associated macros and labels. So you could replace the destructive code)]313.6 norm2
+[2(%pop )]296.6 code1
+[2(%push   newname)]285.6 code2
+[(with the non-destructive version )2(%repl newname)0(.)]268.6 norm3
+[{/section-4.7.5 xa}(Example Use of the )(Context Stack: )(Block IFs)](4.7.5)249.4 subh3
+[(This example makes use of almost all the context-stack features, including the conditional-assembly)]232.4 norm1
+[(construct )2(%ifctx)0(, to implement a block IF statement as a set of macros.)]221.4 norm2
+[2(%macro if 1 )]204.4 code1
+[2()]193.4 code0
+[2(    %push if )]182.4 code0
+[2(    j%-1  %$ifnot )]171.4 code0
+[2()]160.4 code0
+[2(%endmacro )]149.4 code0
+[2()]138.4 code0
+[2(%macro else 0 )]127.4 code0
+[2()]116.4 code0
+[2(  %ifctx if )]105.4 code0
+(55)pageodd
+restore showpage
+%%Page: 56 56
+%%BeginPageSetup
+save
+%%EndPageSetup
+/56 pa
+[2(        %repl   else )]681 code0
+[2(        jmp     %$ifend )]670 code0
+[2(        %$ifnot: )]659 code0
+[2(  %else )]648 code0
+[2(        %error  "expected `if' before `else'" )]637 code0
+[2(  %endif )]626 code0
+[2()]615 code0
+[2(%endmacro )]604 code0
+[2()]593 code0
+[2(%macro endif 0 )]582 code0
+[2()]571 code0
+[2(  %ifctx if )]560 code0
+[2(        %$ifnot: )]549 code0
+[2(        %pop )]538 code0
+[2(  %elifctx      else )]527 code0
+[2(        %$ifend: )]516 code0
+[2(        %pop )]505 code0
+[2(  %else )]494 code0
+[2(        %error  "expected `if' or `else' before `endif'" )]483 code0
+[2(  %endif )]472 code0
+[2()]461 code0
+[2(%endmacro)]450 code2
+[(This code is more robust than the )2(REPEAT)0( and )2(UNTIL)0( macros given in ){/section-4.7.2 xl}(section 4.7.2){el}(, because it uses)]433 norm1
+[(conditional assembly to check that the macros are issued in the right order \(for example, not calling )2(endif)]422 norm0
+[(before )2(if)0(\) and issues a )2(%error)0( if they're not.)]411 norm2
+[(In addition, the )2(endif)0( macro has to be able to cope with the two distinct cases of either directly following an)]394 norm1
+[2(if)0(, or following an )2(else)0(. It achieves this, again, by using conditional assembly to do different things)]383 norm0
+[(depending on whether the context on top of the stack is )2(if)0( or )2(else)0(.)]372 norm2
+[(The )2(else)0( macro has to preserve the context on the stack, in order to have the )2(%$ifnot)0( referred to by the )2(if)]355 norm1
+[(macro be the same as the one defined by the )2(endif)0( macro, but has to change the context's name so that)]344 norm0
+[2(endif)0( will know there was an intervening )2(else)0(. It does this by the use of )2(%repl)0(.)]333 norm2
+[(A sample usage of these macros might look like:)]316 norm3
+[2(        cmp     ax,bx )]299 code1
+[2()]288 code0
+[2(        if ae )]277 code0
+[2(               cmp     bx,cx )]266 code0
+[2()]255 code0
+[2(               if ae )]244 code0
+[2(                       mov     ax,cx )]233 code0
+[2(               else )]222 code0
+[2(                       mov     ax,bx )]211 code0
+[2(               endif )]200 code0
+[2()]189 code0
+[2(        else )]178 code0
+[2(               cmp     ax,cx )]167 code0
+[2()]156 code0
+[2(               if ae )]145 code0
+[2(                       mov     ax,cx )]134 code0
+[2(               endif )]123 code0
+[2()]112 code0
+[2(        endif)]101 code2
+(56)pageeven
+restore showpage
+%%Page: 57 57
+%%BeginPageSetup
+save
+%%EndPageSetup
+/57 pa
+[(The block-)2(IF)0( macros handle nesting quite happily, by means of pushing another context, describing the inner)]681 norm1
+[2(if)0(, on top of the one describing the outer )2(if)0(; thus )2(else)0( and )2(endif)0( always refer to the last unmatched )2(if)]670 norm0
+[(or )2(else)0(.)]659 norm2
+[{/section-4.8 xa}(Stack Relative Preprocessor Directives)](4.8)637.6 head3
+[(The following preprocessor directives provide a way to use labels to refer to local variables allocated on the)]620.6 norm1
+[(stack.)]609.6 norm2
+[2(%arg)0( \(see ){/section-4.8.1 xl}(section 4.8.1){el}(\))]592.6 bull3
+[2(%stacksize)0( \(see ){/section-4.8.2 xl}(section 4.8.2){el}(\))]575.6 bull3
+[2(%local)0( \(see ){/section-4.8.3 xl}(section 4.8.3){el}(\))]558.6 bull3
+[{/section-4.8.1 xa}2(%arg)0( Directive)](4.8.1)539.4 subh3
+[(The )2(%arg)0( directive is used to simplify the handling of parameters passed on the stack. Stack based parameter)]522.4 norm1
+[(passing is used by many high level languages, including C, C++ and Pascal.)]511.4 norm2
+[(While NASM has macros which attempt to duplicate this functionality \(see ){/section-8.4.5 xl}(section 8.4.5){el}(\), the syntax is not)]494.4 norm1
+[(particularly convenient to use. and is not TASM compatible. Here is an example which shows the use of)]483.4 norm0
+[2(%arg)0( without any external macros:)]472.4 norm2
+[2(some_function: )]455.4 code1
+[2()]444.4 code0
+[2(    %push     mycontext        ; save the current context )]433.4 code0
+[2(    %stacksize large           ; tell NASM to use bp )]422.4 code0
+[2(    %arg      i:word, j_ptr:word )]411.4 code0
+[2()]400.4 code0
+[2(        mov     ax,[i] )]389.4 code0
+[2(        mov     bx,[j_ptr] )]378.4 code0
+[2(        add     ax,[bx] )]367.4 code0
+[2(        ret )]356.4 code0
+[2()]345.4 code0
+[2(    %pop                       ; restore original context)]334.4 code2
+[(This is similar to the procedure defined in ){/section-8.4.5 xl}(section 8.4.5){el}( and adds the value in i to the value pointed to by j_ptr)]317.4 norm1
+[(and returns the sum in the ax register. See ){/section-4.7.1 xl}(section 4.7.1){el}( for an explanation of )2(push)0( and )2(pop)0( and the use of)]306.4 norm0
+[(context stacks.)]295.4 norm2
+[{/section-4.8.2 xa}2(%stacksize)0( Directive)](4.8.2)276.2 subh3
+[(The )2(%stacksize)0( directive is used in conjunction with the )2(%arg)0( \(see ){/section-4.8.1 xl}(section 4.8.1){el}(\) and the )2(%local)0( \(see)]259.2 norm1
+[{/section-4.8.3 xl}(section 4.8.3){el}(\) directives. It tells NASM the default size to use for subsequent )2(%arg)0( and )2(%local)0( directives.)]248.2 norm0
+[(The )2(%stacksize)0( directive takes one required argument which is one of )2(flat)0(, )2(flat64)0(, )2(large)0( or )2(small)0(.)]237.2 norm2
+[2(%stacksize flat)]220.2 code3
+[(This form causes NASM to use stack-based parameter addressing relative to )2(ebp)0( and it assumes that a near)]203.2 norm1
+[(form of call was used to get to this label \(i.e. that )2(eip)0( is on the stack\).)]192.2 norm2
+[2(%stacksize flat64)]175.2 code3
+[(This form causes NASM to use stack-based parameter addressing relative to )2(rbp)0( and it assumes that a near)]158.2 norm1
+[(form of call was used to get to this label \(i.e. that )2(rip)0( is on the stack\).)]147.2 norm2
+[2(%stacksize large)]130.2 code3
+[(This form uses )2(bp)0( to do stack-based parameter addressing and assumes that a far form of call was used to get)]113.2 norm1
+[(to this address \(i.e. that )2(ip)0( and )2(cs)0( are on the stack\).)]102.2 norm2
+(57)pageodd
+restore showpage
+%%Page: 58 58
+%%BeginPageSetup
+save
+%%EndPageSetup
+/58 pa
+[2(%stacksize small)]681 code3
+[(This form also uses )2(bp)0( to address stack parameters, but it is different from )2(large)0( because it also assumes)]664 norm1
+[(that the old value of bp is pushed onto the stack \(i.e. it expects an )2(ENTER)0( instruction\). In other words, it)]653 norm0
+[(expects that )2(bp)0(, )2(ip)0( and )2(cs)0( are on the top of the stack, underneath any local space which may have been)]642 norm0
+[(allocated by )2(ENTER)0(. This form is probably most useful when used in combination with the )2(%local)0( directive)]631 norm0
+[(\(see ){/section-4.8.3 xl}(section 4.8.3){el}(\).)]620 norm2
+[{/section-4.8.3 xa}2(%local)0( Directive)](4.8.3)600.8 subh3
+[(The )2(%local)0( directive is used to simplify the use of local temporary stack variables allocated in a stack)]583.8 norm1
+[(frame. Automatic local variables in C are an example of this kind of variable. The )2(%local)0( directive is most)]572.8 norm0
+[(useful when used with the )2(%stacksize)0( \(see ){/section-4.8.2 xl}(section 4.8.2){el}( and is also compatible with the )2(%arg)0( directive)]561.8 norm0
+[(\(see ){/section-4.8.1 xl}(section 4.8.1){el}(\). It allows simplified reference to variables on the stack which have been allocated typically)]550.8 norm0
+[(by using the )2(ENTER)0( instruction. An example of its use is the following:)]539.8 norm2
+[2(silly_swap: )]522.8 code1
+[2()]511.8 code0
+[2(    %push mycontext             ; save the current context )]500.8 code0
+[2(    %stacksize small            ; tell NASM to use bp )]489.8 code0
+[2(    %assign %$localsize 0       ; see text for explanation )]478.8 code0
+[2(    %local old_ax:word, old_dx:word )]467.8 code0
+[2()]456.8 code0
+[2(        enter   %$localsize,0   ; see text for explanation )]445.8 code0
+[2(        mov     [old_ax],ax     ; swap ax & bx )]434.8 code0
+[2(        mov     [old_dx],dx     ; and swap dx & cx )]423.8 code0
+[2(        mov     ax,bx )]412.8 code0
+[2(        mov     dx,cx )]401.8 code0
+[2(        mov     bx,[old_ax] )]390.8 code0
+[2(        mov     cx,[old_dx] )]379.8 code0
+[2(        leave                   ; restore old bp )]368.8 code0
+[2(        ret                     ; )]357.8 code0
+[2()]346.8 code0
+[2(    %pop                        ; restore original context)]335.8 code2
+[(The )2(%$localsize)0( variable is used internally by the )2(%local)0( directive and )1(must)0( be defined within the)]318.8 norm1
+[(current context before the )2(%local)0( directive may be used. Failure to do so will result in one expression)]307.8 norm0
+[(syntax error for each )2(%local)0( variable declared. It then may be used in the construction of an appropriately)]296.8 norm0
+[(sized ENTER instruction as shown in the example.)]285.8 norm2
+[{/section-4.9 xa}(Reporting )(User-Defined Errors: )2(%error)0(, )2(%warning)0(, )2(%fatal)](4.9)264.4 head3
+[(The preprocessor directive )2(%error)0( will cause NASM to report an error if it occurs in assembled code. So if)]247.4 norm1
+[(other users are going to try to assemble your source files, you can ensure that they define the right macros by)]236.4 norm0
+[(means of code like this:)]225.4 norm2
+[2(%ifdef F1 )]208.4 code1
+[2(    ; do some setup )]197.4 code0
+[2(%elifdef F2 )]186.4 code0
+[2(    ; do some different setup )]175.4 code0
+[2(%else )]164.4 code0
+[2(    %error "Neither F1 nor F2 was defined." )]153.4 code0
+[2(%endif)]142.4 code2
+[(Then any user who fails to understand the way your code is supposed to be assembled will be quickly warned)]125.4 norm1
+[(of their mistake, rather than having to wait until the program crashes on being run and then not knowing what)]114.4 norm0
+[(went wrong.)]103.4 norm2
+(58)pageeven
+restore showpage
+%%Page: 59 59
+%%BeginPageSetup
+save
+%%EndPageSetup
+/59 pa
+[(Similarly, )2(%warning)0( issues a warning, but allows assembly to continue:)]681 norm3
+[2(%ifdef F1 )]664 code1
+[2(    ; do some setup )]653 code0
+[2(%elifdef F2 )]642 code0
+[2(    ; do some different setup )]631 code0
+[2(%else )]620 code0
+[2(    %warning "Neither F1 nor F2 was defined, assuming F1." )]609 code0
+[2(    %define F1 )]598 code0
+[2(%endif)]587 code2
+[2(%error)0( and )2(%warning)0( are issued only on the final assembly pass. This makes them safe to use in)]570 norm1
+[(conjunction with tests that depend on symbol values.)]559 norm2
+[2(%fatal)0( terminates assembly immediately, regardless of pass. This is useful when there is no point in)]542 norm1
+[(continuing the assembly further, and doing so is likely just going to cause a spew of confusing error messages.)]531 norm2
+[(It is optional for the message string after )2(%error)0(, )2(%warning)0( or )2(%fatal)0( to be quoted. If it is )1(not)0(, then)]514 norm1
+[(single-line macros are expanded in it, which can be used to display more information to the user. For)]503 norm0
+[(example:)]492 norm2
+[2(%if foo > 64 )]475 code1
+[2(    %assign foo_over foo-64 )]464 code0
+[2(    %error foo is foo_over bytes too large )]453 code0
+[2(%endif)]442 code2
+[{/section-4.10 xa}(Other Preprocessor Directives)](4.10)420.6 head3
+[(NASM also has preprocessor directives which allow access to information from external sources. Currently)]403.6 norm1
+[(they include:)]392.6 norm2
+[2(%line)0( enables NASM to correctly handle the output of another preprocessor \(see ){/section-4.10.1 xl}(section 4.10.1){el}(\).)]375.6 bull3
+[2(%!)0( enables NASM to read in the value of an environment variable, which can then be used in your)]358.6 bull1
+[(program \(see ){/section-4.10.2 xl}(section 4.10.2){el}(\).)]347.6 bull2
+[{/section-4.10.1 xa}2(%line)0( Directive)](4.10.1)328.4 subh3
+[(The )2(%line)0( directive is used to notify NASM that the input line corresponds to a specific line number in)]311.4 norm1
+[(another file. Typically this other file would be an original source file, with the current NASM input being the)]300.4 norm0
+[(output of a pre-processor. The )2(%line)0( directive allows NASM to output messages which indicate the line)]289.4 norm0
+[(number of the original source file, instead of the file that is being read by NASM.)]278.4 norm2
+[(This preprocessor directive is not generally of use to programmers, by may be of interest to preprocessor)]261.4 norm1
+[(authors. The usage of the )2(%line)0( preprocessor directive is as follows:)]250.4 norm2
+[2(%line nnn[+mmm] [filename])]233.4 code3
+[(In this directive, )2(nnn)0( identifies the line of the original source file which this line corresponds to. )2(mmm)0( is an)]216.4 norm1
+[(optional parameter which specifies a line increment value; each line of the input file read in is considered to)]205.4 norm0
+[(correspond to )2(mmm)0( lines of the original source file. Finally, )2(filename)0( is an optional parameter which)]194.4 norm0
+[(specifies the file name of the original source file.)]183.4 norm2
+[(After reading a )2(%line)0( preprocessor directive, NASM will report all file name and line numbers relative to)]166.4 norm1
+[(the values specified therein.)]155.4 norm2
+(59)pageodd
+restore showpage
+%%Page: 60 60
+%%BeginPageSetup
+save
+%%EndPageSetup
+/60 pa
+[{/section-4.10.2 xa}2(%!<env>)0(: Read an environment variable.)](4.10.2)678.8 subh3
+[(The )2(%!<env>)0( directive makes it possible to read the value of an environment variable at assembly time. This)]661.8 norm1
+[(could, for example, be used to store the contents of an environment variable into a string, which could be used)]650.8 norm0
+[(at some other point in your code.)]639.8 norm2
+[(For example, suppose that you have an environment variable )2(FOO)0(, and you want the contents of )2(FOO)0( to be)]622.8 norm1
+[(embedded in your program. You could do that as follows:)]611.8 norm2
+[2(%defstr FOO    %!FOO)]594.8 code3
+[(See ){/section-4.1.8 xl}(section 4.1.8){el}( for notes on the )2(%defstr)0( directive.)]577.8 norm3
+[{/section-4.11 xa}(Standard Macros)](4.11)556.4 head3
+[(NASM defines a set of standard macros, which are already defined when it starts to process any source file. If)]539.4 norm1
+[(you really need a program to be assembled with no pre-defined macros, you can use the )2(%clear)0( directive to)]528.4 norm0
+[(empty the preprocessor of everything but context-local preprocessor variables and single-line macros.)]517.4 norm2
+[(Most )(user-level assembler directives \(see ){/chapter-6 xl}(chapter 6){el}(\) are implemented as macros which invoke primitive)]500.4 norm1
+[(directives; these are described in ){/chapter-6 xl}(chapter 6){el}(. The rest of the standard macro set is described here.)]489.4 norm2
+[{/section-4.11.1 xa}(NASM Version Macros)](4.11.1)470.2 subh3
+[(The single-line macros )2(__NASM_MAJOR__)0(, )2(__NASM_MINOR__)0(, )2(__NASM_SUBMINOR__)0( and)]453.2 norm1
+[2(___NASM_PATCHLEVEL__)0( expand to the major, minor, subminor and patch level parts of the )(version)]442.2 norm0
+[(number of NASM being used. So, under NASM 0.98.32p1 for example, )2(__NASM_MAJOR__)0( would be)]431.2 norm0
+[(defined to be 0, )2(__NASM_MINOR__)0( would be defined as 98, )2(__NASM_SUBMINOR__)0( would be defined to)]420.2 norm0
+[(32, and )2(___NASM_PATCHLEVEL__)0( would be defined as 1.)]409.2 norm2
+[(Additionally, the macro )2(__NASM_SNAPSHOT__)0( is defined for automatically generated snapshot releases)]392.2 norm1
+[1(only)0(.)]381.2 norm2
+[{/section-4.11.2 xa}2(__NASM_VERSION_ID__)0(: )(NASM Version ID)](4.11.2)362 subh3
+[(The single-line macro )2(__NASM_VERSION_ID__)0( expands to a dword integer representing the full version)]345 norm1
+[(number of the version of nasm being used. The value is the equivalent to )2(__NASM_MAJOR__)0(,)]334 norm0
+[2(__NASM_MINOR__)0(, )2(__NASM_SUBMINOR__)0( and )2(___NASM_PATCHLEVEL__)0( concatenated to produce a)]323 norm0
+[(single doubleword. Hence, for 0.98.32p1, the returned number would be equivalent to:)]312 norm2
+[2(        dd      0x00622001)]295 code3
+[(or)]278 norm3
+[2(        db      1,32,98,0)]261 code3
+[(Note that the above lines are generate exactly the same code, the second line is used just to give an indication)]244 norm1
+[(of the order that the separate values will be present in memory.)]233 norm2
+[{/section-4.11.3 xa}2(__NASM_VER__)0(: )(NASM Version string)](4.11.3)213.8 subh3
+[(The single-line macro )2(__NASM_VER__)0( expands to a string which defines the version number of nasm being)]196.8 norm1
+[(used. So, under NASM 0.98.32 for example,)]185.8 norm2
+[2(        db      __NASM_VER__)]168.8 code3
+[(would expand to)]151.8 norm3
+[2(        db      "0.98.32")]134.8 code3
+(60)pageeven
+restore showpage
+%%Page: 61 61
+%%BeginPageSetup
+save
+%%EndPageSetup
+/61 pa
+[{/section-4.11.4 xa}2(__FILE__)0( and )2(__LINE__)0(: File Name and Line Number)](4.11.4)678.8 subh3
+[(Like the C preprocessor, NASM allows the user to find out the file name and line number containing the)]661.8 norm1
+[(current instruction. The macro )2(__FILE__)0( expands to a string constant giving the name of the current input)]650.8 norm0
+[(file \(which may change through the course of assembly if )2(%include)0( directives are used\), and )2(__LINE__)]639.8 norm0
+[(expands to a numeric constant giving the current line number in the input file.)]628.8 norm2
+[(These macros could be used, for example, to communicate debugging information to a macro, since invoking)]611.8 norm1
+[2(__LINE__)0( inside a macro definition \(either single-line or multi-line\) will return the line number of the)]600.8 norm0
+[(macro )1(call)0(, rather than )1(definition)0(. So to determine where in a piece of code a crash is occurring, for example,)]589.8 norm0
+[(one could write a routine )2(stillhere)0(, which is passed a line number in )2(EAX)0( and outputs something like)]578.8 norm0
+[(`line 155: still here'. You could then write a macro)]567.8 norm2
+[2(%macro  notdeadyet 0 )]550.8 code1
+[2()]539.8 code0
+[2(        push    eax )]528.8 code0
+[2(        mov     eax,__LINE__ )]517.8 code0
+[2(        call    stillhere )]506.8 code0
+[2(        pop     eax )]495.8 code0
+[2()]484.8 code0
+[2(%endmacro)]473.8 code2
+[(and then pepper your code with calls to )2(notdeadyet)0( until you find the crash point.)]456.8 norm3
+[{/section-4.11.5 xa}2(__BITS__)0(: Current BITS Mode)](4.11.5)437.6 subh3
+[(The )2(__BITS__)0( standard macro is updated every time that the BITS mode is set using the )2(BITS XX)0( or)]420.6 norm1
+[2([BITS XX])0( directive, where XX is a valid mode number of 16, 32 or 64. )2(__BITS__)0( receives the specified)]409.6 norm0
+[(mode number and makes it globally available. This can be very useful for those who utilize mode-dependent)]398.6 norm0
+[(macros.)]387.6 norm2
+[{/section-4.11.6 xa}2(__OUTPUT_FORMAT__)0(: Current Output Format)](4.11.6)368.4 subh3
+[(The )2(__OUTPUT_FORMAT__)0( standard macro holds the current Output Format, as given by the )2(-f)0( option or)]351.4 norm1
+[(NASM's default. Type )2(nasm -hf)0( for a list.)]340.4 norm2
+[2(%ifidn __OUTPUT_FORMAT__, win32 )]323.4 code1
+[2( %define NEWLINE 13, 10 )]312.4 code0
+[2(%elifidn __OUTPUT_FORMAT__, elf32 )]301.4 code0
+[2( %define NEWLINE 10 )]290.4 code0
+[2(%endif)]279.4 code2
+[{/section-4.11.7 xa}(Assembly Date and Time Macros)](4.11.7)260.2 subh3
+[(NASM provides a variety of macros that represent the timestamp of the assembly session.)]243.2 norm3
+[(The )2(__DATE__)0( and )2(__TIME__)0( macros give the assembly date and time as strings, in ISO 8601 format)]226.2 bull1
+[(\()2("YYYY-MM-DD")0( and )2("HH:MM:SS")0(, respectively.\))]215.2 bull2
+[(The )2(__DATE_NUM__)0( and )2(__TIME_NUM__)0( macros give the assembly date and time in numeric form; in)]198.2 bull1
+[(the format )2(YYYYMMDD)0( and )2(HHMMSS)0( respectively.)]187.2 bull2
+[(The )2(__UTC_DATE__)0( and )2(__UTC_TIME__)0( macros give the assembly date and time in universal time)]170.2 bull1
+[(\(UTC\) as strings, in ISO 8601 format \()2("YYYY-MM-DD")0( and )2("HH:MM:SS")0(, respectively.\) If the host)]159.2 bull0
+[(platform doesn't provide UTC time, these macros are undefined.)]148.2 bull2
+[(The )2(__UTC_DATE_NUM__)0( and )2(__UTC_TIME_NUM__)0( macros give the assembly date and time)]131.2 bull1
+[(universal time \(UTC\) in numeric form; in the format )2(YYYYMMDD)0( and )2(HHMMSS)0( respectively. If the host)]120.2 bull0
+[(platform doesn't provide UTC time, these macros are undefined.)]109.2 bull2
+(61)pageodd
+restore showpage
+%%Page: 62 62
+%%BeginPageSetup
+save
+%%EndPageSetup
+/62 pa
+[(The )2(__POSIX_TIME__)0( macro is defined as a number containing the number of seconds since the POSIX)]681 bull1
+[(epoch, 1 January 1970 00:00:00 UTC; excluding any leap seconds. This is computed using UTC time if)]670 bull0
+[(available on the host platform, otherwise it is computed using the local time as if it was UTC.)]659 bull2
+[(All instances of time and date macros in the same assembly session produce consistent output. For example,)]642 norm1
+[(in an assembly session started at 42 seconds after midnight on January 1, 2010 in Moscow \(timezone UTC+3\))]631 norm0
+[(these macros would have the following values, assuming, of course, a properly configured environment with a)]620 norm0
+[(correct clock:)]609 norm2
+[2(      __DATE__             "2010-01-01" )]592 code1
+[2(      __TIME__             "00:00:42" )]581 code0
+[2(      __DATE_NUM__         20100101 )]570 code0
+[2(      __TIME_NUM__         000042 )]559 code0
+[2(      __UTC_DATE__         "2009-12-31" )]548 code0
+[2(      __UTC_TIME__         "21:00:42" )]537 code0
+[2(      __UTC_DATE_NUM__     20091231 )]526 code0
+[2(      __UTC_TIME_NUM__     210042 )]515 code0
+[2(      __POSIX_TIME__       1262293242)]504 code2
+[{/section-4.11.8 xa}2(__USE_)1(package)2(__)0(: Package Include Test)](4.11.8)484.8 subh3
+[(When a standard macro package \(see ){/chapter-5 xl}(chapter 5){el}(\) is included with the )2(%use)0( directive \(see ){/section-4.6.4 xl}(section 4.6.4){el}(\), a)]467.8 norm1
+[(single-line macro of the form )2(__USE_)1(package)2(__)0( is automatically defined. This allows testing if a particular)]456.8 norm0
+[(package is invoked or not.)]445.8 norm2
+[(For example, if the )2(altreg)0( package is included \(see ){/section-5.1 xl}(section 5.1){el}(\), then the macro )2(__USE_ALTREG__)0( is)]428.8 norm1
+[(defined.)]417.8 norm2
+[{/section-4.11.9 xa}2(__PASS__)0(: Assembly Pass)](4.11.9)398.6 subh3
+[(The macro )2(__PASS__)0( is defined to be )2(1)0( on preparatory passes, and )2(2)0( on the final pass. In preprocess-only)]381.6 norm1
+[(mode, it is set to )2(3)0(, and when running only to generate dependencies \(due to the )2(-M)0( or )2(-MG)0( option, see)]370.6 norm0
+[{/section-2.1.4 xl}(section 2.1.4){el}(\) it is set to )2(0)0(.)]359.6 norm2
+[1(Avoid using this macro if at all possible. It is tremendously easy to generate very strange errors by misusing)]342.6 norm1
+[1(it, and the semantics may change in future versions of NASM.)]331.6 norm2
+[{/section-4.11.10 xa}2(STRUC)0( and )2(ENDSTRUC)0(: )(Declaring Structure Data Types)](4.11.10)312.4 subh3
+[(The core of NASM contains no intrinsic means of defining data structures; instead, the preprocessor is)]295.4 norm1
+[(sufficiently powerful that data structures can be implemented as a set of macros. The macros )2(STRUC)0( and)]284.4 norm0
+[2(ENDSTRUC)0( are used to define a structure data type.)]273.4 norm2
+[2(STRUC)0( takes one or two parameters. The first parameter is the name of the data type. The second, optional)]256.4 norm1
+[(parameter is the base offset of the structure. The name of the data type is defined as a symbol with the value)]245.4 norm0
+[(of the base offset, and the name of the data type with the suffix )2(_size)0( appended to it is defined as an )2(EQU)]234.4 norm0
+[(giving the size of the structure. Once )2(STRUC)0( has been issued, you are defining the structure, and should)]223.4 norm0
+[(define fields using the )2(RESB)0( family of pseudo-instructions, and then invoke )2(ENDSTRUC)0( to finish the)]212.4 norm0
+[(definition.)]201.4 norm2
+[(For example, to define a structure called )2(mytype)0( containing a longword, a word, a byte and a string of bytes,)]184.4 norm1
+[(you might code)]173.4 norm2
+[2(struc   mytype )]156.4 code1
+[2()]145.4 code0
+[2(  mt_long:      resd    1 )]134.4 code0
+[2(  mt_word:      resw    1 )]123.4 code0
+[2(  mt_byte:      resb    1 )]112.4 code0
+[2(  mt_str:       resb    32 )]101.4 code0
+(62)pageeven
+restore showpage
+%%Page: 63 63
+%%BeginPageSetup
+save
+%%EndPageSetup
+/63 pa
+[2()]681 code0
+[2(endstruc)]670 code2
+[(The above code defines six symbols: )2(mt_long)0( as 0 \(the offset from the beginning of a )2(mytype)0( structure to)]653 norm1
+[(the longword field\), )2(mt_word)0( as 4, )2(mt_byte)0( as 6, )2(mt_str)0( as 7, )2(mytype_size)0( as 39, and )2(mytype)0( itself)]642 norm0
+[(as zero.)]631 norm2
+[(The reason why the structure type name is defined at zero by default is a side effect of allowing structures to)]614 norm1
+[(work with the local label mechanism: if your structure members tend to have the same names in more than)]603 norm0
+[(one structure, you can define the above structure like this:)]592 norm2
+[2(struc mytype )]575 code1
+[2()]564 code0
+[2(  .long:        resd    1 )]553 code0
+[2(  .word:        resw    1 )]542 code0
+[2(  .byte:        resb    1 )]531 code0
+[2(  .str:         resb    32 )]520 code0
+[2()]509 code0
+[2(endstruc)]498 code2
+[(This defines the offsets to the structure fields as )2(mytype.long)0(, )2(mytype.word)0(, )2(mytype.byte)0( and)]481 norm1
+[2(mytype.str)0(.)]470 norm2
+[(NASM, since it has no )1(intrinsic)0( structure support, does not support any form of period notation to refer to the)]453 norm1
+[(elements of a structure once you have one \(except the above local-label notation\), so code such as)]442 norm0
+[2(mov ax,[mystruc.mt_word])0( is not valid. )2(mt_word)0( is a constant just like any other constant, so the)]431 norm0
+[(correct syntax is )2(mov ax,[mystruc+mt_word])0( or )2(mov ax,[mystruc+mytype.word])0(.)]420 norm2
+[(Sometimes you only have the address of the structure displaced by an offset. For example, consider this)]403 norm1
+[(standard stack frame setup:)]392 norm2
+[2(push ebp )]375 code1
+[2(mov ebp, esp )]364 code0
+[2(sub esp, 40)]353 code2
+[(In this case, you could access an element by subtracting the offset:)]336 norm3
+[2(mov [ebp - 40 + mytype.word], ax)]319 code3
+[(However, if you do not want to repeat this offset, you can use \22640 as a base offset:)]302 norm3
+[2(struc mytype, -40)]285 code3
+[(And access an element this way:)]268 norm3
+[2(mov [ebp + mytype.word], ax)]251 code3
+[{/section-4.11.11 xa}2(ISTRUC)0(, )2(AT)0( and )2(IEND)0(: Declaring )(Instances of Structures)](4.11.11)231.8 subh3
+[(Having defined a structure type, the next thing you typically want to do is to declare instances of that structure)]214.8 norm1
+[(in your data segment. NASM provides an easy way to do this in the )2(ISTRUC)0( mechanism. To declare a)]203.8 norm0
+[(structure of type )2(mytype)0( in a program, you code something like this:)]192.8 norm2
+[2(mystruc: )]175.8 code1
+[2(    istruc mytype )]164.8 code0
+[2()]153.8 code0
+[2(        at mt_long, dd      123456 )]142.8 code0
+[2(        at mt_word, dw      1024 )]131.8 code0
+[2(        at mt_byte, db      'x' )]120.8 code0
+[2(        at mt_str,  db      'hello, world', 13, 10, 0 )]109.8 code0
+(63)pageodd
+restore showpage
+%%Page: 64 64
+%%BeginPageSetup
+save
+%%EndPageSetup
+/64 pa
+[2()]681 code0
+[2(    iend)]670 code2
+[(The function of the )2(AT)0( macro is to make use of the )2(TIMES)0( prefix to advance the assembly position to the)]653 norm1
+[(correct point for the specified structure field, and then to declare the specified data. Therefore the structure)]642 norm0
+[(fields must be declared in the same order as they were specified in the structure definition.)]631 norm2
+[(If the data to go in a structure field requires more than one source line to specify, the remaining source lines)]614 norm1
+[(can easily come after the )2(AT)0( line. For example:)]603 norm2
+[2(        at mt_str,  db      123,134,145,156,167,178,189 )]586 code1
+[2(                    db      190,100,0)]575 code2
+[(Depending on personal taste, you can also omit the code part of the )2(AT)0( line completely, and start the structure)]558 norm1
+[(field on the next line:)]547 norm2
+[2(        at mt_str )]530 code1
+[2(                db      'hello, world' )]519 code0
+[2(                db      13,10,0)]508 code2
+[{/section-4.11.12 xa}2(ALIGN)0( and )2(ALIGNB)0(: Data Alignment)](4.11.12)488.8 subh3
+[(The )2(ALIGN)0( and )2(ALIGNB)0( macros provides a convenient way to align code or data on a word, longword,)]471.8 norm1
+[(paragraph or other boundary. \(Some assemblers call this directive )2(EVEN)0(.\) The syntax of the )2(ALIGN)0( and)]460.8 norm0
+[2(ALIGNB)0( macros is)]449.8 norm2
+[2(        align   4               ; align on 4-byte boundary )]432.8 code1
+[2(        align   16              ; align on 16-byte boundary )]421.8 code0
+[2(        align   8,db 0          ; pad with 0s rather than NOPs )]410.8 code0
+[2(        align   4,resb 1        ; align to 4 in the BSS )]399.8 code0
+[2(        alignb  4               ; equivalent to previous line)]388.8 code2
+[(Both macros require their first argument to be a power of two; they both compute the number of additional)]371.8 norm1
+[(bytes required to bring the length of the current section up to a multiple of that power of two, and then apply)]360.8 norm0
+[(the )2(TIMES)0( prefix to their second argument to perform the alignment.)]349.8 norm2
+[(If the second argument is not specified, the default for )2(ALIGN)0( is )2(NOP)0(, and the default for )2(ALIGNB)0( is)]332.8 norm1
+[2(RESB 1)0(. So if the second argument is specified, the two macros are equivalent. Normally, you can just use)]321.8 norm0
+[2(ALIGN)0( in code and data sections and )2(ALIGNB)0( in BSS sections, and never need the second argument except)]310.8 norm0
+[(for special purposes.)]299.8 norm2
+[2(ALIGN)0( and )2(ALIGNB)0(, being simple macros, perform no error checking: they cannot warn you if their first)]282.8 norm1
+[(argument fails to be a power of two, or if their second argument generates more than one byte of code. In each)]271.8 norm0
+[(of these cases they will silently do the wrong thing.)]260.8 norm2
+[2(ALIGNB)0( \(or )2(ALIGN)0( with a second argument of )2(RESB 1)0(\) can be used within structure definitions:)]243.8 norm3
+[2(struc mytype2 )]226.8 code1
+[2()]215.8 code0
+[2(  mt_byte: )]204.8 code0
+[2(        resb 1 )]193.8 code0
+[2(        alignb 2 )]182.8 code0
+[2(  mt_word: )]171.8 code0
+[2(        resw 1 )]160.8 code0
+[2(        alignb 4 )]149.8 code0
+[2(  mt_long: )]138.8 code0
+[2(        resd 1 )]127.8 code0
+[2(  mt_str: )]116.8 code0
+[2(        resb 32 )]105.8 code0
+(64)pageeven
+restore showpage
+%%Page: 65 65
+%%BeginPageSetup
+save
+%%EndPageSetup
+/65 pa
+[2()]681 code0
+[2(endstruc)]670 code2
+[(This will ensure that the structure members are sensibly aligned relative to the base of the structure.)]653 norm3
+[(A final caveat: )2(ALIGN)0( and )2(ALIGNB)0( work relative to the beginning of the )1(section)0(, not the beginning of the)]636 norm1
+[(address space in the final executable. Aligning to a 16-byte boundary when the section you're in is only)]625 norm0
+[(guaranteed to be aligned to a 4-byte boundary, for example, is a waste of effort. Again, NASM does not)]614 norm0
+[(check that the section's alignment characteristics are sensible for the use of )2(ALIGN)0( or )2(ALIGNB)0(.)]603 norm2
+[(See also the )2(smartalign)0( standard macro package, ){/section-5.2 xl}(section 5.2){el}(.)]586 norm3
+(65)pageodd
+restore showpage
+%%Page: 66 66
+%%BeginPageSetup
+save
+%%EndPageSetup
+/66 pa
+[{/chapter-5 xa}(Chapter 5: )(Standard Macro Packages)]642.8 chap3
+[(The )2(%use)0( directive \(see ){/section-4.6.4 xl}(section 4.6.4){el}(\) includes one of the standard macro packages included with the NASM)]607.8 norm1
+[(distribution and compiled into the NASM binary. It operates like the )2(%include)0( directive \(see ){/section-4.6.1 xl}(section 4.6.1){el}(\),)]596.8 norm0
+[(but the included contents is provided by NASM itself.)]585.8 norm2
+[(The names of standard macro packages are case insensitive, and can be quoted or not.)]568.8 norm3
+[{/section-5.1 xa}2(altreg)0(: )(Alternate Register Names)](5.1)547.4 head3
+[(The )2(altreg)0( standard macro package provides alternate register names. It provides numeric register names)]530.4 norm1
+[(for all registers \(not just )2(R8)0(\226)2(R15)0(\), the Intel-defined aliases )2(R8L)0(\226)2(R15L)0( for the low bytes of register \(as)]519.4 norm0
+[(opposed to the NASM/AMD standard names )2(R8B)0(\226)2(R15B)0(\), and the names )2(R0H)0(\226)2(R3H)0( \(by analogy with)]508.4 norm0
+[2(R0L)0(\226)2(R3L)0(\) for )2(AH)0(, )2(CH)0(, )2(DH)0(, and )2(BH)0(.)]497.4 norm2
+[(Example use:)]480.4 norm3
+[2(%use altreg )]463.4 code1
+[2()]452.4 code0
+[2(proc: )]441.4 code0
+[2(      mov r0l,r3h                    ; mov al,bh )]430.4 code0
+[2(      ret)]419.4 code2
+[(See also ){/section-11.1 xl}(section 11.1){el}(.)]402.4 norm3
+[{/section-5.2 xa}2(smartalign)0(: Smart )2(ALIGN)0( Macro)](5.2)381 head3
+[(The )2(smartalign)0( standard macro package provides for an )2(ALIGN)0( macro which is more powerful than the)]364 norm1
+[(default \(and backwards-compatible\) one \(see ){/section-4.11.12 xl}(section 4.11.12){el}(\). When the )2(smartalign)0( package is enabled,)]353 norm0
+[(when )2(ALIGN)0( is used without a second argument, NASM will generate a sequence of instructions more)]342 norm0
+[(efficient than a series of )2(NOP)0(. Furthermore, if the padding exceeds a specific threshold, then NASM will)]331 norm0
+[(generate a jump over the entire padding sequence.)]320 norm2
+[(The specific instructions generated can be controlled with the new )2(ALIGNMODE)0( macro. This macro takes two)]303 norm1
+[(parameters: one mode, and an optional jump threshold override. The modes are as follows:)]292 norm2
+[2(generic)0(: Works on all x86 CPUs and should have reasonable performance. The default jump threshold)]275 bull1
+[(is 8. This is the default.)]264 bull2
+[2(nop)0(: Pad out with )2(NOP)0( instructions. The only difference compared to the standard )2(ALIGN)0( macro is that)]247 bull1
+[(NASM can still jump over a large padding area. The default jump threshold is 16.)]236 bull2
+[2(k7)0(: Optimize for the AMD K7 \(Athlon/Althon XP\). These instructions should still work on all x86 CPUs.)]219 bull1
+[(The default jump threshold is 16.)]208 bull2
+[2(k8)0(: Optimize for the AMD K8 \(Opteron/Althon 64\). These instructions should still work on all x86 CPUs.)]191 bull1
+[(The default jump threshold is 16.)]180 bull2
+[2(p6)0(: Optimize for Intel CPUs. This uses the long )2(NOP)0( instructions first introduced in Pentium Pro. This is)]163 bull1
+[(incompatible with all CPUs of family 5 or lower, as well as some VIA CPUs and several virtualization)]152 bull0
+[(solutions. The default jump threshold is 16.)]141 bull2
+[(The macro )2(__ALIGNMODE__)0( is defined to contain the current alignment mode. A number of other macros)]124 norm1
+[(beginning with )2(__ALIGN_)0( are used internally by this macro package.)]113 norm2
+(66)pageeven
+restore showpage
+%%Page: 67 67
+%%BeginPageSetup
+save
+%%EndPageSetup
+/67 pa
+[{/chapter-6 xa}(Chapter 6: )(Assembler Directives)]642.8 chap3
+[(NASM, though it attempts to avoid the bureaucracy of assemblers like MASM and TASM, is nevertheless)]607.8 norm1
+[(forced to support a )1(few)0( directives. These are described in this chapter.)]596.8 norm2
+[(NASM's directives come in two types: )1(user-level)0( directives and )1(primitive)0( directives. Typically, each)]579.8 norm1
+[(directive has a user-level form and a primitive form. In almost all cases, we recommend that users use the)]568.8 norm0
+[(user-level forms of the directives, which are implemented as macros which call the primitive forms.)]557.8 norm2
+[(Primitive directives are enclosed in square brackets; user-level directives are not.)]540.8 norm3
+[(In addition to the universal directives described in this chapter, each object file format can optionally supply)]523.8 norm1
+[(extra directives in order to control particular features of that file format. These )1(format-specific)0( directives are)]512.8 norm0
+[(documented along with the formats that implement them, in ){/chapter-7 xl}(chapter 7){el}(.)]501.8 norm2
+[{/section-6.1 xa}2(BITS)0(: Specifying Target )(Processor Mode)](6.1)480.4 head3
+[(The )2(BITS)0( directive specifies whether NASM should generate code )(designed to run on a processor operating)]463.4 norm1
+[(in 16-bit mode, 32-bit mode or 64-bit mode. The syntax is )2(BITS XX)0(, where XX is 16, 32 or 64.)]452.4 norm2
+[(In most cases, you should not need to use )2(BITS)0( explicitly. The )2(aout)0(, )2(coff)0(, )2(elf)0(, )2(macho)0(, )2(win32)0( and)]435.4 norm1
+[2(win64)0( object formats, which are designed for use in 32-bit or 64-bit operating systems, all cause NASM to)]424.4 norm0
+[(select 32-bit or 64-bit mode, respectively, by default. The )2(obj)0( object format allows you to specify each)]413.4 norm0
+[(segment you define as either )2(USE16)0( or )2(USE32)0(, and NASM will set its operating mode accordingly, so the)]402.4 norm0
+[(use of the )2(BITS)0( directive is once again unnecessary.)]391.4 norm2
+[(The most likely reason for using the )2(BITS)0( directive is to write 32-bit or 64-bit code in a flat binary file; this)]374.4 norm1
+[(is because the )2(bin)0( output format defaults to 16-bit mode in anticipation of it being used most frequently to)]363.4 norm0
+[(write DOS )2(.COM)0( programs, DOS )2(.SYS)0( device drivers and boot loader software.)]352.4 norm2
+[(You do )1(not)0( need to specify )2(BITS 32)0( merely in order to use 32-bit instructions in a 16-bit DOS program; if)]335.4 norm1
+[(you do, the assembler will generate incorrect code because it will be writing code targeted at a 32-bit)]324.4 norm0
+[(platform, to be run on a 16-bit one.)]313.4 norm2
+[(When NASM is in )2(BITS 16)0( mode, instructions which use 32-bit data are prefixed with an 0x66 byte, and)]296.4 norm1
+[(those referring to 32-bit addresses have an 0x67 prefix. In )2(BITS 32)0( mode, the reverse is true: 32-bit)]285.4 norm0
+[(instructions require no prefixes, whereas instructions using 16-bit data need an 0x66 and those working on)]274.4 norm0
+[(16-bit addresses need an 0x67.)]263.4 norm2
+[(When NASM is in )2(BITS 64)0( mode, most instructions operate the same as they do for )2(BITS 32)0( mode.)]246.4 norm1
+[(However, there are 8 more general and SSE registers, and 16-bit addressing is no longer supported.)]235.4 norm2
+[(The default address size is 64 bits; 32-bit addressing can be selected with the 0x67 prefix. The default)]218.4 norm1
+[(operand size is still 32 bits, however, and the 0x66 prefix selects 16-bit operand size. The )2(REX)0( prefix is used)]207.4 norm0
+[(both to select 64-bit operand size, and to access the new registers. NASM automatically inserts REX prefixes)]196.4 norm0
+[(when necessary.)]185.4 norm2
+[(When the )2(REX)0( prefix is used, the processor does not know how to address the AH, BH, CH or DH \(high 8-bit)]168.4 norm1
+[(legacy\) registers. Instead, it is possible to access the the low 8-bits of the SP, BP SI and DI registers as SPL,)]157.4 norm0
+[(BPL, SIL and DIL, respectively; but only when the REX prefix is used.)]146.4 norm2
+[(The )2(BITS)0( directive has an exactly equivalent primitive form, )2([BITS 16])0(, )2([BITS 32])0( and )2([BITS 64])0(.)]129.4 norm1
+[(The user-level form is a macro which has no function other than to call the primitive form.)]118.4 norm2
+[(Note that the space is neccessary, e.g. )2(BITS32)0( will )1(not)0( work!)]101.4 norm3
+(67)pageodd
+restore showpage
+%%Page: 68 68
+%%BeginPageSetup
+save
+%%EndPageSetup
+/68 pa
+[{/section-6.1.1 xa}2(USE16)0( & )2(USE32)0(: Aliases for BITS)](6.1.1)678.8 subh3
+[(The `)2(USE16)0(' and `)2(USE32)0(' directives can be used in place of `)2(BITS 16)0(' and `)2(BITS 32)0(', for compatibility)]661.8 norm1
+[(with other assemblers.)]650.8 norm2
+[{/section-6.2 xa}2(DEFAULT)0(: Change the assembler defaults)](6.2)629.4 head3
+[(The )2(DEFAULT)0( directive changes the assembler defaults. Normally, NASM defaults to a mode where the)]612.4 norm1
+[(programmer is expected to explicitly specify most features directly. However, this is occationally obnoxious,)]601.4 norm0
+[(as the explicit form is pretty much the only one one wishes to use.)]590.4 norm2
+[(Currently, the only )2(DEFAULT)0( that is settable is whether or not registerless instructions in 64-bit mode are)]573.4 norm1
+[2(RIP)0(\226relative or not. By default, they are absolute unless overridden with the )2(REL)0( specifier \(see ){/section-3.3 xl}(section 3.3){el}(\).)]562.4 norm0
+[(However, if )2(DEFAULT REL)0( is specified, )2(REL)0( is default, unless overridden with the )2(ABS)0( specifier, )1(except)]551.4 norm0
+[1(when used with an FS or GS segment override)0(.)]540.4 norm2
+[(The special handling of )2(FS)0( and )2(GS)0( overrides are due to the fact that these registers are generally used as)]523.4 norm1
+[(thread pointers or other special functions in 64-bit mode, and generating )2(RIP)0(\226relative addresses would be)]512.4 norm0
+[(extremely confusing.)]501.4 norm2
+[2(DEFAULT REL)0( is disabled with )2(DEFAULT ABS)0(.)]484.4 norm3
+[{/section-6.3 xa}2(SECTION)0( or )2(SEGMENT)0(: Changing and )(Defining Sections)](6.3)463 head3
+[(The )2(SECTION)0( directive \()2(SEGMENT)0( is an exactly equivalent synonym\) changes which section of the output)]446 norm1
+[(file the code you write will be assembled into. In some object file formats, the number and names of sections)]435 norm0
+[(are fixed; in others, the user may make up as many as they wish. Hence )2(SECTION)0( may sometimes give an)]424 norm0
+[(error message, or may define a new section, if you try to switch to a section that does not \(yet\) exist.)]413 norm2
+[(The Unix object formats, and the )2(bin)0( object format \(but see ){/section-7.1.3 xl}(section 7.1.3){el}(, all support the )(standardized section)]396 norm1
+[(names )2(.text)0(, )2(.data)0( and )2(.bss)0( for the code, data and uninitialized-data sections. The )2(obj)0( format, by)]385 norm0
+[(contrast, does not recognize these section names as being special, and indeed will strip off the leading period)]374 norm0
+[(of any section name that has one.)]363 norm2
+[{/section-6.3.1 xa}(The )2(__SECT__)0( Macro)](6.3.1)343.8 subh3
+[(The )2(SECTION)0( directive is unusual in that its user-level form functions differently from its primitive form.)]326.8 norm1
+[(The primitive form, )2([SECTION xyz])0(, simply switches the current target section to the one given. The)]315.8 norm0
+[(user-level form, )2(SECTION xyz)0(, however, first defines the single-line macro )2(__SECT__)0( to be the primitive)]304.8 norm0
+[2([SECTION])0( directive which it is about to issue, and then issues it. So the user-level directive)]293.8 norm2
+[2(        SECTION .text)]276.8 code3
+[(expands to the two lines)]259.8 norm3
+[2(%define __SECT__        [SECTION .text] )]242.8 code1
+[2(        [SECTION .text])]231.8 code2
+[(Users may find it useful to make use of this in their own macros. For example, the )2(writefile)0( macro)]214.8 norm1
+[(defined in ){/section-4.3.4 xl}(section 4.3.4){el}( can be usefully rewritten in the following more sophisticated form:)]203.8 norm2
+[2(%macro  writefile 2+ )]186.8 code1
+[2()]175.8 code0
+[2(        [section .data] )]164.8 code0
+[2()]153.8 code0
+[2(  %%str:        db      %2 )]142.8 code0
+[2(  %%endstr: )]131.8 code0
+[2()]120.8 code0
+[2(        __SECT__ )]109.8 code0
+(68)pageeven
+restore showpage
+%%Page: 69 69
+%%BeginPageSetup
+save
+%%EndPageSetup
+/69 pa
+[2()]681 code0
+[2(        mov     dx,%%str )]670 code0
+[2(        mov     cx,%%endstr-%%str )]659 code0
+[2(        mov     bx,%1 )]648 code0
+[2(        mov     ah,0x40 )]637 code0
+[2(        int     0x21 )]626 code0
+[2()]615 code0
+[2(%endmacro)]604 code2
+[(This form of the macro, once passed a string to output, first switches temporarily to the data section of the file,)]587 norm1
+[(using the primitive form of the )2(SECTION)0( directive so as not to modify )2(__SECT__)0(. It then declares its string)]576 norm0
+[(in the data section, and then invokes )2(__SECT__)0( to switch back to )1(whichever)0( section the user was previously)]565 norm0
+[(working in. It thus avoids the need, in the previous version of the macro, to include a )2(JMP)0( instruction to jump)]554 norm0
+[(over the data, and also does not fail if, in a complicated )2(OBJ)0( format module, the user could potentially be)]543 norm0
+[(assembling the code in any of several separate code sections.)]532 norm2
+[{/section-6.4 xa}2(ABSOLUTE)0(: Defining Absolute Labels)](6.4)510.6 head3
+[(The )2(ABSOLUTE)0( directive can be thought of as an alternative form of )2(SECTION)0(: it causes the subsequent)]493.6 norm1
+[(code to be directed at no physical section, but at the hypothetical section starting at the given absolute address.)]482.6 norm0
+[(The only instructions you can use in this mode are the )2(RESB)0( family.)]471.6 norm2
+[2(ABSOLUTE)0( is used as follows:)]454.6 norm3
+[2(absolute 0x1A )]437.6 code1
+[2()]426.6 code0
+[2(    kbuf_chr    resw    1 )]415.6 code0
+[2(    kbuf_free   resw    1 )]404.6 code0
+[2(    kbuf        resw    16)]393.6 code2
+[(This example describes a section of the PC BIOS data area, at segment address 0x40: the above code defines)]376.6 norm1
+[2(kbuf_chr)0( to be 0x1A, )2(kbuf_free)0( to be 0x1C, and )2(kbuf)0( to be 0x1E.)]365.6 norm2
+[(The user-level form of )2(ABSOLUTE)0(, like that of )2(SECTION)0(, redefines the )2(__SECT__)0( macro when it is)]348.6 norm1
+[(invoked.)]337.6 norm2
+[2(STRUC)0( and )2(ENDSTRUC)0( are defined as macros which use )2(ABSOLUTE)0( \(and also )2(__SECT__)0(\).)]320.6 norm3
+[2(ABSOLUTE)0( doesn't have to take an absolute constant as an argument: it can take an expression \(actually, a)]303.6 norm1
+[(critical expression: see ){/section-3.8 xl}(section 3.8){el}(\) and it can be a value in a segment. For example, a TSR can re-use its)]292.6 norm0
+[(setup code as run-time BSS like this:)]281.6 norm2
+[2(        org     100h               ; it's a .COM program )]264.6 code1
+[2()]253.6 code0
+[2(        jmp     setup              ; setup code comes last )]242.6 code0
+[2()]231.6 code0
+[2(        ; the resident part of the TSR goes here )]220.6 code0
+[2(setup: )]209.6 code0
+[2(        ; now write the code that installs the TSR here )]198.6 code0
+[2()]187.6 code0
+[2(absolute setup )]176.6 code0
+[2()]165.6 code0
+[2(runtimevar1     resw    1 )]154.6 code0
+[2(runtimevar2     resd    20 )]143.6 code0
+[2()]132.6 code0
+[2(tsr_end:)]121.6 code2
+(69)pageodd
+restore showpage
+%%Page: 70 70
+%%BeginPageSetup
+save
+%%EndPageSetup
+/70 pa
+[(This defines some variables `on top of' the setup code, so that after the setup has finished running, the space it)]681 norm1
+[(took up can be re-used as data storage for the running TSR. The symbol `tsr_end' can be used to calculate the)]670 norm0
+[(total size of the part of the TSR that needs to be made resident.)]659 norm2
+[{/section-6.5 xa}2(EXTERN)0(: )(Importing Symbols from Other Modules)](6.5)637.6 head3
+[2(EXTERN)0( is similar to the MASM directive )2(EXTRN)0( and the C keyword )2(extern)0(: it is used to declare a symbol)]620.6 norm1
+[(which is not defined anywhere in the module being assembled, but is assumed to be defined in some other)]609.6 norm0
+[(module and needs to be referred to by this one. Not every object-file format can support external variables:)]598.6 norm0
+[(the )2(bin)0( format cannot.)]587.6 norm2
+[(The )2(EXTERN)0( directive takes as many arguments as you like. Each argument is the name of a symbol:)]570.6 norm3
+[2(extern  _printf )]553.6 code1
+[2(extern  _sscanf,_fscanf)]542.6 code2
+[(Some object-file formats provide extra features to the )2(EXTERN)0( directive. In all cases, the extra features are)]525.6 norm1
+[(used by suffixing a colon to the symbol name followed by object-format specific text. For example, the )2(obj)]514.6 norm0
+[(format allows you to declare that the default segment base of an external should be the group )2(dgroup)0( by)]503.6 norm0
+[(means of the directive)]492.6 norm2
+[2(extern  _variable:wrt dgroup)]475.6 code3
+[(The primitive form of )2(EXTERN)0( differs from the user-level form only in that it can take only one argument at)]458.6 norm1
+[(a time: the support for multiple arguments is implemented at the preprocessor level.)]447.6 norm2
+[(You can declare the same variable as )2(EXTERN)0( more than once: NASM will quietly ignore the second and)]430.6 norm1
+[(later redeclarations. You can't declare a variable as )2(EXTERN)0( as well as something else, though.)]419.6 norm2
+[{/section-6.6 xa}2(GLOBAL)0(: )(Exporting Symbols to Other Modules)](6.6)398.2 head3
+[2(GLOBAL)0( is the other end of )2(EXTERN)0(: if one module declares a symbol as )2(EXTERN)0( and refers to it, then in)]381.2 norm1
+[(order to prevent linker errors, some other module must actually )1(define)0( the symbol and declare it as )2(GLOBAL)0(.)]370.2 norm0
+[(Some assemblers use the name )2(PUBLIC)0( for this purpose.)]359.2 norm2
+[(The )2(GLOBAL)0( directive applying to a symbol must appear )1(before)0( the definition of the symbol.)]342.2 norm3
+[2(GLOBAL)0( uses the same syntax as )2(EXTERN)0(, except that it must refer to symbols which )1(are)0( defined in the same)]325.2 norm1
+[(module as the )2(GLOBAL)0( directive. For example:)]314.2 norm2
+[2(global _main )]297.2 code1
+[2(_main: )]286.2 code0
+[2(        ; some code)]275.2 code2
+[2(GLOBAL)0(, like )2(EXTERN)0(, allows object formats to define private extensions by means of a colon. The )2(elf)]258.2 norm1
+[(object format, for example, lets you specify whether global data items are functions or data:)]247.2 norm2
+[2(global  hashlookup:function, hashtable:data)]230.2 code3
+[(Like )2(EXTERN)0(, the primitive form of )2(GLOBAL)0( differs from the user-level form only in that it can take only)]213.2 norm1
+[(one argument at a time.)]202.2 norm2
+[{/section-6.7 xa}2(COMMON)0(: Defining Common Data Areas)](6.7)180.8 head3
+[(The )2(COMMON)0( directive is used to declare )1(common variables)0(. A common variable is much like a global)]163.8 norm1
+[(variable declared in the uninitialized data section, so that)]152.8 norm2
+[2(common  intvar  4)]135.8 code3
+[(is similar in function to)]118.8 norm3
+(70)pageeven
+restore showpage
+%%Page: 71 71
+%%BeginPageSetup
+save
+%%EndPageSetup
+/71 pa
+[2(global  intvar )]681 code1
+[2(section .bss )]670 code0
+[2()]659 code0
+[2(intvar  resd    1)]648 code2
+[(The difference is that if more than one module defines the same common variable, then at link time those)]631 norm1
+[(variables will be )1(merged)0(, and references to )2(intvar)0( in all modules will point at the same piece of memory.)]620 norm2
+[(Like )2(GLOBAL)0( and )2(EXTERN)0(, )2(COMMON)0( supports object-format specific extensions. For example, the )2(obj)]603 norm1
+[(format allows common variables to be NEAR or FAR, and the )2(elf)0( format allows you to specify the)]592 norm0
+[(alignment requirements of a common variable:)]581 norm2
+[2(common  commvar  4:near  ; works in OBJ )]564 code1
+[2(common  intarray 100:4   ; works in ELF: 4 byte aligned)]553 code2
+[(Once again, like )2(EXTERN)0( and )2(GLOBAL)0(, the primitive form of )2(COMMON)0( differs from the user-level form only)]536 norm1
+[(in that it can take only one argument at a time.)]525 norm2
+[{/section-6.8 xa}2(CPU)0(: Defining CPU Dependencies)](6.8)503.6 head3
+[(The )2(CPU)0( directive restricts assembly to those instructions which are available on the specified CPU.)]486.6 norm3
+[(Options are:)]469.6 norm3
+[2(CPU 8086)0( Assemble only 8086 instruction set)]452.6 bull3
+[2(CPU 186)0( Assemble instructions up to the 80186 instruction set)]435.6 bull3
+[2(CPU 286)0( Assemble instructions up to the 286 instruction set)]418.6 bull3
+[2(CPU 386)0( Assemble instructions up to the 386 instruction set)]401.6 bull3
+[2(CPU 486)0( 486 instruction set)]384.6 bull3
+[2(CPU 586)0( Pentium instruction set)]367.6 bull3
+[2(CPU PENTIUM)0( Same as 586)]350.6 bull3
+[2(CPU 686)0( P6 instruction set)]333.6 bull3
+[2(CPU PPRO)0( Same as 686)]316.6 bull3
+[2(CPU P2)0( Same as 686)]299.6 bull3
+[2(CPU P3)0( Pentium III \(Katmai\) instruction sets)]282.6 bull3
+[2(CPU KATMAI)0( Same as P3)]265.6 bull3
+[2(CPU P4)0( Pentium 4 \(Willamette\) instruction set)]248.6 bull3
+[2(CPU WILLAMETTE)0( Same as P4)]231.6 bull3
+[2(CPU PRESCOTT)0( Prescott instruction set)]214.6 bull3
+[2(CPU X64)0( x86-64 \(x64/AMD64/Intel 64\) instruction set)]197.6 bull3
+[2(CPU IA64)0( IA64 CPU \(in x86 mode\) instruction set)]180.6 bull3
+[(All options are case insensitive. All instructions will be selected only if they apply to the selected CPU or)]163.6 norm1
+[(lower. By default, all instructions are available.)]152.6 norm2
+[{/section-6.9 xa}2(FLOAT)0(: Handling of )(floating-point constants)](6.9)131.2 head3
+[(By default, floating-point constants are rounded to nearest, and IEEE denormals are supported. The following)]114.2 norm1
+[(options can be set to alter this behaviour:)]103.2 norm2
+(71)pageodd
+restore showpage
+%%Page: 72 72
+%%BeginPageSetup
+save
+%%EndPageSetup
+/72 pa
+[2(FLOAT DAZ)0( Flush denormals to zero)]681 bull3
+[2(FLOAT NODAZ)0( Do not flush denormals to zero \(default\))]664 bull3
+[2(FLOAT NEAR)0( Round to nearest \(default\))]647 bull3
+[2(FLOAT UP)0( Round up \(toward +Infinity\))]630 bull3
+[2(FLOAT DOWN)0( Round down \(toward \226Infinity\))]613 bull3
+[2(FLOAT ZERO)0( Round toward zero)]596 bull3
+[2(FLOAT DEFAULT)0( Restore default settings)]579 bull3
+[(The standard macros )2(__FLOAT_DAZ__)0(, )2(__FLOAT_ROUND__)0(, and )2(__FLOAT__)0( contain the current state,)]562 norm1
+[(as long as the programmer has avoided the use of the brackeded primitive form, \()2([FLOAT])0(\).)]551 norm2
+[2(__FLOAT__)0( contains the full set of floating-point settings; this value can be saved away and invoked later to)]534 norm1
+[(restore the setting.)]523 norm2
+(72)pageeven
+restore showpage
+%%Page: 73 73
+%%BeginPageSetup
+save
+%%EndPageSetup
+/73 pa
+[{/chapter-7 xa}(Chapter 7: )(Output Formats)]642.8 chap3
+[(NASM is a portable assembler, designed to be able to compile on any ANSI C-supporting platform and)]607.8 norm1
+[(produce output to run on a variety of Intel x86 operating systems. For this reason, it has a large number of)]596.8 norm0
+[(available output formats, selected using the )2(-f)0( option on the NASM )(command line. Each of these formats,)]585.8 norm0
+[(along with its extensions to the base NASM syntax, is detailed in this chapter.)]574.8 norm2
+[(As stated in ){/section-2.1.1 xl}(section 2.1.1){el}(, NASM chooses a )(default name for your output file based on the input file name and)]557.8 norm1
+[(the chosen output format. This will be generated by removing the )(extension \()2(.asm)0(, )2(.s)0(, or whatever you like)]546.8 norm0
+[(to use\) from the input file name, and substituting an extension defined by the output format. The extensions)]535.8 norm0
+[(are given with each format below.)]524.8 norm2
+[{/section-7.1 xa}2(bin)0(: )(Flat-Form Binary)( Output)](7.1)503.4 head3
+[(The )2(bin)0( format does not produce object files: it generates nothing in the output file except the code you)]486.4 norm1
+[(wrote. Such `pure binary' files are used by )(MS-DOS: )2(.COM)0( executables and )2(.SYS)0( device drivers are pure)]475.4 norm0
+[(binary files. Pure binary output is also useful for )(operating system and )(boot loader development.)]464.4 norm2
+[(The )2(bin)0( format supports )(multiple section names. For details of how NASM handles sections in the )2(bin)]447.4 norm1
+[(format, see ){/section-7.1.3 xl}(section 7.1.3){el}(.)]436.4 norm2
+[(Using the )2(bin)0( format puts NASM by default into 16-bit mode \(see ){/section-6.1 xl}(section 6.1){el}(\). In order to use )2(bin)0( to write)]419.4 norm1
+[(32-bit or 64-bit code, such as an OS kernel, you need to explicitly issue the )2(BITS 32)0( or )2(BITS 64)0( directive.)]408.4 norm2
+[2(bin)0( has no default output file name extension: instead, it leaves your file name as it is once the original)]391.4 norm1
+[(extension has been removed. Thus, the default is for NASM to assemble )2(binprog.asm)0( into a binary file)]380.4 norm0
+[(called )2(binprog)0(.)]369.4 norm2
+[{/section-7.1.1 xa}2(ORG)0(: Binary File )(Program Origin)](7.1.1)350.2 subh3
+[(The )2(bin)0( format provides an additional directive to the list given in ){/chapter-6 xl}(chapter 6){el}(: )2(ORG)0(. The function of the )2(ORG)]333.2 norm1
+[(directive is to specify the origin address which NASM will assume the program begins at when it is loaded)]322.2 norm0
+[(into memory.)]311.2 norm2
+[(For example, the following code will generate the longword )2(0x00000104)0(:)]294.2 norm3
+[2(        org     0x100 )]277.2 code1
+[2(        dd      label )]266.2 code0
+[2(label:)]255.2 code2
+[(Unlike the )2(ORG)0( directive provided by MASM-compatible assemblers, which allows you to jump around in)]238.2 norm1
+[(the object file and overwrite code you have already generated, NASM's )2(ORG)0( does exactly what the directive)]227.2 norm0
+[(says: )1(origin)0(. Its sole function is to specify one offset which is added to all internal address references within)]216.2 norm0
+[(the section; it does not permit any of the trickery that MASM's version does. See ){/section-12.1.3 xl}(section 12.1.3){el}( for further)]205.2 norm0
+[(comments.)]194.2 norm2
+[{/section-7.1.2 xa}2(bin)0( Extensions to the )2(SECTION)0( Directive)](7.1.2)175 subh3
+[(The )2(bin)0( output format extends the )2(SECTION)0( \(or )2(SEGMENT)0(\) directive to allow you to specify the alignment)]158 norm1
+[(requirements of segments. This is done by appending the )2(ALIGN)0( qualifier to the end of the section-definition)]147 norm0
+[(line. For example,)]136 norm2
+[2(section .data   align=16)]119 code3
+[(switches to the section )2(.data)0( and also specifies that it must be aligned on a 16-byte boundary.)]102 norm3
+(73)pageodd
+restore showpage
+%%Page: 74 74
+%%BeginPageSetup
+save
+%%EndPageSetup
+/74 pa
+[(The parameter to )2(ALIGN)0( specifies how many low bits of the section start address must be forced to zero. The)]681 norm1
+[(alignment value given may be any power of two.)]670 norm2
+[{/section-7.1.3 xa}(Multisection)( Support for the )2(bin)0( Format)](7.1.3)650.8 subh3
+[(The )2(bin)0( format allows the use of multiple sections, of arbitrary names, besides the "known" )2(.text)0(, )2(.data)0(,)]633.8 norm1
+[(and )2(.bss)0( names.)]622.8 norm2
+[(Sections may be designated )2(progbits)0( or )2(nobits)0(. Default is )2(progbits)0( \(except )2(.bss)0(, which defaults)]605.8 bull1
+[(to )2(nobits)0(, of course\).)]594.8 bull2
+[(Sections can be aligned at a specified boundary following the previous section with )2(align=)0(, or at an)]577.8 bull1
+[(arbitrary byte-granular position with )2(start=)0(.)]566.8 bull2
+[(Sections can be given a virtual start address, which will be used for the calculation of all memory)]549.8 bull1
+[(references within that section with )2(vstart=)0(.)]538.8 bull2
+[(Sections can be ordered using )2(follows=<section>)0( or )2(vfollows=<section>)0( as an alternative to)]521.8 bull1
+[(specifying an explicit start address.)]510.8 bull2
+[(Arguments to )2(org)0(, )2(start)0(, )2(vstart)0(, and )2(align=)0( are critical expressions. See ){/section-3.8 xl}(section 3.8){el}(. E.g.)]493.8 bull1
+[2(align=\(1 << ALIGN_SHIFT\))0( \226 )2(ALIGN_SHIFT)0( must be defined before it is used here.)]482.8 bull2
+[(Any code which comes before an explicit )2(SECTION)0( directive is directed by default into the )2(.text)]465.8 bull1
+[(section.)]454.8 bull2
+[(If an )2(ORG)0( statement is not given, )2(ORG 0)0( is used by default.)]437.8 bull3
+[(The )2(.bss)0( section will be placed after the last )2(progbits)0( section, unless )2(start=)0(, )2(vstart=)0(,)]420.8 bull1
+[2(follows=)0(, or )2(vfollows=)0( has been specified.)]409.8 bull2
+[(All sections are aligned on dword boundaries, unless a different alignment has been specified.)]392.8 bull3
+[(Sections may not overlap.)]375.8 bull3
+[(NASM creates the )2(section.<secname>.start)0( for each section, which may be used in your code.)]358.8 bull3
+[{/section-7.1.4 xa}(Map Files)](7.1.4)339.6 subh3
+[(Map files can be generated in )2(-f bin)0( format by means of the )2([map])0( option. Map types of )2(all)0( \(default\),)]322.6 norm1
+[2(brief)0(, )2(sections)0(, )2(segments)0(, or )2(symbols)0( may be specified. Output may be directed to )2(stdout)]311.6 norm0
+[(\(default\), )2(stderr)0(, or a specified file. E.g. )2([map symbols myfile.map])0(. No "user form" exists, the)]300.6 norm0
+[(square brackets must be used.)]289.6 norm2
+[{/section-7.2 xa}2(ith)0(: )(Intel Hex Output)](7.2)268.2 head3
+[(The )2(ith)0( file format produces Intel hex-format files. Just as the )2(bin)0( format, this is a flat memory image)]251.2 norm1
+[(format with no support for relocation or linking. It is usually used with ROM programmers and similar)]240.2 norm0
+[(utilities.)]229.2 norm2
+[(All extensions supported by the )2(bin)0( file format is also supported by the )2(ith)0( file format.)]212.2 norm3
+[2(ith)0( provides a default output file-name extension of )2(.ith)0(.)]195.2 norm3
+[{/section-7.3 xa}2(srec)0(: )(Motorola S-Records Output)](7.3)173.8 head3
+[(The )2(srec)0( file format produces Motorola S-records files. Just as the )2(bin)0( format, this is a flat memory image)]156.8 norm1
+[(format with no support for relocation or linking. It is usually used with ROM programmers and similar)]145.8 norm0
+[(utilities.)]134.8 norm2
+[(All extensions supported by the )2(bin)0( file format is also supported by the )2(srec)0( file format.)]117.8 norm3
+[2(srec)0( provides a default output file-name extension of )2(.srec)0(.)]100.8 norm3
+(74)pageeven
+restore showpage
+%%Page: 75 75
+%%BeginPageSetup
+save
+%%EndPageSetup
+/75 pa
+[{/section-7.4 xa}2(obj)0(: )(Microsoft OMF)( Object Files)](7.4)676.6 head3
+[(The )2(obj)0( file format \(NASM calls it )2(obj)0( rather than )2(omf)0( for historical reasons\) is the one produced by)]659.6 norm1
+[(MASM and )(TASM, which is typically fed to 16-bit DOS linkers to produce )2(.EXE)0( files. It is also the format)]648.6 norm0
+[(used by )(OS/2.)]637.6 norm2
+[2(obj)0( provides a default output file-name extension of )2(.obj)0(.)]620.6 norm3
+[2(obj)0( is not exclusively a 16-bit format, though: NASM has full support for the 32-bit extensions to the)]603.6 norm1
+[(format. In particular, 32-bit )2(obj)0( format files are used by )(Borland's Win32 compilers, instead of using)]592.6 norm0
+[(Microsoft's newer )2(win32)0( object file format.)]581.6 norm2
+[(The )2(obj)0( format does not define any special segment names: you can call your segments anything you like.)]564.6 norm1
+[(Typical names for segments in )2(obj)0( format files are )2(CODE)0(, )2(DATA)0( and )2(BSS)0(.)]553.6 norm2
+[(If your source file contains code before specifying an explicit )2(SEGMENT)0( directive, then NASM will invent its)]536.6 norm1
+[(own segment called )2(__NASMDEFSEG)0( for you.)]525.6 norm2
+[(When you define a segment in an )2(obj)0( file, NASM defines the segment name as a symbol as well, so that you)]508.6 norm1
+[(can access the segment address of the segment. So, for example:)]497.6 norm2
+[2(segment data )]480.6 code1
+[2()]469.6 code0
+[2(dvar:   dw      1234 )]458.6 code0
+[2()]447.6 code0
+[2(segment code )]436.6 code0
+[2()]425.6 code0
+[2(function: )]414.6 code0
+[2(        mov     ax,data         ; get segment address of data )]403.6 code0
+[2(        mov     ds,ax           ; and move it into DS )]392.6 code0
+[2(        inc     word [dvar]     ; now this reference will work )]381.6 code0
+[2(        ret)]370.6 code2
+[(The )2(obj)0( format also enables the use of the )2(SEG)0( and )2(WRT)0( operators, so that you can write code which does)]353.6 norm1
+[(things like)]342.6 norm2
+[2(extern  foo )]325.6 code1
+[2()]314.6 code0
+[2(      mov   ax,seg foo            ; get preferred segment of foo )]303.6 code0
+[2(      mov   ds,ax )]292.6 code0
+[2(      mov   ax,data               ; a different segment )]281.6 code0
+[2(      mov   es,ax )]270.6 code0
+[2(      mov   ax,[ds:foo]           ; this accesses `foo' )]259.6 code0
+[2(      mov   [es:foo wrt data],bx  ; so does this)]248.6 code2
+[{/section-7.4.1 xa}2(obj)0( Extensions to the )2(SEGMENT)0( Directive)](7.4.1)229.4 subh3
+[(The )2(obj)0( output format extends the )2(SEGMENT)0( \(or )2(SECTION)0(\) directive to allow you to specify various)]212.4 norm1
+[(properties of the segment you are defining. This is done by appending extra qualifiers to the end of the)]201.4 norm0
+[(segment-definition line. For example,)]190.4 norm2
+[2(segment code private align=16)]173.4 code3
+[(defines the segment )2(code)0(, but also declares it to be a private segment, and requires that the portion of it)]156.4 norm1
+[(described in this code module must be aligned on a 16-byte boundary.)]145.4 norm2
+[(The available qualifiers are:)]128.4 norm3
+[2(PRIVATE)0(, )2(PUBLIC)0(, )2(COMMON)0( and )2(STACK)0( specify the combination characteristics of the segment.)]111.4 bull1
+[2(PRIVATE)0( segments do not get combined with any others by the linker; )2(PUBLIC)0( and )2(STACK)0( segments get)]100.4 bull0
+(75)pageodd
+restore showpage
+%%Page: 76 76
+%%BeginPageSetup
+save
+%%EndPageSetup
+/76 pa
+[(concatenated together at link time; and )2(COMMON)0( segments all get overlaid on top of each other rather than)]681 bull0
+[(stuck end-to-end.)]670 bull2
+[2(ALIGN)0( is used, as shown above, to specify how many low bits of the segment start address must be forced)]653 bull1
+[(to zero. The alignment value given may be any power of two from 1 to 4096; in reality, the only values)]642 bull0
+[(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)]631 bull0
+[(will all be rounded up to 256, and so on. Note that alignment to 4096-byte boundaries is a )(PharLap)]620 bull0
+[(extension to the format and may not be supported by all linkers.)]609 bull2
+[2(CLASS)0( can be used to specify the segment class; this feature indicates to the linker that segments of the)]592 bull1
+[(same class should be placed near each other in the output file. The class name can be any word, e.g.)]581 bull0
+[2(CLASS=CODE)0(.)]570 bull2
+[2(OVERLAY)0(, like )2(CLASS)0(, is specified with an arbitrary word as an argument, and provides overlay)]553 bull1
+[(information to an overlay-capable linker.)]542 bull2
+[(Segments can be declared as )2(USE16)0( or )2(USE32)0(, which has the effect of recording the choice in the object)]525 bull1
+[(file and also ensuring that NASM's default assembly mode when assembling in that segment is 16-bit or)]514 bull0
+[(32-bit respectively.)]503 bull2
+[(When writing )(OS/2 object files, you should declare 32-bit segments as )2(FLAT)0(, which causes the default)]486 bull1
+[(segment base for anything in the segment to be the special group )2(FLAT)0(, and also defines the group if it is)]475 bull0
+[(not already defined.)]464 bull2
+[(The )2(obj)0( file format also allows segments to be declared as having a pre-defined absolute segment)]447 bull1
+[(address, although no linkers are currently known to make sensible use of this feature; nevertheless, NASM)]436 bull0
+[(allows you to declare a segment such as )2(SEGMENT SCREEN ABSOLUTE=0xB800)0( if you need to. The)]425 bull0
+[2(ABSOLUTE)0( and )2(ALIGN)0( keywords are mutually exclusive.)]414 bull2
+[(NASM's default segment attributes are )2(PUBLIC)0(, )2(ALIGN=1)0(, no class, no overlay, and )2(USE16)0(.)]397 norm3
+[{/section-7.4.2 xa}2(GROUP)0(: Defining Groups of Segments)](7.4.2)377.8 subh3
+[(The )2(obj)0( format also allows segments to be grouped, so that a single segment register can be used to refer to)]360.8 norm1
+[(all the segments in a group. NASM therefore supplies the )2(GROUP)0( directive, whereby you can code)]349.8 norm2
+[2(segment data )]332.8 code1
+[2()]321.8 code0
+[2(        ; some data )]310.8 code0
+[2()]299.8 code0
+[2(segment bss )]288.8 code0
+[2()]277.8 code0
+[2(        ; some uninitialized data )]266.8 code0
+[2()]255.8 code0
+[2(group dgroup data bss)]244.8 code2
+[(which will define a group called )2(dgroup)0( to contain the segments )2(data)0( and )2(bss)0(. Like )2(SEGMENT)0(, )2(GROUP)]227.8 norm1
+[(causes the group name to be defined as a symbol, so that you can refer to a variable )2(var)0( in the )2(data)0( segment)]216.8 norm0
+[(as )2(var wrt data)0( or as )2(var wrt dgroup)0(, depending on which segment value is currently in your)]205.8 norm0
+[(segment register.)]194.8 norm2
+[(If you just refer to )2(var)0(, however, and )2(var)0( is declared in a segment which is part of a group, then NASM will)]177.8 norm1
+[(default to giving you the offset of )2(var)0( from the beginning of the )1(group)0(, not the )1(segment)0(. Therefore)]166.8 norm0
+[2(SEG var)0(, also, will return the group base rather than the segment base.)]155.8 norm2
+[(NASM will allow a segment to be part of more than one group, but will generate a warning if you do this.)]138.8 norm1
+[(Variables declared in a segment which is part of more than one group will default to being relative to the first)]127.8 norm0
+[(group that was defined to contain the segment.)]116.8 norm2
+(76)pageeven
+restore showpage
+%%Page: 77 77
+%%BeginPageSetup
+save
+%%EndPageSetup
+/77 pa
+[(A group does not have to contain any segments; you can still make )2(WRT)0( references to a group which does not)]681 norm1
+[(contain the variable you are referring to. OS/2, for example, defines the special group )2(FLAT)0( with no segments)]670 norm0
+[(in it.)]659 norm2
+[{/section-7.4.3 xa}2(UPPERCASE)0(: Disabling Case Sensitivity in Output)](7.4.3)639.8 subh3
+[(Although NASM itself is )(case sensitive, some OMF linkers are not; therefore it can be useful for NASM to)]622.8 norm1
+[(output single-case object files. The )2(UPPERCASE)0( format-specific directive causes all segment, group and)]611.8 norm0
+[(symbol names that are written to the object file to be forced to upper case just before being written. Within a)]600.8 norm0
+[(source file, NASM is still case-sensitive; but the object file can be written entirely in upper case if desired.)]589.8 norm2
+[2(UPPERCASE)0( is used alone on a line; it requires no parameters.)]572.8 norm3
+[{/section-7.4.4 xa}2(IMPORT)0(: Importing DLL Symbols)](7.4.4)553.6 subh3
+[(The )2(IMPORT)0( format-specific directive defines a symbol to be imported from a DLL, for use if you are)]536.6 norm1
+[(writing a DLL's )(import library in NASM. You still need to declare the symbol as )2(EXTERN)0( as well as using)]525.6 norm0
+[(the )2(IMPORT)0( directive.)]514.6 norm2
+[(The )2(IMPORT)0( directive takes two required parameters, separated by white space, which are \(respectively\) the)]497.6 norm1
+[(name of the symbol you wish to import and the name of the library you wish to import it from. For example:)]486.6 norm2
+[2(    import  WSAStartup wsock32.dll)]469.6 code3
+[(A third optional parameter gives the name by which the symbol is known in the library you are importing it)]452.6 norm1
+[(from, in case this is not the same as the name you wish the symbol to be known by to your code once you)]441.6 norm0
+[(have imported it. For example:)]430.6 norm2
+[2(    import  asyncsel wsock32.dll WSAAsyncSelect)]413.6 code3
+[{/section-7.4.5 xa}2(EXPORT)0(: Exporting DLL Symbols)](7.4.5)394.4 subh3
+[(The )2(EXPORT)0( format-specific directive defines a global symbol to be exported as a DLL symbol, for use if)]377.4 norm1
+[(you are writing a DLL in NASM. You still need to declare the symbol as )2(GLOBAL)0( as well as using the)]366.4 norm0
+[2(EXPORT)0( directive.)]355.4 norm2
+[2(EXPORT)0( takes one required parameter, which is the name of the symbol you wish to export, as it was defined)]338.4 norm1
+[(in your source file. An optional second parameter \(separated by white space from the first\) gives the )1(external)]327.4 norm0
+[(name of the symbol: the name by which you wish the symbol to be known to programs using the DLL. If this)]316.4 norm0
+[(name is the same as the internal name, you may leave the second parameter off.)]305.4 norm2
+[(Further parameters can be given to define attributes of the exported symbol. These parameters, like the)]288.4 norm1
+[(second, are separated by white space. If further parameters are given, the external name must also be)]277.4 norm0
+[(specified, even if it is the same as the internal name. The available attributes are:)]266.4 norm2
+[2(resident)0( indicates that the exported name is to be kept resident by the system loader. This is an)]249.4 bull1
+[(optimisation for frequently used symbols imported by name.)]238.4 bull2
+[2(nodata)0( indicates that the exported symbol is a function which does not make use of any initialized data.)]221.4 bull3
+[2(parm=NNN)0(, where )2(NNN)0( is an integer, sets the number of parameter words for the case in which the symbol)]204.4 bull1
+[(is a call gate between 32-bit and 16-bit segments.)]193.4 bull2
+[(An attribute which is just a number indicates that the symbol should be exported with an identifying)]176.4 bull1
+[(number \(ordinal\), and gives the desired number.)]165.4 bull2
+[(For example:)]148.4 norm3
+[2(    export  myfunc )]131.4 code1
+[2(    export  myfunc TheRealMoreFormalLookingFunctionName )]120.4 code0
+(77)pageodd
+restore showpage
+%%Page: 78 78
+%%BeginPageSetup
+save
+%%EndPageSetup
+/78 pa
+[2(    export  myfunc myfunc 1234  ; export by ordinal )]681 code0
+[2(    export  myfunc myfunc resident parm=23 nodata)]670 code2
+[{/section-7.4.6 xa}2(..start)0(: Defining the )(Program Entry Point)](7.4.6)650.8 subh3
+[2(OMF)0( linkers require exactly one of the object files being linked to define the program entry point, where)]633.8 norm1
+[(execution will begin when the program is run. If the object file that defines the entry point is assembled using)]622.8 norm0
+[(NASM, you specify the entry point by declaring the special symbol )2(..start)0( at the point where you wish)]611.8 norm0
+[(execution to begin.)]600.8 norm2
+[{/section-7.4.7 xa}2(obj)0( Extensions to the )2(EXTERN)0( Directive)](7.4.7)581.6 subh3
+[(If you declare an external symbol with the directive)]564.6 norm3
+[2(    extern  foo)]547.6 code3
+[(then references such as )2(mov ax,foo)0( will give you the offset of )2(foo)0( from its preferred segment base \(as)]530.6 norm1
+[(specified in whichever module )2(foo)0( is actually defined in\). So to access the contents of )2(foo)0( you will usually)]519.6 norm0
+[(need to do something like)]508.6 norm2
+[2(        mov     ax,seg foo      ; get preferred segment base )]491.6 code1
+[2(        mov     es,ax           ; move it into ES )]480.6 code0
+[2(        mov     ax,[es:foo]     ; and use offset `foo' from it)]469.6 code2
+[(This is a little unwieldy, particularly if you know that an external is going to be accessible from a given)]452.6 norm1
+[(segment or group, say )2(dgroup)0(. So if )2(DS)0( already contained )2(dgroup)0(, you could simply code)]441.6 norm2
+[2(        mov     ax,[foo wrt dgroup])]424.6 code3
+[(However, having to type this every time you want to access )2(foo)0( can be a pain; so NASM allows you to)]407.6 norm1
+[(declare )2(foo)0( in the alternative form)]396.6 norm2
+[2(    extern  foo:wrt dgroup)]379.6 code3
+[(This form causes NASM to pretend that the preferred segment base of )2(foo)0( is in fact )2(dgroup)0(; so the)]362.6 norm1
+[(expression )2(seg foo)0( will now return )2(dgroup)0(, and the expression )2(foo)0( is equivalent to )2(foo wrt dgroup)0(.)]351.6 norm2
+[(This )(default-)2(WRT)0( mechanism can be used to make externals appear to be relative to any group or segment in)]334.6 norm1
+[(your program. It can also be applied to common variables: see ){/section-7.4.8 xl}(section 7.4.8){el}(.)]323.6 norm2
+[{/section-7.4.8 xa}2(obj)0( Extensions to the )2(COMMON)0( Directive)](7.4.8)304.4 subh3
+[(The )2(obj)0( format allows common variables to be either near)( or far)(; NASM allows you to specify which your)]287.4 norm1
+[(variables should be by the use of the syntax)]276.4 norm2
+[2(common  nearvar 2:near   ; `nearvar' is a near common )]259.4 code1
+[2(common  farvar  10:far   ; and `farvar' is far)]248.4 code2
+[(Far common variables may be greater in size than 64Kb, and so the OMF specification says that they are)]231.4 norm1
+[(declared as a number of )1(elements)0( of a given size. So a 10-byte far common variable could be declared as ten)]220.4 norm0
+[(one-byte elements, five two-byte elements, two five-byte elements or one ten-byte element.)]209.4 norm2
+[(Some )2(OMF)0( linkers require the )(element size, as well as the variable size, to match when resolving common)]192.4 norm1
+[(variables declared in more than one module. Therefore NASM must allow you to specify the element size on)]181.4 norm0
+[(your far common variables. This is done by the following syntax:)]170.4 norm2
+[2(common  c_5by2  10:far 5        ; two five-byte elements )]153.4 code1
+[2(common  c_2by5  10:far 2        ; five two-byte elements)]142.4 code2
+[(If no element size is specified, the default is 1. Also, the )2(FAR)0( keyword is not required when an element size is)]125.4 norm1
+[(specified, since only far commons may have element sizes at all. So the above declarations could equivalently)]114.4 norm0
+[(be)]103.4 norm2
+(78)pageeven
+restore showpage
+%%Page: 79 79
+%%BeginPageSetup
+save
+%%EndPageSetup
+/79 pa
+[2(common  c_5by2  10:5            ; two five-byte elements )]681 code1
+[2(common  c_2by5  10:2            ; five two-byte elements)]670 code2
+[(In addition to these extensions, the )2(COMMON)0( directive in )2(obj)0( also supports default-)2(WRT)0( specification like)]653 norm1
+[2(EXTERN)0( does \(explained in ){/section-7.4.7 xl}(section 7.4.7){el}(\). So you can also declare things like)]642 norm2
+[2(common  foo     10:wrt dgroup )]625 code1
+[2(common  bar     16:far 2:wrt data )]614 code0
+[2(common  baz     24:wrt data:6)]603 code2
+[{/section-7.5 xa}2(win32)0(: Microsoft Win32 Object Files)](7.5)581.6 head3
+[(The )2(win32)0( output format generates Microsoft Win32 object files, suitable for passing to Microsoft linkers)]564.6 norm1
+[(such as )(Visual C++. Note that Borland Win32 compilers do not use this format, but use )2(obj)0( instead \(see)]553.6 norm0
+[{/section-7.4 xl}(section 7.4){el}(\).)]542.6 norm2
+[2(win32)0( provides a default output file-name extension of )2(.obj)0(.)]525.6 norm3
+[(Note that although Microsoft say that Win32 object files follow the )2(COFF)0( \(Common Object File Format\))]508.6 norm1
+[(standard, the object files produced by Microsoft Win32 compilers are not compatible with COFF linkers such)]497.6 norm0
+[(as DJGPP's, and vice versa. This is due to a difference of opinion over the precise semantics of PC-relative)]486.6 norm0
+[(relocations. To produce COFF files suitable for DJGPP, use NASM's )2(coff)0( output format; conversely, the)]475.6 norm0
+[2(coff)0( format does not produce object files that Win32 linkers can generate correct output from.)]464.6 norm2
+[{/section-7.5.1 xa}2(win32)0( Extensions to the )2(SECTION)0( Directive)](7.5.1)445.4 subh3
+[(Like the )2(obj)0( format, )2(win32)0( allows you to specify additional information on the )2(SECTION)0( directive line, to)]428.4 norm1
+[(control the type and properties of sections you declare. Section types and properties are generated)]417.4 norm0
+[(automatically by NASM for the )(standard section names )2(.text)0(, )2(.data)0( and )2(.bss)0(, but may still be)]406.4 norm0
+[(overridden by these qualifiers.)]395.4 norm2
+[(The available qualifiers are:)]378.4 norm3
+[2(code)0(, or equivalently )2(text)0(, defines the section to be a code section. This marks the section as readable)]361.4 bull1
+[(and executable, but not writable, and also indicates to the linker that the type of the section is code.)]350.4 bull2
+[2(data)0( and )2(bss)0( define the section to be a data section, analogously to )2(code)0(. Data sections are marked as)]333.4 bull1
+[(readable and writable, but not executable. )2(data)0( declares an initialized data section, whereas )2(bss)0( declares)]322.4 bull0
+[(an uninitialized data section.)]311.4 bull2
+[2(rdata)0( declares an initialized data section that is readable but not writable. Microsoft compilers use this)]294.4 bull1
+[(section to place constants in it.)]283.4 bull2
+[2(info)0( defines the section to be an )(informational section, which is not included in the executable file by the)]266.4 bull1
+[(linker, but may \(for example\) pass information )1(to)0( the linker. For example, declaring an )2(info)0(\226type section)]255.4 bull0
+[(called )2(.drectve)0( causes the linker to interpret the contents of the section as command-line options.)]244.4 bull2
+[2(align=)0(, used with a trailing number as in )2(obj)0(, gives the )(alignment requirements of the section. The)]227.4 bull1
+[(maximum you may specify is 64: the Win32 object file format contains no means to request a greater)]216.4 bull0
+[(section alignment than this. If alignment is not explicitly specified, the defaults are 16-byte alignment for)]205.4 bull0
+[(code sections, 8-byte alignment for rdata sections and 4-byte alignment for data \(and BSS\) sections.)]194.4 bull0
+[(Informational sections get a default alignment of 1 byte \(no alignment\), though the value does not matter.)]183.4 bull2
+[(The defaults assumed by NASM if you do not specify the above qualifiers are:)]166.4 norm3
+[2(section .text    code  align=16 )]149.4 code1
+[2(section .data    data  align=4 )]138.4 code0
+[2(section .rdata   rdata align=8 )]127.4 code0
+[2(section .bss     bss   align=4)]116.4 code2
+(79)pageodd
+restore showpage
+%%Page: 80 80
+%%BeginPageSetup
+save
+%%EndPageSetup
+/80 pa
+[(Any other section name is treated by default like )2(.text)0(.)]681 norm3
+[{/section-7.5.2 xa}2(win32)0(: Safe Structured Exception Handling)](7.5.2)661.8 subh3
+[(Among other improvements in Windows XP SP2 and Windows Server 2003 Microsoft has introduced)]644.8 norm1
+[(concept of "safe structured exception handling." General idea is to collect handlers' entry points in designated)]633.8 norm0
+[(read-only table and have alleged entry point verified against this table prior exception control is passed to the)]622.8 norm0
+[(handler. In order for an executable module to be equipped with such "safe exception handler table," all object)]611.8 norm0
+[(modules on linker command line has to comply with certain criteria. If one single module among them does)]600.8 norm0
+[(not, then the table in question is omitted and above mentioned run-time checks will not be performed for)]589.8 norm0
+[(application in question. Table omission is by default silent and therefore can be easily overlooked. One can)]578.8 norm0
+[(instruct linker to refuse to produce binary without such table by passing )2(/safeseh)0( command line option.)]567.8 norm2
+[(Without regard to this run-time check merits it's natural to expect NASM to be capable of generating)]550.8 norm1
+[(modules suitable for )2(/safeseh)0( linking. From developer's viewpoint the problem is two-fold:)]539.8 norm2
+[(how to adapt modules not deploying exception handlers of their own;)]522.8 bull3
+[(how to adapt/develop modules utilizing custom exception handling;)]505.8 bull3
+[(Former can be easily achieved with any NASM version by adding following line to source code:)]488.8 norm3
+[2($@feat.00 equ 1)]471.8 code3
+[(As of version 2.03 NASM adds this absolute symbol automatically. If it's not already present to be precise.)]454.8 norm1
+[(I.e. if for whatever reason developer would choose to assign another value in source file, it would still be)]443.8 norm0
+[(perfectly possible.)]432.8 norm2
+[(Registering custom exception handler on the other hand requires certain "magic." As of version 2.03)]415.8 norm1
+[(additional directive is implemented, )2(safeseh)0(, which instructs the assembler to produce appropriately)]404.8 norm0
+[(formatted input data for above mentioned "safe exception handler table." Its typical use would be:)]393.8 norm2
+[2(section .text )]376.8 code1
+[2(extern  _MessageBoxA@16 )]365.8 code0
+[2(%if     __NASM_VERSION_ID__ >= 0x02030000 )]354.8 code0
+[2(safeseh handler         ; register handler as "safe handler" )]343.8 code0
+[2(%endif )]332.8 code0
+[2(handler: )]321.8 code0
+[2(        push    DWORD 1 ; MB_OKCANCEL )]310.8 code0
+[2(        push    DWORD caption )]299.8 code0
+[2(        push    DWORD text )]288.8 code0
+[2(        push    DWORD 0 )]277.8 code0
+[2(        call    _MessageBoxA@16 )]266.8 code0
+[2(        sub     eax,1   ; incidentally suits as return value )]255.8 code0
+[2(                        ; for exception handler )]244.8 code0
+[2(        ret )]233.8 code0
+[2(global  _main )]222.8 code0
+[2(_main: )]211.8 code0
+[2(        push    DWORD handler )]200.8 code0
+[2(        push    DWORD [fs:0] )]189.8 code0
+[2(        mov     DWORD [fs:0],esp ; engage exception handler )]178.8 code0
+[2(        xor     eax,eax )]167.8 code0
+[2(        mov     eax,DWORD[eax]   ; cause exception )]156.8 code0
+[2(        pop     DWORD [fs:0]     ; disengage exception handler )]145.8 code0
+[2(        add     esp,4 )]134.8 code0
+[2(        ret )]123.8 code0
+[2(text:   db      'OK to rethrow, CANCEL to generate core dump',0 )]112.8 code0
+[2(caption:db      'SEGV',0 )]101.8 code0
+(80)pageeven
+restore showpage
+%%Page: 81 81
+%%BeginPageSetup
+save
+%%EndPageSetup
+/81 pa
+[2()]681 code0
+[2(section .drectve info )]670 code0
+[2(        db      '/defaultlib:user32.lib /defaultlib:msvcrt.lib ')]659 code2
+[(As you might imagine, it's perfectly possible to produce .exe binary with "safe exception handler table" and)]642 norm1
+[(yet engage unregistered exception handler. Indeed, handler is engaged by simply manipulating )2([fs:0])]631 norm0
+[(location at run-time, something linker has no power over, run-time that is. It should be explicitly mentioned)]620 norm0
+[(that such failure to register handler's entry point with )2(safeseh)0( directive has undesired side effect at)]609 norm0
+[(run-time. If exception is raised and unregistered handler is to be executed, the application is abruptly)]598 norm0
+[(terminated without any notification whatsoever. One can argue that system could at least have logged some)]587 norm0
+[(kind "non-safe exception handler in x.exe at address n" message in event log, but no, literally no notification)]576 norm0
+[(is provided and user is left with no clue on what caused application failure.)]565 norm2
+[(Finally, all mentions of linker in this paragraph refer to Microsoft linker version 7.x and later. Presence of)]548 norm1
+[2(@feat.00)0( symbol and input data for "safe exception handler table" causes no backward incompatibilities)]537 norm0
+[(and "safeseh" modules generated by NASM 2.03 and later can still be linked by earlier versions or)]526 norm0
+[(non-Microsoft linkers.)]515 norm2
+[{/section-7.6 xa}2(win64)0(: Microsoft Win64 Object Files)](7.6)493.6 head3
+[(The )2(win64)0( output format generates Microsoft Win64 object files, which is nearly 100% identical to the)]476.6 norm1
+[2(win32)0( object format \(){/section-7.5 xl}(section 7.5){el}(\) with the exception that it is meant to target 64-bit code and the x86-64)]465.6 norm0
+[(platform altogether. This object file is used exactly the same as the )2(win32)0( object format \(){/section-7.5 xl}(section 7.5){el}(\), in)]454.6 norm0
+[(NASM, with regard to this exception.)]443.6 norm2
+[{/section-7.6.1 xa}2(win64)0(: Writing Position-Independent Code)](7.6.1)424.4 subh3
+[(While )2(REL)0( takes good care of RIP-relative addressing, there is one aspect that is easy to overlook for a)]407.4 norm1
+[(Win64 programmer: indirect references. Consider a switch dispatch table:)]396.4 norm2
+[2(        jmp     QWORD[dsptch+rax*8] )]379.4 code1
+[2(        ... )]368.4 code0
+[2(dsptch: dq      case0 )]357.4 code0
+[2(        dq      case1 )]346.4 code0
+[2(        ...)]335.4 code2
+[(Even novice Win64 assembler programmer will soon realize that the code is not 64-bit savvy. Most notably)]318.4 norm1
+[(linker will refuse to link it with)]307.4 norm0
+[(")2('ADDR32' relocation to '.text' invalid without /LARGEADDRESSAWARE:NO)0(". So)]296.4 norm0
+[([s]he will have to split jmp instruction as following:)]285.4 norm2
+[2(        lea     rbx,[rel dsptch] )]268.4 code1
+[2(        jmp     QWORD[rbx+rax*8])]257.4 code2
+[(What happens behind the scene is that effective address in )2(lea)0( is encoded relative to instruction pointer, or in)]240.4 norm1
+[(perfectly position-independent manner. But this is only part of the problem! Trouble is that in .dll context)]229.4 norm0
+[2(caseN)0( relocations will make their way to the final module and might have to be adjusted at .dll load time. To)]218.4 norm0
+[(be specific when it can't be loaded at preferred address. And when this occurs, pages with such relocations)]207.4 norm0
+[(will be rendered private to current process, which kind of undermines the idea of sharing .dll. But no worry,)]196.4 norm0
+[(it's trivial to fix:)]185.4 norm2
+[2(        lea     rbx,[rel dsptch] )]168.4 code1
+[2(        add     rbx,QWORD[rbx+rax*8] )]157.4 code0
+[2(        jmp     rbx )]146.4 code0
+[2(        ... )]135.4 code0
+[2(dsptch: dq      case0-dsptch )]124.4 code0
+[2(        dq      case1-dsptch )]113.4 code0
+[2(        ...)]102.4 code2
+(81)pageodd
+restore showpage
+%%Page: 82 82
+%%BeginPageSetup
+save
+%%EndPageSetup
+/82 pa
+[(NASM version 2.03 and later provides another alternative, )2(wrt ..imagebase)0( operator, which returns)]681 norm1
+[(offset from base address of the current image, be it .exe or .dll module, therefore the name. For those)]670 norm0
+[(acquainted with PE-COFF format base address denotes start of )2(IMAGE_DOS_HEADER)0( structure. Here is)]659 norm0
+[(how to implement switch with these image-relative references:)]648 norm2
+[2(        lea     rbx,[rel dsptch] )]631 code1
+[2(        mov     eax,DWORD[rbx+rax*4] )]620 code0
+[2(        sub     rbx,dsptch wrt ..imagebase )]609 code0
+[2(        add     rbx,rax )]598 code0
+[2(        jmp     rbx )]587 code0
+[2(        ... )]576 code0
+[2(dsptch: dd      case0 wrt ..imagebase )]565 code0
+[2(        dd      case1 wrt ..imagebase)]554 code2
+[(One can argue that the operator is redundant. Indeed, snippet before last works just fine with any NASM)]537 norm1
+[(version and is not even Windows specific... The real reason for implementing )2(wrt ..imagebase)0( will)]526 norm0
+[(become apparent in next paragraph.)]515 norm2
+[(It should be noted that )2(wrt ..imagebase)0( is defined as 32-bit operand only:)]498 norm3
+[2(        dd      label wrt ..imagebase           ; ok )]481 code1
+[2(        dq      label wrt ..imagebase           ; bad )]470 code0
+[2(        mov     eax,label wrt ..imagebase       ; ok )]459 code0
+[2(        mov     rax,label wrt ..imagebase       ; bad)]448 code2
+[{/section-7.6.2 xa}2(win64)0(: Structured Exception Handling)](7.6.2)428.8 subh3
+[(Structured exception handing in Win64 is completely different matter from Win32. Upon exception program)]411.8 norm1
+[(counter value is noted, and linker-generated table comprising start and end addresses of all the functions [in)]400.8 norm0
+[(given executable module] is traversed and compared to the saved program counter. Thus so called)]389.8 norm0
+[2(UNWIND_INFO)0( structure is identified. If it's not found, then offending subroutine is assumed to be "leaf" and)]378.8 norm0
+[(just mentioned lookup procedure is attempted for its caller. In Win64 leaf function is such function that does)]367.8 norm0
+[(not call any other function )1(nor)0( modifies any Win64 non-volatile registers, including stack pointer. The latter)]356.8 norm0
+[(ensures that it's possible to identify leaf function's caller by simply pulling the value from the top of the stack.)]345.8 norm2
+[(While majority of subroutines written in assembler are not calling any other function, requirement for)]328.8 norm1
+[(non-volatile registers' immutability leaves developer with not more than 7 registers and no stack frame,)]317.8 norm0
+[(which is not necessarily what [s]he counted with. Customarily one would meet the requirement by saving)]306.8 norm0
+[(non-volatile registers on stack and restoring them upon return, so what can go wrong? If [and only if] an)]295.8 norm0
+[(exception is raised at run-time and no )2(UNWIND_INFO)0( structure is associated with such "leaf" function, the)]284.8 norm0
+[(stack unwind procedure will expect to find caller's return address on the top of stack immediately followed by)]273.8 norm0
+[(its frame. Given that developer pushed caller's non-volatile registers on stack, would the value on top point at)]262.8 norm0
+[(some code segment or even addressable space? Well, developer can attempt copying caller's return address to)]251.8 norm0
+[(the top of stack and this would actually work in some very specific circumstances. But unless developer can)]240.8 norm0
+[(guarantee that these circumstances are always met, it's more appropriate to assume worst case scenario, i.e.)]229.8 norm0
+[(stack unwind procedure going berserk. Relevant question is what happens then? Application is abruptly)]218.8 norm0
+[(terminated without any notification whatsoever. Just like in Win32 case, one can argue that system could at)]207.8 norm0
+[(least have logged "unwind procedure went berserk in x.exe at address n" in event log, but no, no trace of)]196.8 norm0
+[(failure is left.)]185.8 norm2
+[(Now, when we understand significance of the )2(UNWIND_INFO)0( structure, let's discuss what's in it and/or how)]168.8 norm1
+[(it's processed. First of all it is checked for presence of reference to custom language-specific exception)]157.8 norm0
+[(handler. If there is one, then it's invoked. Depending on the return value, execution flow is resumed)]146.8 norm0
+[(\(exception is said to be "handled"\), )1(or)0( rest of )2(UNWIND_INFO)0( structure is processed as following. Beside)]135.8 norm0
+[(optional reference to custom handler, it carries information about current callee's stack frame and where)]124.8 norm0
+[(non-volatile registers are saved. Information is detailed enough to be able to reconstruct contents of caller's)]113.8 norm0
+[(non-volatile registers upon call to current callee. And so caller's context is reconstructed, and then unwind)]102.8 norm0
+(82)pageeven
+restore showpage
+%%Page: 83 83
+%%BeginPageSetup
+save
+%%EndPageSetup
+/83 pa
+[(procedure is repeated, i.e. another )2(UNWIND_INFO)0( structure is associated, this time, with caller's instruction)]681 norm0
+[(pointer, which is then checked for presence of reference to language-specific handler, etc. The procedure is)]670 norm0
+[(recursively repeated till exception is handled. As last resort system "handles" it by generating memory core)]659 norm0
+[(dump and terminating the application.)]648 norm2
+[(As for the moment of this writing NASM unfortunately does not facilitate generation of above mentioned)]631 norm1
+[(detailed information about stack frame layout. But as of version 2.03 it implements building blocks for)]620 norm0
+[(generating structures involved in stack unwinding. As simplest example, here is how to deploy custom)]609 norm0
+[(exception handler for leaf function:)]598 norm2
+[2(default rel )]581 code1
+[2(section .text )]570 code0
+[2(extern  MessageBoxA )]559 code0
+[2(handler: )]548 code0
+[2(        sub     rsp,40 )]537 code0
+[2(        mov     rcx,0 )]526 code0
+[2(        lea     rdx,[text] )]515 code0
+[2(        lea     r8,[caption] )]504 code0
+[2(        mov     r9,1    ; MB_OKCANCEL )]493 code0
+[2(        call    MessageBoxA )]482 code0
+[2(        sub     eax,1   ; incidentally suits as return value )]471 code0
+[2(                        ; for exception handler )]460 code0
+[2(        add     rsp,40 )]449 code0
+[2(        ret )]438 code0
+[2(global  main )]427 code0
+[2(main: )]416 code0
+[2(        xor     rax,rax )]405 code0
+[2(        mov     rax,QWORD[rax]  ; cause exception )]394 code0
+[2(        ret )]383 code0
+[2(main_end: )]372 code0
+[2(text:   db      'OK to rethrow, CANCEL to generate core dump',0 )]361 code0
+[2(caption:db      'SEGV',0 )]350 code0
+[2()]339 code0
+[2(section .pdata  rdata align=4 )]328 code0
+[2(        dd      main wrt ..imagebase )]317 code0
+[2(        dd      main_end wrt ..imagebase )]306 code0
+[2(        dd      xmain wrt ..imagebase )]295 code0
+[2(section .xdata  rdata align=8 )]284 code0
+[2(xmain:  db      9,0,0,0 )]273 code0
+[2(        dd      handler wrt ..imagebase )]262 code0
+[2(section .drectve info )]251 code0
+[2(        db      '/defaultlib:user32.lib /defaultlib:msvcrt.lib ')]240 code2
+[(What you see in )2(.pdata)0( section is element of the "table comprising start and end addresses of function")]223 norm1
+[(along with reference to associated )2(UNWIND_INFO)0( structure. And what you see in )2(.xdata)0( section is)]212 norm0
+[2(UNWIND_INFO)0( structure describing function with no frame, but with designated exception handler.)]201 norm0
+[(References are )1(required)0( to be image-relative \(which is the real reason for implementing)]190 norm0
+[2(wrt ..imagebase)0( operator\). It should be noted that )2(rdata align=n)0(, as well as)]179 norm0
+[2(wrt ..imagebase)0(, are optional in these two segments' contexts, i.e. can be omitted. Latter means that )1(all)]168 norm0
+[(32-bit references, not only above listed required ones, placed into these two segments turn out)]157 norm0
+[(image-relative. Why is it important to understand? Developer is allowed to append handler-specific data to)]146 norm0
+[2(UNWIND_INFO)0( structure, and if [s]he adds a 32-bit reference, then [s]he will have to remember to adjust its)]135 norm0
+[(value to obtain the real pointer.)]124 norm2
+(83)pageodd
+restore showpage
+%%Page: 84 84
+%%BeginPageSetup
+save
+%%EndPageSetup
+/84 pa
+[(As already mentioned, in Win64 terms leaf function is one that does not call any other function )1(nor)0( modifies)]681 norm1
+[(any non-volatile register, including stack pointer. But it's not uncommon that assembler programmer plans to)]670 norm0
+[(utilize every single register and sometimes even have variable stack frame. Is there anything one can do with)]659 norm0
+[(bare building blocks? I.e. besides manually composing fully-fledged )2(UNWIND_INFO)0( structure, which would)]648 norm0
+[(surely be considered error-prone? Yes, there is. Recall that exception handler is called first, before stack)]637 norm0
+[(layout is analyzed. As it turned out, it's perfectly possible to manipulate current callee's context in custom)]626 norm0
+[(handler in manner that permits further stack unwinding. General idea is that handler would not actually)]615 norm0
+[("handle" the exception, but instead restore callee's context, as it was at its entry point and thus mimic leaf)]604 norm0
+[(function. In other words, handler would simply undertake part of unwinding procedure. Consider following)]593 norm0
+[(example:)]582 norm2
+[2(function: )]565 code1
+[2(        mov     rax,rsp         ; copy rsp to volatile register )]554 code0
+[2(        push    r15             ; save non-volatile registers )]543 code0
+[2(        push    rbx )]532 code0
+[2(        push    rbp )]521 code0
+[2(        mov     r11,rsp         ; prepare variable stack frame )]510 code0
+[2(        sub     r11,rcx )]499 code0
+[2(        and     r11,-64 )]488 code0
+[2(        mov     QWORD[r11],rax  ; check for exceptions )]477 code0
+[2(        mov     rsp,r11         ; allocate stack frame )]466 code0
+[2(        mov     QWORD[rsp],rax  ; save original rsp value )]455 code0
+[2(magic_point: )]444 code0
+[2(        ... )]433 code0
+[2(        mov     r11,QWORD[rsp]  ; pull original rsp value )]422 code0
+[2(        mov     rbp,QWORD[r11-24] )]411 code0
+[2(        mov     rbx,QWORD[r11-16] )]400 code0
+[2(        mov     r15,QWORD[r11-8] )]389 code0
+[2(        mov     rsp,r11         ; destroy frame )]378 code0
+[2(        ret)]367 code2
+[(The keyword is that up to )2(magic_point)0( original )2(rsp)0( value remains in chosen volatile register and no)]350 norm1
+[(non-volatile register, except for )2(rsp)0(, is modified. While past )2(magic_point)0( )2(rsp)0( remains constant till the)]339 norm0
+[(very end of the )2(function)0(. In this case custom language-specific exception handler would look like this:)]328 norm2
+[2(EXCEPTION_DISPOSITION handler \(EXCEPTION_RECORD *rec,ULONG64 frame, )]311 code1
+[2(        CONTEXT *context,DISPATCHER_CONTEXT *disp\) )]300 code0
+[2({   ULONG64 *rsp; )]289 code0
+[2(    if \(context->Rip<\(ULONG64\)magic_point\) )]278 code0
+[2(        rsp = \(ULONG64 *\)context->Rax; )]267 code0
+[2(    else )]256 code0
+[2(    {   rsp = \(\(ULONG64 **\)context->Rsp\)[0]; )]245 code0
+[2(        context->Rbp = rsp[-3]; )]234 code0
+[2(        context->Rbx = rsp[-2]; )]223 code0
+[2(        context->R15 = rsp[-1]; )]212 code0
+[2(    } )]201 code0
+[2(    context->Rsp = \(ULONG64\)rsp; )]190 code0
+[2()]179 code0
+[2(    memcpy \(disp->ContextRecord,context,sizeof\(CONTEXT\)\); )]168 code0
+[2(    RtlVirtualUnwind\(UNW_FLAG_NHANDLER,disp->ImageBase, )]157 code0
+[2(        dips->ControlPc,disp->FunctionEntry,disp->ContextRecord, )]146 code0
+[2(        &disp->HandlerData,&disp->EstablisherFrame,NULL\); )]135 code0
+[2(    return ExceptionContinueSearch; )]124 code0
+[2(})]113 code2
+(84)pageeven
+restore showpage
+%%Page: 85 85
+%%BeginPageSetup
+save
+%%EndPageSetup
+/85 pa
+[(As custom handler mimics leaf function, corresponding )2(UNWIND_INFO)0( structure does not have to contain)]681 norm1
+[(any information about stack frame and its layout.)]670 norm2
+[{/section-7.7 xa}2(coff)0(: )(Common Object File Format)](7.7)648.6 head3
+[(The )2(coff)0( output type produces )2(COFF)0( object files suitable for linking with the )(DJGPP linker.)]631.6 norm3
+[2(coff)0( provides a default output file-name extension of )2(.o)0(.)]614.6 norm3
+[(The )2(coff)0( format supports the same extensions to the )2(SECTION)0( directive as )2(win32)0( does, except that the)]597.6 norm1
+[2(align)0( qualifier and the )2(info)0( section type are not supported.)]586.6 norm2
+[{/section-7.8 xa}2(macho32)0( and )2(macho64)0(: )(Mach Object File Format)](7.8)565.2 head3
+[(The )2(macho32)0( and )2(macho64)0( output formts produces )2(Mach-O)0( object files suitable for linking with the)]548.2 norm1
+[(MacOS X linker. )2(macho)0( is a synonym for )2(macho32)0(.)]537.2 norm2
+[2(macho)0( provides a default output file-name extension of )2(.o)0(.)]520.2 norm3
+[{/section-7.9 xa}2(elf32)0( and )2(elf64)0(: )(Executable and Linkable Format Object Files)](7.9)498.8 head3
+[(The )2(elf32)0( and )2(elf64)0( output formats generate )2(ELF32 and ELF64)0( \(Executable and Linkable Format\))]481.8 norm1
+[(object files, as used by Linux as well as )(Unix System V, including )(Solaris x86, )(UnixWare and )(SCO Unix.)]470.8 norm0
+[2(elf)0( provides a default output file-name extension of )2(.o)0(. )2(elf)0( is a synonym for )2(elf32)0(.)]459.8 norm2
+[{/section-7.9.1 xa}(ELF specific directive )2(osabi)](7.9.1)440.6 subh3
+[(The ELF header specifies the application binary interface for the target operating system \(OSABI\). This field)]423.6 norm1
+[(can be set by using the )2(osabi)0( directive with the numeric value \(0-255\) of the target system. If this directive)]412.6 norm0
+[(is not used, the default value will be "UNIX System V ABI" \(0\) which will work on most systems which)]401.6 norm0
+[(support ELF.)]390.6 norm2
+[{/section-7.9.2 xa}2(elf)0( Extensions to the )2(SECTION)0( Directive)](7.9.2)371.4 subh3
+[(Like the )2(obj)0( format, )2(elf)0( allows you to specify additional information on the )2(SECTION)0( directive line, to)]354.4 norm1
+[(control the type and properties of sections you declare. Section types and properties are generated)]343.4 norm0
+[(automatically by NASM for the )(standard section names, but may still be overridden by these qualifiers.)]332.4 norm2
+[(The available qualifiers are:)]315.4 norm3
+[2(alloc)0( defines the section to be one which is loaded into memory when the program is run. )2(noalloc)]298.4 bull1
+[(defines it to be one which is not, such as an informational or comment section.)]287.4 bull2
+[2(exec)0( defines the section to be one which should have execute permission when the program is run.)]270.4 bull1
+[2(noexec)0( defines it as one which should not.)]259.4 bull2
+[2(write)0( defines the section to be one which should be writable when the program is run. )2(nowrite)0( defines)]242.4 bull1
+[(it as one which should not.)]231.4 bull2
+[2(progbits)0( defines the section to be one with explicit contents stored in the object file: an ordinary code)]214.4 bull1
+[(or data section, for example, )2(nobits)0( defines the section to be one with no explicit contents given, such as)]203.4 bull0
+[(a BSS section.)]192.4 bull2
+[2(align=)0(, used with a trailing number as in )2(obj)0(, gives the )(alignment requirements of the section.)]175.4 bull3
+[2(tls)0( defines the section to be one which contains thread local variables.)]158.4 bull3
+[(The defaults assumed by NASM if you do not specify the above qualifiers are:)]141.4 norm3
+[( )( )( )( )( )( )( )( )( )]124.4 norm3
+(85)pageodd
+restore showpage
+%%Page: 86 86
+%%BeginPageSetup
+save
+%%EndPageSetup
+/86 pa
+[2(section .text    progbits  alloc   exec    nowrite  align=16 )]681 code1
+[2(section .rodata  progbits  alloc   noexec  nowrite  align=4 )]670 code0
+[2(section .lrodata progbits  alloc   noexec  nowrite  align=4 )]659 code0
+[2(section .data    progbits  alloc   noexec  write    align=4 )]648 code0
+[2(section .ldata   progbits  alloc   noexec  write    align=4 )]637 code0
+[2(section .bss     nobits    alloc   noexec  write    align=4 )]626 code0
+[2(section .lbss    nobits    alloc   noexec  write    align=4 )]615 code0
+[2(section .tdata   progbits  alloc   noexec  write    align=4    tls )]604 code0
+[2(section .tbss    nobits    alloc   noexec  write    align=4    tls )]593 code0
+[2(section .comment progbits  noalloc noexec  nowrite  align=1 )]582 code0
+[2(section other    progbits  alloc   noexec  nowrite  align=1)]571 code2
+[(\(Any section name other than those in the above table is treated by default like )2(other)0( in the above table.)]554 norm1
+[(Please note that section names are case sensitive.\))]543 norm2
+[{/section-7.9.3 xa}(Position-Independent Code)(: )2(elf)0( Special Symbols and )2(WRT)](7.9.3)523.8 subh3
+[(The )2(ELF)0( specification contains enough features to allow position-independent code \(PIC\) to be written,)]506.8 norm1
+[(which makes )(ELF shared libraries very flexible. However, it also means NASM has to be able to generate a)]495.8 norm0
+[(variety of ELF specific relocation types in ELF object files, if it is to be an assembler which can write PIC.)]484.8 norm2
+[(Since )2(ELF)0( does not support segment-base references, the )2(WRT)0( operator is not used for its normal purpose;)]467.8 norm1
+[(therefore NASM's )2(elf)0( output format makes use of )2(WRT)0( for a different purpose, namely the PIC-specific)]456.8 norm0
+[(relocation types.)]445.8 norm2
+[2(elf)0( defines five special symbols which you can use as the right-hand side of the )2(WRT)0( operator to obtain PIC)]428.8 norm1
+[(relocation types. They are )2(..gotpc)0(, )2(..gotoff)0(, )2(..got)0(, )2(..plt)0( and )2(..sym)0(. Their functions are)]417.8 norm0
+[(summarized here:)]406.8 norm2
+[(Referring to the symbol marking the global offset table base using )2(wrt ..gotpc)0( will end up giving the)]389.8 bull1
+[(distance from the beginning of the current section to the global offset table.)]378.8 bull0
+[(\()2(_GLOBAL_OFFSET_TABLE_)0( is the standard symbol name used to refer to the )(GOT.\) So you would then)]367.8 bull0
+[(need to add )2($$)0( to the result to get the real address of the GOT.)]356.8 bull2
+[(Referring to a location in one of your own sections using )2(wrt ..gotoff)0( will give the distance from the)]339.8 bull1
+[(beginning of the GOT to the specified location, so that adding on the address of the GOT would give the)]328.8 bull0
+[(real address of the location you wanted.)]317.8 bull2
+[(Referring to an external or global symbol using )2(wrt ..got)0( causes the linker to build an entry )1(in)0( the)]300.8 bull1
+[(GOT containing the address of the symbol, and the reference gives the distance from the beginning of the)]289.8 bull0
+[(GOT to the entry; so you can add on the address of the GOT, load from the resulting address, and end up)]278.8 bull0
+[(with the address of the symbol.)]267.8 bull2
+[(Referring to a procedure name using )2(wrt ..plt)0( causes the linker to build a )(procedure linkage table)]250.8 bull1
+[(entry for the symbol, and the reference gives the address of the )(PLT entry. You can only use this in)]239.8 bull0
+[(contexts which would generate a PC-relative relocation normally \(i.e. as the destination for )2(CALL)0( or )2(JMP)0(\),)]228.8 bull0
+[(since ELF contains no relocation type to refer to PLT entries absolutely.)]217.8 bull2
+[(Referring to a symbol name using )2(wrt ..sym)0( causes NASM to write an ordinary relocation, but instead)]200.8 bull1
+[(of making the relocation relative to the start of the section and then adding on the offset to the symbol, it)]189.8 bull0
+[(will write a relocation record aimed directly at the symbol in question. The distinction is a necessary one)]178.8 bull0
+[(due to a peculiarity of the dynamic linker.)]167.8 bull2
+[(A fuller explanation of how to use these relocation types to write shared libraries entirely in NASM is given in)]150.8 norm1
+[{/section-9.2 xl}(section 9.2){el}(.)]139.8 norm2
+(86)pageeven
+restore showpage
+%%Page: 87 87
+%%BeginPageSetup
+save
+%%EndPageSetup
+/87 pa
+[{/section-7.9.4 xa}(Thread Local Storage)(: )2(elf)0( Special Symbols and )2(WRT)](7.9.4)678.8 subh3
+[(In ELF32 mode, referring to an external or global symbol using )2(wrt ..tlsie)0( )( causes the linker to build)]661.8 bull1
+[(an entry )1(in)0( the GOT containing the offset of the symbol within the TLS block, so you can access the value)]650.8 bull0
+[(of the symbol with code such as:)]639.8 bull2
+[2(       mov  eax,[tid wrt ..tlsie] )]622.8 code1
+[2(       mov  [gs:eax],ebx)]611.8 code2
+[(In ELF64 mode, referring to an external or global symbol using )2(wrt ..gottpoff)0( )( causes the linker to)]594.8 bull1
+[(build an entry )1(in)0( the GOT containing the offset of the symbol within the TLS block, so you can access the)]583.8 bull0
+[(value of the symbol with code such as:)]572.8 bull2
+[2(       mov   rax,[rel tid wrt ..gottpoff] )]555.8 code1
+[2(       mov   rcx,[fs:rax])]544.8 code2
+[{/section-7.9.5 xa}2(elf)0( Extensions to the )2(GLOBAL)0( Directive)](7.9.5)525.6 subh3
+[2(ELF)0( object files can contain more information about a global symbol than just its address: they can contain)]508.6 norm1
+[(the )(size of the symbol and its )(type as well. These are not merely debugger conveniences, but are actually)]497.6 norm0
+[(necessary when the program being written is a )(shared library. NASM therefore supports some extensions to)]486.6 norm0
+[(the )2(GLOBAL)0( directive, allowing you to specify these features.)]475.6 norm2
+[(You can specify whether a global variable is a function or a data object by suffixing the name with a colon)]458.6 norm1
+[(and the word )2(function)0( or )2(data)0(. \()2(object)0( is a synonym for )2(data)0(.\) For example:)]447.6 norm2
+[2(global   hashlookup:function, hashtable:data)]430.6 code3
+[(exports the global symbol )2(hashlookup)0( as a function and )2(hashtable)0( as a data object.)]413.6 norm3
+[(Optionally, you can control the ELF visibility of the symbol. Just add one of the visibility keywords:)]396.6 norm1
+[2(default)0(, )2(internal)0(, )2(hidden)0(, or )2(protected)0(. The default is )2(default)0( of course. For example, to make)]385.6 norm0
+[2(hashlookup)0( hidden:)]374.6 norm2
+[2(global   hashlookup:function hidden)]357.6 code3
+[(You can also specify the size of the data associated with the symbol, as a numeric expression \(which may)]340.6 norm1
+[(involve labels, and even forward references\) after the type specifier. Like this:)]329.6 norm2
+[2(global  hashtable:data \(hashtable.end - hashtable\) )]312.6 code1
+[2()]301.6 code0
+[2(hashtable: )]290.6 code0
+[2(        db this,that,theother  ; some data here )]279.6 code0
+[2(.end:)]268.6 code2
+[(This makes NASM automatically calculate the length of the table and place that information into the )2(ELF)]251.6 norm1
+[(symbol table.)]240.6 norm2
+[(Declaring the type and size of global symbols is necessary when writing shared library code. For more)]223.6 norm1
+[(information, see ){/section-9.2.4 xl}(section 9.2.4){el}(.)]212.6 norm2
+[{/section-7.9.6 xa}2(elf)0( Extensions to the )2(COMMON)0( Directive )](7.9.6)193.4 subh3
+[2(ELF)0( also allows you to specify alignment requirements )(on common variables. This is done by putting a)]176.4 norm1
+[(number \(which must be a power of two\) after the name and size of the common variable, separated \(as usual\))]165.4 norm0
+[(by a colon. For example, an array of doublewords would benefit from 4-byte alignment:)]154.4 norm2
+[2(common  dwordarray 128:4)]137.4 code3
+[(This declares the total size of the array to be 128 bytes, and requires that it be aligned on a 4-byte boundary.)]120.4 norm3
+(87)pageodd
+restore showpage
+%%Page: 88 88
+%%BeginPageSetup
+save
+%%EndPageSetup
+/88 pa
+[{/section-7.9.7 xa}(16-bit code and ELF )](7.9.7)678.8 subh3
+[(The )2(ELF32)0( specification doesn't provide relocations for 8- and 16-bit values, but the GNU )2(ld)0( linker adds)]661.8 norm1
+[(these as an extension. NASM can generate GNU-compatible relocations, to allow 16-bit code to be linked as)]650.8 norm0
+[(ELF using GNU )2(ld)0(. If NASM is used with the )2(-w+gnu-elf-extensions)0( option, a warning is issued)]639.8 norm0
+[(when one of these relocations is generated.)]628.8 norm2
+[{/section-7.9.8 xa}(Debug formats and ELF )](7.9.8)609.6 subh3
+[2(ELF32)0( and )2(ELF64)0( provide debug information in )2(STABS)0( and )2(DWARF)0( formats. Line number information is)]592.6 norm1
+[(generated for all executable sections, but please note that only the ".text" section is executable by default.)]581.6 norm2
+[{/section-7.10 xa}2(aout)0(: Linux )2(a.out)0( Object Files)](7.10)560.2 head3
+[(The )2(aout)0( format generates )2(a.out)0( object files, in the form used by early Linux systems \(current Linux)]543.2 norm1
+[(systems use ELF, see ){/section-7.9 xl}(section 7.9){el}(.\) These differ from other )2(a.out)0( object files in that the magic number in the)]532.2 norm0
+[(first four bytes of the file is different; also, some implementations of )2(a.out)0(, for example NetBSD's, support)]521.2 norm0
+[(position-independent code, which Linux's implementation does not.)]510.2 norm2
+[2(a.out)0( provides a default output file-name extension of )2(.o)0(.)]493.2 norm3
+[2(a.out)0( is a very simple object format. It supports no special directives, no special symbols, no use of )2(SEG)0( or)]476.2 norm1
+[2(WRT)0(, and no extensions to any standard directives. It supports only the three )(standard section names )2(.text)0(,)]465.2 norm0
+[2(.data)0( and )2(.bss)0(.)]454.2 norm2
+[{/section-7.11 xa}2(aoutb)0(: )(NetBSD/)(FreeBSD/)(OpenBSD )2(a.out)0( Object Files)](7.11)432.8 head3
+[(The )2(aoutb)0( format generates )2(a.out)0( object files, in the form used by the various free )2(BSD Unix)0( clones,)]415.8 norm1
+[2(NetBSD)0(, )2(FreeBSD)0( and )2(OpenBSD)0(. For simple object files, this object format is exactly the same as )2(aout)]404.8 norm0
+[(except for the magic number in the first four bytes of the file. However, the )2(aoutb)0( format supports)]393.8 norm0
+[(position-independent code in the same way as the )2(elf)0( format, so you can use it to write )2(BSD)0( )(shared libraries.)]382.8 norm2
+[2(aoutb)0( provides a default output file-name extension of )2(.o)0(.)]365.8 norm3
+[2(aoutb)0( supports no special directives, no special symbols, and only the three )(standard section names )2(.text)0(,)]348.8 norm1
+[2(.data)0( and )2(.bss)0(. However, it also supports the same use of )2(WRT)0( as )2(elf)0( does, to provide)]337.8 norm0
+[(position-independent code relocation types. See ){/section-7.9.3 xl}(section 7.9.3){el}( for full documentation of this feature.)]326.8 norm2
+[2(aoutb)0( also supports the same extensions to the )2(GLOBAL)0( directive as )2(elf)0( does: see ){/section-7.9.5 xl}(section 7.9.5){el}( for)]309.8 norm1
+[(documentation of this.)]298.8 norm2
+[{/section-7.12 xa}2(as86)0(: )(Minix/Linux)( )2(as86)0( Object Files)](7.12)277.4 head3
+[(The Minix/Linux 16-bit assembler )2(as86)0( has its own non-standard object file format. Although its)]260.4 norm1
+[(companion linker )2(ld86)0( produces something close to ordinary )2(a.out)0( binaries as output, the object file)]249.4 norm0
+[(format used to communicate between )2(as86)0( and )2(ld86)0( is not itself )2(a.out)0(.)]238.4 norm2
+[(NASM supports this format, just in case it is useful, as )2(as86)0(. )2(as86)0( provides a default output file-name)]221.4 norm1
+[(extension of )2(.o)0(.)]210.4 norm2
+[2(as86)0( is a very simple object format \(from the NASM user's point of view\). It supports no special directives,)]193.4 norm1
+[(no use of )2(SEG)0( or )2(WRT)0(, and no extensions to any standard directives. It supports only the three )(standard section)]182.4 norm0
+[(names )2(.text)0(, )2(.data)0( and )2(.bss)0(. The only special symbol supported is )2(..start)0(.)]171.4 norm2
+[{/section-7.13 xa}2(rdf)0(: )(Relocatable Dynamic Object File Format)](7.13)150 head3
+[(The )2(rdf)0( output format produces )2(RDOFF)0( object files. )2(RDOFF)0( \(Relocatable Dynamic Object File Format\) is a)]133 norm1
+[(home-grown object-file format, designed alongside NASM itself and reflecting in its file format the internal)]122 norm0
+[(structure of the assembler.)]111 norm2
+(88)pageeven
+restore showpage
+%%Page: 89 89
+%%BeginPageSetup
+save
+%%EndPageSetup
+/89 pa
+[2(RDOFF)0( is not used by any well-known operating systems. Those writing their own systems, however, may)]681 norm1
+[(well wish to use )2(RDOFF)0( as their object format, on the grounds that it is designed primarily for simplicity and)]670 norm0
+[(contains very little file-header bureaucracy.)]659 norm2
+[(The Unix NASM archive, and the DOS archive which includes sources, both contain an )2(rdoff)0( subdirectory)]642 norm1
+[(holding a set of RDOFF utilities: an RDF linker, an )2(RDF)0( static-library manager, an RDF file dump utility,)]631 norm0
+[(and a program which will load and execute an RDF executable under Linux.)]620 norm2
+[2(rdf)0( supports only the )(standard section names )2(.text)0(, )2(.data)0( and )2(.bss)0(.)]603 norm3
+[{/section-7.13.1 xa}(Requiring a Library: The )2(LIBRARY)0( Directive)](7.13.1)583.8 subh3
+[2(RDOFF)0( contains a mechanism for an object file to demand a given library to be linked to the module, either at)]566.8 norm1
+[(load time or run time. This is done by the )2(LIBRARY)0( directive, which takes one argument which is the name)]555.8 norm0
+[(of the module:)]544.8 norm2
+[2(    library  mylib.rdl)]527.8 code3
+[{/section-7.13.2 xa}(Specifying a Module Name: The )2(MODULE)0( Directive)](7.13.2)508.6 subh3
+[(Special )2(RDOFF)0( header record is used to store the name of the module. It can be used, for example, by)]491.6 norm1
+[(run-time loader to perform dynamic linking. )2(MODULE)0( directive takes one argument which is the name of)]480.6 norm0
+[(current module:)]469.6 norm2
+[2(    module  mymodname)]452.6 code3
+[(Note that when you statically link modules and tell linker to strip the symbols from output file, all module)]435.6 norm1
+[(names will be stripped too. To avoid it, you should start module names with )2($)0(, like:)]424.6 norm2
+[2(    module  $kernel.core)]407.6 code3
+[{/section-7.13.3 xa}2(rdf)0( Extensions to the )2(GLOBAL)0( Directive)](7.13.3)388.4 subh3
+[2(RDOFF)0( global symbols can contain additional information needed by the static linker. You can mark a global)]371.4 norm1
+[(symbol as exported, thus telling the linker do not strip it from target executable or library file. Like in )2(ELF)0(,)]360.4 norm0
+[(you can also specify whether an exported symbol is a procedure \(function\) or data object.)]349.4 norm2
+[(Suffixing the name with a colon and the word )2(export)0( you make the symbol exported:)]332.4 norm3
+[2(    global  sys_open:export)]315.4 code3
+[(To specify that exported symbol is a procedure \(function\), you add the word )2(proc)0( or )2(function)0( after)]298.4 norm1
+[(declaration:)]287.4 norm2
+[2(    global  sys_open:export proc)]270.4 code3
+[(Similarly, to specify exported data object, add the word )2(data)0( or )2(object)0( to the directive:)]253.4 norm3
+[2(    global  kernel_ticks:export data)]236.4 code3
+[{/section-7.13.4 xa}2(rdf)0( Extensions to the )2(EXTERN)0( Directive)](7.13.4)217.2 subh3
+[(By default the )2(EXTERN)0( directive in )2(RDOFF)0( declares a "pure external" symbol \(i.e. the static linker will)]200.2 norm1
+[(complain if such a symbol is not resolved\). To declare an "imported" symbol, which must be resolved later)]189.2 norm0
+[(during a dynamic linking phase, )2(RDOFF)0( offers an additional )2(import)0( modifier. As in )2(GLOBAL)0(, you can also)]178.2 norm0
+[(specify whether an imported symbol is a procedure \(function\) or data object. For example:)]167.2 norm2
+[2(    library $libc )]150.2 code1
+[2(    extern  _open:import )]139.2 code0
+[2(    extern  _printf:import proc )]128.2 code0
+[2(    extern  _errno:import data)]117.2 code2
+(89)pageodd
+restore showpage
+%%Page: 90 90
+%%BeginPageSetup
+save
+%%EndPageSetup
+/90 pa
+[(Here the directive )2(LIBRARY)0( is also included, which gives the dynamic linker a hint as to where to find)]681 norm1
+[(requested symbols.)]670 norm2
+[{/section-7.14 xa}2(dbg)0(: Debugging Format)](7.14)648.6 head3
+[(The )2(dbg)0( output format is not built into NASM in the default configuration. If you are building your own)]631.6 norm1
+[(NASM executable from the sources, you can define )2(OF_DBG)0( in )2(output/outform.h)0( or on the compiler)]620.6 norm0
+[(command line, and obtain the )2(dbg)0( output format.)]609.6 norm2
+[(The )2(dbg)0( format does not output an object file as such; instead, it outputs a text file which contains a complete)]592.6 norm1
+[(list of all the transactions between the main body of NASM and the output-format back end module. It is)]581.6 norm0
+[(primarily intended to aid people who want to write their own output drivers, so that they can get a clearer idea)]570.6 norm0
+[(of the various requests the main program makes of the output driver, and in what order they happen.)]559.6 norm2
+[(For simple files, one can easily use the )2(dbg)0( format like this:)]542.6 norm3
+[2(nasm -f dbg filename.asm)]525.6 code3
+[(which will generate a diagnostic file called )2(filename.dbg)0(. However, this will not work well on files)]508.6 norm1
+[(which were designed for a different object format, because each object format defines its own macros \(usually)]497.6 norm0
+[(user-level forms of directives\), and those macros will not be defined in the )2(dbg)0( format. Therefore it can be)]486.6 norm0
+[(useful to run NASM twice, in order to do the preprocessing with the native object format selected:)]475.6 norm2
+[2(nasm -e -f rdf -o rdfprog.i rdfprog.asm )]458.6 code1
+[2(nasm -a -f dbg rdfprog.i)]447.6 code2
+[(This preprocesses )2(rdfprog.asm)0( into )2(rdfprog.i)0(, keeping the )2(rdf)0( object format selected in order to)]430.6 norm1
+[(make sure RDF special directives are converted into primitive form correctly. Then the preprocessed source is)]419.6 norm0
+[(fed through the )2(dbg)0( format to generate the final diagnostic output.)]408.6 norm2
+[(This workaround will still typically not work for programs intended for )2(obj)0( format, because the )2(obj)]391.6 norm1
+[2(SEGMENT)0( and )2(GROUP)0( directives have side effects of defining the segment and group names as symbols; )2(dbg)]380.6 norm0
+[(will not do this, so the program will not assemble. You will have to work around that by defining the symbols)]369.6 norm0
+[(yourself \(using )2(EXTERN)0(, for example\) if you really need to get a )2(dbg)0( trace of an )2(obj)0(\226specific source file.)]358.6 norm2
+[2(dbg)0( accepts any section name and any directives at all, and logs them all to its output file.)]341.6 norm3
+(90)pageeven
+restore showpage
+%%Page: 91 91
+%%BeginPageSetup
+save
+%%EndPageSetup
+/91 pa
+[{/chapter-8 xa}(Chapter 8: Writing 16-bit Code \(DOS, Windows 3/3.1\))]642.8 chap3
+[(This chapter attempts to cover some of the common issues encountered when writing 16-bit code to run)]607.8 norm1
+[(under )2(MS-DOS)0( or )2(Windows 3.x)0(. It covers how to link programs to produce )2(.EXE)0( or )2(.COM)0( files, how to)]596.8 norm0
+[(write )2(.SYS)0( device drivers, and how to interface assembly language code with 16-bit C compilers and with)]585.8 norm0
+[(Borland Pascal.)]574.8 norm2
+[{/section-8.1 xa}(Producing )2(.EXE)0( Files)](8.1)553.4 head3
+[(Any large program written under DOS needs to be built as a )2(.EXE)0( file: only )2(.EXE)0( files have the necessary)]536.4 norm1
+[(internal structure required to span more than one 64K segment. )(Windows programs, also, have to be built as)]525.4 norm0
+[2(.EXE)0( files, since Windows does not support the )2(.COM)0( format.)]514.4 norm2
+[(In general, you generate )2(.EXE)0( files by using the )2(obj)0( output format to produce one or more )2(.OBJ)0( files, and)]497.4 norm1
+[(then linking them together using a linker. However, NASM also supports the direct generation of simple DOS)]486.4 norm0
+[2(.EXE)0( files using the )2(bin)0( output format \(by using )2(DB)0( and )2(DW)0( to construct the )2(.EXE)0( file header\), and a macro)]475.4 norm0
+[(package is supplied to do this. Thanks to Yann Guidon for contributing the code for this.)]464.4 norm2
+[(NASM may also support )2(.EXE)0( natively as another output format in future releases.)]447.4 norm3
+[{/section-8.1.1 xa}(Using the )2(obj)0( Format To Generate )2(.EXE)0( Files)](8.1.1)428.2 subh3
+[(This section describes the usual method of generating )2(.EXE)0( files by linking )2(.OBJ)0( files together.)]411.2 norm3
+[(Most 16-bit programming language packages come with a suitable linker; if you have none of these, there is a)]394.2 norm1
+[(free linker called )(VAL)(, available in )2(LZH)0( archive format from ){(ftp://x2ftp.oulu.fi/pub/msdos/programming/lang/)wl}2(x2ftp.oulu.fi){el}0(. An LZH archiver can be)]383.2 norm0
+[(found at ){(ftp://ftp.simtel.net/pub/simtelnet/msdos/arcers)wl}2(ftp.simtel.net){el}0(. There is another `free' linker \(though this one doesn't come with sources\))]372.2 norm0
+[(called )(FREELINK, available from ){(http://www.pcorner.com/tpc/old/3-101.html)wl}2(www.pcorner.com){el}0(. A third, )2(djlink)0(, written by DJ Delorie, is)]361.2 norm0
+[(available at ){(http://www.delorie.com/djgpp/16bit/djlink/)wl}2(www.delorie.com){el}0(. A fourth linker, )2(ALINK)0(, written by Anthony A.J. Williams, is available at)]350.2 norm0
+[{(http://alink.sourceforge.net)wl}2(alink.sourceforge.net){el}0(.)]339.2 norm2
+[(When linking several )2(.OBJ)0( files into a )2(.EXE)0( file, you should ensure that exactly one of them has a start point)]322.2 norm1
+[(defined \(using the )2(..start)0( special symbol defined by the )2(obj)0( format: see ){/section-7.4.6 xl}(section 7.4.6){el}(\). If no module)]311.2 norm0
+[(defines a start point, the linker will not know what value to give the entry-point field in the output file header;)]300.2 norm0
+[(if more than one defines a start point, the linker will not know )1(which)0( value to use.)]289.2 norm2
+[(An example of a NASM source file which can be assembled to a )2(.OBJ)0( file and linked on its own to a )2(.EXE)]272.2 norm1
+[(is given here. It demonstrates the basic principles of defining a stack, initialising the segment registers, and)]261.2 norm0
+[(declaring a start point. This file is also provided in the )2(test)0( subdirectory of the NASM archives, under the)]250.2 norm0
+[(name )2(objexe.asm)0(.)]239.2 norm2
+[2(segment code )]222.2 code1
+[2()]211.2 code0
+[2(..start: )]200.2 code0
+[2(        mov     ax,data )]189.2 code0
+[2(        mov     ds,ax )]178.2 code0
+[2(        mov     ax,stack )]167.2 code0
+[2(        mov     ss,ax )]156.2 code0
+[2(        mov     sp,stacktop)]145.2 code2
+[(This initial piece of code sets up )2(DS)0( to point to the data segment, and initializes )2(SS)0( and )2(SP)0( to point to the top)]128.2 norm1
+[(of the provided stack. Notice that interrupts are implicitly disabled for one instruction after a move into )2(SS)0(,)]117.2 norm0
+(91)pageodd
+restore showpage
+%%Page: 92 92
+%%BeginPageSetup
+save
+%%EndPageSetup
+/92 pa
+[(precisely for this situation, so that there's no chance of an interrupt occurring between the loads of )2(SS)0( and )2(SP)]681 norm0
+[(and not having a stack to execute on.)]670 norm2
+[(Note also that the special symbol )2(..start)0( is defined at the beginning of this code, which means that will be)]653 norm1
+[(the entry point into the resulting executable file.)]642 norm2
+[2(        mov     dx,hello )]625 code1
+[2(        mov     ah,9 )]614 code0
+[2(        int     0x21)]603 code2
+[(The above is the main program: load )2(DS:DX)0( with a pointer to the greeting message \()2(hello)0( is implicitly)]586 norm1
+[(relative to the segment )2(data)0(, which was loaded into )2(DS)0( in the setup code, so the full pointer is valid\), and)]575 norm0
+[(call the DOS print-string function.)]564 norm2
+[2(        mov     ax,0x4c00 )]547 code1
+[2(        int     0x21)]536 code2
+[(This terminates the program using another DOS system call.)]519 norm3
+[2(segment data )]502 code1
+[2()]491 code0
+[2(hello:  db      'hello, world', 13, 10, '$')]480 code2
+[(The data segment contains the string we want to display.)]463 norm3
+[2(segment stack stack )]446 code1
+[2(        resb 64 )]435 code0
+[2(stacktop:)]424 code2
+[(The above code declares a stack segment containing 64 bytes of uninitialized stack space, and points)]407 norm1
+[2(stacktop)0( at the top of it. The directive )2(segment stack stack)0( defines a segment )1(called)0( )2(stack)0(, and)]396 norm0
+[(also of )1(type)0( )2(STACK)0(. The latter is not necessary to the correct running of the program, but linkers are likely to)]385 norm0
+[(issue warnings or errors if your program has no segment of type )2(STACK)0(.)]374 norm2
+[(The above file, when assembled into a )2(.OBJ)0( file, will link on its own to a valid )2(.EXE)0( file, which when run)]357 norm1
+[(will print `hello, world' and then exit.)]346 norm2
+[{/section-8.1.2 xa}(Using the )2(bin)0( Format To Generate )2(.EXE)0( Files)](8.1.2)326.8 subh3
+[(The )2(.EXE)0( file format is simple enough that it's possible to build a )2(.EXE)0( file by writing a pure-binary)]309.8 norm1
+[(program and sticking a 32-byte header on the front. This header is simple enough that it can be generated)]298.8 norm0
+[(using )2(DB)0( and )2(DW)0( commands by NASM itself, so that you can use the )2(bin)0( output format to directly generate)]287.8 norm0
+[2(.EXE)0( files.)]276.8 norm2
+[(Included in the NASM archives, in the )2(misc)0( subdirectory, is a file )2(exebin.mac)0( of macros. It defines three)]259.8 norm1
+[(macros: )2(EXE_begin)0(, )2(EXE_stack)0( and )2(EXE_end)0(.)]248.8 norm2
+[(To produce a )2(.EXE)0( file using this method, you should start by using )2(%include)0( to load the )2(exebin.mac)]231.8 norm1
+[(macro package into your source file. You should then issue the )2(EXE_begin)0( macro call \(which takes no)]220.8 norm0
+[(arguments\) to generate the file header data. Then write code as normal for the )2(bin)0( format \226 you can use all)]209.8 norm0
+[(three standard sections )2(.text)0(, )2(.data)0( and )2(.bss)0(. At the end of the file you should call the )2(EXE_end)0( macro)]198.8 norm0
+[(\(again, no arguments\), which defines some symbols to mark section sizes, and these symbols are referred to in)]187.8 norm0
+[(the header code generated by )2(EXE_begin)0(.)]176.8 norm2
+[(In this model, the code you end up writing starts at )2(0x100)0(, just like a )2(.COM)0( file \226 in fact, if you strip off the)]159.8 norm1
+[(32-byte header from the resulting )2(.EXE)0( file, you will have a valid )2(.COM)0( program. All the segment bases are)]148.8 norm0
+[(the same, so you are limited to a 64K program, again just like a )2(.COM)0( file. Note that an )2(ORG)0( directive is)]137.8 norm0
+[(issued by the )2(EXE_begin)0( macro, so you should not explicitly issue one of your own.)]126.8 norm2
+(92)pageeven
+restore showpage
+%%Page: 93 93
+%%BeginPageSetup
+save
+%%EndPageSetup
+/93 pa
+[(You can't directly refer to your segment base value, unfortunately, since this would require a relocation in the)]681 norm1
+[(header, and things would get a lot more complicated. So you should get your segment base by copying it out)]670 norm0
+[(of )2(CS)0( instead.)]659 norm2
+[(On entry to your )2(.EXE)0( file, )2(SS:SP)0( are already set up to point to the top of a 2Kb stack. You can adjust the)]642 norm1
+[(default stack size of 2Kb by calling the )2(EXE_stack)0( macro. For example, to change the stack size of your)]631 norm0
+[(program to 64 bytes, you would call )2(EXE_stack 64)0(.)]620 norm2
+[(A sample program which generates a )2(.EXE)0( file in this way is given in the )2(test)0( subdirectory of the NASM)]603 norm1
+[(archive, as )2(binexe.asm)0(.)]592 norm2
+[{/section-8.2 xa}(Producing )2(.COM)0( Files)](8.2)570.6 head3
+[(While large DOS programs must be written as )2(.EXE)0( files, small ones are often better written as )2(.COM)0( files.)]553.6 norm1
+[2(.COM)0( files are pure binary, and therefore most easily produced using the )2(bin)0( output format.)]542.6 norm2
+[{/section-8.2.1 xa}(Using the )2(bin)0( Format To Generate )2(.COM)0( Files)](8.2.1)523.4 subh3
+[2(.COM)0( files expect to be loaded at offset )2(100h)0( into their segment \(though the segment may change\).)]506.4 norm1
+[(Execution then begins at )2(100h)0(, i.e. right at the start of the program. So to write a )2(.COM)0( program, you would)]495.4 norm0
+[(create a source file looking like)]484.4 norm2
+[2(        org 100h )]467.4 code1
+[2()]456.4 code0
+[2(section .text )]445.4 code0
+[2()]434.4 code0
+[2(start: )]423.4 code0
+[2(        ; put your code here )]412.4 code0
+[2()]401.4 code0
+[2(section .data )]390.4 code0
+[2()]379.4 code0
+[2(        ; put data items here )]368.4 code0
+[2()]357.4 code0
+[2(section .bss )]346.4 code0
+[2()]335.4 code0
+[2(        ; put uninitialized data here)]324.4 code2
+[(The )2(bin)0( format puts the )2(.text)0( section first in the file, so you can declare data or BSS items before)]307.4 norm1
+[(beginning to write code if you want to and the code will still end up at the front of the file where it belongs.)]296.4 norm2
+[(The BSS \(uninitialized data\) section does not take up space in the )2(.COM)0( file itself: instead, addresses of BSS)]279.4 norm1
+[(items are resolved to point at space beyond the end of the file, on the grounds that this will be free memory)]268.4 norm0
+[(when the program is run. Therefore you should not rely on your BSS being initialized to all zeros when you)]257.4 norm0
+[(run.)]246.4 norm2
+[(To assemble the above program, you should use a command line like)]229.4 norm3
+[2(nasm myprog.asm -fbin -o myprog.com)]212.4 code3
+[(The )2(bin)0( format would produce a file called )2(myprog)0( if no explicit output file name were specified, so you)]195.4 norm1
+[(have to override it and give the desired file name.)]184.4 norm2
+[{/section-8.2.2 xa}(Using the )2(obj)0( Format To Generate )2(.COM)0( Files)](8.2.2)165.2 subh3
+[(If you are writing a )2(.COM)0( program as more than one module, you may wish to assemble several )2(.OBJ)0( files)]148.2 norm1
+[(and link them together into a )2(.COM)0( program. You can do this, provided you have a linker capable of)]137.2 norm0
+[(outputting )2(.COM)0( files directly \()(TLINK does this\), or alternatively a converter program such as )2(EXE2BIN)0( to)]126.2 norm0
+[(transform the )2(.EXE)0( file output from the linker into a )2(.COM)0( file.)]115.2 norm2
+(93)pageodd
+restore showpage
+%%Page: 94 94
+%%BeginPageSetup
+save
+%%EndPageSetup
+/94 pa
+[(If you do this, you need to take care of several things:)]681 norm3
+[(The first object file containing code should start its code segment with a line like )2(RESB 100h)0(. This is to)]664 bull1
+[(ensure that the code begins at offset )2(100h)0( relative to the beginning of the code segment, so that the linker)]653 bull0
+[(or converter program does not have to adjust address references within the file when generating the )2(.COM)]642 bull0
+[(file. Other assemblers use an )2(ORG)0( directive for this purpose, but )2(ORG)0( in NASM is a format-specific)]631 bull0
+[(directive to the )2(bin)0( output format, and does not mean the same thing as it does in MASM-compatible)]620 bull0
+[(assemblers.)]609 bull2
+[(You don't need to define a stack segment.)]592 bull3
+[(All your segments should be in the same group, so that every time your code or data references a symbol)]575 bull1
+[(offset, all offsets are relative to the same segment base. This is because, when a )2(.COM)0( file is loaded, all the)]564 bull0
+[(segment registers contain the same value.)]553 bull2
+[{/section-8.3 xa}(Producing )2(.SYS)0( Files)](8.3)531.6 head3
+[(MS-DOS device drivers \226 )2(.SYS)0( files \226 are pure binary files, similar to )2(.COM)0( files, except that they start at)]514.6 norm1
+[(origin zero rather than )2(100h)0(. Therefore, if you are writing a device driver using the )2(bin)0( format, you do not)]503.6 norm0
+[(need the )2(ORG)0( directive, since the default origin for )2(bin)0( is zero. Similarly, if you are using )2(obj)0(, you do not)]492.6 norm0
+[(need the )2(RESB 100h)0( at the start of your code segment.)]481.6 norm2
+[2(.SYS)0( files start with a header structure, containing pointers to the various routines inside the driver which do)]464.6 norm1
+[(the work. This structure should be defined at the start of the code segment, even though it is not actually code.)]453.6 norm2
+[(For more information on the format of )2(.SYS)0( files, and the data which has to go in the header structure, a list)]436.6 norm1
+[(of books is given in the Frequently Asked Questions list for the newsgroup)]425.6 norm0
+[{(news:comp.os.msdos.programmer)wl}2(comp.os.msdos.programmer){el}0(.)]414.6 norm2
+[{/section-8.4 xa}(Interfacing to 16-bit C Programs)](8.4)393.2 head3
+[(This section covers the basics of writing assembly routines that call, or are called from, C programs. To do)]376.2 norm1
+[(this, you would typically write an assembly module as a )2(.OBJ)0( file, and link it with your C modules to)]365.2 norm0
+[(produce a )(mixed-language program.)]354.2 norm2
+[{/section-8.4.1 xa}(External Symbol Names)](8.4.1)335 subh3
+[(C compilers have the convention that the names of all global symbols \(functions or data\) they define are)]318 norm1
+[(formed by prefixing an underscore to the name as it appears in the C program. So, for example, the function a)]307 norm0
+[(C programmer thinks of as )2(printf)0( appears to an assembly language programmer as )2(_printf)0(. This means)]296 norm0
+[(that in your assembly programs, you can define symbols without a leading underscore, and not have to worry)]285 norm0
+[(about name clashes with C symbols.)]274 norm2
+[(If you find the underscores inconvenient, you can define macros to replace the )2(GLOBAL)0( and )2(EXTERN)]257 norm1
+[(directives as follows:)]246 norm2
+[2(%macro  cglobal 1 )]229 code1
+[2()]218 code0
+[2(  global  _%1 )]207 code0
+[2(  %define %1 _%1 )]196 code0
+[2()]185 code0
+[2(%endmacro )]174 code0
+[2()]163 code0
+[2(%macro  cextern 1 )]152 code0
+[2()]141 code0
+[2(  extern  _%1 )]130 code0
+[2(  %define %1 _%1 )]119 code0
+(94)pageeven
+restore showpage
+%%Page: 95 95
+%%BeginPageSetup
+save
+%%EndPageSetup
+/95 pa
+[2()]681 code0
+[2(%endmacro)]670 code2
+[(\(These forms of the macros only take one argument at a time; a )2(%rep)0( construct could solve this.\))]653 norm3
+[(If you then declare an external like this:)]636 norm3
+[2(cextern printf)]619 code3
+[(then the macro will expand it as)]602 norm3
+[2(extern  _printf )]585 code1
+[2(%define printf _printf)]574 code2
+[(Thereafter, you can reference )2(printf)0( as if it was a symbol, and the preprocessor will put the leading)]557 norm1
+[(underscore on where necessary.)]546 norm2
+[(The )2(cglobal)0( macro works similarly. You must use )2(cglobal)0( before defining the symbol in question, but)]529 norm1
+[(you would have had to do that anyway if you used )2(GLOBAL)0(.)]518 norm2
+[(Also see ){/section-2.1.27 xl}(section 2.1.27){el}(.)]501 norm3
+[{/section-8.4.2 xa}(Memory Models)](8.4.2)481.8 subh3
+[(NASM contains no mechanism to support the various C memory models directly; you have to keep track)]464.8 norm1
+[(yourself of which one you are writing for. This means you have to keep track of the following things:)]453.8 norm2
+[(In models using a single code segment \(tiny, small and compact\), functions are near. This means that)]436.8 bull1
+[(function pointers, when stored in data segments or pushed on the stack as function arguments, are 16 bits)]425.8 bull0
+[(long and contain only an offset field \(the )2(CS)0( register never changes its value, and always gives the segment)]414.8 bull0
+[(part of the full function address\), and that functions are called using ordinary near )2(CALL)0( instructions and)]403.8 bull0
+[(return using )2(RETN)0( \(which, in NASM, is synonymous with )2(RET)0( anyway\). This means both that you should)]392.8 bull0
+[(write your own routines to return with )2(RETN)0(, and that you should call external C routines with near )2(CALL)]381.8 bull0
+[(instructions.)]370.8 bull2
+[(In models using more than one code segment \(medium, large and huge\), functions are far. This means that)]353.8 bull1
+[(function pointers are 32 bits long \(consisting of a 16-bit offset followed by a 16-bit segment\), and that)]342.8 bull0
+[(functions are called using )2(CALL FAR)0( \(or )2(CALL seg:offset)0(\) and return using )2(RETF)0(. Again, you)]331.8 bull0
+[(should therefore write your own routines to return with )2(RETF)0( and use )2(CALL FAR)0( to call external routines.)]320.8 bull2
+[(In models using a single data segment \(tiny, small and medium\), data pointers are 16 bits long, containing)]303.8 bull1
+[(only an offset field \(the )2(DS)0( register doesn't change its value, and always gives the segment part of the full)]292.8 bull0
+[(data item address\).)]281.8 bull2
+[(In models using more than one data segment \(compact, large and huge\), data pointers are 32 bits long,)]264.8 bull1
+[(consisting of a 16-bit offset followed by a 16-bit segment. You should still be careful not to modify )2(DS)0( in)]253.8 bull0
+[(your routines without restoring it afterwards, but )2(ES)0( is free for you to use to access the contents of 32-bit)]242.8 bull0
+[(data pointers you are passed.)]231.8 bull2
+[(The huge memory model allows single data items to exceed 64K in size. In all other memory models, you)]214.8 bull1
+[(can access the whole of a data item just by doing arithmetic on the offset field of the pointer you are given,)]203.8 bull0
+[(whether a segment field is present or not; in huge model, you have to be more careful of your pointer)]192.8 bull0
+[(arithmetic.)]181.8 bull2
+[(In most memory models, there is a )1(default)0( data segment, whose segment address is kept in )2(DS)0( throughout)]164.8 bull1
+[(the program. This data segment is typically the same segment as the stack, kept in )2(SS)0(, so that functions')]153.8 bull0
+[(local variables \(which are stored on the stack\) and global data items can both be accessed easily without)]142.8 bull0
+[(changing )2(DS)0(. Particularly large data items are typically stored in other segments. However, some memory)]131.8 bull0
+[(models \(though not the standard ones, usually\) allow the assumption that )2(SS)0( and )2(DS)0( hold the same value to)]120.8 bull0
+[(be removed. Be careful about functions' local variables in this latter case.)]109.8 bull2
+(95)pageodd
+restore showpage
+%%Page: 96 96
+%%BeginPageSetup
+save
+%%EndPageSetup
+/96 pa
+[(In models with a single code segment, the segment is called )2(_TEXT)0(, so your code segment must also go by)]681 norm1
+[(this name in order to be linked into the same place as the main code segment. In models with a single data)]670 norm0
+[(segment, or with a default data segment, it is called )2(_DATA)0(.)]659 norm2
+[{/section-8.4.3 xa}(Function Definitions and Function Calls)](8.4.3)639.8 subh3
+[(The )(C calling convention in 16-bit programs is as follows. In the following description, the words )1(caller)0( and)]622.8 norm1
+[1(callee)0( are used to denote the function doing the calling and the function which gets called.)]611.8 norm2
+[(The caller pushes the function's parameters on the stack, one after another, in reverse order \(right to left, so)]594.8 bull1
+[(that the first argument specified to the function is pushed last\).)]583.8 bull2
+[(The caller then executes a )2(CALL)0( instruction to pass control to the callee. This )2(CALL)0( is either near or far)]566.8 bull1
+[(depending on the memory model.)]555.8 bull2
+[(The callee receives control, and typically \(although this is not actually necessary, in functions which do not)]538.8 bull1
+[(need to access their parameters\) starts by saving the value of )2(SP)0( in )2(BP)0( so as to be able to use )2(BP)0( as a base)]527.8 bull0
+[(pointer to find its parameters on the stack. However, the caller was probably doing this too, so part of the)]516.8 bull0
+[(calling convention states that )2(BP)0( must be preserved by any C function. Hence the callee, if it is going to set)]505.8 bull0
+[(up )2(BP)0( as a )1(frame pointer)0(, must push the previous value first.)]494.8 bull2
+[(The callee may then access its parameters relative to )2(BP)0(. The word at )2([BP])0( holds the previous value of )2(BP)]477.8 bull1
+[(as it was pushed; the next word, at )2([BP+2])0(, holds the offset part of the return address, pushed implicitly)]466.8 bull0
+[(by )2(CALL)0(. In a small-model \(near\) function, the parameters start after that, at )2([BP+4])0(; in a large-model)]455.8 bull0
+[(\(far\) function, the segment part of the return address lives at )2([BP+4])0(, and the parameters begin at)]444.8 bull0
+[2([BP+6])0(. The leftmost parameter of the function, since it was pushed last, is accessible at this offset from)]433.8 bull0
+[2(BP)0(; the others follow, at successively greater offsets. Thus, in a function such as )2(printf)0( which takes a)]422.8 bull0
+[(variable number of parameters, the pushing of the parameters in reverse order means that the function)]411.8 bull0
+[(knows where to find its first parameter, which tells it the number and type of the remaining ones.)]400.8 bull2
+[(The callee may also wish to decrease )2(SP)0( further, so as to allocate space on the stack for local variables,)]383.8 bull1
+[(which will then be accessible at negative offsets from )2(BP)0(.)]372.8 bull2
+[(The callee, if it wishes to return a value to the caller, should leave the value in )2(AL)0(, )2(AX)0( or )2(DX:AX)]355.8 bull1
+[(depending on the size of the value. Floating-point results are sometimes \(depending on the compiler\))]344.8 bull0
+[(returned in )2(ST0)0(.)]333.8 bull2
+[(Once the callee has finished processing, it restores )2(SP)0( from )2(BP)0( if it had allocated local stack space, then)]316.8 bull1
+[(pops the previous value of )2(BP)0(, and returns via )2(RETN)0( or )2(RETF)0( depending on memory model.)]305.8 bull2
+[(When the caller regains control from the callee, the function parameters are still on the stack, so it typically)]288.8 bull1
+[(adds an immediate constant to )2(SP)0( to remove them \(instead of executing a number of slow )2(POP)]277.8 bull0
+[(instructions\). Thus, if a function is accidentally called with the wrong number of parameters due to a)]266.8 bull0
+[(prototype mismatch, the stack will still be returned to a sensible state since the caller, which )1(knows)0( how)]255.8 bull0
+[(many parameters it pushed, does the removing.)]244.8 bull2
+[(It is instructive to compare this calling convention with that for Pascal programs \(described in ){/section-8.5.1 xl}(section 8.5.1){el}(\).)]227.8 norm1
+[(Pascal has a simpler convention, since no functions have variable numbers of parameters. Therefore the callee)]216.8 norm0
+[(knows how many parameters it should have been passed, and is able to deallocate them from the stack itself)]205.8 norm0
+[(by passing an immediate argument to the )2(RET)0( or )2(RETF)0( instruction, so the caller does not have to do it. Also,)]194.8 norm0
+[(the parameters are pushed in left-to-right order, not right-to-left, which means that a compiler can give)]183.8 norm0
+[(better guarantees about sequence points without performance suffering.)]172.8 norm2
+[(Thus, you would define a function in C style in the following way. The following example is for small model:)]155.8 norm3
+[2(global  _myfunc )]138.8 code1
+[2()]127.8 code0
+[2(_myfunc: )]116.8 code0
+[2(        push    bp )]105.8 code0
+(96)pageeven
+restore showpage
+%%Page: 97 97
+%%BeginPageSetup
+save
+%%EndPageSetup
+/97 pa
+[2(        mov     bp,sp )]681 code0
+[2(        sub     sp,0x40         ; 64 bytes of local stack space )]670 code0
+[2(        mov     bx,[bp+4]       ; first parameter to function )]659 code0
+[2()]648 code0
+[2(        ; some more code )]637 code0
+[2()]626 code0
+[2(        mov     sp,bp           ; undo "sub sp,0x40" above )]615 code0
+[2(        pop     bp )]604 code0
+[2(        ret)]593 code2
+[(For a large-model function, you would replace )2(RET)0( by )2(RETF)0(, and look for the first parameter at )2([BP+6])]576 norm1
+[(instead of )2([BP+4])0(. Of course, if one of the parameters is a pointer, then the offsets of )1(subsequent)0( parameters)]565 norm0
+[(will change depending on the memory model as well: far pointers take up four bytes on the stack when passed)]554 norm0
+[(as a parameter, whereas near pointers take up two.)]543 norm2
+[(At the other end of the process, to call a C function from your assembly code, you would do something like)]526 norm1
+[(this:)]515 norm2
+[2(extern  _printf )]498 code1
+[2()]487 code0
+[2(      ; and then, further down... )]476 code0
+[2()]465 code0
+[2(      push    word [myint]        ; one of my integer variables )]454 code0
+[2(      push    word mystring       ; pointer into my data segment )]443 code0
+[2(      call    _printf )]432 code0
+[2(      add     sp,byte 4           ; `byte' saves space )]421 code0
+[2()]410 code0
+[2(      ; then those data items... )]399 code0
+[2()]388 code0
+[2(segment _DATA )]377 code0
+[2()]366 code0
+[2(myint         dw    1234 )]355 code0
+[2(mystring      db    'This number -> %d <- should be 1234',10,0)]344 code2
+[(This piece of code is the small-model assembly equivalent of the C code)]327 norm3
+[2(    int myint = 1234; )]310 code1
+[2(    printf\("This number -> %d <- should be 1234\\n", myint\);)]299 code2
+[(In large model, the function-call code might look more like this. In this example, it is assumed that )2(DS)]282 norm1
+[(already holds the segment base of the segment )2(_DATA)0(. If not, you would have to initialize it first.)]271 norm2
+[2(      push    word [myint] )]254 code1
+[2(      push    word seg mystring   ; Now push the segment, and... )]243 code0
+[2(      push    word mystring       ; ... offset of "mystring" )]232 code0
+[2(      call    far _printf )]221 code0
+[2(      add    sp,byte 6)]210 code2
+[(The integer value still takes up one word on the stack, since large model does not affect the size of the )2(int)]193 norm1
+[(data type. The first argument \(pushed last\) to )2(printf)0(, however, is a data pointer, and therefore has to)]182 norm0
+[(contain a segment and offset part. The segment should be stored second in memory, and therefore must be)]171 norm0
+[(pushed first. \(Of course, )2(PUSH DS)0( would have been a shorter instruction than)]160 norm0
+[2(PUSH WORD SEG mystring)0(, if )2(DS)0( was set up as the above example assumed.\) Then the actual call)]149 norm0
+[(becomes a far call, since functions expect far calls in large model; and )2(SP)0( has to be increased by 6 rather than)]138 norm0
+[(4 afterwards to make up for the extra word of parameters.)]127 norm2
+(97)pageodd
+restore showpage
+%%Page: 98 98
+%%BeginPageSetup
+save
+%%EndPageSetup
+/98 pa
+[{/section-8.4.4 xa}(Accessing Data Items)](8.4.4)678.8 subh3
+[(To get at the contents of C variables, or to declare variables which C can access, you need only declare the)]661.8 norm1
+[(names as )2(GLOBAL)0( or )2(EXTERN)0(. \(Again, the names require leading underscores, as stated in ){/section-8.4.1 xl}(section 8.4.1){el}(.\))]650.8 norm0
+[(Thus, a C variable declared as )2(int i)0( can be accessed from assembler as)]639.8 norm2
+[2(extern _i )]622.8 code1
+[2()]611.8 code0
+[2(        mov ax,[_i])]600.8 code2
+[(And to declare your own integer variable which C programs can access as )2(extern int j)0(, you do this)]583.8 norm1
+[(\(making sure you are assembling in the )2(_DATA)0( segment, if necessary\):)]572.8 norm2
+[2(global  _j )]555.8 code1
+[2()]544.8 code0
+[2(_j      dw      0)]533.8 code2
+[(To access a C array, you need to know the size of the components of the array. For example, )2(int)0( variables)]516.8 norm1
+[(are two bytes long, so if a C program declares an array as )2(int a[10])0(, you can access )2(a[3])0( by coding)]505.8 norm0
+[2(mov ax,[_a+6])0(. \(The byte offset 6 is obtained by multiplying the desired array index, 3, by the size of the)]494.8 norm0
+[(array element, 2.\) The sizes of the C base types in 16-bit compilers are: 1 for )2(char)0(, 2 for )2(short)0( and )2(int)0(, 4)]483.8 norm0
+[(for )2(long)0( and )2(float)0(, and 8 for )2(double)0(.)]472.8 norm2
+[(To access a C )(data structure, you need to know the offset from the base of the structure to the field you are)]455.8 norm1
+[(interested in. You can either do this by converting the C structure definition into a NASM structure definition)]444.8 norm0
+[(\(using )2(STRUC)0(\), or by calculating the one offset and using just that.)]433.8 norm2
+[(To do either of these, you should read your C compiler's manual to find out how it organizes data structures.)]416.8 norm1
+[(NASM gives no special alignment to structure members in its own )2(STRUC)0( macro, so you have to specify)]405.8 norm0
+[(alignment yourself if the C compiler generates it. Typically, you might find that a structure like)]394.8 norm2
+[2(struct { )]377.8 code1
+[2(    char c; )]366.8 code0
+[2(    int i; )]355.8 code0
+[2(} foo;)]344.8 code2
+[(might be four bytes long rather than three, since the )2(int)0( field would be aligned to a two-byte boundary.)]327.8 norm1
+[(However, this sort of feature tends to be a configurable option in the C compiler, either using command-line)]316.8 norm0
+[(options or )2(#pragma)0( lines, so you have to find out how your own compiler does it.)]305.8 norm2
+[{/section-8.4.5 xa}2(c16.mac)0(: Helper Macros for the 16-bit C Interface)](8.4.5)286.6 subh3
+[(Included in the NASM archives, in the )2(misc)0( directory, is a file )2(c16.mac)0( of macros. It defines three macros:)]269.6 norm1
+[2(proc)0(, )2(arg)0( and )2(endproc)0(. These are intended to be used for C-style procedure definitions, and they)]258.6 norm0
+[(automate a lot of the work involved in keeping track of the calling convention.)]247.6 norm2
+[(\(An alternative, TASM compatible form of )2(arg)0( is also now built into NASM's preprocessor. See ){/section-4.8 xl}(section 4.8){el}]230.6 norm1
+[(for details.\))]219.6 norm2
+[(An example of an assembly function using the macro set is given here:)]202.6 norm3
+[2(proc    _nearproc )]185.6 code1
+[2()]174.6 code0
+[2(%$i     arg )]163.6 code0
+[2(%$j     arg )]152.6 code0
+[2(        mov     ax,[bp + %$i] )]141.6 code0
+[2(        mov     bx,[bp + %$j] )]130.6 code0
+[2(        add     ax,[bx] )]119.6 code0
+(98)pageeven
+restore showpage
+%%Page: 99 99
+%%BeginPageSetup
+save
+%%EndPageSetup
+/99 pa
+[2()]681 code0
+[2(endproc)]670 code2
+[(This defines )2(_nearproc)0( to be a procedure taking two arguments, the first \()2(i)0(\) an integer and the second \()2(j)0(\))]653 norm1
+[(a pointer to an integer. It returns )2(i + *j)0(.)]642 norm2
+[(Note that the )2(arg)0( macro has an )2(EQU)0( as the first line of its expansion, and since the label before the macro call)]625 norm1
+[(gets prepended to the first line of the expanded macro, the )2(EQU)0( works, defining )2(%$i)0( to be an offset from )2(BP)0(.)]614 norm0
+[(A context-local variable is used, local to the context pushed by the )2(proc)0( macro and popped by the)]603 norm0
+[2(endproc)0( macro, so that the same argument name can be used in later procedures. Of course, you don't )1(have)]592 norm0
+[(to do that.)]581 norm2
+[(The macro set produces code for near functions \(tiny, small and compact-model code\) by default. You can)]564 norm1
+[(have it generate far functions \(medium, large and huge-model code\) by means of coding)]553 norm0
+[2(%define FARCODE)0(. This changes the kind of return instruction generated by )2(endproc)0(, and also changes)]542 norm0
+[(the starting point for the argument offsets. The macro set contains no intrinsic dependency on whether data)]531 norm0
+[(pointers are far or not.)]520 norm2
+[2(arg)0( can take an optional parameter, giving the size of the argument. If no size is given, 2 is assumed, since it)]503 norm1
+[(is likely that many function parameters will be of type )2(int)0(.)]492 norm2
+[(The large-model equivalent of the above function would look like this:)]475 norm3
+[2(%define FARCODE )]458 code1
+[2()]447 code0
+[2(proc    _farproc )]436 code0
+[2()]425 code0
+[2(%$i     arg )]414 code0
+[2(%$j     arg     4 )]403 code0
+[2(        mov     ax,[bp + %$i] )]392 code0
+[2(        mov     bx,[bp + %$j] )]381 code0
+[2(        mov     es,[bp + %$j + 2] )]370 code0
+[2(        add     ax,[bx] )]359 code0
+[2()]348 code0
+[2(endproc)]337 code2
+[(This makes use of the argument to the )2(arg)0( macro to define a parameter of size 4, because )2(j)0( is now a far)]320 norm1
+[(pointer. When we load from )2(j)0(, we must load a segment and an offset.)]309 norm2
+[{/section-8.5 xa}(Interfacing to )(Borland Pascal Programs)](8.5)287.6 head3
+[(Interfacing to Borland Pascal programs is similar in concept to interfacing to 16-bit C programs. The)]270.6 norm1
+[(differences are:)]259.6 norm2
+[(The leading underscore required for interfacing to C programs is not required for Pascal.)]242.6 bull3
+[(The memory model is always large: functions are far, data pointers are far, and no data item can be more)]225.6 bull1
+[(than 64K long. \(Actually, some functions are near, but only those functions that are local to a Pascal unit)]214.6 bull0
+[(and never called from outside it. All assembly functions that Pascal calls, and all Pascal functions that)]203.6 bull0
+[(assembly routines are able to call, are far.\) However, all static data declared in a Pascal program goes into)]192.6 bull0
+[(the default data segment, which is the one whose segment address will be in )2(DS)0( when control is passed to)]181.6 bull0
+[(your assembly code. The only things that do not live in the default data segment are local variables \(they)]170.6 bull0
+[(live in the stack segment\) and dynamically allocated variables. All data )1(pointers)0(, however, are far.)]159.6 bull2
+[(The function calling convention is different \226 described below.)]142.6 bull3
+[(Some data types, such as strings, are stored differently.)]125.6 bull3
+(99)pageodd
+restore showpage
+%%Page: 100 100
+%%BeginPageSetup
+save
+%%EndPageSetup
+/100 pa
+[(There are restrictions on the segment names you are allowed to use \226 Borland Pascal will ignore code or)]681 bull1
+[(data declared in a segment it doesn't like the name of. The restrictions are described below.)]670 bull2
+[{/section-8.5.1 xa}(The Pascal Calling Convention)](8.5.1)650.8 subh3
+[(The 16-bit Pascal calling convention is as follows. In the following description, the words )1(caller)0( and )1(callee)]633.8 norm1
+[(are used to denote the function doing the calling and the function which gets called.)]622.8 norm2
+[(The caller pushes the function's parameters on the stack, one after another, in normal order \(left to right, so)]605.8 bull1
+[(that the first argument specified to the function is pushed first\).)]594.8 bull2
+[(The caller then executes a far )2(CALL)0( instruction to pass control to the callee.)]577.8 bull3
+[(The callee receives control, and typically \(although this is not actually necessary, in functions which do not)]560.8 bull1
+[(need to access their parameters\) starts by saving the value of )2(SP)0( in )2(BP)0( so as to be able to use )2(BP)0( as a base)]549.8 bull0
+[(pointer to find its parameters on the stack. However, the caller was probably doing this too, so part of the)]538.8 bull0
+[(calling convention states that )2(BP)0( must be preserved by any function. Hence the callee, if it is going to set)]527.8 bull0
+[(up )2(BP)0( as a )(frame pointer, must push the previous value first.)]516.8 bull2
+[(The callee may then access its parameters relative to )2(BP)0(. The word at )2([BP])0( holds the previous value of )2(BP)]499.8 bull1
+[(as it was pushed. The next word, at )2([BP+2])0(, holds the offset part of the return address, and the next one at)]488.8 bull0
+[2([BP+4])0( the segment part. The parameters begin at )2([BP+6])0(. The rightmost parameter of the function,)]477.8 bull0
+[(since it was pushed last, is accessible at this offset from )2(BP)0(; the others follow, at successively greater)]466.8 bull0
+[(offsets.)]455.8 bull2
+[(The callee may also wish to decrease )2(SP)0( further, so as to allocate space on the stack for local variables,)]438.8 bull1
+[(which will then be accessible at negative offsets from )2(BP)0(.)]427.8 bull2
+[(The callee, if it wishes to return a value to the caller, should leave the value in )2(AL)0(, )2(AX)0( or )2(DX:AX)]410.8 bull1
+[(depending on the size of the value. Floating-point results are returned in )2(ST0)0(. Results of type )2(Real)]399.8 bull0
+[(\(Borland's own custom floating-point data type, not handled directly by the FPU\) are returned in)]388.8 bull0
+[2(DX:BX:AX)0(. To return a result of type )2(String)0(, the caller pushes a pointer to a temporary string before)]377.8 bull0
+[(pushing the parameters, and the callee places the returned string value at that location. The pointer is not a)]366.8 bull0
+[(parameter, and should not be removed from the stack by the )2(RETF)0( instruction.)]355.8 bull2
+[(Once the callee has finished processing, it restores )2(SP)0( from )2(BP)0( if it had allocated local stack space, then)]338.8 bull1
+[(pops the previous value of )2(BP)0(, and returns via )2(RETF)0(. It uses the form of )2(RETF)0( with an immediate)]327.8 bull0
+[(parameter, giving the number of bytes taken up by the parameters on the stack. This causes the parameters)]316.8 bull0
+[(to be removed from the stack as a side effect of the return instruction.)]305.8 bull2
+[(When the caller regains control from the callee, the function parameters have already been removed from)]288.8 bull1
+[(the stack, so it needs to do nothing further.)]277.8 bull2
+[(Thus, you would define a function in Pascal style, taking two )2(Integer)0(\226type parameters, in the following)]260.8 norm1
+[(way:)]249.8 norm2
+[2(global  myfunc )]232.8 code1
+[2()]221.8 code0
+[2(myfunc: push    bp )]210.8 code0
+[2(        mov     bp,sp )]199.8 code0
+[2(        sub     sp,0x40         ; 64 bytes of local stack space )]188.8 code0
+[2(        mov     bx,[bp+8]       ; first parameter to function )]177.8 code0
+[2(        mov     bx,[bp+6]       ; second parameter to function )]166.8 code0
+[2()]155.8 code0
+[2(        ; some more code )]144.8 code0
+[2()]133.8 code0
+[2(        mov     sp,bp           ; undo "sub sp,0x40" above )]122.8 code0
+[2(        pop     bp )]111.8 code0
+[2(        retf    4               ; total size of params is 4)]100.8 code2
+(100)pageeven
+restore showpage
+%%Page: 101 101
+%%BeginPageSetup
+save
+%%EndPageSetup
+/101 pa
+[(At the other end of the process, to call a Pascal function from your assembly code, you would do something)]681 norm1
+[(like this:)]670 norm2
+[2(extern  SomeFunc )]653 code1
+[2()]642 code0
+[2(       ; and then, further down... )]631 code0
+[2()]620 code0
+[2(       push   word seg mystring   ; Now push the segment, and... )]609 code0
+[2(       push   word mystring       ; ... offset of "mystring" )]598 code0
+[2(       push   word [myint]        ; one of my variables )]587 code0
+[2(       call   far SomeFunc)]576 code2
+[(This is equivalent to the Pascal code)]559 norm3
+[2(procedure SomeFunc\(String: PChar; Int: Integer\); )]542 code1
+[2(    SomeFunc\(@mystring, myint\);)]531 code2
+[{/section-8.5.2 xa}(Borland Pascal )(Segment Name Restrictions)](8.5.2)511.8 subh3
+[(Since Borland Pascal's internal unit file format is completely different from )2(OBJ)0(, it only makes a very)]494.8 norm1
+[(sketchy job of actually reading and understanding the various information contained in a real )2(OBJ)0( file when it)]483.8 norm0
+[(links that in. Therefore an object file intended to be linked to a Pascal program must obey a number of)]472.8 norm0
+[(restrictions:)]461.8 norm2
+[(Procedures and functions must be in a segment whose name is either )2(CODE)0(, )2(CSEG)0(, or something ending in)]444.8 bull1
+[2(_TEXT)0(.)]433.8 bull2
+[(initialized data must be in a segment whose name is either )2(CONST)0( or something ending in )2(_DATA)0(.)]416.8 bull3
+[(Uninitialized data must be in a segment whose name is either )2(DATA)0(, )2(DSEG)0(, or something ending in )2(_BSS)0(.)]399.8 bull3
+[(Any other segments in the object file are completely ignored. )2(GROUP)0( directives and segment attributes are)]382.8 bull1
+[(also ignored.)]371.8 bull2
+[{/section-8.5.3 xa}(Using )2(c16.mac)0( With Pascal Programs)](8.5.3)352.6 subh3
+[(The )2(c16.mac)0( macro package, described in ){/section-8.4.5 xl}(section 8.4.5){el}(, can also be used to simplify writing functions to be)]335.6 norm1
+[(called from Pascal programs, if you code )2(%define PASCAL)0(. This definition ensures that functions are far)]324.6 norm0
+[(\(it implies )2(FARCODE)0(\), and also causes procedure return instructions to be generated with an operand.)]313.6 norm2
+[(Defining )2(PASCAL)0( does not change the code which calculates the argument offsets; you must declare your)]296.6 norm1
+[(function's arguments in reverse order. For example:)]285.6 norm2
+[2(%define PASCAL )]268.6 code1
+[2()]257.6 code0
+[2(proc    _pascalproc )]246.6 code0
+[2()]235.6 code0
+[2(%$j     arg 4 )]224.6 code0
+[2(%$i     arg )]213.6 code0
+[2(        mov     ax,[bp + %$i] )]202.6 code0
+[2(        mov     bx,[bp + %$j] )]191.6 code0
+[2(        mov     es,[bp + %$j + 2] )]180.6 code0
+[2(        add     ax,[bx] )]169.6 code0
+[2()]158.6 code0
+[2(endproc)]147.6 code2
+[(This defines the same routine, conceptually, as the example in ){/section-8.4.5 xl}(section 8.4.5){el}(: it defines a function taking two)]130.6 norm1
+[(arguments, an integer and a pointer to an integer, which returns the sum of the integer and the contents of the)]119.6 norm0
+(101)pageodd
+restore showpage
+%%Page: 102 102
+%%BeginPageSetup
+save
+%%EndPageSetup
+/102 pa
+[(pointer. The only difference between this code and the large-model C version is that )2(PASCAL)0( is defined)]681 norm0
+[(instead of )2(FARCODE)0(, and that the arguments are declared in reverse order.)]670 norm2
+(102)pageeven
+restore showpage
+%%Page: 103 103
+%%BeginPageSetup
+save
+%%EndPageSetup
+/103 pa
+[{/chapter-9 xa}(Chapter 9: Writing 32-bit Code \(Unix, Win32, DJGPP\))]642.8 chap3
+[(This chapter attempts to cover some of the common issues involved when writing 32-bit code, to run under)]607.8 norm1
+[(Win32 or Unix, or to be linked with C code generated by a Unix-style C compiler such as )(DJGPP. It covers)]596.8 norm0
+[(how to write assembly code to interface with 32-bit C routines, and how to write position-independent code)]585.8 norm0
+[(for shared libraries.)]574.8 norm2
+[(Almost all 32-bit code, and in particular all code running under )2(Win32)0(, )2(DJGPP)0( or any of the PC Unix)]557.8 norm1
+[(variants, runs in )1(flat)0( memory model. This means that the segment registers and paging have already been set)]546.8 norm0
+[(up to give you the same 32-bit 4Gb address space no matter what segment you work relative to, and that you)]535.8 norm0
+[(should ignore all segment registers completely. When writing flat-model application code, you never need to)]524.8 norm0
+[(use a segment override or modify any segment register, and the code-section addresses you pass to )2(CALL)0( and)]513.8 norm0
+[2(JMP)0( live in the same address space as the data-section addresses you access your variables by and the)]502.8 norm0
+[(stack-section addresses you access local variables and procedure parameters by. Every address is 32 bits long)]491.8 norm0
+[(and contains only an offset part.)]480.8 norm2
+[{/section-9.1 xa}(Interfacing to 32-bit C Programs)](9.1)459.4 head3
+[(A lot of the discussion in ){/section-8.4 xl}(section 8.4){el}(, about interfacing to 16-bit C programs, still applies when working in 32)]442.4 norm1
+[(bits. The absence of memory models or segmentation worries simplifies things a lot.)]431.4 norm2
+[{/section-9.1.1 xa}(External Symbol Names)](9.1.1)412.2 subh3
+[(Most 32-bit C compilers share the convention used by 16-bit compilers, that the names of all global symbols)]395.2 norm1
+[(\(functions or data\) they define are formed by prefixing an underscore to the name as it appears in the C)]384.2 norm0
+[(program. However, not all of them do: the )2(ELF)0( specification states that C symbols do )1(not)0( have a leading)]373.2 norm0
+[(underscore on their assembly-language names.)]362.2 norm2
+[(The older Linux )2(a.out)0( C compiler, all )2(Win32)0( compilers, )2(DJGPP)0(, and )2(NetBSD)0( and )2(FreeBSD)0(, all use the)]345.2 norm1
+[(leading underscore; for these compilers, the macros )2(cextern)0( and )2(cglobal)0(, as given in ){/section-8.4.1 xl}(section 8.4.1){el}(, will)]334.2 norm0
+[(still work. For )2(ELF)0(, though, the leading underscore should not be used.)]323.2 norm2
+[(See also ){/section-2.1.27 xl}(section 2.1.27){el}(.)]306.2 norm3
+[{/section-9.1.2 xa}(Function Definitions and Function Calls)](9.1.2)287 subh3
+[(The )(C calling convention in 32-bit programs is as follows. In the following description, the words )1(caller)0( and)]270 norm1
+[1(callee)0( are used to denote the function doing the calling and the function which gets called.)]259 norm2
+[(The caller pushes the function's parameters on the stack, one after another, in reverse order \(right to left, so)]242 bull1
+[(that the first argument specified to the function is pushed last\).)]231 bull2
+[(The caller then executes a near )2(CALL)0( instruction to pass control to the callee.)]214 bull3
+[(The callee receives control, and typically \(although this is not actually necessary, in functions which do not)]197 bull1
+[(need to access their parameters\) starts by saving the value of )2(ESP)0( in )2(EBP)0( so as to be able to use )2(EBP)0( as a)]186 bull0
+[(base pointer to find its parameters on the stack. However, the caller was probably doing this too, so part of)]175 bull0
+[(the calling convention states that )2(EBP)0( must be preserved by any C function. Hence the callee, if it is going)]164 bull0
+[(to set up )2(EBP)0( as a )(frame pointer, must push the previous value first.)]153 bull2
+[(The callee may then access its parameters relative to )2(EBP)0(. The doubleword at )2([EBP])0( holds the previous)]136 bull1
+[(value of )2(EBP)0( as it was pushed; the next doubleword, at )2([EBP+4])0(, holds the return address, pushed)]125 bull0
+[(implicitly by )2(CALL)0(. The parameters start after that, at )2([EBP+8])0(. The leftmost parameter of the function,)]114 bull0
+[(since it was pushed last, is accessible at this offset from )2(EBP)0(; the others follow, at successively greater)]103 bull0
+(103)pageodd
+restore showpage
+%%Page: 104 104
+%%BeginPageSetup
+save
+%%EndPageSetup
+/104 pa
+[(offsets. Thus, in a function such as )2(printf)0( which takes a variable number of parameters, the pushing of)]681 bull0
+[(the parameters in reverse order means that the function knows where to find its first parameter, which tells)]670 bull0
+[(it the number and type of the remaining ones.)]659 bull2
+[(The callee may also wish to decrease )2(ESP)0( further, so as to allocate space on the stack for local variables,)]642 bull1
+[(which will then be accessible at negative offsets from )2(EBP)0(.)]631 bull2
+[(The callee, if it wishes to return a value to the caller, should leave the value in )2(AL)0(, )2(AX)0( or )2(EAX)0( depending)]614 bull1
+[(on the size of the value. Floating-point results are typically returned in )2(ST0)0(.)]603 bull2
+[(Once the callee has finished processing, it restores )2(ESP)0( from )2(EBP)0( if it had allocated local stack space, then)]586 bull1
+[(pops the previous value of )2(EBP)0(, and returns via )2(RET)0( \(equivalently, )2(RETN)0(\).)]575 bull2
+[(When the caller regains control from the callee, the function parameters are still on the stack, so it typically)]558 bull1
+[(adds an immediate constant to )2(ESP)0( to remove them \(instead of executing a number of slow )2(POP)]547 bull0
+[(instructions\). Thus, if a function is accidentally called with the wrong number of parameters due to a)]536 bull0
+[(prototype mismatch, the stack will still be returned to a sensible state since the caller, which )1(knows)0( how)]525 bull0
+[(many parameters it pushed, does the removing.)]514 bull2
+[(There is an alternative calling convention used by Win32 programs for Windows API calls, and also for)]497 norm1
+[(functions called )1(by)0( the Windows API such as window procedures: they follow what Microsoft calls the)]486 norm0
+[2(__stdcall)0( convention. This is slightly closer to the Pascal convention, in that the callee clears the stack by)]475 norm0
+[(passing a parameter to the )2(RET)0( instruction. However, the parameters are still pushed in right-to-left order.)]464 norm2
+[(Thus, you would define a function in C style in the following way:)]447 norm3
+[2(global  _myfunc )]430 code1
+[2()]419 code0
+[2(_myfunc: )]408 code0
+[2(        push    ebp )]397 code0
+[2(        mov     ebp,esp )]386 code0
+[2(        sub     esp,0x40        ; 64 bytes of local stack space )]375 code0
+[2(        mov     ebx,[ebp+8]     ; first parameter to function )]364 code0
+[2()]353 code0
+[2(        ; some more code )]342 code0
+[2()]331 code0
+[2(        leave                   ; mov esp,ebp / pop ebp )]320 code0
+[2(        ret)]309 code2
+[(At the other end of the process, to call a C function from your assembly code, you would do something like)]292 norm1
+[(this:)]281 norm2
+[2(extern  _printf )]264 code1
+[2()]253 code0
+[2(        ; and then, further down... )]242 code0
+[2()]231 code0
+[2(        push    dword [myint]   ; one of my integer variables )]220 code0
+[2(        push    dword mystring  ; pointer into my data segment )]209 code0
+[2(        call    _printf )]198 code0
+[2(        add     esp,byte 8      ; `byte' saves space )]187 code0
+[2()]176 code0
+[2(        ; then those data items... )]165 code0
+[2()]154 code0
+[2(segment _DATA )]143 code0
+[2()]132 code0
+[2(myint       dd   1234 )]121 code0
+[2(mystring    db   'This number -> %d <- should be 1234',10,0)]110 code2
+(104)pageeven
+restore showpage
+%%Page: 105 105
+%%BeginPageSetup
+save
+%%EndPageSetup
+/105 pa
+[(This piece of code is the assembly equivalent of the C code)]681 norm3
+[2(    int myint = 1234; )]664 code1
+[2(    printf\("This number -> %d <- should be 1234\\n", myint\);)]653 code2
+[{/section-9.1.3 xa}(Accessing Data Items)](9.1.3)633.8 subh3
+[(To get at the contents of C variables, or to declare variables which C can access, you need only declare the)]616.8 norm1
+[(names as )2(GLOBAL)0( or )2(EXTERN)0(. \(Again, the names require leading underscores, as stated in ){/section-9.1.1 xl}(section 9.1.1){el}(.\))]605.8 norm0
+[(Thus, a C variable declared as )2(int i)0( can be accessed from assembler as)]594.8 norm2
+[2(          extern _i )]577.8 code1
+[2(          mov eax,[_i])]566.8 code2
+[(And to declare your own integer variable which C programs can access as )2(extern int j)0(, you do this)]549.8 norm1
+[(\(making sure you are assembling in the )2(_DATA)0( segment, if necessary\):)]538.8 norm2
+[2(          global _j )]521.8 code1
+[2(_j        dd 0)]510.8 code2
+[(To access a C array, you need to know the size of the components of the array. For example, )2(int)0( variables)]493.8 norm1
+[(are four bytes long, so if a C program declares an array as )2(int a[10])0(, you can access )2(a[3])0( by coding)]482.8 norm0
+[2(mov ax,[_a+12])0(. \(The byte offset 12 is obtained by multiplying the desired array index, 3, by the size of)]471.8 norm0
+[(the array element, 4.\) The sizes of the C base types in 32-bit compilers are: 1 for )2(char)0(, 2 for )2(short)0(, 4 for)]460.8 norm0
+[2(int)0(, )2(long)0( and )2(float)0(, and 8 for )2(double)0(. Pointers, being 32-bit addresses, are also 4 bytes long.)]449.8 norm2
+[(To access a C )(data structure, you need to know the offset from the base of the structure to the field you are)]432.8 norm1
+[(interested in. You can either do this by converting the C structure definition into a NASM structure definition)]421.8 norm0
+[(\(using )2(STRUC)0(\), or by calculating the one offset and using just that.)]410.8 norm2
+[(To do either of these, you should read your C compiler's manual to find out how it organizes data structures.)]393.8 norm1
+[(NASM gives no special alignment to structure members in its own )2(STRUC)0( macro, so you have to specify)]382.8 norm0
+[(alignment yourself if the C compiler generates it. Typically, you might find that a structure like)]371.8 norm2
+[2(struct { )]354.8 code1
+[2(    char c; )]343.8 code0
+[2(    int i; )]332.8 code0
+[2(} foo;)]321.8 code2
+[(might be eight bytes long rather than five, since the )2(int)0( field would be aligned to a four-byte boundary.)]304.8 norm1
+[(However, this sort of feature is sometimes a configurable option in the C compiler, either using)]293.8 norm0
+[(command-line options or )2(#pragma)0( lines, so you have to find out how your own compiler does it.)]282.8 norm2
+[{/section-9.1.4 xa}2(c32.mac)0(: Helper Macros for the 32-bit C Interface)](9.1.4)263.6 subh3
+[(Included in the NASM archives, in the )2(misc)0( directory, is a file )2(c32.mac)0( of macros. It defines three macros:)]246.6 norm1
+[2(proc)0(, )2(arg)0( and )2(endproc)0(. These are intended to be used for C-style procedure definitions, and they)]235.6 norm0
+[(automate a lot of the work involved in keeping track of the calling convention.)]224.6 norm2
+[(An example of an assembly function using the macro set is given here:)]207.6 norm3
+[2(proc    _proc32 )]190.6 code1
+[2()]179.6 code0
+[2(%$i     arg )]168.6 code0
+[2(%$j     arg )]157.6 code0
+[2(        mov     eax,[ebp + %$i] )]146.6 code0
+[2(        mov     ebx,[ebp + %$j] )]135.6 code0
+[2(        add     eax,[ebx] )]124.6 code0
+[2()]113.6 code0
+[2(endproc)]102.6 code2
+(105)pageodd
+restore showpage
+%%Page: 106 106
+%%BeginPageSetup
+save
+%%EndPageSetup
+/106 pa
+[(This defines )2(_proc32)0( to be a procedure taking two arguments, the first \()2(i)0(\) an integer and the second \()2(j)0(\) a)]681 norm1
+[(pointer to an integer. It returns )2(i + *j)0(.)]670 norm2
+[(Note that the )2(arg)0( macro has an )2(EQU)0( as the first line of its expansion, and since the label before the macro call)]653 norm1
+[(gets prepended to the first line of the expanded macro, the )2(EQU)0( works, defining )2(%$i)0( to be an offset from )2(BP)0(.)]642 norm0
+[(A context-local variable is used, local to the context pushed by the )2(proc)0( macro and popped by the)]631 norm0
+[2(endproc)0( macro, so that the same argument name can be used in later procedures. Of course, you don't )1(have)]620 norm0
+[(to do that.)]609 norm2
+[2(arg)0( can take an optional parameter, giving the size of the argument. If no size is given, 4 is assumed, since it)]592 norm1
+[(is likely that many function parameters will be of type )2(int)0( or pointers.)]581 norm2
+[{/section-9.2 xa}(Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF )(Shared Libraries)](9.2)559.6 head3
+[2(ELF)0( replaced the older )2(a.out)0( object file format under Linux because it contains support for)]542.6 norm1
+[(position-independent code \()(PIC\), which makes writing shared libraries much easier. NASM supports the )2(ELF)]531.6 norm0
+[(position-independent code features, so you can write Linux )2(ELF)0( shared libraries in NASM.)]520.6 norm2
+[(NetBSD, and its close cousins )(FreeBSD and )(OpenBSD, take a different approach by hacking PIC support into)]503.6 norm1
+[(the )2(a.out)0( format. NASM supports this as the )2(aoutb)0( output format, so you can write )(BSD shared libraries)]492.6 norm0
+[(in NASM too.)]481.6 norm2
+[(The operating system loads a PIC shared library by memory-mapping the library file at an arbitrarily chosen)]464.6 norm1
+[(point in the address space of the running process. The contents of the library's code section must therefore not)]453.6 norm0
+[(depend on where it is loaded in memory.)]442.6 norm2
+[(Therefore, you cannot get at your variables by writing code like this:)]425.6 norm3
+[2(        mov     eax,[myvar]             ; WRONG)]408.6 code3
+[(Instead, the linker provides an area of memory called the )1(global offset table)0(, or )(GOT; the GOT is situated at a)]391.6 norm1
+[(constant distance from your library's code, so if you can find out where your library is loaded \(which is)]380.6 norm0
+[(typically done using a )2(CALL)0( and )2(POP)0( combination\), you can obtain the address of the GOT, and you can then)]369.6 norm0
+[(load the addresses of your variables out of linker-generated entries in the GOT.)]358.6 norm2
+[(The )1(data)0( section of a PIC shared library does not have these restrictions: since the data section is writable, it)]341.6 norm1
+[(has to be copied into memory anyway rather than just paged in from the library file, so as long as it's being)]330.6 norm0
+[(copied it can be relocated too. So you can put ordinary types of relocation in the data section without too)]319.6 norm0
+[(much worry \(but see ){/section-9.2.4 xl}(section 9.2.4){el}( for a caveat\).)]308.6 norm2
+[{/section-9.2.1 xa}(Obtaining the Address of the GOT)](9.2.1)289.4 subh3
+[(Each code module in your shared library should define the GOT as an external symbol:)]272.4 norm3
+[2(extern  _GLOBAL_OFFSET_TABLE_   ; in ELF )]255.4 code1
+[2(extern  __GLOBAL_OFFSET_TABLE_  ; in BSD a.out)]244.4 code2
+[(At the beginning of any function in your shared library which plans to access your data or BSS sections, you)]227.4 norm1
+[(must first calculate the address of the GOT. This is typically done by writing the function in this form:)]216.4 norm2
+[2(func:   push    ebp )]199.4 code1
+[2(        mov     ebp,esp )]188.4 code0
+[2(        push    ebx )]177.4 code0
+[2(        call    .get_GOT )]166.4 code0
+[2(.get_GOT: )]155.4 code0
+[2(        pop     ebx )]144.4 code0
+[2(        add     ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc )]133.4 code0
+[2()]122.4 code0
+[2(        ; the function body comes here )]111.4 code0
+[2()]100.4 code0
+(106)pageeven
+restore showpage
+%%Page: 107 107
+%%BeginPageSetup
+save
+%%EndPageSetup
+/107 pa
+[2(        mov     ebx,[ebp-4] )]681 code0
+[2(        mov     esp,ebp )]670 code0
+[2(        pop     ebp )]659 code0
+[2(        ret)]648 code2
+[(\(For BSD, again, the symbol )2(_GLOBAL_OFFSET_TABLE)0( requires a second leading underscore.\))]631 norm3
+[(The first two lines of this function are simply the standard C prologue to set up a stack frame, and the last)]614 norm1
+[(three lines are standard C function epilogue. The third line, and the fourth to last line, save and restore the)]603 norm0
+[2(EBX)0( register, because PIC shared libraries use this register to store the address of the GOT.)]592 norm2
+[(The interesting bit is the )2(CALL)0( instruction and the following two lines. The )2(CALL)0( and )2(POP)0( combination)]575 norm1
+[(obtains the address of the label )2(.get_GOT)0(, without having to know in advance where the program was)]564 norm0
+[(loaded \(since the )2(CALL)0( instruction is encoded relative to the current position\). The )2(ADD)0( instruction makes use)]553 norm0
+[(of one of the special PIC relocation types: )(GOTPC relocation. With the )2(WRT ..gotpc)0( qualifier specified,)]542 norm0
+[(the symbol referenced \(here )2(_GLOBAL_OFFSET_TABLE_)0(, the special symbol assigned to the GOT\) is given)]531 norm0
+[(as an offset from the beginning of the section. \(Actually, )2(ELF)0( encodes it as the offset from the operand field)]520 norm0
+[(of the )2(ADD)0( instruction, but NASM simplifies this deliberately, so you do things the same way for both )2(ELF)]509 norm0
+[(and )2(BSD)0(.\) So the instruction then )1(adds)0( the beginning of the section, to get the real address of the GOT, and)]498 norm0
+[(subtracts the value of )2(.get_GOT)0( which it knows is in )2(EBX)0(. Therefore, by the time that instruction has)]487 norm0
+[(finished, )2(EBX)0( contains the address of the GOT.)]476 norm2
+[(If you didn't follow that, don't worry: it's never necessary to obtain the address of the GOT by any other)]459 norm1
+[(means, so you can put those three instructions into a macro and safely ignore them:)]448 norm2
+[2(%macro  get_GOT 0 )]431 code1
+[2()]420 code0
+[2(        call    %%getgot )]409 code0
+[2(  %%getgot: )]398 code0
+[2(        pop     ebx )]387 code0
+[2(        add     ebx,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc )]376 code0
+[2()]365 code0
+[2(%endmacro)]354 code2
+[{/section-9.2.2 xa}(Finding Your Local Data Items)](9.2.2)334.8 subh3
+[(Having got the GOT, you can then use it to obtain the addresses of your data items. Most variables will reside)]317.8 norm1
+[(in the sections you have declared; they can be accessed using the )2(..gotoff)0( special )2(WRT)0( type. The way this)]306.8 norm0
+[(works is like this:)]295.8 norm2
+[2(        lea     eax,[ebx+myvar wrt ..gotoff])]278.8 code3
+[(The expression )2(myvar wrt ..gotoff)0( is calculated, when the shared library is linked, to be the offset to)]261.8 norm1
+[(the local variable )2(myvar)0( from the beginning of the GOT. Therefore, adding it to )2(EBX)0( as above will place the)]250.8 norm0
+[(real address of )2(myvar)0( in )2(EAX)0(.)]239.8 norm2
+[(If you declare variables as )2(GLOBAL)0( without specifying a size for them, they are shared between code modules)]222.8 norm1
+[(in the library, but do not get exported from the library to the program that loaded it. They will still be in your)]211.8 norm0
+[(ordinary data and BSS sections, so you can access them in the same way as local variables, using the above)]200.8 norm0
+[2(..gotoff)0( mechanism.)]189.8 norm2
+[(Note that due to a peculiarity of the way BSD )2(a.out)0( format handles this relocation type, there must be at)]172.8 norm1
+[(least one non-local symbol in the same section as the address you're trying to access.)]161.8 norm2
+[{/section-9.2.3 xa}(Finding External and Common Data Items)](9.2.3)142.6 subh3
+[(If your library needs to get at an external variable \(external to the )1(library)0(, not just to one of the modules)]125.6 norm1
+[(within it\), you must use the )2(..got)0( type to get at it. The )2(..got)0( type, instead of giving you the offset from)]114.6 norm0
+[(the GOT base to the variable, gives you the offset from the GOT base to a GOT )1(entry)0( containing the address)]103.6 norm0
+(107)pageodd
+restore showpage
+%%Page: 108 108
+%%BeginPageSetup
+save
+%%EndPageSetup
+/108 pa
+[(of the variable. The linker will set up this GOT entry when it builds the library, and the dynamic linker will)]681 norm0
+[(place the correct address in it at load time. So to obtain the address of an external variable )2(extvar)0( in )2(EAX)0(,)]670 norm0
+[(you would code)]659 norm2
+[2(        mov     eax,[ebx+extvar wrt ..got])]642 code3
+[(This loads the address of )2(extvar)0( out of an entry in the GOT. The linker, when it builds the shared library,)]625 norm1
+[(collects together every relocation of type )2(..got)0(, and builds the GOT so as to ensure it has every necessary)]614 norm0
+[(entry present.)]603 norm2
+[(Common variables must also be accessed in this way.)]586 norm3
+[{/section-9.2.4 xa}(Exporting Symbols to the Library User)](9.2.4)566.8 subh3
+[(If you want to export symbols to the user of the library, you have to declare whether they are functions or)]549.8 norm1
+[(data, and if they are data, you have to give the size of the data item. This is because the dynamic linker has to)]538.8 norm0
+[(build )(procedure linkage table entries for any exported functions, and also moves exported data items away)]527.8 norm0
+[(from the library's data section in which they were declared.)]516.8 norm2
+[(So to export a function to users of the library, you must use)]499.8 norm3
+[2(global  func:function           ; declare it as a function )]482.8 code1
+[2()]471.8 code0
+[2(func:   push    ebp )]460.8 code0
+[2()]449.8 code0
+[2(        ; etc.)]438.8 code2
+[(And to export a data item such as an array, you would have to code)]421.8 norm3
+[2(global  array:data array.end-array      ; give the size too )]404.8 code1
+[2()]393.8 code0
+[2(array:  resd    128 )]382.8 code0
+[2(.end:)]371.8 code2
+[(Be careful: If you export a variable to the library user, by declaring it as )2(GLOBAL)0( and supplying a size, the)]354.8 norm1
+[(variable will end up living in the data section of the main program, rather than in your library's data section,)]343.8 norm0
+[(where you declared it. So you will have to access your own global variable with the )2(..got)0( mechanism rather)]332.8 norm0
+[(than )2(..gotoff)0(, as if it were external \(which, effectively, it has become\).)]321.8 norm2
+[(Equally, if you need to store the address of an exported global in one of your data sections, you can't do it by)]304.8 norm1
+[(means of the standard sort of code:)]293.8 norm2
+[2(dataptr:        dd      global_data_item        ; WRONG)]276.8 code3
+[(NASM will interpret this code as an ordinary relocation, in which )2(global_data_item)0( is merely an offset)]259.8 norm1
+[(from the beginning of the )2(.data)0( section \(or whatever\); so this reference will end up pointing at your data)]248.8 norm0
+[(section instead of at the exported global which resides elsewhere.)]237.8 norm2
+[(Instead of the above code, then, you must write)]220.8 norm3
+[2(dataptr:        dd      global_data_item wrt ..sym)]203.8 code3
+[(which makes use of the special )2(WRT)0( type )2(..sym)0( to instruct NASM to search the symbol table for a particular)]186.8 norm1
+[(symbol at that address, rather than just relocating by section base.)]175.8 norm2
+[(Either method will work for functions: referring to one of your functions by means of)]158.8 norm3
+[2(funcptr:        dd      my_function)]141.8 code3
+[(will give the user the address of the code you wrote, whereas)]124.8 norm3
+[2(funcptr:        dd      my_function wrt .sym)]107.8 code3
+(108)pageeven
+restore showpage
+%%Page: 109 109
+%%BeginPageSetup
+save
+%%EndPageSetup
+/109 pa
+[(will give the address of the procedure linkage table for the function, which is where the calling program will)]681 norm1
+[1(believe)0( the function lives. Either address is a valid way to call the function.)]670 norm2
+[{/section-9.2.5 xa}(Calling Procedures Outside the Library)](9.2.5)650.8 subh3
+[(Calling procedures outside your shared library has to be done by means of a )1(procedure linkage table)0(, or )(PLT.)]633.8 norm1
+[(The PLT is placed at a known offset from where the library is loaded, so the library code can make calls to the)]622.8 norm0
+[(PLT in a position-independent way. Within the PLT there is code to jump to offsets contained in the GOT, so)]611.8 norm0
+[(function calls to other shared libraries or to routines in the main program can be transparently passed off to)]600.8 norm0
+[(their real destinations.)]589.8 norm2
+[(To call an external routine, you must use another special PIC relocation type, )2(WRT ..plt)0(. This is much)]572.8 norm1
+[(easier than the GOT-based ones: you simply replace calls such as )2(CALL printf)0( with the PLT-relative)]561.8 norm0
+[(version )2(CALL printf WRT ..plt)0(.)]550.8 norm2
+[{/section-9.2.6 xa}(Generating the Library File)](9.2.6)531.6 subh3
+[(Having written some code modules and assembled them to )2(.o)0( files, you then generate your shared library)]514.6 norm1
+[(with a command such as)]503.6 norm2
+[2(ld -shared -o library.so module1.o module2.o       # for ELF )]486.6 code1
+[2(ld -Bshareable -o library.so module1.o module2.o   # for BSD)]475.6 code2
+[(For ELF, if your shared library is going to reside in system directories such as )2(/usr/lib)0( or )2(/lib)0(, it is)]458.6 norm1
+[(usually worth using the )2(-soname)0( flag to the linker, to store the final library file name, with a version)]447.6 norm0
+[(number, into the library:)]436.6 norm2
+[2(ld -shared -soname library.so.1 -o library.so.1.2 *.o)]419.6 code3
+[(You would then copy )2(library.so.1.2)0( into the library directory, and create )2(library.so.1)0( as a)]402.6 norm1
+[(symbolic link to it.)]391.6 norm2
+(109)pageodd
+restore showpage
+%%Page: 110 110
+%%BeginPageSetup
+save
+%%EndPageSetup
+/110 pa
+[{/chapter-10 xa}(Chapter 10: Mixing 16 and 32 Bit Code)]642.8 chap3
+[(This chapter tries to cover some of the issues, largely related to unusual forms of addressing and jump)]607.8 norm1
+[(instructions, encountered when writing operating system code such as protected-mode initialisation routines,)]596.8 norm0
+[(which require code that operates in mixed segment sizes, such as code in a 16-bit segment trying to modify)]585.8 norm0
+[(data in a 32-bit one, or jumps between different-size segments.)]574.8 norm2
+[{/section-10.1 xa}(Mixed-Size Jumps)](10.1)553.4 head3
+[(The most common form of )(mixed-size instruction is the one used when writing a 32-bit OS: having done)]536.4 norm1
+[(your setup in 16-bit mode, such as loading the kernel, you then have to boot it by switching into protected)]525.4 norm0
+[(mode and jumping to the 32-bit kernel start address. In a fully 32-bit OS, this tends to be the )1(only)0( mixed-size)]514.4 norm0
+[(instruction you need, since everything before it can be done in pure 16-bit code, and everything after it can be)]503.4 norm0
+[(pure 32-bit.)]492.4 norm2
+[(This jump must specify a 48-bit far address, since the target segment is a 32-bit one. However, it must be)]475.4 norm1
+[(assembled in a 16-bit segment, so just coding, for example,)]464.4 norm2
+[2(        jmp     0x1234:0x56789ABC       ; wrong!)]447.4 code3
+[(will not work, since the offset part of the address will be truncated to )2(0x9ABC)0( and the jump will be an)]430.4 norm1
+[(ordinary 16-bit far one.)]419.4 norm2
+[(The Linux kernel setup code gets round the inability of )2(as86)0( to generate the required instruction by coding it)]402.4 norm1
+[(manually, using )2(DB)0( instructions. NASM can go one better than that, by actually generating the right)]391.4 norm0
+[(instruction itself. Here's how to do it right:)]380.4 norm2
+[2(        jmp     dword 0x1234:0x56789ABC         ; right)]363.4 code3
+[(The )2(DWORD)0( prefix \(strictly speaking, it should come )1(after)0( the colon, since it is declaring the )1(offset)0( field to be a)]346.4 norm1
+[(doubleword; but NASM will accept either form, since both are unambiguous\) forces the offset part to be)]335.4 norm0
+[(treated as far, in the assumption that you are deliberately writing a jump from a 16-bit segment to a 32-bit)]324.4 norm0
+[(one.)]313.4 norm2
+[(You can do the reverse operation, jumping from a 32-bit segment to a 16-bit one, by means of the )2(WORD)]296.4 norm1
+[(prefix:)]285.4 norm2
+[2(        jmp     word 0x8765:0x4321      ; 32 to 16 bit)]268.4 code3
+[(If the )2(WORD)0( prefix is specified in 16-bit mode, or the )2(DWORD)0( prefix in 32-bit mode, they will be ignored,)]251.4 norm1
+[(since each is explicitly forcing NASM into a mode it was in anyway.)]240.4 norm2
+[{/section-10.2 xa}(Addressing Between Different-Size Segments)](10.2)219 head3
+[(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)]202 norm1
+[(some 16-bit segments and some 32-bit ones. At some point, you will probably end up writing code in a)]191 norm0
+[(16-bit segment which has to access data in a 32-bit segment, or vice versa.)]180 norm2
+[(If the data you are trying to access in a 32-bit segment lies within the first 64K of the segment, you may be)]163 norm1
+[(able to get away with using an ordinary 16-bit addressing operation for the purpose; but sooner or later, you)]152 norm0
+[(will want to do 32-bit addressing from 16-bit mode.)]141 norm2
+[(The easiest way to do this is to make sure you use a register for the address, since any effective address)]124 norm1
+[(containing a 32-bit register is forced to be a 32-bit address. So you can do)]113 norm2
+(110)pageeven
+restore showpage
+%%Page: 111 111
+%%BeginPageSetup
+save
+%%EndPageSetup
+/111 pa
+[2(        mov     eax,offset_into_32_bit_segment_specified_by_fs )]681 code1
+[2(        mov     dword [fs:eax],0x11223344)]670 code2
+[(This is fine, but slightly cumbersome \(since it wastes an instruction and a register\) if you already know the)]653 norm1
+[(precise offset you are aiming at. The x86 architecture does allow 32-bit effective addresses to specify nothing)]642 norm0
+[(but a 4-byte offset, so why shouldn't NASM be able to generate the best instruction for the purpose?)]631 norm2
+[(It can. As in ){/section-10.1 xl}(section 10.1){el}(, you need only prefix the address with the )2(DWORD)0( keyword, and it will be forced to)]614 norm1
+[(be a 32-bit address:)]603 norm2
+[2(        mov     dword [fs:dword my_offset],0x11223344)]586 code3
+[(Also as in ){/section-10.1 xl}(section 10.1){el}(, NASM is not fussy about whether the )2(DWORD)0( prefix comes before or after the)]569 norm1
+[(segment override, so arguably a nicer-looking way to code the above instruction is)]558 norm2
+[2(        mov     dword [dword fs:my_offset],0x11223344)]541 code3
+[(Don't confuse the )2(DWORD)0( prefix )1(outside)0( the square brackets, which controls the size of the data stored at the)]524 norm1
+[(address, with the one )2(inside)0( the square brackets which controls the length of the address itself. The two can)]513 norm0
+[(quite easily be different:)]502 norm2
+[2(        mov     word [dword 0x12345678],0x9ABC)]485 code3
+[(This moves 16 bits of data to an address specified by a 32-bit offset.)]468 norm3
+[(You can also specify )2(WORD)0( or )2(DWORD)0( prefixes along with the )2(FAR)0( prefix to indirect far jumps or calls. For)]451 norm1
+[(example:)]440 norm2
+[2(        call    dword far [fs:word 0x4321])]423 code3
+[(This instruction contains an address specified by a 16-bit offset; it loads a 48-bit far pointer from that \(16-bit)]406 norm1
+[(segment and 32-bit offset\), and calls that address.)]395 norm2
+[{/section-10.3 xa}(Other Mixed-Size Instructions)](10.3)373.6 head3
+[(The other way you might want to access data might be using the string instructions \()2(LODSx)0(, )2(STOSx)0( and so)]356.6 norm1
+[(on\) or the )2(XLATB)0( instruction. These instructions, since they take no parameters, might seem to have no easy)]345.6 norm0
+[(way to make them perform 32-bit addressing when assembled in a 16-bit segment.)]334.6 norm2
+[(This is the purpose of NASM's )2(a16)0(, )2(a32)0( and )2(a64)0( prefixes. If you are coding )2(LODSB)0( in a 16-bit segment)]317.6 norm1
+[(but it is supposed to be accessing a string in a 32-bit segment, you should load the desired address into )2(ESI)]306.6 norm0
+[(and then code)]295.6 norm2
+[2(        a32     lodsb)]278.6 code3
+[(The prefix forces the addressing size to 32 bits, meaning that )2(LODSB)0( loads from )2([DS:ESI])0( instead of)]261.6 norm1
+[2([DS:SI])0(. To access a string in a 16-bit segment when coding in a 32-bit one, the corresponding )2(a16)0( prefix)]250.6 norm0
+[(can be used.)]239.6 norm2
+[(The )2(a16)0(, )2(a32)0( and )2(a64)0( prefixes can be applied to any instruction in NASM's instruction table, but most of)]222.6 norm1
+[(them can generate all the useful forms without them. The prefixes are necessary only for instructions with)]211.6 norm0
+[(implicit addressing: )2(CMPSx)0(, )2(SCASx)0(, )2(LODSx)0(, )2(STOSx)0(, )2(MOVSx)0(, )2(INSx)0(, )2(OUTSx)0(, and )2(XLATB)0(. Also, the various)]200.6 norm0
+[(push and pop instructions \()2(PUSHA)0( and )2(POPF)0( as well as the more usual )2(PUSH)0( and )2(POP)0(\) can accept )2(a16)0(, )2(a32)]189.6 norm0
+[(or )2(a64)0( prefixes to force a particular one of )2(SP)0(, )2(ESP)0( or )2(RSP)0( to be used as a stack pointer, in case the stack)]178.6 norm0
+[(segment in use is a different size from the code segment.)]167.6 norm2
+[2(PUSH)0( and )2(POP)0(, when applied to segment registers in 32-bit mode, also have the slightly odd behaviour that)]150.6 norm1
+[(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)]139.6 norm0
+[(segment register being manipulated. To force the 16-bit behaviour of segment-register push and pop)]128.6 norm0
+[(instructions, you can use the operand-size prefix )2(o16)0(:)]117.6 norm2
+(111)pageodd
+restore showpage
+%%Page: 112 112
+%%BeginPageSetup
+save
+%%EndPageSetup
+/112 pa
+[2(        o16 push    ss )]681 code1
+[2(        o16 push    ds)]670 code2
+[(This code saves a doubleword of stack space by fitting two segment registers into the space which would)]653 norm1
+[(normally be consumed by pushing one.)]642 norm2
+[(\(You can also use the )2(o32)0( prefix to force the 32-bit behaviour when in 16-bit mode, but this seems less)]625 norm1
+[(useful.\))]614 norm2
+(112)pageeven
+restore showpage
+%%Page: 113 113
+%%BeginPageSetup
+save
+%%EndPageSetup
+/113 pa
+[{/chapter-11 xa}(Chapter 11: Writing 64-bit Code \(Unix, Win64\))]642.8 chap3
+[(This chapter attempts to cover some of the common issues involved when writing 64-bit code, to run under)]607.8 norm1
+[(Win64 or Unix. It covers how to write assembly code to interface with 64-bit C routines, and how to write)]596.8 norm0
+[(position-independent code for shared libraries.)]585.8 norm2
+[(All 64-bit code uses a flat memory model, since segmentation is not available in 64-bit mode. The one)]568.8 norm1
+[(exception is the )2(FS)0( and )2(GS)0( registers, which still add their bases.)]557.8 norm2
+[(Position independence in 64-bit mode is significantly simpler, since the processor supports )2(RIP)0(\226relative)]540.8 norm1
+[(addressing directly; see the )2(REL)0( keyword \(){/section-3.3 xl}(section 3.3){el}(\). On most 64-bit platforms, it is probably desirable to)]529.8 norm0
+[(make that the default, using the directive )2(DEFAULT REL)0( \(){/section-6.2 xl}(section 6.2){el}(\).)]518.8 norm2
+[(64-bit programming is relatively similar to 32-bit programming, but of course pointers are 64 bits long;)]501.8 norm1
+[(additionally, all existing platforms pass arguments in registers rather than on the stack. Furthermore, 64-bit)]490.8 norm0
+[(platforms use SSE2 by default for floating point. Please see the ABI documentation for your platform.)]479.8 norm2
+[(64-bit platforms differ in the sizes of the fundamental datatypes, not just from 32-bit platforms but from each)]462.8 norm1
+[(other. If a specific size data type is desired, it is probably best to use the types defined in the Standard C)]451.8 norm0
+[(header )2(<inttypes.h>)0(.)]440.8 norm2
+[(In 64-bit mode, the default instruction size is still 32 bits. When loading a value into a 32-bit register \(but not)]423.8 norm1
+[(an 8- or 16-bit register\), the upper 32 bits of the corresponding 64-bit register are set to zero.)]412.8 norm2
+[{/section-11.1 xa}(Register Names in 64-bit Mode)](11.1)391.4 head3
+[(NASM uses the following names for general-purpose registers in 64-bit mode, for 8-, 16-, 32- and 64-bit)]374.4 norm1
+[(references, respecitively:)]363.4 norm2
+[2(     AL/AH, CL/CH, DL/DH, BL/BH, SPL, BPL, SIL, DIL, R8B-R15B )]346.4 code1
+[2(     AX, CX, DX, BX, SP, BP, SI, DI, R8W-R15W )]335.4 code0
+[2(     EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, R8D-R15D )]324.4 code0
+[2(     RAX, RCX, RDX, RBX, RSP, RBP, RSI, RDI, R8-R15)]313.4 code2
+[(This is consistent with the AMD documentation and most other assemblers. The Intel documentation,)]296.4 norm1
+[(however, uses the names )2(R8L-R15L)0( for 8-bit references to the higher registers. It is possible to use those)]285.4 norm0
+[(names by definiting them as macros; similarly, if one wants to use numeric names for the low 8 registers,)]274.4 norm0
+[(define them as macros. The standard macro package )2(altreg)0( \(see ){/section-5.1 xl}(section 5.1){el}(\) can be used for this purpose.)]263.4 norm2
+[{/section-11.2 xa}(Immediates and Displacements in 64-bit Mode)](11.2)242 head3
+[(In 64-bit mode, immediates and displacements are generally only 32 bits wide. NASM will therefore truncate)]225 norm1
+[(most displacements and immediates to 32 bits.)]214 norm2
+[(The only instruction which takes a full )(64-bit immediate is:)]197 norm3
+[2(     MOV reg64,imm64)]180 code3
+[(NASM will produce this instruction whenever the programmer uses )2(MOV)0( with an immediate into a 64-bit)]163 norm1
+[(register. If this is not desirable, simply specify the equivalent 32-bit register, which will be automatically)]152 norm0
+[(zero-extended by the processor, or specify the immediate as )2(DWORD)0(:)]141 norm2
+[2(     mov rax,foo             ; 64-bit immediate )]124 code1
+[2(     mov rax,qword foo       ; \(identical\) )]113 code0
+(113)pageodd
+restore showpage
+%%Page: 114 114
+%%BeginPageSetup
+save
+%%EndPageSetup
+/114 pa
+[2(     mov eax,foo             ; 32-bit immediate, zero-extended )]681 code0
+[2(     mov rax,dword foo       ; 32-bit immediate, sign-extended)]670 code2
+[(The length of these instructions are 10, 5 and 7 bytes, respectively.)]653 norm3
+[(The only instructions which take a full )(64-bit )1(displacement)0( is loading or storing, using )2(MOV)0(, )2(AL)0(, )2(AX)0(, )2(EAX)0( or)]636 norm1
+[2(RAX)0( \(but no other registers\) to an absolute 64-bit address. Since this is a relatively rarely used instruction)]625 norm0
+[(\(64-bit code generally uses relative addressing\), the programmer has to explicitly declare the displacement)]614 norm0
+[(size as )2(QWORD)0(:)]603 norm2
+[2(     default abs )]586 code1
+[2()]575 code0
+[2(     mov eax,[foo]           ; 32-bit absolute disp, sign-extended )]564 code0
+[2(     mov eax,[a32 foo]       ; 32-bit absolute disp, zero-extended )]553 code0
+[2(     mov eax,[qword foo]     ; 64-bit absolute disp )]542 code0
+[2()]531 code0
+[2(     default rel )]520 code0
+[2()]509 code0
+[2(     mov eax,[foo]           ; 32-bit relative disp )]498 code0
+[2(     mov eax,[a32 foo]       ; d:o, address truncated to 32 bits\(!\) )]487 code0
+[2(     mov eax,[qword foo]     ; error )]476 code0
+[2(     mov eax,[abs qword foo] ; 64-bit absolute disp)]465 code2
+[(A sign-extended absolute displacement can access from \2262 GB to +2 GB; a zero-extended absolute)]448 norm1
+[(displacement can access from 0 to 4 GB.)]437 norm2
+[{/section-11.3 xa}(Interfacing to 64-bit C Programs \(Unix\))](11.3)415.6 head3
+[(On Unix, the 64-bit ABI is defined by the document:)]398.6 norm3
+[{(http://www.x86-64.org/documentation/abi.pdf)wl}2(http://www.x86-64.org/documentation/abi.pdf){el}]381.6 norm3
+[(Although written for AT&T-syntax assembly, the concepts apply equally well for NASM-style assembly.)]364.6 norm1
+[(What follows is a simplified summary.)]353.6 norm2
+[(The first six integer arguments \(from the left\) are passed in )2(RDI)0(, )2(RSI)0(, )2(RDX)0(, )2(RCX)0(, )2(R8)0(, and )2(R9)0(, in that order.)]336.6 norm1
+[(Additional integer arguments are passed on the stack. These registers, plus )2(RAX)0(, )2(R10)0( and )2(R11)0( are destroyed)]325.6 norm0
+[(by function calls, and thus are available for use by the function without saving.)]314.6 norm2
+[(Integer return values are passed in )2(RAX)0( and )2(RDX)0(, in that order.)]297.6 norm3
+[(Floating point is done using SSE registers, except for )2(long double)0(. Floating-point arguments are passed)]280.6 norm1
+[(in )2(XMM0)0( to )2(XMM7)0(; return is )2(XMM0)0( and )2(XMM1)0(. )2(long double)0( are passed on the stack, and returned in )2(ST0)]269.6 norm0
+[(and )2(ST1)0(.)]258.6 norm2
+[(All SSE and x87 registers are destroyed by function calls.)]241.6 norm3
+[(On 64-bit Unix, )2(long)0( is 64 bits.)]224.6 norm3
+[(Integer and SSE register arguments are counted separately, so for the case of)]207.6 norm3
+[2(     void foo\(long a, double b, int c\))]190.6 code3
+[2(a)0( is passed in )2(RDI)0(, )2(b)0( in )2(XMM0)0(, and )2(c)0( in )2(ESI)0(.)]173.6 norm3
+[{/section-11.4 xa}(Interfacing to 64-bit C Programs \(Win64\))](11.4)152.2 head3
+[(The Win64 ABI is described at:)]135.2 norm3
+[{(http://msdn2.microsoft.com/en-gb/library/ms794533.aspx)wl}2(http://msdn2.microsoft.com/en-gb/library/ms794533.aspx){el}]118.2 norm3
+[(What follows is a simplified summary.)]101.2 norm3
+(114)pageeven
+restore showpage
+%%Page: 115 115
+%%BeginPageSetup
+save
+%%EndPageSetup
+/115 pa
+[(The first four integer arguments are passed in )2(RCX)0(, )2(RDX)0(, )2(R8)0( and )2(R9)0(, in that order. Additional integer)]681 norm1
+[(arguments are passed on the stack. These registers, plus )2(RAX)0(, )2(R10)0( and )2(R11)0( are destroyed by function calls,)]670 norm0
+[(and thus are available for use by the function without saving.)]659 norm2
+[(Integer return values are passed in )2(RAX)0( only.)]642 norm3
+[(Floating point is done using SSE registers, except for )2(long double)0(. Floating-point arguments are passed)]625 norm1
+[(in )2(XMM0)0( to )2(XMM3)0(; return is )2(XMM0)0( only.)]614 norm2
+[(On Win64, )2(long)0( is 32 bits; )2(long long)0( or )2(_int64)0( is 64 bits.)]597 norm3
+[(Integer and SSE register arguments are counted together, so for the case of)]580 norm3
+[2(     void foo\(long long a, double b, int c\))]563 code3
+[2(a)0( is passed in )2(RCX)0(, )2(b)0( in )2(XMM1)0(, and )2(c)0( in )2(R8D)0(.)]546 norm3
+(115)pageodd
+restore showpage
+%%Page: 116 116
+%%BeginPageSetup
+save
+%%EndPageSetup
+/116 pa
+[{/chapter-12 xa}(Chapter 12: Troubleshooting)]642.8 chap3
+[(This chapter describes some of the common problems that users have been known to encounter with NASM,)]607.8 norm1
+[(and answers them. It also gives instructions for reporting bugs in NASM if you find a difficulty that isn't)]596.8 norm0
+[(listed here.)]585.8 norm2
+[{/section-12.1 xa}(Common Problems)](12.1)564.4 head3
+[{/section-12.1.1 xa}(NASM Generates )(Inefficient Code)](12.1.1)545.2 subh3
+[(We sometimes get `bug' reports about NASM generating inefficient, or even `wrong', code on instructions)]528.2 norm1
+[(such as )2(ADD ESP,8)0(. This is a deliberate design feature, connected to predictability of output: NASM, on)]517.2 norm0
+[(seeing )2(ADD ESP,8)0(, will generate the form of the instruction which leaves room for a 32-bit offset. You)]506.2 norm0
+[(need to code )2(ADD ESP,BYTE 8)0( if you want the space-efficient form of the instruction. This isn't a bug, it's)]495.2 norm0
+[(user error: if you prefer to have NASM produce the more efficient code automatically enable optimization)]484.2 norm0
+[(with the )2(-O)0( option \(see ){/section-2.1.22 xl}(section 2.1.22){el}(\).)]473.2 norm2
+[{/section-12.1.2 xa}(My Jumps are Out of Range)](12.1.2)454 subh3
+[(Similarly, people complain that when they issue )(conditional jumps \(which are )2(SHORT)0( by default\) that try to)]437 norm1
+[(jump too far, NASM reports `short jump out of range' instead of making the jumps longer.)]426 norm2
+[(This, again, is partly a predictability issue, but in fact has a more practical reason as well. NASM has no)]409 norm1
+[(means of being told what type of processor the code it is generating will be run on; so it cannot decide for)]398 norm0
+[(itself that it should generate )2(Jcc NEAR)0( type instructions, because it doesn't know that it's working for a 386)]387 norm0
+[(or above. Alternatively, it could replace the out-of-range short )2(JNE)0( instruction with a very short )2(JE)]376 norm0
+[(instruction that jumps over a )2(JMP NEAR)0(; this is a sensible solution for processors below a 386, but hardly)]365 norm0
+[(efficient on processors which have good branch prediction )1(and)0( could have used )2(JNE NEAR)0( instead. So, once)]354 norm0
+[(again, it's up to the user, not the assembler, to decide what instructions should be generated. See ){/section-2.1.22 xl}(section){el}]343 norm0
+[{/section-2.1.22 xl}(2.1.22){el}(.)]332 norm2
+[{/section-12.1.3 xa}2(ORG)0( Doesn't Work)](12.1.3)312.8 subh3
+[(People writing )(boot sector programs in the )2(bin)0( format often complain that )2(ORG)0( doesn't work the way they'd)]295.8 norm1
+[(like: in order to place the )2(0xAA55)0( signature word at the end of a 512-byte boot sector, people who are used)]284.8 norm0
+[(to MASM tend to code)]273.8 norm2
+[2(        ORG 0 )]256.8 code1
+[2()]245.8 code0
+[2(        ; some boot sector code )]234.8 code0
+[2()]223.8 code0
+[2(        ORG 510 )]212.8 code0
+[2(        DW 0xAA55)]201.8 code2
+[(This is not the intended use of the )2(ORG)0( directive in NASM, and will not work. The correct way to solve this)]184.8 norm1
+[(problem in NASM is to use the )2(TIMES)0( directive, like this:)]173.8 norm2
+[2(        ORG 0 )]156.8 code1
+[2()]145.8 code0
+[2(        ; some boot sector code )]134.8 code0
+[2()]123.8 code0
+[2(        TIMES 510-\($-$$\) DB 0 )]112.8 code0
+[2(        DW 0xAA55)]101.8 code2
+(116)pageeven
+restore showpage
+%%Page: 117 117
+%%BeginPageSetup
+save
+%%EndPageSetup
+/117 pa
+[(The )2(TIMES)0( directive will insert exactly enough zero bytes into the output to move the assembly point up to)]681 norm1
+[(510. This method also has the advantage that if you accidentally fill your boot sector too full, NASM will)]670 norm0
+[(catch the problem at assembly time and report it, so you won't end up with a boot sector that you have to)]659 norm0
+[(disassemble to find out what's wrong with it.)]648 norm2
+[{/section-12.1.4 xa}2(TIMES)0( Doesn't Work)](12.1.4)628.8 subh3
+[(The other common problem with the above code is people who write the )2(TIMES)0( line as)]611.8 norm3
+[2(        TIMES 510-$ DB 0)]594.8 code3
+[(by reasoning that )2($)0( should be a pure number, just like 510, so the difference between them is also a pure)]577.8 norm1
+[(number and can happily be fed to )2(TIMES)0(.)]566.8 norm2
+[(NASM is a )1(modular)0( assembler: the various component parts are designed to be easily separable for re-use, so)]549.8 norm1
+[(they don't exchange information unnecessarily. In consequence, the )2(bin)0( output format, even though it has)]538.8 norm0
+[(been told by the )2(ORG)0( directive that the )2(.text)0( section should start at 0, does not pass that information back to)]527.8 norm0
+[(the expression evaluator. So from the evaluator's point of view, )2($)0( isn't a pure number: it's an offset from a)]516.8 norm0
+[(section base. Therefore the difference between )2($)0( and 510 is also not a pure number, but involves a section)]505.8 norm0
+[(base. Values involving section bases cannot be passed as arguments to )2(TIMES)0(.)]494.8 norm2
+[(The solution, as in the previous section, is to code the )2(TIMES)0( line in the form)]477.8 norm3
+[2(        TIMES 510-\($-$$\) DB 0)]460.8 code3
+[(in which )2($)0( and )2($$)0( are offsets from the same section base, and so their difference is a pure number. This will)]443.8 norm1
+[(solve the problem and generate sensible code.)]432.8 norm2
+[{/section-12.2 xa}(Bugs)](12.2)411.4 head3
+[(We have never yet released a version of NASM with any )1(known)0( bugs. That doesn't usually stop there being)]394.4 norm1
+[(plenty we didn't know about, though. Any that you find should be reported firstly via the )2(bugtracker)0( at)]383.4 norm0
+[{(https://sourceforge.net/projects/nasm/)wl}2(https://sourceforge.net/projects/nasm/){el}0( \(click on "Bugs"\), or if that fails then through one of)]372.4 norm0
+[(the contacts in ){/section-1.2 xl}(section 1.2){el}(.)]361.4 norm2
+[(Please read ){/section-2.2 xl}(section 2.2){el}( first, and don't report the bug if it's listed in there as a deliberate feature. \(If you think)]344.4 norm1
+[(the feature is badly thought out, feel free to send us reasons why you think it should be changed, but don't just)]333.4 norm0
+[(send us mail saying `This is a bug' if the documentation says we did it on purpose.\) Then read ){/section-12.1 xl}(section 12.1){el}(,)]322.4 norm0
+[(and don't bother reporting the bug if it's listed there.)]311.4 norm2
+[(If you do report a bug, )1(please)0( give us all of the following information:)]294.4 norm3
+[(What operating system you're running NASM under. DOS, Linux, NetBSD, Win16, Win32, VMS \(I'd be)]277.4 bull1
+[(impressed\), whatever.)]266.4 bull2
+[(If you're running NASM under DOS or Win32, tell us whether you've compiled your own executable from)]249.4 bull1
+[(the DOS source archive, or whether you were using the standard distribution binaries out of the archive. If)]238.4 bull0
+[(you were using a locally built executable, try to reproduce the problem using one of the standard binaries,)]227.4 bull0
+[(as this will make it easier for us to reproduce your problem prior to fixing it.)]216.4 bull2
+[(Which version of NASM you're using, and exactly how you invoked it. Give us the precise command line,)]199.4 bull1
+[(and the contents of the )2(NASMENV)0( environment variable if any.)]188.4 bull2
+[(Which versions of any supplementary programs you're using, and how you invoked them. If the problem)]171.4 bull1
+[(only becomes visible at link time, tell us what linker you're using, what version of it you've got, and the)]160.4 bull0
+[(exact linker command line. If the problem involves linking against object files generated by a compiler, tell)]149.4 bull0
+[(us what compiler, what version, and what command line or options you used. \(If you're compiling in an)]138.4 bull0
+[(IDE, please try to reproduce the problem with the command-line version of the compiler.\))]127.4 bull2
+(117)pageodd
+restore showpage
+%%Page: 118 118
+%%BeginPageSetup
+save
+%%EndPageSetup
+/118 pa
+[(If at all possible, send us a NASM source file which exhibits the problem. If this causes copyright)]681 bull1
+[(problems \(e.g. you can only reproduce the bug in restricted-distribution code\) then bear in mind the)]670 bull0
+[(following two points: firstly, we guarantee that any source code sent to us for the purposes of debugging)]659 bull0
+[(NASM will be used )1(only)0( for the purposes of debugging NASM, and that we will delete all our copies of it)]648 bull0
+[(as soon as we have found and fixed the bug or bugs in question; and secondly, we would prefer )1(not)0( to be)]637 bull0
+[(mailed large chunks of code anyway. The smaller the file, the better. A three-line sample file that does)]626 bull0
+[(nothing useful )1(except)0( demonstrate the problem is much easier to work with than a fully fledged)]615 bull0
+[(ten-thousand-line program. \(Of course, some errors )1(do)0( only crop up in large files, so this may not be)]604 bull0
+[(possible.\))]593 bull2
+[(A description of what the problem actually )1(is)0(. `It doesn't work' is )1(not)0( a helpful description! Please describe)]576 bull1
+[(exactly what is happening that shouldn't be, or what isn't happening that should. Examples might be:)]565 bull0
+[(`NASM generates an error message saying Line 3 for an error that's actually on Line 5'; `NASM generates)]554 bull0
+[(an error message that I believe it shouldn't be generating at all'; `NASM fails to generate an error message)]543 bull0
+[(that I believe it )1(should)0( be generating'; `the object file produced from this source code crashes my linker';)]532 bull0
+[(`the ninth byte of the output file is 66 and I think it should be 77 instead'.)]521 bull2
+[(If you believe the output file from NASM to be faulty, send it to us. That allows us to determine whether)]504 bull1
+[(our own copy of NASM generates the same file, or whether the problem is related to portability issues)]493 bull0
+[(between our development platforms and yours. We can handle binary files mailed to us as MIME)]482 bull0
+[(attachments, uuencoded, and even BinHex. Alternatively, we may be able to provide an FTP site you can)]471 bull0
+[(upload the suspect files to; but mailing them is easier for us.)]460 bull2
+[(Any other information or data files that might be helpful. If, for example, the problem involves NASM)]443 bull1
+[(failing to generate an object file while TASM can generate an equivalent file without trouble, then send us)]432 bull0
+[1(both)0( object files, so we can see what TASM is doing differently from us.)]421 bull2
+(118)pageeven
+restore showpage
+%%Page: 119 119
+%%BeginPageSetup
+save
+%%EndPageSetup
+/119 pa
+[{/appendix-A xa}(Appendix A: )(Ndisasm)]642.8 appn3
+[(The Netwide Disassembler, NDISASM)]601.8 norm3
+[{/section-A.1 xa}(Introduction)](A.1)580.4 head3
+[(The Netwide Disassembler is a small companion program to the Netwide Assembler, NASM. It seemed a)]563.4 norm1
+[(shame to have an x86 assembler, complete with a full instruction table, and not make as much use of it as)]552.4 norm0
+[(possible, so here's a disassembler which shares the instruction table \(and some other bits of code\) with NASM.)]541.4 norm2
+[(The Netwide Disassembler does nothing except to produce disassemblies of )1(binary)0( source files. NDISASM)]524.4 norm1
+[(does not have any understanding of object file formats, like )2(objdump)0(, and it will not understand )2(DOS .EXE)]513.4 norm0
+[(files like )2(debug)0( will. It just disassembles.)]502.4 norm2
+[{/section-A.2 xa}(Getting Started: Installation)](A.2)481 head3
+[(See ){/section-1.3 xl}(section 1.3){el}( for installation instructions. NDISASM, like NASM, has a )2(man page)0( which you may want)]464 norm1
+[(to put somewhere useful, if you are on a Unix system.)]453 norm2
+[{/section-A.3 xa}(Running NDISASM)](A.3)431.6 head3
+[(To disassemble a file, you will typically use a command of the form)]414.6 norm3
+[2(       ndisasm -b {16|32|64} filename)]397.6 code3
+[(NDISASM can disassemble 16-, 32- or 64-bit code equally easily, provided of course that you remember to)]380.6 norm1
+[(specify which it is to work with. If no )2(-b)0( switch is present, NDISASM works in 16-bit mode by default. The)]369.6 norm0
+[2(-u)0( switch \(for USE32\) also invokes 32-bit mode.)]358.6 norm2
+[(Two more command line options are )2(-r)0( which reports the version number of NDISASM you are running, and)]341.6 norm1
+[2(-h)0( which gives a short summary of command line options.)]330.6 norm2
+[{/section-A.3.1 xa}(COM Files: Specifying an Origin)](A.3.1)311.4 subh3
+[(To disassemble a )2(DOS .COM)0( file correctly, a disassembler must assume that the first instruction in the file is)]294.4 norm1
+[(loaded at address )2(0x100)0(, rather than at zero. NDISASM, which assumes by default that any file you give it is)]283.4 norm0
+[(loaded at zero, will therefore need to be informed of this.)]272.4 norm2
+[(The )2(-o)0( option allows you to declare a different origin for the file you are disassembling. Its argument may be)]255.4 norm1
+[(expressed in any of the NASM numeric formats: decimal by default, if it begins with `)2($)0(' or `)2(0x)0(' or ends in)]244.4 norm0
+[(`)2(H)0(' it's )2(hex)0(, if it ends in `)2(Q)0(' it's )2(octal)0(, and if it ends in `)2(B)0(' it's )2(binary)0(.)]233.4 norm2
+[(Hence, to disassemble a )2(.COM)0( file:)]216.4 norm3
+[2(       ndisasm -o100h filename.com)]199.4 code3
+[(will do the trick.)]182.4 norm3
+[{/section-A.3.2 xa}(Code Following Data: Synchronisation)](A.3.2)163.2 subh3
+[(Suppose you are disassembling a file which contains some data which isn't machine code, and )1(then)0( contains)]146.2 norm1
+[(some machine code. NDISASM will faithfully plough through the data section, producing machine)]135.2 norm0
+[(instructions wherever it can \(although most of them will look bizarre, and some may have unusual prefixes,)]124.2 norm0
+[(e.g. `)2(FS OR AX,0x240A)0('\), and generating `DB' instructions ever so often if it's totally stumped. Then it)]113.2 norm0
+[(will reach the code section.)]102.2 norm2
+(119)pageodd
+restore showpage
+%%Page: 120 120
+%%BeginPageSetup
+save
+%%EndPageSetup
+/120 pa
+[(Supposing NDISASM has just finished generating a strange machine instruction from part of the data section,)]681 norm1
+[(and its file position is now one byte )1(before)0( the beginning of the code section. It's entirely possible that another)]670 norm0
+[(spurious instruction will get generated, starting with the final byte of the data section, and then the correct first)]659 norm0
+[(instruction in the code section will not be seen because the starting point skipped over it. This isn't really ideal.)]648 norm2
+[(To avoid this, you can specify a `)2(synchronisation)0(' point, or indeed as many synchronisation points as)]631 norm1
+[(you like \(although NDISASM can only handle 2147483647 sync points internally\). The definition of a sync)]620 norm0
+[(point is this: NDISASM guarantees to hit sync points exactly during disassembly. If it is thinking about)]609 norm0
+[(generating an instruction which would cause it to jump over a sync point, it will discard that instruction and)]598 norm0
+[(output a `)2(db)0(' instead. So it )1(will)0( start disassembly exactly from the sync point, and so you )1(will)0( see all the)]587 norm0
+[(instructions in your code section.)]576 norm2
+[(Sync points are specified using the )2(-s)0( option: they are measured in terms of the program origin, not the file)]559 norm1
+[(position. So if you want to synchronize after 32 bytes of a )2(.COM)0( file, you would have to do)]548 norm2
+[2(       ndisasm -o100h -s120h file.com)]531 code3
+[(rather than)]514 norm3
+[2(       ndisasm -o100h -s20h file.com)]497 code3
+[(As stated above, you can specify multiple sync markers if you need to, just by repeating the )2(-s)0( option.)]480 norm3
+[{/section-A.3.3 xa}(Mixed Code and Data: Automatic \(Intelligent\) Synchronisation )](A.3.3)460.8 subh3
+[(Suppose you are disassembling the boot sector of a )2(DOS)0( floppy \(maybe it has a virus, and you need to)]443.8 norm1
+[(understand the virus so that you know what kinds of damage it might have done you\). Typically, this will)]432.8 norm0
+[(contain a )2(JMP)0( instruction, then some data, then the rest of the code. So there is a very good chance of)]421.8 norm0
+[(NDISASM being )1(misaligned)0( when the data ends and the code begins. Hence a sync point is needed.)]410.8 norm2
+[(On the other hand, why should you have to specify the sync point manually? What you'd do in order to find)]393.8 norm1
+[(where the sync point would be, surely, would be to read the )2(JMP)0( instruction, and then to use its target address)]382.8 norm0
+[(as a sync point. So can NDISASM do that for you?)]371.8 norm2
+[(The answer, of course, is yes: using either of the synonymous switches )2(-a)0( \(for automatic sync\) or )2(-i)0( \(for)]354.8 norm1
+[(intelligent sync\) will enable )2(auto-sync)0( mode. Auto-sync mode automatically generates a sync point for)]343.8 norm0
+[(any forward-referring PC-relative jump or call instruction that NDISASM encounters. \(Since NDISASM is)]332.8 norm0
+[(one-pass, if it encounters a PC-relative jump whose target has already been processed, there isn't much it can)]321.8 norm0
+[(do about it...\))]310.8 norm2
+[(Only PC-relative jumps are processed, since an absolute jump is either through a register \(in which case)]293.8 norm1
+[(NDISASM doesn't know what the register contains\) or involves a segment address \(in which case the target)]282.8 norm0
+[(code isn't in the same segment that NDISASM is working in, and so the sync point can't be placed anywhere)]271.8 norm0
+[(useful\).)]260.8 norm2
+[(For some kinds of file, this mechanism will automatically put sync points in all the right places, and save you)]243.8 norm1
+[(from having to place any sync points manually. However, it should be stressed that auto-sync mode is )1(not)]232.8 norm0
+[(guaranteed to catch all the sync points, and you may still have to place some manually.)]221.8 norm2
+[(Auto-sync mode doesn't prevent you from declaring manual sync points: it just adds automatically generated)]204.8 norm1
+[(ones to the ones you provide. It's perfectly feasible to specify )2(-i)0( )1(and)0( some )2(-s)0( options.)]193.8 norm2
+[(Another caveat with auto-sync mode is that if, by some unpleasant fluke, something in your data section)]176.8 norm1
+[(should disassemble to a PC-relative call or jump instruction, NDISASM may obediently place a sync point in)]165.8 norm0
+[(a totally random place, for example in the middle of one of the instructions in your code section. So you may)]154.8 norm0
+[(end up with a wrong disassembly even if you use auto-sync. Again, there isn't much I can do about this. If)]143.8 norm0
+[(you have problems, you'll have to use manual sync points, or use the )2(-k)0( option \(documented below\) to)]132.8 norm0
+[(suppress disassembly of the data area.)]121.8 norm2
+(120)pageeven
+restore showpage
+%%Page: 121 121
+%%BeginPageSetup
+save
+%%EndPageSetup
+/121 pa
+[{/section-A.3.4 xa}(Other Options)](A.3.4)678.8 subh3
+[(The )2(-e)0( option skips a header on the file, by ignoring the first N bytes. This means that the header is )1(not)]661.8 norm1
+[(counted towards the disassembly offset: if you give )2(-e10 -o10)0(, disassembly will start at byte 10 in the file,)]650.8 norm0
+[(and this will be given offset 10, not 20.)]639.8 norm2
+[(The )2(-k)0( option is provided with two comma-separated numeric arguments, the first of which is an assembly)]622.8 norm1
+[(offset and the second is a number of bytes to skip. This )1(will)0( count the skipped bytes towards the assembly)]611.8 norm0
+[(offset: its use is to suppress disassembly of a data section which wouldn't contain anything you wanted to see)]600.8 norm0
+[(anyway.)]589.8 norm2
+[{/section-A.4 xa}(Bugs and Improvements)](A.4)568.4 head3
+[(There are no known bugs. However, any you find, with patches if possible, should be sent to)]551.4 norm1
+[{(mailto:nasm-bugs@lists.sourceforge.net)wl}2(nasm-bugs@lists.sourceforge.net){el}0(, or to the developer's site at)]540.4 norm0
+[{(https://sourceforge.net/projects/nasm/)wl}2(https://sourceforge.net/projects/nasm/){el}0( and we'll try to fix them. Feel free to send)]529.4 norm0
+[(contributions and new features as well.)]518.4 norm2
+(121)pageodd
+restore showpage
+%%Page: 122 122
+%%BeginPageSetup
+save
+%%EndPageSetup
+/122 pa
+[{/appendix-B xa}(Appendix B: )(Instruction List)]642.8 appn3
+[{/section-B.1 xa}(Introduction)](B.1)597.4 head3
+[(The following sections show the instructions which NASM currently supports. For each instruction, there is a)]580.4 norm1
+[(separate entry for each supported addressing mode. The third column shows the processor type in which the)]569.4 norm0
+[(instruction was introduced and, when appropriate, one or more usage flags.)]558.4 norm2
+[{/section-B.1.1 xa}(Special instructions...)](B.1.1)539.2 subh3
+[2(DB                                         )]522.2 code1
+[2(DW                                         )]511.2 code0
+[2(DD                                         )]500.2 code0
+[2(DQ                                         )]489.2 code0
+[2(DT                                         )]478.2 code0
+[2(DO                                         )]467.2 code0
+[2(DY                                         )]456.2 code0
+[2(RESB             imm                      8086 )]445.2 code0
+[2(RESW                                       )]434.2 code0
+[2(RESD                                       )]423.2 code0
+[2(RESQ                                       )]412.2 code0
+[2(REST                                       )]401.2 code0
+[2(RESO                                       )]390.2 code0
+[2(RESY                                      )]379.2 code2
+[{/section-B.1.2 xa}(Conventional instructions)](B.1.2)360 subh3
+[2(AAA                                       8086,NOLONG )]343 code1
+[2(AAD                                       8086,NOLONG )]332 code0
+[2(AAD              imm                      8086,NOLONG )]321 code0
+[2(AAM                                       8086,NOLONG )]310 code0
+[2(AAM              imm                      8086,NOLONG )]299 code0
+[2(AAS                                       8086,NOLONG )]288 code0
+[2(ADC              mem,reg8                 8086 )]277 code0
+[2(ADC              reg8,reg8                8086 )]266 code0
+[2(ADC              mem,reg16                8086 )]255 code0
+[2(ADC              reg16,reg16              8086 )]244 code0
+[2(ADC              mem,reg32                386 )]233 code0
+[2(ADC              reg32,reg32              386 )]222 code0
+[2(ADC              mem,reg64                X64 )]211 code0
+[2(ADC              reg64,reg64              X64 )]200 code0
+[2(ADC              reg8,mem                 8086 )]189 code0
+[2(ADC              reg8,reg8                8086 )]178 code0
+[2(ADC              reg16,mem                8086 )]167 code0
+[2(ADC              reg16,reg16              8086 )]156 code0
+[2(ADC              reg32,mem                386 )]145 code0
+[2(ADC              reg32,reg32              386 )]134 code0
+[2(ADC              reg64,mem                X64 )]123 code0
+[2(ADC              reg64,reg64              X64 )]112 code0
+[2(ADC              rm16,imm8                8086 )]101 code0
+(122)pageeven
+restore showpage
+%%Page: 123 123
+%%BeginPageSetup
+save
+%%EndPageSetup
+/123 pa
+[2(ADC              rm32,imm8                386 )]681 code0
+[2(ADC              rm64,imm8                X64 )]670 code0
+[2(ADC              reg_al,imm               8086 )]659 code0
+[2(ADC              reg_ax,sbyte16           8086 )]648 code0
+[2(ADC              reg_ax,imm               8086 )]637 code0
+[2(ADC              reg_eax,sbyte32          386 )]626 code0
+[2(ADC              reg_eax,imm              386 )]615 code0
+[2(ADC              reg_rax,sbyte64          X64 )]604 code0
+[2(ADC              reg_rax,imm              X64 )]593 code0
+[2(ADC              rm8,imm                  8086 )]582 code0
+[2(ADC              rm16,imm                 8086 )]571 code0
+[2(ADC              rm32,imm                 386 )]560 code0
+[2(ADC              rm64,imm                 X64 )]549 code0
+[2(ADC              mem,imm8                 8086 )]538 code0
+[2(ADC              mem,imm16                8086 )]527 code0
+[2(ADC              mem,imm32                386 )]516 code0
+[2(ADD              mem,reg8                 8086 )]505 code0
+[2(ADD              reg8,reg8                8086 )]494 code0
+[2(ADD              mem,reg16                8086 )]483 code0
+[2(ADD              reg16,reg16              8086 )]472 code0
+[2(ADD              mem,reg32                386 )]461 code0
+[2(ADD              reg32,reg32              386 )]450 code0
+[2(ADD              mem,reg64                X64 )]439 code0
+[2(ADD              reg64,reg64              X64 )]428 code0
+[2(ADD              reg8,mem                 8086 )]417 code0
+[2(ADD              reg8,reg8                8086 )]406 code0
+[2(ADD              reg16,mem                8086 )]395 code0
+[2(ADD              reg16,reg16              8086 )]384 code0
+[2(ADD              reg32,mem                386 )]373 code0
+[2(ADD              reg32,reg32              386 )]362 code0
+[2(ADD              reg64,mem                X64 )]351 code0
+[2(ADD              reg64,reg64              X64 )]340 code0
+[2(ADD              rm16,imm8                8086 )]329 code0
+[2(ADD              rm32,imm8                386 )]318 code0
+[2(ADD              rm64,imm8                X64 )]307 code0
+[2(ADD              reg_al,imm               8086 )]296 code0
+[2(ADD              reg_ax,sbyte16           8086 )]285 code0
+[2(ADD              reg_ax,imm               8086 )]274 code0
+[2(ADD              reg_eax,sbyte32          386 )]263 code0
+[2(ADD              reg_eax,imm              386 )]252 code0
+[2(ADD              reg_rax,sbyte64          X64 )]241 code0
+[2(ADD              reg_rax,imm              X64 )]230 code0
+[2(ADD              rm8,imm                  8086 )]219 code0
+[2(ADD              rm16,imm                 8086 )]208 code0
+[2(ADD              rm32,imm                 386 )]197 code0
+[2(ADD              rm64,imm                 X64 )]186 code0
+[2(ADD              mem,imm8                 8086 )]175 code0
+[2(ADD              mem,imm16                8086 )]164 code0
+[2(ADD              mem,imm32                386 )]153 code0
+[2(AND              mem,reg8                 8086 )]142 code0
+[2(AND              reg8,reg8                8086 )]131 code0
+[2(AND              mem,reg16                8086 )]120 code0
+[2(AND              reg16,reg16              8086 )]109 code0
+(123)pageodd
+restore showpage
+%%Page: 124 124
+%%BeginPageSetup
+save
+%%EndPageSetup
+/124 pa
+[2(AND              mem,reg32                386 )]681 code0
+[2(AND              reg32,reg32              386 )]670 code0
+[2(AND              mem,reg64                X64 )]659 code0
+[2(AND              reg64,reg64              X64 )]648 code0
+[2(AND              reg8,mem                 8086 )]637 code0
+[2(AND              reg8,reg8                8086 )]626 code0
+[2(AND              reg16,mem                8086 )]615 code0
+[2(AND              reg16,reg16              8086 )]604 code0
+[2(AND              reg32,mem                386 )]593 code0
+[2(AND              reg32,reg32              386 )]582 code0
+[2(AND              reg64,mem                X64 )]571 code0
+[2(AND              reg64,reg64              X64 )]560 code0
+[2(AND              rm16,imm8                8086 )]549 code0
+[2(AND              rm32,imm8                386 )]538 code0
+[2(AND              rm64,imm8                X64 )]527 code0
+[2(AND              reg_al,imm               8086 )]516 code0
+[2(AND              reg_ax,sbyte16           8086 )]505 code0
+[2(AND              reg_ax,imm               8086 )]494 code0
+[2(AND              reg_eax,sbyte32          386 )]483 code0
+[2(AND              reg_eax,imm              386 )]472 code0
+[2(AND              reg_rax,sbyte64          X64 )]461 code0
+[2(AND              reg_rax,imm              X64 )]450 code0
+[2(AND              rm8,imm                  8086 )]439 code0
+[2(AND              rm16,imm                 8086 )]428 code0
+[2(AND              rm32,imm                 386 )]417 code0
+[2(AND              rm64,imm                 X64 )]406 code0
+[2(AND              mem,imm8                 8086 )]395 code0
+[2(AND              mem,imm16                8086 )]384 code0
+[2(AND              mem,imm32                386 )]373 code0
+[2(ARPL             mem,reg16                286,PROT,NOLONG )]362 code0
+[2(ARPL             reg16,reg16              286,PROT,NOLONG )]351 code0
+[2(BB0_RESET                                 PENT,CYRIX,ND )]340 code0
+[2(BB1_RESET                                 PENT,CYRIX,ND )]329 code0
+[2(BOUND            reg16,mem                186,NOLONG )]318 code0
+[2(BOUND            reg32,mem                386,NOLONG )]307 code0
+[2(BSF              reg16,mem                386 )]296 code0
+[2(BSF              reg16,reg16              386 )]285 code0
+[2(BSF              reg32,mem                386 )]274 code0
+[2(BSF              reg32,reg32              386 )]263 code0
+[2(BSF              reg64,mem                X64 )]252 code0
+[2(BSF              reg64,reg64              X64 )]241 code0
+[2(BSR              reg16,mem                386 )]230 code0
+[2(BSR              reg16,reg16              386 )]219 code0
+[2(BSR              reg32,mem                386 )]208 code0
+[2(BSR              reg32,reg32              386 )]197 code0
+[2(BSR              reg64,mem                X64 )]186 code0
+[2(BSR              reg64,reg64              X64 )]175 code0
+[2(BSWAP            reg32                    486 )]164 code0
+[2(BSWAP            reg64                    X64 )]153 code0
+[2(BT               mem,reg16                386 )]142 code0
+[2(BT               reg16,reg16              386 )]131 code0
+[2(BT               mem,reg32                386 )]120 code0
+[2(BT               reg32,reg32              386 )]109 code0
+(124)pageeven
+restore showpage
+%%Page: 125 125
+%%BeginPageSetup
+save
+%%EndPageSetup
+/125 pa
+[2(BT               mem,reg64                X64 )]681 code0
+[2(BT               reg64,reg64              X64 )]670 code0
+[2(BT               rm16,imm                 386 )]659 code0
+[2(BT               rm32,imm                 386 )]648 code0
+[2(BT               rm64,imm                 X64 )]637 code0
+[2(BTC              mem,reg16                386 )]626 code0
+[2(BTC              reg16,reg16              386 )]615 code0
+[2(BTC              mem,reg32                386 )]604 code0
+[2(BTC              reg32,reg32              386 )]593 code0
+[2(BTC              mem,reg64                X64 )]582 code0
+[2(BTC              reg64,reg64              X64 )]571 code0
+[2(BTC              rm16,imm                 386 )]560 code0
+[2(BTC              rm32,imm                 386 )]549 code0
+[2(BTC              rm64,imm                 X64 )]538 code0
+[2(BTR              mem,reg16                386 )]527 code0
+[2(BTR              reg16,reg16              386 )]516 code0
+[2(BTR              mem,reg32                386 )]505 code0
+[2(BTR              reg32,reg32              386 )]494 code0
+[2(BTR              mem,reg64                X64 )]483 code0
+[2(BTR              reg64,reg64              X64 )]472 code0
+[2(BTR              rm16,imm                 386 )]461 code0
+[2(BTR              rm32,imm                 386 )]450 code0
+[2(BTR              rm64,imm                 X64 )]439 code0
+[2(BTS              mem,reg16                386 )]428 code0
+[2(BTS              reg16,reg16              386 )]417 code0
+[2(BTS              mem,reg32                386 )]406 code0
+[2(BTS              reg32,reg32              386 )]395 code0
+[2(BTS              mem,reg64                X64 )]384 code0
+[2(BTS              reg64,reg64              X64 )]373 code0
+[2(BTS              rm16,imm                 386 )]362 code0
+[2(BTS              rm32,imm                 386 )]351 code0
+[2(BTS              rm64,imm                 X64 )]340 code0
+[2(CALL             imm                      8086 )]329 code0
+[2(CALL             imm|near                 8086 )]318 code0
+[2(CALL             imm|far                  8086,ND,NOLONG )]307 code0
+[2(CALL             imm16                    8086 )]296 code0
+[2(CALL             imm16|near               8086 )]285 code0
+[2(CALL             imm16|far                8086,ND,NOLONG )]274 code0
+[2(CALL             imm32                    386 )]263 code0
+[2(CALL             imm32|near               386 )]252 code0
+[2(CALL             imm32|far                386,ND,NOLONG )]241 code0
+[2(CALL             imm:imm                  8086,NOLONG )]230 code0
+[2(CALL             imm16:imm                8086,NOLONG )]219 code0
+[2(CALL             imm:imm16                8086,NOLONG )]208 code0
+[2(CALL             imm32:imm                386,NOLONG )]197 code0
+[2(CALL             imm:imm32                386,NOLONG )]186 code0
+[2(CALL             mem|far                  8086,NOLONG )]175 code0
+[2(CALL             mem|far                  X64 )]164 code0
+[2(CALL             mem16|far                8086 )]153 code0
+[2(CALL             mem32|far                386 )]142 code0
+[2(CALL             mem64|far                X64 )]131 code0
+[2(CALL             mem|near                 8086 )]120 code0
+[2(CALL             mem16|near               8086 )]109 code0
+(125)pageodd
+restore showpage
+%%Page: 126 126
+%%BeginPageSetup
+save
+%%EndPageSetup
+/126 pa
+[2(CALL             mem32|near               386,NOLONG )]681 code0
+[2(CALL             mem64|near               X64 )]670 code0
+[2(CALL             reg16                    8086 )]659 code0
+[2(CALL             reg32                    386,NOLONG )]648 code0
+[2(CALL             reg64                    X64 )]637 code0
+[2(CALL             mem                      8086 )]626 code0
+[2(CALL             mem16                    8086 )]615 code0
+[2(CALL             mem32                    386,NOLONG )]604 code0
+[2(CALL             mem64                    X64 )]593 code0
+[2(CBW                                       8086 )]582 code0
+[2(CDQ                                       386 )]571 code0
+[2(CDQE                                      X64 )]560 code0
+[2(CLC                                       8086 )]549 code0
+[2(CLD                                       8086 )]538 code0
+[2(CLGI                                      X64,AMD )]527 code0
+[2(CLI                                       8086 )]516 code0
+[2(CLTS                                      286,PRIV )]505 code0
+[2(CMC                                       8086 )]494 code0
+[2(CMP              mem,reg8                 8086 )]483 code0
+[2(CMP              reg8,reg8                8086 )]472 code0
+[2(CMP              mem,reg16                8086 )]461 code0
+[2(CMP              reg16,reg16              8086 )]450 code0
+[2(CMP              mem,reg32                386 )]439 code0
+[2(CMP              reg32,reg32              386 )]428 code0
+[2(CMP              mem,reg64                X64 )]417 code0
+[2(CMP              reg64,reg64              X64 )]406 code0
+[2(CMP              reg8,mem                 8086 )]395 code0
+[2(CMP              reg8,reg8                8086 )]384 code0
+[2(CMP              reg16,mem                8086 )]373 code0
+[2(CMP              reg16,reg16              8086 )]362 code0
+[2(CMP              reg32,mem                386 )]351 code0
+[2(CMP              reg32,reg32              386 )]340 code0
+[2(CMP              reg64,mem                X64 )]329 code0
+[2(CMP              reg64,reg64              X64 )]318 code0
+[2(CMP              rm16,imm8                8086 )]307 code0
+[2(CMP              rm32,imm8                386 )]296 code0
+[2(CMP              rm64,imm8                X64 )]285 code0
+[2(CMP              reg_al,imm               8086 )]274 code0
+[2(CMP              reg_ax,sbyte16           8086 )]263 code0
+[2(CMP              reg_ax,imm               8086 )]252 code0
+[2(CMP              reg_eax,sbyte32          386 )]241 code0
+[2(CMP              reg_eax,imm              386 )]230 code0
+[2(CMP              reg_rax,sbyte64          X64 )]219 code0
+[2(CMP              reg_rax,imm              X64 )]208 code0
+[2(CMP              rm8,imm                  8086 )]197 code0
+[2(CMP              rm16,imm                 8086 )]186 code0
+[2(CMP              rm32,imm                 386 )]175 code0
+[2(CMP              rm64,imm                 X64 )]164 code0
+[2(CMP              mem,imm8                 8086 )]153 code0
+[2(CMP              mem,imm16                8086 )]142 code0
+[2(CMP              mem,imm32                386 )]131 code0
+[2(CMPSB                                     8086 )]120 code0
+[2(CMPSD                                     386 )]109 code0
+(126)pageeven
+restore showpage
+%%Page: 127 127
+%%BeginPageSetup
+save
+%%EndPageSetup
+/127 pa
+[2(CMPSQ                                     X64 )]681 code0
+[2(CMPSW                                     8086 )]670 code0
+[2(CMPXCHG          mem,reg8                 PENT )]659 code0
+[2(CMPXCHG          reg8,reg8                PENT )]648 code0
+[2(CMPXCHG          mem,reg16                PENT )]637 code0
+[2(CMPXCHG          reg16,reg16              PENT )]626 code0
+[2(CMPXCHG          mem,reg32                PENT )]615 code0
+[2(CMPXCHG          reg32,reg32              PENT )]604 code0
+[2(CMPXCHG          mem,reg64                X64 )]593 code0
+[2(CMPXCHG          reg64,reg64              X64 )]582 code0
+[2(CMPXCHG486       mem,reg8                 486,UNDOC,ND )]571 code0
+[2(CMPXCHG486       reg8,reg8                486,UNDOC,ND )]560 code0
+[2(CMPXCHG486       mem,reg16                486,UNDOC,ND )]549 code0
+[2(CMPXCHG486       reg16,reg16              486,UNDOC,ND )]538 code0
+[2(CMPXCHG486       mem,reg32                486,UNDOC,ND )]527 code0
+[2(CMPXCHG486       reg32,reg32              486,UNDOC,ND )]516 code0
+[2(CMPXCHG8B        mem                      PENT )]505 code0
+[2(CMPXCHG16B       mem                      X64 )]494 code0
+[2(CPUID                                     PENT )]483 code0
+[2(CPU_READ                                  PENT,CYRIX )]472 code0
+[2(CPU_WRITE                                 PENT,CYRIX )]461 code0
+[2(CQO                                       X64 )]450 code0
+[2(CWD                                       8086 )]439 code0
+[2(CWDE                                      386 )]428 code0
+[2(DAA                                       8086,NOLONG )]417 code0
+[2(DAS                                       8086,NOLONG )]406 code0
+[2(DEC              reg16                    8086,NOLONG )]395 code0
+[2(DEC              reg32                    386,NOLONG )]384 code0
+[2(DEC              rm8                      8086 )]373 code0
+[2(DEC              rm16                     8086 )]362 code0
+[2(DEC              rm32                     386 )]351 code0
+[2(DEC              rm64                     X64 )]340 code0
+[2(DIV              rm8                      8086 )]329 code0
+[2(DIV              rm16                     8086 )]318 code0
+[2(DIV              rm32                     386 )]307 code0
+[2(DIV              rm64                     X64 )]296 code0
+[2(DMINT                                     P6,CYRIX )]285 code0
+[2(EMMS                                      PENT,MMX )]274 code0
+[2(ENTER            imm,imm                  186 )]263 code0
+[2(EQU              imm                      8086 )]252 code0
+[2(EQU              imm:imm                  8086 )]241 code0
+[2(F2XM1                                     8086,FPU )]230 code0
+[2(FABS                                      8086,FPU )]219 code0
+[2(FADD             mem32                    8086,FPU )]208 code0
+[2(FADD             mem64                    8086,FPU )]197 code0
+[2(FADD             fpureg|to                8086,FPU )]186 code0
+[2(FADD             fpureg                   8086,FPU )]175 code0
+[2(FADD             fpureg,fpu0              8086,FPU )]164 code0
+[2(FADD             fpu0,fpureg              8086,FPU )]153 code0
+[2(FADD                                      8086,FPU,ND )]142 code0
+[2(FADDP            fpureg                   8086,FPU )]131 code0
+[2(FADDP            fpureg,fpu0              8086,FPU )]120 code0
+[2(FADDP                                     8086,FPU,ND )]109 code0
+(127)pageodd
+restore showpage
+%%Page: 128 128
+%%BeginPageSetup
+save
+%%EndPageSetup
+/128 pa
+[2(FBLD             mem80                    8086,FPU )]681 code0
+[2(FBLD             mem                      8086,FPU )]670 code0
+[2(FBSTP            mem80                    8086,FPU )]659 code0
+[2(FBSTP            mem                      8086,FPU )]648 code0
+[2(FCHS                                      8086,FPU )]637 code0
+[2(FCLEX                                     8086,FPU )]626 code0
+[2(FCMOVB           fpureg                   P6,FPU )]615 code0
+[2(FCMOVB           fpu0,fpureg              P6,FPU )]604 code0
+[2(FCMOVB                                    P6,FPU,ND )]593 code0
+[2(FCMOVBE          fpureg                   P6,FPU )]582 code0
+[2(FCMOVBE          fpu0,fpureg              P6,FPU )]571 code0
+[2(FCMOVBE                                   P6,FPU,ND )]560 code0
+[2(FCMOVE           fpureg                   P6,FPU )]549 code0
+[2(FCMOVE           fpu0,fpureg              P6,FPU )]538 code0
+[2(FCMOVE                                    P6,FPU,ND )]527 code0
+[2(FCMOVNB          fpureg                   P6,FPU )]516 code0
+[2(FCMOVNB          fpu0,fpureg              P6,FPU )]505 code0
+[2(FCMOVNB                                   P6,FPU,ND )]494 code0
+[2(FCMOVNBE         fpureg                   P6,FPU )]483 code0
+[2(FCMOVNBE         fpu0,fpureg              P6,FPU )]472 code0
+[2(FCMOVNBE                                  P6,FPU,ND )]461 code0
+[2(FCMOVNE          fpureg                   P6,FPU )]450 code0
+[2(FCMOVNE          fpu0,fpureg              P6,FPU )]439 code0
+[2(FCMOVNE                                   P6,FPU,ND )]428 code0
+[2(FCMOVNU          fpureg                   P6,FPU )]417 code0
+[2(FCMOVNU          fpu0,fpureg              P6,FPU )]406 code0
+[2(FCMOVNU                                   P6,FPU,ND )]395 code0
+[2(FCMOVU           fpureg                   P6,FPU )]384 code0
+[2(FCMOVU           fpu0,fpureg              P6,FPU )]373 code0
+[2(FCMOVU                                    P6,FPU,ND )]362 code0
+[2(FCOM             mem32                    8086,FPU )]351 code0
+[2(FCOM             mem64                    8086,FPU )]340 code0
+[2(FCOM             fpureg                   8086,FPU )]329 code0
+[2(FCOM             fpu0,fpureg              8086,FPU )]318 code0
+[2(FCOM                                      8086,FPU,ND )]307 code0
+[2(FCOMI            fpureg                   P6,FPU )]296 code0
+[2(FCOMI            fpu0,fpureg              P6,FPU )]285 code0
+[2(FCOMI                                     P6,FPU,ND )]274 code0
+[2(FCOMIP           fpureg                   P6,FPU )]263 code0
+[2(FCOMIP           fpu0,fpureg              P6,FPU )]252 code0
+[2(FCOMIP                                    P6,FPU,ND )]241 code0
+[2(FCOMP            mem32                    8086,FPU )]230 code0
+[2(FCOMP            mem64                    8086,FPU )]219 code0
+[2(FCOMP            fpureg                   8086,FPU )]208 code0
+[2(FCOMP            fpu0,fpureg              8086,FPU )]197 code0
+[2(FCOMP                                     8086,FPU,ND )]186 code0
+[2(FCOMPP                                    8086,FPU )]175 code0
+[2(FCOS                                      386,FPU )]164 code0
+[2(FDECSTP                                   8086,FPU )]153 code0
+[2(FDISI                                     8086,FPU )]142 code0
+[2(FDIV             mem32                    8086,FPU )]131 code0
+[2(FDIV             mem64                    8086,FPU )]120 code0
+[2(FDIV             fpureg|to                8086,FPU )]109 code0
+(128)pageeven
+restore showpage
+%%Page: 129 129
+%%BeginPageSetup
+save
+%%EndPageSetup
+/129 pa
+[2(FDIV             fpureg                   8086,FPU )]681 code0
+[2(FDIV             fpureg,fpu0              8086,FPU )]670 code0
+[2(FDIV             fpu0,fpureg              8086,FPU )]659 code0
+[2(FDIV                                      8086,FPU,ND )]648 code0
+[2(FDIVP            fpureg                   8086,FPU )]637 code0
+[2(FDIVP            fpureg,fpu0              8086,FPU )]626 code0
+[2(FDIVP                                     8086,FPU,ND )]615 code0
+[2(FDIVR            mem32                    8086,FPU )]604 code0
+[2(FDIVR            mem64                    8086,FPU )]593 code0
+[2(FDIVR            fpureg|to                8086,FPU )]582 code0
+[2(FDIVR            fpureg,fpu0              8086,FPU )]571 code0
+[2(FDIVR            fpureg                   8086,FPU )]560 code0
+[2(FDIVR            fpu0,fpureg              8086,FPU )]549 code0
+[2(FDIVR                                     8086,FPU,ND )]538 code0
+[2(FDIVRP           fpureg                   8086,FPU )]527 code0
+[2(FDIVRP           fpureg,fpu0              8086,FPU )]516 code0
+[2(FDIVRP                                    8086,FPU,ND )]505 code0
+[2(FEMMS                                     PENT,3DNOW )]494 code0
+[2(FENI                                      8086,FPU )]483 code0
+[2(FFREE            fpureg                   8086,FPU )]472 code0
+[2(FFREE                                     8086,FPU )]461 code0
+[2(FFREEP           fpureg                   286,FPU,UNDOC )]450 code0
+[2(FFREEP                                    286,FPU,UNDOC )]439 code0
+[2(FIADD            mem32                    8086,FPU )]428 code0
+[2(FIADD            mem16                    8086,FPU )]417 code0
+[2(FICOM            mem32                    8086,FPU )]406 code0
+[2(FICOM            mem16                    8086,FPU )]395 code0
+[2(FICOMP           mem32                    8086,FPU )]384 code0
+[2(FICOMP           mem16                    8086,FPU )]373 code0
+[2(FIDIV            mem32                    8086,FPU )]362 code0
+[2(FIDIV            mem16                    8086,FPU )]351 code0
+[2(FIDIVR           mem32                    8086,FPU )]340 code0
+[2(FIDIVR           mem16                    8086,FPU )]329 code0
+[2(FILD             mem32                    8086,FPU )]318 code0
+[2(FILD             mem16                    8086,FPU )]307 code0
+[2(FILD             mem64                    8086,FPU )]296 code0
+[2(FIMUL            mem32                    8086,FPU )]285 code0
+[2(FIMUL            mem16                    8086,FPU )]274 code0
+[2(FINCSTP                                   8086,FPU )]263 code0
+[2(FINIT                                     8086,FPU )]252 code0
+[2(FIST             mem32                    8086,FPU )]241 code0
+[2(FIST             mem16                    8086,FPU )]230 code0
+[2(FISTP            mem32                    8086,FPU )]219 code0
+[2(FISTP            mem16                    8086,FPU )]208 code0
+[2(FISTP            mem64                    8086,FPU )]197 code0
+[2(FISTTP           mem16                    PRESCOTT,FPU )]186 code0
+[2(FISTTP           mem32                    PRESCOTT,FPU )]175 code0
+[2(FISTTP           mem64                    PRESCOTT,FPU )]164 code0
+[2(FISUB            mem32                    8086,FPU )]153 code0
+[2(FISUB            mem16                    8086,FPU )]142 code0
+[2(FISUBR           mem32                    8086,FPU )]131 code0
+[2(FISUBR           mem16                    8086,FPU )]120 code0
+[2(FLD              mem32                    8086,FPU )]109 code0
+(129)pageodd
+restore showpage
+%%Page: 130 130
+%%BeginPageSetup
+save
+%%EndPageSetup
+/130 pa
+[2(FLD              mem64                    8086,FPU )]681 code0
+[2(FLD              mem80                    8086,FPU )]670 code0
+[2(FLD              fpureg                   8086,FPU )]659 code0
+[2(FLD                                       8086,FPU,ND )]648 code0
+[2(FLD1                                      8086,FPU )]637 code0
+[2(FLDCW            mem                      8086,FPU,SW )]626 code0
+[2(FLDENV           mem                      8086,FPU )]615 code0
+[2(FLDL2E                                    8086,FPU )]604 code0
+[2(FLDL2T                                    8086,FPU )]593 code0
+[2(FLDLG2                                    8086,FPU )]582 code0
+[2(FLDLN2                                    8086,FPU )]571 code0
+[2(FLDPI                                     8086,FPU )]560 code0
+[2(FLDZ                                      8086,FPU )]549 code0
+[2(FMUL             mem32                    8086,FPU )]538 code0
+[2(FMUL             mem64                    8086,FPU )]527 code0
+[2(FMUL             fpureg|to                8086,FPU )]516 code0
+[2(FMUL             fpureg,fpu0              8086,FPU )]505 code0
+[2(FMUL             fpureg                   8086,FPU )]494 code0
+[2(FMUL             fpu0,fpureg              8086,FPU )]483 code0
+[2(FMUL                                      8086,FPU,ND )]472 code0
+[2(FMULP            fpureg                   8086,FPU )]461 code0
+[2(FMULP            fpureg,fpu0              8086,FPU )]450 code0
+[2(FMULP                                     8086,FPU,ND )]439 code0
+[2(FNCLEX                                    8086,FPU )]428 code0
+[2(FNDISI                                    8086,FPU )]417 code0
+[2(FNENI                                     8086,FPU )]406 code0
+[2(FNINIT                                    8086,FPU )]395 code0
+[2(FNOP                                      8086,FPU )]384 code0
+[2(FNSAVE           mem                      8086,FPU )]373 code0
+[2(FNSTCW           mem                      8086,FPU,SW )]362 code0
+[2(FNSTENV          mem                      8086,FPU )]351 code0
+[2(FNSTSW           mem                      8086,FPU,SW )]340 code0
+[2(FNSTSW           reg_ax                   286,FPU )]329 code0
+[2(FPATAN                                    8086,FPU )]318 code0
+[2(FPREM                                     8086,FPU )]307 code0
+[2(FPREM1                                    386,FPU )]296 code0
+[2(FPTAN                                     8086,FPU )]285 code0
+[2(FRNDINT                                   8086,FPU )]274 code0
+[2(FRSTOR           mem                      8086,FPU )]263 code0
+[2(FSAVE            mem                      8086,FPU )]252 code0
+[2(FSCALE                                    8086,FPU )]241 code0
+[2(FSETPM                                    286,FPU )]230 code0
+[2(FSIN                                      386,FPU )]219 code0
+[2(FSINCOS                                   386,FPU )]208 code0
+[2(FSQRT                                     8086,FPU )]197 code0
+[2(FST              mem32                    8086,FPU )]186 code0
+[2(FST              mem64                    8086,FPU )]175 code0
+[2(FST              fpureg                   8086,FPU )]164 code0
+[2(FST                                       8086,FPU,ND )]153 code0
+[2(FSTCW            mem                      8086,FPU,SW )]142 code0
+[2(FSTENV           mem                      8086,FPU )]131 code0
+[2(FSTP             mem32                    8086,FPU )]120 code0
+[2(FSTP             mem64                    8086,FPU )]109 code0
+(130)pageeven
+restore showpage
+%%Page: 131 131
+%%BeginPageSetup
+save
+%%EndPageSetup
+/131 pa
+[2(FSTP             mem80                    8086,FPU )]681 code0
+[2(FSTP             fpureg                   8086,FPU )]670 code0
+[2(FSTP                                      8086,FPU,ND )]659 code0
+[2(FSTSW            mem                      8086,FPU,SW )]648 code0
+[2(FSTSW            reg_ax                   286,FPU )]637 code0
+[2(FSUB             mem32                    8086,FPU )]626 code0
+[2(FSUB             mem64                    8086,FPU )]615 code0
+[2(FSUB             fpureg|to                8086,FPU )]604 code0
+[2(FSUB             fpureg,fpu0              8086,FPU )]593 code0
+[2(FSUB             fpureg                   8086,FPU )]582 code0
+[2(FSUB             fpu0,fpureg              8086,FPU )]571 code0
+[2(FSUB                                      8086,FPU,ND )]560 code0
+[2(FSUBP            fpureg                   8086,FPU )]549 code0
+[2(FSUBP            fpureg,fpu0              8086,FPU )]538 code0
+[2(FSUBP                                     8086,FPU,ND )]527 code0
+[2(FSUBR            mem32                    8086,FPU )]516 code0
+[2(FSUBR            mem64                    8086,FPU )]505 code0
+[2(FSUBR            fpureg|to                8086,FPU )]494 code0
+[2(FSUBR            fpureg,fpu0              8086,FPU )]483 code0
+[2(FSUBR            fpureg                   8086,FPU )]472 code0
+[2(FSUBR            fpu0,fpureg              8086,FPU )]461 code0
+[2(FSUBR                                     8086,FPU,ND )]450 code0
+[2(FSUBRP           fpureg                   8086,FPU )]439 code0
+[2(FSUBRP           fpureg,fpu0              8086,FPU )]428 code0
+[2(FSUBRP                                    8086,FPU,ND )]417 code0
+[2(FTST                                      8086,FPU )]406 code0
+[2(FUCOM            fpureg                   386,FPU )]395 code0
+[2(FUCOM            fpu0,fpureg              386,FPU )]384 code0
+[2(FUCOM                                     386,FPU,ND )]373 code0
+[2(FUCOMI           fpureg                   P6,FPU )]362 code0
+[2(FUCOMI           fpu0,fpureg              P6,FPU )]351 code0
+[2(FUCOMI                                    P6,FPU,ND )]340 code0
+[2(FUCOMIP          fpureg                   P6,FPU )]329 code0
+[2(FUCOMIP          fpu0,fpureg              P6,FPU )]318 code0
+[2(FUCOMIP                                   P6,FPU,ND )]307 code0
+[2(FUCOMP           fpureg                   386,FPU )]296 code0
+[2(FUCOMP           fpu0,fpureg              386,FPU )]285 code0
+[2(FUCOMP                                    386,FPU,ND )]274 code0
+[2(FUCOMPP                                   386,FPU )]263 code0
+[2(FXAM                                      8086,FPU )]252 code0
+[2(FXCH             fpureg                   8086,FPU )]241 code0
+[2(FXCH             fpureg,fpu0              8086,FPU )]230 code0
+[2(FXCH             fpu0,fpureg              8086,FPU )]219 code0
+[2(FXCH                                      8086,FPU,ND )]208 code0
+[2(FXTRACT                                   8086,FPU )]197 code0
+[2(FYL2X                                     8086,FPU )]186 code0
+[2(FYL2XP1                                   8086,FPU )]175 code0
+[2(HLT                                       8086,PRIV )]164 code0
+[2(IBTS             mem,reg16                386,SW,UNDOC,ND )]153 code0
+[2(IBTS             reg16,reg16              386,UNDOC,ND )]142 code0
+[2(IBTS             mem,reg32                386,SD,UNDOC,ND )]131 code0
+[2(IBTS             reg32,reg32              386,UNDOC,ND )]120 code0
+[2(ICEBP                                     386,ND )]109 code0
+(131)pageodd
+restore showpage
+%%Page: 132 132
+%%BeginPageSetup
+save
+%%EndPageSetup
+/132 pa
+[2(IDIV             rm8                      8086 )]681 code0
+[2(IDIV             rm16                     8086 )]670 code0
+[2(IDIV             rm32                     386 )]659 code0
+[2(IDIV             rm64                     X64 )]648 code0
+[2(IMUL             rm8                      8086 )]637 code0
+[2(IMUL             rm16                     8086 )]626 code0
+[2(IMUL             rm32                     386 )]615 code0
+[2(IMUL             rm64                     X64 )]604 code0
+[2(IMUL             reg16,mem                386 )]593 code0
+[2(IMUL             reg16,reg16              386 )]582 code0
+[2(IMUL             reg32,mem                386 )]571 code0
+[2(IMUL             reg32,reg32              386 )]560 code0
+[2(IMUL             reg64,mem                X64 )]549 code0
+[2(IMUL             reg64,reg64              X64 )]538 code0
+[2(IMUL             reg16,mem,imm8           186 )]527 code0
+[2(IMUL             reg16,mem,sbyte16        186,ND )]516 code0
+[2(IMUL             reg16,mem,imm16          186 )]505 code0
+[2(IMUL             reg16,mem,imm            186,ND )]494 code0
+[2(IMUL             reg16,reg16,imm8         186 )]483 code0
+[2(IMUL             reg16,reg16,sbyte16      186,ND )]472 code0
+[2(IMUL             reg16,reg16,imm16        186 )]461 code0
+[2(IMUL             reg16,reg16,imm          186,ND )]450 code0
+[2(IMUL             reg32,mem,imm8           386 )]439 code0
+[2(IMUL             reg32,mem,sbyte32        386,ND )]428 code0
+[2(IMUL             reg32,mem,imm32          386 )]417 code0
+[2(IMUL             reg32,mem,imm            386,ND )]406 code0
+[2(IMUL             reg32,reg32,imm8         386 )]395 code0
+[2(IMUL             reg32,reg32,sbyte32      386,ND )]384 code0
+[2(IMUL             reg32,reg32,imm32        386 )]373 code0
+[2(IMUL             reg32,reg32,imm          386,ND )]362 code0
+[2(IMUL             reg64,mem,imm8           X64 )]351 code0
+[2(IMUL             reg64,mem,sbyte64        X64,ND )]340 code0
+[2(IMUL             reg64,mem,imm32          X64 )]329 code0
+[2(IMUL             reg64,mem,imm            X64,ND )]318 code0
+[2(IMUL             reg64,reg64,imm8         X64 )]307 code0
+[2(IMUL             reg64,reg64,sbyte64      X64,ND )]296 code0
+[2(IMUL             reg64,reg64,imm32        X64 )]285 code0
+[2(IMUL             reg64,reg64,imm          X64,ND )]274 code0
+[2(IMUL             reg16,imm8               186 )]263 code0
+[2(IMUL             reg16,sbyte16            186,ND )]252 code0
+[2(IMUL             reg16,imm16              186 )]241 code0
+[2(IMUL             reg16,imm                186,ND )]230 code0
+[2(IMUL             reg32,imm8               386 )]219 code0
+[2(IMUL             reg32,sbyte32            386,ND )]208 code0
+[2(IMUL             reg32,imm32              386 )]197 code0
+[2(IMUL             reg32,imm                386,ND )]186 code0
+[2(IMUL             reg64,imm8               X64 )]175 code0
+[2(IMUL             reg64,sbyte64            X64,ND )]164 code0
+[2(IMUL             reg64,imm32              X64 )]153 code0
+[2(IMUL             reg64,imm                X64,ND )]142 code0
+[2(IN               reg_al,imm               8086 )]131 code0
+[2(IN               reg_ax,imm               8086 )]120 code0
+[2(IN               reg_eax,imm              386 )]109 code0
+(132)pageeven
+restore showpage
+%%Page: 133 133
+%%BeginPageSetup
+save
+%%EndPageSetup
+/133 pa
+[2(IN               reg_al,reg_dx            8086 )]681 code0
+[2(IN               reg_ax,reg_dx            8086 )]670 code0
+[2(IN               reg_eax,reg_dx           386 )]659 code0
+[2(INC              reg16                    8086,NOLONG )]648 code0
+[2(INC              reg32                    386,NOLONG )]637 code0
+[2(INC              rm8                      8086 )]626 code0
+[2(INC              rm16                     8086 )]615 code0
+[2(INC              rm32                     386 )]604 code0
+[2(INC              rm64                     X64 )]593 code0
+[2(INCBIN                                     )]582 code0
+[2(INSB                                      186 )]571 code0
+[2(INSD                                      386 )]560 code0
+[2(INSW                                      186 )]549 code0
+[2(INT              imm                      8086 )]538 code0
+[2(INT01                                     386,ND )]527 code0
+[2(INT1                                      386 )]516 code0
+[2(INT03                                     8086,ND )]505 code0
+[2(INT3                                      8086 )]494 code0
+[2(INTO                                      8086,NOLONG )]483 code0
+[2(INVD                                      486,PRIV )]472 code0
+[2(INVLPG           mem                      486,PRIV )]461 code0
+[2(INVLPGA          reg_ax,reg_ecx           X86_64,AMD,NOLONG )]450 code0
+[2(INVLPGA          reg_eax,reg_ecx          X86_64,AMD )]439 code0
+[2(INVLPGA          reg_rax,reg_ecx          X64,AMD )]428 code0
+[2(INVLPGA                                   X86_64,AMD )]417 code0
+[2(IRET                                      8086 )]406 code0
+[2(IRETD                                     386 )]395 code0
+[2(IRETQ                                     X64 )]384 code0
+[2(IRETW                                     8086 )]373 code0
+[2(JCXZ             imm                      8086,NOLONG )]362 code0
+[2(JECXZ            imm                      386 )]351 code0
+[2(JRCXZ            imm                      X64 )]340 code0
+[2(JMP              imm|short                8086 )]329 code0
+[2(JMP              imm                      8086,ND )]318 code0
+[2(JMP              imm                      8086 )]307 code0
+[2(JMP              imm|near                 8086,ND )]296 code0
+[2(JMP              imm|far                  8086,ND,NOLONG )]285 code0
+[2(JMP              imm16                    8086 )]274 code0
+[2(JMP              imm16|near               8086,ND )]263 code0
+[2(JMP              imm16|far                8086,ND,NOLONG )]252 code0
+[2(JMP              imm32                    386 )]241 code0
+[2(JMP              imm32|near               386,ND )]230 code0
+[2(JMP              imm32|far                386,ND,NOLONG )]219 code0
+[2(JMP              imm:imm                  8086,NOLONG )]208 code0
+[2(JMP              imm16:imm                8086,NOLONG )]197 code0
+[2(JMP              imm:imm16                8086,NOLONG )]186 code0
+[2(JMP              imm32:imm                386,NOLONG )]175 code0
+[2(JMP              imm:imm32                386,NOLONG )]164 code0
+[2(JMP              mem|far                  8086,NOLONG )]153 code0
+[2(JMP              mem|far                  X64 )]142 code0
+[2(JMP              mem16|far                8086 )]131 code0
+[2(JMP              mem32|far                386 )]120 code0
+[2(JMP              mem64|far                X64 )]109 code0
+(133)pageodd
+restore showpage
+%%Page: 134 134
+%%BeginPageSetup
+save
+%%EndPageSetup
+/134 pa
+[2(JMP              mem|near                 8086 )]681 code0
+[2(JMP              mem16|near               8086 )]670 code0
+[2(JMP              mem32|near               386,NOLONG )]659 code0
+[2(JMP              mem64|near               X64 )]648 code0
+[2(JMP              reg16                    8086 )]637 code0
+[2(JMP              reg32                    386,NOLONG )]626 code0
+[2(JMP              reg64                    X64 )]615 code0
+[2(JMP              mem                      8086 )]604 code0
+[2(JMP              mem16                    8086 )]593 code0
+[2(JMP              mem32                    386,NOLONG )]582 code0
+[2(JMP              mem64                    X64 )]571 code0
+[2(JMPE             imm                      IA64 )]560 code0
+[2(JMPE             imm16                    IA64 )]549 code0
+[2(JMPE             imm32                    IA64 )]538 code0
+[2(JMPE             rm16                     IA64 )]527 code0
+[2(JMPE             rm32                     IA64 )]516 code0
+[2(LAHF                                      8086 )]505 code0
+[2(LAR              reg16,mem                286,PROT,SW )]494 code0
+[2(LAR              reg16,reg16              286,PROT )]483 code0
+[2(LAR              reg16,reg32              386,PROT )]472 code0
+[2(LAR              reg16,reg64              X64,PROT,ND )]461 code0
+[2(LAR              reg32,mem                386,PROT,SW )]450 code0
+[2(LAR              reg32,reg16              386,PROT )]439 code0
+[2(LAR              reg32,reg32              386,PROT )]428 code0
+[2(LAR              reg32,reg64              X64,PROT,ND )]417 code0
+[2(LAR              reg64,mem                X64,PROT,SW )]406 code0
+[2(LAR              reg64,reg16              X64,PROT )]395 code0
+[2(LAR              reg64,reg32              X64,PROT )]384 code0
+[2(LAR              reg64,reg64              X64,PROT )]373 code0
+[2(LDS              reg16,mem                8086,NOLONG )]362 code0
+[2(LDS              reg32,mem                386,NOLONG )]351 code0
+[2(LEA              reg16,mem                8086 )]340 code0
+[2(LEA              reg32,mem                386 )]329 code0
+[2(LEA              reg64,mem                X64 )]318 code0
+[2(LEAVE                                     186 )]307 code0
+[2(LES              reg16,mem                8086,NOLONG )]296 code0
+[2(LES              reg32,mem                386,NOLONG )]285 code0
+[2(LFENCE                                    X64,AMD )]274 code0
+[2(LFS              reg16,mem                386 )]263 code0
+[2(LFS              reg32,mem                386 )]252 code0
+[2(LGDT             mem                      286,PRIV )]241 code0
+[2(LGS              reg16,mem                386 )]230 code0
+[2(LGS              reg32,mem                386 )]219 code0
+[2(LIDT             mem                      286,PRIV )]208 code0
+[2(LLDT             mem                      286,PROT,PRIV )]197 code0
+[2(LLDT             mem16                    286,PROT,PRIV )]186 code0
+[2(LLDT             reg16                    286,PROT,PRIV )]175 code0
+[2(LMSW             mem                      286,PRIV )]164 code0
+[2(LMSW             mem16                    286,PRIV )]153 code0
+[2(LMSW             reg16                    286,PRIV )]142 code0
+[2(LOADALL                                   386,UNDOC )]131 code0
+[2(LOADALL286                                286,UNDOC )]120 code0
+[2(LODSB                                     8086 )]109 code0
+(134)pageeven
+restore showpage
+%%Page: 135 135
+%%BeginPageSetup
+save
+%%EndPageSetup
+/135 pa
+[2(LODSD                                     386 )]681 code0
+[2(LODSQ                                     X64 )]670 code0
+[2(LODSW                                     8086 )]659 code0
+[2(LOOP             imm                      8086 )]648 code0
+[2(LOOP             imm,reg_cx               8086,NOLONG )]637 code0
+[2(LOOP             imm,reg_ecx              386 )]626 code0
+[2(LOOP             imm,reg_rcx              X64 )]615 code0
+[2(LOOPE            imm                      8086 )]604 code0
+[2(LOOPE            imm,reg_cx               8086,NOLONG )]593 code0
+[2(LOOPE            imm,reg_ecx              386 )]582 code0
+[2(LOOPE            imm,reg_rcx              X64 )]571 code0
+[2(LOOPNE           imm                      8086 )]560 code0
+[2(LOOPNE           imm,reg_cx               8086,NOLONG )]549 code0
+[2(LOOPNE           imm,reg_ecx              386 )]538 code0
+[2(LOOPNE           imm,reg_rcx              X64 )]527 code0
+[2(LOOPNZ           imm                      8086 )]516 code0
+[2(LOOPNZ           imm,reg_cx               8086,NOLONG )]505 code0
+[2(LOOPNZ           imm,reg_ecx              386 )]494 code0
+[2(LOOPNZ           imm,reg_rcx              X64 )]483 code0
+[2(LOOPZ            imm                      8086 )]472 code0
+[2(LOOPZ            imm,reg_cx               8086,NOLONG )]461 code0
+[2(LOOPZ            imm,reg_ecx              386 )]450 code0
+[2(LOOPZ            imm,reg_rcx              X64 )]439 code0
+[2(LSL              reg16,mem                286,PROT,SW )]428 code0
+[2(LSL              reg16,reg16              286,PROT )]417 code0
+[2(LSL              reg16,reg32              386,PROT )]406 code0
+[2(LSL              reg16,reg64              X64,PROT,ND )]395 code0
+[2(LSL              reg32,mem                386,PROT,SW )]384 code0
+[2(LSL              reg32,reg16              386,PROT )]373 code0
+[2(LSL              reg32,reg32              386,PROT )]362 code0
+[2(LSL              reg32,reg64              X64,PROT,ND )]351 code0
+[2(LSL              reg64,mem                X64,PROT,SW )]340 code0
+[2(LSL              reg64,reg16              X64,PROT )]329 code0
+[2(LSL              reg64,reg32              X64,PROT )]318 code0
+[2(LSL              reg64,reg64              X64,PROT )]307 code0
+[2(LSS              reg16,mem                386 )]296 code0
+[2(LSS              reg32,mem                386 )]285 code0
+[2(LTR              mem                      286,PROT,PRIV )]274 code0
+[2(LTR              mem16                    286,PROT,PRIV )]263 code0
+[2(LTR              reg16                    286,PROT,PRIV )]252 code0
+[2(MFENCE                                    X64,AMD )]241 code0
+[2(MONITOR                                   PRESCOTT )]230 code0
+[2(MONITOR          reg_eax,reg_ecx,reg_edx  PRESCOTT,ND )]219 code0
+[2(MONITOR          reg_rax,reg_ecx,reg_edx  X64,ND )]208 code0
+[2(MOV              mem,reg_sreg             8086 )]197 code0
+[2(MOV              reg16,reg_sreg           8086 )]186 code0
+[2(MOV              reg32,reg_sreg           386 )]175 code0
+[2(MOV              reg_sreg,mem             8086 )]164 code0
+[2(MOV              reg_sreg,reg16           8086 )]153 code0
+[2(MOV              reg_sreg,reg32           386 )]142 code0
+[2(MOV              reg_al,mem_offs          8086 )]131 code0
+[2(MOV              reg_ax,mem_offs          8086 )]120 code0
+[2(MOV              reg_eax,mem_offs         386 )]109 code0
+(135)pageodd
+restore showpage
+%%Page: 136 136
+%%BeginPageSetup
+save
+%%EndPageSetup
+/136 pa
+[2(MOV              reg_rax,mem_offs         X64 )]681 code0
+[2(MOV              mem_offs,reg_al          8086 )]670 code0
+[2(MOV              mem_offs,reg_ax          8086 )]659 code0
+[2(MOV              mem_offs,reg_eax         386 )]648 code0
+[2(MOV              mem_offs,reg_rax         X64 )]637 code0
+[2(MOV              reg32,reg_creg           386,PRIV,NOLONG )]626 code0
+[2(MOV              reg64,reg_creg           X64,PRIV )]615 code0
+[2(MOV              reg_creg,reg32           386,PRIV,NOLONG )]604 code0
+[2(MOV              reg_creg,reg64           X64,PRIV )]593 code0
+[2(MOV              reg32,reg_dreg           386,PRIV,NOLONG )]582 code0
+[2(MOV              reg64,reg_dreg           X64,PRIV )]571 code0
+[2(MOV              reg_dreg,reg32           386,PRIV,NOLONG )]560 code0
+[2(MOV              reg_dreg,reg64           X64,PRIV )]549 code0
+[2(MOV              reg32,reg_treg           386,NOLONG,ND )]538 code0
+[2(MOV              reg_treg,reg32           386,NOLONG,ND )]527 code0
+[2(MOV              mem,reg8                 8086 )]516 code0
+[2(MOV              reg8,reg8                8086 )]505 code0
+[2(MOV              mem,reg16                8086 )]494 code0
+[2(MOV              reg16,reg16              8086 )]483 code0
+[2(MOV              mem,reg32                386 )]472 code0
+[2(MOV              reg32,reg32              386 )]461 code0
+[2(MOV              mem,reg64                X64 )]450 code0
+[2(MOV              reg64,reg64              X64 )]439 code0
+[2(MOV              reg8,mem                 8086 )]428 code0
+[2(MOV              reg8,reg8                8086 )]417 code0
+[2(MOV              reg16,mem                8086 )]406 code0
+[2(MOV              reg16,reg16              8086 )]395 code0
+[2(MOV              reg32,mem                386 )]384 code0
+[2(MOV              reg32,reg32              386 )]373 code0
+[2(MOV              reg64,mem                X64 )]362 code0
+[2(MOV              reg64,reg64              X64 )]351 code0
+[2(MOV              reg8,imm                 8086 )]340 code0
+[2(MOV              reg16,imm                8086 )]329 code0
+[2(MOV              reg32,imm                386 )]318 code0
+[2(MOV              reg64,imm                X64 )]307 code0
+[2(MOV              reg64,imm32              X64 )]296 code0
+[2(MOV              rm8,imm                  8086 )]285 code0
+[2(MOV              rm16,imm                 8086 )]274 code0
+[2(MOV              rm32,imm                 386 )]263 code0
+[2(MOV              rm64,imm                 X64 )]252 code0
+[2(MOV              mem,imm8                 8086 )]241 code0
+[2(MOV              mem,imm16                8086 )]230 code0
+[2(MOV              mem,imm32                386 )]219 code0
+[2(MOVD             mmxreg,mem               PENT,MMX,SD )]208 code0
+[2(MOVD             mmxreg,reg32             PENT,MMX )]197 code0
+[2(MOVD             mem,mmxreg               PENT,MMX,SD )]186 code0
+[2(MOVD             reg32,mmxreg             PENT,MMX )]175 code0
+[2(MOVD             xmmreg,mem               X64,SD )]164 code0
+[2(MOVD             xmmreg,reg32             X64 )]153 code0
+[2(MOVD             mem,xmmreg               X64,SD )]142 code0
+[2(MOVD             reg32,xmmreg             X64,SSE )]131 code0
+[2(MOVQ             mmxreg,mmxrm             PENT,MMX )]120 code0
+[2(MOVQ             mmxrm,mmxreg             PENT,MMX )]109 code0
+(136)pageeven
+restore showpage
+%%Page: 137 137
+%%BeginPageSetup
+save
+%%EndPageSetup
+/137 pa
+[2(MOVQ             mmxreg,rm64              X64,MMX )]681 code0
+[2(MOVQ             rm64,mmxreg              X64,MMX )]670 code0
+[2(MOVSB                                     8086 )]659 code0
+[2(MOVSD                                     386 )]648 code0
+[2(MOVSQ                                     X64 )]637 code0
+[2(MOVSW                                     8086 )]626 code0
+[2(MOVSX            reg16,mem                386 )]615 code0
+[2(MOVSX            reg16,reg8               386 )]604 code0
+[2(MOVSX            reg32,rm8                386 )]593 code0
+[2(MOVSX            reg32,rm16               386 )]582 code0
+[2(MOVSX            reg64,rm8                X64 )]571 code0
+[2(MOVSX            reg64,rm16               X64 )]560 code0
+[2(MOVSXD           reg64,rm32               X64 )]549 code0
+[2(MOVSX            reg64,rm32               X64,ND )]538 code0
+[2(MOVZX            reg16,mem                386 )]527 code0
+[2(MOVZX            reg16,reg8               386 )]516 code0
+[2(MOVZX            reg32,rm8                386 )]505 code0
+[2(MOVZX            reg32,rm16               386 )]494 code0
+[2(MOVZX            reg64,rm8                X64 )]483 code0
+[2(MOVZX            reg64,rm16               X64 )]472 code0
+[2(MUL              rm8                      8086 )]461 code0
+[2(MUL              rm16                     8086 )]450 code0
+[2(MUL              rm32                     386 )]439 code0
+[2(MUL              rm64                     X64 )]428 code0
+[2(MWAIT                                     PRESCOTT )]417 code0
+[2(MWAIT            reg_eax,reg_ecx          PRESCOTT,ND )]406 code0
+[2(NEG              rm8                      8086 )]395 code0
+[2(NEG              rm16                     8086 )]384 code0
+[2(NEG              rm32                     386 )]373 code0
+[2(NEG              rm64                     X64 )]362 code0
+[2(NOP                                       8086 )]351 code0
+[2(NOP              rm16                     P6 )]340 code0
+[2(NOP              rm32                     P6 )]329 code0
+[2(NOP              rm64                     X64 )]318 code0
+[2(NOT              rm8                      8086 )]307 code0
+[2(NOT              rm16                     8086 )]296 code0
+[2(NOT              rm32                     386 )]285 code0
+[2(NOT              rm64                     X64 )]274 code0
+[2(OR               mem,reg8                 8086 )]263 code0
+[2(OR               reg8,reg8                8086 )]252 code0
+[2(OR               mem,reg16                8086 )]241 code0
+[2(OR               reg16,reg16              8086 )]230 code0
+[2(OR               mem,reg32                386 )]219 code0
+[2(OR               reg32,reg32              386 )]208 code0
+[2(OR               mem,reg64                X64 )]197 code0
+[2(OR               reg64,reg64              X64 )]186 code0
+[2(OR               reg8,mem                 8086 )]175 code0
+[2(OR               reg8,reg8                8086 )]164 code0
+[2(OR               reg16,mem                8086 )]153 code0
+[2(OR               reg16,reg16              8086 )]142 code0
+[2(OR               reg32,mem                386 )]131 code0
+[2(OR               reg32,reg32              386 )]120 code0
+[2(OR               reg64,mem                X64 )]109 code0
+(137)pageodd
+restore showpage
+%%Page: 138 138
+%%BeginPageSetup
+save
+%%EndPageSetup
+/138 pa
+[2(OR               reg64,reg64              X64 )]681 code0
+[2(OR               rm16,imm8                8086 )]670 code0
+[2(OR               rm32,imm8                386 )]659 code0
+[2(OR               rm64,imm8                X64 )]648 code0
+[2(OR               reg_al,imm               8086 )]637 code0
+[2(OR               reg_ax,sbyte16           8086 )]626 code0
+[2(OR               reg_ax,imm               8086 )]615 code0
+[2(OR               reg_eax,sbyte32          386 )]604 code0
+[2(OR               reg_eax,imm              386 )]593 code0
+[2(OR               reg_rax,sbyte64          X64 )]582 code0
+[2(OR               reg_rax,imm              X64 )]571 code0
+[2(OR               rm8,imm                  8086 )]560 code0
+[2(OR               rm16,imm                 8086 )]549 code0
+[2(OR               rm32,imm                 386 )]538 code0
+[2(OR               rm64,imm                 X64 )]527 code0
+[2(OR               mem,imm8                 8086 )]516 code0
+[2(OR               mem,imm16                8086 )]505 code0
+[2(OR               mem,imm32                386 )]494 code0
+[2(OUT              imm,reg_al               8086 )]483 code0
+[2(OUT              imm,reg_ax               8086 )]472 code0
+[2(OUT              imm,reg_eax              386 )]461 code0
+[2(OUT              reg_dx,reg_al            8086 )]450 code0
+[2(OUT              reg_dx,reg_ax            8086 )]439 code0
+[2(OUT              reg_dx,reg_eax           386 )]428 code0
+[2(OUTSB                                     186 )]417 code0
+[2(OUTSD                                     386 )]406 code0
+[2(OUTSW                                     186 )]395 code0
+[2(PACKSSDW         mmxreg,mmxrm             PENT,MMX )]384 code0
+[2(PACKSSWB         mmxreg,mmxrm             PENT,MMX )]373 code0
+[2(PACKUSWB         mmxreg,mmxrm             PENT,MMX )]362 code0
+[2(PADDB            mmxreg,mmxrm             PENT,MMX )]351 code0
+[2(PADDD            mmxreg,mmxrm             PENT,MMX )]340 code0
+[2(PADDSB           mmxreg,mmxrm             PENT,MMX )]329 code0
+[2(PADDSIW          mmxreg,mmxrm             PENT,MMX,CYRIX )]318 code0
+[2(PADDSW           mmxreg,mmxrm             PENT,MMX )]307 code0
+[2(PADDUSB          mmxreg,mmxrm             PENT,MMX )]296 code0
+[2(PADDUSW          mmxreg,mmxrm             PENT,MMX )]285 code0
+[2(PADDW            mmxreg,mmxrm             PENT,MMX )]274 code0
+[2(PAND             mmxreg,mmxrm             PENT,MMX )]263 code0
+[2(PANDN            mmxreg,mmxrm             PENT,MMX )]252 code0
+[2(PAUSE                                     8086 )]241 code0
+[2(PAVEB            mmxreg,mmxrm             PENT,MMX,CYRIX )]230 code0
+[2(PAVGUSB          mmxreg,mmxrm             PENT,3DNOW )]219 code0
+[2(PCMPEQB          mmxreg,mmxrm             PENT,MMX )]208 code0
+[2(PCMPEQD          mmxreg,mmxrm             PENT,MMX )]197 code0
+[2(PCMPEQW          mmxreg,mmxrm             PENT,MMX )]186 code0
+[2(PCMPGTB          mmxreg,mmxrm             PENT,MMX )]175 code0
+[2(PCMPGTD          mmxreg,mmxrm             PENT,MMX )]164 code0
+[2(PCMPGTW          mmxreg,mmxrm             PENT,MMX )]153 code0
+[2(PDISTIB          mmxreg,mem               PENT,MMX,CYRIX )]142 code0
+[2(PF2ID            mmxreg,mmxrm             PENT,3DNOW )]131 code0
+[2(PFACC            mmxreg,mmxrm             PENT,3DNOW )]120 code0
+[2(PFADD            mmxreg,mmxrm             PENT,3DNOW )]109 code0
+(138)pageeven
+restore showpage
+%%Page: 139 139
+%%BeginPageSetup
+save
+%%EndPageSetup
+/139 pa
+[2(PFCMPEQ          mmxreg,mmxrm             PENT,3DNOW )]681 code0
+[2(PFCMPGE          mmxreg,mmxrm             PENT,3DNOW )]670 code0
+[2(PFCMPGT          mmxreg,mmxrm             PENT,3DNOW )]659 code0
+[2(PFMAX            mmxreg,mmxrm             PENT,3DNOW )]648 code0
+[2(PFMIN            mmxreg,mmxrm             PENT,3DNOW )]637 code0
+[2(PFMUL            mmxreg,mmxrm             PENT,3DNOW )]626 code0
+[2(PFRCP            mmxreg,mmxrm             PENT,3DNOW )]615 code0
+[2(PFRCPIT1         mmxreg,mmxrm             PENT,3DNOW )]604 code0
+[2(PFRCPIT2         mmxreg,mmxrm             PENT,3DNOW )]593 code0
+[2(PFRSQIT1         mmxreg,mmxrm             PENT,3DNOW )]582 code0
+[2(PFRSQRT          mmxreg,mmxrm             PENT,3DNOW )]571 code0
+[2(PFSUB            mmxreg,mmxrm             PENT,3DNOW )]560 code0
+[2(PFSUBR           mmxreg,mmxrm             PENT,3DNOW )]549 code0
+[2(PI2FD            mmxreg,mmxrm             PENT,3DNOW )]538 code0
+[2(PMACHRIW         mmxreg,mem               PENT,MMX,CYRIX )]527 code0
+[2(PMADDWD          mmxreg,mmxrm             PENT,MMX )]516 code0
+[2(PMAGW            mmxreg,mmxrm             PENT,MMX,CYRIX )]505 code0
+[2(PMULHRIW         mmxreg,mmxrm             PENT,MMX,CYRIX )]494 code0
+[2(PMULHRWA         mmxreg,mmxrm             PENT,3DNOW )]483 code0
+[2(PMULHRWC         mmxreg,mmxrm             PENT,MMX,CYRIX )]472 code0
+[2(PMULHW           mmxreg,mmxrm             PENT,MMX )]461 code0
+[2(PMULLW           mmxreg,mmxrm             PENT,MMX )]450 code0
+[2(PMVGEZB          mmxreg,mem               PENT,MMX,CYRIX )]439 code0
+[2(PMVLZB           mmxreg,mem               PENT,MMX,CYRIX )]428 code0
+[2(PMVNZB           mmxreg,mem               PENT,MMX,CYRIX )]417 code0
+[2(PMVZB            mmxreg,mem               PENT,MMX,CYRIX )]406 code0
+[2(POP              reg16                    8086 )]395 code0
+[2(POP              reg32                    386,NOLONG )]384 code0
+[2(POP              reg64                    X64 )]373 code0
+[2(POP              rm16                     8086 )]362 code0
+[2(POP              rm32                     386,NOLONG )]351 code0
+[2(POP              rm64                     X64 )]340 code0
+[2(POP              reg_cs                   8086,UNDOC,ND )]329 code0
+[2(POP              reg_dess                 8086,NOLONG )]318 code0
+[2(POP              reg_fsgs                 386 )]307 code0
+[2(POPA                                      186,NOLONG )]296 code0
+[2(POPAD                                     386,NOLONG )]285 code0
+[2(POPAW                                     186,NOLONG )]274 code0
+[2(POPF                                      8086 )]263 code0
+[2(POPFD                                     386,NOLONG )]252 code0
+[2(POPFQ                                     X64 )]241 code0
+[2(POPFW                                     8086 )]230 code0
+[2(POR              mmxreg,mmxrm             PENT,MMX )]219 code0
+[2(PREFETCH         mem                      PENT,3DNOW )]208 code0
+[2(PREFETCHW        mem                      PENT,3DNOW )]197 code0
+[2(PSLLD            mmxreg,mmxrm             PENT,MMX )]186 code0
+[2(PSLLD            mmxreg,imm               PENT,MMX )]175 code0
+[2(PSLLQ            mmxreg,mmxrm             PENT,MMX )]164 code0
+[2(PSLLQ            mmxreg,imm               PENT,MMX )]153 code0
+[2(PSLLW            mmxreg,mmxrm             PENT,MMX )]142 code0
+[2(PSLLW            mmxreg,imm               PENT,MMX )]131 code0
+[2(PSRAD            mmxreg,mmxrm             PENT,MMX )]120 code0
+[2(PSRAD            mmxreg,imm               PENT,MMX )]109 code0
+(139)pageodd
+restore showpage
+%%Page: 140 140
+%%BeginPageSetup
+save
+%%EndPageSetup
+/140 pa
+[2(PSRAW            mmxreg,mmxrm             PENT,MMX )]681 code0
+[2(PSRAW            mmxreg,imm               PENT,MMX )]670 code0
+[2(PSRLD            mmxreg,mmxrm             PENT,MMX )]659 code0
+[2(PSRLD            mmxreg,imm               PENT,MMX )]648 code0
+[2(PSRLQ            mmxreg,mmxrm             PENT,MMX )]637 code0
+[2(PSRLQ            mmxreg,imm               PENT,MMX )]626 code0
+[2(PSRLW            mmxreg,mmxrm             PENT,MMX )]615 code0
+[2(PSRLW            mmxreg,imm               PENT,MMX )]604 code0
+[2(PSUBB            mmxreg,mmxrm             PENT,MMX )]593 code0
+[2(PSUBD            mmxreg,mmxrm             PENT,MMX )]582 code0
+[2(PSUBSB           mmxreg,mmxrm             PENT,MMX )]571 code0
+[2(PSUBSIW          mmxreg,mmxrm             PENT,MMX,CYRIX )]560 code0
+[2(PSUBSW           mmxreg,mmxrm             PENT,MMX )]549 code0
+[2(PSUBUSB          mmxreg,mmxrm             PENT,MMX )]538 code0
+[2(PSUBUSW          mmxreg,mmxrm             PENT,MMX )]527 code0
+[2(PSUBW            mmxreg,mmxrm             PENT,MMX )]516 code0
+[2(PUNPCKHBW        mmxreg,mmxrm             PENT,MMX )]505 code0
+[2(PUNPCKHDQ        mmxreg,mmxrm             PENT,MMX )]494 code0
+[2(PUNPCKHWD        mmxreg,mmxrm             PENT,MMX )]483 code0
+[2(PUNPCKLBW        mmxreg,mmxrm             PENT,MMX )]472 code0
+[2(PUNPCKLDQ        mmxreg,mmxrm             PENT,MMX )]461 code0
+[2(PUNPCKLWD        mmxreg,mmxrm             PENT,MMX )]450 code0
+[2(PUSH             reg16                    8086 )]439 code0
+[2(PUSH             reg32                    386,NOLONG )]428 code0
+[2(PUSH             reg64                    X64 )]417 code0
+[2(PUSH             rm16                     8086 )]406 code0
+[2(PUSH             rm32                     386,NOLONG )]395 code0
+[2(PUSH             rm64                     X64 )]384 code0
+[2(PUSH             reg_cs                   8086,NOLONG )]373 code0
+[2(PUSH             reg_dess                 8086,NOLONG )]362 code0
+[2(PUSH             reg_fsgs                 386 )]351 code0
+[2(PUSH             imm8                     186 )]340 code0
+[2(PUSH             imm16                    186,AR0,SZ )]329 code0
+[2(PUSH             imm32                    386,NOLONG,AR0,SZ )]318 code0
+[2(PUSH             imm32                    386,NOLONG,SD )]307 code0
+[2(PUSH             imm64                    X64,AR0,SZ )]296 code0
+[2(PUSHA                                     186,NOLONG )]285 code0
+[2(PUSHAD                                    386,NOLONG )]274 code0
+[2(PUSHAW                                    186,NOLONG )]263 code0
+[2(PUSHF                                     8086 )]252 code0
+[2(PUSHFD                                    386,NOLONG )]241 code0
+[2(PUSHFQ                                    X64 )]230 code0
+[2(PUSHFW                                    8086 )]219 code0
+[2(PXOR             mmxreg,mmxrm             PENT,MMX )]208 code0
+[2(RCL              rm8,unity                8086 )]197 code0
+[2(RCL              rm8,reg_cl               8086 )]186 code0
+[2(RCL              rm8,imm                  186 )]175 code0
+[2(RCL              rm16,unity               8086 )]164 code0
+[2(RCL              rm16,reg_cl              8086 )]153 code0
+[2(RCL              rm16,imm                 186 )]142 code0
+[2(RCL              rm32,unity               386 )]131 code0
+[2(RCL              rm32,reg_cl              386 )]120 code0
+[2(RCL              rm32,imm                 386 )]109 code0
+(140)pageeven
+restore showpage
+%%Page: 141 141
+%%BeginPageSetup
+save
+%%EndPageSetup
+/141 pa
+[2(RCL              rm64,unity               X64 )]681 code0
+[2(RCL              rm64,reg_cl              X64 )]670 code0
+[2(RCL              rm64,imm                 X64 )]659 code0
+[2(RCR              rm8,unity                8086 )]648 code0
+[2(RCR              rm8,reg_cl               8086 )]637 code0
+[2(RCR              rm8,imm                  186 )]626 code0
+[2(RCR              rm16,unity               8086 )]615 code0
+[2(RCR              rm16,reg_cl              8086 )]604 code0
+[2(RCR              rm16,imm                 186 )]593 code0
+[2(RCR              rm32,unity               386 )]582 code0
+[2(RCR              rm32,reg_cl              386 )]571 code0
+[2(RCR              rm32,imm                 386 )]560 code0
+[2(RCR              rm64,unity               X64 )]549 code0
+[2(RCR              rm64,reg_cl              X64 )]538 code0
+[2(RCR              rm64,imm                 X64 )]527 code0
+[2(RDSHR            rm32                     P6,CYRIXM )]516 code0
+[2(RDMSR                                     PENT,PRIV )]505 code0
+[2(RDPMC                                     P6 )]494 code0
+[2(RDTSC                                     PENT )]483 code0
+[2(RDTSCP                                    X86_64 )]472 code0
+[2(RET                                       8086 )]461 code0
+[2(RET              imm                      8086,SW )]450 code0
+[2(RETF                                      8086 )]439 code0
+[2(RETF             imm                      8086,SW )]428 code0
+[2(RETN                                      8086 )]417 code0
+[2(RETN             imm                      8086,SW )]406 code0
+[2(ROL              rm8,unity                8086 )]395 code0
+[2(ROL              rm8,reg_cl               8086 )]384 code0
+[2(ROL              rm8,imm                  186 )]373 code0
+[2(ROL              rm16,unity               8086 )]362 code0
+[2(ROL              rm16,reg_cl              8086 )]351 code0
+[2(ROL              rm16,imm                 186 )]340 code0
+[2(ROL              rm32,unity               386 )]329 code0
+[2(ROL              rm32,reg_cl              386 )]318 code0
+[2(ROL              rm32,imm                 386 )]307 code0
+[2(ROL              rm64,unity               X64 )]296 code0
+[2(ROL              rm64,reg_cl              X64 )]285 code0
+[2(ROL              rm64,imm                 X64 )]274 code0
+[2(ROR              rm8,unity                8086 )]263 code0
+[2(ROR              rm8,reg_cl               8086 )]252 code0
+[2(ROR              rm8,imm                  186 )]241 code0
+[2(ROR              rm16,unity               8086 )]230 code0
+[2(ROR              rm16,reg_cl              8086 )]219 code0
+[2(ROR              rm16,imm                 186 )]208 code0
+[2(ROR              rm32,unity               386 )]197 code0
+[2(ROR              rm32,reg_cl              386 )]186 code0
+[2(ROR              rm32,imm                 386 )]175 code0
+[2(ROR              rm64,unity               X64 )]164 code0
+[2(ROR              rm64,reg_cl              X64 )]153 code0
+[2(ROR              rm64,imm                 X64 )]142 code0
+[2(RDM                                       P6,CYRIX,ND )]131 code0
+[2(RSDC             reg_sreg,mem80           486,CYRIXM )]120 code0
+[2(RSLDT            mem80                    486,CYRIXM )]109 code0
+(141)pageodd
+restore showpage
+%%Page: 142 142
+%%BeginPageSetup
+save
+%%EndPageSetup
+/142 pa
+[2(RSM                                       PENTM )]681 code0
+[2(RSTS             mem80                    486,CYRIXM )]670 code0
+[2(SAHF                                      8086 )]659 code0
+[2(SAL              rm8,unity                8086,ND )]648 code0
+[2(SAL              rm8,reg_cl               8086,ND )]637 code0
+[2(SAL              rm8,imm                  186,ND )]626 code0
+[2(SAL              rm16,unity               8086,ND )]615 code0
+[2(SAL              rm16,reg_cl              8086,ND )]604 code0
+[2(SAL              rm16,imm                 186,ND )]593 code0
+[2(SAL              rm32,unity               386,ND )]582 code0
+[2(SAL              rm32,reg_cl              386,ND )]571 code0
+[2(SAL              rm32,imm                 386,ND )]560 code0
+[2(SAL              rm64,unity               X64,ND )]549 code0
+[2(SAL              rm64,reg_cl              X64,ND )]538 code0
+[2(SAL              rm64,imm                 X64,ND )]527 code0
+[2(SALC                                      8086,UNDOC )]516 code0
+[2(SAR              rm8,unity                8086 )]505 code0
+[2(SAR              rm8,reg_cl               8086 )]494 code0
+[2(SAR              rm8,imm                  186 )]483 code0
+[2(SAR              rm16,unity               8086 )]472 code0
+[2(SAR              rm16,reg_cl              8086 )]461 code0
+[2(SAR              rm16,imm                 186 )]450 code0
+[2(SAR              rm32,unity               386 )]439 code0
+[2(SAR              rm32,reg_cl              386 )]428 code0
+[2(SAR              rm32,imm                 386 )]417 code0
+[2(SAR              rm64,unity               X64 )]406 code0
+[2(SAR              rm64,reg_cl              X64 )]395 code0
+[2(SAR              rm64,imm                 X64 )]384 code0
+[2(SBB              mem,reg8                 8086 )]373 code0
+[2(SBB              reg8,reg8                8086 )]362 code0
+[2(SBB              mem,reg16                8086 )]351 code0
+[2(SBB              reg16,reg16              8086 )]340 code0
+[2(SBB              mem,reg32                386 )]329 code0
+[2(SBB              reg32,reg32              386 )]318 code0
+[2(SBB              mem,reg64                X64 )]307 code0
+[2(SBB              reg64,reg64              X64 )]296 code0
+[2(SBB              reg8,mem                 8086 )]285 code0
+[2(SBB              reg8,reg8                8086 )]274 code0
+[2(SBB              reg16,mem                8086 )]263 code0
+[2(SBB              reg16,reg16              8086 )]252 code0
+[2(SBB              reg32,mem                386 )]241 code0
+[2(SBB              reg32,reg32              386 )]230 code0
+[2(SBB              reg64,mem                X64 )]219 code0
+[2(SBB              reg64,reg64              X64 )]208 code0
+[2(SBB              rm16,imm8                8086 )]197 code0
+[2(SBB              rm32,imm8                386 )]186 code0
+[2(SBB              rm64,imm8                X64 )]175 code0
+[2(SBB              reg_al,imm               8086 )]164 code0
+[2(SBB              reg_ax,sbyte16           8086 )]153 code0
+[2(SBB              reg_ax,imm               8086 )]142 code0
+[2(SBB              reg_eax,sbyte32          386 )]131 code0
+[2(SBB              reg_eax,imm              386 )]120 code0
+[2(SBB              reg_rax,sbyte64          X64 )]109 code0
+(142)pageeven
+restore showpage
+%%Page: 143 143
+%%BeginPageSetup
+save
+%%EndPageSetup
+/143 pa
+[2(SBB              reg_rax,imm              X64 )]681 code0
+[2(SBB              rm8,imm                  8086 )]670 code0
+[2(SBB              rm16,imm                 8086 )]659 code0
+[2(SBB              rm32,imm                 386 )]648 code0
+[2(SBB              rm64,imm                 X64 )]637 code0
+[2(SBB              mem,imm8                 8086 )]626 code0
+[2(SBB              mem,imm16                8086 )]615 code0
+[2(SBB              mem,imm32                386 )]604 code0
+[2(SCASB                                     8086 )]593 code0
+[2(SCASD                                     386 )]582 code0
+[2(SCASQ                                     X64 )]571 code0
+[2(SCASW                                     8086 )]560 code0
+[2(SFENCE                                    X64,AMD )]549 code0
+[2(SGDT             mem                      286 )]538 code0
+[2(SHL              rm8,unity                8086 )]527 code0
+[2(SHL              rm8,reg_cl               8086 )]516 code0
+[2(SHL              rm8,imm                  186 )]505 code0
+[2(SHL              rm16,unity               8086 )]494 code0
+[2(SHL              rm16,reg_cl              8086 )]483 code0
+[2(SHL              rm16,imm                 186 )]472 code0
+[2(SHL              rm32,unity               386 )]461 code0
+[2(SHL              rm32,reg_cl              386 )]450 code0
+[2(SHL              rm32,imm                 386 )]439 code0
+[2(SHL              rm64,unity               X64 )]428 code0
+[2(SHL              rm64,reg_cl              X64 )]417 code0
+[2(SHL              rm64,imm                 X64 )]406 code0
+[2(SHLD             mem,reg16,imm            3862 )]395 code0
+[2(SHLD             reg16,reg16,imm          3862 )]384 code0
+[2(SHLD             mem,reg32,imm            3862 )]373 code0
+[2(SHLD             reg32,reg32,imm          3862 )]362 code0
+[2(SHLD             mem,reg64,imm            X642 )]351 code0
+[2(SHLD             reg64,reg64,imm          X642 )]340 code0
+[2(SHLD             mem,reg16,reg_cl         386 )]329 code0
+[2(SHLD             reg16,reg16,reg_cl       386 )]318 code0
+[2(SHLD             mem,reg32,reg_cl         386 )]307 code0
+[2(SHLD             reg32,reg32,reg_cl       386 )]296 code0
+[2(SHLD             mem,reg64,reg_cl         X64 )]285 code0
+[2(SHLD             reg64,reg64,reg_cl       X64 )]274 code0
+[2(SHR              rm8,unity                8086 )]263 code0
+[2(SHR              rm8,reg_cl               8086 )]252 code0
+[2(SHR              rm8,imm                  186 )]241 code0
+[2(SHR              rm16,unity               8086 )]230 code0
+[2(SHR              rm16,reg_cl              8086 )]219 code0
+[2(SHR              rm16,imm                 186 )]208 code0
+[2(SHR              rm32,unity               386 )]197 code0
+[2(SHR              rm32,reg_cl              386 )]186 code0
+[2(SHR              rm32,imm                 386 )]175 code0
+[2(SHR              rm64,unity               X64 )]164 code0
+[2(SHR              rm64,reg_cl              X64 )]153 code0
+[2(SHR              rm64,imm                 X64 )]142 code0
+[2(SHRD             mem,reg16,imm            3862 )]131 code0
+[2(SHRD             reg16,reg16,imm          3862 )]120 code0
+[2(SHRD             mem,reg32,imm            3862 )]109 code0
+(143)pageodd
+restore showpage
+%%Page: 144 144
+%%BeginPageSetup
+save
+%%EndPageSetup
+/144 pa
+[2(SHRD             reg32,reg32,imm          3862 )]681 code0
+[2(SHRD             mem,reg64,imm            X642 )]670 code0
+[2(SHRD             reg64,reg64,imm          X642 )]659 code0
+[2(SHRD             mem,reg16,reg_cl         386 )]648 code0
+[2(SHRD             reg16,reg16,reg_cl       386 )]637 code0
+[2(SHRD             mem,reg32,reg_cl         386 )]626 code0
+[2(SHRD             reg32,reg32,reg_cl       386 )]615 code0
+[2(SHRD             mem,reg64,reg_cl         X64 )]604 code0
+[2(SHRD             reg64,reg64,reg_cl       X64 )]593 code0
+[2(SIDT             mem                      286 )]582 code0
+[2(SLDT             mem                      286 )]571 code0
+[2(SLDT             mem16                    286 )]560 code0
+[2(SLDT             reg16                    286 )]549 code0
+[2(SLDT             reg32                    386 )]538 code0
+[2(SLDT             reg64                    X64,ND )]527 code0
+[2(SLDT             reg64                    X64 )]516 code0
+[2(SKINIT                                    X64 )]505 code0
+[2(SMI                                       386,UNDOC )]494 code0
+[2(SMINT                                     P6,CYRIX,ND )]483 code0
+[2(SMINTOLD                                  486,CYRIX,ND )]472 code0
+[2(SMSW             mem                      286 )]461 code0
+[2(SMSW             mem16                    286 )]450 code0
+[2(SMSW             reg16                    286 )]439 code0
+[2(SMSW             reg32                    386 )]428 code0
+[2(STC                                       8086 )]417 code0
+[2(STD                                       8086 )]406 code0
+[2(STGI                                      X64 )]395 code0
+[2(STI                                       8086 )]384 code0
+[2(STOSB                                     8086 )]373 code0
+[2(STOSD                                     386 )]362 code0
+[2(STOSQ                                     X64 )]351 code0
+[2(STOSW                                     8086 )]340 code0
+[2(STR              mem                      286,PROT )]329 code0
+[2(STR              mem16                    286,PROT )]318 code0
+[2(STR              reg16                    286,PROT )]307 code0
+[2(STR              reg32                    386,PROT )]296 code0
+[2(STR              reg64                    X64 )]285 code0
+[2(SUB              mem,reg8                 8086 )]274 code0
+[2(SUB              reg8,reg8                8086 )]263 code0
+[2(SUB              mem,reg16                8086 )]252 code0
+[2(SUB              reg16,reg16              8086 )]241 code0
+[2(SUB              mem,reg32                386 )]230 code0
+[2(SUB              reg32,reg32              386 )]219 code0
+[2(SUB              mem,reg64                X64 )]208 code0
+[2(SUB              reg64,reg64              X64 )]197 code0
+[2(SUB              reg8,mem                 8086 )]186 code0
+[2(SUB              reg8,reg8                8086 )]175 code0
+[2(SUB              reg16,mem                8086 )]164 code0
+[2(SUB              reg16,reg16              8086 )]153 code0
+[2(SUB              reg32,mem                386 )]142 code0
+[2(SUB              reg32,reg32              386 )]131 code0
+[2(SUB              reg64,mem                X64 )]120 code0
+[2(SUB              reg64,reg64              X64 )]109 code0
+(144)pageeven
+restore showpage
+%%Page: 145 145
+%%BeginPageSetup
+save
+%%EndPageSetup
+/145 pa
+[2(SUB              rm16,imm8                8086 )]681 code0
+[2(SUB              rm32,imm8                386 )]670 code0
+[2(SUB              rm64,imm8                X64 )]659 code0
+[2(SUB              reg_al,imm               8086 )]648 code0
+[2(SUB              reg_ax,sbyte16           8086 )]637 code0
+[2(SUB              reg_ax,imm               8086 )]626 code0
+[2(SUB              reg_eax,sbyte32          386 )]615 code0
+[2(SUB              reg_eax,imm              386 )]604 code0
+[2(SUB              reg_rax,sbyte64          X64 )]593 code0
+[2(SUB              reg_rax,imm              X64 )]582 code0
+[2(SUB              rm8,imm                  8086 )]571 code0
+[2(SUB              rm16,imm                 8086 )]560 code0
+[2(SUB              rm32,imm                 386 )]549 code0
+[2(SUB              rm64,imm                 X64 )]538 code0
+[2(SUB              mem,imm8                 8086 )]527 code0
+[2(SUB              mem,imm16                8086 )]516 code0
+[2(SUB              mem,imm32                386 )]505 code0
+[2(SVDC             mem80,reg_sreg           486,CYRIXM )]494 code0
+[2(SVLDT            mem80                    486,CYRIXM,ND )]483 code0
+[2(SVTS             mem80                    486,CYRIXM )]472 code0
+[2(SWAPGS                                    X64 )]461 code0
+[2(SYSCALL                                   P6,AMD )]450 code0
+[2(SYSENTER                                  P6 )]439 code0
+[2(SYSEXIT                                   P6,PRIV )]428 code0
+[2(SYSRET                                    P6,PRIV,AMD )]417 code0
+[2(TEST             mem,reg8                 8086 )]406 code0
+[2(TEST             reg8,reg8                8086 )]395 code0
+[2(TEST             mem,reg16                8086 )]384 code0
+[2(TEST             reg16,reg16              8086 )]373 code0
+[2(TEST             mem,reg32                386 )]362 code0
+[2(TEST             reg32,reg32              386 )]351 code0
+[2(TEST             mem,reg64                X64 )]340 code0
+[2(TEST             reg64,reg64              X64 )]329 code0
+[2(TEST             reg8,mem                 8086 )]318 code0
+[2(TEST             reg16,mem                8086 )]307 code0
+[2(TEST             reg32,mem                386 )]296 code0
+[2(TEST             reg64,mem                X64 )]285 code0
+[2(TEST             reg_al,imm               8086 )]274 code0
+[2(TEST             reg_ax,imm               8086 )]263 code0
+[2(TEST             reg_eax,imm              386 )]252 code0
+[2(TEST             reg_rax,imm              X64 )]241 code0
+[2(TEST             rm8,imm                  8086 )]230 code0
+[2(TEST             rm16,imm                 8086 )]219 code0
+[2(TEST             rm32,imm                 386 )]208 code0
+[2(TEST             rm64,imm                 X64 )]197 code0
+[2(TEST             mem,imm8                 8086 )]186 code0
+[2(TEST             mem,imm16                8086 )]175 code0
+[2(TEST             mem,imm32                386 )]164 code0
+[2(UD0                                       186,UNDOC )]153 code0
+[2(UD1                                       186,UNDOC )]142 code0
+[2(UD2B                                      186,UNDOC,ND )]131 code0
+[2(UD2                                       186 )]120 code0
+[2(UD2A                                      186,ND )]109 code0
+(145)pageodd
+restore showpage
+%%Page: 146 146
+%%BeginPageSetup
+save
+%%EndPageSetup
+/146 pa
+[2(UMOV             mem,reg8                 386,UNDOC,ND )]681 code0
+[2(UMOV             reg8,reg8                386,UNDOC,ND )]670 code0
+[2(UMOV             mem,reg16                386,UNDOC,ND )]659 code0
+[2(UMOV             reg16,reg16              386,UNDOC,ND )]648 code0
+[2(UMOV             mem,reg32                386,UNDOC,ND )]637 code0
+[2(UMOV             reg32,reg32              386,UNDOC,ND )]626 code0
+[2(UMOV             reg8,mem                 386,UNDOC,ND )]615 code0
+[2(UMOV             reg8,reg8                386,UNDOC,ND )]604 code0
+[2(UMOV             reg16,mem                386,UNDOC,ND )]593 code0
+[2(UMOV             reg16,reg16              386,UNDOC,ND )]582 code0
+[2(UMOV             reg32,mem                386,UNDOC,ND )]571 code0
+[2(UMOV             reg32,reg32              386,UNDOC,ND )]560 code0
+[2(VERR             mem                      286,PROT )]549 code0
+[2(VERR             mem16                    286,PROT )]538 code0
+[2(VERR             reg16                    286,PROT )]527 code0
+[2(VERW             mem                      286,PROT )]516 code0
+[2(VERW             mem16                    286,PROT )]505 code0
+[2(VERW             reg16                    286,PROT )]494 code0
+[2(FWAIT                                     8086 )]483 code0
+[2(WBINVD                                    486,PRIV )]472 code0
+[2(WRSHR            rm32                     P6,CYRIXM )]461 code0
+[2(WRMSR                                     PENT,PRIV )]450 code0
+[2(XADD             mem,reg8                 486 )]439 code0
+[2(XADD             reg8,reg8                486 )]428 code0
+[2(XADD             mem,reg16                486 )]417 code0
+[2(XADD             reg16,reg16              486 )]406 code0
+[2(XADD             mem,reg32                486 )]395 code0
+[2(XADD             reg32,reg32              486 )]384 code0
+[2(XADD             mem,reg64                X64 )]373 code0
+[2(XADD             reg64,reg64              X64 )]362 code0
+[2(XBTS             reg16,mem                386,SW,UNDOC,ND )]351 code0
+[2(XBTS             reg16,reg16              386,UNDOC,ND )]340 code0
+[2(XBTS             reg32,mem                386,SD,UNDOC,ND )]329 code0
+[2(XBTS             reg32,reg32              386,UNDOC,ND )]318 code0
+[2(XCHG             reg_ax,reg16             8086 )]307 code0
+[2(XCHG             reg_eax,reg32na          386 )]296 code0
+[2(XCHG             reg_rax,reg64            X64 )]285 code0
+[2(XCHG             reg16,reg_ax             8086 )]274 code0
+[2(XCHG             reg32na,reg_eax          386 )]263 code0
+[2(XCHG             reg64,reg_rax            X64 )]252 code0
+[2(XCHG             reg_eax,reg_eax          386,NOLONG )]241 code0
+[2(XCHG             reg8,mem                 8086 )]230 code0
+[2(XCHG             reg8,reg8                8086 )]219 code0
+[2(XCHG             reg16,mem                8086 )]208 code0
+[2(XCHG             reg16,reg16              8086 )]197 code0
+[2(XCHG             reg32,mem                386 )]186 code0
+[2(XCHG             reg32,reg32              386 )]175 code0
+[2(XCHG             reg64,mem                X64 )]164 code0
+[2(XCHG             reg64,reg64              X64 )]153 code0
+[2(XCHG             mem,reg8                 8086 )]142 code0
+[2(XCHG             reg8,reg8                8086 )]131 code0
+[2(XCHG             mem,reg16                8086 )]120 code0
+[2(XCHG             reg16,reg16              8086 )]109 code0
+(146)pageeven
+restore showpage
+%%Page: 147 147
+%%BeginPageSetup
+save
+%%EndPageSetup
+/147 pa
+[2(XCHG             mem,reg32                386 )]681 code0
+[2(XCHG             reg32,reg32              386 )]670 code0
+[2(XCHG             mem,reg64                X64 )]659 code0
+[2(XCHG             reg64,reg64              X64 )]648 code0
+[2(XLATB                                     8086 )]637 code0
+[2(XLAT                                      8086 )]626 code0
+[2(XOR              mem,reg8                 8086 )]615 code0
+[2(XOR              reg8,reg8                8086 )]604 code0
+[2(XOR              mem,reg16                8086 )]593 code0
+[2(XOR              reg16,reg16              8086 )]582 code0
+[2(XOR              mem,reg32                386 )]571 code0
+[2(XOR              reg32,reg32              386 )]560 code0
+[2(XOR              mem,reg64                X64 )]549 code0
+[2(XOR              reg64,reg64              X64 )]538 code0
+[2(XOR              reg8,mem                 8086 )]527 code0
+[2(XOR              reg8,reg8                8086 )]516 code0
+[2(XOR              reg16,mem                8086 )]505 code0
+[2(XOR              reg16,reg16              8086 )]494 code0
+[2(XOR              reg32,mem                386 )]483 code0
+[2(XOR              reg32,reg32              386 )]472 code0
+[2(XOR              reg64,mem                X64 )]461 code0
+[2(XOR              reg64,reg64              X64 )]450 code0
+[2(XOR              rm16,imm8                8086 )]439 code0
+[2(XOR              rm32,imm8                386 )]428 code0
+[2(XOR              rm64,imm8                X64 )]417 code0
+[2(XOR              reg_al,imm               8086 )]406 code0
+[2(XOR              reg_ax,sbyte16           8086 )]395 code0
+[2(XOR              reg_ax,imm               8086 )]384 code0
+[2(XOR              reg_eax,sbyte32          386 )]373 code0
+[2(XOR              reg_eax,imm              386 )]362 code0
+[2(XOR              reg_rax,sbyte64          X64 )]351 code0
+[2(XOR              reg_rax,imm              X64 )]340 code0
+[2(XOR              rm8,imm                  8086 )]329 code0
+[2(XOR              rm16,imm                 8086 )]318 code0
+[2(XOR              rm32,imm                 386 )]307 code0
+[2(XOR              rm64,imm                 X64 )]296 code0
+[2(XOR              mem,imm8                 8086 )]285 code0
+[2(XOR              mem,imm16                8086 )]274 code0
+[2(XOR              mem,imm32                386 )]263 code0
+[2(CMOVcc           reg16,mem                P6 )]252 code0
+[2(CMOVcc           reg16,reg16              P6 )]241 code0
+[2(CMOVcc           reg32,mem                P6 )]230 code0
+[2(CMOVcc           reg32,reg32              P6 )]219 code0
+[2(CMOVcc           reg64,mem                X64 )]208 code0
+[2(CMOVcc           reg64,reg64              X64 )]197 code0
+[2(Jcc              imm|near                 386 )]186 code0
+[2(Jcc              imm16|near               386 )]175 code0
+[2(Jcc              imm32|near               386 )]164 code0
+[2(Jcc              imm|short                8086,ND )]153 code0
+[2(Jcc              imm                      8086,ND )]142 code0
+[2(Jcc              imm                      386,ND )]131 code0
+[2(Jcc              imm                      8086,ND )]120 code0
+[2(Jcc              imm                      8086 )]109 code0
+(147)pageodd
+restore showpage
+%%Page: 148 148
+%%BeginPageSetup
+save
+%%EndPageSetup
+/148 pa
+[2(SETcc            mem                      386 )]681 code0
+[2(SETcc            reg8                     386)]670 code2
+[{/section-B.1.3 xa}(Katmai Streaming SIMD instructions \(SSE \226\226 a.k.a. KNI, XMM, MMX2\))](B.1.3)650.8 subh3
+[2(ADDPS            xmmreg,xmmrm             KATMAI,SSE )]633.8 code1
+[2(ADDSS            xmmreg,xmmrm             KATMAI,SSE,SD )]622.8 code0
+[2(ANDNPS           xmmreg,xmmrm             KATMAI,SSE )]611.8 code0
+[2(ANDPS            xmmreg,xmmrm             KATMAI,SSE )]600.8 code0
+[2(CMPEQPS          xmmreg,xmmrm             KATMAI,SSE )]589.8 code0
+[2(CMPEQSS          xmmreg,xmmrm             KATMAI,SSE )]578.8 code0
+[2(CMPLEPS          xmmreg,xmmrm             KATMAI,SSE )]567.8 code0
+[2(CMPLESS          xmmreg,xmmrm             KATMAI,SSE )]556.8 code0
+[2(CMPLTPS          xmmreg,xmmrm             KATMAI,SSE )]545.8 code0
+[2(CMPLTSS          xmmreg,xmmrm             KATMAI,SSE )]534.8 code0
+[2(CMPNEQPS         xmmreg,xmmrm             KATMAI,SSE )]523.8 code0
+[2(CMPNEQSS         xmmreg,xmmrm             KATMAI,SSE )]512.8 code0
+[2(CMPNLEPS         xmmreg,xmmrm             KATMAI,SSE )]501.8 code0
+[2(CMPNLESS         xmmreg,xmmrm             KATMAI,SSE )]490.8 code0
+[2(CMPNLTPS         xmmreg,xmmrm             KATMAI,SSE )]479.8 code0
+[2(CMPNLTSS         xmmreg,xmmrm             KATMAI,SSE )]468.8 code0
+[2(CMPORDPS         xmmreg,xmmrm             KATMAI,SSE )]457.8 code0
+[2(CMPORDSS         xmmreg,xmmrm             KATMAI,SSE )]446.8 code0
+[2(CMPUNORDPS       xmmreg,xmmrm             KATMAI,SSE )]435.8 code0
+[2(CMPUNORDSS       xmmreg,xmmrm             KATMAI,SSE )]424.8 code0
+[2(CMPPS            xmmreg,mem,imm           KATMAI,SSE )]413.8 code0
+[2(CMPPS            xmmreg,xmmreg,imm        KATMAI,SSE )]402.8 code0
+[2(CMPSS            xmmreg,mem,imm           KATMAI,SSE )]391.8 code0
+[2(CMPSS            xmmreg,xmmreg,imm        KATMAI,SSE )]380.8 code0
+[2(COMISS           xmmreg,xmmrm             KATMAI,SSE )]369.8 code0
+[2(CVTPI2PS         xmmreg,mmxrm             KATMAI,SSE,MMX )]358.8 code0
+[2(CVTPS2PI         mmxreg,xmmrm             KATMAI,SSE,MMX )]347.8 code0
+[2(CVTSI2SS         xmmreg,mem               KATMAI,SSE,SD,AR1,ND )]336.8 code0
+[2(CVTSI2SS         xmmreg,rm32              KATMAI,SSE,SD,AR1 )]325.8 code0
+[2(CVTSI2SS         xmmreg,rm64              X64,SSE,AR1 )]314.8 code0
+[2(CVTSS2SI         reg32,xmmreg             KATMAI,SSE,SD,AR1 )]303.8 code0
+[2(CVTSS2SI         reg32,mem                KATMAI,SSE,SD,AR1 )]292.8 code0
+[2(CVTSS2SI         reg64,xmmreg             X64,SSE,SD,AR1 )]281.8 code0
+[2(CVTSS2SI         reg64,mem                X64,SSE,SD,AR1 )]270.8 code0
+[2(CVTTPS2PI        mmxreg,xmmrm             KATMAI,SSE,MMX )]259.8 code0
+[2(CVTTSS2SI        reg32,xmmrm              KATMAI,SSE,SD,AR1 )]248.8 code0
+[2(CVTTSS2SI        reg64,xmmrm              X64,SSE,SD,AR1 )]237.8 code0
+[2(DIVPS            xmmreg,xmmrm             KATMAI,SSE )]226.8 code0
+[2(DIVSS            xmmreg,xmmrm             KATMAI,SSE )]215.8 code0
+[2(LDMXCSR          mem                      KATMAI,SSE,SD )]204.8 code0
+[2(MAXPS            xmmreg,xmmrm             KATMAI,SSE )]193.8 code0
+[2(MAXSS            xmmreg,xmmrm             KATMAI,SSE )]182.8 code0
+[2(MINPS            xmmreg,xmmrm             KATMAI,SSE )]171.8 code0
+[2(MINSS            xmmreg,xmmrm             KATMAI,SSE )]160.8 code0
+[2(MOVAPS           xmmreg,mem               KATMAI,SSE )]149.8 code0
+[2(MOVAPS           mem,xmmreg               KATMAI,SSE )]138.8 code0
+[2(MOVAPS           xmmreg,xmmreg            KATMAI,SSE )]127.8 code0
+[2(MOVAPS           xmmreg,xmmreg            KATMAI,SSE )]116.8 code0
+[2(MOVHPS           xmmreg,mem               KATMAI,SSE )]105.8 code0
+(148)pageeven
+restore showpage
+%%Page: 149 149
+%%BeginPageSetup
+save
+%%EndPageSetup
+/149 pa
+[2(MOVHPS           mem,xmmreg               KATMAI,SSE )]681 code0
+[2(MOVLHPS          xmmreg,xmmreg            KATMAI,SSE )]670 code0
+[2(MOVLPS           xmmreg,mem               KATMAI,SSE )]659 code0
+[2(MOVLPS           mem,xmmreg               KATMAI,SSE )]648 code0
+[2(MOVHLPS          xmmreg,xmmreg            KATMAI,SSE )]637 code0
+[2(MOVMSKPS         reg32,xmmreg             KATMAI,SSE )]626 code0
+[2(MOVMSKPS         reg64,xmmreg             X64,SSE )]615 code0
+[2(MOVNTPS          mem,xmmreg               KATMAI,SSE )]604 code0
+[2(MOVSS            xmmreg,mem               KATMAI,SSE )]593 code0
+[2(MOVSS            mem,xmmreg               KATMAI,SSE )]582 code0
+[2(MOVSS            xmmreg,xmmreg            KATMAI,SSE )]571 code0
+[2(MOVSS            xmmreg,xmmreg            KATMAI,SSE )]560 code0
+[2(MOVUPS           xmmreg,mem               KATMAI,SSE )]549 code0
+[2(MOVUPS           mem,xmmreg               KATMAI,SSE )]538 code0
+[2(MOVUPS           xmmreg,xmmreg            KATMAI,SSE )]527 code0
+[2(MOVUPS           xmmreg,xmmreg            KATMAI,SSE )]516 code0
+[2(MULPS            xmmreg,xmmrm             KATMAI,SSE )]505 code0
+[2(MULSS            xmmreg,xmmrm             KATMAI,SSE )]494 code0
+[2(ORPS             xmmreg,xmmrm             KATMAI,SSE )]483 code0
+[2(RCPPS            xmmreg,xmmrm             KATMAI,SSE )]472 code0
+[2(RCPSS            xmmreg,xmmrm             KATMAI,SSE )]461 code0
+[2(RSQRTPS          xmmreg,xmmrm             KATMAI,SSE )]450 code0
+[2(RSQRTSS          xmmreg,xmmrm             KATMAI,SSE )]439 code0
+[2(SHUFPS           xmmreg,mem,imm           KATMAI,SSE )]428 code0
+[2(SHUFPS           xmmreg,xmmreg,imm        KATMAI,SSE )]417 code0
+[2(SQRTPS           xmmreg,xmmrm             KATMAI,SSE )]406 code0
+[2(SQRTSS           xmmreg,xmmrm             KATMAI,SSE )]395 code0
+[2(STMXCSR          mem                      KATMAI,SSE,SD )]384 code0
+[2(SUBPS            xmmreg,xmmrm             KATMAI,SSE )]373 code0
+[2(SUBSS            xmmreg,xmmrm             KATMAI,SSE )]362 code0
+[2(UCOMISS          xmmreg,xmmrm             KATMAI,SSE )]351 code0
+[2(UNPCKHPS         xmmreg,xmmrm             KATMAI,SSE )]340 code0
+[2(UNPCKLPS         xmmreg,xmmrm             KATMAI,SSE )]329 code0
+[2(XORPS            xmmreg,xmmrm             KATMAI,SSE)]318 code2
+[{/section-B.1.4 xa}(Introduced in Deschutes but necessary for SSE support)](B.1.4)298.8 subh3
+[2(FXRSTOR          mem                      P6,SSE,FPU )]281.8 code1
+[2(FXSAVE           mem                      P6,SSE,FPU)]270.8 code2
+[{/section-B.1.5 xa}(XSAVE group \(AVX and extended state\))](B.1.5)251.6 subh3
+[2(XGETBV                                    NEHALEM )]234.6 code1
+[2(XSETBV                                    NEHALEM,PRIV )]223.6 code0
+[2(XSAVE            mem                      NEHALEM )]212.6 code0
+[2(XRSTOR           mem                      NEHALEM)]201.6 code2
+[{/section-B.1.6 xa}(Generic memory operations)](B.1.6)182.4 subh3
+[2(PREFETCHNTA      mem                      KATMAI )]165.4 code1
+[2(PREFETCHT0       mem                      KATMAI )]154.4 code0
+[2(PREFETCHT1       mem                      KATMAI )]143.4 code0
+[2(PREFETCHT2       mem                      KATMAI )]132.4 code0
+[2(SFENCE                                    KATMAI)]121.4 code2
+(149)pageodd
+restore showpage
+%%Page: 150 150
+%%BeginPageSetup
+save
+%%EndPageSetup
+/150 pa
+[{/section-B.1.7 xa}(New MMX instructions introduced in Katmai)](B.1.7)678.8 subh3
+[2(MASKMOVQ         mmxreg,mmxreg            KATMAI,MMX )]661.8 code1
+[2(MOVNTQ           mem,mmxreg               KATMAI,MMX )]650.8 code0
+[2(PAVGB            mmxreg,mmxrm             KATMAI,MMX )]639.8 code0
+[2(PAVGW            mmxreg,mmxrm             KATMAI,MMX )]628.8 code0
+[2(PEXTRW           reg32,mmxreg,imm         KATMAI,MMX )]617.8 code0
+[2(PINSRW           mmxreg,mem,imm           KATMAI,MMX )]606.8 code0
+[2(PINSRW           mmxreg,rm16,imm          KATMAI,MMX )]595.8 code0
+[2(PINSRW           mmxreg,reg32,imm         KATMAI,MMX )]584.8 code0
+[2(PMAXSW           mmxreg,mmxrm             KATMAI,MMX )]573.8 code0
+[2(PMAXUB           mmxreg,mmxrm             KATMAI,MMX )]562.8 code0
+[2(PMINSW           mmxreg,mmxrm             KATMAI,MMX )]551.8 code0
+[2(PMINUB           mmxreg,mmxrm             KATMAI,MMX )]540.8 code0
+[2(PMOVMSKB         reg32,mmxreg             KATMAI,MMX )]529.8 code0
+[2(PMULHUW          mmxreg,mmxrm             KATMAI,MMX )]518.8 code0
+[2(PSADBW           mmxreg,mmxrm             KATMAI,MMX )]507.8 code0
+[2(PSHUFW           mmxreg,mmxrm,imm         KATMAI,MMX2)]496.8 code2
+[{/section-B.1.8 xa}(AMD Enhanced 3DNow! \(Athlon\) instructions)](B.1.8)477.6 subh3
+[2(PF2IW            mmxreg,mmxrm             PENT,3DNOW )]460.6 code1
+[2(PFNACC           mmxreg,mmxrm             PENT,3DNOW )]449.6 code0
+[2(PFPNACC          mmxreg,mmxrm             PENT,3DNOW )]438.6 code0
+[2(PI2FW            mmxreg,mmxrm             PENT,3DNOW )]427.6 code0
+[2(PSWAPD           mmxreg,mmxrm             PENT,3DNOW)]416.6 code2
+[{/section-B.1.9 xa}(Willamette SSE2 Cacheability Instructions)](B.1.9)397.4 subh3
+[2(MASKMOVDQU       xmmreg,xmmreg            WILLAMETTE,SSE2 )]380.4 code1
+[2(CLFLUSH          mem                      WILLAMETTE,SSE2 )]369.4 code0
+[2(MOVNTDQ          mem,xmmreg               WILLAMETTE,SSE2,SO )]358.4 code0
+[2(MOVNTI           mem,reg32                WILLAMETTE,SD )]347.4 code0
+[2(MOVNTI           mem,reg64                X64 )]336.4 code0
+[2(MOVNTPD          mem,xmmreg               WILLAMETTE,SSE2,SO )]325.4 code0
+[2(LFENCE                                    WILLAMETTE,SSE2 )]314.4 code0
+[2(MFENCE                                    WILLAMETTE,SSE2)]303.4 code2
+[{/section-B.1.10 xa}(Willamette MMX instructions \(SSE2 SIMD Integer Instructions\))](B.1.10)284.2 subh3
+[2(MOVD             mem,xmmreg               WILLAMETTE,SSE2,SD )]267.2 code1
+[2(MOVD             xmmreg,mem               WILLAMETTE,SSE2,SD )]256.2 code0
+[2(MOVD             xmmreg,rm32              WILLAMETTE,SSE2 )]245.2 code0
+[2(MOVD             rm32,xmmreg              WILLAMETTE,SSE2 )]234.2 code0
+[2(MOVDQA           xmmreg,xmmreg            WILLAMETTE,SSE2 )]223.2 code0
+[2(MOVDQA           mem,xmmreg               WILLAMETTE,SSE2,SO )]212.2 code0
+[2(MOVDQA           xmmreg,mem               WILLAMETTE,SSE2,SO )]201.2 code0
+[2(MOVDQA           xmmreg,xmmreg            WILLAMETTE,SSE2 )]190.2 code0
+[2(MOVDQU           xmmreg,xmmreg            WILLAMETTE,SSE2 )]179.2 code0
+[2(MOVDQU           mem,xmmreg               WILLAMETTE,SSE2,SO )]168.2 code0
+[2(MOVDQU           xmmreg,mem               WILLAMETTE,SSE2,SO )]157.2 code0
+[2(MOVDQU           xmmreg,xmmreg            WILLAMETTE,SSE2 )]146.2 code0
+[2(MOVDQ2Q          mmxreg,xmmreg            WILLAMETTE,SSE2 )]135.2 code0
+[2(MOVQ             xmmreg,xmmreg            WILLAMETTE,SSE2 )]124.2 code0
+[2(MOVQ             xmmreg,xmmreg            WILLAMETTE,SSE2 )]113.2 code0
+[2(MOVQ             mem,xmmreg               WILLAMETTE,SSE2 )]102.2 code0
+(150)pageeven
+restore showpage
+%%Page: 151 151
+%%BeginPageSetup
+save
+%%EndPageSetup
+/151 pa
+[2(MOVQ             xmmreg,mem               WILLAMETTE,SSE2 )]681 code0
+[2(MOVQ             xmmreg,rm64              X64,SSE2 )]670 code0
+[2(MOVQ             rm64,xmmreg              X64,SSE2 )]659 code0
+[2(MOVQ2DQ          xmmreg,mmxreg            WILLAMETTE,SSE2 )]648 code0
+[2(PACKSSWB         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]637 code0
+[2(PACKSSDW         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]626 code0
+[2(PACKUSWB         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]615 code0
+[2(PADDB            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]604 code0
+[2(PADDW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]593 code0
+[2(PADDD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]582 code0
+[2(PADDQ            mmxreg,mmxrm             WILLAMETTE,MMX )]571 code0
+[2(PADDQ            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]560 code0
+[2(PADDSB           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]549 code0
+[2(PADDSW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]538 code0
+[2(PADDUSB          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]527 code0
+[2(PADDUSW          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]516 code0
+[2(PAND             xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]505 code0
+[2(PANDN            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]494 code0
+[2(PAVGB            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]483 code0
+[2(PAVGW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]472 code0
+[2(PCMPEQB          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]461 code0
+[2(PCMPEQW          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]450 code0
+[2(PCMPEQD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]439 code0
+[2(PCMPGTB          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]428 code0
+[2(PCMPGTW          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]417 code0
+[2(PCMPGTD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]406 code0
+[2(PEXTRW           reg32,xmmreg,imm         WILLAMETTE,SSE2 )]395 code0
+[2(PINSRW           xmmreg,reg16,imm         WILLAMETTE,SSE2 )]384 code0
+[2(PINSRW           xmmreg,reg32,imm         WILLAMETTE,SSE2,ND )]373 code0
+[2(PINSRW           xmmreg,mem,imm           WILLAMETTE,SSE2 )]362 code0
+[2(PINSRW           xmmreg,mem16,imm         WILLAMETTE,SSE2 )]351 code0
+[2(PMADDWD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]340 code0
+[2(PMAXSW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]329 code0
+[2(PMAXUB           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]318 code0
+[2(PMINSW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]307 code0
+[2(PMINUB           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]296 code0
+[2(PMOVMSKB         reg32,xmmreg             WILLAMETTE,SSE2 )]285 code0
+[2(PMULHUW          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]274 code0
+[2(PMULHW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]263 code0
+[2(PMULLW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]252 code0
+[2(PMULUDQ          mmxreg,mmxrm             WILLAMETTE,SSE2,SO )]241 code0
+[2(PMULUDQ          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]230 code0
+[2(POR              xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]219 code0
+[2(PSADBW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]208 code0
+[2(PSHUFD           xmmreg,xmmreg,imm        WILLAMETTE,SSE2 )]197 code0
+[2(PSHUFD           xmmreg,mem,imm           WILLAMETTE,SSE22 )]186 code0
+[2(PSHUFHW          xmmreg,xmmreg,imm        WILLAMETTE,SSE2 )]175 code0
+[2(PSHUFHW          xmmreg,mem,imm           WILLAMETTE,SSE22 )]164 code0
+[2(PSHUFLW          xmmreg,xmmreg,imm        WILLAMETTE,SSE2 )]153 code0
+[2(PSHUFLW          xmmreg,mem,imm           WILLAMETTE,SSE22 )]142 code0
+[2(PSLLDQ           xmmreg,imm               WILLAMETTE,SSE2,AR1 )]131 code0
+[2(PSLLW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]120 code0
+[2(PSLLW            xmmreg,imm               WILLAMETTE,SSE2,AR1 )]109 code0
+(151)pageodd
+restore showpage
+%%Page: 152 152
+%%BeginPageSetup
+save
+%%EndPageSetup
+/152 pa
+[2(PSLLD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]681 code0
+[2(PSLLD            xmmreg,imm               WILLAMETTE,SSE2,AR1 )]670 code0
+[2(PSLLQ            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]659 code0
+[2(PSLLQ            xmmreg,imm               WILLAMETTE,SSE2,AR1 )]648 code0
+[2(PSRAW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]637 code0
+[2(PSRAW            xmmreg,imm               WILLAMETTE,SSE2,AR1 )]626 code0
+[2(PSRAD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]615 code0
+[2(PSRAD            xmmreg,imm               WILLAMETTE,SSE2,AR1 )]604 code0
+[2(PSRLDQ           xmmreg,imm               WILLAMETTE,SSE2,AR1 )]593 code0
+[2(PSRLW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]582 code0
+[2(PSRLW            xmmreg,imm               WILLAMETTE,SSE2,AR1 )]571 code0
+[2(PSRLD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]560 code0
+[2(PSRLD            xmmreg,imm               WILLAMETTE,SSE2,AR1 )]549 code0
+[2(PSRLQ            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]538 code0
+[2(PSRLQ            xmmreg,imm               WILLAMETTE,SSE2,AR1 )]527 code0
+[2(PSUBB            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]516 code0
+[2(PSUBW            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]505 code0
+[2(PSUBD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]494 code0
+[2(PSUBQ            mmxreg,mmxrm             WILLAMETTE,SSE2,SO )]483 code0
+[2(PSUBQ            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]472 code0
+[2(PSUBSB           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]461 code0
+[2(PSUBSW           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]450 code0
+[2(PSUBUSB          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]439 code0
+[2(PSUBUSW          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]428 code0
+[2(PUNPCKHBW        xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]417 code0
+[2(PUNPCKHWD        xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]406 code0
+[2(PUNPCKHDQ        xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]395 code0
+[2(PUNPCKHQDQ       xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]384 code0
+[2(PUNPCKLBW        xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]373 code0
+[2(PUNPCKLWD        xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]362 code0
+[2(PUNPCKLDQ        xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]351 code0
+[2(PUNPCKLQDQ       xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]340 code0
+[2(PXOR             xmmreg,xmmrm             WILLAMETTE,SSE2,SO)]329 code2
+[{/section-B.1.11 xa}(Willamette Streaming SIMD instructions \(SSE2\))](B.1.11)309.8 subh3
+[2(ADDPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]292.8 code1
+[2(ADDSD            xmmreg,xmmrm             WILLAMETTE,SSE2 )]281.8 code0
+[2(ANDNPD           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]270.8 code0
+[2(ANDPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]259.8 code0
+[2(CMPEQPD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]248.8 code0
+[2(CMPEQSD          xmmreg,xmmrm             WILLAMETTE,SSE2 )]237.8 code0
+[2(CMPLEPD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]226.8 code0
+[2(CMPLESD          xmmreg,xmmrm             WILLAMETTE,SSE2 )]215.8 code0
+[2(CMPLTPD          xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]204.8 code0
+[2(CMPLTSD          xmmreg,xmmrm             WILLAMETTE,SSE2 )]193.8 code0
+[2(CMPNEQPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]182.8 code0
+[2(CMPNEQSD         xmmreg,xmmrm             WILLAMETTE,SSE2 )]171.8 code0
+[2(CMPNLEPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]160.8 code0
+[2(CMPNLESD         xmmreg,xmmrm             WILLAMETTE,SSE2 )]149.8 code0
+[2(CMPNLTPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]138.8 code0
+[2(CMPNLTSD         xmmreg,xmmrm             WILLAMETTE,SSE2 )]127.8 code0
+[2(CMPORDPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]116.8 code0
+[2(CMPORDSD         xmmreg,xmmrm             WILLAMETTE,SSE2 )]105.8 code0
+(152)pageeven
+restore showpage
+%%Page: 153 153
+%%BeginPageSetup
+save
+%%EndPageSetup
+/153 pa
+[2(CMPUNORDPD       xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]681 code0
+[2(CMPUNORDSD       xmmreg,xmmrm             WILLAMETTE,SSE2 )]670 code0
+[2(CMPPD            xmmreg,xmmrm,imm         WILLAMETTE,SSE22 )]659 code0
+[2(CMPSD            xmmreg,xmmrm,imm         WILLAMETTE,SSE2 )]648 code0
+[2(COMISD           xmmreg,xmmrm             WILLAMETTE,SSE2 )]637 code0
+[2(CVTDQ2PD         xmmreg,xmmrm             WILLAMETTE,SSE2 )]626 code0
+[2(CVTDQ2PS         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]615 code0
+[2(CVTPD2DQ         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]604 code0
+[2(CVTPD2PI         mmxreg,xmmrm             WILLAMETTE,SSE2,SO )]593 code0
+[2(CVTPD2PS         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]582 code0
+[2(CVTPI2PD         xmmreg,mmxrm             WILLAMETTE,SSE2 )]571 code0
+[2(CVTPS2DQ         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]560 code0
+[2(CVTPS2PD         xmmreg,xmmrm             WILLAMETTE,SSE2 )]549 code0
+[2(CVTSD2SI         reg32,xmmreg             WILLAMETTE,SSE2,AR1 )]538 code0
+[2(CVTSD2SI         reg32,mem                WILLAMETTE,SSE2,AR1 )]527 code0
+[2(CVTSD2SI         reg64,xmmreg             X64,SSE2,AR1 )]516 code0
+[2(CVTSD2SI         reg64,mem                X64,SSE2,AR1 )]505 code0
+[2(CVTSD2SS         xmmreg,xmmrm             WILLAMETTE,SSE2 )]494 code0
+[2(CVTSI2SD         xmmreg,mem               WILLAMETTE,SSE2,SD,AR1,ND )]483 code0
+[2(CVTSI2SD         xmmreg,rm32              WILLAMETTE,SSE2,SD,AR1 )]472 code0
+[2(CVTSI2SD         xmmreg,rm64              X64,SSE2,AR1 )]461 code0
+[2(CVTSS2SD         xmmreg,xmmrm             WILLAMETTE,SSE2,SD )]450 code0
+[2(CVTTPD2PI        mmxreg,xmmrm             WILLAMETTE,SSE2,SO )]439 code0
+[2(CVTTPD2DQ        xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]428 code0
+[2(CVTTPS2DQ        xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]417 code0
+[2(CVTTSD2SI        reg32,xmmreg             WILLAMETTE,SSE2,AR1 )]406 code0
+[2(CVTTSD2SI        reg32,mem                WILLAMETTE,SSE2,AR1 )]395 code0
+[2(CVTTSD2SI        reg64,xmmreg             X64,SSE2,AR1 )]384 code0
+[2(CVTTSD2SI        reg64,mem                X64,SSE2,AR1 )]373 code0
+[2(DIVPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]362 code0
+[2(DIVSD            xmmreg,xmmrm             WILLAMETTE,SSE2 )]351 code0
+[2(MAXPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]340 code0
+[2(MAXSD            xmmreg,xmmrm             WILLAMETTE,SSE2 )]329 code0
+[2(MINPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]318 code0
+[2(MINSD            xmmreg,xmmrm             WILLAMETTE,SSE2 )]307 code0
+[2(MOVAPD           xmmreg,xmmreg            WILLAMETTE,SSE2 )]296 code0
+[2(MOVAPD           xmmreg,xmmreg            WILLAMETTE,SSE2 )]285 code0
+[2(MOVAPD           mem,xmmreg               WILLAMETTE,SSE2,SO )]274 code0
+[2(MOVAPD           xmmreg,mem               WILLAMETTE,SSE2,SO )]263 code0
+[2(MOVHPD           mem,xmmreg               WILLAMETTE,SSE2 )]252 code0
+[2(MOVHPD           xmmreg,mem               WILLAMETTE,SSE2 )]241 code0
+[2(MOVLPD           mem,xmmreg               WILLAMETTE,SSE2 )]230 code0
+[2(MOVLPD           xmmreg,mem               WILLAMETTE,SSE2 )]219 code0
+[2(MOVMSKPD         reg32,xmmreg             WILLAMETTE,SSE2 )]208 code0
+[2(MOVMSKPD         reg64,xmmreg             X64,SSE2 )]197 code0
+[2(MOVSD            xmmreg,xmmreg            WILLAMETTE,SSE2 )]186 code0
+[2(MOVSD            xmmreg,xmmreg            WILLAMETTE,SSE2 )]175 code0
+[2(MOVSD            mem,xmmreg               WILLAMETTE,SSE2 )]164 code0
+[2(MOVSD            xmmreg,mem               WILLAMETTE,SSE2 )]153 code0
+[2(MOVUPD           xmmreg,xmmreg            WILLAMETTE,SSE2 )]142 code0
+[2(MOVUPD           xmmreg,xmmreg            WILLAMETTE,SSE2 )]131 code0
+[2(MOVUPD           mem,xmmreg               WILLAMETTE,SSE2,SO )]120 code0
+[2(MOVUPD           xmmreg,mem               WILLAMETTE,SSE2,SO )]109 code0
+(153)pageodd
+restore showpage
+%%Page: 154 154
+%%BeginPageSetup
+save
+%%EndPageSetup
+/154 pa
+[2(MULPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]681 code0
+[2(MULSD            xmmreg,xmmrm             WILLAMETTE,SSE2 )]670 code0
+[2(ORPD             xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]659 code0
+[2(SHUFPD           xmmreg,xmmreg,imm        WILLAMETTE,SSE2 )]648 code0
+[2(SHUFPD           xmmreg,mem,imm           WILLAMETTE,SSE2 )]637 code0
+[2(SQRTPD           xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]626 code0
+[2(SQRTSD           xmmreg,xmmrm             WILLAMETTE,SSE2 )]615 code0
+[2(SUBPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]604 code0
+[2(SUBSD            xmmreg,xmmrm             WILLAMETTE,SSE2 )]593 code0
+[2(UCOMISD          xmmreg,xmmrm             WILLAMETTE,SSE2 )]582 code0
+[2(UNPCKHPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]571 code0
+[2(UNPCKLPD         xmmreg,xmmrm             WILLAMETTE,SSE2,SO )]560 code0
+[2(XORPD            xmmreg,xmmrm             WILLAMETTE,SSE2,SO)]549 code2
+[{/section-B.1.12 xa}(Prescott New Instructions \(SSE3\))](B.1.12)529.8 subh3
+[2(ADDSUBPD         xmmreg,xmmrm             PRESCOTT,SSE3,SO )]512.8 code1
+[2(ADDSUBPS         xmmreg,xmmrm             PRESCOTT,SSE3,SO )]501.8 code0
+[2(HADDPD           xmmreg,xmmrm             PRESCOTT,SSE3,SO )]490.8 code0
+[2(HADDPS           xmmreg,xmmrm             PRESCOTT,SSE3,SO )]479.8 code0
+[2(HSUBPD           xmmreg,xmmrm             PRESCOTT,SSE3,SO )]468.8 code0
+[2(HSUBPS           xmmreg,xmmrm             PRESCOTT,SSE3,SO )]457.8 code0
+[2(LDDQU            xmmreg,mem               PRESCOTT,SSE3,SO )]446.8 code0
+[2(MOVDDUP          xmmreg,xmmrm             PRESCOTT,SSE3 )]435.8 code0
+[2(MOVSHDUP         xmmreg,xmmrm             PRESCOTT,SSE3 )]424.8 code0
+[2(MOVSLDUP         xmmreg,xmmrm             PRESCOTT,SSE3)]413.8 code2
+[{/section-B.1.13 xa}(VMX Instructions)](B.1.13)394.6 subh3
+[2(VMCALL                                    VMX )]377.6 code1
+[2(VMCLEAR          mem                      VMX )]366.6 code0
+[2(VMLAUNCH                                  VMX )]355.6 code0
+[2(VMLOAD                                    X64,VMX )]344.6 code0
+[2(VMMCALL                                   X64,VMX )]333.6 code0
+[2(VMPTRLD          mem                      VMX )]322.6 code0
+[2(VMPTRST          mem                      VMX )]311.6 code0
+[2(VMREAD           rm32,reg32               VMX,NOLONG,SD )]300.6 code0
+[2(VMREAD           rm64,reg64               X64,VMX )]289.6 code0
+[2(VMRESUME                                  VMX )]278.6 code0
+[2(VMRUN                                     X64,VMX )]267.6 code0
+[2(VMSAVE                                    X64,VMX )]256.6 code0
+[2(VMWRITE          reg32,rm32               VMX,NOLONG,SD )]245.6 code0
+[2(VMWRITE          reg64,rm64               X64,VMX )]234.6 code0
+[2(VMXOFF                                    VMX )]223.6 code0
+[2(VMXON            mem                      VMX)]212.6 code2
+[{/section-B.1.14 xa}(Extended Page Tables VMX instructions)](B.1.14)193.4 subh3
+[2(INVEPT           reg32,mem                VMX,SO,NOLONG )]176.4 code1
+[2(INVEPT           reg64,mem                VMX,SO,LONG )]165.4 code0
+[2(INVVPID          reg32,mem                VMX,SO,NOLONG )]154.4 code0
+[2(INVVPID          reg64,mem                VMX,SO,LONG)]143.4 code2
+(154)pageeven
+restore showpage
+%%Page: 155 155
+%%BeginPageSetup
+save
+%%EndPageSetup
+/155 pa
+[{/section-B.1.15 xa}(Tejas New Instructions \(SSSE3\))](B.1.15)678.8 subh3
+[2(PABSB            mmxreg,mmxrm             SSSE3,MMX )]661.8 code1
+[2(PABSB            xmmreg,xmmrm             SSSE3 )]650.8 code0
+[2(PABSW            mmxreg,mmxrm             SSSE3,MMX )]639.8 code0
+[2(PABSW            xmmreg,xmmrm             SSSE3 )]628.8 code0
+[2(PABSD            mmxreg,mmxrm             SSSE3,MMX )]617.8 code0
+[2(PABSD            xmmreg,xmmrm             SSSE3 )]606.8 code0
+[2(PALIGNR          mmxreg,mmxrm,imm         SSSE3,MMX )]595.8 code0
+[2(PALIGNR          xmmreg,xmmrm,imm         SSSE3 )]584.8 code0
+[2(PHADDW           mmxreg,mmxrm             SSSE3,MMX )]573.8 code0
+[2(PHADDW           xmmreg,xmmrm             SSSE3 )]562.8 code0
+[2(PHADDD           mmxreg,mmxrm             SSSE3,MMX )]551.8 code0
+[2(PHADDD           xmmreg,xmmrm             SSSE3 )]540.8 code0
+[2(PHADDSW          mmxreg,mmxrm             SSSE3,MMX )]529.8 code0
+[2(PHADDSW          xmmreg,xmmrm             SSSE3 )]518.8 code0
+[2(PHSUBW           mmxreg,mmxrm             SSSE3,MMX )]507.8 code0
+[2(PHSUBW           xmmreg,xmmrm             SSSE3 )]496.8 code0
+[2(PHSUBD           mmxreg,mmxrm             SSSE3,MMX )]485.8 code0
+[2(PHSUBD           xmmreg,xmmrm             SSSE3 )]474.8 code0
+[2(PHSUBSW          mmxreg,mmxrm             SSSE3,MMX )]463.8 code0
+[2(PHSUBSW          xmmreg,xmmrm             SSSE3 )]452.8 code0
+[2(PMADDUBSW        mmxreg,mmxrm             SSSE3,MMX )]441.8 code0
+[2(PMADDUBSW        xmmreg,xmmrm             SSSE3 )]430.8 code0
+[2(PMULHRSW         mmxreg,mmxrm             SSSE3,MMX )]419.8 code0
+[2(PMULHRSW         xmmreg,xmmrm             SSSE3 )]408.8 code0
+[2(PSHUFB           mmxreg,mmxrm             SSSE3,MMX )]397.8 code0
+[2(PSHUFB           xmmreg,xmmrm             SSSE3 )]386.8 code0
+[2(PSIGNB           mmxreg,mmxrm             SSSE3,MMX )]375.8 code0
+[2(PSIGNB           xmmreg,xmmrm             SSSE3 )]364.8 code0
+[2(PSIGNW           mmxreg,mmxrm             SSSE3,MMX )]353.8 code0
+[2(PSIGNW           xmmreg,xmmrm             SSSE3 )]342.8 code0
+[2(PSIGND           mmxreg,mmxrm             SSSE3,MMX )]331.8 code0
+[2(PSIGND           xmmreg,xmmrm             SSSE3)]320.8 code2
+[{/section-B.1.16 xa}(AMD SSE4A)](B.1.16)301.6 subh3
+[2(EXTRQ            xmmreg,imm,imm           SSE4A,AMD )]284.6 code1
+[2(EXTRQ            xmmreg,xmmreg            SSE4A,AMD )]273.6 code0
+[2(INSERTQ          xmmreg,xmmreg,imm,imm    SSE4A,AMD )]262.6 code0
+[2(INSERTQ          xmmreg,xmmreg            SSE4A,AMD )]251.6 code0
+[2(MOVNTSD          mem,xmmreg               SSE4A,AMD )]240.6 code0
+[2(MOVNTSS          mem,xmmreg               SSE4A,AMD,SD)]229.6 code2
+[{/section-B.1.17 xa}(New instructions in Barcelona)](B.1.17)210.4 subh3
+[2(LZCNT            reg16,rm16               P6,AMD )]193.4 code1
+[2(LZCNT            reg32,rm32               P6,AMD )]182.4 code0
+[2(LZCNT            reg64,rm64               X64,AMD)]171.4 code2
+[{/section-B.1.18 xa}(Penryn New Instructions \(SSE4.1\))](B.1.18)152.2 subh3
+[2(BLENDPD          xmmreg,xmmrm,imm         SSE41 )]135.2 code1
+[2(BLENDPS          xmmreg,xmmrm,imm         SSE41 )]124.2 code0
+[2(BLENDVPD         xmmreg,xmmrm,xmm0        SSE41 )]113.2 code0
+[2(BLENDVPS         xmmreg,xmmrm,xmm0        SSE41 )]102.2 code0
+(155)pageodd
+restore showpage
+%%Page: 156 156
+%%BeginPageSetup
+save
+%%EndPageSetup
+/156 pa
+[2(DPPD             xmmreg,xmmrm,imm         SSE41 )]681 code0
+[2(DPPS             xmmreg,xmmrm,imm         SSE41 )]670 code0
+[2(EXTRACTPS        rm32,xmmreg,imm          SSE41 )]659 code0
+[2(EXTRACTPS        reg64,xmmreg,imm         SSE41,X64 )]648 code0
+[2(INSERTPS         xmmreg,xmmrm,imm         SSE41,SD )]637 code0
+[2(MOVNTDQA         xmmreg,mem               SSE41 )]626 code0
+[2(MPSADBW          xmmreg,xmmrm,imm         SSE41 )]615 code0
+[2(PACKUSDW         xmmreg,xmmrm             SSE41 )]604 code0
+[2(PBLENDVB         xmmreg,xmmrm,xmm0        SSE41 )]593 code0
+[2(PBLENDW          xmmreg,xmmrm,imm         SSE41 )]582 code0
+[2(PCMPEQQ          xmmreg,xmmrm             SSE41 )]571 code0
+[2(PEXTRB           reg32,xmmreg,imm         SSE41 )]560 code0
+[2(PEXTRB           mem8,xmmreg,imm          SSE41 )]549 code0
+[2(PEXTRB           reg64,xmmreg,imm         SSE41,X64 )]538 code0
+[2(PEXTRD           rm32,xmmreg,imm          SSE41 )]527 code0
+[2(PEXTRQ           rm64,xmmreg,imm          SSE41,X64 )]516 code0
+[2(PEXTRW           reg32,xmmreg,imm         SSE41 )]505 code0
+[2(PEXTRW           mem16,xmmreg,imm         SSE41 )]494 code0
+[2(PEXTRW           reg64,xmmreg,imm         SSE41,X64 )]483 code0
+[2(PHMINPOSUW       xmmreg,xmmrm             SSE41 )]472 code0
+[2(PINSRB           xmmreg,mem,imm           SSE41 )]461 code0
+[2(PINSRB           xmmreg,rm8,imm           SSE41 )]450 code0
+[2(PINSRB           xmmreg,reg32,imm         SSE41 )]439 code0
+[2(PINSRD           xmmreg,mem,imm           SSE41 )]428 code0
+[2(PINSRD           xmmreg,rm32,imm          SSE41 )]417 code0
+[2(PINSRQ           xmmreg,mem,imm           SSE41,X64 )]406 code0
+[2(PINSRQ           xmmreg,rm64,imm          SSE41,X64 )]395 code0
+[2(PMAXSB           xmmreg,xmmrm             SSE41 )]384 code0
+[2(PMAXSD           xmmreg,xmmrm             SSE41 )]373 code0
+[2(PMAXUD           xmmreg,xmmrm             SSE41 )]362 code0
+[2(PMAXUW           xmmreg,xmmrm             SSE41 )]351 code0
+[2(PMINSB           xmmreg,xmmrm             SSE41 )]340 code0
+[2(PMINSD           xmmreg,xmmrm             SSE41 )]329 code0
+[2(PMINUD           xmmreg,xmmrm             SSE41 )]318 code0
+[2(PMINUW           xmmreg,xmmrm             SSE41 )]307 code0
+[2(PMOVSXBW         xmmreg,xmmrm             SSE41 )]296 code0
+[2(PMOVSXBD         xmmreg,xmmrm             SSE41,SD )]285 code0
+[2(PMOVSXBQ         xmmreg,xmmrm             SSE41,SW )]274 code0
+[2(PMOVSXWD         xmmreg,xmmrm             SSE41 )]263 code0
+[2(PMOVSXWQ         xmmreg,xmmrm             SSE41,SD )]252 code0
+[2(PMOVSXDQ         xmmreg,xmmrm             SSE41 )]241 code0
+[2(PMOVZXBW         xmmreg,xmmrm             SSE41 )]230 code0
+[2(PMOVZXBD         xmmreg,xmmrm             SSE41,SD )]219 code0
+[2(PMOVZXBQ         xmmreg,xmmrm             SSE41,SW )]208 code0
+[2(PMOVZXWD         xmmreg,xmmrm             SSE41 )]197 code0
+[2(PMOVZXWQ         xmmreg,xmmrm             SSE41,SD )]186 code0
+[2(PMOVZXDQ         xmmreg,xmmrm             SSE41 )]175 code0
+[2(PMULDQ           xmmreg,xmmrm             SSE41 )]164 code0
+[2(PMULLD           xmmreg,xmmrm             SSE41 )]153 code0
+[2(PTEST            xmmreg,xmmrm             SSE41 )]142 code0
+[2(ROUNDPD          xmmreg,xmmrm,imm         SSE41 )]131 code0
+[2(ROUNDPS          xmmreg,xmmrm,imm         SSE41 )]120 code0
+(156)pageeven
+restore showpage
+%%Page: 157 157
+%%BeginPageSetup
+save
+%%EndPageSetup
+/157 pa
+[2(ROUNDSD          xmmreg,xmmrm,imm         SSE41 )]681 code0
+[2(ROUNDSS          xmmreg,xmmrm,imm         SSE41)]670 code2
+[{/section-B.1.19 xa}(Nehalem New Instructions \(SSE4.2\))](B.1.19)650.8 subh3
+[2(CRC32            reg32,rm8                SSE42 )]633.8 code1
+[2(CRC32            reg32,rm16               SSE42 )]622.8 code0
+[2(CRC32            reg32,rm32               SSE42 )]611.8 code0
+[2(CRC32            reg64,rm8                SSE42,X64 )]600.8 code0
+[2(CRC32            reg64,rm64               SSE42,X64 )]589.8 code0
+[2(PCMPESTRI        xmmreg,xmmrm,imm         SSE42 )]578.8 code0
+[2(PCMPESTRM        xmmreg,xmmrm,imm         SSE42 )]567.8 code0
+[2(PCMPISTRI        xmmreg,xmmrm,imm         SSE42 )]556.8 code0
+[2(PCMPISTRM        xmmreg,xmmrm,imm         SSE42 )]545.8 code0
+[2(PCMPGTQ          xmmreg,xmmrm             SSE42 )]534.8 code0
+[2(POPCNT           reg16,rm16               NEHALEM,SW )]523.8 code0
+[2(POPCNT           reg32,rm32               NEHALEM,SD )]512.8 code0
+[2(POPCNT           reg64,rm64               NEHALEM,X64)]501.8 code2
+[{/section-B.1.20 xa}(Intel SMX)](B.1.20)482.6 subh3
+[2(GETSEC                                    KATMAI)]465.6 code3
+[{/section-B.1.21 xa}(Geode \(Cyrix\) 3DNow! additions)](B.1.21)446.4 subh3
+[2(PFRCPV           mmxreg,mmxrm             PENT,3DNOW,CYRIX )]429.4 code1
+[2(PFRSQRTV         mmxreg,mmxrm             PENT,3DNOW,CYRIX)]418.4 code2
+[{/section-B.1.22 xa}(Intel new instructions in ???)](B.1.22)399.2 subh3
+[2(MOVBE            reg16,mem16              NEHALEM )]382.2 code1
+[2(MOVBE            reg32,mem32              NEHALEM )]371.2 code0
+[2(MOVBE            reg64,mem64              NEHALEM )]360.2 code0
+[2(MOVBE            mem16,reg16              NEHALEM )]349.2 code0
+[2(MOVBE            mem32,reg32              NEHALEM )]338.2 code0
+[2(MOVBE            mem64,reg64              NEHALEM)]327.2 code2
+[{/section-B.1.23 xa}(Intel AES instructions)](B.1.23)308 subh3
+[2(AESENC           xmmreg,xmmrm128          SSE,WESTMERE )]291 code1
+[2(AESENCLAST       xmmreg,xmmrm128          SSE,WESTMERE )]280 code0
+[2(AESDEC           xmmreg,xmmrm128          SSE,WESTMERE )]269 code0
+[2(AESDECLAST       xmmreg,xmmrm128          SSE,WESTMERE )]258 code0
+[2(AESIMC           xmmreg,xmmrm128          SSE,WESTMERE )]247 code0
+[2(AESKEYGENASSIST  xmmreg,xmmrm128,imm8     SSE,WESTMERE)]236 code2
+[{/section-B.1.24 xa}(Intel AVX AES instructions)](B.1.24)216.8 subh3
+[2(VAESENC          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]199.8 code1
+[2(VAESENCLAST      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]188.8 code0
+[2(VAESDEC          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]177.8 code0
+[2(VAESDECLAST      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]166.8 code0
+[2(VAESIMC          xmmreg,xmmrm128          AVX,SANDYBRIDGE )]155.8 code0
+[2(VAESKEYGENASSIST xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE)]144.8 code2
+(157)pageodd
+restore showpage
+%%Page: 158 158
+%%BeginPageSetup
+save
+%%EndPageSetup
+/158 pa
+[{/section-B.1.25 xa}(Intel AVX instructions)](B.1.25)678.8 subh3
+[2(VADDPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]661.8 code1
+[2(VADDPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]650.8 code0
+[2(VADDPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]639.8 code0
+[2(VADDPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]628.8 code0
+[2(VADDSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]617.8 code0
+[2(VADDSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]606.8 code0
+[2(VADDSUBPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]595.8 code0
+[2(VADDSUBPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]584.8 code0
+[2(VADDSUBPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]573.8 code0
+[2(VADDSUBPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]562.8 code0
+[2(VANDPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]551.8 code0
+[2(VANDPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]540.8 code0
+[2(VANDPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]529.8 code0
+[2(VANDPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]518.8 code0
+[2(VANDNPD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]507.8 code0
+[2(VANDNPD          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]496.8 code0
+[2(VANDNPS          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]485.8 code0
+[2(VANDNPS          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]474.8 code0
+[2(VBLENDPD         xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE )]463.8 code0
+[2(VBLENDPD         ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE )]452.8 code0
+[2(VBLENDPS         xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE )]441.8 code0
+[2(VBLENDPS         ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE )]430.8 code0
+[2(VBLENDVPD        xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE )]419.8 code0
+[2(VBLENDVPD        xmmreg,xmmrm128,xmm0     AVX,SANDYBRIDGE )]408.8 code0
+[2(VBLENDVPD        ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE )]397.8 code0
+[2(VBLENDVPD        ymmreg,ymmrm256,ymm0     AVX,SANDYBRIDGE )]386.8 code0
+[2(VBLENDVPS        xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE )]375.8 code0
+[2(VBLENDVPS        xmmreg,xmmrm128,xmm0     AVX,SANDYBRIDGE )]364.8 code0
+[2(VBLENDVPS        ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE )]353.8 code0
+[2(VBLENDVPD        ymmreg,ymmrm256,ymm0     AVX,SANDYBRIDGE )]342.8 code0
+[2(VBROADCASTSS     xmmreg,mem32             AVX,SANDYBRIDGE )]331.8 code0
+[2(VBROADCASTSS     ymmreg,mem32             AVX,SANDYBRIDGE )]320.8 code0
+[2(VBROADCASTSD     ymmreg,mem64             AVX,SANDYBRIDGE )]309.8 code0
+[2(VBROADCASTF128   ymmreg,mem128            AVX,SANDYBRIDGE )]298.8 code0
+[2(VCMPEQPD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]287.8 code0
+[2(VCMPEQPD         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]276.8 code0
+[2(VCMPLTPD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]265.8 code0
+[2(VCMPLTPD         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]254.8 code0
+[2(VCMPLEPD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]243.8 code0
+[2(VCMPLEPD         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]232.8 code0
+[2(VCMPUNORDPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]221.8 code0
+[2(VCMPUNORDPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]210.8 code0
+[2(VCMPNEQPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]199.8 code0
+[2(VCMPNEQPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]188.8 code0
+[2(VCMPNLTPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]177.8 code0
+[2(VCMPNLTPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]166.8 code0
+[2(VCMPNLEPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]155.8 code0
+[2(VCMPNLEPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]144.8 code0
+[2(VCMPORDPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]133.8 code0
+[2(VCMPORDPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]122.8 code0
+[2(VCMPEQ_UQPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]111.8 code0
+[2(VCMPEQ_UQPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]100.8 code0
+(158)pageeven
+restore showpage
+%%Page: 159 159
+%%BeginPageSetup
+save
+%%EndPageSetup
+/159 pa
+[2(VCMPNGEPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]681 code0
+[2(VCMPNGEPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]670 code0
+[2(VCMPNGTPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]659 code0
+[2(VCMPNGTPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]648 code0
+[2(VCMPFALSEPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]637 code0
+[2(VCMPFALSEPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]626 code0
+[2(VCMPNEQ_OQPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]615 code0
+[2(VCMPNEQ_OQPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]604 code0
+[2(VCMPGEPD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]593 code0
+[2(VCMPGEPD         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]582 code0
+[2(VCMPGTPD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]571 code0
+[2(VCMPGTPD         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]560 code0
+[2(VCMPTRUEPD       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]549 code0
+[2(VCMPTRUEPD       ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]538 code0
+[2(VCMPEQ_OSPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]527 code0
+[2(VCMPEQ_OSPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]516 code0
+[2(VCMPLT_OQPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]505 code0
+[2(VCMPLT_OQPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]494 code0
+[2(VCMPLE_OQPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]483 code0
+[2(VCMPLE_OQPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]472 code0
+[2(VCMPUNORD_SPD    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]461 code0
+[2(VCMPUNORD_SPD    ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]450 code0
+[2(VCMPNEQ_USPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]439 code0
+[2(VCMPNEQ_USPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]428 code0
+[2(VCMPNLT_UQPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]417 code0
+[2(VCMPNLT_UQPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]406 code0
+[2(VCMPNLE_UQPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]395 code0
+[2(VCMPNLE_UQPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]384 code0
+[2(VCMPORD_SPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]373 code0
+[2(VCMPORD_SPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]362 code0
+[2(VCMPEQ_USPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]351 code0
+[2(VCMPEQ_USPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]340 code0
+[2(VCMPNGE_UQPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]329 code0
+[2(VCMPNGE_UQPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]318 code0
+[2(VCMPNGT_UQPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]307 code0
+[2(VCMPNGT_UQPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]296 code0
+[2(VCMPFALSE_OSPD   xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]285 code0
+[2(VCMPFALSE_OSPD   ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]274 code0
+[2(VCMPNEQ_OSPD     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]263 code0
+[2(VCMPNEQ_OSPD     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]252 code0
+[2(VCMPGE_OQPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]241 code0
+[2(VCMPGE_OQPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]230 code0
+[2(VCMPGT_OQPD      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]219 code0
+[2(VCMPGT_OQPD      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]208 code0
+[2(VCMPTRUE_USPD    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]197 code0
+[2(VCMPTRUE_USPD    ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]186 code0
+[2(VCMPPD           xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE )]175 code0
+[2(VCMPPD           ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE )]164 code0
+[2(VCMPEQPS         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]153 code0
+[2(VCMPEQPS         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]142 code0
+[2(VCMPLTPS         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]131 code0
+[2(VCMPLTPS         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]120 code0
+[2(VCMPLEPS         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]109 code0
+(159)pageodd
+restore showpage
+%%Page: 160 160
+%%BeginPageSetup
+save
+%%EndPageSetup
+/160 pa
+[2(VCMPLEPS         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]681 code0
+[2(VCMPUNORDPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]670 code0
+[2(VCMPUNORDPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]659 code0
+[2(VCMPNEQPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]648 code0
+[2(VCMPNEQPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]637 code0
+[2(VCMPNLTPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]626 code0
+[2(VCMPNLTPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]615 code0
+[2(VCMPNLEPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]604 code0
+[2(VCMPNLEPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]593 code0
+[2(VCMPORDPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]582 code0
+[2(VCMPORDPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]571 code0
+[2(VCMPEQ_UQPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]560 code0
+[2(VCMPEQ_UQPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]549 code0
+[2(VCMPNGEPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]538 code0
+[2(VCMPNGEPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]527 code0
+[2(VCMPNGTPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]516 code0
+[2(VCMPNGTPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]505 code0
+[2(VCMPFALSEPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]494 code0
+[2(VCMPFALSEPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]483 code0
+[2(VCMPNEQ_OQPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]472 code0
+[2(VCMPNEQ_OQPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]461 code0
+[2(VCMPGEPS         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]450 code0
+[2(VCMPGEPS         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]439 code0
+[2(VCMPGTPS         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]428 code0
+[2(VCMPGTPS         ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]417 code0
+[2(VCMPTRUEPS       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]406 code0
+[2(VCMPTRUEPS       ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]395 code0
+[2(VCMPEQ_OSPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]384 code0
+[2(VCMPEQ_OSPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]373 code0
+[2(VCMPLT_OQPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]362 code0
+[2(VCMPLT_OQPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]351 code0
+[2(VCMPLE_OQPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]340 code0
+[2(VCMPLE_OQPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]329 code0
+[2(VCMPUNORD_SPS    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]318 code0
+[2(VCMPUNORD_SPS    ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]307 code0
+[2(VCMPNEQ_USPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]296 code0
+[2(VCMPNEQ_USPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]285 code0
+[2(VCMPNLT_UQPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]274 code0
+[2(VCMPNLT_UQPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]263 code0
+[2(VCMPNLE_UQPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]252 code0
+[2(VCMPNLE_UQPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]241 code0
+[2(VCMPORD_SPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]230 code0
+[2(VCMPORD_SPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]219 code0
+[2(VCMPEQ_USPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]208 code0
+[2(VCMPEQ_USPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]197 code0
+[2(VCMPNGE_UQPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]186 code0
+[2(VCMPNGE_UQPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]175 code0
+[2(VCMPNGT_UQPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]164 code0
+[2(VCMPNGT_UQPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]153 code0
+[2(VCMPFALSE_OSPS   xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]142 code0
+[2(VCMPFALSE_OSPS   ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]131 code0
+[2(VCMPNEQ_OSPS     xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]120 code0
+[2(VCMPNEQ_OSPS     ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]109 code0
+(160)pageeven
+restore showpage
+%%Page: 161 161
+%%BeginPageSetup
+save
+%%EndPageSetup
+/161 pa
+[2(VCMPGE_OQPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]681 code0
+[2(VCMPGE_OQPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]670 code0
+[2(VCMPGT_OQPS      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]659 code0
+[2(VCMPGT_OQPS      ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]648 code0
+[2(VCMPTRUE_USPS    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]637 code0
+[2(VCMPTRUE_USPS    ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]626 code0
+[2(VCMPPS           xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE )]615 code0
+[2(VCMPPS           ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE )]604 code0
+[2(VCMPEQSD         xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]593 code0
+[2(VCMPLTSD         xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]582 code0
+[2(VCMPLESD         xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]571 code0
+[2(VCMPUNORDSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]560 code0
+[2(VCMPNEQSD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]549 code0
+[2(VCMPNLTSD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]538 code0
+[2(VCMPNLESD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]527 code0
+[2(VCMPORDSD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]516 code0
+[2(VCMPEQ_UQSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]505 code0
+[2(VCMPNGESD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]494 code0
+[2(VCMPNGTSD        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]483 code0
+[2(VCMPFALSESD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]472 code0
+[2(VCMPNEQ_OQSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]461 code0
+[2(VCMPGESD         xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]450 code0
+[2(VCMPGTSD         xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]439 code0
+[2(VCMPTRUESD       xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]428 code0
+[2(VCMPEQ_OSSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]417 code0
+[2(VCMPLT_OQSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]406 code0
+[2(VCMPLE_OQSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]395 code0
+[2(VCMPUNORD_SSD    xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]384 code0
+[2(VCMPNEQ_USSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]373 code0
+[2(VCMPNLT_UQSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]362 code0
+[2(VCMPNLE_UQSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]351 code0
+[2(VCMPORD_SSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]340 code0
+[2(VCMPEQ_USSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]329 code0
+[2(VCMPNGE_UQSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]318 code0
+[2(VCMPNGT_UQSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]307 code0
+[2(VCMPFALSE_OSSD   xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]296 code0
+[2(VCMPNEQ_OSSD     xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]285 code0
+[2(VCMPGE_OQSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]274 code0
+[2(VCMPGT_OQSD      xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]263 code0
+[2(VCMPTRUE_USSD    xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]252 code0
+[2(VCMPSD           xmmreg,xmmreg*,xmmrm64,imm8 AVX,SANDYBRIDGE )]241 code0
+[2(VCMPEQSS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]230 code0
+[2(VCMPLTSS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]219 code0
+[2(VCMPLESS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]208 code0
+[2(VCMPUNORDSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]197 code0
+[2(VCMPNEQSS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]186 code0
+[2(VCMPNLTSS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]175 code0
+[2(VCMPNLESS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]164 code0
+[2(VCMPORDSS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]153 code0
+[2(VCMPEQ_UQSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]142 code0
+[2(VCMPNGESS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]131 code0
+[2(VCMPNGTSS        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]120 code0
+[2(VCMPFALSESS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]109 code0
+(161)pageodd
+restore showpage
+%%Page: 162 162
+%%BeginPageSetup
+save
+%%EndPageSetup
+/162 pa
+[2(VCMPNEQ_OQSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]681 code0
+[2(VCMPGESS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]670 code0
+[2(VCMPGTSS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]659 code0
+[2(VCMPTRUESS       xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]648 code0
+[2(VCMPEQ_OSSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]637 code0
+[2(VCMPLT_OQSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]626 code0
+[2(VCMPLE_OQSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]615 code0
+[2(VCMPUNORD_SSS    xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]604 code0
+[2(VCMPNEQ_USSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]593 code0
+[2(VCMPNLT_UQSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]582 code0
+[2(VCMPNLE_UQSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]571 code0
+[2(VCMPORD_SSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]560 code0
+[2(VCMPEQ_USSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]549 code0
+[2(VCMPNGE_UQSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]538 code0
+[2(VCMPNGT_UQSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]527 code0
+[2(VCMPFALSE_OSSS   xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]516 code0
+[2(VCMPNEQ_OSSS     xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]505 code0
+[2(VCMPGE_OQSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]494 code0
+[2(VCMPGT_OQSS      xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]483 code0
+[2(VCMPTRUE_USSS    xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]472 code0
+[2(VCMPSS           xmmreg,xmmreg*,xmmrm32,imm8 AVX,SANDYBRIDGE )]461 code0
+[2(VCOMISD          xmmreg,xmmrm64           AVX,SANDYBRIDGE )]450 code0
+[2(VCOMISS          xmmreg,xmmrm32           AVX,SANDYBRIDGE )]439 code0
+[2(VCVTDQ2PD        xmmreg,xmmrm64           AVX,SANDYBRIDGE )]428 code0
+[2(VCVTDQ2PD        ymmreg,xmmrm128          AVX,SANDYBRIDGE )]417 code0
+[2(VCVTDQ2PS        xmmreg,xmmrm128          AVX,SANDYBRIDGE )]406 code0
+[2(VCVTDQ2PS        ymmreg,ymmrm256          AVX,SANDYBRIDGE )]395 code0
+[2(VCVTPD2DQ        xmmreg,xmmreg            AVX,SANDYBRIDGE )]384 code0
+[2(VCVTPD2DQ        xmmreg,mem128            AVX,SANDYBRIDGE,SO )]373 code0
+[2(VCVTPD2DQ        xmmreg,ymmreg            AVX,SANDYBRIDGE )]362 code0
+[2(VCVTPD2DQ        xmmreg,mem256            AVX,SANDYBRIDGE,SY )]351 code0
+[2(VCVTPD2PS        xmmreg,xmmreg            AVX,SANDYBRIDGE )]340 code0
+[2(VCVTPD2PS        xmmreg,mem128            AVX,SANDYBRIDGE,SO )]329 code0
+[2(VCVTPD2PS        xmmreg,ymmreg            AVX,SANDYBRIDGE )]318 code0
+[2(VCVTPD2PS        xmmreg,mem256            AVX,SANDYBRIDGE,SY )]307 code0
+[2(VCVTPS2DQ        xmmreg,xmmrm128          AVX,SANDYBRIDGE )]296 code0
+[2(VCVTPS2DQ        ymmreg,ymmrm256          AVX,SANDYBRIDGE )]285 code0
+[2(VCVTPS2PD        xmmreg,xmmrm64           AVX,SANDYBRIDGE )]274 code0
+[2(VCVTPS2PD        ymmreg,xmmrm128          AVX,SANDYBRIDGE )]263 code0
+[2(VCVTSD2SI        reg32,xmmrm64            AVX,SANDYBRIDGE )]252 code0
+[2(VCVTSD2SI        reg64,xmmrm64            AVX,SANDYBRIDGE,LONG )]241 code0
+[2(VCVTSD2SS        xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]230 code0
+[2(VCVTSI2SD        xmmreg,xmmreg*,rm32      AVX,SANDYBRIDGE,SD )]219 code0
+[2(VCVTSI2SD        xmmreg,xmmreg*,mem32     AVX,SANDYBRIDGE,ND,SD )]208 code0
+[2(VCVTSI2SD        xmmreg,xmmreg*,rm64      AVX,SANDYBRIDGE,LONG )]197 code0
+[2(VCVTSI2SS        xmmreg,xmmreg*,rm32      AVX,SANDYBRIDGE,SD )]186 code0
+[2(VCVTSI2SS        xmmreg,xmmreg*,mem32     AVX,SANDYBRIDGE,ND,SD )]175 code0
+[2(VCVTSI2SS        xmmreg,xmmreg*,rm64      AVX,SANDYBRIDGE,LONG )]164 code0
+[2(VCVTSS2SD        xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]153 code0
+[2(VCVTSS2SI        reg32,xmmrm32            AVX,SANDYBRIDGE )]142 code0
+[2(VCVTSS2SI        reg64,xmmrm32            AVX,SANDYBRIDGE,LONG )]131 code0
+[2(VCVTTPD2DQ       xmmreg,xmmreg            AVX,SANDYBRIDGE )]120 code0
+[2(VCVTTPD2DQ       xmmreg,mem128            AVX,SANDYBRIDGE,SO )]109 code0
+(162)pageeven
+restore showpage
+%%Page: 163 163
+%%BeginPageSetup
+save
+%%EndPageSetup
+/163 pa
+[2(VCVTTPD2DQ       xmmreg,ymmreg            AVX,SANDYBRIDGE )]681 code0
+[2(VCVTTPD2DQ       xmmreg,mem256            AVX,SANDYBRIDGE,SY )]670 code0
+[2(VCVTTPS2DQ       xmmreg,xmmrm128          AVX,SANDYBRIDGE )]659 code0
+[2(VCVTTPS2DQ       ymmreg,ymmrm256          AVX,SANDYBRIDGE )]648 code0
+[2(VCVTTSD2SI       reg32,xmmrm64            AVX,SANDYBRIDGE )]637 code0
+[2(VCVTTSD2SI       reg64,xmmrm64            AVX,SANDYBRIDGE,LONG )]626 code0
+[2(VCVTTSS2SI       reg32,xmmrm32            AVX,SANDYBRIDGE )]615 code0
+[2(VCVTTSS2SI       reg64,xmmrm32            AVX,SANDYBRIDGE,LONG )]604 code0
+[2(VDIVPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]593 code0
+[2(VDIVPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]582 code0
+[2(VDIVPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]571 code0
+[2(VDIVPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]560 code0
+[2(VDIVSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]549 code0
+[2(VDIVSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]538 code0
+[2(VDPPD            xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE )]527 code0
+[2(VDPPS            xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE )]516 code0
+[2(VDPPS            ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE )]505 code0
+[2(VEXTRACTF128     xmmrm128,xmmreg,imm8     AVX,SANDYBRIDGE )]494 code0
+[2(VEXTRACTPS       rm32,xmmreg,imm8         AVX,SANDYBRIDGE )]483 code0
+[2(VHADDPD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]472 code0
+[2(VHADDPD          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]461 code0
+[2(VHADDPS          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]450 code0
+[2(VHADDPS          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]439 code0
+[2(VHSUBPD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]428 code0
+[2(VHSUBPD          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]417 code0
+[2(VHSUBPS          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]406 code0
+[2(VHSUBPS          ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]395 code0
+[2(VINSERTF128      ymmreg,ymmreg,xmmrm128,imm8 AVX,SANDYBRIDGE )]384 code0
+[2(VINSERTPS        xmmreg,xmmreg*,xmmrm32,imm8 AVX,SANDYBRIDGE )]373 code0
+[2(VLDDQU           xmmreg,mem128            AVX,SANDYBRIDGE )]362 code0
+[2(VLDQQU           ymmreg,mem256            AVX,SANDYBRIDGE )]351 code0
+[2(VLDDQU           ymmreg,mem256            AVX,SANDYBRIDGE )]340 code0
+[2(VLDMXCSR         mem32                    AVX,SANDYBRIDGE )]329 code0
+[2(VMASKMOVDQU      xmmreg,xmmreg            AVX,SANDYBRIDGE )]318 code0
+[2(VMASKMOVPS       xmmreg,xmmreg,mem128     AVX,SANDYBRIDGE )]307 code0
+[2(VMASKMOVPS       ymmreg,ymmreg,mem256     AVX,SANDYBRIDGE )]296 code0
+[2(VMASKMOVPS       mem128,xmmreg,xmmreg     AVX,SANDYBRIDGE,SO )]285 code0
+[2(VMASKMOVPS       mem256,xmmreg,xmmreg     AVX,SANDYBRIDGE,SY )]274 code0
+[2(VMASKMOVPD       xmmreg,xmmreg,mem128     AVX,SANDYBRIDGE )]263 code0
+[2(VMASKMOVPD       ymmreg,ymmreg,mem256     AVX,SANDYBRIDGE )]252 code0
+[2(VMASKMOVPD       mem128,xmmreg,xmmreg     AVX,SANDYBRIDGE )]241 code0
+[2(VMASKMOVPD       mem256,ymmreg,ymmreg     AVX,SANDYBRIDGE )]230 code0
+[2(VMAXPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]219 code0
+[2(VMAXPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]208 code0
+[2(VMAXPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]197 code0
+[2(VMAXPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]186 code0
+[2(VMAXSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]175 code0
+[2(VMAXSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]164 code0
+[2(VMINPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]153 code0
+[2(VMINPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]142 code0
+[2(VMINPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]131 code0
+[2(VMINPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]120 code0
+[2(VMINSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]109 code0
+(163)pageodd
+restore showpage
+%%Page: 164 164
+%%BeginPageSetup
+save
+%%EndPageSetup
+/164 pa
+[2(VMINSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]681 code0
+[2(VMOVAPD          xmmreg,xmmrm128          AVX,SANDYBRIDGE )]670 code0
+[2(VMOVAPD          xmmrm128,xmmreg          AVX,SANDYBRIDGE )]659 code0
+[2(VMOVAPD          ymmreg,ymmrm256          AVX,SANDYBRIDGE )]648 code0
+[2(VMOVAPD          ymmrm256,ymmreg          AVX,SANDYBRIDGE )]637 code0
+[2(VMOVAPS          xmmreg,xmmrm128          AVX,SANDYBRIDGE )]626 code0
+[2(VMOVAPS          xmmrm128,xmmreg          AVX,SANDYBRIDGE )]615 code0
+[2(VMOVAPS          ymmreg,ymmrm256          AVX,SANDYBRIDGE )]604 code0
+[2(VMOVAPS          ymmrm256,ymmreg          AVX,SANDYBRIDGE )]593 code0
+[2(VMOVQ            xmmreg,xmmrm64           AVX,SANDYBRIDGE )]582 code0
+[2(VMOVQ            xmmrm64,xmmreg           AVX,SANDYBRIDGE )]571 code0
+[2(VMOVQ            xmmreg,rm64              AVX,SANDYBRIDGE,LONG )]560 code0
+[2(VMOVQ            rm64,xmmreg              AVX,SANDYBRIDGE,LONG )]549 code0
+[2(VMOVD            xmmreg,rm32              AVX,SANDYBRIDGE )]538 code0
+[2(VMOVD            rm32,xmmreg              AVX,SANDYBRIDGE )]527 code0
+[2(VMOVDDUP         xmmreg,xmmrm64           AVX,SANDYBRIDGE )]516 code0
+[2(VMOVDDUP         ymmreg,ymmrm256          AVX,SANDYBRIDGE )]505 code0
+[2(VMOVDQA          xmmreg,xmmrm128          AVX,SANDYBRIDGE )]494 code0
+[2(VMOVDQA          xmmrm128,xmmreg          AVX,SANDYBRIDGE )]483 code0
+[2(VMOVQQA          ymmreg,ymmrm256          AVX,SANDYBRIDGE )]472 code0
+[2(VMOVQQA          ymmrm256,ymmreg          AVX,SANDYBRIDGE )]461 code0
+[2(VMOVDQA          ymmreg,ymmrm             AVX,SANDYBRIDGE )]450 code0
+[2(VMOVDQA          ymmrm256,ymmreg          AVX,SANDYBRIDGE )]439 code0
+[2(VMOVDQU          xmmreg,xmmrm128          AVX,SANDYBRIDGE )]428 code0
+[2(VMOVDQU          xmmrm128,xmmreg          AVX,SANDYBRIDGE )]417 code0
+[2(VMOVQQU          ymmreg,ymmrm256          AVX,SANDYBRIDGE )]406 code0
+[2(VMOVQQU          ymmrm256,ymmreg          AVX,SANDYBRIDGE )]395 code0
+[2(VMOVDQU          ymmreg,ymmrm256          AVX,SANDYBRIDGE )]384 code0
+[2(VMOVDQU          ymmrm256,ymmreg          AVX,SANDYBRIDGE )]373 code0
+[2(VMOVHLPS         xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE )]362 code0
+[2(VMOVHPD          xmmreg,xmmreg*,mem64     AVX,SANDYBRIDGE )]351 code0
+[2(VMOVHPD          mem64,xmmreg             AVX,SANDYBRIDGE )]340 code0
+[2(VMOVHPS          xmmreg,xmmreg*,mem64     AVX,SANDYBRIDGE )]329 code0
+[2(VMOVHPS          mem64,xmmreg             AVX,SANDYBRIDGE )]318 code0
+[2(VMOVLHPS         xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE )]307 code0
+[2(VMOVLPD          xmmreg,xmmreg*,mem64     AVX,SANDYBRIDGE )]296 code0
+[2(VMOVLPD          mem64,xmmreg             AVX,SANDYBRIDGE )]285 code0
+[2(VMOVLPS          xmmreg,xmmreg*,mem64     AVX,SANDYBRIDGE )]274 code0
+[2(VMOVLPS          mem64,xmmreg             AVX,SANDYBRIDGE )]263 code0
+[2(VMOVMSKPD        reg64,xmmreg             AVX,SANDYBRIDGE,LONG )]252 code0
+[2(VMOVMSKPD        reg32,xmmreg             AVX,SANDYBRIDGE )]241 code0
+[2(VMOVMSKPD        reg64,ymmreg             AVX,SANDYBRIDGE,LONG )]230 code0
+[2(VMOVMSKPD        reg32,ymmreg             AVX,SANDYBRIDGE )]219 code0
+[2(VMOVMSKPS        reg64,xmmreg             AVX,SANDYBRIDGE,LONG )]208 code0
+[2(VMOVMSKPS        reg32,xmmreg             AVX,SANDYBRIDGE )]197 code0
+[2(VMOVMSKPS        reg64,ymmreg             AVX,SANDYBRIDGE,LONG )]186 code0
+[2(VMOVMSKPS        reg32,ymmreg             AVX,SANDYBRIDGE )]175 code0
+[2(VMOVNTDQ         mem128,xmmreg            AVX,SANDYBRIDGE )]164 code0
+[2(VMOVNTQQ         mem256,ymmreg            AVX,SANDYBRIDGE )]153 code0
+[2(VMOVNTDQ         mem256,ymmreg            AVX,SANDYBRIDGE )]142 code0
+[2(VMOVNTDQA        xmmreg,mem128            AVX,SANDYBRIDGE )]131 code0
+[2(VMOVNTPD         mem128,xmmreg            AVX,SANDYBRIDGE )]120 code0
+[2(VMOVNTPD         mem256,ymmreg            AVX,SANDYBRIDGE )]109 code0
+(164)pageeven
+restore showpage
+%%Page: 165 165
+%%BeginPageSetup
+save
+%%EndPageSetup
+/165 pa
+[2(VMOVNTPS         mem128,xmmreg            AVX,SANDYBRIDGE )]681 code0
+[2(VMOVNTPS         mem128,ymmreg            AVX,SANDYBRIDGE )]670 code0
+[2(VMOVSD           xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE )]659 code0
+[2(VMOVSD           xmmreg,mem64             AVX,SANDYBRIDGE )]648 code0
+[2(VMOVSD           xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE )]637 code0
+[2(VMOVSD           mem64,xmmreg             AVX,SANDYBRIDGE )]626 code0
+[2(VMOVSHDUP        xmmreg,xmmrm128          AVX,SANDYBRIDGE )]615 code0
+[2(VMOVSHDUP        ymmreg,ymmrm256          AVX,SANDYBRIDGE )]604 code0
+[2(VMOVSLDUP        xmmreg,xmmrm128          AVX,SANDYBRIDGE )]593 code0
+[2(VMOVSLDUP        ymmreg,ymmrm256          AVX,SANDYBRIDGE )]582 code0
+[2(VMOVSS           xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE )]571 code0
+[2(VMOVSS           xmmreg,mem64             AVX,SANDYBRIDGE )]560 code0
+[2(VMOVSS           xmmreg,xmmreg*,xmmreg    AVX,SANDYBRIDGE )]549 code0
+[2(VMOVSS           mem64,xmmreg             AVX,SANDYBRIDGE )]538 code0
+[2(VMOVUPD          xmmreg,xmmrm128          AVX,SANDYBRIDGE )]527 code0
+[2(VMOVUPD          xmmrm128,xmmreg          AVX,SANDYBRIDGE )]516 code0
+[2(VMOVUPD          ymmreg,ymmrm256          AVX,SANDYBRIDGE )]505 code0
+[2(VMOVUPD          ymmrm256,ymmreg          AVX,SANDYBRIDGE )]494 code0
+[2(VMOVUPS          xmmreg,xmmrm128          AVX,SANDYBRIDGE )]483 code0
+[2(VMOVUPS          xmmrm128,xmmreg          AVX,SANDYBRIDGE )]472 code0
+[2(VMOVUPS          ymmreg,ymmrm256          AVX,SANDYBRIDGE )]461 code0
+[2(VMOVUPS          ymmrm256,ymmreg          AVX,SANDYBRIDGE )]450 code0
+[2(VMPSADBW         xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE )]439 code0
+[2(VMULPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]428 code0
+[2(VMULPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]417 code0
+[2(VMULPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]406 code0
+[2(VMULPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]395 code0
+[2(VMULSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]384 code0
+[2(VMULSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]373 code0
+[2(VORPD            xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]362 code0
+[2(VORPD            ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]351 code0
+[2(VORPS            xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]340 code0
+[2(VORPS            ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]329 code0
+[2(VPABSB           xmmreg,xmmrm128          AVX,SANDYBRIDGE )]318 code0
+[2(VPABSW           xmmreg,xmmrm128          AVX,SANDYBRIDGE )]307 code0
+[2(VPABSD           xmmreg,xmmrm128          AVX,SANDYBRIDGE )]296 code0
+[2(VPACKSSWB        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]285 code0
+[2(VPACKSSDW        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]274 code0
+[2(VPACKUSWB        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]263 code0
+[2(VPACKUSDW        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]252 code0
+[2(VPADDB           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]241 code0
+[2(VPADDW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]230 code0
+[2(VPADDD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]219 code0
+[2(VPADDQ           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]208 code0
+[2(VPADDSB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]197 code0
+[2(VPADDSW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]186 code0
+[2(VPADDUSB         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]175 code0
+[2(VPADDUSW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]164 code0
+[2(VPALIGNR         xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE )]153 code0
+[2(VPAND            xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]142 code0
+[2(VPANDN           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]131 code0
+[2(VPAVGB           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]120 code0
+[2(VPAVGW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]109 code0
+(165)pageodd
+restore showpage
+%%Page: 166 166
+%%BeginPageSetup
+save
+%%EndPageSetup
+/166 pa
+[2(VPBLENDVB        xmmreg,xmmreg*,xmmrm128,xmmreg AVX,SANDYBRIDGE )]681 code0
+[2(VPBLENDW         xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE )]670 code0
+[2(VPCMPESTRI       xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE )]659 code0
+[2(VPCMPESTRM       xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE )]648 code0
+[2(VPCMPISTRI       xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE )]637 code0
+[2(VPCMPISTRM       xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE )]626 code0
+[2(VPCMPEQB         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]615 code0
+[2(VPCMPEQW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]604 code0
+[2(VPCMPEQD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]593 code0
+[2(VPCMPEQQ         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]582 code0
+[2(VPCMPGTB         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]571 code0
+[2(VPCMPGTW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]560 code0
+[2(VPCMPGTD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]549 code0
+[2(VPCMPGTQ         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]538 code0
+[2(VPERMILPD        xmmreg,xmmreg,xmmrm128   AVX,SANDYBRIDGE )]527 code0
+[2(VPERMILPD        ymmreg,ymmreg,ymmrm256   AVX,SANDYBRIDGE )]516 code0
+[2(VPERMILPD        xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE )]505 code0
+[2(VPERMILPD        ymmreg,ymmrm256,imm8     AVX,SANDYBRIDGE )]494 code0
+[2(VPERMILTD2PD     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE )]483 code0
+[2(VPERMILTD2PD     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE )]472 code0
+[2(VPERMILTD2PD     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE )]461 code0
+[2(VPERMILTD2PD     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE )]450 code0
+[2(VPERMILMO2PD     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE )]439 code0
+[2(VPERMILMO2PD     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE )]428 code0
+[2(VPERMILMO2PD     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE )]417 code0
+[2(VPERMILMO2PD     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE )]406 code0
+[2(VPERMILMZ2PD     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE )]395 code0
+[2(VPERMILMZ2PD     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE )]384 code0
+[2(VPERMILMZ2PD     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE )]373 code0
+[2(VPERMILMZ2PD     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE )]362 code0
+[2(VPERMIL2PD       xmmreg,xmmreg,xmmrm128,xmmreg,imm8 AVX,SANDYBRIDGE )]351 code0
+[2(VPERMIL2PD       xmmreg,xmmreg,xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE )]340 code0
+[2(VPERMIL2PD       ymmreg,ymmreg,ymmrm256,ymmreg,imm8 AVX,SANDYBRIDGE )]329 code0
+[2(VPERMIL2PD       ymmreg,ymmreg,ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE )]318 code0
+[2(VPERMILPS        xmmreg,xmmreg,xmmrm128   AVX,SANDYBRIDGE )]307 code0
+[2(VPERMILPS        ymmreg,ymmreg,ymmrm256   AVX,SANDYBRIDGE )]296 code0
+[2(VPERMILPS        xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE )]285 code0
+[2(VPERMILPS        ymmreg,ymmrm256,imm8     AVX,SANDYBRIDGE )]274 code0
+[2(VPERMILTD2PS     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE )]263 code0
+[2(VPERMILTD2PS     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE )]252 code0
+[2(VPERMILTD2PS     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE )]241 code0
+[2(VPERMILTD2PS     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE )]230 code0
+[2(VPERMILMO2PS     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE )]219 code0
+[2(VPERMILMO2PS     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE )]208 code0
+[2(VPERMILMO2PS     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE )]197 code0
+[2(VPERMILMO2PS     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE )]186 code0
+[2(VPERMILMZ2PS     xmmreg,xmmreg,xmmrm128,xmmreg AVX,SANDYBRIDGE )]175 code0
+[2(VPERMILMZ2PS     xmmreg,xmmreg,xmmreg,xmmrm128 AVX,SANDYBRIDGE )]164 code0
+[2(VPERMILMZ2PS     ymmreg,ymmreg,ymmrm256,ymmreg AVX,SANDYBRIDGE )]153 code0
+[2(VPERMILMZ2PS     ymmreg,ymmreg,ymmreg,ymmrm256 AVX,SANDYBRIDGE )]142 code0
+[2(VPERMIL2PS       xmmreg,xmmreg,xmmrm128,xmmreg,imm8 AVX,SANDYBRIDGE )]131 code0
+[2(VPERMIL2PS       xmmreg,xmmreg,xmmreg,xmmrm128,imm8 AVX,SANDYBRIDGE )]120 code0
+[2(VPERMIL2PS       ymmreg,ymmreg,ymmrm256,ymmreg,imm8 AVX,SANDYBRIDGE )]109 code0
+(166)pageeven
+restore showpage
+%%Page: 167 167
+%%BeginPageSetup
+save
+%%EndPageSetup
+/167 pa
+[2(VPERMIL2PS       ymmreg,ymmreg,ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE )]681 code0
+[2(VPERM2F128       ymmreg,ymmreg,ymmrm256,imm8 AVX,SANDYBRIDGE )]670 code0
+[2(VPEXTRB          reg64,xmmreg,imm8        AVX,SANDYBRIDGE,LONG )]659 code0
+[2(VPEXTRB          reg32,xmmreg,imm8        AVX,SANDYBRIDGE )]648 code0
+[2(VPEXTRB          mem8,xmmreg,imm8         AVX,SANDYBRIDGE )]637 code0
+[2(VPEXTRW          reg64,xmmreg,imm8        AVX,SANDYBRIDGE,LONG )]626 code0
+[2(VPEXTRW          reg32,xmmreg,imm8        AVX,SANDYBRIDGE )]615 code0
+[2(VPEXTRW          mem16,xmmreg,imm8        AVX,SANDYBRIDGE )]604 code0
+[2(VPEXTRW          reg64,xmmreg,imm8        AVX,SANDYBRIDGE,LONG )]593 code0
+[2(VPEXTRW          reg32,xmmreg,imm8        AVX,SANDYBRIDGE )]582 code0
+[2(VPEXTRW          mem16,xmmreg,imm8        AVX,SANDYBRIDGE )]571 code0
+[2(VPEXTRD          reg64,xmmreg,imm8        AVX,SANDYBRIDGE,LONG )]560 code0
+[2(VPEXTRD          rm32,xmmreg,imm8         AVX,SANDYBRIDGE )]549 code0
+[2(VPEXTRQ          rm64,xmmreg,imm8         AVX,SANDYBRIDGE,LONG )]538 code0
+[2(VPHADDW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]527 code0
+[2(VPHADDD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]516 code0
+[2(VPHADDSW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]505 code0
+[2(VPHMINPOSUW      xmmreg,xmmrm128          AVX,SANDYBRIDGE )]494 code0
+[2(VPHSUBW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]483 code0
+[2(VPHSUBD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]472 code0
+[2(VPHSUBSW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]461 code0
+[2(VPINSRB          xmmreg,xmmreg*,mem8,imm8 AVX,SANDYBRIDGE )]450 code0
+[2(VPINSRB          xmmreg,xmmreg*,rm8,imm8  AVX,SANDYBRIDGE )]439 code0
+[2(VPINSRB          xmmreg,xmmreg*,reg32,imm8 AVX,SANDYBRIDGE )]428 code0
+[2(VPINSRW          xmmreg,xmmreg*,mem16,imm8 AVX,SANDYBRIDGE )]417 code0
+[2(VPINSRW          xmmreg,xmmreg*,rm16,imm8 AVX,SANDYBRIDGE )]406 code0
+[2(VPINSRW          xmmreg,xmmreg*,reg32,imm8 AVX,SANDYBRIDGE )]395 code0
+[2(VPINSRD          xmmreg,xmmreg*,mem32,imm8 AVX,SANDYBRIDGE )]384 code0
+[2(VPINSRD          xmmreg,xmmreg*,rm32,imm8 AVX,SANDYBRIDGE )]373 code0
+[2(VPINSRQ          xmmreg,xmmreg*,mem64,imm8 AVX,SANDYBRIDGE,LONG )]362 code0
+[2(VPINSRQ          xmmreg,xmmreg*,rm64,imm8 AVX,SANDYBRIDGE,LONG )]351 code0
+[2(VPMADDWD         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]340 code0
+[2(VPMADDUBSW       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]329 code0
+[2(VPMAXSB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]318 code0
+[2(VPMAXSW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]307 code0
+[2(VPMAXSD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]296 code0
+[2(VPMAXUB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]285 code0
+[2(VPMAXUW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]274 code0
+[2(VPMAXUD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]263 code0
+[2(VPMINSB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]252 code0
+[2(VPMINSW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]241 code0
+[2(VPMINSD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]230 code0
+[2(VPMINUB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]219 code0
+[2(VPMINUW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]208 code0
+[2(VPMINUD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]197 code0
+[2(VPMOVMSKB        reg64,xmmreg             AVX,SANDYBRIDGE,LONG )]186 code0
+[2(VPMOVMSKB        reg32,xmmreg             AVX,SANDYBRIDGE )]175 code0
+[2(VPMOVSXBW        xmmreg,xmmrm64           AVX,SANDYBRIDGE )]164 code0
+[2(VPMOVSXBD        xmmreg,xmmrm32           AVX,SANDYBRIDGE )]153 code0
+[2(VPMOVSXBQ        xmmreg,xmmrm16           AVX,SANDYBRIDGE )]142 code0
+[2(VPMOVSXWD        xmmreg,xmmrm64           AVX,SANDYBRIDGE )]131 code0
+[2(VPMOVSXWQ        xmmreg,xmmrm32           AVX,SANDYBRIDGE )]120 code0
+[2(VPMOVSXDQ        xmmreg,xmmrm64           AVX,SANDYBRIDGE )]109 code0
+(167)pageodd
+restore showpage
+%%Page: 168 168
+%%BeginPageSetup
+save
+%%EndPageSetup
+/168 pa
+[2(VPMOVZXBW        xmmreg,xmmrm64           AVX,SANDYBRIDGE )]681 code0
+[2(VPMOVZXBD        xmmreg,xmmrm32           AVX,SANDYBRIDGE )]670 code0
+[2(VPMOVZXBQ        xmmreg,xmmrm16           AVX,SANDYBRIDGE )]659 code0
+[2(VPMOVZXWD        xmmreg,xmmrm64           AVX,SANDYBRIDGE )]648 code0
+[2(VPMOVZXWQ        xmmreg,xmmrm32           AVX,SANDYBRIDGE )]637 code0
+[2(VPMOVZXDQ        xmmreg,xmmrm64           AVX,SANDYBRIDGE )]626 code0
+[2(VPMULHUW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]615 code0
+[2(VPMULHRSW        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]604 code0
+[2(VPMULHW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]593 code0
+[2(VPMULLW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]582 code0
+[2(VPMULLD          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]571 code0
+[2(VPMULUDQ         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]560 code0
+[2(VPMULDQ          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]549 code0
+[2(VPOR             xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]538 code0
+[2(VPSADBW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]527 code0
+[2(VPSHUFB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]516 code0
+[2(VPSHUFD          xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE )]505 code0
+[2(VPSHUFHW         xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE )]494 code0
+[2(VPSHUFLW         xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE )]483 code0
+[2(VPSIGNB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]472 code0
+[2(VPSIGNW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]461 code0
+[2(VPSIGND          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]450 code0
+[2(VPSLLDQ          xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE )]439 code0
+[2(VPSRLDQ          xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE )]428 code0
+[2(VPSLLW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]417 code0
+[2(VPSLLW           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE )]406 code0
+[2(VPSLLD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]395 code0
+[2(VPSLLD           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE )]384 code0
+[2(VPSLLQ           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]373 code0
+[2(VPSLLQ           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE )]362 code0
+[2(VPSRAW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]351 code0
+[2(VPSRAW           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE )]340 code0
+[2(VPSRAD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]329 code0
+[2(VPSRAD           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE )]318 code0
+[2(VPSRLW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]307 code0
+[2(VPSRLW           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE )]296 code0
+[2(VPSRLD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]285 code0
+[2(VPSRLD           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE )]274 code0
+[2(VPSRLQ           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]263 code0
+[2(VPSRLQ           xmmreg,xmmreg*,imm8      AVX,SANDYBRIDGE )]252 code0
+[2(VPTEST           xmmreg,xmmrm128          AVX,SANDYBRIDGE )]241 code0
+[2(VPTEST           ymmreg,ymmrm256          AVX,SANDYBRIDGE )]230 code0
+[2(VPSUBB           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]219 code0
+[2(VPSUBW           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]208 code0
+[2(VPSUBD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]197 code0
+[2(VPSUBQ           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]186 code0
+[2(VPSUBSB          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]175 code0
+[2(VPSUBSW          xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]164 code0
+[2(VPSUBUSB         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]153 code0
+[2(VPSUBUSW         xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]142 code0
+[2(VPUNPCKHBW       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]131 code0
+[2(VPUNPCKHWD       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]120 code0
+[2(VPUNPCKHDQ       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]109 code0
+(168)pageeven
+restore showpage
+%%Page: 169 169
+%%BeginPageSetup
+save
+%%EndPageSetup
+/169 pa
+[2(VPUNPCKHQDQ      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]681 code0
+[2(VPUNPCKLBW       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]670 code0
+[2(VPUNPCKLWD       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]659 code0
+[2(VPUNPCKLDQ       xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]648 code0
+[2(VPUNPCKLQDQ      xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]637 code0
+[2(VPXOR            xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]626 code0
+[2(VRCPPS           xmmreg,xmmrm128          AVX,SANDYBRIDGE )]615 code0
+[2(VRCPPS           ymmreg,ymmrm256          AVX,SANDYBRIDGE )]604 code0
+[2(VRCPSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]593 code0
+[2(VRSQRTPS         xmmreg,xmmrm128          AVX,SANDYBRIDGE )]582 code0
+[2(VRSQRTPS         ymmreg,ymmrm256          AVX,SANDYBRIDGE )]571 code0
+[2(VRSQRTSS         xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]560 code0
+[2(VROUNDPD         xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE )]549 code0
+[2(VROUNDPD         ymmreg,ymmrm256,imm8     AVX,SANDYBRIDGE )]538 code0
+[2(VROUNDPS         xmmreg,xmmrm128,imm8     AVX,SANDYBRIDGE )]527 code0
+[2(VROUNDPS         ymmreg,ymmrm256,imm8     AVX,SANDYBRIDGE )]516 code0
+[2(VROUNDSD         xmmreg,xmmreg*,xmmrm64,imm8 AVX,SANDYBRIDGE )]505 code0
+[2(VROUNDSS         xmmreg,xmmreg*,xmmrm32,imm8 AVX,SANDYBRIDGE )]494 code0
+[2(VSHUFPD          xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE )]483 code0
+[2(VSHUFPD          ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE )]472 code0
+[2(VSHUFPS          xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE )]461 code0
+[2(VSHUFPS          ymmreg,ymmreg*,ymmrm256,imm8 AVX,SANDYBRIDGE )]450 code0
+[2(VSQRTPD          xmmreg,xmmrm128          AVX,SANDYBRIDGE )]439 code0
+[2(VSQRTPD          ymmreg,ymmrm256          AVX,SANDYBRIDGE )]428 code0
+[2(VSQRTPS          xmmreg,xmmrm128          AVX,SANDYBRIDGE )]417 code0
+[2(VSQRTPS          ymmreg,ymmrm256          AVX,SANDYBRIDGE )]406 code0
+[2(VSQRTSD          xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]395 code0
+[2(VSQRTSS          xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]384 code0
+[2(VSTMXCSR         mem32                    AVX,SANDYBRIDGE )]373 code0
+[2(VSUBPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]362 code0
+[2(VSUBPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]351 code0
+[2(VSUBPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]340 code0
+[2(VSUBPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]329 code0
+[2(VSUBSD           xmmreg,xmmreg*,xmmrm64   AVX,SANDYBRIDGE )]318 code0
+[2(VSUBSS           xmmreg,xmmreg*,xmmrm32   AVX,SANDYBRIDGE )]307 code0
+[2(VTESTPS          xmmreg,xmmrm128          AVX,SANDYBRIDGE )]296 code0
+[2(VTESTPS          ymmreg,ymmrm256          AVX,SANDYBRIDGE )]285 code0
+[2(VTESTPD          xmmreg,xmmrm128          AVX,SANDYBRIDGE )]274 code0
+[2(VTESTPD          ymmreg,ymmrm256          AVX,SANDYBRIDGE )]263 code0
+[2(VUCOMISD         xmmreg,xmmrm64           AVX,SANDYBRIDGE )]252 code0
+[2(VUCOMISS         xmmreg,xmmrm32           AVX,SANDYBRIDGE )]241 code0
+[2(VUNPCKHPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]230 code0
+[2(VUNPCKHPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]219 code0
+[2(VUNPCKHPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]208 code0
+[2(VUNPCKHPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]197 code0
+[2(VUNPCKLPD        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]186 code0
+[2(VUNPCKLPD        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]175 code0
+[2(VUNPCKLPS        xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]164 code0
+[2(VUNPCKLPS        ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]153 code0
+[2(VXORPD           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]142 code0
+[2(VXORPD           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]131 code0
+[2(VXORPS           xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]120 code0
+[2(VXORPS           ymmreg,ymmreg*,ymmrm256  AVX,SANDYBRIDGE )]109 code0
+(169)pageodd
+restore showpage
+%%Page: 170 170
+%%BeginPageSetup
+save
+%%EndPageSetup
+/170 pa
+[2(VZEROALL                                  AVX,SANDYBRIDGE )]681 code0
+[2(VZEROUPPER                                AVX,SANDYBRIDGE)]670 code2
+[{/section-B.1.26 xa}(Intel Carry-Less Multiplication instructions \(CLMUL\))](B.1.26)650.8 subh3
+[2(PCLMULLQLQDQ     xmmreg,xmmrm128          SSE,WESTMERE )]633.8 code1
+[2(PCLMULHQLQDQ     xmmreg,xmmrm128          SSE,WESTMERE )]622.8 code0
+[2(PCLMULLQHQDQ     xmmreg,xmmrm128          SSE,WESTMERE )]611.8 code0
+[2(PCLMULHQHQDQ     xmmreg,xmmrm128          SSE,WESTMERE )]600.8 code0
+[2(PCLMULQDQ        xmmreg,xmmrm128,imm8     SSE,WESTMERE)]589.8 code2
+[{/section-B.1.27 xa}(Intel AVX Carry-Less Multiplication instructions \(CLMUL\))](B.1.27)570.6 subh3
+[2(VPCLMULLQLQDQ    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]553.6 code1
+[2(VPCLMULHQLQDQ    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]542.6 code0
+[2(VPCLMULLQHQDQ    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]531.6 code0
+[2(VPCLMULHQHQDQ    xmmreg,xmmreg*,xmmrm128  AVX,SANDYBRIDGE )]520.6 code0
+[2(VPCLMULQDQ       xmmreg,xmmreg*,xmmrm128,imm8 AVX,SANDYBRIDGE)]509.6 code2
+[{/section-B.1.28 xa}(Intel Fused Multiply-Add instructions \(FMA\))](B.1.28)490.4 subh3
+[2(VFMADD132PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]473.4 code1
+[2(VFMADD132PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]462.4 code0
+[2(VFMADD132PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]451.4 code0
+[2(VFMADD132PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]440.4 code0
+[2(VFMADD312PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]429.4 code0
+[2(VFMADD312PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]418.4 code0
+[2(VFMADD312PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]407.4 code0
+[2(VFMADD312PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]396.4 code0
+[2(VFMADD213PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]385.4 code0
+[2(VFMADD213PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]374.4 code0
+[2(VFMADD213PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]363.4 code0
+[2(VFMADD213PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]352.4 code0
+[2(VFMADD123PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]341.4 code0
+[2(VFMADD123PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]330.4 code0
+[2(VFMADD123PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]319.4 code0
+[2(VFMADD123PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]308.4 code0
+[2(VFMADD231PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]297.4 code0
+[2(VFMADD231PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]286.4 code0
+[2(VFMADD231PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]275.4 code0
+[2(VFMADD231PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]264.4 code0
+[2(VFMADD321PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]253.4 code0
+[2(VFMADD321PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]242.4 code0
+[2(VFMADD321PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]231.4 code0
+[2(VFMADD321PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]220.4 code0
+[2(VFMADDSUB132PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]209.4 code0
+[2(VFMADDSUB132PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]198.4 code0
+[2(VFMADDSUB132PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]187.4 code0
+[2(VFMADDSUB132PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]176.4 code0
+[2(VFMADDSUB312PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]165.4 code0
+[2(VFMADDSUB312PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]154.4 code0
+[2(VFMADDSUB312PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]143.4 code0
+[2(VFMADDSUB312PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]132.4 code0
+[2(VFMADDSUB213PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]121.4 code0
+[2(VFMADDSUB213PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]110.4 code0
+(170)pageeven
+restore showpage
+%%Page: 171 171
+%%BeginPageSetup
+save
+%%EndPageSetup
+/171 pa
+[2(VFMADDSUB213PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]681 code0
+[2(VFMADDSUB213PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]670 code0
+[2(VFMADDSUB123PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]659 code0
+[2(VFMADDSUB123PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]648 code0
+[2(VFMADDSUB123PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]637 code0
+[2(VFMADDSUB123PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]626 code0
+[2(VFMADDSUB231PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]615 code0
+[2(VFMADDSUB231PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]604 code0
+[2(VFMADDSUB231PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]593 code0
+[2(VFMADDSUB231PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]582 code0
+[2(VFMADDSUB321PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]571 code0
+[2(VFMADDSUB321PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]560 code0
+[2(VFMADDSUB321PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]549 code0
+[2(VFMADDSUB321PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]538 code0
+[2(VFMSUB132PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]527 code0
+[2(VFMSUB132PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]516 code0
+[2(VFMSUB132PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]505 code0
+[2(VFMSUB132PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]494 code0
+[2(VFMSUB312PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]483 code0
+[2(VFMSUB312PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]472 code0
+[2(VFMSUB312PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]461 code0
+[2(VFMSUB312PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]450 code0
+[2(VFMSUB213PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]439 code0
+[2(VFMSUB213PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]428 code0
+[2(VFMSUB213PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]417 code0
+[2(VFMSUB213PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]406 code0
+[2(VFMSUB123PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]395 code0
+[2(VFMSUB123PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]384 code0
+[2(VFMSUB123PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]373 code0
+[2(VFMSUB123PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]362 code0
+[2(VFMSUB231PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]351 code0
+[2(VFMSUB231PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]340 code0
+[2(VFMSUB231PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]329 code0
+[2(VFMSUB231PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]318 code0
+[2(VFMSUB321PS      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]307 code0
+[2(VFMSUB321PS      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]296 code0
+[2(VFMSUB321PD      xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]285 code0
+[2(VFMSUB321PD      ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]274 code0
+[2(VFMSUBADD132PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]263 code0
+[2(VFMSUBADD132PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]252 code0
+[2(VFMSUBADD132PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]241 code0
+[2(VFMSUBADD132PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]230 code0
+[2(VFMSUBADD312PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]219 code0
+[2(VFMSUBADD312PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]208 code0
+[2(VFMSUBADD312PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]197 code0
+[2(VFMSUBADD312PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]186 code0
+[2(VFMSUBADD213PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]175 code0
+[2(VFMSUBADD213PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]164 code0
+[2(VFMSUBADD213PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]153 code0
+[2(VFMSUBADD213PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]142 code0
+[2(VFMSUBADD123PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]131 code0
+[2(VFMSUBADD123PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]120 code0
+[2(VFMSUBADD123PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]109 code0
+(171)pageodd
+restore showpage
+%%Page: 172 172
+%%BeginPageSetup
+save
+%%EndPageSetup
+/172 pa
+[2(VFMSUBADD123PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]681 code0
+[2(VFMSUBADD231PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]670 code0
+[2(VFMSUBADD231PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]659 code0
+[2(VFMSUBADD231PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]648 code0
+[2(VFMSUBADD231PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]637 code0
+[2(VFMSUBADD321PS   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]626 code0
+[2(VFMSUBADD321PS   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]615 code0
+[2(VFMSUBADD321PD   xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]604 code0
+[2(VFMSUBADD321PD   ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]593 code0
+[2(VFNMADD132PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]582 code0
+[2(VFNMADD132PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]571 code0
+[2(VFNMADD132PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]560 code0
+[2(VFNMADD132PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]549 code0
+[2(VFNMADD312PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]538 code0
+[2(VFNMADD312PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]527 code0
+[2(VFNMADD312PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]516 code0
+[2(VFNMADD312PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]505 code0
+[2(VFNMADD213PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]494 code0
+[2(VFNMADD213PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]483 code0
+[2(VFNMADD213PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]472 code0
+[2(VFNMADD213PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]461 code0
+[2(VFNMADD123PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]450 code0
+[2(VFNMADD123PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]439 code0
+[2(VFNMADD123PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]428 code0
+[2(VFNMADD123PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]417 code0
+[2(VFNMADD231PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]406 code0
+[2(VFNMADD231PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]395 code0
+[2(VFNMADD231PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]384 code0
+[2(VFNMADD231PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]373 code0
+[2(VFNMADD321PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]362 code0
+[2(VFNMADD321PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]351 code0
+[2(VFNMADD321PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]340 code0
+[2(VFNMADD321PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]329 code0
+[2(VFNMSUB132PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]318 code0
+[2(VFNMSUB132PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]307 code0
+[2(VFNMSUB132PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]296 code0
+[2(VFNMSUB132PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]285 code0
+[2(VFNMSUB312PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]274 code0
+[2(VFNMSUB312PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]263 code0
+[2(VFNMSUB312PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]252 code0
+[2(VFNMSUB312PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]241 code0
+[2(VFNMSUB213PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]230 code0
+[2(VFNMSUB213PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]219 code0
+[2(VFNMSUB213PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]208 code0
+[2(VFNMSUB213PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]197 code0
+[2(VFNMSUB123PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]186 code0
+[2(VFNMSUB123PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]175 code0
+[2(VFNMSUB123PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]164 code0
+[2(VFNMSUB123PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]153 code0
+[2(VFNMSUB231PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]142 code0
+[2(VFNMSUB231PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]131 code0
+[2(VFNMSUB231PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]120 code0
+[2(VFNMSUB231PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]109 code0
+(172)pageeven
+restore showpage
+%%Page: 173 173
+%%BeginPageSetup
+save
+%%EndPageSetup
+/173 pa
+[2(VFNMSUB321PS     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]681 code0
+[2(VFNMSUB321PS     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]670 code0
+[2(VFNMSUB321PD     xmmreg,xmmreg,xmmrm128   FMA,FUTURE )]659 code0
+[2(VFNMSUB321PD     ymmreg,ymmreg,ymmrm256   FMA,FUTURE )]648 code0
+[2(VFMADD132SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]637 code0
+[2(VFMADD132SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]626 code0
+[2(VFMADD312SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]615 code0
+[2(VFMADD312SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]604 code0
+[2(VFMADD213SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]593 code0
+[2(VFMADD213SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]582 code0
+[2(VFMADD123SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]571 code0
+[2(VFMADD123SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]560 code0
+[2(VFMADD231SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]549 code0
+[2(VFMADD231SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]538 code0
+[2(VFMADD321SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]527 code0
+[2(VFMADD321SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]516 code0
+[2(VFMSUB132SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]505 code0
+[2(VFMSUB132SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]494 code0
+[2(VFMSUB312SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]483 code0
+[2(VFMSUB312SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]472 code0
+[2(VFMSUB213SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]461 code0
+[2(VFMSUB213SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]450 code0
+[2(VFMSUB123SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]439 code0
+[2(VFMSUB123SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]428 code0
+[2(VFMSUB231SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]417 code0
+[2(VFMSUB231SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]406 code0
+[2(VFMSUB321SS      xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]395 code0
+[2(VFMSUB321SD      xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]384 code0
+[2(VFNMADD132SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]373 code0
+[2(VFNMADD132SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]362 code0
+[2(VFNMADD312SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]351 code0
+[2(VFNMADD312SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]340 code0
+[2(VFNMADD213SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]329 code0
+[2(VFNMADD213SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]318 code0
+[2(VFNMADD123SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]307 code0
+[2(VFNMADD123SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]296 code0
+[2(VFNMADD231SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]285 code0
+[2(VFNMADD231SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]274 code0
+[2(VFNMADD321SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]263 code0
+[2(VFNMADD321SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]252 code0
+[2(VFNMSUB132SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]241 code0
+[2(VFNMSUB132SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]230 code0
+[2(VFNMSUB312SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]219 code0
+[2(VFNMSUB312SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]208 code0
+[2(VFNMSUB213SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]197 code0
+[2(VFNMSUB213SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]186 code0
+[2(VFNMSUB123SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]175 code0
+[2(VFNMSUB123SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]164 code0
+[2(VFNMSUB231SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]153 code0
+[2(VFNMSUB231SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE )]142 code0
+[2(VFNMSUB321SS     xmmreg,xmmreg,xmmrm32    FMA,FUTURE )]131 code0
+[2(VFNMSUB321SD     xmmreg,xmmreg,xmmrm64    FMA,FUTURE)]120 code2
+(173)pageodd
+restore showpage
+%%Page: 174 174
+%%BeginPageSetup
+save
+%%EndPageSetup
+/174 pa
+[{/section-B.1.29 xa}(VIA \(Centaur\) security instructions)](B.1.29)678.8 subh3
+[2(XSTORE                                    PENT,CYRIX )]661.8 code1
+[2(XCRYPTECB                                 PENT,CYRIX )]650.8 code0
+[2(XCRYPTCBC                                 PENT,CYRIX )]639.8 code0
+[2(XCRYPTCTR                                 PENT,CYRIX )]628.8 code0
+[2(XCRYPTCFB                                 PENT,CYRIX )]617.8 code0
+[2(XCRYPTOFB                                 PENT,CYRIX )]606.8 code0
+[2(MONTMUL                                   PENT,CYRIX )]595.8 code0
+[2(XSHA1                                     PENT,CYRIX )]584.8 code0
+[2(XSHA256                                   PENT,CYRIX)]573.8 code2
+[{/section-B.1.30 xa}(AMD Lightweight Profiling \(LWP\) instructions)](B.1.30)554.6 subh3
+[2(LLWPCB           reg16                    AMD )]537.6 code1
+[2(LLWPCB           reg32                    AMD,386 )]526.6 code0
+[2(LLWPCB           reg64                    AMD,X64 )]515.6 code0
+[2(SLWPCB           reg16                    AMD )]504.6 code0
+[2(SLWPCB           reg32                    AMD,386 )]493.6 code0
+[2(SLWPCB           reg64                    AMD,X64 )]482.6 code0
+[2(LWPVAL           reg16,rm32,imm16         AMD,386 )]471.6 code0
+[2(LWPVAL           reg32,rm32,imm32         AMD,386 )]460.6 code0
+[2(LWPVAL           reg64,rm32,imm32         AMD,X64 )]449.6 code0
+[2(LWPINS           reg16,rm32,imm16         AMD,386 )]438.6 code0
+[2(LWPINS           reg32,rm32,imm32         AMD,386 )]427.6 code0
+[2(LWPINS           reg64,rm32,imm32         AMD,X64)]416.6 code2
+[{/section-B.1.31 xa}(AMD XOP, FMA4 and CVT16 instructions \(SSE5\))](B.1.31)397.4 subh3
+[2(VCVTPH2PS        xmmreg,xmmrm64*,imm8     AMD,SSE5 )]380.4 code1
+[2(VCVTPH2PS        ymmreg,xmmrm128,imm8     AMD,SSE5 )]369.4 code0
+[2(VCVTPH2PS        ymmreg,ymmrm128*,imm8    AMD,SSE5 )]358.4 code0
+[2(VCVTPS2PH        xmmrm64,xmmreg*,imm8     AMD,SSE5 )]347.4 code0
+[2(VCVTPS2PH        xmmrm128,ymmreg,imm8     AMD,SSE5 )]336.4 code0
+[2(VCVTPS2PH        ymmrm128,ymmreg*,imm8    AMD,SSE5 )]325.4 code0
+[2(VFMADDPD         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]314.4 code0
+[2(VFMADDPD         ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]303.4 code0
+[2(VFMADDPD         xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]292.4 code0
+[2(VFMADDPD         ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]281.4 code0
+[2(VFMADDPS         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]270.4 code0
+[2(VFMADDPS         ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]259.4 code0
+[2(VFMADDPS         xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]248.4 code0
+[2(VFMADDPS         ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]237.4 code0
+[2(VFMADDSD         xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5 )]226.4 code0
+[2(VFMADDSD         xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5 )]215.4 code0
+[2(VFMADDSS         xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5 )]204.4 code0
+[2(VFMADDSS         xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5 )]193.4 code0
+[2(VFMADDSUBPD      xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]182.4 code0
+[2(VFMADDSUBPD      ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]171.4 code0
+[2(VFMADDSUBPD      xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]160.4 code0
+[2(VFMADDSUBPD      ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]149.4 code0
+[2(VFMADDSUBPS      xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]138.4 code0
+[2(VFMADDSUBPS      ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]127.4 code0
+[2(VFMADDSUBPS      xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]116.4 code0
+[2(VFMADDSUBPS      ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]105.4 code0
+(174)pageeven
+restore showpage
+%%Page: 175 175
+%%BeginPageSetup
+save
+%%EndPageSetup
+/175 pa
+[2(VFMSUBADDPD      xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]681 code0
+[2(VFMSUBADDPD      ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]670 code0
+[2(VFMSUBADDPD      xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]659 code0
+[2(VFMSUBADDPD      ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]648 code0
+[2(VFMSUBADDPS      xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]637 code0
+[2(VFMSUBADDPS      ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]626 code0
+[2(VFMSUBADDPS      xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]615 code0
+[2(VFMSUBADDPS      ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]604 code0
+[2(VFMSUBPD         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]593 code0
+[2(VFMSUBPD         ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]582 code0
+[2(VFMSUBPD         xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]571 code0
+[2(VFMSUBPD         ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]560 code0
+[2(VFMSUBPS         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]549 code0
+[2(VFMSUBPS         ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]538 code0
+[2(VFMSUBPS         xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]527 code0
+[2(VFMSUBPS         ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]516 code0
+[2(VFMSUBSD         xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5 )]505 code0
+[2(VFMSUBSD         xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5 )]494 code0
+[2(VFMSUBSS         xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5 )]483 code0
+[2(VFMSUBSS         xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5 )]472 code0
+[2(VFNMADDPD        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]461 code0
+[2(VFNMADDPD        ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]450 code0
+[2(VFNMADDPD        xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]439 code0
+[2(VFNMADDPD        ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]428 code0
+[2(VFNMADDPS        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]417 code0
+[2(VFNMADDPS        ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]406 code0
+[2(VFNMADDPS        xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]395 code0
+[2(VFNMADDPS        ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]384 code0
+[2(VFNMADDSD        xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5 )]373 code0
+[2(VFNMADDSD        xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5 )]362 code0
+[2(VFNMADDSS        xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5 )]351 code0
+[2(VFNMADDSS        xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5 )]340 code0
+[2(VFNMSUBPD        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]329 code0
+[2(VFNMSUBPD        ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]318 code0
+[2(VFNMSUBPD        xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]307 code0
+[2(VFNMSUBPD        ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]296 code0
+[2(VFNMSUBPS        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]285 code0
+[2(VFNMSUBPS        ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]274 code0
+[2(VFNMSUBPS        xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]263 code0
+[2(VFNMSUBPS        ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]252 code0
+[2(VFNMSUBSD        xmmreg,xmmreg*,xmmrm64,xmmreg AMD,SSE5 )]241 code0
+[2(VFNMSUBSD        xmmreg,xmmreg*,xmmreg,xmmrm64 AMD,SSE5 )]230 code0
+[2(VFNMSUBSS        xmmreg,xmmreg*,xmmrm32,xmmreg AMD,SSE5 )]219 code0
+[2(VFNMSUBSS        xmmreg,xmmreg*,xmmreg,xmmrm32 AMD,SSE5 )]208 code0
+[2(VFRCZPD          xmmreg,xmmrm128*         AMD,SSE5 )]197 code0
+[2(VFRCZPD          ymmreg,ymmrm256*         AMD,SSE5 )]186 code0
+[2(VFRCZPS          xmmreg,xmmrm128*         AMD,SSE5 )]175 code0
+[2(VFRCZPS          ymmreg,ymmrm256*         AMD,SSE5 )]164 code0
+[2(VFRCZSD          xmmreg,xmmrm64*          AMD,SSE5 )]153 code0
+[2(VFRCZSS          xmmreg,xmmrm32*          AMD,SSE5 )]142 code0
+[2(VPCMOV           xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]131 code0
+[2(VPCMOV           ymmreg,ymmreg*,ymmrm256,ymmreg AMD,SSE5 )]120 code0
+[2(VPCMOV           xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]109 code0
+(175)pageodd
+restore showpage
+%%Page: 176 176
+%%BeginPageSetup
+save
+%%EndPageSetup
+/176 pa
+[2(VPCMOV           ymmreg,ymmreg*,ymmreg,ymmrm256 AMD,SSE5 )]681 code0
+[2(VPCOMB           xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5 )]670 code0
+[2(VPCOMD           xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5 )]659 code0
+[2(VPCOMQ           xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5 )]648 code0
+[2(VPCOMUB          xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5 )]637 code0
+[2(VPCOMUD          xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5 )]626 code0
+[2(VPCOMUQ          xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5 )]615 code0
+[2(VPCOMUW          xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5 )]604 code0
+[2(VPCOMW           xmmreg,xmmreg*,xmmrm128,imm8 AMD,SSE5 )]593 code0
+[2(VPHADDBD         xmmreg,xmmrm128*         AMD,SSE5 )]582 code0
+[2(VPHADDBQ         xmmreg,xmmrm128*         AMD,SSE5 )]571 code0
+[2(VPHADDBW         xmmreg,xmmrm128*         AMD,SSE5 )]560 code0
+[2(VPHADDDQ         xmmreg,xmmrm128*         AMD,SSE5 )]549 code0
+[2(VPHADDUBD        xmmreg,xmmrm128*         AMD,SSE5 )]538 code0
+[2(VPHADDUBQ        xmmreg,xmmrm128*         AMD,SSE5 )]527 code0
+[2(VPHADDUBW        xmmreg,xmmrm128*         AMD,SSE5 )]516 code0
+[2(VPHADDUDQ        xmmreg,xmmrm128*         AMD,SSE5 )]505 code0
+[2(VPHADDUWD        xmmreg,xmmrm128*         AMD,SSE5 )]494 code0
+[2(VPHADDUWQ        xmmreg,xmmrm128*         AMD,SSE5 )]483 code0
+[2(VPHADDWD         xmmreg,xmmrm128*         AMD,SSE5 )]472 code0
+[2(VPHADDWQ         xmmreg,xmmrm128*         AMD,SSE5 )]461 code0
+[2(VPHSUBBW         xmmreg,xmmrm128*         AMD,SSE5 )]450 code0
+[2(VPHSUBDQ         xmmreg,xmmrm128*         AMD,SSE5 )]439 code0
+[2(VPHSUBWD         xmmreg,xmmrm128*         AMD,SSE5 )]428 code0
+[2(VPMACSDD         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]417 code0
+[2(VPMACSDQH        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]406 code0
+[2(VPMACSDQL        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]395 code0
+[2(VPMACSSDD        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]384 code0
+[2(VPMACSSDQH       xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]373 code0
+[2(VPMACSSDQL       xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]362 code0
+[2(VPMACSSWD        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]351 code0
+[2(VPMACSSWW        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]340 code0
+[2(VPMACSWD         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]329 code0
+[2(VPMACSWW         xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]318 code0
+[2(VPMADCSSWD       xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]307 code0
+[2(VPMADCSWD        xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]296 code0
+[2(VPPERM           xmmreg,xmmreg*,xmmreg,xmmrm128 AMD,SSE5 )]285 code0
+[2(VPPERM           xmmreg,xmmreg*,xmmrm128,xmmreg AMD,SSE5 )]274 code0
+[2(VPROTB           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]263 code0
+[2(VPROTB           xmmreg,xmmreg*,xmmrm128  AMD,SSE5 )]252 code0
+[2(VPROTB           xmmreg,xmmrm128*,imm8    AMD,SSE5 )]241 code0
+[2(VPROTD           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]230 code0
+[2(VPROTD           xmmreg,xmmreg*,xmmrm128  AMD,SSE5 )]219 code0
+[2(VPROTD           xmmreg,xmmrm128*,imm8    AMD,SSE5 )]208 code0
+[2(VPROTQ           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]197 code0
+[2(VPROTQ           xmmreg,xmmreg*,xmmrm128  AMD,SSE5 )]186 code0
+[2(VPROTQ           xmmreg,xmmrm128*,imm8    AMD,SSE5 )]175 code0
+[2(VPROTW           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]164 code0
+[2(VPROTW           xmmreg,xmmreg*,xmmrm128  AMD,SSE5 )]153 code0
+[2(VPROTW           xmmreg,xmmrm128*,imm8    AMD,SSE5 )]142 code0
+[2(VPSHAB           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]131 code0
+[2(VPSHAB           xmmreg,xmmreg*,xmmrm128  AMD,SSE5 )]120 code0
+[2(VPSHAD           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]109 code0
+(176)pageeven
+restore showpage
+%%Page: 177 177
+%%BeginPageSetup
+save
+%%EndPageSetup
+/177 pa
+[2(VPSHAD           xmmreg,xmmreg*,xmmrm128  AMD,SSE5 )]681 code0
+[2(VPSHAQ           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]670 code0
+[2(VPSHAQ           xmmreg,xmmreg*,xmmrm128  AMD,SSE5 )]659 code0
+[2(VPSHAW           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]648 code0
+[2(VPSHAW           xmmreg,xmmreg*,xmmrm128  AMD,SSE5 )]637 code0
+[2(VPSHLB           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]626 code0
+[2(VPSHLB           xmmreg,xmmreg*,xmmrm128  AMD,SSE5 )]615 code0
+[2(VPSHLD           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]604 code0
+[2(VPSHLD           xmmreg,xmmreg*,xmmrm128  AMD,SSE5 )]593 code0
+[2(VPSHLQ           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]582 code0
+[2(VPSHLQ           xmmreg,xmmreg*,xmmrm128  AMD,SSE5 )]571 code0
+[2(VPSHLW           xmmreg,xmmrm128*,xmmreg  AMD,SSE5 )]560 code0
+[2(VPSHLW           xmmreg,xmmreg*,xmmrm128  AMD,SSE5)]549 code2
+[{/section-B.1.32 xa}(Systematic names for the hinting nop instructions)](B.1.32)529.8 subh3
+[2(HINT_NOP0        rm16                     P6,UNDOC )]512.8 code1
+[2(HINT_NOP0        rm32                     P6,UNDOC )]501.8 code0
+[2(HINT_NOP0        rm64                     X64,UNDOC )]490.8 code0
+[2(HINT_NOP1        rm16                     P6,UNDOC )]479.8 code0
+[2(HINT_NOP1        rm32                     P6,UNDOC )]468.8 code0
+[2(HINT_NOP1        rm64                     X64,UNDOC )]457.8 code0
+[2(HINT_NOP2        rm16                     P6,UNDOC )]446.8 code0
+[2(HINT_NOP2        rm32                     P6,UNDOC )]435.8 code0
+[2(HINT_NOP2        rm64                     X64,UNDOC )]424.8 code0
+[2(HINT_NOP3        rm16                     P6,UNDOC )]413.8 code0
+[2(HINT_NOP3        rm32                     P6,UNDOC )]402.8 code0
+[2(HINT_NOP3        rm64                     X64,UNDOC )]391.8 code0
+[2(HINT_NOP4        rm16                     P6,UNDOC )]380.8 code0
+[2(HINT_NOP4        rm32                     P6,UNDOC )]369.8 code0
+[2(HINT_NOP4        rm64                     X64,UNDOC )]358.8 code0
+[2(HINT_NOP5        rm16                     P6,UNDOC )]347.8 code0
+[2(HINT_NOP5        rm32                     P6,UNDOC )]336.8 code0
+[2(HINT_NOP5        rm64                     X64,UNDOC )]325.8 code0
+[2(HINT_NOP6        rm16                     P6,UNDOC )]314.8 code0
+[2(HINT_NOP6        rm32                     P6,UNDOC )]303.8 code0
+[2(HINT_NOP6        rm64                     X64,UNDOC )]292.8 code0
+[2(HINT_NOP7        rm16                     P6,UNDOC )]281.8 code0
+[2(HINT_NOP7        rm32                     P6,UNDOC )]270.8 code0
+[2(HINT_NOP7        rm64                     X64,UNDOC )]259.8 code0
+[2(HINT_NOP8        rm16                     P6,UNDOC )]248.8 code0
+[2(HINT_NOP8        rm32                     P6,UNDOC )]237.8 code0
+[2(HINT_NOP8        rm64                     X64,UNDOC )]226.8 code0
+[2(HINT_NOP9        rm16                     P6,UNDOC )]215.8 code0
+[2(HINT_NOP9        rm32                     P6,UNDOC )]204.8 code0
+[2(HINT_NOP9        rm64                     X64,UNDOC )]193.8 code0
+[2(HINT_NOP10       rm16                     P6,UNDOC )]182.8 code0
+[2(HINT_NOP10       rm32                     P6,UNDOC )]171.8 code0
+[2(HINT_NOP10       rm64                     X64,UNDOC )]160.8 code0
+[2(HINT_NOP11       rm16                     P6,UNDOC )]149.8 code0
+[2(HINT_NOP11       rm32                     P6,UNDOC )]138.8 code0
+[2(HINT_NOP11       rm64                     X64,UNDOC )]127.8 code0
+[2(HINT_NOP12       rm16                     P6,UNDOC )]116.8 code0
+[2(HINT_NOP12       rm32                     P6,UNDOC )]105.8 code0
+(177)pageodd
+restore showpage
+%%Page: 178 178
+%%BeginPageSetup
+save
+%%EndPageSetup
+/178 pa
+[2(HINT_NOP12       rm64                     X64,UNDOC )]681 code0
+[2(HINT_NOP13       rm16                     P6,UNDOC )]670 code0
+[2(HINT_NOP13       rm32                     P6,UNDOC )]659 code0
+[2(HINT_NOP13       rm64                     X64,UNDOC )]648 code0
+[2(HINT_NOP14       rm16                     P6,UNDOC )]637 code0
+[2(HINT_NOP14       rm32                     P6,UNDOC )]626 code0
+[2(HINT_NOP14       rm64                     X64,UNDOC )]615 code0
+[2(HINT_NOP15       rm16                     P6,UNDOC )]604 code0
+[2(HINT_NOP15       rm32                     P6,UNDOC )]593 code0
+[2(HINT_NOP15       rm64                     X64,UNDOC )]582 code0
+[2(HINT_NOP16       rm16                     P6,UNDOC )]571 code0
+[2(HINT_NOP16       rm32                     P6,UNDOC )]560 code0
+[2(HINT_NOP16       rm64                     X64,UNDOC )]549 code0
+[2(HINT_NOP17       rm16                     P6,UNDOC )]538 code0
+[2(HINT_NOP17       rm32                     P6,UNDOC )]527 code0
+[2(HINT_NOP17       rm64                     X64,UNDOC )]516 code0
+[2(HINT_NOP18       rm16                     P6,UNDOC )]505 code0
+[2(HINT_NOP18       rm32                     P6,UNDOC )]494 code0
+[2(HINT_NOP18       rm64                     X64,UNDOC )]483 code0
+[2(HINT_NOP19       rm16                     P6,UNDOC )]472 code0
+[2(HINT_NOP19       rm32                     P6,UNDOC )]461 code0
+[2(HINT_NOP19       rm64                     X64,UNDOC )]450 code0
+[2(HINT_NOP20       rm16                     P6,UNDOC )]439 code0
+[2(HINT_NOP20       rm32                     P6,UNDOC )]428 code0
+[2(HINT_NOP20       rm64                     X64,UNDOC )]417 code0
+[2(HINT_NOP21       rm16                     P6,UNDOC )]406 code0
+[2(HINT_NOP21       rm32                     P6,UNDOC )]395 code0
+[2(HINT_NOP21       rm64                     X64,UNDOC )]384 code0
+[2(HINT_NOP22       rm16                     P6,UNDOC )]373 code0
+[2(HINT_NOP22       rm32                     P6,UNDOC )]362 code0
+[2(HINT_NOP22       rm64                     X64,UNDOC )]351 code0
+[2(HINT_NOP23       rm16                     P6,UNDOC )]340 code0
+[2(HINT_NOP23       rm32                     P6,UNDOC )]329 code0
+[2(HINT_NOP23       rm64                     X64,UNDOC )]318 code0
+[2(HINT_NOP24       rm16                     P6,UNDOC )]307 code0
+[2(HINT_NOP24       rm32                     P6,UNDOC )]296 code0
+[2(HINT_NOP24       rm64                     X64,UNDOC )]285 code0
+[2(HINT_NOP25       rm16                     P6,UNDOC )]274 code0
+[2(HINT_NOP25       rm32                     P6,UNDOC )]263 code0
+[2(HINT_NOP25       rm64                     X64,UNDOC )]252 code0
+[2(HINT_NOP26       rm16                     P6,UNDOC )]241 code0
+[2(HINT_NOP26       rm32                     P6,UNDOC )]230 code0
+[2(HINT_NOP26       rm64                     X64,UNDOC )]219 code0
+[2(HINT_NOP27       rm16                     P6,UNDOC )]208 code0
+[2(HINT_NOP27       rm32                     P6,UNDOC )]197 code0
+[2(HINT_NOP27       rm64                     X64,UNDOC )]186 code0
+[2(HINT_NOP28       rm16                     P6,UNDOC )]175 code0
+[2(HINT_NOP28       rm32                     P6,UNDOC )]164 code0
+[2(HINT_NOP28       rm64                     X64,UNDOC )]153 code0
+[2(HINT_NOP29       rm16                     P6,UNDOC )]142 code0
+[2(HINT_NOP29       rm32                     P6,UNDOC )]131 code0
+[2(HINT_NOP29       rm64                     X64,UNDOC )]120 code0
+[2(HINT_NOP30       rm16                     P6,UNDOC )]109 code0
+(178)pageeven
+restore showpage
+%%Page: 179 179
+%%BeginPageSetup
+save
+%%EndPageSetup
+/179 pa
+[2(HINT_NOP30       rm32                     P6,UNDOC )]681 code0
+[2(HINT_NOP30       rm64                     X64,UNDOC )]670 code0
+[2(HINT_NOP31       rm16                     P6,UNDOC )]659 code0
+[2(HINT_NOP31       rm32                     P6,UNDOC )]648 code0
+[2(HINT_NOP31       rm64                     X64,UNDOC )]637 code0
+[2(HINT_NOP32       rm16                     P6,UNDOC )]626 code0
+[2(HINT_NOP32       rm32                     P6,UNDOC )]615 code0
+[2(HINT_NOP32       rm64                     X64,UNDOC )]604 code0
+[2(HINT_NOP33       rm16                     P6,UNDOC )]593 code0
+[2(HINT_NOP33       rm32                     P6,UNDOC )]582 code0
+[2(HINT_NOP33       rm64                     X64,UNDOC )]571 code0
+[2(HINT_NOP34       rm16                     P6,UNDOC )]560 code0
+[2(HINT_NOP34       rm32                     P6,UNDOC )]549 code0
+[2(HINT_NOP34       rm64                     X64,UNDOC )]538 code0
+[2(HINT_NOP35       rm16                     P6,UNDOC )]527 code0
+[2(HINT_NOP35       rm32                     P6,UNDOC )]516 code0
+[2(HINT_NOP35       rm64                     X64,UNDOC )]505 code0
+[2(HINT_NOP36       rm16                     P6,UNDOC )]494 code0
+[2(HINT_NOP36       rm32                     P6,UNDOC )]483 code0
+[2(HINT_NOP36       rm64                     X64,UNDOC )]472 code0
+[2(HINT_NOP37       rm16                     P6,UNDOC )]461 code0
+[2(HINT_NOP37       rm32                     P6,UNDOC )]450 code0
+[2(HINT_NOP37       rm64                     X64,UNDOC )]439 code0
+[2(HINT_NOP38       rm16                     P6,UNDOC )]428 code0
+[2(HINT_NOP38       rm32                     P6,UNDOC )]417 code0
+[2(HINT_NOP38       rm64                     X64,UNDOC )]406 code0
+[2(HINT_NOP39       rm16                     P6,UNDOC )]395 code0
+[2(HINT_NOP39       rm32                     P6,UNDOC )]384 code0
+[2(HINT_NOP39       rm64                     X64,UNDOC )]373 code0
+[2(HINT_NOP40       rm16                     P6,UNDOC )]362 code0
+[2(HINT_NOP40       rm32                     P6,UNDOC )]351 code0
+[2(HINT_NOP40       rm64                     X64,UNDOC )]340 code0
+[2(HINT_NOP41       rm16                     P6,UNDOC )]329 code0
+[2(HINT_NOP41       rm32                     P6,UNDOC )]318 code0
+[2(HINT_NOP41       rm64                     X64,UNDOC )]307 code0
+[2(HINT_NOP42       rm16                     P6,UNDOC )]296 code0
+[2(HINT_NOP42       rm32                     P6,UNDOC )]285 code0
+[2(HINT_NOP42       rm64                     X64,UNDOC )]274 code0
+[2(HINT_NOP43       rm16                     P6,UNDOC )]263 code0
+[2(HINT_NOP43       rm32                     P6,UNDOC )]252 code0
+[2(HINT_NOP43       rm64                     X64,UNDOC )]241 code0
+[2(HINT_NOP44       rm16                     P6,UNDOC )]230 code0
+[2(HINT_NOP44       rm32                     P6,UNDOC )]219 code0
+[2(HINT_NOP44       rm64                     X64,UNDOC )]208 code0
+[2(HINT_NOP45       rm16                     P6,UNDOC )]197 code0
+[2(HINT_NOP45       rm32                     P6,UNDOC )]186 code0
+[2(HINT_NOP45       rm64                     X64,UNDOC )]175 code0
+[2(HINT_NOP46       rm16                     P6,UNDOC )]164 code0
+[2(HINT_NOP46       rm32                     P6,UNDOC )]153 code0
+[2(HINT_NOP46       rm64                     X64,UNDOC )]142 code0
+[2(HINT_NOP47       rm16                     P6,UNDOC )]131 code0
+[2(HINT_NOP47       rm32                     P6,UNDOC )]120 code0
+[2(HINT_NOP47       rm64                     X64,UNDOC )]109 code0
+(179)pageodd
+restore showpage
+%%Page: 180 180
+%%BeginPageSetup
+save
+%%EndPageSetup
+/180 pa
+[2(HINT_NOP48       rm16                     P6,UNDOC )]681 code0
+[2(HINT_NOP48       rm32                     P6,UNDOC )]670 code0
+[2(HINT_NOP48       rm64                     X64,UNDOC )]659 code0
+[2(HINT_NOP49       rm16                     P6,UNDOC )]648 code0
+[2(HINT_NOP49       rm32                     P6,UNDOC )]637 code0
+[2(HINT_NOP49       rm64                     X64,UNDOC )]626 code0
+[2(HINT_NOP50       rm16                     P6,UNDOC )]615 code0
+[2(HINT_NOP50       rm32                     P6,UNDOC )]604 code0
+[2(HINT_NOP50       rm64                     X64,UNDOC )]593 code0
+[2(HINT_NOP51       rm16                     P6,UNDOC )]582 code0
+[2(HINT_NOP51       rm32                     P6,UNDOC )]571 code0
+[2(HINT_NOP51       rm64                     X64,UNDOC )]560 code0
+[2(HINT_NOP52       rm16                     P6,UNDOC )]549 code0
+[2(HINT_NOP52       rm32                     P6,UNDOC )]538 code0
+[2(HINT_NOP52       rm64                     X64,UNDOC )]527 code0
+[2(HINT_NOP53       rm16                     P6,UNDOC )]516 code0
+[2(HINT_NOP53       rm32                     P6,UNDOC )]505 code0
+[2(HINT_NOP53       rm64                     X64,UNDOC )]494 code0
+[2(HINT_NOP54       rm16                     P6,UNDOC )]483 code0
+[2(HINT_NOP54       rm32                     P6,UNDOC )]472 code0
+[2(HINT_NOP54       rm64                     X64,UNDOC )]461 code0
+[2(HINT_NOP55       rm16                     P6,UNDOC )]450 code0
+[2(HINT_NOP55       rm32                     P6,UNDOC )]439 code0
+[2(HINT_NOP55       rm64                     X64,UNDOC )]428 code0
+[2(HINT_NOP56       rm16                     P6,UNDOC )]417 code0
+[2(HINT_NOP56       rm32                     P6,UNDOC )]406 code0
+[2(HINT_NOP56       rm64                     X64,UNDOC )]395 code0
+[2(HINT_NOP57       rm16                     P6,UNDOC )]384 code0
+[2(HINT_NOP57       rm32                     P6,UNDOC )]373 code0
+[2(HINT_NOP57       rm64                     X64,UNDOC )]362 code0
+[2(HINT_NOP58       rm16                     P6,UNDOC )]351 code0
+[2(HINT_NOP58       rm32                     P6,UNDOC )]340 code0
+[2(HINT_NOP58       rm64                     X64,UNDOC )]329 code0
+[2(HINT_NOP59       rm16                     P6,UNDOC )]318 code0
+[2(HINT_NOP59       rm32                     P6,UNDOC )]307 code0
+[2(HINT_NOP59       rm64                     X64,UNDOC )]296 code0
+[2(HINT_NOP60       rm16                     P6,UNDOC )]285 code0
+[2(HINT_NOP60       rm32                     P6,UNDOC )]274 code0
+[2(HINT_NOP60       rm64                     X64,UNDOC )]263 code0
+[2(HINT_NOP61       rm16                     P6,UNDOC )]252 code0
+[2(HINT_NOP61       rm32                     P6,UNDOC )]241 code0
+[2(HINT_NOP61       rm64                     X64,UNDOC )]230 code0
+[2(HINT_NOP62       rm16                     P6,UNDOC )]219 code0
+[2(HINT_NOP62       rm32                     P6,UNDOC )]208 code0
+[2(HINT_NOP62       rm64                     X64,UNDOC )]197 code0
+[2(HINT_NOP63       rm16                     P6,UNDOC )]186 code0
+[2(HINT_NOP63       rm32                     P6,UNDOC )]175 code0
+[2(HINT_NOP63       rm64                     X64,UNDOC)]164 code2
+(180)pageeven
+restore showpage
+%%Page: 181 181
+%%BeginPageSetup
+save
+%%EndPageSetup
+/181 pa
+[{/appendix-C xa}(Appendix C: )(NASM Version History)]642.8 appn3
+[{/section-C.1 xa}(NASM 2 Series)](C.1)597.4 head3
+[(The NASM 2 series support x86-64, and is the production version of NASM since 2007.)]580.4 norm3
+[{/section-C.1.1 xa}(Version 2.08)](C.1.1)561.2 subh3
+[(A number of enhancements/fixes in macros area.)]544.2 bull3
+[(Support for arbitrarily terminating macro expansions )2(%exitmacro)0(. See ){/section-4.3.12 xl}(section 4.3.12){el}(.)]527.2 bull3
+[(Support for recursive macro expansion )2(%rmacro/irmacro)0(. See ){/section-4.3.1 xl}(section 4.3.1){el}(.)]510.2 bull3
+[(Support for converting strings to tokens. See ){/section-4.1.9 xl}(section 4.1.9){el}(.)]493.2 bull3
+[(Fuzzy operand size logic introduced.)]476.2 bull3
+[(Fix COFF stack overrun on too long export identifiers.)]459.2 bull3
+[(Fix Macho-O alignment bug.)]442.2 bull3
+[(Fix crashes with \226fwin32 on file with many exports.)]425.2 bull3
+[(Fix stack overrun for too long [DEBUG id].)]408.2 bull3
+[(Fix incorrect sbyte usage in IMUL \(hit only if optimization flag passed\).)]391.2 bull3
+[(Append ending token for )2(.stabs)0( records in the ELF output format.)]374.2 bull3
+[(New NSIS script which uses ModernUI and MultiUser approach.)]357.2 bull3
+[(Visual Studio 2008 NASM integration \(rules file\).)]340.2 bull3
+[(Warn a user if a constant is too long \(and as result will be stripped\).)]323.2 bull3
+[(The obsoleted pre-XOP AMD SSE5 instruction set which was never actualized was removed.)]306.2 bull3
+[(Fix stack overrun on too long error file name passed from the command line.)]289.2 bull3
+[(Bind symbols to the .text section by default \(ie in case if SECTION directive was omitted\) in the ELF)]272.2 bull1
+[(output format.)]261.2 bull2
+[(Fix sync points array index wrapping.)]244.2 bull3
+[(A few fixes for FMA4 and XOP instruction templates.)]227.2 bull3
+[(Add AMD Lightweight Profiling \(LWP\) instructions.)]210.2 bull3
+[{/section-C.1.2 xa}(Version 2.07)](C.1.2)191 subh3
+[(NASM is now under the 2-clause BSD license. See ){/section-1.1.2 xl}(section 1.1.2){el}(.)]174 bull3
+[(Fix the section type for the )2(.strtab)0( section in the )2(elf64)0( output format.)]157 bull3
+[(Fix the handling of )2(COMMON)0( directives in the )2(obj)0( output format.)]140 bull3
+[(New )2(ith)0( and )2(srec)0( output formats; these are variants of the )2(bin)0( output format which output Intel hex)]123 bull1
+[(and Motorola S-records, respectively. See ){/section-7.2 xl}(section 7.2){el}( and ){/section-7.3 xl}(section 7.3){el}(.)]112 bull2
+(181)pageodd
+restore showpage
+%%Page: 182 182
+%%BeginPageSetup
+save
+%%EndPageSetup
+/182 pa
+[2(rdf2ihx)0( replaced with an enhanced )2(rdf2bin)0(, which can output binary, COM, Intel hex or Motorola)]681 bull1
+[(S-records.)]670 bull2
+[(The Windows installer now puts the NASM directory first in the )2(PATH)0( of the "NASM Shell".)]653 bull3
+[(Revert the early expansion behavior of )2(%+)0( to pre-2.06 behavior: )2(%+)0( is only expanded late.)]636 bull3
+[(Yet another Mach-O alignment fix.)]619 bull3
+[(Don't delete the list file on errors. Also, include error and warning information in the list file.)]602 bull3
+[(Support for 64-bit Mach-O output, see ){/section-7.8 xl}(section 7.8){el}(.)]585 bull3
+[(Fix assert failure on certain operations that involve strings with high-bit bytes.)]568 bull3
+[{/section-C.1.3 xa}(Version 2.06)](C.1.3)548.8 subh3
+[(This release is dedicated to the memory of Charles A. Crayne, long time NASM developer as well as)]531.8 bull1
+[(moderator of )2(comp.lang.asm.x86)0( and author of the book )1(Serious Assembler)0(. We miss you, Chuck.)]520.8 bull2
+[(Support for indirect macro expansion \()2(%[...])0(\). See ){/section-4.1.3 xl}(section 4.1.3){el}(.)]503.8 bull3
+[2(%pop)0( can now take an argument, see ){/section-4.7.1 xl}(section 4.7.1){el}(.)]486.8 bull3
+[(The argument to )2(%use)0( is no longer macro-expanded. Use )2(%[...])0( if macro expansion is desired.)]469.8 bull3
+[(Support for thread-local storage in ELF32 and ELF64. See ){/section-7.9.4 xl}(section 7.9.4){el}(.)]452.8 bull3
+[(Fix crash on )2(%ifmacro)0( without an argument.)]435.8 bull3
+[(Correct the arguments to the )2(POPCNT)0( instruction.)]418.8 bull3
+[(Fix section alignment in the Mach-O format.)]401.8 bull3
+[(Update AVX support to version 5 of the Intel specification.)]384.8 bull3
+[(Fix the handling of accesses to context-local macros from higher levels in the context stack.)]367.8 bull3
+[(Treat )2(WAIT)0( as a prefix rather than as an instruction, thereby allowing constructs like )2(O16 FSAVE)0( to work)]350.8 bull1
+[(correctly.)]339.8 bull2
+[(Support for structures with a non-zero base offset. See ){/section-4.11.10 xl}(section 4.11.10){el}(.)]322.8 bull3
+[(Correctly handle preprocessor token concatenation \(see ){/section-4.3.8 xl}(section 4.3.8){el}(\) involving floating-point numbers.)]305.8 bull3
+[(The )2(PINSR)0( series of instructions have been corrected and rationalized.)]288.8 bull3
+[(Removed AMD SSE5, replaced with the new XOP/FMA4/CVT16 \(rev 3.03\) spec.)]271.8 bull3
+[(The ELF backends no longer automatically generate a )2(.comment)0( section.)]254.8 bull3
+[(Add additional "well-known" ELF sections with default attributes. See ){/section-7.9.2 xl}(section 7.9.2){el}(.)]237.8 bull3
+[{/section-C.1.4 xa}(Version 2.05.01)](C.1.4)218.6 subh3
+[(Fix the )2(-w)0(/)2(-W)0( option parsing, which was broken in NASM 2.05.)]201.6 bull3
+[{/section-C.1.5 xa}(Version 2.05)](C.1.5)182.4 subh3
+[(Fix redundant REX.W prefix on )2(JMP reg64)0(.)]165.4 bull3
+[(Make the behaviour of )2(-O0)0( match NASM 0.98 legacy behavior. See ){/section-2.1.22 xl}(section 2.1.22){el}(.)]148.4 bull3
+[2(-w-user)0( can be used to suppress the output of )2(%warning)0( directives. See ){/section-2.1.24 xl}(section 2.1.24){el}(.)]131.4 bull3
+[(Fix bug where )2(ALIGN)0( would issue a full alignment datum instead of zero bytes.)]114.4 bull3
+(182)pageeven
+restore showpage
+%%Page: 183 183
+%%BeginPageSetup
+save
+%%EndPageSetup
+/183 pa
+[(Fix offsets in list files.)]681 bull3
+[(Fix )2(%include)0( inside multi-line macros or loops.)]664 bull3
+[(Fix error where NASM would generate a spurious warning on valid optimizations of immediate values.)]647 bull3
+[(Fix arguments to a number of the )2(CVT)0( SSE instructions.)]630 bull3
+[(Fix RIP-relative offsets when the instruction carries an immediate.)]613 bull3
+[(Massive overhaul of the ELF64 backend for spec compliance.)]596 bull3
+[(Fix the Geode )2(PFRCPV)0( and )2(PFRSQRTV)0( instruction.)]579 bull3
+[(Fix the SSE 4.2 )2(CRC32)0( instruction.)]562 bull3
+[{/section-C.1.6 xa}(Version 2.04)](C.1.6)542.8 subh3
+[(Sanitize macro handing in the )2(%error)0( directive.)]525.8 bull3
+[(New )2(%warning)0( directive to issue user-controlled warnings.)]508.8 bull3
+[2(%error)0( directives are now deferred to the final assembly phase.)]491.8 bull3
+[(New )2(%fatal)0( directive to immediately terminate assembly.)]474.8 bull3
+[(New )2(%strcat)0( directive to join quoted strings together.)]457.8 bull3
+[(New )2(%use)0( macro directive to support standard macro directives. See ){/section-4.6.4 xl}(section 4.6.4){el}(.)]440.8 bull3
+[(Excess default parameters to )2(%macro)0( now issues a warning by default. See ){/section-4.3 xl}(section 4.3){el}(.)]423.8 bull3
+[(Fix )2(%ifn)0( and )2(%elifn)0(.)]406.8 bull3
+[(Fix nested )2(%else)0( clauses.)]389.8 bull3
+[(Correct the handling of nested )2(%rep)0(s.)]372.8 bull3
+[(New )2(%unmacro)0( directive to undeclare a multi-line macro. See ){/section-4.3.11 xl}(section 4.3.11){el}(.)]355.8 bull3
+[(Builtin macro )2(__PASS__)0( which expands to the current assembly pass. See ){/section-4.11.9 xl}(section 4.11.9){el}(.)]338.8 bull3
+[2(__utf16__)0( and )2(__utf32__)0( operators to generate UTF-16 and UTF-32 strings. See ){/section-3.4.5 xl}(section 3.4.5){el}(.)]321.8 bull3
+[(Fix bug in case-insensitive matching when compiled on platforms that don't use the )2(configure)0( script.)]304.8 bull1
+[(Of the official release binaries, that only affected the OS/2 binary.)]293.8 bull2
+[(Support for x87 packed BCD constants. See ){/section-3.4.7 xl}(section 3.4.7){el}(.)]276.8 bull3
+[(Correct the )2(LTR)0( and )2(SLDT)0( instructions in 64-bit mode.)]259.8 bull3
+[(Fix unnecessary REX.W prefix on indirect jumps in 64-bit mode.)]242.8 bull3
+[(Add AVX versions of the AES instructions \()2(VAES)0(...\).)]225.8 bull3
+[(Fix the 256-bit FMA instructions.)]208.8 bull3
+[(Add 256-bit AVX stores per the latest AVX spec.)]191.8 bull3
+[(VIA XCRYPT instructions can now be written either with or without )2(REP)0(, apparently different versions of)]174.8 bull1
+[(the VIA spec wrote them differently.)]163.8 bull2
+[(Add missing 64-bit )2(MOVNTI)0( instruction.)]146.8 bull3
+[(Fix the operand size of )2(VMREAD)0( and )2(VMWRITE)0(.)]129.8 bull3
+[(Numerous bug fixes, especially to the AES, AVX and VTX instructions.)]112.8 bull3
+(183)pageodd
+restore showpage
+%%Page: 184 184
+%%BeginPageSetup
+save
+%%EndPageSetup
+/184 pa
+[(The optimizer now always runs until it converges. It also runs even when disabled, but doesn't optimize.)]681 bull1
+[(This allows most forward references to be resolved properly.)]670 bull2
+[2(%push)0( no longer needs a context identifier; omitting the context identifier results in an anonymous context.)]653 bull3
+[{/section-C.1.7 xa}(Version 2.03.01)](C.1.7)633.8 subh3
+[(Fix buffer overflow in the listing module.)]616.8 bull3
+[(Fix the handling of hexadecimal escape codes in `...` strings.)]599.8 bull3
+[(The Postscript/PDF documentation has been reformatted.)]582.8 bull3
+[(The )2(-F)0( option now implies )2(-g)0(.)]565.8 bull3
+[{/section-C.1.8 xa}(Version 2.03)](C.1.8)546.6 subh3
+[(Add support for Intel AVX, CLMUL and FMA instructions, including YMM registers.)]529.6 bull3
+[2(dy)0(, )2(resy)0( and )2(yword)0( for 32-byte operands.)]512.6 bull3
+[(Fix some SSE5 instructions.)]495.6 bull3
+[(Intel )2(INVEPT)0(, )2(INVVPID)0( and )2(MOVBE)0( instructions.)]478.6 bull3
+[(Fix checking for critical expressions when the optimizer is enabled.)]461.6 bull3
+[(Support the DWARF debugging format for ELF targets.)]444.6 bull3
+[(Fix optimizations of signed bytes.)]427.6 bull3
+[(Fix operation on bigendian machines.)]410.6 bull3
+[(Fix buffer overflow in the preprocessor.)]393.6 bull3
+[2(SAFESEH)0( support for Win32, )2(IMAGEREL)0( for Win64 \(SEH\).)]376.6 bull3
+[2(%?)0( and )2(%??)0( to refer to the name of a macro itself. In particular, )2(%idefine keyword $%?)0( can be used)]359.6 bull1
+[(to make a keyword "disappear".)]348.6 bull2
+[(New options for dependency generation: )2(-MD)0(, )2(-MF)0(, )2(-MP)0(, )2(-MT)0(, )2(-MQ)0(.)]331.6 bull3
+[(New preprocessor directives )2(%pathsearch)0( and )2(%depend)0(; INCBIN reimplemented as a macro.)]314.6 bull3
+[2(%include)0( now resolves macros in a sane manner.)]297.6 bull3
+[2(%substr)0( can now be used to get other than one-character substrings.)]280.6 bull3
+[(New type of character/string constants, using backquotes \()2(`...`)0(\), which support C-style escape)]263.6 bull1
+[(sequences.)]252.6 bull2
+[2(%defstr)0( and )2(%idefstr)0( to stringize macro definitions before creation.)]235.6 bull3
+[(Fix forward references used in )2(EQU)0( statements.)]218.6 bull3
+[{/section-C.1.9 xa}(Version 2.02)](C.1.9)199.4 subh3
+[(Additional fixes for MMX operands with explicit )2(qword)0(, as well as \(hopefully\) SSE operands with)]182.4 bull1
+[2(oword)0(.)]171.4 bull2
+[(Fix handling of truncated strings with )2(DO)0(.)]154.4 bull3
+[(Fix segfaults due to memory overwrites when floating-point constants were used.)]137.4 bull3
+[(Fix segfaults due to missing include files.)]120.4 bull3
+[(Fix OpenWatcom Makefiles for DOS and OS/2.)]103.4 bull3
+(184)pageeven
+restore showpage
+%%Page: 185 185
+%%BeginPageSetup
+save
+%%EndPageSetup
+/185 pa
+[(Add autogenerated instruction list back into the documentation.)]681 bull3
+[(ELF: Fix segfault when generating stabs, and no symbols have been defined.)]664 bull3
+[(ELF: Experimental support for DWARF debugging information.)]647 bull3
+[(New compile date and time standard macros.)]630 bull3
+[2(%ifnum)0( now returns true for negative numbers.)]613 bull3
+[(New )2(%iftoken)0( test for a single token.)]596 bull3
+[(New )2(%ifempty)0( test for empty expansion.)]579 bull3
+[(Add support for the )2(XSAVE)0( instruction group.)]562 bull3
+[(Makefile for Netware/gcc.)]545 bull3
+[(Fix issue with some warnings getting emitted way too many times.)]528 bull3
+[(Autogenerated instruction list added to the documentation.)]511 bull3
+[{/section-C.1.10 xa}(Version 2.01)](C.1.10)491.8 subh3
+[(Fix the handling of MMX registers with explicit )2(qword)0( tags on memory \(broken in 2.00 due to 64-bit)]474.8 bull1
+[(changes.\))]463.8 bull2
+[(Fix the PREFETCH instructions.)]446.8 bull3
+[(Fix the documentation.)]429.8 bull3
+[(Fix debugging info when using )2(-f elf)0( \(backwards compatibility alias for )2(-f elf32)0(\).)]412.8 bull3
+[(Man pages for rdoff tools \(from the Debian project.\))]395.8 bull3
+[(ELF: handle large numbers of sections.)]378.8 bull3
+[(Fix corrupt output when the optimizer runs out of passes.)]361.8 bull3
+[{/section-C.1.11 xa}(Version 2.00)](C.1.11)342.6 subh3
+[(Added c99 data-type compliance.)]325.6 bull3
+[(Added general x86-64 support.)]308.6 bull3
+[(Added win64 \(x86-64 COFF\) output format.)]291.6 bull3
+[(Added )2(__BITS__)0( standard macro.)]274.6 bull3
+[(Renamed the )2(elf)0( output format to )2(elf32)0( for clarity.)]257.6 bull3
+[(Added )2(elf64)0( and )2(macho)0( \(MacOS X\) output formats.)]240.6 bull3
+[(Added Numeric constants in )2(dq)0( directive.)]223.6 bull3
+[(Added )2(oword)0(, )2(do)0( and )2(reso)0( pseudo operands.)]206.6 bull3
+[(Allow underscores in numbers.)]189.6 bull3
+[(Added 8-, 16- and 128-bit floating-point formats.)]172.6 bull3
+[(Added binary, octal and hexadecimal floating-point.)]155.6 bull3
+[(Correct the generation of floating-point constants.)]138.6 bull3
+[(Added floating-point option control.)]121.6 bull3
+[(Added Infinity and NaN floating point support.)]104.6 bull3
+(185)pageodd
+restore showpage
+%%Page: 186 186
+%%BeginPageSetup
+save
+%%EndPageSetup
+/186 pa
+[(Added ELF Symbol Visibility support.)]681 bull3
+[(Added setting OSABI value in ELF header directive.)]664 bull3
+[(Added Generate Makefile Dependencies option.)]647 bull3
+[(Added Unlimited Optimization Passes option.)]630 bull3
+[(Added )2(%IFN)0( and )2(%ELIFN)0( support.)]613 bull3
+[(Added Logical Negation Operator.)]596 bull3
+[(Enhanced Stack Relative Preprocessor Directives.)]579 bull3
+[(Enhanced ELF Debug Formats.)]562 bull3
+[(Enhanced Send Errors to a File option.)]545 bull3
+[(Added SSSE3, SSE4.1, SSE4.2, SSE5 support.)]528 bull3
+[(Added a large number of additional instructions.)]511 bull3
+[(Significant performance improvements.)]494 bull3
+[2(-w+warning)0( and )2(-w-warning)0( can now be written as \226Wwarning and \226Wno-warning, respectively.)]477 bull1
+[(See ){/section-2.1.24 xl}(section 2.1.24){el}(.)]466 bull2
+[(Add )2(-w+error)0( to treat warnings as errors. See ){/section-2.1.24 xl}(section 2.1.24){el}(.)]449 bull3
+[(Add )2(-w+all)0( and )2(-w-all)0( to enable or disable all suppressible warnings. See ){/section-2.1.24 xl}(section 2.1.24){el}(.)]432 bull3
+[{/section-C.2 xa}(NASM 0.98 Series)](C.2)410.6 head3
+[(The 0.98 series was the production versions of NASM from 1999 to 2007.)]393.6 norm3
+[{/section-C.2.1 xa}(Version 0.98.39)](C.2.1)374.4 subh3
+[(fix buffer overflow)]357.4 bull3
+[(fix outas86's )2(.bss)0( handling)]340.4 bull3
+[("make spotless" no longer deletes config.h.in.)]323.4 bull3
+[2(%\(el\)if\(n\)idn)0( insensitivity to string quotes difference \(#809300\).)]306.4 bull3
+[(\(nasm.c\))2(__OUTPUT_FORMAT__)0( changed to string value instead of symbol.)]289.4 bull3
+[{/section-C.2.2 xa}(Version 0.98.38)](C.2.2)270.2 subh3
+[(Add Makefile for 16-bit DOS binaries under OpenWatcom, and modify )2(mkdep.pl)0( to be able to generate)]253.2 bull1
+[(completely pathless dependencies, as required by OpenWatcom wmake \(it supports path searches, but not)]242.2 bull0
+[(explicit paths.\))]231.2 bull2
+[(Fix the )2(STR)0( instruction.)]214.2 bull3
+[(Fix the ELF output format, which was broken under certain circumstances due to the addition of stabs)]197.2 bull1
+[(support.)]186.2 bull2
+[(Quick-fix Borland format debug-info for )2(-f obj)]169.2 bull3
+[(Fix for )2(%rep)0( with no arguments \(#560568\))]152.2 bull3
+[(Fix concatenation of preprocessor function call \(#794686\))]135.2 bull3
+[(Fix long label causes coredump \(#677841\))]118.2 bull3
+[(Use autoheader as well as autoconf to keep configure from generating ridiculously long command lines.)]101.2 bull3
+(186)pageeven
+restore showpage
+%%Page: 187 187
+%%BeginPageSetup
+save
+%%EndPageSetup
+/187 pa
+[(Make sure that all of the formats which support debugging output actually will suppress debugging output)]681 bull1
+[(when )2(-g)0( not specified.)]670 bull2
+[{/section-C.2.3 xa}(Version 0.98.37)](C.2.3)650.8 subh3
+[(Paths given in )2(-I)0( switch searched for )2(incbin)0(\226ed as well as )2(%include)0(\226ed files.)]633.8 bull3
+[(Added stabs debugging for the ELF output format, patch from Martin Wawro.)]616.8 bull3
+[(Fix )2(output/outbin.c)0( to allow origin > 80000000h.)]599.8 bull3
+[(Make )2(-U)0( switch work.)]582.8 bull3
+[(Fix the use of relative offsets with explicit prefixes, e.g. )2(a32 loop foo)0(.)]565.8 bull3
+[(Remove )2(backslash\(\))0(.)]548.8 bull3
+[(Fix the )2(SMSW)0( and )2(SLDT)0( instructions.)]531.8 bull3
+[2(-O2)0( and )2(-O3)0( are no longer aliases for )2(-O10)0( and )2(-O15)0(. If you mean the latter, please say so! :\))]514.8 bull3
+[{/section-C.2.4 xa}(Version 0.98.36)](C.2.4)495.6 subh3
+[(Update rdoff \226 librarian/archiver \226 common rec \226 docs!)]478.6 bull3
+[(Fix signed/unsigned problems.)]461.6 bull3
+[(Fix )2(JMP FAR label)0( and )2(CALL FAR label)0(.)]444.6 bull3
+[(Add new multisection support \226 map files \226 fix align bug)]427.6 bull3
+[(Fix sysexit, movhps/movlps reg,reg bugs in insns.dat)]410.6 bull3
+[2(Q)0( or )2(O)0( suffixes indicate octal)]393.6 bull3
+[(Support Prescott new instructions \(PNI\).)]376.6 bull3
+[(Cyrix )2(XSTORE)0( instruction.)]359.6 bull3
+[{/section-C.2.5 xa}(Version 0.98.35)](C.2.5)340.4 subh3
+[(Fix build failure on 16-bit DOS \(Makefile.bc3 workaround for compiler bug.\))]323.4 bull3
+[(Fix dependencies and compiler warnings.)]306.4 bull3
+[(Add "const" in a number of places.)]289.4 bull3
+[(Add \226X option to specify error reporting format \(use \226Xvc to integrate with Microsoft Visual Studio.\))]272.4 bull3
+[(Minor changes for code legibility.)]255.4 bull3
+[(Drop use of tmpnam\(\) in rdoff \(security fix.\))]238.4 bull3
+[{/section-C.2.6 xa}(Version 0.98.34)](C.2.6)219.2 subh3
+[(Correct additional address-size vs. operand-size confusions.)]202.2 bull3
+[(Generate dependencies for all Makefiles automatically.)]185.2 bull3
+[(Add support for unimplemented \(but theoretically available\) registers such as tr0 and cr5. Segment)]168.2 bull1
+[(registers 6 and 7 are called segr6 and segr7 for the operations which they can be represented.)]157.2 bull2
+[(Correct some disassembler bugs related to redundant address-size prefixes. Some work still remains in this)]140.2 bull1
+[(area.)]129.2 bull2
+[(Correctly generate an error for things like "SEG eax".)]112.2 bull3
+(187)pageodd
+restore showpage
+%%Page: 188 188
+%%BeginPageSetup
+save
+%%EndPageSetup
+/188 pa
+[(Add the JMPE instruction, enabled by "CPU IA64".)]681 bull3
+[(Correct compilation on newer gcc/glibc platforms.)]664 bull3
+[(Issue an error on things like "jmp far eax".)]647 bull3
+[{/section-C.2.7 xa}(Version 0.98.33)](C.2.7)627.8 subh3
+[(New __NASM_PATCHLEVEL__ and __NASM_VERSION_ID__ standard macros to round out the)]610.8 bull1
+[(version-query macros. version.pl now understands X.YYplWW or X.YY.ZZplWW as a version number,)]599.8 bull0
+[(equivalent to X.YY.ZZ.WW \(or X.YY.0.WW, as appropriate\).)]588.8 bull2
+[(New keyword "strict" to disable the optimization of specific operands.)]571.8 bull3
+[(Fix the handing of size overrides with JMP instructions \(instructions such as "jmp dword foo".\))]554.8 bull3
+[(Fix the handling of "ABSOLUTE label", where "label" points into a relocatable segment.)]537.8 bull3
+[(Fix OBJ output format with lots of externs.)]520.8 bull3
+[(More documentation updates.)]503.8 bull3
+[(Add \226Ov option to get verbose information about optimizations.)]486.8 bull3
+[(Undo a braindead change which broke )2(%elif)0( directives.)]469.8 bull3
+[(Makefile updates.)]452.8 bull3
+[{/section-C.2.8 xa}(Version 0.98.32)](C.2.8)433.6 subh3
+[(Fix NASM crashing when )2(%macro)0( directives were left unterminated.)]416.6 bull3
+[(Lots of documentation updates.)]399.6 bull3
+[(Complete rewrite of the PostScript/PDF documentation generator.)]382.6 bull3
+[(The MS Visual C++ Makefile was updated and corrected.)]365.6 bull3
+[(Recognize .rodata as a standard section name in ELF.)]348.6 bull3
+[(Fix some obsolete Perl4-isms in Perl scripts.)]331.6 bull3
+[(Fix configure.in to work with autoconf 2.5x.)]314.6 bull3
+[(Fix a couple of "make cleaner" misses.)]297.6 bull3
+[(Make the normal "./configure && make" work with Cygwin.)]280.6 bull3
+[{/section-C.2.9 xa}(Version 0.98.31)](C.2.9)261.4 subh3
+[(Correctly build in a separate object directory again.)]244.4 bull3
+[(Derive all references to the version number from the version file.)]227.4 bull3
+[(New standard macros __NASM_SUBMINOR__ and __NASM_VER__ macros.)]210.4 bull3
+[(Lots of Makefile updates and bug fixes.)]193.4 bull3
+[(New )2(%ifmacro)0( directive to test for multiline macros.)]176.4 bull3
+[(Documentation updates.)]159.4 bull3
+[(Fixes for 16-bit OBJ format output.)]142.4 bull3
+[(Changed the NASM environment variable to NASMENV.)]125.4 bull3
+(188)pageeven
+restore showpage
+%%Page: 189 189
+%%BeginPageSetup
+save
+%%EndPageSetup
+/189 pa
+[{/section-C.2.10 xa}(Version 0.98.30)](C.2.10)678.8 subh3
+[(Changed doc files a lot: completely removed old READMExx and Wishlist files, incorporating all)]661.8 bull1
+[(information in CHANGES and TODO.)]650.8 bull2
+[(I waited a long time to rename zoutieee.c to \(original\) outieee.c)]633.8 bull3
+[(moved all output modules to output/ subdirectory.)]616.8 bull3
+[(Added 'make strip' target to strip debug info from nasm & ndisasm.)]599.8 bull3
+[(Added INSTALL file with installation instructions.)]582.8 bull3
+[(Added \226v option description to nasm man.)]565.8 bull3
+[(Added dist makefile target to produce source distributions.)]548.8 bull3
+[(16-bit support for ELF output format \(GNU extension, but useful.\))]531.8 bull3
+[{/section-C.2.11 xa}(Version 0.98.28)](C.2.11)512.6 subh3
+[(Fastcooked this for Debian's Woody release: Frank applied the INCBIN bug patch to 0.98.25alt and called)]495.6 bull1
+[(it 0.98.28 to not confuse poor little apt-get.)]484.6 bull2
+[{/section-C.2.12 xa}(Version 0.98.26)](C.2.12)465.4 subh3
+[(Reorganised files even better from 0.98.25alt)]448.4 bull3
+[{/section-C.2.13 xa}(Version 0.98.25alt)](C.2.13)429.2 subh3
+[(Prettified the source tree. Moved files to more reasonable places.)]412.2 bull3
+[(Added findleak.pl script to misc/ directory.)]395.2 bull3
+[(Attempted to fix doc.)]378.2 bull3
+[{/section-C.2.14 xa}(Version 0.98.25)](C.2.14)359 subh3
+[(Line continuation character )2(\\)0(.)]342 bull3
+[(Docs inadvertantly reverted \226 "dos packaging".)]325 bull3
+[{/section-C.2.15 xa}(Version 0.98.24p1)](C.2.15)305.8 subh3
+[(FIXME: Someone, document this please.)]288.8 bull3
+[{/section-C.2.16 xa}(Version 0.98.24)](C.2.16)269.6 subh3
+[(Documentation \226 Ndisasm doc added to Nasm.doc.)]252.6 bull3
+[{/section-C.2.17 xa}(Version 0.98.23)](C.2.17)233.4 subh3
+[(Attempted to remove rdoff version1)]216.4 bull3
+[(Lino Mastrodomenico's patches to preproc.c \(%$$ bug?\).)]199.4 bull3
+[{/section-C.2.18 xa}(Version 0.98.22)](C.2.18)180.2 subh3
+[(Update rdoff2 \226 attempt to remove v1.)]163.2 bull3
+[{/section-C.2.19 xa}(Version 0.98.21)](C.2.19)144 subh3
+[(Optimization fixes.)]127 bull3
+(189)pageodd
+restore showpage
+%%Page: 190 190
+%%BeginPageSetup
+save
+%%EndPageSetup
+/190 pa
+[{/section-C.2.20 xa}(Version 0.98.20)](C.2.20)678.8 subh3
+[(Optimization fixes.)]661.8 bull3
+[{/section-C.2.21 xa}(Version 0.98.19)](C.2.21)642.6 subh3
+[(H. J. Lu's patch back out.)]625.6 bull3
+[{/section-C.2.22 xa}(Version 0.98.18)](C.2.22)606.4 subh3
+[(Added ".rdata" to "-f win32".)]589.4 bull3
+[{/section-C.2.23 xa}(Version 0.98.17)](C.2.23)570.2 subh3
+[(H. J. Lu's "bogus elf" patch. \(Red Hat problem?\))]553.2 bull3
+[{/section-C.2.24 xa}(Version 0.98.16)](C.2.24)534 subh3
+[(Fix whitespace before "[section ..." bug.)]517 bull3
+[{/section-C.2.25 xa}(Version 0.98.15)](C.2.25)497.8 subh3
+[(Rdoff changes \(?\).)]480.8 bull3
+[(Fix fixes to memory leaks.)]463.8 bull3
+[{/section-C.2.26 xa}(Version 0.98.14)](C.2.26)444.6 subh3
+[(Fix memory leaks.)]427.6 bull3
+[{/section-C.2.27 xa}(Version 0.98.13)](C.2.27)408.4 subh3
+[(There was no 0.98.13)]391.4 bull3
+[{/section-C.2.28 xa}(Version 0.98.12)](C.2.28)372.2 subh3
+[(Update optimization \(new function of "-O1"\))]355.2 bull3
+[(Changes to test/bintest.asm \(?\).)]338.2 bull3
+[{/section-C.2.29 xa}(Version 0.98.11)](C.2.29)319 subh3
+[(Optimization changes.)]302 bull3
+[(Ndisasm fixed.)]285 bull3
+[{/section-C.2.30 xa}(Version 0.98.10)](C.2.30)265.8 subh3
+[(There was no 0.98.10)]248.8 bull3
+[{/section-C.2.31 xa}(Version 0.98.09)](C.2.31)229.6 subh3
+[(Add multiple sections support to "-f bin".)]212.6 bull3
+[(Changed GLOBAL_TEMP_BASE in outelf.c from 6 to 15.)]195.6 bull3
+[(Add "-v" as an alias to the "-r" switch.)]178.6 bull3
+[(Remove "#ifdef" from Tasm compatibility options.)]161.6 bull3
+[(Remove redundant size-overrides on "mov ds, ex", etc.)]144.6 bull3
+[(Fixes to SSE2, other insns.dat \(?\).)]127.6 bull3
+[(Enable uppercase "I" and "P" switches.)]110.6 bull3
+(190)pageeven
+restore showpage
+%%Page: 191 191
+%%BeginPageSetup
+save
+%%EndPageSetup
+/191 pa
+[(Case insinsitive "seg" and "wrt".)]681 bull3
+[(Update install.sh \(?\).)]664 bull3
+[(Allocate tokens in blocks.)]647 bull3
+[(Improve "invalid effective address" messages.)]630 bull3
+[{/section-C.2.32 xa}(Version 0.98.08)](C.2.32)610.8 subh3
+[(Add ")2(%strlen)0(" and ")2(%substr)0(" macro operators)]593.8 bull3
+[(Fixed broken c16.mac.)]576.8 bull3
+[(Unterminated string error reported.)]559.8 bull3
+[(Fixed bugs as per 0.98bf)]542.8 bull3
+[{/section-C.2.33 xa}(Version 0.98.09b with John Coffman patches released 28-Oct-2001)](C.2.33)523.6 subh3
+[(Changes from 0.98.07 release to 98.09b as of 28-Oct-2001)]506.6 norm3
+[(More closely compatible with 0.98 when \226O0 is implied or specified. Not strictly identical, since backward)]489.6 bull1
+[(branches in range of short offsets are recognized, and signed byte values with no explicit size specification)]478.6 bull0
+[(will be assembled as a single byte.)]467.6 bull2
+[(More forgiving with the PUSH instruction. 0.98 requires a size to be specified always. 0.98.09b will imply)]450.6 bull1
+[(the size from the current BITS setting \(16 or 32\).)]439.6 bull2
+[(Changed definition of the optimization flag:)]422.6 bull3
+[(\226O0 strict two-pass assembly, JMP and Jcc are handled more like 0.98, except that back- ward JMPs are)]405.6 norm1
+[(short, if possible.)]394.6 norm2
+[(\226O1 strict two-pass assembly, but forward branches are assembled with code guaranteed to reach; may)]377.6 norm1
+[(produce larger code than \226O0, but will produce successful assembly more often if branch offset sizes are not)]366.6 norm0
+[(specified.)]355.6 norm2
+[(\226O2 multi-pass optimization, minimize branch offsets; also will minimize signed immed- iate bytes,)]338.6 norm1
+[(overriding size specification.)]327.6 norm2
+[(\226O3 like \226O2, but more passes taken, if needed)]310.6 norm3
+[{/section-C.2.34 xa}(Version 0.98.07 released 01/28/01)](C.2.34)291.4 subh3
+[(Added Stepane Denis' SSE2 instructions to a *working* version of the code \226 some earlier versions were)]274.4 bull1
+[(based on broken code \226 sorry 'bout that. version "0.98.07")]263.4 bull2
+[(01/28/01)]246.4 norm3
+[(Cosmetic modifications to nasm.c, nasm.h, AUTHORS, MODIFIED)]229.4 bull3
+[{/section-C.2.35 xa}(Version 0.98.06f released 01/18/01)](C.2.35)210.2 subh3
+[(\226 Add "metalbrain"s jecxz bug fix in insns.dat \226 alter nasmdoc.src to match \226 version "0.98.06f")]193.2 bull3
+[{/section-C.2.36 xa}(Version 0.98.06e released 01/09/01)](C.2.36)174 subh3
+[(Removed the "outforms.h" file \226 it appears to be someone's old backup of "outform.h". version "0.98.06e")]157 bull3
+[(01/09/01)]140 norm3
+[(fbk \226 finally added the fix for the "multiple %includes bug", known since 7/27/99 \226 reported originally \(?\))]123 bull1
+[(and sent to us by Austin Lunnen \226 he reports that John Fine had a fix within the day. Here it is...)]112 bull2
+(191)pageodd
+restore showpage
+%%Page: 192 192
+%%BeginPageSetup
+save
+%%EndPageSetup
+/192 pa
+[(Nelson Rush resigns from the group. Big thanks to Nelson for his leadership and enthusiasm in getting)]681 bull1
+[(these changes incorporated into Nasm!)]670 bull2
+[(fbk \226 [list +], [list \226] directives \226 ineptly implemented, should be re-written or removed, perhaps.)]653 bull3
+[(Brian Raiter / fbk \226 "elfso bug" fix \226 applied to aoutb format as well \226 testing might be desirable...)]636 bull3
+[(08/07/00)]619 norm3
+[(James Seter \226 \226postfix, \226prefix command line switches.)]602 bull3
+[(Yuri Zaporogets \226 rdoff utility changes.)]585 bull3
+[{/section-C.2.37 xa}(Version 0.98p1)](C.2.37)565.8 subh3
+[(GAS-like palign \(Panos Minos\))]548.8 bull3
+[(FIXME: Someone, fill this in with details)]531.8 bull3
+[{/section-C.2.38 xa}(Version 0.98bf \(bug-fixed\))](C.2.38)512.6 subh3
+[(Fixed \226 elf and aoutb bug \226 shared libraries \226 multiple "%include" bug in "-f obj" \226 jcxz, jecxz bug \226)]495.6 bull1
+[(unrecognized option bug in ndisasm)]484.6 bull2
+[{/section-C.2.39 xa}(Version 0.98.03 with John Coffman's changes released 27-Jul-2000)](C.2.39)465.4 subh3
+[(Added signed byte optimizations for the 0x81/0x83 class of instructions: ADC, ADD, AND, CMP, OR,)]448.4 bull1
+[(SBB, SUB, XOR: when used as 'ADD reg16,imm' or 'ADD reg32,imm.' Also optimization of signed byte)]437.4 bull0
+[(form of 'PUSH imm' and 'IMUL reg,imm'/'IMUL reg,reg,imm.' No size specification is needed.)]426.4 bull2
+[(Added multi-pass JMP and Jcc offset optimization. Offsets on forward references will preferentially use)]409.4 bull1
+[(the short form, without the need to code a specific size \(short or near\) for the branch. Added instructions)]398.4 bull0
+[(for 'Jcc label' to use the form 'Jnotcc $+3/JMP label', in cases where a short offset is out of bounds. If)]387.4 bull0
+[(compiling for a 386 or higher CPU, then the 386 form of Jcc will be used instead.)]376.4 bull2
+[(This feature is controlled by a new command-line switch: "O", \(upper case letter O\). "-O0" reverts the)]359.4 norm1
+[(assembler to no extra optimization passes, "-O1" allows up to 5 extra passes, and "-O2"\(default\), allows up)]348.4 norm0
+[(to 10 extra optimization passes.)]337.4 norm2
+[(Added a new directive: 'cpu XXX', where XXX is any of: 8086, 186, 286, 386, 486, 586, pentium, 686,)]320.4 bull1
+[(PPro, P2, P3 or Katmai. All are case insensitive. All instructions will be selected only if they apply to the)]309.4 bull0
+[(selected cpu or lower. Corrected a couple of bugs in cpu-dependence in 'insns.dat'.)]298.4 bull2
+[(Added to 'standard.mac', the "use16" and "use32" forms of the "bits 16/32" directive. This is nothing new,)]281.4 bull1
+[(just conforms to a lot of other assemblers. \(minor\))]270.4 bull2
+[(Changed label allocation from 320/32 \(10000 labels @ 200K+\) to 32/37 \(1000 labels\); makes running)]253.4 bull1
+[(under DOS much easier. Since additional label space is allocated dynamically, this should have no effect)]242.4 bull0
+[(on large programs with lots of labels. The 37 is a prime, believed to be better for hashing. \(minor\))]231.4 bull2
+[{/section-C.2.40 xa}(Version 0.98.03)](C.2.40)212.2 subh3
+[("Integrated patchfile 0.98-0.98.01. I call this version 0.98.03 for historical reasons: 0.98.02 was trashed.")]195.2 norm1
+[(\226\226John Coffman <johninsd@san.rr.com>, 27-Jul-2000)]184.2 norm2
+[(Kendall Bennett's SciTech MGL changes)]167.2 bull3
+[(Note that you must define "TASM_COMPAT" at compile-time to get the Tasm Ideal Mode compatibility.)]150.2 bull3
+[(All changes can be compiled in and out using the TASM_COMPAT macros, and when compiled without)]133.2 bull1
+[(TASM_COMPAT defined we get the exact same binary as the unmodified 0.98 sources.)]122.2 bull2
+[(standard.mac, macros.c: Added macros to ignore TASM directives before first include)]105.2 bull3
+(192)pageeven
+restore showpage
+%%Page: 193 193
+%%BeginPageSetup
+save
+%%EndPageSetup
+/193 pa
+[(nasm.h: Added extern declaration for tasm_compatible_mode)]681 bull3
+[(nasm.c: Added global variable tasm_compatible_mode)]664 bull3
+[(Added command line switch for TASM compatible mode \(-t\))]647 bull3
+[(Changed version command line to reflect when compiled with TASM additions)]630 bull3
+[(Added response file processing to allow all arguments on a single line \(response file is @resp rather than)]613 bull1
+[(\226@resp for NASM format\).)]602 bull2
+[(labels.c: Changes islocal\(\) macro to support TASM style @@local labels.)]585 bull3
+[(Added islocalchar\(\) macro to support TASM style @@local labels.)]568 bull3
+[(parser.c: Added support for TASM style memory references \(ie: mov [DWORD eax],10 rather than the)]551 bull1
+[(NASM style mov DWORD [eax],10\).)]540 bull2
+[(preproc.c: Added new directives, )2(%arg)0(, )2(%local)0(, )2(%stacksize)0( to directives table)]523 bull3
+[(Added support for TASM style directives without a leading % symbol.)]506 bull3
+[(Integrated a block of changes from Andrew Zabolotny <bit@eltech.ru>:)]489 bull3
+[(A new keyword )2(%xdefine)0( and its case-insensitive counterpart )2(%ixdefine)0(. They work almost the)]472 bull1
+[(same way as )2(%define)0( and )2(%idefine)0( but expand the definition immediately, not on the invocation.)]461 bull0
+[(Something like a cross between )2(%define)0( and )2(%assign)0(. The "x" suffix stands for "eXpand", so)]450 bull0
+[("xdefine" can be deciphered as "expand-and-define". Thus you can do things like this:)]439 bull2
+[2(     %assign ofs     0 )]422 code1
+[2()]411 code0
+[2(     %macro  arg     1 )]400 code0
+[2(             %xdefine %1 dword [esp+ofs] )]389 code0
+[2(             %assign ofs ofs+4 )]378 code0
+[2(     %endmacro)]367 code2
+[(Changed the place where the expansion of %$name macros are expanded. Now they are converted into)]350 bull1
+[(..@ctxnum.name form when detokenizing, so there are no quirks as before when using %$name arguments)]339 bull0
+[(to macros, in macros etc. For example:)]328 bull2
+[2(     %macro  abc     1 )]311 code1
+[2(             %define %1 hello )]300 code0
+[2(     %endm )]289 code0
+[2()]278 code0
+[2(     abc     %$here )]267 code0
+[2(     %$here)]256 code2
+[(Now last line will be expanded into "hello" as expected. This also allows for lots of goodies, a good example)]239 norm1
+[(are extended "proc" macros included in this archive.)]228 norm2
+[(Added a check for "cstk" in smacro_defined\(\) before calling get_ctx\(\) \226 this allows for things like:)]211 bull3
+[2(     %ifdef %$abc )]194 code1
+[2(     %endif)]183 code2
+[(to work without warnings even in no context.)]166 norm3
+[(Added a check for "cstk" in %if*ctx and %elif*ctx directives \226 this allows to use )2(%ifctx)0( without)]149 bull1
+[(excessive warnings. If there is no active context, )2(%ifctx)0( goes through "false" branch.)]138 bull2
+[(Removed "user error: " prefix with )2(%error)0( directive: it just clobbers the output and has absolutely no)]121 bull1
+[(functionality. Besides, this allows to write macros that does not differ from built-in functions in any way.)]110 bull2
+(193)pageodd
+restore showpage
+%%Page: 194 194
+%%BeginPageSetup
+save
+%%EndPageSetup
+/194 pa
+[(Added expansion of string that is output by )2(%error)0( directive. Now you can do things like:)]681 bull3
+[2(     %define hello\(x\) Hello, x! )]664 code1
+[2()]653 code0
+[2(     %define %$name andy )]642 code0
+[2(     %error "hello\(%$name\)")]631 code2
+[(Same happened with )2(%include)0( directive.)]614 norm3
+[(Now all directives that expect an identifier will try to expand and concatenate everything without)]597 bull1
+[(whitespaces in between before usage. For example, with "unfixed" nasm the commands)]586 bull2
+[2(     %define %$abc hello )]569 code1
+[2(     %define __%$abc goodbye )]558 code0
+[2(     __%$abc)]547 code2
+[(would produce "incorrect" output: last line will expand to)]530 norm3
+[2(     hello goodbyehello)]513 code3
+[(Not quite what you expected, eh? :-\) The answer is that preprocessor treats the )2(%define)0( construct as if it)]496 norm1
+[(would be)]485 norm2
+[2(     %define __ %$abc goodbye)]468 code3
+[(\(note the white space between __ and %$abc\). After my "fix" it will "correctly" expand into)]451 norm3
+[2(     goodbye)]434 code3
+[(as expected. Note that I use quotes around words "correct", "incorrect" etc because this is rather a feature not)]417 norm1
+[(a bug; however current behaviour is more logical \(and allows more advanced macro usage :-\).)]406 norm2
+[(Same change was applied to: )2(%push)0(,)2(%macro)0(,)2(%imacro)0(,)2(%define)0(,)2(%idefine)0(,)2(%xdefine)0(,)2(%ixdefine)0(,)]389 norm1
+[2(%assign)0(,)2(%iassign)0(,)2(%undef)]378 norm2
+[(A new directive [WARNING {+|-}warning-id] have been added. It works only if the assembly phase is)]361 bull1
+[(enabled \(i.e. it doesn't work with nasm \226e\).)]350 bull2
+[(A new warning type: macro-selfref. By default this warning is disabled; when enabled NASM warns when)]333 bull1
+[(a macro self-references itself; for example the following source:)]322 bull2
+[2(       [WARNING macro-selfref] )]305 code1
+[2()]294 code0
+[2(       %macro          push    1-* )]283 code0
+[2(               %rep    %0 )]272 code0
+[2(                       push    %1 )]261 code0
+[2(                       %rotate 1 )]250 code0
+[2(               %endrep )]239 code0
+[2(       %endmacro )]228 code0
+[2()]217 code0
+[2(                       push    eax,ebx,ecx)]206 code2
+[(will produce a warning, but if we remove the first line we won't see it anymore \(which is The Right Thing To)]189 norm1
+[(Do {tm} IMHO since C preprocessor eats such constructs without warnings at all\).)]178 norm2
+[(Added a "error" routine to preprocessor which always will set ERR_PASS1 bit in severity_code. This)]161 bull1
+[(removes annoying repeated errors on first and second passes from preprocessor.)]150 bull2
+[(Added the %+ operator in single-line macros for concatenating two identifiers. Usage example:)]133 bull3
+(194)pageeven
+restore showpage
+%%Page: 195 195
+%%BeginPageSetup
+save
+%%EndPageSetup
+/195 pa
+[2(       %define _myfunc _otherfunc )]681 code1
+[2(       %define cextern\(x\) _ %+ x )]670 code0
+[2(       cextern \(myfunc\))]659 code2
+[(After first expansion, third line will become "_myfunc". After this expansion is performed again so it)]642 norm1
+[(becomes "_otherunc".)]631 norm2
+[(Now if preprocessor is in a non-emitting state, no warning or error will be emitted. Example:)]614 bull3
+[2(       %if 1 )]597 code1
+[2(               mov     eax,ebx )]586 code0
+[2(       %else )]575 code0
+[2(               put anything you want between these two brackets, )]564 code0
+[2(               even macro-parameter references %1 or local )]553 code0
+[2(               labels %$zz or macro-local labels %%zz - no )]542 code0
+[2(               warning will be emitted. )]531 code0
+[2(       %endif)]520 code2
+[(Context-local variables on expansion as a last resort are looked up in outer contexts. For example, the)]503 bull1
+[(following piece:)]492 bull2
+[2(       %push   outer )]475 code1
+[2(       %define %$a [esp] )]464 code0
+[2()]453 code0
+[2(               %push   inner )]442 code0
+[2(               %$a )]431 code0
+[2(               %pop )]420 code0
+[2(       %pop)]409 code2
+[(will expand correctly the fourth line to [esp]; if we'll define another %$a inside the "inner" context, it will)]392 norm1
+[(take precedence over outer definition. However, this modification has been applied only to expand_smacro)]381 norm0
+[(and not to smacro_define: as a consequence expansion looks in outer contexts, but )2(%ifdef)0( won't look in)]370 norm0
+[(outer contexts.)]359 norm2
+[(This behaviour is needed because we don't want nested contexts to act on already defined local macros.)]342 norm1
+[(Example:)]331 norm2
+[2(       %define %$arg1  [esp+4] )]314 code1
+[2(       test    eax,eax )]303 code0
+[2(       if      nz )]292 code0
+[2(               mov     eax,%$arg1 )]281 code0
+[2(       endif)]270 code2
+[(In this example the "if" mmacro enters into the "if" context, so %$arg1 is not valid anymore inside "if". Of)]253 norm1
+[(course it could be worked around by using explicitely %$$arg1 but this is ugly IMHO.)]242 norm2
+[(Fixed memory leak in )2(%undef)0(. The origline wasn't freed before exiting on success.)]225 bull3
+[(Fixed trap in preprocessor when line expanded to empty set of tokens. This happens, for example, in the)]208 bull1
+[(following case:)]197 bull2
+[2(       #define SOMETHING )]180 code1
+[2(       SOMETHING)]169 code2
+[{/section-C.2.41 xa}(Version 0.98)](C.2.41)149.8 subh3
+[(All changes since NASM 0.98p3 have been produced by H. Peter Anvin <hpa@zytor.com>.)]132.8 norm3
+[(The documentation comment delimiter is)]115.8 bull3
+(195)pageodd
+restore showpage
+%%Page: 196 196
+%%BeginPageSetup
+save
+%%EndPageSetup
+/196 pa
+[(Allow EQU definitions to refer to external labels; reported by Pedro Gimeno.)]681 bull3
+[(Re-enable support for RDOFF v1; reported by Pedro Gimeno.)]664 bull3
+[(Updated License file per OK from Simon and Julian.)]647 bull3
+[{/section-C.2.42 xa}(Version 0.98p9)](C.2.42)627.8 subh3
+[(Update documentation \(although the instruction set reference will have to wait; I don't want to hold up the)]610.8 bull1
+[(0.98 release for it.\))]599.8 bull2
+[(Verified that the NASM implementation of the PEXTRW and PMOVMSKB instructions is correct. The)]582.8 bull1
+[(encoding differs from what the Intel manuals document, but the Pentium III behaviour matches NASM, not)]571.8 bull0
+[(the Intel manuals.)]560.8 bull2
+[(Fix handling of implicit sizes in PSHUFW and PINSRW, reported by Stefan Hoffmeister.)]543.8 bull3
+[(Resurrect the \226s option, which was removed when changing the diagnostic output to stdout.)]526.8 bull3
+[{/section-C.2.43 xa}(Version 0.98p8)](C.2.43)507.6 subh3
+[(Fix for "DB" when NASM is running on a bigendian machine.)]490.6 bull3
+[(Invoke insns.pl once for each output script, making Makefile.in legal for "make \226j".)]473.6 bull3
+[(Improve the Unix configure-based makefiles to make package creation easier.)]456.6 bull3
+[(Included an RPM .spec file for building RPM \(RedHat Package Manager\) packages on Linux or Unix)]439.6 bull1
+[(systems.)]428.6 bull2
+[(Fix Makefile dependency problems.)]411.6 bull3
+[(Change src/rdsrc.pl to include sectioning information in info output; required for install-info to work.)]394.6 bull3
+[(Updated the RDOFF distribution to version 2 from Jules; minor massaging to make it compile in my)]377.6 bull1
+[(environment.)]366.6 bull2
+[(Split doc files that can be built by anyone with a Perl interpreter off into a separate archive.)]349.6 bull3
+[("Dress rehearsal" release!)]332.6 bull3
+[{/section-C.2.44 xa}(Version 0.98p7)](C.2.44)313.4 subh3
+[(Fixed opcodes with a third byte-sized immediate argument to not complain if given "byte" on the)]296.4 bull1
+[(immediate.)]285.4 bull2
+[(Allow )2(%undef)0( to remove single-line macros with arguments. This matches the behaviour of #undef in the)]268.4 bull1
+[(C preprocessor.)]257.4 bull2
+[(Allow \226d, \226u, \226i and \226p to be specified as \226D, \226U, \226I and \226P for compatibility with most C compilers and)]240.4 bull1
+[(preprocessors. This allows Makefile options to be shared between cc and nasm, for example.)]229.4 bull2
+[(Minor cleanups.)]212.4 bull3
+[(Went through the list of Katmai instructions and hopefully fixed the \(rather few\) mistakes in it.)]195.4 bull3
+[(\(Hopefully\) fixed a number of disassembler bugs related to ambiguous instructions \(disambiguated by \226p\))]178.4 bull1
+[(and SSE instructions with REP.)]167.4 bull2
+[(Fix for bug reported by Mark Junger: "call dword 0x12345678" should work and may add an OSP)]150.4 bull1
+[(\(affected CALL, JMP, Jcc\).)]139.4 bull2
+[(Fix for environments when "stderr" isn't a compile-time constant.)]122.4 bull3
+(196)pageeven
+restore showpage
+%%Page: 197 197
+%%BeginPageSetup
+save
+%%EndPageSetup
+/197 pa
+[{/section-C.2.45 xa}(Version 0.98p6)](C.2.45)678.8 subh3
+[(Took officially over coordination of the 0.98 release; so drop the p3.x notation. Skipped p4 and p5 to avoid)]661.8 bull1
+[(confusion with John Fine's J4 and J5 releases.)]650.8 bull2
+[(Update the documentation; however, it still doesn't include documentation for the various new)]633.8 bull1
+[(instructions. I somehow wonder if it makes sense to have an instruction set reference in the assembler)]622.8 bull0
+[(manual when Intel et al have PDF versions of their manuals online.)]611.8 bull2
+[(Recognize "idt" or "centaur" for the \226p option to ndisasm.)]594.8 bull3
+[(Changed error messages back to stderr where they belong, but add an \226E option to redirect them elsewhere)]577.8 bull1
+[(\(the DOS shell cannot redirect stderr.\))]566.8 bull2
+[(\226M option to generate Makefile dependencies \(based on code from Alex Verstak.\))]549.8 bull3
+[2(%undef)0( preprocessor directive, and \226u option, that undefines a single-line macro.)]532.8 bull3
+[(OS/2 Makefile \(Mkfiles/Makefile.os2\) for Borland under OS/2; from Chuck Crayne.)]515.8 bull3
+[(Various minor bugfixes \(reported by\): \226 Dangling )2(%s)0( in preproc.c \(Martin Junker\))]498.8 bull3
+[(THERE ARE KNOWN BUGS IN SSE AND THE OTHER KATMAI INSTRUCTIONS. I am on a trip)]481.8 bull1
+[(and didn't bring the Katmai instruction reference, so I can't work on them right now.)]470.8 bull2
+[(Updated the License file per agreement with Simon and Jules to include a GPL distribution clause.)]453.8 bull3
+[{/section-C.2.46 xa}(Version 0.98p3.7)](C.2.46)434.6 subh3
+[(\(Hopefully\) fixed the canned Makefiles to include the outrdf2 and zoutieee modules.)]417.6 bull3
+[(Renamed changes.asm to changed.asm.)]400.6 bull3
+[{/section-C.2.47 xa}(Version 0.98p3.6)](C.2.47)381.4 subh3
+[(Fixed a bunch of instructions that were added in 0.98p3.5 which had memory operands, and the)]364.4 bull1
+[(address-size prefix was missing from the instruction pattern.)]353.4 bull2
+[{/section-C.2.48 xa}(Version 0.98p3.5)](C.2.48)334.2 subh3
+[(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)]317.2 bull1
+[(merges the changes.)]306.2 bull2
+[(Expanded the instructions flag field to a long so we can fit more flags; mark SSE \(KNI\) and AMD or)]289.2 bull1
+[(Katmai-specific instructions as such.)]278.2 bull2
+[(Fix the "PRIV" flag on a bunch of instructions, and create new "PROT" flag for protected-mode-only)]261.2 bull1
+[(instructions \(orthogonal to if the instruction is privileged!\) and new "SMM" flag for SMM-only)]250.2 bull0
+[(instructions.)]239.2 bull2
+[(Added AMD-only SYSCALL and SYSRET instructions.)]222.2 bull3
+[(Make SSE actually work, and add new Katmai MMX instructions.)]205.2 bull3
+[(Added a \226p \(preferred vendor\) option to ndisasm so that it can distinguish e.g. Cyrix opcodes also used in)]188.2 bull1
+[(SSE. For example:)]177.2 bull2
+[2(     ndisasm -p cyrix aliased.bin )]160.2 code1
+[2(     00000000  670F514310        paddsiw mm0,[ebx+0x10] )]149.2 code0
+[2(     00000005  670F514320        paddsiw mm0,[ebx+0x20] )]138.2 code0
+[2(     ndisasm -p intel aliased.bin )]127.2 code0
+[2(     00000000  670F514310        sqrtps xmm0,[ebx+0x10] )]116.2 code0
+[2(     00000005  670F514320        sqrtps xmm0,[ebx+0x20])]105.2 code2
+(197)pageodd
+restore showpage
+%%Page: 198 198
+%%BeginPageSetup
+save
+%%EndPageSetup
+/198 pa
+[(Added a bunch of Cyrix-specific instructions.)]681 bull3
+[{/section-C.2.49 xa}(Version 0.98p3.4)](C.2.49)661.8 subh3
+[(Made at least an attempt to modify all the additional Makefiles \(in the Mkfiles directory\). I can't test it, but)]644.8 bull1
+[(this was the best I could do.)]633.8 bull2
+[(DOS DJGPP+"Opus Make" Makefile from John S. Fine.)]616.8 bull3
+[(changes.asm changes from John S. Fine.)]599.8 bull3
+[{/section-C.2.50 xa}(Version 0.98p3.3)](C.2.50)580.6 subh3
+[(Patch from Conan Brink to allow nesting of )2(%rep)0( directives.)]563.6 bull3
+[(If we're going to allow INT01 as an alias for INT1/ICEBP \(one of Jules 0.98p3 changes\), then we should)]546.6 bull1
+[(allow INT03 as an alias for INT3 as well.)]535.6 bull2
+[(Updated changes.asm to include the latest changes.)]518.6 bull3
+[(Tried to clean up the <CR>s that had snuck in from a DOS/Windows environment into my Unix)]501.6 bull1
+[(environment, and try to make sure than DOS/Windows users get them back.)]490.6 bull2
+[(We would silently generate broken tools if insns.dat wasn't sorted properly. Change insns.pl so that the)]473.6 bull1
+[(order doesn't matter.)]462.6 bull2
+[(Fix bug in insns.pl \(introduced by me\) which would cause conditional instructions to have an extra "cc" in)]445.6 bull1
+[(disassembly, e.g. "jnz" disassembled as "jccnz".)]434.6 bull2
+[{/section-C.2.51 xa}(Version 0.98p3.2)](C.2.51)415.4 subh3
+[(Merged in John S. Fine's changes from his 0.98-J4 prerelease; see http://www.csoft.net/cz/johnfine/)]398.4 bull3
+[(Changed previous "spotless" Makefile target \(appropriate for distribution\) to "distclean", and added)]381.4 bull1
+[("cleaner" target which is same as "clean" except deletes files generated by Perl scripts; "spotless" is union.)]370.4 bull2
+[(Removed BASIC programs from distribution. Get a Perl interpreter instead \(see below.\))]353.4 bull3
+[(Calling this "pre-release 3.2" rather than "p3-hpa2" because of John's contributions.)]336.4 bull3
+[(Actually link in the IEEE output format \(zoutieee.c\); fix a bunch of compiler warnings in that file. Note I)]319.4 bull1
+[(don't know what IEEE output is supposed to look like, so these changes were made "blind".)]308.4 bull2
+[{/section-C.2.52 xa}(Version 0.98p3-hpa)](C.2.52)289.2 subh3
+[(Merged nasm098p3.zip with nasm-0.97.tar.gz to create a fully buildable version for Unix systems)]272.2 bull1
+[(\(Makefile.in updates, etc.\))]261.2 bull2
+[(Changed insns.pl to create the instruction tables in nasm.h and names.c, so that a new instruction can be)]244.2 bull1
+[(added by adding it *only* to insns.dat.)]233.2 bull2
+[(Added the following new instructions: SYSENTER, SYSEXIT, FXSAVE, FXRSTOR, UD1, UD2 \(the)]216.2 bull1
+[(latter two are two opcodes that Intel guarantee will never be used; one of them is documented as UD2 in)]205.2 bull0
+[(Intel documentation, the other one just as "Undefined Opcode" \226\226 calling it UD1 seemed to make sense.\))]194.2 bull2
+[(MAX_SYMBOL was defined to be 9, but LOADALL286 and LOADALL386 are 10 characters long. Now)]177.2 bull1
+[(MAX_SYMBOL is derived from insns.dat.)]166.2 bull2
+[(A note on the BASIC programs included: forget them. insns.bas is already out of date. Get yourself a Perl)]149.2 bull1
+[(interpreter for your platform of choice at ){(http://www.cpan.org/ports/index.html)wl}(http://www.cpan.org/ports/index.html){el}(.)]138.2 bull2
+[{/section-C.2.53 xa}(Version 0.98 pre-release 3)](C.2.53)119 subh3
+[(added response file support, improved command line handling, new layout help screen)]102 bull3
+(198)pageeven
+restore showpage
+%%Page: 199 199
+%%BeginPageSetup
+save
+%%EndPageSetup
+/199 pa
+[(fixed limit checking bug, 'OUT byte nn, reg' bug, and a couple of rdoff related bugs, updated Wishlist;)]681 bull1
+[(0.98 Prerelease 3.)]670 bull2
+[{/section-C.2.54 xa}(Version 0.98 pre-release 2)](C.2.54)650.8 subh3
+[(fixed bug in outcoff.c to do with truncating section names longer than 8 characters, referencing beyond end)]633.8 bull1
+[(of string; 0.98 pre-release 2)]622.8 bull2
+[{/section-C.2.55 xa}(Version 0.98 pre-release 1)](C.2.55)603.6 subh3
+[(Fixed a bug whereby STRUC didn't work at all in RDF.)]586.6 bull3
+[(Fixed a problem with group specification in PUBDEFs in OBJ.)]569.6 bull3
+[(Improved ease of adding new output formats. Contribution due to Fox Cutter.)]552.6 bull3
+[(Fixed a bug in relocations in the `bin' format: was showing up when a relocatable reference crossed an)]535.6 bull1
+[(8192-byte boundary in any output section.)]524.6 bull2
+[(Fixed a bug in local labels: local-label lookups were inconsistent between passes one and two if an EQU)]507.6 bull1
+[(occurred between the definition of a global label and the subsequent use of a local label local to that global.)]496.6 bull2
+[(Fixed a seg-fault in the preprocessor \(again\) which happened when you use a blank line as the first line of)]479.6 bull1
+[(a multi-line macro definition and then defined a label on the same line as a call to that macro.)]468.6 bull2
+[(Fixed a stale-pointer bug in the handling of the NASM environment variable. Thanks to Thomas)]451.6 bull1
+[(McWilliams.)]440.6 bull2
+[(ELF had a hard limit on the number of sections which caused segfaults when transgressed. Fixed.)]423.6 bull3
+[(Added ability for ndisasm to read from stdin by using `-' as the filename.)]406.6 bull3
+[(ndisasm wasn't outputting the TO keyword. Fixed.)]389.6 bull3
+[(Fixed error cascade on bogus expression in )2(%if)0( \226 an error in evaluation was causing the entire )2(%if)0( to be)]372.6 bull1
+[(discarded, thus creating trouble later when the )2(%else)0( or )2(%endif)0( was encountered.)]361.6 bull2
+[(Forward reference tracking was instruction-granular not operand- granular, which was causing)]344.6 bull1
+[(286-specific code to be generated needlessly on code of the form `shr word [forwardref],1'. Thanks to Jim)]333.6 bull0
+[(Hague for sending a patch.)]322.6 bull2
+[(All messages now appear on stdout, as sending them to stderr serves no useful purpose other than to make)]305.6 bull1
+[(redirection difficult.)]294.6 bull2
+[(Fixed the problem with EQUs pointing to an external symbol \226 this now generates an error message.)]277.6 bull3
+[(Allowed multiple size prefixes to an operand, of which only the first is taken into account.)]260.6 bull3
+[(Incorporated John Fine's changes, including fixes of a large number of preprocessor bugs, some small)]243.6 bull1
+[(problems in OBJ, and a reworking of label handling to define labels before their line is assembled, rather)]232.6 bull0
+[(than after.)]221.6 bull2
+[(Reformatted a lot of the source code to be more readable. Included 'coding.txt' as a guideline for how to)]204.6 bull1
+[(format code for contributors.)]193.6 bull2
+[(Stopped nested )2(%reps)0( causing a panic \226 they now cause a slightly more friendly error message instead.)]176.6 bull3
+[(Fixed floating point constant problems \(patch by Pedro Gimeno\))]159.6 bull3
+[(Fixed the return value of insn_size\(\) not being checked for \2261, indicating an error.)]142.6 bull3
+[(Incorporated 3Dnow! instructions.)]125.6 bull3
+[(Fixed the 'mov eax, eax + ebx' bug.)]108.6 bull3
+(199)pageodd
+restore showpage
+%%Page: 200 200
+%%BeginPageSetup
+save
+%%EndPageSetup
+/200 pa
+[(Fixed the GLOBAL EQU bug in ELF. Released developers release 3.)]681 bull3
+[(Incorporated John Fine's command line parsing changes)]664 bull3
+[(Incorporated David Lindauer's OMF debug support)]647 bull3
+[(Made changes for LCC 4.0 support \()2(__NASM_CDecl__)0(, removed register size specification warning)]630 bull1
+[(when sizes agree\).)]619 bull2
+[{/section-C.3 xa}(NASM 0.9 Series)](C.3)597.6 head3
+[(Revisions before 0.98.)]580.6 norm3
+[{/section-C.3.1 xa}(Version 0.97 released December 1997)](C.3.1)561.4 subh3
+[(This was entirely a bug-fix release to 0.96, which seems to have got cursed. Silly me.)]544.4 bull3
+[(Fixed stupid mistake in OBJ which caused `MOV EAX,<constant>' to fail. Caused by an error in the)]527.4 bull1
+[(`MOV EAX,<segment>' support.)]516.4 bull2
+[(ndisasm hung at EOF when compiled with lcc on Linux because lcc on Linux somehow breaks feof\(\).)]499.4 bull1
+[(ndisasm now does not rely on feof\(\).)]488.4 bull2
+[(A heading in the documentation was missing due to a markup error in the indexing. Fixed.)]471.4 bull3
+[(Fixed failure to update all pointers on realloc\(\) within extended- operand code in parser.c. Was causing)]454.4 bull1
+[(wrong behaviour and seg faults on lines such as `dd 0.0,0.0,0.0,0.0,...')]443.4 bull2
+[(Fixed a subtle preprocessor bug whereby invoking one multi-line macro on the first line of the expansion)]426.4 bull1
+[(of another, when the second had been invoked with a label defined before it, didn't expand the inner macro.)]415.4 bull2
+[(Added internal.doc back in to the distribution archives \226 it was missing in 0.96 *blush*)]398.4 bull3
+[(Fixed bug causing 0.96 to be unable to assemble its own test files, specifically objtest.asm. *blush again*)]381.4 bull3
+[(Fixed seg-faults and bogus error messages caused by mismatching )2(%rep)0( and )2(%endrep)0( within multi-line)]364.4 bull1
+[(macro definitions.)]353.4 bull2
+[(Fixed a problem with buffer overrun in OBJ, which was causing corruption at ends of long PUBDEF)]336.4 bull1
+[(records.)]325.4 bull2
+[(Separated DOS archives into main-program and documentation to reduce download size.)]308.4 bull3
+[{/section-C.3.2 xa}(Version 0.96 released November 1997)](C.3.2)289.2 subh3
+[(Fixed a bug whereby, if `nasm sourcefile' would cause a filename collision warning and put output into)]272.2 bull1
+[(`nasm.out', then `nasm sourcefile \226o outputfile' still gave the warning even though the `-o' was honoured.)]261.2 bull0
+[(Fixed name pollution under Digital UNIX: one of its header files defined R_SP, which broke the enum in)]250.2 bull0
+[(nasm.h.)]239.2 bull2
+[(Fixed minor instruction table problems: FUCOM and FUCOMP didn't have two-operand forms;)]222.2 bull1
+[(NDISASM didn't recognise the longer register forms of PUSH and POP \(eg FF F3 for PUSH BX\); TEST)]211.2 bull0
+[(mem,imm32 was flagged as undocumented; the 32-bit forms of CMOV had 16-bit operand size prefixes;)]200.2 bull0
+[(`AAD imm' and `AAM imm' are no longer flagged as undocumented because the Intel Architecture)]189.2 bull0
+[(reference documents them.)]178.2 bull2
+[(Fixed a problem with the local-label mechanism, whereby strange types of symbol \(EQUs, auto-defined)]161.2 bull1
+[(OBJ segment base symbols\) interfered with the `previous global label' value and screwed up local labels.)]150.2 bull2
+[(Fixed a bug whereby the stub preprocessor didn't communicate with the listing file generator, so that the)]133.2 bull1
+[(\226a and \226l options in conjunction would produce a useless listing file.)]122.2 bull2
+(200)pageeven
+restore showpage
+%%Page: 201 201
+%%BeginPageSetup
+save
+%%EndPageSetup
+/201 pa
+[(Merged `os2' object file format back into `obj', after discovering that `obj' _also_ shouldn't have a link)]681 bull1
+[(pass separator in a module containing a non-trivial MODEND. Flat segments are now declared using the)]670 bull0
+[(FLAT attribute. `os2' is no longer a valid object format name: use `obj'.)]659 bull2
+[(Removed the fixed-size temporary storage in the evaluator. Very very long expressions \(like `mov)]642 bull1
+[(ax,1+1+1+1+...' for two hundred 1s or so\) should now no longer crash NASM.)]631 bull2
+[(Fixed a bug involving segfaults on disassembly of MMX instructions, by changing the meaning of one of)]614 bull1
+[(the operand-type flags in nasm.h. This may cause other apparently unrelated MMX problems; it needs to)]603 bull0
+[(be tested thoroughly.)]592 bull2
+[(Fixed some buffer overrun problems with large OBJ output files. Thanks to DJ Delorie for the bug report)]575 bull1
+[(and fix.)]564 bull2
+[(Made preprocess-only mode actually listen to the )2(%line)0( markers as it prints them, so that it can report)]547 bull1
+[(errors more sanely.)]536 bull2
+[(Re-designed the evaluator to keep more sensible track of expressions involving forward references: can)]519 bull1
+[(now cope with previously-nightmare situations such as:)]508 bull2
+[2(  mov ax,foo | bar )]491 code1
+[2(  foo equ 1 )]480 code0
+[2(  bar equ 2)]469 code2
+[(Added the ALIGN and ALIGNB standard macros.)]452 bull3
+[(Added PIC support in ELF: use of WRT to obtain the four extra relocation types needed.)]435 bull3
+[(Added the ability for output file formats to define their own extensions to the GLOBAL, COMMON and)]418 bull1
+[(EXTERN directives.)]407 bull2
+[(Implemented common-variable alignment, and global-symbol type and size declarations, in ELF.)]390 bull3
+[(Implemented NEAR and FAR keywords for common variables, plus far-common element size)]373 bull1
+[(specification, in OBJ.)]362 bull2
+[(Added a feature whereby EXTERNs and COMMONs in OBJ can be given a default WRT specification)]345 bull1
+[(\(either a segment or a group\).)]334 bull2
+[(Transformed the Unix NASM archive into an auto-configuring package.)]317 bull3
+[(Added a sanity-check for people applying SEG to things which are already segment bases: this previously)]300 bull1
+[(went unnoticed by the SEG processing and caused OBJ-driver panics later.)]289 bull2
+[(Added the ability, in OBJ format, to deal with `MOV EAX,<segment>' type references: OBJ doesn't)]272 bull1
+[(directly support dword-size segment base fixups, but as long as the low two bytes of the constant term are)]261 bull0
+[(zero, a word-size fixup can be generated instead and it will work.)]250 bull2
+[(Added the ability to specify sections' alignment requirements in Win32 object files and pure binary files.)]233 bull3
+[(Added preprocess-time expression evaluation: the )2(%assign)0( \(and )2(%iassign)0(\) directive and the bare )2(%if)]216 bull1
+[(\(and )2(%elif)0(\) conditional. Added relational operators to the evaluator, for use only in )2(%if)0( constructs: the)]205 bull0
+[(standard relationals = < > <= >= <> \(and C-like synonyms == and !=\) plus low-precedence logical)]194 bull0
+[(operators &&, ^^ and ||.)]183 bull2
+[(Added a preprocessor repeat construct: )2(%rep)0( / )2(%exitrep)0( / )2(%endrep)0(.)]166 bull3
+[(Added the __FILE__ and __LINE__ standard macros.)]149 bull3
+[(Added a sanity check for number constants being greater than 0xFFFFFFFF. The warning can be disabled.)]132 bull3
+[(Added the %0 token whereby a variadic multi-line macro can tell how many parameters it's been given in)]115 bull1
+[(a specific invocation.)]104 bull2
+(201)pageodd
+restore showpage
+%%Page: 202 202
+%%BeginPageSetup
+save
+%%EndPageSetup
+/202 pa
+[(Added )2(%rotate)0(, allowing multi-line macro parameters to be cycled.)]681 bull3
+[(Added the `*' option for the maximum parameter count on multi-line macros, allowing them to take)]664 bull1
+[(arbitrarily many parameters.)]653 bull2
+[(Added the ability for the user-level forms of EXTERN, GLOBAL and COMMON to take more than one)]636 bull1
+[(argument.)]625 bull2
+[(Added the IMPORT and EXPORT directives in OBJ format, to deal with Windows DLLs.)]608 bull3
+[(Added some more preprocessor )2(%if)0( constructs: )2(%ifidn)0( / )2(%ifidni)0( \(exact textual identity\), and )2(%ifid)]591 bull1
+[(/ )2(%ifnum)0( / )2(%ifstr)0( \(token type testing\).)]580 bull2
+[(Added the ability to distinguish SHL AX,1 \(the 8086 version\) from SHL AX,BYTE 1 \(the)]563 bull1
+[(286-and-upwards version whose constant happens to be 1\).)]552 bull2
+[(Added NetBSD/FreeBSD/OpenBSD's variant of a.out format, complete with PIC shared library features.)]535 bull3
+[(Changed NASM's idiosyncratic handling of FCLEX, FDISI, FENI, FINIT, FSAVE, FSTCW, FSTENV,)]518 bull1
+[(and FSTSW to bring it into line with the otherwise accepted standard. The previous behaviour, though it)]507 bull0
+[(was a deliberate feature, was a deliberate feature based on a misunderstanding. Apologies for the)]496 bull0
+[(inconvenience.)]485 bull2
+[(Improved the flexibility of ABSOLUTE: you can now give it an expression rather than being restricted to a)]468 bull1
+[(constant, and it can take relocatable arguments as well.)]457 bull2
+[(Added the ability for a variable to be declared as EXTERN multiple times, and the subsequent definitions)]440 bull1
+[(are just ignored.)]429 bull2
+[(We now allow instruction prefixes \(CS, DS, LOCK, REPZ etc\) to be alone on a line \(without a following)]412 bull1
+[(instruction\).)]401 bull2
+[(Improved sanity checks on whether the arguments to EXTERN, GLOBAL and COMMON are valid)]384 bull1
+[(identifiers.)]373 bull2
+[(Added misc/exebin.mac to allow direct generation of .EXE files by hacking up an EXE header using DB)]356 bull1
+[(and DW; also added test/binexe.asm to demonstrate the use of this. Thanks to Yann Guidon for)]345 bull0
+[(contributing the EXE header code.)]334 bull2
+[(ndisasm forgot to check whether the input file had been successfully opened. Now it does. Doh!)]317 bull3
+[(Added the Cyrix extensions to the MMX instruction set.)]300 bull3
+[(Added a hinting mechanism to allow [EAX+EBX] and [EBX+EAX] to be assembled differently. This is)]283 bull1
+[(important since [ESI+EBP] and [EBP+ESI] have different default base segment registers.)]272 bull2
+[(Added support for the PharLap OMF extension for 4096-byte segment alignment.)]255 bull3
+[{/section-C.3.3 xa}(Version 0.95 released July 1997)](C.3.3)235.8 subh3
+[(Fixed yet another ELF bug. This one manifested if the user relied on the default segment, and attempted to)]218.8 bull1
+[(define global symbols without first explicitly declaring the target segment.)]207.8 bull2
+[(Added makefiles \(for NASM and the RDF tools\) to build Win32 console apps under Symantec C++.)]190.8 bull1
+[(Donated by Mark Junker.)]179.8 bull2
+[(Added `macros.bas' and `insns.bas', QBasic versions of the Perl scripts that convert `standard.mac' to)]162.8 bull1
+[(`macros.c' and convert `insns.dat' to `insnsa.c' and `insnsd.c'. Also thanks to Mark Junker.)]151.8 bull2
+[(Changed the diassembled forms of the conditional instructions so that JB is now emitted as JC, and other)]134.8 bull1
+[(similar changes. Suggested list by Ulrich Doewich.)]123.8 bull2
+[(Added `@' to the list of valid characters to begin an identifier with.)]106.8 bull3
+(202)pageeven
+restore showpage
+%%Page: 203 203
+%%BeginPageSetup
+save
+%%EndPageSetup
+/203 pa
+[(Documentary changes, notably the addition of the `Common Problems' section in nasm.doc.)]681 bull3
+[(Fixed a bug relating to 32-bit PC-relative fixups in OBJ.)]664 bull3
+[(Fixed a bug in perm_copy\(\) in labels.c which was causing exceptions in cleanup_labels\(\) on some systems.)]647 bull3
+[(Positivity sanity check in TIMES argument changed from a warning to an error following a further)]630 bull1
+[(complaint.)]619 bull2
+[(Changed the acceptable limits on byte and word operands to allow things like `~10111001b' to work.)]602 bull3
+[(Fixed a major problem in the preprocessor which caused seg-faults if macro definitions contained blank)]585 bull1
+[(lines or comment-only lines.)]574 bull2
+[(Fixed inadequate error checking on the commas separating the arguments to `db', `dw' etc.)]557 bull3
+[(Fixed a crippling bug in the handling of macros with operand counts defined with a `+' modifier.)]540 bull3
+[(Fixed a bug whereby object file formats which stored the input file name in the output file \(such as OBJ)]523 bull1
+[(and COFF\) weren't doing so correctly when the output file name was specified on the command line.)]512 bull2
+[(Removed [INC] and [INCLUDE] support for good, since they were obsolete anyway.)]495 bull3
+[(Fixed a bug in OBJ which caused all fixups to be output in 16-bit \(old-format\) FIXUPP records, rather)]478 bull1
+[(than putting the 32-bit ones in FIXUPP32 \(new-format\) records.)]467 bull2
+[(Added, tentatively, OS/2 object file support \(as a minor variant on OBJ\).)]450 bull3
+[(Updates to Fox Cutter's Borland C makefile, Makefile.bc2.)]433 bull3
+[(Removed a spurious second fclose\(\) on the output file.)]416 bull3
+[(Added the `-s' command line option to redirect all messages which would go to stderr \(errors, help text\) to)]399 bull1
+[(stdout instead.)]388 bull2
+[(Added the `-w' command line option to selectively suppress some classes of assembly warning messages.)]371 bull3
+[(Added the `-p' pre-include and `-d' pre-define command-line options.)]354 bull3
+[(Added an include file search path: the `-i' command line option.)]337 bull3
+[(Fixed a silly little preprocessor bug whereby starting a line with a `%!' environment-variable reference)]320 bull1
+[(caused an `unknown directive' error.)]309 bull2
+[(Added the long-awaited listing file support: the `-l' command line option.)]292 bull3
+[(Fixed a problem with OBJ format whereby, in the absence of any explicit segment definition, non-global)]275 bull1
+[(symbols declared in the implicit default segment generated spurious EXTDEF records in the output.)]264 bull2
+[(Added the NASM environment variable.)]247 bull3
+[(From this version forward, Win32 console-mode binaries will be included in the DOS distribution in)]230 bull1
+[(addition to the 16-bit binaries. Added Makefile.vc for this purpose.)]219 bull2
+[(Added `return 0;' to test/objlink.c to prevent compiler warnings.)]202 bull3
+[(Added the __NASM_MAJOR__ and __NASM_MINOR__ standard defines.)]185 bull3
+[(Added an alternative memory-reference syntax in which prefixing an operand with `&' is equivalent to)]168 bull1
+[(enclosing it in square brackets, at the request of Fox Cutter.)]157 bull2
+[(Errors in pass two now cause the program to return a non-zero error code, which they didn't before.)]140 bull3
+[(Fixed the single-line macro cycle detection, which didn't work at all on macros with no parameters)]123 bull1
+[(\(caused an infinite loop\). Also changed the behaviour of single-line macro cycle detection to work like)]112 bull0
+[(cpp, so that macros like `extrn' as given in the documentation can be implemented.)]101 bull2
+(203)pageodd
+restore showpage
+%%Page: 204 204
+%%BeginPageSetup
+save
+%%EndPageSetup
+/204 pa
+[(Fixed the implementation of WRT, which was too restrictive in that you couldn't do `mov ax,[di+abc wrt)]681 bull1
+[(dgroup]' because \(di+abc\) wasn't a relocatable reference.)]670 bull2
+[{/section-C.3.4 xa}(Version 0.94 released April 1997)](C.3.4)650.8 subh3
+[(Major item: added the macro processor.)]633.8 bull3
+[(Added undocumented instructions SMI, IBTS, XBTS and LOADALL286. Also reorganised CMPXCHG)]616.8 bull1
+[(instruction into early-486 and Pentium forms. Thanks to Thobias Jones for the information.)]605.8 bull2
+[(Fixed two more stupid bugs in ELF, which were causing `ld' to continue to seg-fault in a lot of non-trivial)]588.8 bull1
+[(cases.)]577.8 bull2
+[(Fixed a seg-fault in the label manager.)]560.8 bull3
+[(Stopped FBLD and FBSTP from _requiring_ the TWORD keyword, which is the only option for BCD)]543.8 bull1
+[(loads/stores in any case.)]532.8 bull2
+[(Ensured FLDCW, FSTCW and FSTSW can cope with the WORD keyword, if anyone bothers to provide)]515.8 bull1
+[(it. Previously they complained unless no keyword at all was present.)]504.8 bull2
+[(Some forms of FDIV/FDIVR and FSUB/FSUBR were still inverted: a vestige of a bug that I thought had)]487.8 bull1
+[(been fixed in 0.92. This was fixed, hopefully for good this time...)]476.8 bull2
+[(Another minor phase error \(insofar as a phase error can _ever_ be minor\) fixed, this one occurring in code)]459.8 bull1
+[(of the form)]448.8 bull2
+[2(  rol ax,forward_reference )]431.8 code1
+[2(  forward_reference equ 1)]420.8 code2
+[(The number supplied to TIMES is now sanity-checked for positivity, and also may be greater than 64K)]403.8 bull1
+[(\(which previously didn't work on 16-bit systems\).)]392.8 bull2
+[(Added Watcom C makefiles, and misc/pmw.bat, donated by Dominik Behr.)]375.8 bull3
+[(Added the INCBIN pseudo-opcode.)]358.8 bull3
+[(Due to the advent of the preprocessor, the [INCLUDE] and [INC] directives have become obsolete. They)]341.8 bull1
+[(are still supported in this version, with a warning, but won't be in the next.)]330.8 bull2
+[(Fixed a bug in OBJ format, which caused incorrect object records to be output when absolute labels were)]313.8 bull1
+[(made global.)]302.8 bull2
+[(Updates to RDOFF subdirectory, and changes to outrdf.c.)]285.8 bull3
+[{/section-C.3.5 xa}(Version 0.93 released January 1997)](C.3.5)266.6 subh3
+[(This release went out in a great hurry after semi-crippling bugs were found in 0.92.)]249.6 norm3
+[(Really )1(did)0( fix the stack overflows this time. *blush*)]232.6 bull3
+[(Had problems with EA instruction sizes changing between passes, when an offset contained a forward)]215.6 bull1
+[(reference and so 4 bytes were allocated for the offset in pass one; by pass two the symbol had been defined)]204.6 bull0
+[(and happened to be a small absolute value, so only 1 byte got allocated, causing instruction size mismatch)]193.6 bull0
+[(between passes and hence incorrect address calculations. Fixed.)]182.6 bull2
+[(Stupid bug in the revised ELF section generation fixed \(associated string-table section for .symtab was)]165.6 bull1
+[(hard-coded as 7, even when this didn't fit with the real section table\). Was causing `ld' to seg-fault under)]154.6 bull0
+[(Linux.)]143.6 bull2
+[(Included a new Borland C makefile, Makefile.bc2, donated by Fox Cutter <lmb@comtch.iea.com>.)]126.6 bull3
+(204)pageeven
+restore showpage
+%%Page: 205 205
+%%BeginPageSetup
+save
+%%EndPageSetup
+/205 pa
+[{/section-C.3.6 xa}(Version 0.92 released January 1997)](C.3.6)678.8 subh3
+[(The FDIVP/FDIVRP and FSUBP/FSUBRP pairs had been inverted: this was fixed. This also affected the)]661.8 bull1
+[(LCC driver.)]650.8 bull2
+[(Fixed a bug regarding 32-bit effective addresses of the form )2([other_register+ESP])0(.)]633.8 bull3
+[(Documentary changes, notably documentation of the fact that Borland Win32 compilers use `obj' rather)]616.8 bull1
+[(than `win32' object format.)]605.8 bull2
+[(Fixed the COMENT record in OBJ files, which was formatted incorrectly.)]588.8 bull3
+[(Fixed a bug causing segfaults in large RDF files.)]571.8 bull3
+[(OBJ format now strips initial periods from segment and group definitions, in order to avoid complications)]554.8 bull1
+[(with the local label syntax.)]543.8 bull2
+[(Fixed a bug in disassembling far calls and jumps in NDISASM.)]526.8 bull3
+[(Added support for user-defined sections in COFF and ELF files.)]509.8 bull3
+[(Compiled the DOS binaries with a sensible amount of stack, to prevent stack overflows on any arithmetic)]492.8 bull1
+[(expression containing parentheses.)]481.8 bull2
+[(Fixed a bug in handling of files that do not terminate in a newline.)]464.8 bull3
+[{/section-C.3.7 xa}(Version 0.91 released November 1996)](C.3.7)445.6 subh3
+[(Loads of bug fixes.)]428.6 bull3
+[(Support for RDF added.)]411.6 bull3
+[(Support for DBG debugging format added.)]394.6 bull3
+[(Support for 32-bit extensions to Microsoft OBJ format added.)]377.6 bull3
+[(Revised for Borland C: some variable names changed, makefile added.)]360.6 bull3
+[(LCC support revised to actually work.)]343.6 bull3
+[(JMP/CALL NEAR/FAR notation added.)]326.6 bull3
+[(`a16', `o16', `a32' and `o32' prefixes added.)]309.6 bull3
+[(Range checking on short jumps implemented.)]292.6 bull3
+[(MMX instruction support added.)]275.6 bull3
+[(Negative floating point constant support added.)]258.6 bull3
+[(Memory handling improved to bypass 64K barrier under DOS.)]241.6 bull3
+[2($)0( prefix to force treatment of reserved words as identifiers added.)]224.6 bull3
+[(Default-size mechanism for object formats added.)]207.6 bull3
+[(Compile-time configurability added.)]190.6 bull3
+[2(#)0(, )2(@)0(, )2(~)0( and c{?} are now valid characters in labels.)]173.6 bull3
+[2(-e)0( and )2(-k)0( options in NDISASM added.)]156.6 bull3
+[{/section-C.3.8 xa}(Version 0.90 released October 1996)](C.3.8)137.4 subh3
+[(First release version. First support for object file output. Other changes from previous version \(0.3x\) too)]120.4 norm1
+[(numerous to document.)]109.4 norm2
+(205)pageodd
+restore showpage
+%%Page: 206 206
+%%BeginPageSetup
+save
+%%EndPageSetup
+/206 pa
+[{/index xa}(Index)]642.8 chap3
+[2(!)0( operator, unary)][{/34 pl}(34){el}]607.8 0 idx03
+[2(!=)0( operator)][{/50 pl}(50){el}]596.8 0 idx03
+[2($$)0( token)][{/33 pl}(33,){el}( ){/86 pl}(86){el}]585.8 0 idx03
+[2($)][]574.8 0 idx03
+[(Here token)][{/33 pl}(33){el}]563.8 0 idx13
+[(prefix)][{/26 pl}(26,){el}( ){/29 pl}(29,){el}( ){/89 pl}(89){el}]552.8 0 idx13
+[2(%)0( operator)][{/33 pl}(33){el}]541.8 0 idx03
+[2(%!)][{/60 pl}(60){el}]530.8 0 idx03
+[2(%$)0( and )2(%$$)0( prefixes)][{/54 pl}(54,){el}( ){/55 pl}(55){el}]519.8 0 idx03
+[2(%%)0( operator)][{/33 pl}(33,){el}( ){/44 pl}(44){el}]508.8 0 idx03
+[2(%+)][{/39 pl}(39){el}]497.8 0 idx03
+[2(%?)][{/39 pl}(39){el}]486.8 0 idx03
+[2(%??)][{/39 pl}(39){el}]475.8 0 idx03
+[2(%[)][{/39 pl}(39){el}]464.8 0 idx03
+[2(&)0( operator)][{/33 pl}(33){el}]453.8 0 idx03
+[2(&&)0( operator)][{/50 pl}(50){el}]442.8 0 idx03
+[2(*)0( operator)][{/33 pl}(33){el}]431.8 0 idx03
+[2(+)0( modifier)][{/44 pl}(44){el}]420.8 0 idx03
+[2(+)0( operator)][]409.8 0 idx03
+[(binary)][{/33 pl}(33){el}]398.8 0 idx13
+[(unary)][{/34 pl}(34){el}]387.8 0 idx13
+[2(-)0( operator)][]376.8 0 idx03
+[(binary)][{/33 pl}(33){el}]365.8 0 idx13
+[(unary)][{/34 pl}(34){el}]354.8 0 idx13
+[2(..@)0( symbol prefix)][{/36 pl}(36,){el}( ){/44 pl}(44){el}]343.8 0 idx03
+[2(/)0( operator)][{/33 pl}(33){el}]332.8 0 idx03
+[2(//)0( operator)][{/33 pl}(33){el}]321.8 0 idx03
+[2(<)0( operator)][{/50 pl}(50){el}]310.8 0 idx03
+[2(<<)0( operator)][{/33 pl}(33){el}]299.8 0 idx03
+[2(<=)0( operator)][{/50 pl}(50){el}]288.8 0 idx03
+[2(<>)0( operator)][{/50 pl}(50){el}]277.8 0 idx03
+[2(=)0( operator)][{/50 pl}(50){el}]266.8 0 idx03
+[2(==)0( operator)][{/50 pl}(50){el}]255.8 0 idx03
+[2(>)0( operator)][{/50 pl}(50){el}]244.8 0 idx03
+[2(>=)0( operator)][{/50 pl}(50){el}]233.8 0 idx03
+[2(>>)0( operator)][{/33 pl}(33){el}]222.8 0 idx03
+[2(?)0( MASM syntax)][{/27 pl}(27){el}]211.8 0 idx03
+[2(^)0( operator)][{/33 pl}(33){el}]200.8 0 idx03
+[2(^^)0( operator)][{/50 pl}(50){el}]189.8 0 idx03
+[2(|)0( operator)][{/33 pl}(33){el}]178.8 0 idx03
+[2(||)0( operator)][{/50 pl}(50){el}]167.8 0 idx03
+[2(~)0( operator)][{/34 pl}(34){el}]156.8 0 idx03
+[2(%0)0( parameter count)][{/45 pl}(45){el}]145.8 0 idx03
+[2(%+1)0( and )2(%-1)0( syntax)][{/47 pl}(47){el}]134.8 0 idx03
+[(16-bit mode, versus 32-bit mode)][{/67 pl}(67){el}]123.8 0 idx03
+[(64-bit displacement)][{/114 pl}(114){el}]112.8 0 idx03
+[(64-bit immediate)][{/113 pl}(113){el}]101.8 0 idx03
+[2(-a)0( option)][{/21 pl}(21,){el}( ){/120 pl}(120){el}]607.8 1 idx03
+[2(A16)][{/26 pl}(26){el}]596.8 1 idx03
+[2(a16)][{/111 pl}(111){el}]585.8 1 idx03
+[2(A32)][{/26 pl}(26){el}]574.8 1 idx03
+[2(a32)][{/111 pl}(111){el}]563.8 1 idx03
+[2(A64)][{/26 pl}(26){el}]552.8 1 idx03
+[2(a64)][{/111 pl}(111){el}]541.8 1 idx03
+[2(a86)][{/14 pl}(14,){el}( ){/24 pl}(24,){el}( ){/25 pl}(25){el}]530.8 1 idx03
+[2(ABS)][{/29 pl}(29){el}]519.8 1 idx03
+[2(ABSOLUTE)][{/69 pl}(69,){el}( ){/76 pl}(76){el}]508.8 1 idx03
+[(addition)][{/33 pl}(33){el}]497.8 1 idx03
+[(addressing, mixed-size)][{/110 pl}(110){el}]486.8 1 idx03
+[(address-size prefixes)][{/26 pl}(26){el}]475.8 1 idx03
+[(algebra)][{/29 pl}(29){el}]464.8 1 idx03
+[2(ALIGN)][{/64 pl}(64,){el}( ){/66 pl}(66,){el}( ){/73 pl}(73,){el}( ){/76 pl}(76){el}]453.8 1 idx03
+[(smart)][{/66 pl}(66){el}]442.8 1 idx13
+[2(ALIGNB)][{/64 pl}(64){el}]431.8 1 idx03
+[(alignment)][]420.8 1 idx03
+[(in )2(bin)0( sections)][{/74 pl}(74){el}]409.8 1 idx13
+[(in )2(elf)0( sections)][{/85 pl}(85){el}]398.8 1 idx13
+[(in )2(obj)0( sections)][{/76 pl}(76){el}]387.8 1 idx13
+[(in )2(win32)0( sections)][{/79 pl}(79){el}]376.8 1 idx13
+[(of )2(elf)0( common variables)][{/87 pl}(87){el}]365.8 1 idx13
+[2(ALIGNMODE)][{/66 pl}(66){el}]354.8 1 idx03
+[2(__ALIGNMODE__)][{/66 pl}(66){el}]343.8 1 idx03
+[2(ALINK)][{/91 pl}(91){el}]332.8 1 idx03
+[2(alink.sourceforge.net)][{/91 pl}(91){el}]321.8 1 idx03
+[2(all)][{/23 pl}(23){el}]310.8 1 idx03
+[2(alloc)][{/85 pl}(85){el}]299.8 1 idx03
+[(alternate register names)][{/66 pl}(66){el}]288.8 1 idx03
+[2(alt.lang.asm)][{/14 pl}(14){el}]277.8 1 idx03
+[2(altreg)][{/66 pl}(66){el}]266.8 1 idx03
+[(ambiguity)][{/24 pl}(24){el}]255.8 1 idx03
+[2(a.out)][]244.8 1 idx03
+[(BSD version)][{/88 pl}(88){el}]233.8 1 idx13
+[(Linux version)][{/88 pl}(88){el}]222.8 1 idx13
+[2(aout)][{/88 pl}(88){el}]211.8 1 idx03
+[2(aoutb)][{/88 pl}(88,){el}( ){/106 pl}(106){el}]200.8 1 idx03
+[2(%arg)][{/57 pl}(57){el}]189.8 1 idx03
+[2(arg)][{/98 pl}(98,){el}( ){/105 pl}(105){el}]178.8 1 idx03
+[2(as86)][{/14 pl}(14,){el}( ){/88 pl}(88){el}]167.8 1 idx03
+[(assembler directives)][{/67 pl}(67){el}]156.8 1 idx03
+[(assembly-time options)][{/21 pl}(21){el}]145.8 1 idx03
+[2(%assign)][{/40 pl}(40){el}]134.8 1 idx03
+[2(ASSUME)][{/25 pl}(25){el}]123.8 1 idx03
+[2(AT)][{/63 pl}(63){el}]112.8 1 idx03
+[(Autoconf)][{/16 pl}(16){el}]101.8 1 idx03
+(206)pageeven
+restore showpage
+%%Page: 207 207
+%%BeginPageSetup
+save
+%%EndPageSetup
+/207 pa
+[2(autoexec.bat)][{/15 pl}(15){el}]681 0 idx03
+[2(auto-sync)][{/120 pl}(120){el}]670 0 idx03
+[2(-b)][{/119 pl}(119){el}]659 0 idx03
+[(bin)][{/18 pl}(18,){el}( ){/73 pl}(73){el}]648 0 idx03
+[(multisection)][{/74 pl}(74){el}]637 0 idx13
+[(binary)][{/29 pl}(29){el}]626 0 idx03
+[(binary files)][{/27 pl}(27){el}]615 0 idx03
+[(bit shift)][{/33 pl}(33){el}]604 0 idx03
+[2(BITS)][{/67 pl}(67,){el}( ){/73 pl}(73){el}]593 0 idx03
+[2(__BITS__)][{/61 pl}(61){el}]582 0 idx03
+[(bitwise AND)][{/33 pl}(33){el}]571 0 idx03
+[(bitwise OR)][{/33 pl}(33){el}]560 0 idx03
+[(bitwise XOR)][{/33 pl}(33){el}]549 0 idx03
+[(block IFs)][{/55 pl}(55){el}]538 0 idx03
+[(boot loader)][{/73 pl}(73){el}]527 0 idx03
+[(boot sector)][{/116 pl}(116){el}]516 0 idx03
+[(Borland)][]505 0 idx03
+[(Pascal)][{/99 pl}(99){el}]494 0 idx13
+[(Win32 compilers)][{/75 pl}(75){el}]483 0 idx13
+[(braces)][]472 0 idx03
+[(after )2(%)0( sign)][{/47 pl}(47){el}]461 0 idx13
+[(around macro parameters)][{/42 pl}(42){el}]450 0 idx13
+[(BSD)][{/106 pl}(106){el}]439 0 idx03
+[2(.bss)][{/85 pl}(85,){el}( ){/88 pl}(88,){el}( ){/89 pl}(89){el}]428 0 idx03
+[(bugs)][{/117 pl}(117){el}]417 0 idx03
+[2(bugtracker)][{/117 pl}(117){el}]406 0 idx03
+[2(BYTE)][{/116 pl}(116){el}]395 0 idx03
+[(C calling convention)][{/96 pl}(96,){el}( ){/103 pl}(103){el}]384 0 idx03
+[(C symbol names)][{/94 pl}(94){el}]373 0 idx03
+[2(c16.mac)][{/98 pl}(98,){el}( ){/101 pl}(101){el}]362 0 idx03
+[2(c32.mac)][{/105 pl}(105){el}]351 0 idx03
+[2(CALL FAR)][{/34 pl}(34){el}]340 0 idx03
+[(case sensitivity)][{/24 pl}(24,){el}( ){/37 pl}(37,){el}( ){/38 pl}(38,){el}( ){/40 pl}(40,){el}( ){/42 pl}(42,){el}( ){/43 pl}(43,){el}( ){/50 pl}(50,){el}( ){/77 pl}(77){el}]329 0 idx03
+[(changing sections)][{/68 pl}(68){el}]318 0 idx03
+[(character constant)][{/27 pl}(27,){el}( ){/31 pl}(31){el}]307 0 idx03
+[(character strings)][{/30 pl}(30){el}]296 0 idx03
+[(circular references)][{/37 pl}(37){el}]285 0 idx03
+[2(CLASS)][{/76 pl}(76){el}]274 0 idx03
+[2(%clear)][{/60 pl}(60){el}]263 0 idx03
+[2(coff)][{/85 pl}(85){el}]252 0 idx03
+[(colon)][{/26 pl}(26){el}]241 0 idx03
+[2(.COM)][{/73 pl}(73,){el}( ){/93 pl}(93){el}]230 0 idx03
+[(command-line)][{/17 pl}(17,){el}( ){/73 pl}(73){el}]219 0 idx03
+[(commas in macro parameters)][{/45 pl}(45){el}]208 0 idx03
+[2(.comment)][{/85 pl}(85){el}]197 0 idx03
+[2(COMMON)][{/70 pl}(70,){el}( ){/75 pl}(75){el}]186 0 idx03
+[2(elf)0( extensions to)][{/87 pl}(87){el}]175 0 idx13
+[2(obj)0( extensions to)][{/78 pl}(78){el}]164 0 idx13
+[(Common Object File Format)][{/85 pl}(85){el}]153 0 idx03
+[(common variables)][{/70 pl}(70){el}]142 0 idx03
+[(alignment in )2(elf)][{/87 pl}(87){el}]131 0 idx13
+[(element size)][{/78 pl}(78){el}]120 0 idx13
+[2(comp.lang.asm.x86)][{/14 pl}(14,){el}( ){/15 pl}(15){el}]109 0 idx03
+[2(comp.os.msdos.programmer)][{/94 pl}(94){el}]681 1 idx03
+[(concatenating macro parameters)][{/46 pl}(46){el}]670 1 idx03
+[(concatenating strings)][{/41 pl}(41){el}]659 1 idx03
+[(condition codes as macro parameters)][{/47 pl}(47){el}]648 1 idx03
+[(conditional assembly)][{/49 pl}(49){el}]637 1 idx03
+[(conditional jumps)][{/116 pl}(116){el}]626 1 idx03
+[(conditional-return macro)][{/47 pl}(47){el}]615 1 idx03
+[2(configure)][{/16 pl}(16){el}]604 1 idx03
+[(constants)][{/29 pl}(29){el}]593 1 idx03
+[(context stack)][{/54 pl}(54,){el}( ){/55 pl}(55){el}]582 1 idx03
+[(context-local labels)][{/54 pl}(54){el}]571 1 idx03
+[(context-local single-line macros)][{/55 pl}(55){el}]560 1 idx03
+[(counting macro parameters)][{/45 pl}(45){el}]549 1 idx03
+[2(CPU)][{/71 pl}(71){el}]538 1 idx03
+[2(CPUID)][{/31 pl}(31){el}]527 1 idx03
+[(creating contexts)][{/54 pl}(54){el}]516 1 idx03
+[(critical expression)][{/27 pl}(27,){el}( ){/35 pl}(35,){el}( ){/40 pl}(40,){el}( ){/69 pl}(69){el}]505 1 idx03
+[2(-D)0( option)][{/20 pl}(20){el}]494 1 idx03
+[2(-d)0( option)][{/20 pl}(20){el}]483 1 idx03
+[(daily development snapshots)][{/15 pl}(15){el}]472 1 idx03
+[2(.data)][{/85 pl}(85,){el}( ){/88 pl}(88,){el}( ){/89 pl}(89){el}]461 1 idx03
+[2(_DATA)][{/96 pl}(96){el}]450 1 idx03
+[2(data)][{/87 pl}(87,){el}( ){/89 pl}(89){el}]439 1 idx03
+[(data structure)][{/98 pl}(98,){el}( ){/105 pl}(105){el}]428 1 idx03
+[2(__DATE__)][{/61 pl}(61){el}]417 1 idx03
+[2(__DATE_NUM__)][{/61 pl}(61){el}]406 1 idx03
+[2(DB)][{/27 pl}(27,){el}( ){/31 pl}(31){el}]395 1 idx03
+[2(dbg)][{/90 pl}(90){el}]384 1 idx03
+[2(DD)][{/27 pl}(27,){el}( ){/31 pl}(31){el}]373 1 idx03
+[(debug information)][{/19 pl}(19){el}]362 1 idx03
+[(debug information format)][{/19 pl}(19){el}]351 1 idx03
+[(declaring structures)][{/62 pl}(62){el}]340 1 idx03
+[2(DEFAULT)][{/68 pl}(68){el}]329 1 idx03
+[2(default)][{/87 pl}(87){el}]318 1 idx03
+[(default macro parameters)][{/45 pl}(45){el}]307 1 idx03
+[(default name)][{/73 pl}(73){el}]296 1 idx03
+[(default-)2(WRT)0( mechanism)][{/78 pl}(78){el}]285 1 idx03
+[2(%define)][{/20 pl}(20,){el}( ){/37 pl}(37){el}]274 1 idx03
+[(defining sections)][{/68 pl}(68){el}]263 1 idx03
+[2(%defstr)][{/41 pl}(41){el}]252 1 idx03
+[2(%deftok)][{/41 pl}(41){el}]241 1 idx03
+[2(%depend)][{/53 pl}(53){el}]230 1 idx03
+[(design goals)][{/24 pl}(24){el}]219 1 idx03
+[(DevPac)][{/27 pl}(27,){el}( ){/35 pl}(35){el}]208 1 idx03
+[(disabling listing expansion)][{/48 pl}(48){el}]197 1 idx03
+[(division)][{/33 pl}(33){el}]186 1 idx03
+[(DJGPP)][{/85 pl}(85,){el}( ){/103 pl}(103){el}]175 1 idx03
+[2(djlink)][{/91 pl}(91){el}]164 1 idx03
+[(DLL symbols)][]153 1 idx03
+[(exporting)][{/77 pl}(77){el}]142 1 idx13
+[(importing)][{/77 pl}(77){el}]131 1 idx13
+[2(DO)][{/27 pl}(27,){el}( ){/31 pl}(31){el}]120 1 idx03
+[(DOS)][{/15 pl}(15,){el}( ){/20 pl}(20){el}]109 1 idx03
+(207)pageodd
+restore showpage
+%%Page: 208 208
+%%BeginPageSetup
+save
+%%EndPageSetup
+/208 pa
+[(DOS archive)][]681 0 idx03
+[(DOS source archive)][{/15 pl}(15){el}]670 0 idx03
+[2(DQ)][{/27 pl}(27,){el}( ){/31 pl}(31){el}]659 0 idx03
+[2(.drectve)][{/79 pl}(79){el}]648 0 idx03
+[2(DT)][{/27 pl}(27,){el}( ){/31 pl}(31){el}]637 0 idx03
+[2(DUP)][{/25 pl}(25,){el}( ){/28 pl}(28){el}]626 0 idx03
+[2(DW)][{/27 pl}(27,){el}( ){/31 pl}(31){el}]615 0 idx03
+[2(DWORD)][{/27 pl}(27){el}]604 0 idx03
+[2(DY)][{/27 pl}(27,){el}( ){/31 pl}(31){el}]593 0 idx03
+[2(-E)0( option)][{/21 pl}(21){el}]582 0 idx03
+[2(-e)0( option)][{/21 pl}(21,){el}( ){/121 pl}(121){el}]571 0 idx03
+[(effective addresses)][{/26 pl}(26,){el}( ){/28 pl}(28){el}]560 0 idx03
+[(element size, in common variables)][{/78 pl}(78){el}]549 0 idx03
+[(ELF)][{/85 pl}(85){el}]538 0 idx03
+[(shared libraries)][{/86 pl}(86){el}]527 0 idx13
+[(16-bit code and)][{/88 pl}(88){el}]516 0 idx13
+[(elf, debug formats and)][{/88 pl}(88){el}]505 0 idx03
+[2(elf32)][{/85 pl}(85){el}]494 0 idx03
+[2(elf64)][{/85 pl}(85){el}]483 0 idx03
+[2(%elif)][{/49 pl}(49,){el}( ){/50 pl}(50){el}]472 0 idx03
+[2(%elifctx)][{/50 pl}(50){el}]461 0 idx03
+[2(%elifdef)][{/49 pl}(49){el}]450 0 idx03
+[2(%elifempty)][{/52 pl}(52){el}]439 0 idx03
+[2(%elifid)][{/51 pl}(51){el}]428 0 idx03
+[2(%elifidn)][{/51 pl}(51){el}]417 0 idx03
+[2(%elifidni)][{/51 pl}(51){el}]406 0 idx03
+[2(%elifmacro)][{/50 pl}(50){el}]395 0 idx03
+[2(%elifn)][{/49 pl}(49,){el}( ){/50 pl}(50){el}]384 0 idx03
+[2(%elifnctx)][{/50 pl}(50){el}]373 0 idx03
+[2(%elifndef)][{/49 pl}(49){el}]362 0 idx03
+[2(%elifnempty)][{/52 pl}(52){el}]351 0 idx03
+[2(%elifnid)][{/51 pl}(51){el}]340 0 idx03
+[2(%elifnidn)][{/51 pl}(51){el}]329 0 idx03
+[2(%elifnidni)][{/51 pl}(51){el}]318 0 idx03
+[2(%elifnmacro)][{/50 pl}(50){el}]307 0 idx03
+[2(%elifnnum)][{/51 pl}(51){el}]296 0 idx03
+[2(%elifnstr)][{/51 pl}(51){el}]285 0 idx03
+[2(%elifntoken)][{/52 pl}(52){el}]274 0 idx03
+[2(%elifnum)][{/51 pl}(51){el}]263 0 idx03
+[2(%elifstr)][{/51 pl}(51){el}]252 0 idx03
+[2(%eliftoken)][{/52 pl}(52){el}]241 0 idx03
+[2(%else)][{/49 pl}(49){el}]230 0 idx03
+[2(endproc)][{/98 pl}(98,){el}( ){/105 pl}(105){el}]219 0 idx03
+[2(%endrep)][{/52 pl}(52){el}]208 0 idx03
+[2(ENDSTRUC)][{/62 pl}(62,){el}( ){/69 pl}(69){el}]197 0 idx03
+[(environment)][{/23 pl}(23){el}]186 0 idx03
+[2(EQU)][{/27 pl}(27,){el}( ){/28 pl}(28){el}]175 0 idx03
+[2(%error)][{/58 pl}(58){el}]164 0 idx03
+[2(error)][{/23 pl}(23){el}]153 0 idx03
+[(error messages)][{/20 pl}(20){el}]142 0 idx03
+[(error reporting format)][{/19 pl}(19){el}]131 0 idx03
+[(escape sequences)][{/30 pl}(30){el}]120 0 idx03
+[2(EVEN)][{/64 pl}(64){el}]109 0 idx03
+[(exact matches)][{/48 pl}(48){el}]681 1 idx03
+[2(.EXE)][{/75 pl}(75,){el}( ){/91 pl}(91){el}]670 1 idx03
+[2(EXE2BIN)][{/93 pl}(93){el}]659 1 idx03
+[2(EXE_begin)][{/92 pl}(92){el}]648 1 idx03
+[2(exebin.mac)][{/92 pl}(92){el}]637 1 idx03
+[2(exec)][{/85 pl}(85){el}]626 1 idx03
+[(Executable and Linkable Format)][{/85 pl}(85){el}]615 1 idx03
+[2(EXE_end)][{/92 pl}(92){el}]604 1 idx03
+[2(EXE_stack)][{/92 pl}(92){el}]593 1 idx03
+[2(%exitmacro)][{/48 pl}(48){el}]582 1 idx03
+[2(%exitrep)][{/52 pl}(52){el}]571 1 idx03
+[2(EXPORT)][{/77 pl}(77){el}]560 1 idx03
+[2(export)][{/89 pl}(89){el}]549 1 idx03
+[(exporting symbols)][{/70 pl}(70){el}]538 1 idx03
+[(expressions)][{/21 pl}(21,){el}( ){/33 pl}(33){el}]527 1 idx03
+[(extension)][{/17 pl}(17,){el}( ){/73 pl}(73){el}]516 1 idx03
+[2(EXTERN)][{/70 pl}(70){el}]505 1 idx03
+[2(obj)0( extensions to)][{/78 pl}(78){el}]494 1 idx13
+[2(rdf)0( extensions to)][{/89 pl}(89){el}]483 1 idx13
+[(extracting substrings)][{/42 pl}(42){el}]472 1 idx03
+[2(-F)0( option)][{/19 pl}(19){el}]461 1 idx03
+[2(-f)0( option)][{/18 pl}(18,){el}( ){/73 pl}(73){el}]450 1 idx03
+[(far call)][{/25 pl}(25){el}]439 1 idx03
+[(far common variables)][{/78 pl}(78){el}]428 1 idx03
+[(far pointer)][{/34 pl}(34){el}]417 1 idx03
+[2(FARCODE)][{/99 pl}(99,){el}( ){/101 pl}(101){el}]406 1 idx03
+[2(%fatal)][{/58 pl}(58){el}]395 1 idx03
+[2(__FILE__)][{/61 pl}(61){el}]384 1 idx03
+[2(FLAT)][{/76 pl}(76){el}]373 1 idx03
+[(flat memory model)][{/103 pl}(103){el}]362 1 idx03
+[(flat-form binary)][{/73 pl}(73){el}]351 1 idx03
+[2(FLOAT)][{/71 pl}(71){el}]340 1 idx03
+[2(__FLOAT__)][{/72 pl}(72){el}]329 1 idx03
+[2(__float128h__)][{/31 pl}(31){el}]318 1 idx03
+[2(__float128l__)][{/31 pl}(31){el}]307 1 idx03
+[2(__float16__)][{/31 pl}(31){el}]296 1 idx03
+[2(__float32__)][{/31 pl}(31){el}]285 1 idx03
+[2(__float64__)][{/31 pl}(31){el}]274 1 idx03
+[2(__float8__)][{/31 pl}(31){el}]263 1 idx03
+[2(__float80e__)][{/31 pl}(31){el}]252 1 idx03
+[2(__float80m__)][{/31 pl}(31){el}]241 1 idx03
+[2(__FLOAT_DAZ__)][{/72 pl}(72){el}]230 1 idx03
+[2(float-denorm)][{/22 pl}(22){el}]219 1 idx03
+[(floating-point)][]208 1 idx03
+[(constants)][{/31 pl}(31,){el}( ){/71 pl}(71){el}]197 1 idx13
+[(packed BCD constants)][{/33 pl}(33){el}]186 1 idx13
+[(floating-point)][{/25 pl}(25,){el}( ){/26 pl}(26,){el}( ){/27 pl}(27,){el}( ){/31 pl}(31){el}]175 1 idx03
+[2(float-overflow)][{/22 pl}(22){el}]164 1 idx03
+[2(__FLOAT_ROUND__)][{/72 pl}(72){el}]153 1 idx03
+[2(float-toolong)][{/23 pl}(23){el}]142 1 idx03
+[2(float-underflow)][{/23 pl}(23){el}]131 1 idx03
+[2(follows=)][{/74 pl}(74){el}]120 1 idx03
+[(format-specific directives)][{/67 pl}(67){el}]109 1 idx03
+(208)pageeven
+restore showpage
+%%Page: 209 209
+%%BeginPageSetup
+save
+%%EndPageSetup
+/209 pa
+[(frame pointer)][{/96 pl}(96,){el}( ){/100 pl}(100,){el}( ){/103 pl}(103){el}]681 0 idx03
+[(FreeBSD)][{/88 pl}(88,){el}( ){/106 pl}(106){el}]670 0 idx03
+[(FreeLink)][{/91 pl}(91){el}]659 0 idx03
+[2(ftp.simtel.net)][{/91 pl}(91){el}]648 0 idx03
+[2(function)][{/87 pl}(87,){el}( ){/89 pl}(89){el}]637 0 idx03
+[(functions)][]626 0 idx03
+[(C calling convention)][{/96 pl}(96,){el}( ){/103 pl}(103){el}]615 0 idx13
+[(Pascal calling convention)][{/100 pl}(100){el}]604 0 idx13
+[2(-g)0( option)][{/19 pl}(19){el}]593 0 idx03
+[2(gas)][{/14 pl}(14){el}]582 0 idx03
+[2(gcc)][{/14 pl}(14){el}]571 0 idx03
+[2(GLOBAL)][{/70 pl}(70){el}]560 0 idx03
+[2(aoutb)0( extensions to)][{/87 pl}(87){el}]549 0 idx13
+[2(elf)0( extensions to)][{/87 pl}(87){el}]538 0 idx13
+[2(rdf)0( extensions to)][{/89 pl}(89){el}]527 0 idx13
+[(global offset table)][{/106 pl}(106){el}]516 0 idx03
+[2(_GLOBAL_OFFSET_TABLE_)][{/86 pl}(86){el}]505 0 idx03
+[2(gnu-elf-extensions)][{/22 pl}(22){el}]494 0 idx03
+[2(..got)][{/86 pl}(86){el}]483 0 idx03
+[2(GOT)0( relocations)][{/107 pl}(107){el}]472 0 idx03
+[(GOT)][{/86 pl}(86,){el}( ){/106 pl}(106){el}]461 0 idx03
+[2(..gotoff)][{/86 pl}(86){el}]450 0 idx03
+[2(GOTOFF)0( relocations)][{/107 pl}(107){el}]439 0 idx03
+[2(..gotpc)][{/86 pl}(86){el}]428 0 idx03
+[2(GOTPC)0( relocations)][{/107 pl}(107){el}]417 0 idx03
+[2(..gottpoff)][{/87 pl}(87){el}]406 0 idx03
+[(graphics)][{/27 pl}(27){el}]395 0 idx03
+[(greedy macro parameters)][{/44 pl}(44){el}]384 0 idx03
+[2(GROUP)][{/76 pl}(76){el}]373 0 idx03
+[(groups)][{/34 pl}(34){el}]362 0 idx03
+[2(-h)][{/119 pl}(119){el}]351 0 idx03
+[(hexadecimal)][{/29 pl}(29){el}]340 0 idx03
+[2(hidden)][{/87 pl}(87){el}]329 0 idx03
+[(hybrid syntaxes)][{/24 pl}(24){el}]318 0 idx03
+[2(-I)0( option)][{/20 pl}(20){el}]307 0 idx03
+[2(-i)0( option)][{/20 pl}(20,){el}( ){/120 pl}(120){el}]296 0 idx03
+[2(%iassign)][{/40 pl}(40){el}]285 0 idx03
+[2(%idefine)][{/37 pl}(37){el}]274 0 idx03
+[2(%idefstr)][{/41 pl}(41){el}]263 0 idx03
+[2(%ideftok)][{/41 pl}(41){el}]252 0 idx03
+[2(IEND)][{/63 pl}(63){el}]241 0 idx03
+[2(%if)][{/49 pl}(49,){el}( ){/50 pl}(50){el}]230 0 idx03
+[2(%ifctx)][{/50 pl}(50,){el}( ){/55 pl}(55){el}]219 0 idx03
+[2(%ifdef)][{/49 pl}(49){el}]208 0 idx03
+[2(%ifempty)][{/52 pl}(52){el}]197 0 idx03
+[2(%ifid)][{/51 pl}(51){el}]186 0 idx03
+[2(%ifidn)][{/50 pl}(50){el}]175 0 idx03
+[2(%ifidni)][{/50 pl}(50){el}]164 0 idx03
+[2(%ifmacro)][{/49 pl}(49){el}]153 0 idx03
+[2(%ifn)][{/49 pl}(49,){el}( ){/50 pl}(50){el}]142 0 idx03
+[2(%ifnctx)][{/50 pl}(50){el}]131 0 idx03
+[2(%ifndef)][{/49 pl}(49){el}]120 0 idx03
+[2(%ifnempty)][{/52 pl}(52){el}]109 0 idx03
+[2(%ifnid)][{/51 pl}(51){el}]681 1 idx03
+[2(%ifnidn)][{/51 pl}(51){el}]670 1 idx03
+[2(%ifnidni)][{/51 pl}(51){el}]659 1 idx03
+[2(%ifnmacro)][{/50 pl}(50){el}]648 1 idx03
+[2(%ifnnum)][{/51 pl}(51){el}]637 1 idx03
+[2(%ifnstr)][{/51 pl}(51){el}]626 1 idx03
+[2(%ifntoken)][{/52 pl}(52){el}]615 1 idx03
+[2(%ifnum)][{/51 pl}(51){el}]604 1 idx03
+[2(%ifstr)][{/51 pl}(51){el}]593 1 idx03
+[2(%iftoken)][{/52 pl}(52){el}]582 1 idx03
+[2(%imacro)][{/42 pl}(42){el}]571 1 idx03
+[2(IMPORT)][{/77 pl}(77){el}]560 1 idx03
+[(import library)][{/77 pl}(77){el}]549 1 idx03
+[(importing symbols)][{/70 pl}(70){el}]538 1 idx03
+[2(INCBIN)][{/27 pl}(27,){el}( ){/31 pl}(31){el}]527 1 idx03
+[2(%include)][{/20 pl}(20,){el}( ){/53 pl}(53){el}]516 1 idx03
+[(include search path)][{/20 pl}(20){el}]505 1 idx03
+[(including other files)][{/53 pl}(53){el}]494 1 idx03
+[(inefficient code)][{/116 pl}(116){el}]483 1 idx03
+[(infinite loop)][{/33 pl}(33){el}]472 1 idx03
+[2(__Infinity__)][{/32 pl}(32){el}]461 1 idx03
+[(infinity)][{/32 pl}(32){el}]450 1 idx03
+[(informational section)][{/79 pl}(79){el}]439 1 idx03
+[2(INSTALL)][{/16 pl}(16){el}]428 1 idx03
+[(installing)][{/15 pl}(15){el}]417 1 idx03
+[(instances of structures)][{/63 pl}(63){el}]406 1 idx03
+[(instruction list)][{/122 pl}(122){el}]395 1 idx03
+[(intel hex)][{/74 pl}(74){el}]384 1 idx03
+[(Intel number formats)][{/32 pl}(32){el}]373 1 idx03
+[2(internal)][{/87 pl}(87){el}]362 1 idx03
+[2(%irmacro)][{/43 pl}(43){el}]351 1 idx03
+[2(ISTRUC)][{/63 pl}(63){el}]340 1 idx03
+[(iterating over macro parameters)][{/46 pl}(46){el}]329 1 idx03
+[2(ith)][{/74 pl}(74){el}]318 1 idx03
+[2(%ixdefine)][{/38 pl}(38){el}]307 1 idx03
+[2(Jcc NEAR)][{/116 pl}(116){el}]296 1 idx03
+[2(JMP DWORD)][{/110 pl}(110){el}]285 1 idx03
+[(jumps, mixed-size)][{/110 pl}(110){el}]274 1 idx03
+[2(-k)][{/121 pl}(121){el}]263 1 idx03
+[2(-l)0( option)][{/18 pl}(18){el}]252 1 idx03
+[(label prefix)][{/36 pl}(36){el}]241 1 idx03
+[2(.lbss)][{/85 pl}(85){el}]230 1 idx03
+[2(ld86)][{/88 pl}(88){el}]219 1 idx03
+[2(.ldata)][{/85 pl}(85){el}]208 1 idx03
+[2(LIBRARY)][{/89 pl}(89){el}]197 1 idx03
+[(license)][{/14 pl}(14){el}]186 1 idx03
+[2(%line)][{/59 pl}(59){el}]175 1 idx03
+[2(__LINE__)][{/61 pl}(61){el}]164 1 idx03
+[(linker, free)][{/91 pl}(91){el}]153 1 idx03
+[(Linux)][]142 1 idx03
+[2(a.out)][{/88 pl}(88){el}]131 1 idx13
+[2(as86)][{/88 pl}(88){el}]120 1 idx13
+[(ELF)][{/85 pl}(85){el}]109 1 idx13
+(209)pageodd
+restore showpage
+%%Page: 210 210
+%%BeginPageSetup
+save
+%%EndPageSetup
+/210 pa
+[(listing file)][{/18 pl}(18){el}]681 0 idx03
+[(little-endian)][{/31 pl}(31){el}]670 0 idx03
+[2(%local)][{/58 pl}(58){el}]659 0 idx03
+[(local labels)][{/35 pl}(35){el}]648 0 idx03
+[(logical AND)][{/50 pl}(50){el}]637 0 idx03
+[(logical negation)][{/34 pl}(34){el}]626 0 idx03
+[(logical OR)][{/50 pl}(50){el}]615 0 idx03
+[(logical XOR)][{/50 pl}(50){el}]604 0 idx03
+[2(.lrodata)][{/85 pl}(85){el}]593 0 idx03
+[2(-M)0( option)][{/18 pl}(18){el}]582 0 idx03
+[(Mach, object file format)][{/85 pl}(85){el}]571 0 idx03
+[(Mach-O)][{/85 pl}(85){el}]560 0 idx03
+[2(macho)][{/85 pl}(85){el}]549 0 idx03
+[2(macho32)][{/85 pl}(85){el}]538 0 idx03
+[2(macho64)][{/85 pl}(85){el}]527 0 idx03
+[(MacOS X)][{/85 pl}(85){el}]516 0 idx03
+[2(%macro)][{/42 pl}(42){el}]505 0 idx03
+[(macro indirection)][{/39 pl}(39){el}]494 0 idx03
+[(macro library)][{/20 pl}(20){el}]483 0 idx03
+[(macro processor)][{/37 pl}(37){el}]472 0 idx03
+[2(macro-defaults)][{/22 pl}(22){el}]461 0 idx03
+[(macro-local labels)][{/43 pl}(43){el}]450 0 idx03
+[2(macro-params)][{/22 pl}(22){el}]439 0 idx03
+[(macros)][{/28 pl}(28){el}]428 0 idx03
+[2(macro-selfref)][{/22 pl}(22){el}]417 0 idx03
+[2(make)][{/16 pl}(16){el}]406 0 idx03
+[(makefile dependencies)][{/18 pl}(18){el}]395 0 idx03
+[(makefiles)][{/15 pl}(15,){el}( ){/16 pl}(16){el}]384 0 idx03
+[(man pages)][{/16 pl}(16){el}]373 0 idx03
+[(map files)][{/74 pl}(74){el}]362 0 idx03
+[2(MASM)][{/14 pl}(14){el}]351 0 idx03
+[(MASM)][{/24 pl}(24,){el}( ){/28 pl}(28,){el}( ){/75 pl}(75){el}]340 0 idx03
+[2(-MD)0( option)][{/18 pl}(18){el}]329 0 idx03
+[(memory models)][{/25 pl}(25,){el}( ){/95 pl}(95){el}]318 0 idx03
+[(memory operand)][{/27 pl}(27){el}]307 0 idx03
+[(memory references)][{/24 pl}(24,){el}( ){/28 pl}(28){el}]296 0 idx03
+[2(-MF)0( option)][{/18 pl}(18){el}]285 0 idx03
+[2(-MG)0( option)][{/18 pl}(18){el}]274 0 idx03
+[(Microsoft OMF)][{/75 pl}(75){el}]263 0 idx03
+[(minifloat)][{/32 pl}(32){el}]252 0 idx03
+[(Minix)][{/88 pl}(88){el}]241 0 idx03
+[2(misc)0( subdirectory)][{/92 pl}(92,){el}( ){/98 pl}(98,){el}( ){/105 pl}(105){el}]230 0 idx03
+[(mixed-language program)][{/94 pl}(94){el}]219 0 idx03
+[(mixed-size addressing)][{/110 pl}(110){el}]208 0 idx03
+[(mixed-size instruction)][{/110 pl}(110){el}]197 0 idx03
+[(MMX registers)][]186 0 idx03
+[(ModR/M byte)][]175 0 idx03
+[2(MODULE)][{/89 pl}(89){el}]164 0 idx03
+[(modulo operators)][{/33 pl}(33){el}]153 0 idx03
+[(motorola s-records)][{/74 pl}(74){el}]142 0 idx03
+[2(-MP)0( option)][{/19 pl}(19){el}]131 0 idx03
+[2(-MQ)0( option)][{/19 pl}(19){el}]120 0 idx03
+[(MS-DOS)][{/73 pl}(73){el}]109 0 idx03
+[(MS-DOS device drivers)][{/94 pl}(94){el}]681 1 idx03
+[2(-MT)0( option)][{/19 pl}(19){el}]670 1 idx03
+[(multi-line macros)][{/22 pl}(22,){el}( ){/42 pl}(42){el}]659 1 idx03
+[(multipass optimization)][{/21 pl}(21){el}]648 1 idx03
+[(multiple section names)][{/73 pl}(73){el}]637 1 idx03
+[(multiplication)][{/33 pl}(33){el}]626 1 idx03
+[2(multipush)0( macro)][{/46 pl}(46){el}]615 1 idx03
+[(multisection)][{/74 pl}(74){el}]604 1 idx03
+[2(__NaN__)][{/32 pl}(32){el}]593 1 idx03
+[(NaN)][{/32 pl}(32){el}]582 1 idx03
+[(NASM version)][{/60 pl}(60){el}]571 1 idx03
+[(nasm version history)][{/181 pl}(181){el}]560 1 idx03
+[(nasm version id)][{/60 pl}(60){el}]549 1 idx03
+[(nasm version string)][{/60 pl}(60){el}]538 1 idx03
+[2(nasm.1)][{/16 pl}(16){el}]527 1 idx03
+[2(__NASMDEFSEG)][{/75 pl}(75){el}]516 1 idx03
+[2(nasm-devel)][{/15 pl}(15){el}]505 1 idx03
+[2(NASMENV)][{/23 pl}(23){el}]494 1 idx03
+[2(nasm.exe)][{/15 pl}(15){el}]483 1 idx03
+[2(nasm -hf)][{/18 pl}(18){el}]472 1 idx03
+[2(__NASM_MAJOR__)][{/60 pl}(60){el}]461 1 idx03
+[2(__NASM_MINOR__)][{/60 pl}(60){el}]450 1 idx03
+[2(nasm.out)][{/18 pl}(18){el}]439 1 idx03
+[2(___NASM_PATCHLEVEL__)][{/60 pl}(60){el}]428 1 idx03
+[2(__NASM_SNAPSHOT__)][{/60 pl}(60){el}]417 1 idx03
+[2(__NASM_SUBMINOR__)][{/60 pl}(60){el}]406 1 idx03
+[2(__NASM_VER__)][{/60 pl}(60){el}]395 1 idx03
+[2(__NASM_VERSION_ID__)][{/60 pl}(60){el}]384 1 idx03
+[2(nasm-XXX-dos.zip)][{/15 pl}(15){el}]373 1 idx03
+[2(nasm-XXX.tar.gz)][{/16 pl}(16){el}]362 1 idx03
+[2(nasm-XXX-win32.zip)][{/15 pl}(15){el}]351 1 idx03
+[2(nasm-XXX.zip)][{/15 pl}(15){el}]340 1 idx03
+[(ndisasm)][{/119 pl}(119){el}]329 1 idx03
+[2(ndisasm.1)][{/16 pl}(16){el}]318 1 idx03
+[2(ndisasm.exe)][{/15 pl}(15){el}]307 1 idx03
+[(near call)][{/25 pl}(25){el}]296 1 idx03
+[(near common variables)][{/78 pl}(78){el}]285 1 idx03
+[(NetBSD)][{/88 pl}(88,){el}( ){/106 pl}(106){el}]274 1 idx03
+[(new releases)][{/15 pl}(15){el}]263 1 idx03
+[2(noalloc)][{/85 pl}(85){el}]252 1 idx03
+[2(nobits)][{/74 pl}(74,){el}( ){/85 pl}(85){el}]241 1 idx03
+[2(noexec)][{/85 pl}(85){el}]230 1 idx03
+[2(.nolist)][{/48 pl}(48){el}]219 1 idx03
+[(`nowait')][{/25 pl}(25){el}]208 1 idx03
+[2(nowrite)][{/85 pl}(85){el}]197 1 idx03
+[2(number-overflow)][{/22 pl}(22){el}]186 1 idx03
+[(numeric constants)][{/27 pl}(27,){el}( ){/29 pl}(29){el}]175 1 idx03
+[2(-O)0( option)][{/21 pl}(21){el}]164 1 idx03
+[2(-o)0( option)][{/17 pl}(17,){el}( ){/119 pl}(119){el}]153 1 idx03
+[2(O16)][{/26 pl}(26){el}]142 1 idx03
+[2(o16)][{/111 pl}(111){el}]131 1 idx03
+[2(O32)][{/26 pl}(26){el}]120 1 idx03
+[2(o32)][{/112 pl}(112){el}]109 1 idx03
+(210)pageeven
+restore showpage
+%%Page: 211 211
+%%BeginPageSetup
+save
+%%EndPageSetup
+/211 pa
+[2(O64)][{/26 pl}(26){el}]681 0 idx03
+[2(.OBJ)][{/91 pl}(91){el}]670 0 idx03
+[2(obj)][{/75 pl}(75){el}]659 0 idx03
+[2(object)][{/87 pl}(87,){el}( ){/89 pl}(89){el}]648 0 idx03
+[(octal)][{/29 pl}(29){el}]637 0 idx03
+[2(OF_DBG)][{/90 pl}(90){el}]626 0 idx03
+[2(OF_DEFAULT)][{/18 pl}(18){el}]615 0 idx03
+[2(OFFSET)][{/24 pl}(24){el}]604 0 idx03
+[(OMF)][{/75 pl}(75){el}]593 0 idx03
+[(omitted parameters)][{/45 pl}(45){el}]582 0 idx03
+[(one's complement)][{/34 pl}(34){el}]571 0 idx03
+[(OpenBSD)][{/88 pl}(88,){el}( ){/106 pl}(106){el}]560 0 idx03
+[(operands)][{/26 pl}(26){el}]549 0 idx03
+[(operand-size prefixes)][{/26 pl}(26){el}]538 0 idx03
+[(operating system)][{/73 pl}(73){el}]527 0 idx03
+[(writing)][{/110 pl}(110){el}]516 0 idx13
+[(operators)][{/33 pl}(33){el}]505 0 idx03
+[2(ORG)][{/73 pl}(73,){el}( ){/93 pl}(93,){el}( ){/94 pl}(94,){el}( ){/116 pl}(116){el}]494 0 idx03
+[2(orphan-labels)][{/22 pl}(22,){el}( ){/26 pl}(26){el}]483 0 idx03
+[(OS/2)][{/75 pl}(75,){el}( ){/76 pl}(76){el}]472 0 idx03
+[2(osabi)][{/85 pl}(85){el}]461 0 idx03
+[(other preprocessor directives)][{/59 pl}(59){el}]450 0 idx03
+[(out of range, jumps)][{/116 pl}(116){el}]439 0 idx03
+[(output file format)][{/18 pl}(18){el}]428 0 idx03
+[(output formats)][{/73 pl}(73){el}]417 0 idx03
+[2(__OUTPUT_FORMAT__)][{/61 pl}(61){el}]406 0 idx03
+[(overlapping segments)][{/34 pl}(34){el}]395 0 idx03
+[2(OVERLAY)][{/76 pl}(76){el}]384 0 idx03
+[(overloading)][]373 0 idx03
+[(multi-line macros)][{/43 pl}(43){el}]362 0 idx13
+[(single-line macros)][{/38 pl}(38){el}]351 0 idx13
+[2(-P)0( option)][{/20 pl}(20){el}]340 0 idx03
+[2(-p)0( option)][{/20 pl}(20,){el}( ){/53 pl}(53){el}]329 0 idx03
+[(paradox)][{/35 pl}(35){el}]318 0 idx03
+[2(PASCAL)][{/101 pl}(101){el}]307 0 idx03
+[(Pascal calling convention)][{/100 pl}(100){el}]296 0 idx03
+[2(__PASS__)][{/62 pl}(62){el}]285 0 idx03
+[(passes, assembly)][]274 0 idx03
+[2(PATH)][{/15 pl}(15){el}]263 0 idx03
+[2(%pathsearch)][{/20 pl}(20,){el}( ){/53 pl}(53){el}]252 0 idx03
+[(period)][{/35 pl}(35){el}]241 0 idx03
+[(Perl)][{/15 pl}(15){el}]230 0 idx03
+[(perverse)][{/20 pl}(20){el}]219 0 idx03
+[(PharLap)][{/76 pl}(76){el}]208 0 idx03
+[(PIC)][{/86 pl}(86,){el}( ){/88 pl}(88,){el}( ){/106 pl}(106){el}]197 0 idx03
+[2(..plt)][{/86 pl}(86){el}]186 0 idx03
+[2(PLT)0( relocations)][{/86 pl}(86,){el}( ){/108 pl}(108,){el}( ){/109 pl}(109){el}]175 0 idx03
+[(plt relocations)][{/109 pl}(109){el}]164 0 idx03
+[2(%pop)][{/54 pl}(54){el}]153 0 idx03
+[(position-independent code)][{/86 pl}(86,){el}( ){/88 pl}(88,){el}( ){/106 pl}(106){el}]142 0 idx03
+[2(--postfix)][{/23 pl}(23){el}]131 0 idx03
+[(precedence)][{/33 pl}(33){el}]120 0 idx03
+[(pre-defining macros)][{/20 pl}(20,){el}( ){/38 pl}(38){el}]109 0 idx03
+[(preferred)][{/34 pl}(34){el}]681 1 idx03
+[2(--prefix)][{/23 pl}(23){el}]670 1 idx03
+[(pre-including files)][{/20 pl}(20){el}]659 1 idx03
+[(preprocess-only mode)][{/21 pl}(21){el}]648 1 idx03
+[(preprocessor)][{/21 pl}(21,){el}( ){/28 pl}(28,){el}( ){/33 pl}(33,){el}( ){/37 pl}(37){el}]637 1 idx03
+[(preprocessor expressions)][{/21 pl}(21){el}]626 1 idx03
+[(preprocessor loops)][{/52 pl}(52){el}]615 1 idx03
+[(preprocessor variables)][{/40 pl}(40){el}]604 1 idx03
+[(primitive directives)][{/67 pl}(67){el}]593 1 idx03
+[2(PRIVATE)][{/75 pl}(75){el}]582 1 idx03
+[2(proc)][{/89 pl}(89,){el}( ){/98 pl}(98,){el}( ){/105 pl}(105){el}]571 1 idx03
+[(procedure linkage table)][{/86 pl}(86,){el}( ){/108 pl}(108,){el}( ){/109 pl}(109){el}]560 1 idx03
+[(processor mode)][{/67 pl}(67){el}]549 1 idx03
+[2(progbits)][{/74 pl}(74,){el}( ){/85 pl}(85){el}]538 1 idx03
+[(program entry point)][{/78 pl}(78,){el}( ){/91 pl}(91){el}]527 1 idx03
+[(program origin)][{/73 pl}(73){el}]516 1 idx03
+[2(protected)][{/87 pl}(87){el}]505 1 idx03
+[(pseudo-instructions)][{/27 pl}(27){el}]494 1 idx03
+[2(PUBLIC)][{/70 pl}(70,){el}( ){/75 pl}(75){el}]483 1 idx03
+[(pure binary)][{/73 pl}(73){el}]472 1 idx03
+[2(%push)][{/54 pl}(54){el}]461 1 idx03
+[2(__QNaN__)][{/32 pl}(32){el}]450 1 idx03
+[(quick start)][{/24 pl}(24){el}]439 1 idx03
+[2(QWORD)][{/27 pl}(27){el}]428 1 idx03
+[2(-r)][{/119 pl}(119){el}]417 1 idx03
+[2(rdf)][{/88 pl}(88){el}]406 1 idx03
+[2(rdoff)0( subdirectory)][{/16 pl}(16,){el}( ){/88 pl}(88,){el}( ){/89 pl}(89){el}]395 1 idx03
+[(recursive multi-line macros)][{/43 pl}(43){el}]384 1 idx03
+[(redirecting errors)][{/20 pl}(20){el}]373 1 idx03
+[2(REL)][{/29 pl}(29,){el}( ){/68 pl}(68){el}]362 1 idx03
+[(relational operators)][{/50 pl}(50){el}]351 1 idx03
+[(release candidates)][{/15 pl}(15){el}]340 1 idx03
+[(Relocatable Dynamic Object File Format)][{/88 pl}(88){el}]329 1 idx03
+[(relocations, PIC-specific)][{/86 pl}(86){el}]318 1 idx03
+[(removing contexts)][{/54 pl}(54){el}]307 1 idx03
+[(renaming contexts)][{/55 pl}(55){el}]296 1 idx03
+[2(%rep)][{/28 pl}(28,){el}( ){/52 pl}(52){el}]285 1 idx03
+[(repeating)][{/28 pl}(28,){el}( ){/52 pl}(52){el}]274 1 idx03
+[2(%repl)][{/55 pl}(55){el}]263 1 idx03
+[(reporting bugs)][{/117 pl}(117){el}]252 1 idx03
+[2(RESB)][{/25 pl}(25,){el}( ){/27 pl}(27){el}]241 1 idx03
+[2(RESD)][{/27 pl}(27){el}]230 1 idx03
+[2(RESO)][{/27 pl}(27){el}]219 1 idx03
+[2(RESQ)][{/27 pl}(27){el}]208 1 idx03
+[2(REST)][{/27 pl}(27){el}]197 1 idx03
+[2(RESW)][{/27 pl}(27){el}]186 1 idx03
+[2(RESY)][{/27 pl}(27){el}]175 1 idx03
+[2(%rmacro)][{/43 pl}(43){el}]164 1 idx03
+[2(.rodata)][{/85 pl}(85){el}]153 1 idx03
+[2(%rotate)][{/46 pl}(46){el}]142 1 idx03
+[(rotating macro parameters)][{/46 pl}(46){el}]131 1 idx03
+[2(-s)0( option)][{/20 pl}(20,){el}( ){/120 pl}(120){el}]120 1 idx03
+[(searching for include files)][{/53 pl}(53){el}]109 1 idx03
+(211)pageodd
+restore showpage
+%%Page: 212 212
+%%BeginPageSetup
+save
+%%EndPageSetup
+/212 pa
+[2(__SECT__)][{/68 pl}(68,){el}( ){/69 pl}(69){el}]681 0 idx03
+[2(SECTION)][{/68 pl}(68){el}]670 0 idx03
+[2(elf)0( extensions to)][{/85 pl}(85){el}]659 0 idx13
+[2(win32)0( extensions to)][{/79 pl}(79){el}]648 0 idx13
+[(section alignment)][]637 0 idx03
+[(in )2(bin)][{/74 pl}(74){el}]626 0 idx13
+[(in )2(elf)][{/85 pl}(85){el}]615 0 idx13
+[(in )2(obj)][{/76 pl}(76){el}]604 0 idx13
+[(in )2(win32)][{/79 pl}(79){el}]593 0 idx13
+[(section, bin extensions to)][{/73 pl}(73){el}]582 0 idx03
+[2(SEG)][{/34 pl}(34,){el}( ){/75 pl}(75){el}]571 0 idx03
+[2(SEGMENT)][{/68 pl}(68){el}]560 0 idx03
+[2(elf)0( extensions to)][{/75 pl}(75){el}]549 0 idx13
+[(segment address)][{/34 pl}(34){el}]538 0 idx03
+[(segment alignment)][]527 0 idx03
+[(in )2(bin)][{/74 pl}(74){el}]516 0 idx13
+[(in )2(obj)][{/76 pl}(76){el}]505 0 idx13
+[(segment names, Borland Pascal)][{/101 pl}(101){el}]494 0 idx03
+[(segment override)][{/25 pl}(25,){el}( ){/26 pl}(26){el}]483 0 idx03
+[(segments)][{/34 pl}(34){el}]472 0 idx03
+[(groups of)][{/76 pl}(76){el}]461 0 idx13
+[(separator character)][{/23 pl}(23){el}]450 0 idx03
+[(shared libraries)][{/88 pl}(88,){el}( ){/106 pl}(106){el}]439 0 idx03
+[(shared library)][{/87 pl}(87){el}]428 0 idx03
+[2(shift)0( command)][{/46 pl}(46){el}]417 0 idx03
+[(SIB byte)][]406 0 idx03
+[(signed division)][{/33 pl}(33){el}]395 0 idx03
+[(signed modulo)][{/33 pl}(33){el}]384 0 idx03
+[(single-line macros)][{/37 pl}(37){el}]373 0 idx03
+[(size, of symbols)][{/87 pl}(87){el}]362 0 idx03
+[2(smartalign)][{/66 pl}(66){el}]351 0 idx03
+[2(__SNaN__)][{/32 pl}(32){el}]340 0 idx03
+[(snapshots, daily development)][{/15 pl}(15){el}]329 0 idx03
+[(Solaris x86)][{/85 pl}(85){el}]318 0 idx03
+[2(-soname)][{/109 pl}(109){el}]307 0 idx03
+[(sound)][{/27 pl}(27){el}]296 0 idx03
+[(source code)][{/15 pl}(15){el}]285 0 idx03
+[(source-listing file)][{/18 pl}(18){el}]274 0 idx03
+[(square brackets)][{/24 pl}(24,){el}( ){/28 pl}(28){el}]263 0 idx03
+[2(srec)][{/74 pl}(74){el}]252 0 idx03
+[2(STACK)][{/75 pl}(75){el}]241 0 idx03
+[(stack relative preprocessor directives)][{/57 pl}(57){el}]230 0 idx03
+[2(%stacksize)][{/57 pl}(57){el}]219 0 idx03
+[(standard macro packages)][{/66 pl}(66){el}]208 0 idx03
+[(standard macros)][{/60 pl}(60){el}]197 0 idx03
+[(standardized section names)][{/68 pl}(68,){el}( ){/79 pl}(79,){el}( ){/85 pl}(85,){el}( ){/88 pl}(88,){el}( ){/89 pl}(89){el}]186 0 idx03
+[2(..start)][{/78 pl}(78,){el}( ){/91 pl}(91){el}]175 0 idx03
+[2(start=)][{/74 pl}(74){el}]164 0 idx03
+[2(stderr)][{/20 pl}(20){el}]153 0 idx03
+[2(stdout)][{/20 pl}(20){el}]142 0 idx03
+[2(%strcat)][{/41 pl}(41){el}]131 0 idx03
+[2(STRICT)][{/34 pl}(34){el}]120 0 idx03
+[(string constant)][{/27 pl}(27){el}]109 0 idx03
+[(string constants)][{/31 pl}(31){el}]681 1 idx03
+[(string length)][{/41 pl}(41){el}]670 1 idx03
+[(string manipulation in macros)][{/41 pl}(41){el}]659 1 idx03
+[(strings)][{/30 pl}(30){el}]648 1 idx03
+[2(%strlen)][{/41 pl}(41){el}]637 1 idx03
+[2(STRUC)][{/62 pl}(62,){el}( ){/69 pl}(69,){el}( ){/98 pl}(98,){el}( ){/105 pl}(105){el}]626 1 idx03
+[(stub preprocessor)][{/21 pl}(21){el}]615 1 idx03
+[2(%substr)][{/42 pl}(42){el}]604 1 idx03
+[(subtraction)][{/33 pl}(33){el}]593 1 idx03
+[(suppressible warning)][{/22 pl}(22){el}]582 1 idx03
+[(suppressing preprocessing)][{/21 pl}(21){el}]571 1 idx03
+[(switching between sections)][{/68 pl}(68){el}]560 1 idx03
+[2(..sym)][{/86 pl}(86){el}]549 1 idx03
+[(symbol sizes, specifying)][{/87 pl}(87){el}]538 1 idx03
+[(symbol types, specifying)][{/87 pl}(87){el}]527 1 idx03
+[(symbols)][]516 1 idx03
+[(exporting from DLLs)][{/77 pl}(77){el}]505 1 idx13
+[(importing from DLLs)][{/77 pl}(77){el}]494 1 idx13
+[2(synchronisation)][{/120 pl}(120){el}]483 1 idx03
+[2(.SYS)][{/73 pl}(73,){el}( ){/94 pl}(94){el}]472 1 idx03
+[2(-t)][{/22 pl}(22){el}]461 1 idx03
+[2(TASM)][{/14 pl}(14,){el}( ){/22 pl}(22){el}]450 1 idx03
+[(tasm)][{/24 pl}(24,){el}( ){/75 pl}(75){el}]439 1 idx03
+[2(.tbss)][{/85 pl}(85){el}]428 1 idx03
+[2(TBYTE)][{/25 pl}(25){el}]417 1 idx03
+[2(.tdata)][{/85 pl}(85){el}]406 1 idx03
+[2(test)0( subdirectory)][{/91 pl}(91){el}]395 1 idx03
+[(testing)][]384 1 idx03
+[(arbitrary numeric expressions)][{/50 pl}(50){el}]373 1 idx13
+[(context stack)][{/50 pl}(50){el}]362 1 idx13
+[(exact text identity)][{/50 pl}(50){el}]351 1 idx13
+[(multi-line macro existence)][{/49 pl}(49){el}]340 1 idx13
+[(single-line macro existence)][{/49 pl}(49){el}]329 1 idx13
+[(token types)][{/51 pl}(51){el}]318 1 idx13
+[2(.text)][{/85 pl}(85,){el}( ){/88 pl}(88,){el}( ){/89 pl}(89){el}]307 1 idx03
+[2(_TEXT)][{/96 pl}(96){el}]296 1 idx03
+[(thread local storage)][{/87 pl}(87){el}]285 1 idx03
+[2(__TIME__)][{/61 pl}(61){el}]274 1 idx03
+[2(__TIME_NUM__)][{/61 pl}(61){el}]263 1 idx03
+[2(TIMES)][{/27 pl}(27,){el}( ){/28 pl}(28,){el}( ){/35 pl}(35,){el}( ){/116 pl}(116,){el}( ){/117 pl}(117){el}]252 1 idx03
+[2(TLINK)][{/93 pl}(93){el}]241 1 idx03
+[2(tls)][{/85 pl}(85,){el}( ){/87 pl}(87){el}]230 1 idx03
+[2(..tlsie)][{/87 pl}(87){el}]219 1 idx03
+[(trailing colon)][{/26 pl}(26){el}]208 1 idx03
+[2(TWORD)][{/25 pl}(25,){el}( ){/27 pl}(27){el}]197 1 idx03
+[(type, of symbols)][{/87 pl}(87){el}]186 1 idx03
+[2(-U)0( option)][{/21 pl}(21){el}]175 1 idx03
+[2(-u)0( option)][{/21 pl}(21,){el}( ){/119 pl}(119){el}]164 1 idx03
+[(unary operators)][{/34 pl}(34){el}]153 1 idx03
+[2(%undef)][{/21 pl}(21,){el}( ){/40 pl}(40){el}]142 1 idx03
+[(undefining macros)][{/21 pl}(21){el}]131 1 idx03
+[(underscore, in C symbols)][{/94 pl}(94){el}]120 1 idx03
+[(Unicode)][{/30 pl}(30,){el}( ){/31 pl}(31){el}]109 1 idx03
+(212)pageeven
+restore showpage
+%%Page: 213 213
+%%BeginPageSetup
+save
+%%EndPageSetup
+/213 pa
+[(uninitialized)][{/27 pl}(27){el}]681 0 idx03
+[(uninitialized storage)][{/25 pl}(25){el}]670 0 idx03
+[(Unix)][{/16 pl}(16){el}]659 0 idx03
+[(SCO)][{/85 pl}(85){el}]648 0 idx13
+[(source archive)][{/16 pl}(16){el}]637 0 idx13
+[(System V)][{/85 pl}(85){el}]626 0 idx13
+[(UnixWare)][{/85 pl}(85){el}]615 0 idx03
+[2(%unmacro)][{/48 pl}(48){el}]604 0 idx03
+[(unrolled loops)][{/28 pl}(28){el}]593 0 idx03
+[(unsigned division)][{/33 pl}(33){el}]582 0 idx03
+[(unsigned modulo)][{/33 pl}(33){el}]571 0 idx03
+[2(UPPERCASE)][{/24 pl}(24,){el}( ){/77 pl}(77){el}]560 0 idx03
+[2(%use)][{/54 pl}(54,){el}( ){/66 pl}(66){el}]549 0 idx03
+[2(__USE_*__)][{/62 pl}(62){el}]538 0 idx03
+[2(USE16)][{/68 pl}(68,){el}( ){/76 pl}(76){el}]527 0 idx03
+[2(USE32)][{/68 pl}(68,){el}( ){/76 pl}(76){el}]516 0 idx03
+[2(user)][{/23 pl}(23){el}]505 0 idx03
+[(user-defined errors)][{/58 pl}(58){el}]494 0 idx03
+[(user-level assembler directives)][{/60 pl}(60){el}]483 0 idx03
+[(user-level directives)][{/67 pl}(67){el}]472 0 idx03
+[2(__UTC_DATE__)][{/61 pl}(61){el}]461 0 idx03
+[2(__UTC_DATE_NUM__)][{/61 pl}(61){el}]450 0 idx03
+[2(__UTC_TIME__)][{/61 pl}(61){el}]439 0 idx03
+[2(__UTC_TIME_NUM__)][{/61 pl}(61){el}]428 0 idx03
+[(UTF-16)][{/31 pl}(31){el}]417 0 idx03
+[(UTF-32)][{/31 pl}(31){el}]406 0 idx03
+[(UTF-8)][{/30 pl}(30){el}]395 0 idx03
+[2(__utf16__)][{/31 pl}(31){el}]384 0 idx03
+[2(__utf32__)][{/31 pl}(31){el}]373 0 idx03
+[2(-v)0( option)][{/23 pl}(23){el}]362 0 idx03
+[(VAL)][{/91 pl}(91){el}]351 0 idx03
+[(valid characters)][{/26 pl}(26){el}]340 0 idx03
+[(variable types)][{/24 pl}(24){el}]329 0 idx03
+[(version)][{/23 pl}(23){el}]318 0 idx03
+[(version number of NASM)][{/60 pl}(60){el}]307 0 idx03
+[2(vfollows=)][{/74 pl}(74){el}]296 0 idx03
+[(Visual C++)][{/79 pl}(79){el}]285 0 idx03
+[2(vstart=)][{/74 pl}(74){el}]274 0 idx03
+[2(-W)0( option)][{/22 pl}(22){el}]263 0 idx03
+[2(-w)0( option)][{/22 pl}(22){el}]252 0 idx03
+[2(%warning)][{/58 pl}(58){el}]241 0 idx03
+[(warnings)][{/22 pl}(22){el}]230 0 idx03
+[2([warning *warning-name])][{/23 pl}(23){el}]219 0 idx03
+[2([warning +warning-name])][{/23 pl}(23){el}]208 0 idx03
+[2([warning -warning-name])][{/23 pl}(23){el}]197 0 idx03
+[(website)][{/15 pl}(15){el}]186 0 idx03
+[2(win64)][{/81 pl}(81,){el}( ){/113 pl}(113){el}]175 0 idx03
+[(Win64)][{/75 pl}(75,){el}( ){/79 pl}(79,){el}( ){/103 pl}(103){el}]164 0 idx03
+[(Windows)][{/91 pl}(91){el}]153 0 idx03
+[(Windows 95)][]142 0 idx03
+[(Windows NT)][]131 0 idx03
+[2(write)][{/85 pl}(85){el}]120 0 idx03
+[(writing operating systems)][{/110 pl}(110){el}]109 0 idx03
+[2(WRT)][{/34 pl}(34,){el}( ){/75 pl}(75,){el}( ){/86 pl}(86,){el}( ){/87 pl}(87,){el}( ){/88 pl}(88){el}]681 1 idx03
+[2(WRT ..got)][{/107 pl}(107){el}]670 1 idx03
+[2(WRT ..gotoff)][{/107 pl}(107){el}]659 1 idx03
+[2(WRT ..gotpc)][{/107 pl}(107){el}]648 1 idx03
+[2(WRT ..plt)][{/109 pl}(109){el}]637 1 idx03
+[2(WRT ..sym)][{/108 pl}(108){el}]626 1 idx03
+[(WWW page)][]615 1 idx03
+[2(www.cpan.org)][{/15 pl}(15){el}]604 1 idx03
+[2(www.delorie.com)][{/91 pl}(91){el}]593 1 idx03
+[2(www.pcorner.com)][{/91 pl}(91){el}]582 1 idx03
+[2(-X)0( option)][{/19 pl}(19){el}]571 1 idx03
+[2(x2ftp.oulu.fi)][{/91 pl}(91){el}]560 1 idx03
+[2(%xdefine)][{/38 pl}(38){el}]549 1 idx03
+[2(-y)0( option)][{/23 pl}(23){el}]538 1 idx03
+[2(-Z)0( option)][{/20 pl}(20){el}]527 1 idx03
+(213)pageodd
+restore showpage
+%%EOF
diff --git a/doc/nasmdoc.txt b/doc/nasmdoc.txt
new file mode 100644 (file)
index 0000000..5a7286b
--- /dev/null
@@ -0,0 +1,12394 @@
+                        The Netwide Assembler: NASM
+                        ===========================
+
+Chapter 1: Introduction
+-----------------------
+
+   1.1 What Is NASM?
+
+       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 `*BSD' `a.out', `ELF',
+       `COFF', `Mach-O', Microsoft 16-bit `OBJ', `Win32' and `Win64'. 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.
+
+ 1.1.1 Why Yet Another Assembler?
+
+       The Netwide Assembler grew out of an idea on `comp.lang.asm.x86' (or
+       possibly `alt.lang.asm' - I forget which), which was essentially
+       that there didn't seem to be a good _free_ x86-series assembler
+       around, and that maybe someone ought to write one.
+
+       (*) `a86' is good, but not free, and in particular you don't get any
+           32-bit capability until you pay. It's DOS only, too.
+
+       (*) `gas' 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 `gcc', 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 _write_ anything in it. Plus you can't write
+           16-bit code in it (properly.)
+
+       (*) `as86' is specific to Minix and Linux, and (my version at least)
+           doesn't seem to have much (or any) documentation.
+
+       (*) `MASM' isn't very good, and it's (was) expensive, and it runs
+           only under DOS.
+
+       (*) `TASM' 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.
+
+       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, _please_ 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.
+
+ 1.1.2 License Conditions
+
+       Please see the file `LICENSE', 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.
+
+       Copyright 1996-2009 the NASM Authors - All rights reserved.
+
+       Redistribution and use in source and binary forms, with or without
+       modification, are permitted provided that the following conditions
+       are met:
+
+       (*) Redistributions of source code must retain the above copyright
+           notice, this list of conditions and the following disclaimer.
+
+       (*) 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.
+
+       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.
+
+   1.2 Contact Information
+
+       The current version of NASM (since about 0.98.08) is maintained by a
+       team of developers, accessible through the `nasm-devel' mailing list
+       (see below for the link). If you want to report a bug, please read
+       section 12.2 first.
+
+       NASM has a website at `http://www.nasm.us/'. If it's not there,
+       google for us!
+
+       New releases, release candidates, and daily development snapshots of
+       NASM are available from the official web site.
+
+       Announcements are posted to `comp.lang.asm.x86', and to the web site
+       `http://www.freshmeat.net/'.
+
+       If you want information about the current development status, please
+       subscribe to the `nasm-devel' email list; see link from the website.
+
+   1.3 Installation
+
+ 1.3.1 Installing NASM under MS-DOS or Windows
+
+       Once you've obtained the appropriate archive for NASM,
+       `nasm-XXX-dos.zip' or `nasm-XXX-win32.zip' (where `XXX' denotes the
+       version number of NASM contained in the archive), unpack it into its
+       own directory (for example `c:\nasm').
+
+       The archive will contain a set of executable files: the NASM
+       executable file `nasm.exe', the NDISASM executable file
+       `ndisasm.exe', and possibly additional utilities to handle the RDOFF
+       file format.
+
+       The only file NASM needs to run is its own executable, so copy
+       `nasm.exe' to a directory on your PATH, or alternatively edit
+       `autoexec.bat' to add the `nasm' directory to your `PATH' (to do
+       that under Windows XP, go to Start > Control Panel > System >
+       Advanced > Environment Variables; these instructions may work under
+       other versions of Windows as well.)
+
+       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 `PATH'), so
+       you can delete it if you need to save space; however, you may want
+       to keep the documentation or test programs.
+
+       If you've downloaded the DOS source archive, `nasm-XXX.zip', the
+       `nasm' 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 `INSTALL' in the source archive.
+
+       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
+       www.cpan.org.
+
+ 1.3.2 Installing NASM under Unix
+
+       Once you've obtained the Unix source archive for NASM,
+       `nasm-XXX.tar.gz' (where `XXX' denotes the version number of NASM
+       contained in the archive), unpack it into a directory such as
+       `/usr/local/src'. The archive, when unpacked, will create its own
+       subdirectory `nasm-XXX'.
+
+       NASM is an auto-configuring package: once you've unpacked it, `cd'
+       to the directory it's been unpacked into and type `./configure'.
+       This shell script will find the best C compiler to use for building
+       NASM and set up Makefiles accordingly.
+
+       Once NASM has auto-configured, you can type `make' to build the
+       `nasm' and `ndisasm' binaries, and then `make install' to install
+       them in `/usr/local/bin' and install the man pages `nasm.1' and
+       `ndisasm.1' in `/usr/local/man/man1'. Alternatively, you can give
+       options such as `--prefix' to the configure script (see the file
+       `INSTALL' for more details), or install the programs yourself.
+
+       NASM also comes with a set of utilities for handling the `RDOFF'
+       custom object-file format, which are in the `rdoff' subdirectory of
+       the NASM archive. You can build these with `make rdf' and install
+       them with `make rdf_install', if you want them.
+
+Chapter 2: Running NASM
+-----------------------
+
+   2.1 NASM Command-Line Syntax
+
+       To assemble a file, you issue a command of the form
+
+       nasm -f <format> <filename> [-o <output>]
+
+       For example,
+
+       nasm -f elf myfile.asm
+
+       will assemble `myfile.asm' into an `ELF' object file `myfile.o'. And
+
+       nasm -f bin myfile.asm -o myfile.com
+
+       will assemble `myfile.asm' into a raw binary file `myfile.com'.
+
+       To produce a listing file, with the hex codes output from NASM
+       displayed on the left of the original sources, use the `-l' option
+       to give a listing file name, for example:
+
+       nasm -f coff myfile.asm -l myfile.lst
+
+       To get further usage instructions from NASM, try typing
+
+       nasm -h
+
+       As `-hf', this will also list the available output file formats, and
+       what they are.
+
+       If you use Linux but aren't sure whether your system is `a.out' or
+       `ELF', type
+
+       file nasm
+
+       (in the directory in which you put the NASM binary when you
+       installed it). If it says something like
+
+       nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1
+
+       then your system is `ELF', and you should use the option `-f elf'
+       when you want NASM to produce Linux object files. If it says
+
+       nasm: Linux/i386 demand-paged executable (QMAGIC)
+
+       or something similar, your system is `a.out', and you should use
+       `-f aout' instead (Linux `a.out' systems have long been obsolete,
+       and are rare these days.)
+
+       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.
+
+ 2.1.1 The `-o' Option: Specifying the Output File Name
+
+       NASM will normally choose the name of your output file for you;
+       precisely how it does this is dependent on the object file format.
+       For Microsoft object file formats (`obj', `win32' and `win64'), it
+       will remove the `.asm' extension (or whatever extension you like to
+       use - NASM doesn't care) from your source file name and substitute
+       `.obj'. For Unix object file formats (`aout', `as86', `coff',
+       `elf32', `elf64', `ieee', `macho32' and `macho64') it will
+       substitute `.o'. For `dbg', `rdf', `ith' and `srec', it will use
+       `.dbg', `.rdf', `.ith' and `.srec', respectively, and for the `bin'
+       format it will simply remove the extension, so that `myfile.asm'
+       produces the output file `myfile'.
+
+       If the output file already exists, NASM will overwrite it, unless it
+       has the same name as the input file, in which case it will give a
+       warning and use `nasm.out' as the output file name instead.
+
+       For situations in which this behaviour is unacceptable, NASM
+       provides the `-o' command-line option, which allows you to specify
+       your desired output file name. You invoke `-o' by following it with
+       the name you wish for the output file, either with or without an
+       intervening space. For example:
+
+       nasm -f bin program.asm -o program.com 
+       nasm -f bin driver.asm -odriver.sys
+
+       Note that this is a small o, and is different from a capital O ,
+       which is used to specify the number of optimisation passes required.
+       See section 2.1.22.
+
+ 2.1.2 The `-f' Option: Specifying the Output File Format
+
+       If you do not supply the `-f' option to NASM, it will choose an
+       output file format for you itself. In the distribution versions of
+       NASM, the default is always `bin'; if you've compiled your own copy
+       of NASM, you can redefine `OF_DEFAULT' at compile time and choose
+       what you want the default to be.
+
+       Like `-o', the intervening space between `-f' and the output file
+       format is optional; so `-f elf' and `-felf' are both valid.
+
+       A complete list of the available output file formats can be given by
+       issuing the command `nasm -hf'.
+
+ 2.1.3 The `-l' Option: Generating a Listing File
+
+       If you supply the `-l' 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 section 4.3.10) on the right. For example:
+
+       nasm -f elf myfile.asm -l myfile.lst
+
+       If a list file is selected, you may turn off listing for a section
+       of your source with `[list -]', and turn it back on with `[list +]',
+       (the default, obviously). There is no "user form" (without the
+       brackets). This can be used to list only sections of interest,
+       avoiding excessively long listings.
+
+ 2.1.4 The `-M' Option: Generate Makefile Dependencies
+
+       This option can be used to generate makefile dependencies on stdout.
+       This can be redirected to a file for further processing. For
+       example:
+
+       nasm -M myfile.asm > myfile.dep
+
+ 2.1.5 The `-MG' Option: Generate Makefile Dependencies
+
+       This option can be used to generate makefile dependencies on stdout.
+       This differs from the `-M' option in that if a nonexisting file is
+       encountered, it is assumed to be a generated file and is added to
+       the dependency list without a prefix.
+
+ 2.1.6 The `-MF' Option: Set Makefile Dependency File
+
+       This option can be used with the `-M' or `-MG' options to send the
+       output to a file, rather than to stdout. For example:
+
+       nasm -M -MF myfile.dep myfile.asm
+
+ 2.1.7 The `-MD' Option: Assemble and Generate Dependencies
+
+       The `-MD' option acts as the combination of the `-M' and `-MF'
+       options (i.e. a filename has to be specified.) However, unlike the
+       `-M' or `-MG' options, `-MD' does _not_ inhibit the normal operation
+       of the assembler. Use this to automatically generate updated
+       dependencies with every assembly session. For example:
+
+       nasm -f elf -o myfile.o -MD myfile.dep myfile.asm
+
+ 2.1.8 The `-MT' Option: Dependency Target Name
+
+       The `-MT' option can be used to override the default name of the
+       dependency target. This is normally the same as the output filename,
+       specified by the `-o' option.
+
+ 2.1.9 The `-MQ' Option: Dependency Target Name (Quoted)
+
+       The `-MQ' option acts as the `-MT' option, except it tries to quote
+       characters that have special meaning in Makefile syntax. This is not
+       foolproof, as not all characters with special meaning are quotable
+       in Make.
+
+2.1.10 The `-MP' Option: Emit phony targets
+
+       When used with any of the dependency generation options, the `-MP'
+       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.
+
+2.1.11 The `-F' Option: Selecting a Debug Information Format
+
+       This option is used to select the format of the debug information
+       emitted into the output file, to be used by a debugger (or _will_
+       be). Prior to version 2.03.01, the use of this switch did _not_
+       enable output of the selected debug info format. Use `-g', see
+       section 2.1.12, to enable output. Versions 2.03.01 and later
+       automatically enable `-g' if `-F' is specified.
+
+       A complete list of the available debug file formats for an output
+       format can be seen by issuing the command `nasm -f <format> -y'. Not
+       all output formats currently support debugging output. See section
+       2.1.26.
+
+       This should not be confused with the `-f dbg' output format option
+       which is not built into NASM by default. For information on how to
+       enable it when building from the sources, see section 7.14.
+
+2.1.12 The `-g' Option: Enabling Debug Information.
+
+       This option can be used to generate debugging information in the
+       specified format. See section 2.1.11. Using `-g' without `-F'
+       results in emitting debug info in the default format, if any, for
+       the selected output format. If no debug information is currently
+       implemented in the selected output format, `-g' is _silently
+       ignored_.
+
+2.1.13 The `-X' Option: Selecting an Error Reporting Format
+
+       This option can be used to select an error reporting format for any
+       error messages that might be produced by NASM.
+
+       Currently, two error reporting formats may be selected. They are the
+       `-Xvc' option and the `-Xgnu' option. The GNU format is the default
+       and looks like this:
+
+       filename.asm:65: error: specific error message
+
+       where `filename.asm' is the name of the source file in which the
+       error was detected, `65' is the source file line number on which the
+       error was detected, `error' is the severity of the error (this could
+       be `warning'), and `specific error message' is a more detailed text
+       message which should help pinpoint the exact problem.
+
+       The other format, specified by `-Xvc' is the style used by Microsoft
+       Visual C++ and some other programs. It looks like this:
+
+       filename.asm(65) : error: specific error message
+
+       where the only difference is that the line number is in parentheses
+       instead of being delimited by colons.
+
+       See also the `Visual C++' output format, section 7.5.
+
+2.1.14 The `-Z' Option: Send Errors to a File
+
+       Under `MS-DOS' it can be difficult (though there are ways) to
+       redirect the standard-error output of a program to a file. Since
+       NASM usually produces its warning and error messages on `stderr',
+       this can make it hard to capture the errors if (for example) you
+       want to load them into an editor.
+
+       NASM therefore provides the `-Z' 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
+
+       nasm -Z myfile.err -f obj myfile.asm
+
+       In earlier versions of NASM, this option was called `-E', but it was
+       changed since `-E' is an option conventionally used for
+       preprocessing only, with disastrous results. See section 2.1.20.
+
+2.1.15 The `-s' Option: Send Errors to `stdout'
+
+       The `-s' option redirects error messages to `stdout' rather than
+       `stderr', so it can be redirected under `MS-DOS'. To assemble the
+       file `myfile.asm' and pipe its output to the `more' program, you can
+       type:
+
+       nasm -s -f obj myfile.asm | more
+
+       See also the `-Z' option, section 2.1.14.
+
+2.1.16 The `-i' Option: Include File Search Directories
+
+       When NASM sees the `%include' or `%pathsearch' directive in a source
+       file (see section 4.6.1, section 4.6.2 or section 3.2.3), 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 `-i' option. Therefore you can include files from a macro
+       library, for example, by typing
+
+       nasm -ic:\macrolib\ -f obj myfile.asm
+
+       (As usual, a space between `-i' and the path name is allowed, and
+       optional).
+
+       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 `-i' 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.
+
+       (You can use this to your advantage, if you're really perverse, by
+       noting that the option `-ifoo' will cause `%include "bar.i"' to
+       search for the file `foobar.i'...)
+
+       If you want to define a _standard_ include search path, similar to
+       `/usr/include' on Unix systems, you should place one or more `-i'
+       directives in the `NASMENV' environment variable (see section
+       2.1.28).
+
+       For Makefile compatibility with many C compilers, this option can
+       also be specified as `-I'.
+
+2.1.17 The `-p' Option: Pre-Include a File
+
+       NASM allows you to specify files to be _pre-included_ into your
+       source file, by the use of the `-p' option. So running
+
+       nasm myfile.asm -p myinc.inc
+
+       is equivalent to running `nasm myfile.asm' and placing the directive
+       `%include "myinc.inc"' at the start of the file.
+
+       For consistency with the `-I', `-D' and `-U' options, this option
+       can also be specified as `-P'.
+
+2.1.18 The `-d' Option: Pre-Define a Macro
+
+       Just as the `-p' option gives an alternative to placing `%include'
+       directives at the start of a source file, the `-d' option gives an
+       alternative to placing a `%define' directive. You could code
+
+       nasm myfile.asm -dFOO=100
+
+       as an alternative to placing the directive
+
+       %define FOO 100
+
+       at the start of the file. You can miss off the macro value, as well:
+       the option `-dFOO' is equivalent to coding `%define FOO'. This form
+       of the directive may be useful for selecting assembly-time options
+       which are then tested using `%ifdef', for example `-dDEBUG'.
+
+       For Makefile compatibility with many C compilers, this option can
+       also be specified as `-D'.
+
+2.1.19 The `-u' Option: Undefine a Macro
+
+       The `-u' option undefines a macro that would otherwise have been
+       pre-defined, either automatically or by a `-p' or `-d' option
+       specified earlier on the command lines.
+
+       For example, the following command line:
+
+       nasm myfile.asm -dFOO=100 -uFOO
+
+       would result in `FOO' _not_ being a predefined macro in the program.
+       This is useful to override options specified at a different point in
+       a Makefile.
+
+       For Makefile compatibility with many C compilers, this option can
+       also be specified as `-U'.
+
+2.1.20 The `-E' Option: Preprocess Only
+
+       NASM allows the preprocessor to be run on its own, up to a point.
+       Using the `-E' option (which requires no arguments) will cause NASM
+       to preprocess its input file, expand all the macro references,
+       remove all the comments and preprocessor directives, and print the
+       resulting file on standard output (or save it to a file, if the `-o'
+       option is also used).
+
+       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
+
+       %assign tablesize ($-tablestart)
+
+       will cause an error in preprocess-only mode.
+
+       For compatiblity with older version of NASM, this option can also be
+       written `-e'. `-E' in older versions of NASM was the equivalent of
+       the current `-Z' option, section 2.1.14.
+
+2.1.21 The `-a' Option: Don't Preprocess At All
+
+       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 `-a' option, requiring no argument, instructs NASM to
+       replace its powerful preprocessor with a stub preprocessor which
+       does nothing.
+
+2.1.22 The `-O' Option: Specifying Multipass Optimization
+
+       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.
+
+       Using the `-O' option, you can tell NASM to carry out different
+       levels of optimization. The syntax is:
+
+       (*) `-O0': No optimization. All operands take their long forms, if a
+           short form is not specified, except conditional jumps. This is
+           intended to match NASM 0.98 behavior.
+
+       (*) `-O1': Minimal optimization. As above, but immediate operands
+           which will fit in a signed byte are optimized, unless the long
+           form is specified. Conditional jumps default to the long form
+           unless otherwise specified.
+
+       (*) `-Ox' (where `x' is the actual letter `x'): Multipass
+           optimization. Minimize branch offsets and signed immediate
+           bytes, overriding size specification unless the `strict' keyword
+           has been used (see section 3.7). For compatability with earlier
+           releases, the letter `x' may also be any number greater than
+           one. This number has no effect on the actual number of passes.
+
+       The `-Ox' mode is recommended for most uses.
+
+       Note that this is a capital `O', and is different from a small `o',
+       which is used to specify the output file name. See section 2.1.1.
+
+2.1.23 The `-t' Option: Enable TASM Compatibility Mode
+
+       NASM includes a limited form of compatibility with Borland's `TASM'.
+       When NASM's `-t' option is used, the following changes are made:
+
+       (*) local labels may be prefixed with `@@' instead of `.'
+
+       (*) 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. `mov eax,[DWORD val]' is valid syntax in
+           TASM compatibility mode. Note that you lose the ability to
+           override the default address type for the instruction.
+
+       (*) unprefixed forms of some directives supported (`arg', `elif',
+           `else', `endif', `if', `ifdef', `ifdifi', `ifndef', `include',
+           `local')
+
+2.1.24 The `-w' and `-W' Options: Enable or Disable Assembly Warnings
+
+       NASM can observe many conditions during the course of assembly which
+       are worth mentioning to the user, but not a sufficiently severe
+       error to justify NASM refusing to generate an output file. These
+       conditions are reported like errors, but come up with the word
+       `warning' before the message. Warnings do not prevent NASM from
+       generating an output file and returning a success status to the
+       operating system.
+
+       Some conditions are even less severe than that: they are only
+       sometimes worth mentioning to the user. Therefore NASM supports the
+       `-w' command-line option, which enables or disables certain classes
+       of assembly warning. Such warning classes are described by a name,
+       for example `orphan-labels'; you can enable warnings of this class
+       by the command-line option `-w+orphan-labels' and disable it by
+       `-w-orphan-labels'.
+
+       The suppressible warning classes are:
+
+       (*) `macro-params' covers warnings about multi-line macros being
+           invoked with the wrong number of parameters. This warning class
+           is enabled by default; see section 4.3.2 for an example of why
+           you might want to disable it.
+
+       (*) `macro-selfref' warns if a macro references itself. This warning
+           class is disabled by default.
+
+       (*) `macro-defaults' warns when a macro has more default parameters
+           than optional parameters. This warning class is enabled by
+           default; see section 4.3.5 for why you might want to disable it.
+
+       (*) `orphan-labels' 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
+           section 3.1 for more information.
+
+       (*) `number-overflow' covers warnings about numeric constants which
+           don't fit in 64 bits. This warning class is enabled by default.
+
+       (*) `gnu-elf-extensions' warns if 8-bit or 16-bit relocations are
+           used in `-f elf' format. The GNU extensions allow this. This
+           warning class is disabled by default.
+
+       (*) `float-overflow' warns about floating point overflow. Enabled by
+           default.
+
+       (*) `float-denorm' warns about floating point denormals. Disabled by
+           default.
+
+       (*) `float-underflow' warns about floating point underflow. Disabled
+           by default.
+
+       (*) `float-toolong' warns about too many digits in floating-point
+           numbers. Enabled by default.
+
+       (*) `user' controls `%warning' directives (see section 4.9). Enabled
+           by default.
+
+       (*) `error' causes warnings to be treated as errors. Disabled by
+           default.
+
+       (*) `all' is an alias for _all_ suppressible warning classes (not
+           including `error'). Thus, `-w+all' enables all available
+           warnings.
+
+       In addition, you can set warning classes across sections. Warning
+       classes may be enabled with `[warning +warning-name]', disabled with
+       `[warning -warning-name]' or reset to their original value with
+       `[warning *warning-name]'. No "user form" (without the brackets)
+       exists.
+
+       Since version 2.00, NASM has also supported the gcc-like syntax
+       `-Wwarning' and `-Wno-warning' instead of `-w+warning' and
+       `-w-warning', respectively.
+
+2.1.25 The `-v' Option: Display Version Info
+
+       Typing `NASM -v' will display the version of NASM which you are
+       using, and the date on which it was compiled.
+
+       You will need the version number if you report a bug.
+
+2.1.26 The `-y' Option: Display Available Debug Info Formats
+
+       Typing `nasm -f <option> -y' 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:
+
+       nasm -f elf -y
+
+       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
+
+2.1.27 The `--prefix' and `--postfix' Options.
+
+       The `--prefix' and `--postfix' options prepend or append
+       (respectively) the given argument to all `global' or `extern'
+       variables. E.g. `--prefix _' will prepend the underscore to all
+       global and external variables, as C sometimes (but not always) likes
+       it.
+
+2.1.28 The `NASMENV' Environment Variable
+
+       If you define an environment variable called `NASMENV', the program
+       will interpret it as a list of extra command-line options, which are
+       processed before the real command line. You can use this to define
+       standard search directories for include files, by putting `-i'
+       options in the `NASMENV' variable.
+
+       The value of the variable is split up at white space, so that the
+       value `-s -ic:\nasmlib\' will be treated as two separate options.
+       However, that means that the value `-dNAME="my name"' won't do what
+       you might want, because it will be split at the space and the NASM
+       command-line processing will get confused by the two nonsensical
+       words `-dNAME="my' and `name"'.
+
+       To get round this, NASM provides a feature whereby, if you begin the
+       `NASMENV' 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 `NASMENV' variable to the
+       value `!-s!-ic:\nasmlib\' is equivalent to setting it to
+       `-s -ic:\nasmlib\', but `!-dNAME="my name"' will work.
+
+       This environment variable was previously called `NASM'. This was
+       changed with version 0.98.31.
+
+   2.2 Quick Start for MASM Users
+
+       If you're used to writing programs with MASM, or with TASM in MASM-
+       compatible (non-Ideal) mode, or with `a86', this section attempts to
+       outline the major differences between MASM's syntax and NASM's. If
+       you're not already used to MASM, it's probably worth skipping this
+       section.
+
+ 2.2.1 NASM Is Case-Sensitive
+
+       One simple difference is that NASM is case-sensitive. It makes a
+       difference whether you call your label `foo', `Foo' or `FOO'. If
+       you're assembling to `DOS' or `OS/2' `.OBJ' files, you can invoke
+       the `UPPERCASE' directive (documented in section 7.4) to ensure that
+       all symbols exported to other code modules are forced to be upper
+       case; but even then, _within_ a single module, NASM will distinguish
+       between labels differing only in case.
+
+ 2.2.2 NASM Requires Square Brackets For Memory References
+
+       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,
+
+       foo     equ     1 
+       bar     dw      2
+
+       then the two lines of code
+
+               mov     ax,foo 
+               mov     ax,bar
+
+       generate completely different opcodes, despite having identical-
+       looking syntaxes.
+
+       NASM avoids this undesirable situation by having a much simpler
+       syntax for memory references. The rule is simply that any access to
+       the _contents_ of a memory location requires square brackets around
+       the address, and any access to the _address_ of a variable doesn't.
+       So an instruction of the form `mov ax,foo' will _always_ refer to a
+       compile-time constant, whether it's an `EQU' or the address of a
+       variable; and to access the _contents_ of the variable `bar', you
+       must code `mov ax,[bar]'.
+
+       This also means that NASM has no need for MASM's `OFFSET' keyword,
+       since the MASM code `mov ax,offset bar' means exactly the same thing
+       as NASM's `mov ax,bar'. If you're trying to get large amounts of
+       MASM code to assemble sensibly under NASM, you can always code
+       `%idefine offset' to make the preprocessor treat the `OFFSET'
+       keyword as a no-op.
+
+       This issue is even more confusing in `a86', where declaring a label
+       with a trailing colon defines it to be a `label' as opposed to a
+       `variable' and causes `a86' to adopt NASM-style semantics; so in
+       `a86', `mov ax,var' has different behaviour depending on whether
+       `var' was declared as `var: dw 0' (a label) or `var dw 0' (a word-
+       size variable). NASM is very simple by comparison: _everything_ is a
+       label.
+
+       NASM, in the interests of simplicity, also does not support the
+       hybrid syntaxes supported by MASM and its clones, such as
+       `mov ax,table[bx]', where a memory reference is denoted by one
+       portion outside square brackets and another portion inside. The
+       correct syntax for the above is `mov ax,[table+bx]'. Likewise,
+       `mov ax,es:[di]' is wrong and `mov ax,[es:di]' is right.
+
+ 2.2.3 NASM Doesn't Store Variable Types
+
+       NASM, by design, chooses not to remember the types of variables you
+       declare. Whereas MASM will remember, on seeing `var dw 0', that you
+       declared `var' as a word-size variable, and will then be able to
+       fill in the ambiguity in the size of the instruction `mov var,2',
+       NASM will deliberately remember nothing about the symbol `var'
+       except where it begins, and so you must explicitly code
+       `mov word [var],2'.
+
+       For this reason, NASM doesn't support the `LODS', `MOVS', `STOS',
+       `SCAS', `CMPS', `INS', or `OUTS' instructions, but only supports the
+       forms such as `LODSB', `MOVSW', and `SCASD', which explicitly
+       specify the size of the components of the strings being manipulated.
+
+ 2.2.4 NASM Doesn't `ASSUME'
+
+       As part of NASM's drive for simplicity, it also does not support the
+       `ASSUME' directive. NASM will not keep track of what values you
+       choose to put in your segment registers, and will never
+       _automatically_ generate a segment override prefix.
+
+ 2.2.5 NASM Doesn't Support Memory Models
+
+       NASM also does not have any directives to support different 16-bit
+       memory models. The programmer has to keep track of which functions
+       are supposed to be called with a far call and which with a near
+       call, and is responsible for putting the correct form of `RET'
+       instruction (`RETN' or `RETF'; NASM accepts `RET' itself as an
+       alternate form for `RETN'); in addition, the programmer is
+       responsible for coding CALL FAR instructions where necessary when
+       calling _external_ functions, and must also keep track of which
+       external variable definitions are far and which are near.
+
+ 2.2.6 Floating-Point Differences
+
+       NASM uses different names to refer to floating-point registers from
+       MASM: where MASM would call them `ST(0)', `ST(1)' and so on, and
+       `a86' would call them simply `0', `1' and so on, NASM chooses to
+       call them `st0', `st1' etc.
+
+       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.
+
+ 2.2.7 Other Differences
+
+       For historical reasons, NASM uses the keyword `TWORD' where MASM and
+       compatible assemblers use `TBYTE'.
+
+       NASM does not declare uninitialized storage in the same way as MASM:
+       where a MASM programmer might use `stack db 64 dup (?)', NASM
+       requires `stack resb 64', intended to be read as `reserve 64 bytes'.
+       For a limited amount of compatibility, since NASM treats `?' as a
+       valid character in symbol names, you can code `? equ 0' and then
+       writing `dw ?' will at least do something vaguely useful. `DUP' is
+       still not a supported syntax, however.
+
+       In addition to all of this, macros and directives work completely
+       differently to MASM. See chapter 4 and chapter 6 for further
+       details.
+
+Chapter 3: The NASM Language
+----------------------------
+
+   3.1 Layout of a NASM Source Line
+
+       Like most assemblers, each NASM source line contains (unless it is a
+       macro, a preprocessor directive or an assembler directive: see
+       chapter 4 and chapter 6) some combination of the four fields
+
+       label:    instruction operands        ; comment
+
+       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.
+
+       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.
+
+       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 `lodsb' alone on a
+       line, and type `lodab' by accident, then that's still a valid source
+       line which does nothing but define a label. Running NASM with the
+       command-line option `-w+orphan-labels' will cause it to warn you if
+       you define a label alone on a line without a trailing colon.)
+
+       Valid characters in labels are letters, numbers, `_', `$', `#', `@',
+       `~', `.', and `?'. The only characters which may be used as the
+       _first_ character of an identifier are letters, `.' (with special
+       meaning: see section 3.9), `_' and `?'. An identifier may also be
+       prefixed with a `$' 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 `eax', you can refer to
+       `$eax' in NASM code to distinguish the symbol from the register.
+       Maximum length of an identifier is 4095 characters.
+
+       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 `LOCK', `REP', `REPE'/`REPZ' or `REPNE'/`REPNZ', in the
+       usual way. Explicit address-size and operand-size prefixes `A16',
+       `A32', `A64', `O16' and `O32', `O64' are provided - one example of
+       their use is given in chapter 10. You can also use the name of a
+       segment register as an instruction prefix: coding `es mov [bx],ax'
+       is equivalent to coding `mov [es:bx],ax'. We recommend the latter
+       syntax, since it is consistent with other syntactic features of the
+       language, but for instructions such as `LODSB', which has no
+       operands and yet can require a segment override, there is no clean
+       syntactic way to proceed apart from `es lodsb'.
+
+       An instruction is not required to use a prefix: prefixes such as
+       `CS', `A32', `LOCK' or `REPE' can appear on a line by themselves,
+       and NASM will just generate the prefix bytes.
+
+       In addition to actual machine instructions, NASM also supports a
+       number of pseudo-instructions, described in section 3.2.
+
+       Instruction operands may take a number of forms: they can be
+       registers, described simply by the register name (e.g. `ax', `bp',
+       `ebx', `cr0': NASM does not use the `gas'-style syntax in which
+       register names must be prefixed by a `%' sign), or they can be
+       effective addresses (see section 3.3), constants (section 3.4) or
+       expressions (section 3.5).
+
+       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:
+
+               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
+
+       Almost any x87 floating-point instruction that references memory
+       must use one of the prefixes `DWORD', `QWORD' or `TWORD' to indicate
+       what size of memory operand it refers to.
+
+   3.2 Pseudo-Instructions
+
+       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 `DB', `DW', `DD', `DQ', `DT', `DO' and `DY'; their
+       uninitialized counterparts `RESB', `RESW', `RESD', `RESQ', `REST',
+       `RESO' and `RESY'; the `INCBIN' command, the `EQU' command, and the
+       `TIMES' prefix.
+
+ 3.2.1 `DB' and Friends: Declaring Initialized Data
+
+       `DB', `DW', `DD', `DQ', `DT', `DO' and `DY' are used, much as in
+       MASM, to declare initialized data in the output file. They can be
+       invoked in a wide range of ways:
+
+             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
+
+       `DT', `DO' and `DY' do not accept numeric constants as operands.
+
+ 3.2.2 `RESB' and Friends: Declaring Uninitialized Data
+
+       `RESB', `RESW', `RESD', `RESQ', `REST', `RESO' and `RESY' are
+       designed to be used in the BSS section of a module: they declare
+       _uninitialized_ storage space. Each takes a single operand, which is
+       the number of bytes, words, doublewords or whatever to reserve. As
+       stated in section 2.2.7, NASM does not support the MASM/TASM syntax
+       of reserving uninitialized space by writing `DW ?' or similar
+       things: this is what it does instead. The operand to a `RESB'-type
+       pseudo-instruction is a _critical expression_: see section 3.8.
+
+       For example:
+
+       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
+
+ 3.2.3 `INCBIN': Including External Binary Files
+
+       `INCBIN' 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:
+
+           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
+
+       `INCBIN' 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.
+
+ 3.2.4 `EQU': Defining Constants
+
+       `EQU' defines a symbol to a given constant value: when `EQU' is
+       used, the source line must contain a label. The action of `EQU' 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,
+
+       message         db      'hello, world' 
+       msglen          equ     $-message
+
+       defines `msglen' to be the constant 12. `msglen' may not then be
+       redefined later. This is not a preprocessor definition either: the
+       value of `msglen' is evaluated _once_, using the value of `$' (see
+       section 3.5 for an explanation of `$') at the point of definition,
+       rather than being evaluated wherever it is referenced and using the
+       value of `$' at the point of reference.
+
+ 3.2.5 `TIMES': Repeating Instructions or Data
+
+       The `TIMES' prefix causes the instruction to be assembled multiple
+       times. This is partly present as NASM's equivalent of the `DUP'
+       syntax supported by MASM-compatible assemblers, in that you can code
+
+       zerobuf:        times 64 db 0
+
+       or similar things; but `TIMES' is more versatile than that. The
+       argument to `TIMES' is not just a numeric constant, but a numeric
+       _expression_, so you can do things like
+
+       buffer: db      'hello, world' 
+               times 64-$+buffer db ' '
+
+       which will store exactly enough spaces to make the total length of
+       `buffer' up to 64. Finally, `TIMES' can be applied to ordinary
+       instructions, so you can code trivial unrolled loops in it:
+
+               times 100 movsb
+
+       Note that there is no effective difference between
+       `times 100 resb 1' and `resb 100', except that the latter will be
+       assembled about 100 times faster due to the internal structure of
+       the assembler.
+
+       The operand to `TIMES' is a critical expression (section 3.8).
+
+       Note also that `TIMES' can't be applied to macros: the reason for
+       this is that `TIMES' is processed after the macro phase, which
+       allows the argument to `TIMES' to contain expressions such as
+       `64-$+buffer' as above. To repeat more than one line of code, or a
+       complex macro, use the preprocessor `%rep' directive.
+
+   3.3 Effective Addresses
+
+       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:
+
+       wordvar dw      123 
+               mov     ax,[wordvar] 
+               mov     ax,[wordvar+1] 
+               mov     ax,[es:wordvar+bx]
+
+       Anything not conforming to this simple system is not a valid memory
+       reference in NASM, for example `es:wordvar[bx]'.
+
+       More complicated effective addresses, such as those involving more
+       than one register, work in exactly the same way:
+
+               mov     eax,[ebx*2+ecx+offset] 
+               mov     ax,[bp+di+8]
+
+       NASM is capable of doing algebra on these effective addresses, so
+       that things which don't necessarily _look_ legal are perfectly all
+       right:
+
+           mov     eax,[ebx*5]             ; assembles as [ebx*4+ebx] 
+           mov     eax,[label1*2-label2]   ; ie [label1+(label1-label2)]
+
+       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 `[eax*2+0]' and `[eax+eax]', and NASM will generally
+       generate the latter on the grounds that the former requires four
+       bytes to store a zero offset.
+
+       NASM has a hinting mechanism which will cause `[eax+ebx]' and
+       `[ebx+eax]' to generate different opcodes; this is occasionally
+       useful because `[esi+ebp]' and `[ebp+esi]' have different default
+       segment registers.
+
+       However, you can force NASM to generate an effective address in a
+       particular form by the use of the keywords `BYTE', `WORD', `DWORD'
+       and `NOSPLIT'. If you need `[eax+3]' to be assembled using a double-
+       word offset field instead of the one byte NASM will normally
+       generate, you can code `[dword eax+3]'. Similarly, you can force
+       NASM to use a byte offset for a small value which it hasn't seen on
+       the first pass (see section 3.8 for an example of such a code
+       fragment) by using `[byte eax+offset]'. As special cases,
+       `[byte eax]' will code `[eax+0]' with a byte offset of zero, and
+       `[dword eax]' will code it with a double-word offset of zero. The
+       normal form, `[eax]', will be coded with no offset field.
+
+       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 (section 10.2). 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.
+
+       Similarly, NASM will split `[eax*2]' into `[eax+eax]' because that
+       allows the offset field to be absent and space to be saved; in fact,
+       it will also split `[eax*2+offset]' into `[eax+eax+offset]'. You can
+       combat this behaviour by the use of the `NOSPLIT' keyword:
+       `[nosplit eax*2]' will force `[eax*2+0]' to be generated literally.
+
+       In 64-bit mode, NASM will by default generate absolute addresses.
+       The `REL' keyword makes it produce `RIP'-relative addresses. Since
+       this is frequently the normally desired behaviour, see the `DEFAULT'
+       directive (section 6.2). The keyword `ABS' overrides `REL'.
+
+   3.4 Constants
+
+       NASM understands four different types of constant: numeric,
+       character, string and floating-point.
+
+ 3.4.1 Numeric Constants
+
+       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 `H' or `X', `Q' or `O', and `B' for hexadecimal, octal and
+       binary respectively, or you can prefix `0x' for hexadecimal in the
+       style of C, or you can prefix `$' for hexadecimal in the style of
+       Borland Pascal. Note, though, that the `$' prefix does double duty
+       as a prefix on identifiers (see section 3.1), so a hex number
+       prefixed with a `$' sign must have a digit after the `$' rather than
+       a letter. In addition, current versions of NASM accept the prefix
+       `0h' for hexadecimal, `0o' or `0q' for octal, and `0b' for binary.
+       Please note that unlike C, a `0' prefix by itself does _not_ imply
+       an octal constant!
+
+       Numeric constants can have underscores (`_') interspersed to break
+       up long strings.
+
+       Some examples (all producing exactly the same code):
+
+               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
+
+ 3.4.2 Character Strings
+
+       A character string consists of up to eight characters enclosed in
+       either single quotes (`'...''), double quotes (`"..."') or
+       backquotes (``...`'). 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 `\'-escapes for special characters.
+
+       The following escape sequences are recognized by backquoted strings:
+
+             \'          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
+
+       All other escape sequences are reserved. Note that `\0', meaning a
+       `NUL' character (ASCII 0), is a special case of the octal escape
+       sequence.
+
+       Unicode characters specified with `\u' or `\U' are converted to
+       UTF-8. For example, the following lines are all equivalent:
+
+             db `\u263a`            ; UTF-8 smiley face 
+             db `\xe2\x98\xba`      ; UTF-8 smiley face 
+             db 0E2h, 098h, 0BAh    ; UTF-8 smiley face
+
+ 3.4.3 Character Constants
+
+       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.
+
+       A character constant with more than one byte will be arranged with
+       little-endian order in mind: if you code
+
+                 mov eax,'abcd'
+
+       then the constant generated is not `0x61626364', but `0x64636261',
+       so that if you were then to store the value into memory, it would
+       read `abcd' rather than `dcba'. This is also the sense of character
+       constants understood by the Pentium's `CPUID' instruction.
+
+ 3.4.4 String Constants
+
+       String constants are character strings used in the context of some
+       pseudo-instructions, namely the `DB' family and `INCBIN' (where it
+       represents a filename.) They are also used in certain preprocessor
+       directives.
+
+       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:
+
+             db    'hello'               ; string constant 
+             db    'h','e','l','l','o'   ; equivalent character constants
+
+       And the following are also equivalent:
+
+             dd    'ninechars'           ; doubleword string constant 
+             dd    'nine','char','s'     ; becomes three doublewords 
+             db    'ninechars',0,0,0     ; and really looks like this
+
+       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 `db 'ab'' would have the
+       same effect as `db 'a'', which would be silly. Similarly, three-
+       character or four-character constants are treated as strings when
+       they are operands to `DW', and so forth.
+
+ 3.4.5 Unicode Strings
+
+       The special operators `__utf16__' and `__utf32__' allows definition
+       of Unicode strings. They take a string in UTF-8 format and converts
+       it to (littleendian) UTF-16 or UTF-32, respectively.
+
+       For example:
+
+       %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
+
+       `__utf16__' and `__utf32__' can be applied either to strings passed
+       to the `DB' family instructions, or to character constants in an
+       expression context.
+
+ 3.4.6 Floating-Point Constants
+
+       Floating-point constants are acceptable only as arguments to `DB',
+       `DW', `DD', `DQ', `DT', and `DO', or as arguments to the special
+       operators `__float8__', `__float16__', `__float32__', `__float64__',
+       `__float80m__', `__float80e__', `__float128l__', and
+       `__float128h__'.
+
+       Floating-point constants are expressed in the traditional form:
+       digits, then a period, then optionally more digits, then optionally
+       an `E' followed by an exponent. The period is mandatory, so that
+       NASM can distinguish between `dd 1', which declares an integer
+       constant, and `dd 1.0' which declares a floating-point constant.
+       NASM also support C99-style hexadecimal floating-point: `0x',
+       hexadecimal digits, period, optionally more hexadeximal digits, then
+       optionally a `P' followed by a _binary_ (not hexadecimal) exponent
+       in decimal notation.
+
+       Underscores to break up groups of digits are permitted in floating-
+       point constants as well.
+
+       Some examples:
+
+             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
+
+       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."
+
+       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. `__float80m__' and
+       `__float80e__' produce the 64-bit mantissa and 16-bit exponent of an
+       80-bit floating-point number, and `__float128l__' and
+       `__float128h__' produce the lower and upper 64-bit halves of a 128-
+       bit floating-point number, respectively.
+
+       For example:
+
+             mov    rax,__float64__(3.141592653589793238462)
+
+       ... would assign the binary representation of pi as a 64-bit
+       floating point number into `RAX'. This is exactly equivalent to:
+
+             mov    rax,0x400921fb54442d18
+
+       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.
+
+       The special tokens `__Infinity__', `__QNaN__' (or `__NaN__') and
+       `__SNaN__' can be used to generate infinities, quiet NaNs, and
+       signalling NaNs, respectively. These are normally used as macros:
+
+       %define Inf __Infinity__ 
+       %define NaN __QNaN__ 
+       
+             dq    +1.5, -Inf, NaN         ; Double-precision constants
+
+ 3.4.7 Packed BCD Constants
+
+       x87-style packed BCD constants can be used in the same contexts as
+       80-bit floating-point numbers. They are suffixed with `p' or
+       prefixed with `0p', and can include up to 18 decimal digits.
+
+       As with other numeric constants, underscores can be used to separate
+       digits.
+
+       For example:
+
+             dt 12_345_678_901_245_678p 
+             dt -12_345_678_901_245_678p 
+             dt +0p33 
+             dt 33p
+
+   3.5 Expressions
+
+       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.
+
+       NASM supports two special tokens in expressions, allowing
+       calculations to involve the current assembly position: the `$' and
+       `$$' tokens. `$' evaluates to the assembly position at the beginning
+       of the line containing the expression; so you can code an infinite
+       loop using `JMP $'. `$$' evaluates to the beginning of the current
+       section; so you can tell how far into the section you are by using
+       `($-$$)'.
+
+       The arithmetic operators provided by NASM are listed here, in
+       increasing order of precedence.
+
+ 3.5.1 `|': Bitwise OR Operator
+
+       The `|' operator gives a bitwise OR, exactly as performed by the
+       `OR' machine instruction. Bitwise OR is the lowest-priority
+       arithmetic operator supported by NASM.
+
+ 3.5.2 `^': Bitwise XOR Operator
+
+       `^' provides the bitwise XOR operation.
+
+ 3.5.3 `&': Bitwise AND Operator
+
+       `&' provides the bitwise AND operation.
+
+ 3.5.4 `<<' and `>>': Bit Shift Operators
+
+       `<<' gives a bit-shift to the left, just as it does in C. So `5<<3'
+       evaluates to 5 times 8, or 40. `>>' gives a bit-shift to the right;
+       in NASM, such a shift is _always_ 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.
+
+ 3.5.5 `+' and `-': Addition and Subtraction Operators
+
+       The `+' and `-' operators do perfectly ordinary addition and
+       subtraction.
+
+ 3.5.6 `*', `/', `//', `%' and `%%': Multiplication and Division
+
+       `*' is the multiplication operator. `/' and `//' are both division
+       operators: `/' is unsigned division and `//' is signed division.
+       Similarly, `%' and `%%' provide unsigned and signed modulo operators
+       respectively.
+
+       NASM, like ANSI C, provides no guarantees about the sensible
+       operation of the signed modulo operator.
+
+       Since the `%' 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.
+
+ 3.5.7 Unary Operators: `+', `-', `~', `!' and `SEG'
+
+       The highest-priority operators in NASM's expression grammar are
+       those which only apply to one argument. `-' negates its operand, `+'
+       does nothing (it's provided for symmetry with `-'), `~' computes the
+       one's complement of its operand, `!' is the logical negation
+       operator, and `SEG' provides the segment address of its operand
+       (explained in more detail in section 3.6).
+
+   3.6 `SEG' and `WRT'
+
+       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 `SEG'
+       operator to perform this function.
+
+       The `SEG' operator returns the _preferred_ segment base of a symbol,
+       defined as the segment base relative to which the offset of the
+       symbol makes sense. So the code
+
+               mov     ax,seg symbol 
+               mov     es,ax 
+               mov     bx,symbol
+
+       will load `ES:BX' with a valid pointer to the symbol `symbol'.
+
+       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 `WRT' (With Reference To)
+       keyword. So you can do things like
+
+               mov     ax,weird_seg        ; weird_seg is a segment base 
+               mov     es,ax 
+               mov     bx,symbol wrt weird_seg
+
+       to load `ES:BX' with a different, but functionally equivalent,
+       pointer to the symbol `symbol'.
+
+       NASM supports far (inter-segment) calls and jumps by means of the
+       syntax `call segment:offset', where `segment' and `offset' both
+       represent immediate values. So to call a far procedure, you could
+       code either of
+
+               call    (seg procedure):procedure 
+               call    weird_seg:(procedure wrt weird_seg)
+
+       (The parentheses are included for clarity, to show the intended
+       parsing of the above instructions. They are not necessary in
+       practice.)
+
+       NASM supports the syntax `call far procedure' as a synonym for the
+       first of the above usages. `JMP' works identically to `CALL' in
+       these examples.
+
+       To declare a far pointer to a data item in a data segment, you must
+       code
+
+               dw      symbol, seg symbol
+
+       NASM supports no convenient synonym for this, though you can always
+       invent one using the macro processor.
+
+   3.7 `STRICT': Inhibiting Optimization
+
+       When assembling with the optimizer set to level 2 or higher (see
+       section 2.1.22), NASM will use size specifiers (`BYTE', `WORD',
+       `DWORD', `QWORD', `TWORD', `OWORD' or `YWORD'), but will give them
+       the smallest possible size. The keyword `STRICT' 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
+       `BITS 16' mode,
+
+               push dword 33
+
+       is encoded in three bytes `66 6A 21', whereas
+
+               push strict dword 33
+
+       is encoded in six bytes, with a full dword immediate operand
+       `66 68 21 00 00 00'.
+
+       With the optimizer off, the same code (six bytes) is generated
+       whether the `STRICT' keyword was used or not.
+
+   3.8 Critical Expressions
+
+       Although NASM has an optional multi-pass optimizer, there are some
+       expressions which must be resolvable on the first pass. These are
+       called _Critical Expressions_.
+
+       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,
+
+               times (label-$) db 0 
+       label:  db      'Where am I?'
+
+       The argument to `TIMES' in this case could equally legally evaluate
+       to anything at all; NASM will reject this example because it cannot
+       tell the size of the `TIMES' line when it first sees it. It will
+       just as firmly reject the slightly paradoxical code
+
+               times (label-$+1) db 0 
+       label:  db      'NOW where am I?'
+
+       in which _any_ value for the `TIMES' argument is by definition
+       wrong!
+
+       NASM rejects these examples by means of a concept called a _critical
+       expression_, 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 `TIMES' prefix is a critical expression.
+
+   3.9 Local Labels
+
+       NASM gives special treatment to symbols beginning with a period. A
+       label beginning with a single period is treated as a _local_ label,
+       which means that it is associated with the previous non-local label.
+       So, for example:
+
+       label1  ; some code 
+       
+       .loop 
+               ; some more code 
+       
+               jne     .loop 
+               ret 
+       
+       label2  ; some code 
+       
+       .loop 
+               ; some more code 
+       
+               jne     .loop 
+               ret
+
+       In the above code fragment, each `JNE' instruction jumps to the line
+       immediately before it, because the two definitions of `.loop' are
+       kept separate by virtue of each being associated with the previous
+       non-local label.
+
+       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 _defining_ a local label in terms of the
+       previous non-local label: the first definition of `.loop' above is
+       really defining a symbol called `label1.loop', and the second
+       defines a symbol called `label2.loop'. So, if you really needed to,
+       you could write
+
+       label3  ; some more code 
+               ; and some more 
+       
+               jmp label1.loop
+
+       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 `..@', then it does nothing to the local label
+       mechanism. So you could code
+
+       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
+
+       NASM has the capacity to define other special symbols beginning with
+       a double period: for example, `..start' is used to specify the entry
+       point in the `obj' output format (see section 7.4.6).
+
+Chapter 4: The NASM Preprocessor
+--------------------------------
+
+       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 `%' sign.
+
+       The preprocessor collapses all lines which end with a backslash (\)
+       character into a single line. Thus:
+
+       %define THIS_VERY_LONG_MACRO_NAME_IS_DEFINED_TO \ 
+               THIS_VALUE
+
+       will work like a single-line macro without the backslash-newline
+       sequence.
+
+   4.1 Single-Line Macros
+
+ 4.1.1 The Normal Way: `%define'
+
+       Single-line macros are defined using the `%define' preprocessor
+       directive. The definitions work in a similar way to C; so you can do
+       things like
+
+       %define ctrl    0x1F & 
+       %define param(a,b) ((a)+(a)*(b)) 
+       
+               mov     byte [param(2,ebx)], ctrl 'D'
+
+       which will expand to
+
+               mov     byte [(2)+(2)*(ebx)], 0x1F & 'D'
+
+       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
+
+       %define a(x)    1+b(x) 
+       %define b(x)    2*x 
+       
+               mov     ax,a(8)
+
+       will evaluate in the expected way to `mov ax,1+2*8', even though the
+       macro `b' wasn't defined at the time of definition of `a'.
+
+       Macros defined with `%define' are case sensitive: after
+       `%define foo bar', only `foo' will expand to `bar': `Foo' or `FOO'
+       will not. By using `%idefine' instead of `%define' (the `i' stands
+       for `insensitive') you can define all the case variants of a macro
+       at once, so that `%idefine foo bar' would cause `foo', `Foo', `FOO',
+       `fOO' and so on all to expand to `bar'.
+
+       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
+
+       %define a(x)    1+a(x) 
+       
+               mov     ax,a(3)
+
+       the macro `a(3)' will expand once, becoming `1+a(3)', and will then
+       expand no further. This behaviour can be useful: see section 9.1 for
+       an example of its use.
+
+       You can overload single-line macros: if you write
+
+       %define foo(x)   1+x 
+       %define foo(x,y) 1+x*y
+
+       the preprocessor will be able to handle both types of macro call, by
+       counting the parameters you pass; so `foo(3)' will become `1+3'
+       whereas `foo(ebx,2)' will become `1+ebx*2'. However, if you define
+
+       %define foo bar
+
+       then no other definition of `foo' will be accepted: a macro with no
+       parameters prohibits the definition of the same name as a macro
+       _with_ parameters, and vice versa.
+
+       This doesn't prevent single-line macros being _redefined_: you can
+       perfectly well define a macro with
+
+       %define foo bar
+
+       and then re-define it later in the same source file with
+
+       %define foo baz
+
+       Then everywhere the macro `foo' is invoked, it will be expanded
+       according to the most recent definition. This is particularly useful
+       when defining single-line macros with `%assign' (see section 4.1.7).
+
+       You can pre-define single-line macros using the `-d' option on the
+       NASM command line: see section 2.1.18.
+
+ 4.1.2 Resolving `%define': `%xdefine'
+
+       To have a reference to an embedded single-line macro resolved at the
+       time that the embedding macro is _defined_, as opposed to when the
+       embedding macro is _expanded_, you need a different mechanism to the
+       one offered by `%define'. The solution is to use `%xdefine', or it's
+       case-insensitive counterpart `%ixdefine'.
+
+       Suppose you have the following code:
+
+       %define  isTrue  1 
+       %define  isFalse isTrue 
+       %define  isTrue  0 
+       
+       val1:    db      isFalse 
+       
+       %define  isTrue  1 
+       
+       val2:    db      isFalse
+
+       In this case, `val1' is equal to 0, and `val2' is equal to 1. This
+       is because, when a single-line macro is defined using `%define', it
+       is expanded only when it is called. As `isFalse' expands to
+       `isTrue', the expansion will be the current value of `isTrue'. The
+       first time it is called that is 0, and the second time it is 1.
+
+       If you wanted `isFalse' to expand to the value assigned to the
+       embedded macro `isTrue' at the time that `isFalse' was defined, you
+       need to change the above code to use `%xdefine'.
+
+       %xdefine isTrue  1 
+       %xdefine isFalse isTrue 
+       %xdefine isTrue  0 
+       
+       val1:    db      isFalse 
+       
+       %xdefine isTrue  1 
+       
+       val2:    db      isFalse
+
+       Now, each time that `isFalse' is called, it expands to 1, as that is
+       what the embedded macro `isTrue' expanded to at the time that
+       `isFalse' was defined.
+
+ 4.1.3 Macro Indirection: `%[...]'
+
+       The `%[...]' 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
+       `Foo16', `Foo32' and `Foo64', you could write:
+
+            mov ax,Foo%[__BITS__]   ; The Foo value
+
+       to use the builtin macro `__BITS__' (see section 4.11.5) to
+       automatically select between them. Similarly, the two statements:
+
+       %xdefine Bar         Quux    ; Expands due to %xdefine 
+       %define  Bar         %[Quux] ; Expands due to %[...]
+
+       have, in fact, exactly the same effect.
+
+       `%[...]' concatenates to adjacent tokens in the same way that multi-
+       line macro parameters do, see section 4.3.8 for details.
+
+ 4.1.4 Concatenating Single Line Macro Tokens: `%+'
+
+       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.
+
+       Please note that a space is required after `%+', in order to
+       disambiguate it from the syntax `%+1' used in multiline macros.
+
+       As an example, consider the following:
+
+       %define BDASTART 400h                ; Start of BIOS data area
+
+       struc   tBIOSDA                      ; its structure 
+               .COM1addr       RESW    1 
+               .COM2addr       RESW    1 
+               ; ..and so on 
+       endstruc
+
+       Now, if we need to access the elements of tBIOSDA in different
+       places, we can end up with:
+
+               mov     ax,BDASTART + tBIOSDA.COM1addr 
+               mov     bx,BDASTART + tBIOSDA.COM2addr
+
+       This will become pretty ugly (and tedious) if used in many places,
+       and can be reduced in size significantly by using the following
+       macro:
+
+       ; Macro to access BIOS variables by their names (from tBDA):
+
+       %define BDA(x)  BDASTART + tBIOSDA. %+ x
+
+       Now the above code can be written as:
+
+               mov     ax,BDA(COM1addr) 
+               mov     bx,BDA(COM2addr)
+
+       Using this feature, we can simplify references to a lot of macros
+       (and, in turn, reduce typing errors).
+
+ 4.1.5 The Macro Name Itself: `%?' and `%??'
+
+       The special symbols `%?' and `%??' can be used to reference the
+       macro name itself inside a macro expansion, this is supported for
+       both single-and multi-line macros. `%?' refers to the macro name as
+       _invoked_, whereas `%??' refers to the macro name as _declared_. The
+       two are always the same for case-sensitive macros, but for case-
+       insensitive macros, they can differ.
+
+       For example:
+
+       %idefine Foo mov %?,%?? 
+       
+               foo 
+               FOO
+
+       will expand to:
+
+               mov foo,Foo 
+               mov FOO,Foo
+
+       The sequence:
+
+       %idefine keyword $%?
+
+       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:
+
+       %idefine pause $%?                  ; Hide the PAUSE instruction
+
+ 4.1.6 Undefining Single-Line Macros: `%undef'
+
+       Single-line macros can be removed with the `%undef' directive. For
+       example, the following sequence:
+
+       %define foo bar 
+       %undef  foo 
+       
+               mov     eax, foo
+
+       will expand to the instruction `mov eax, foo', since after `%undef'
+       the macro `foo' is no longer defined.
+
+       Macros that would otherwise be pre-defined can be undefined on the
+       command-line using the `-u' option on the NASM command line: see
+       section 2.1.19.
+
+ 4.1.7 Preprocessor Variables: `%assign'
+
+       An alternative way to define single-line macros is by means of the
+       `%assign' command (and its case-insensitive counterpart `%iassign',
+       which differs from `%assign' in exactly the same way that `%idefine'
+       differs from `%define').
+
+       `%assign' 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
+       `%assign' directive is processed.
+
+       Like `%define', macros defined using `%assign' can be re-defined
+       later, so you can do things like
+
+       %assign i i+1
+
+       to increment the numeric value of a macro.
+
+       `%assign' is useful for controlling the termination of `%rep'
+       preprocessor loops: see section 4.5 for an example of this. Another
+       use for `%assign' is given in section 8.4 and section 9.1.
+
+       The expression passed to `%assign' is a critical expression (see
+       section 3.8), 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).
+
+ 4.1.8 Defining Strings: `%defstr'
+
+       `%defstr', and its case-insensitive counterpart `%idefstr', 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.
+
+       For example:
+
+       %defstr test TEST
+
+       is equivalent to
+
+       %define test 'TEST'
+
+       This can be used, for example, with the `%!' construct (see section
+       4.10.2):
+
+       %defstr PATH %!PATH          ; The operating system PATH variable
+
+ 4.1.9 Defining Tokens: `%deftok'
+
+       `%deftok', and its case-insensitive counterpart `%ideftok', define
+       or redefine a single-line macro without parameters but converts the
+       second parameter, after string conversion, to a sequence of tokens.
+
+       For example:
+
+       %deftok test 'TEST'
+
+       is equivalent to
+
+       %define test TEST
+
+   4.2 String Manipulation in Macros
+
+       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.
+
+       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 `\'-escapes inside ``'-quoted strings.
+
+ 4.2.1 Concatenating Strings: `%strcat'
+
+       The `%strcat' operator concatenates quoted strings and assign them
+       to a single-line macro.
+
+       For example:
+
+       %strcat alpha "Alpha: ", '12" screen'
+
+       ... would assign the value `'Alpha: 12" screen'' to `alpha'.
+       Similarly:
+
+       %strcat beta '"foo"\', "'bar'"
+
+       ... would assign the value ``"foo"\\'bar'`' to `beta'.
+
+       The use of commas to separate strings is permitted but optional.
+
+ 4.2.2 String Length: `%strlen'
+
+       The `%strlen' operator assigns the length of a string to a macro.
+       For example:
+
+       %strlen charcnt 'my string'
+
+       In this example, `charcnt' would receive the value 9, just as if an
+       `%assign' had been used. In this example, `'my string'' was a
+       literal string but it could also have been a single-line macro that
+       expands to a string, as in the following example:
+
+       %define sometext 'my string' 
+       %strlen charcnt sometext
+
+       As in the first case, this would result in `charcnt' being assigned
+       the value of 9.
+
+ 4.2.3 Extracting Substrings: `%substr'
+
+       Individual letters or substrings in strings can be extracted using
+       the `%substr' operator. An example of its use is probably more
+       useful than the description:
+
+       %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'
+
+       As with `%strlen' (see section 4.2.2), 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 `%strlen' 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. `-1'
+       means until end of string, `-2' until one character before, etc.
+
+   4.3 Multi-Line Macros: `%macro'
+
+       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.
+
+       %macro  prologue 1 
+       
+               push    ebp 
+               mov     ebp,esp 
+               sub     esp,%1 
+       
+       %endmacro
+
+       This defines a C-like function prologue as a macro: so you would
+       invoke the macro with a call such as
+
+       myfunc:   prologue 12
+
+       which would expand to the three lines of code
+
+       myfunc: push    ebp 
+               mov     ebp,esp 
+               sub     esp,12
+
+       The number `1' after the macro name in the `%macro' line defines the
+       number of parameters the macro `prologue' expects to receive. The
+       use of `%1' 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 `%2', `%3'
+       and so on.
+
+       Multi-line macros, like single-line macros, are case-sensitive,
+       unless you define them using the alternative directive `%imacro'.
+
+       If you need to pass a comma as _part_ 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
+
+       %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
+
+ 4.3.1 Recursive Multi-Line Macros: `%rmacro'
+
+       A multi-line macro cannot be referenced within itself, in order to
+       prevent accidental infinite recursion.
+
+       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.
+
+       As with non-recursive multi-line macros, recursive multi-line macros
+       are case-sensitive, unless you define them using the alternative
+       directive `%irmacro'.
+
+ 4.3.2 Overloading Multi-Line Macros
+
+       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
+
+       %macro  prologue 0 
+       
+               push    ebp 
+               mov     ebp,esp 
+       
+       %endmacro
+
+       to define an alternative form of the function prologue which
+       allocates no local stack space.
+
+       Sometimes, however, you might want to `overload' a machine
+       instruction; for example, you might want to define
+
+       %macro  push 2 
+       
+               push    %1 
+               push    %2 
+       
+       %endmacro
+
+       so that you could code
+
+               push    ebx             ; this line is not a macro call 
+               push    eax,ecx         ; but this one is
+
+       Ordinarily, NASM will give a warning for the first of the above two
+       lines, since `push' 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
+       `-w-macro-params' command-line option (see section 2.1.24).
+
+ 4.3.3 Macro-Local Labels
+
+       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 `%%' to the label name. So you
+       can invent an instruction which executes a `RET' if the `Z' flag is
+       set by doing this:
+
+       %macro  retz 0 
+       
+               jnz     %%skip 
+               ret 
+           %%skip: 
+       
+       %endmacro
+
+       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 `%%skip'. The names NASM invents are of the form
+       `..@2345.skip', where the number 2345 changes with every macro call.
+       The `..@' prefix prevents macro-local labels from interfering with
+       the local label mechanism, as described in section 3.9. You should
+       avoid defining your own labels in this form (the `..@' prefix, then
+       a number, then another period) in case they interfere with macro-
+       local labels.
+
+ 4.3.4 Greedy Macro Parameters
+
+       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
+
+               writefile [filehandle],"hello, world",13,10
+
+       NASM allows you to define the last parameter of a macro to be
+       _greedy_, 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:
+
+       %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
+
+       then the example call to `writefile' above will work as expected:
+       the text before the first comma, `[filehandle]', is used as the
+       first macro parameter and expanded when `%1' is referred to, and all
+       the subsequent text is lumped into `%2' and placed after the `db'.
+
+       The greedy nature of the macro is indicated to NASM by the use of
+       the `+' sign after the parameter count on the `%macro' line.
+
+       If you define a greedy macro, you are effectively telling NASM how
+       it should expand the macro given _any_ 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 `writefile' 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
+       `writefile' taking 4 parameters (for example).
+
+       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
+
+                 writefile [filehandle], {"hello, world",13,10}
+
+       NASM provides both mechanisms for putting commas in macro
+       parameters, and you choose which one you prefer for each macro
+       definition.
+
+       See section 6.3.1 for a better way to write the above macro.
+
+ 4.3.5 Default Macro Parameters
+
+       NASM also allows you to define a multi-line macro with a _range_ of
+       allowable parameter counts. If you do this, you can specify defaults
+       for omitted parameters. So, for example:
+
+       %macro  die 0-1 "Painful program death has occurred." 
+       
+               writefile 2,%1 
+               mov     ax,0x4c01 
+               int     0x21 
+       
+       %endmacro
+
+       This macro (which makes use of the `writefile' macro defined in
+       section 4.3.4) 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.
+
+       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
+
+       %macro foobar 1-3 eax,[ebx+2]
+
+       then it could be called with between one and three parameters, and
+       `%1' would always be taken from the macro call. `%2', if not
+       specified by the macro call, would default to `eax', and `%3' if not
+       specified would default to `[ebx+2]'.
+
+       You can provide extra information to a macro by providing too many
+       default parameters:
+
+       %macro quux 1 something
+
+       This will trigger a warning by default; see section 2.1.24 for more
+       information. When `quux' is invoked, it receives not one but two
+       parameters. `something' can be referred to as `%2'. The difference
+       between passing `something' this way and writing `something' in the
+       macro body is that with this way `something' is evaluated when the
+       macro is defined, not when it is expanded.
+
+       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
+       `%0' token (see section 4.3.6) allows you to determine how many
+       parameters were really passed to the macro call.
+
+       This defaulting mechanism can be combined with the greedy-parameter
+       mechanism; so the `die' macro above could be made more powerful, and
+       more useful, by changing the first line of the definition to
+
+       %macro die 0-1+ "Painful program death has occurred.",13,10
+
+       The maximum parameter count can be infinite, denoted by `*'. In this
+       case, of course, it is impossible to provide a _full_ set of default
+       parameters. Examples of this usage are shown in section 4.3.7.
+
+ 4.3.6 `%0': Macro Parameter Counter
+
+       The parameter reference `%0' will return a numeric constant giving
+       the number of parameters received, that is, if `%0' is n then `%'n
+       is the last parameter. `%0' is mostly useful for macros that can
+       take a variable number of parameters. It can be used as an argument
+       to `%rep' (see section 4.5) in order to iterate through all the
+       parameters of a macro. Examples are given in section 4.3.7.
+
+ 4.3.7 `%rotate': Rotating Macro Parameters
+
+       Unix shell programmers will be familiar with the `shift' shell
+       command, which allows the arguments passed to a shell script
+       (referenced as `$1', `$2' and so on) to be moved left by one place,
+       so that the argument previously referenced as `$2' becomes available
+       as `$1', and the argument previously referenced as `$1' is no longer
+       available at all.
+
+       NASM provides a similar mechanism, in the form of `%rotate'. As its
+       name suggests, it differs from the Unix `shift' in that no
+       parameters are lost: parameters rotated off the left end of the
+       argument list reappear on the right, and vice versa.
+
+       `%rotate' 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 `%rotate' is negative, the macro
+       parameters are rotated to the right.
+
+       So a pair of macros to save and restore a set of registers might
+       work as follows:
+
+       %macro  multipush 1-* 
+       
+         %rep  %0 
+               push    %1 
+         %rotate 1 
+         %endrep 
+       
+       %endmacro
+
+       This macro invokes the `PUSH' instruction on each of its arguments
+       in turn, from left to right. It begins by pushing its first
+       argument, `%1', then invokes `%rotate' to move all the arguments one
+       place to the left, so that the original second argument is now
+       available as `%1'. Repeating this procedure as many times as there
+       were arguments (achieved by supplying `%0' as the argument to
+       `%rep') causes each argument in turn to be pushed.
+
+       Note also the use of `*' as the maximum parameter count, indicating
+       that there is no upper limit on the number of parameters you may
+       supply to the `multipush' macro.
+
+       It would be convenient, when using this macro, to have a `POP'
+       equivalent, which _didn't_ require the arguments to be given in
+       reverse order. Ideally, you would write the `multipush' 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 `multipop', and the macro
+       would take care of popping the registers in the opposite order from
+       the one in which they were pushed.
+
+       This can be done by the following definition:
+
+       %macro  multipop 1-* 
+       
+         %rep %0 
+         %rotate -1 
+               pop     %1 
+         %endrep 
+       
+       %endmacro
+
+       This macro begins by rotating its arguments one place to the
+       _right_, so that the original _last_ argument appears as `%1'. This
+       is then popped, and the arguments are rotated right again, so the
+       second-to-last argument becomes `%1'. Thus the arguments are
+       iterated through in reverse order.
+
+ 4.3.8 Concatenating Macro Parameters
+
+       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
+
+       %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
+
+       which would expand to
+
+       keytab: 
+       keyposF1        equ     $-keytab 
+                       db     128+1 
+       keyposF2        equ     $-keytab 
+                       db      128+2 
+       keyposReturn    equ     $-keytab 
+                       db      13
+
+       You can just as easily concatenate text on to the other end of a
+       macro parameter, by writing `%1foo'.
+
+       If you need to append a _digit_ to a macro parameter, for example
+       defining labels `foo1' and `foo2' when passed the parameter `foo',
+       you can't code `%11' because that would be taken as the eleventh
+       macro parameter. Instead, you must code `%{1}1', which will separate
+       the first `1' (giving the number of the macro parameter) from the
+       second (literal text to be concatenated to the parameter).
+
+       This concatenation can also be applied to other preprocessor in-line
+       objects, such as macro-local labels (section 4.3.3) and context-
+       local labels (section 4.7.2). In all cases, ambiguities in syntax
+       can be resolved by enclosing everything after the `%' sign and
+       before the literal text in braces: so `%{%foo}bar' concatenates the
+       text `bar' to the end of the real name of the macro-local label
+       `%%foo'. (This is unnecessary, since the form NASM uses for the real
+       names of macro-local labels means that the two usages `%{%foo}bar'
+       and `%%foobar' would both expand to the same thing anyway;
+       nevertheless, the capability is there.)
+
+       The single-line macro indirection construct, `%[...]' (section
+       4.1.3), behaves the same way as macro parameters for the purpose of
+       concatenation.
+
+       See also the `%+' operator, section 4.1.4.
+
+ 4.3.9 Condition Codes as Macro Parameters
+
+       NASM can give special treatment to a macro parameter which contains
+       a condition code. For a start, you can refer to the macro parameter
+       `%1' by means of the alternative syntax `%+1', 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 _not_ a valid condition
+       code.
+
+       Far more usefully, though, you can refer to the macro parameter by
+       means of `%-1', which NASM will expand as the _inverse_ condition
+       code. So the `retz' macro defined in section 4.3.3 can be replaced
+       by a general conditional-return macro like this:
+
+       %macro  retc 1 
+       
+               j%-1    %%skip 
+               ret 
+         %%skip: 
+       
+       %endmacro
+
+       This macro can now be invoked using calls like `retc ne', which will
+       cause the conditional-jump instruction in the macro expansion to
+       come out as `JE', or `retc po' which will make the jump a `JPE'.
+
+       The `%+1' macro-parameter reference is quite happy to interpret the
+       arguments `CXZ' and `ECXZ' as valid condition codes; however, `%-1'
+       will report an error if passed either of these, because no inverse
+       condition code exists.
+
+4.3.10 Disabling Listing Expansion
+
+       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.
+
+       NASM therefore provides the `.nolist' qualifier, which you can
+       include in a macro definition to inhibit the expansion of the macro
+       in the listing file. The `.nolist' qualifier comes directly after
+       the number of parameters, like this:
+
+       %macro foo 1.nolist
+
+       Or like this:
+
+       %macro bar 1-5+.nolist a,b,c,d,e,f,g,h
+
+4.3.11 Undefining Multi-Line Macros: `%unmacro'
+
+       Multi-line macros can be removed with the `%unmacro' directive.
+       Unlike the `%undef' directive, however, `%unmacro' takes an argument
+       specification, and will only remove exact matches with that argument
+       specification.
+
+       For example:
+
+       %macro foo 1-3 
+               ; Do something 
+       %endmacro 
+       %unmacro foo 1-3
+
+       removes the previously defined macro `foo', but
+
+       %macro bar 1-3 
+               ; Do something 
+       %endmacro 
+       %unmacro bar 1
+
+       does _not_ remove the macro `bar', since the argument specification
+       does not match exactly.
+
+4.3.12 Exiting Multi-Line Macros: `%exitmacro'
+
+       Multi-line macro expansions can be arbitrarily terminated with the
+       `%exitmacro' directive.
+
+       For example:
+
+       %macro foo 1-3 
+               ; Do something 
+           %if<condition> 
+               %exitmacro 
+           %endif 
+               ; Do something 
+       %endmacro
+
+   4.4 Conditional Assembly
+
+       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:
+
+       %if<condition> 
+           ; some code which only appears if <condition> is met 
+       %elif<condition2> 
+           ; only appears if <condition> is not met but <condition2> is 
+       %else 
+           ; this appears if neither <condition> nor <condition2> was met 
+       %endif
+
+       The inverse forms `%ifn' and `%elifn' are also supported.
+
+       The `%else' clause is optional, as is the `%elif' clause. You can
+       have more than one `%elif' clause as well.
+
+       There are a number of variants of the `%if' directive. Each has its
+       corresponding `%elif', `%ifn', and `%elifn' directives; for example,
+       the equivalents to the `%ifdef' directive are `%elifdef', `%ifndef',
+       and `%elifndef'.
+
+ 4.4.1 `%ifdef': Testing Single-Line Macro Existence
+
+       Beginning a conditional-assembly block with the line `%ifdef MACRO'
+       will assemble the subsequent code if, and only if, a single-line
+       macro called `MACRO' is defined. If not, then the `%elif' and
+       `%else' blocks (if any) will be processed instead.
+
+       For example, when debugging a program, you might want to write code
+       such as
+
+                 ; perform some function 
+       %ifdef DEBUG 
+                 writefile 2,"Function performed successfully",13,10 
+       %endif 
+                 ; go and do something else
+
+       Then you could use the command-line option `-dDEBUG' to create a
+       version of the program which produced debugging messages, and remove
+       the option to generate the final release version of the program.
+
+       You can test for a macro _not_ being defined by using `%ifndef'
+       instead of `%ifdef'. You can also test for macro definitions in
+       `%elif' blocks by using `%elifdef' and `%elifndef'.
+
+ 4.4.2 `%ifmacro': Testing Multi-Line Macro Existence
+
+       The `%ifmacro' directive operates in the same way as the `%ifdef'
+       directive, except that it checks for the existence of a multi-line
+       macro.
+
+       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.
+
+       The `%ifmacro' is considered true if defining a macro with the given
+       name and number of arguments would cause a definitions conflict. For
+       example:
+
+       %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
+
+       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.
+
+       You can test for the macro not existing by using the `%ifnmacro'
+       instead of `%ifmacro'. Additional tests can be performed in `%elif'
+       blocks by using `%elifmacro' and `%elifnmacro'.
+
+ 4.4.3 `%ifctx': Testing the Context Stack
+
+       The conditional-assembly construct `%ifctx' 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 `%ifdef', the inverse and `%elif' forms
+       `%ifnctx', `%elifctx' and `%elifnctx' are also supported.
+
+       For more details of the context stack, see section 4.7. For a sample
+       use of `%ifctx', see section 4.7.5.
+
+ 4.4.4 `%if': Testing Arbitrary Numeric Expressions
+
+       The conditional-assembly construct `%if expr' will cause the
+       subsequent code to be assembled if and only if the value of the
+       numeric expression `expr' is non-zero. An example of the use of this
+       feature is in deciding when to break out of a `%rep' preprocessor
+       loop: see section 4.5 for a detailed example.
+
+       The expression given to `%if', and its counterpart `%elif', is a
+       critical expression (see section 3.8).
+
+       `%if' extends the normal NASM expression syntax, by providing a set
+       of relational operators which are not normally available in
+       expressions. The operators `=', `<', `>', `<=', `>=' and `<>' test
+       equality, less-than, greater-than, less-or-equal, greater-or-equal
+       and not-equal respectively. The C-like forms `==' and `!=' are
+       supported as alternative forms of `=' and `<>'. In addition, low-
+       priority logical operators `&&', `^^' and `||' 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 `^^', 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.
+
+       Like other `%if' constructs, `%if' has a counterpart `%elif', and
+       negative forms `%ifn' and `%elifn'.
+
+ 4.4.5 `%ifidn' and `%ifidni': Testing Exact Text Identity
+
+       The construct `%ifidn text1,text2' will cause the subsequent code to
+       be assembled if and only if `text1' and `text2', after expanding
+       single-line macros, are identical pieces of text. Differences in
+       white space are not counted.
+
+       `%ifidni' is similar to `%ifidn', but is case-insensitive.
+
+       For example, the following macro pushes a register or number on the
+       stack, and allows you to treat `IP' as a real register:
+
+       %macro  pushparam 1 
+       
+         %ifidni %1,ip 
+               call    %%label 
+         %%label: 
+         %else 
+               push    %1 
+         %endif 
+       
+       %endmacro
+
+       Like other `%if' constructs, `%ifidn' has a counterpart `%elifidn',
+       and negative forms `%ifnidn' and `%elifnidn'. Similarly, `%ifidni'
+       has counterparts `%elifidni', `%ifnidni' and `%elifnidni'.
+
+ 4.4.6 `%ifid', `%ifnum', `%ifstr': Testing Token Types
+
+       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.
+
+       The conditional assembly construct `%ifid', 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.
+       `%ifnum' works similarly, but tests for the token being a numeric
+       constant; `%ifstr' tests for it being a string.
+
+       For example, the `writefile' macro defined in section 4.3.4 can be
+       extended to take advantage of `%ifstr' in the following fashion:
+
+       %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
+
+       Then the `writefile' macro can cope with being called in either of
+       the following two ways:
+
+               writefile [file], strpointer, length 
+               writefile [file], "hello", 13, 10
+
+       In the first, `strpointer' is used as the address of an already-
+       declared string, and `length' 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.
+
+       Note the use of `%if' inside the `%ifstr': this is to detect whether
+       the macro was passed two arguments (so the string would be a single
+       string constant, and `db %2' would be adequate) or more (in which
+       case, all but the first two would be lumped together into `%3', and
+       `db %2,%3' would be required).
+
+       The usual `%elif'..., `%ifn'..., and `%elifn'... versions exist for
+       each of `%ifid', `%ifnum' and `%ifstr'.
+
+ 4.4.7 `%iftoken': Test for a Single Token
+
+       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 `%+')
+       versus a multi-token sequence.
+
+       The conditional assembly construct `%iftoken' assembles the
+       subsequent code if and only if the expanded parameters consist of
+       exactly one token, possibly surrounded by whitespace.
+
+       For example:
+
+       %iftoken 1
+
+       will assemble the subsequent code, but
+
+       %iftoken -1
+
+       will not, since `-1' contains two tokens: the unary minus operator
+       `-', and the number `1'.
+
+       The usual `%eliftoken', `%ifntoken', and `%elifntoken' variants are
+       also provided.
+
+ 4.4.8 `%ifempty': Test for Empty Expansion
+
+       The conditional assembly construct `%ifempty' assembles the
+       subsequent code if and only if the expanded parameters do not
+       contain any tokens at all, whitespace excepted.
+
+       The usual `%elifempty', `%ifnempty', and `%elifnempty' variants are
+       also provided.
+
+   4.5 Preprocessor Loops: `%rep'
+
+       NASM's `TIMES' 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: `%rep'.
+
+       The directives `%rep' and `%endrep' (`%rep' takes a numeric
+       argument, which can be an expression; `%endrep' takes no arguments)
+       can be used to enclose a chunk of code, which is then replicated as
+       many times as specified by the preprocessor:
+
+       %assign i 0 
+       %rep    64 
+               inc     word [table+2*i] 
+       %assign i i+1 
+       %endrep
+
+       This will generate a sequence of 64 `INC' instructions, incrementing
+       every word of memory from `[table]' to `[table+126]'.
+
+       For more complex termination conditions, or to break out of a repeat
+       loop part way along, you can use the `%exitrep' directive to
+       terminate the loop, like this:
+
+       fibonacci: 
+       %assign i 0 
+       %assign j 1 
+       %rep 100 
+       %if j > 65535 
+           %exitrep 
+       %endif 
+               dw j 
+       %assign k j+i 
+       %assign i j 
+       %assign j k 
+       %endrep 
+       
+       fib_number equ ($-fibonacci)/2
+
+       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
+       `%rep'. 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.
+
+   4.6 Source Files and Dependencies
+
+       These commands allow you to split your sources into multiple files.
+
+ 4.6.1 `%include': Including Other Files
+
+       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 `%include' directive:
+
+       %include "macros.mac"
+
+       will include the contents of the file `macros.mac' into the source
+       file containing the `%include' directive.
+
+       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 `-i'
+       option.
+
+       The standard C idiom for preventing a file being included more than
+       once is just as applicable in NASM: if the file `macros.mac' has the
+       form
+
+       %ifndef MACROS_MAC 
+           %define MACROS_MAC 
+           ; now define some macros 
+       %endif
+
+       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 `MACROS_MAC' will already be defined.
+
+       You can force a file to be included even if there is no `%include'
+       directive that explicitly includes it, by using the `-p' option on
+       the NASM command line (see section 2.1.17).
+
+ 4.6.2 `%pathsearch': Search the Include Path
+
+       The `%pathsearch' 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.)
+
+       For example,
+
+       %pathsearch MyFoo "foo.bin"
+
+       ... with `-Ibins/' in the include path may end up defining the macro
+       `MyFoo' to be `"bins/foo.bin"'.
+
+ 4.6.3 `%depend': Add Dependent Files
+
+       The `%depend' directive takes a filename and adds it to the list of
+       files to be emitted as dependency generation when the `-M' options
+       and its relatives (see section 2.1.4) are used. It produces no
+       output.
+
+       This is generally used in conjunction with `%pathsearch'. For
+       example, a simplified version of the standard macro wrapper for the
+       `INCBIN' directive looks like:
+
+       %imacro incbin 1-2+ 0 
+       %pathsearch dep %1 
+       %depend dep 
+               incbin dep,%2 
+       %endmacro
+
+       This first resolves the location of the file into the macro `dep',
+       then adds it to the dependency lists, and finally issues the
+       assembler-level `INCBIN' directive.
+
+ 4.6.4 `%use': Include Standard Macro Package
+
+       The `%use' directive is similar to `%include', 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 chapter 5.
+
+       Unlike the `%include' directive, package names for the `%use'
+       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:
+
+       %use altreg 
+       %use 'altreg'
+
+       Standard macro packages are protected from multiple inclusion. When
+       a standard macro package is used, a testable single-line macro of
+       the form `__USE_'_package_`__' is also defined, see section 4.11.8.
+
+   4.7 The Context Stack
+
+       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 `REPEAT' ...
+       `UNTIL' loop, in which the expansion of the `REPEAT' macro would
+       need to be able to refer to a label which the `UNTIL' macro had
+       defined. However, for such a macro you would also want to be able to
+       nest these loops.
+
+       NASM provides this level of power by means of a _context stack_. The
+       preprocessor maintains a stack of _contexts_, each of which is
+       characterized by a name. You add a new context to the stack using
+       the `%push' directive, and remove one using `%pop'. You can define
+       labels that are local to a particular context on the stack.
+
+ 4.7.1 `%push' and `%pop': Creating and Removing Contexts
+
+       The `%push' directive is used to create a new context and place it
+       on the top of the context stack. `%push' takes an optional argument,
+       which is the name of the context. For example:
+
+       %push    foobar
+
+       This pushes a new context called `foobar' 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 `%push' and the `%pop' are inside a
+       single macro definition.)
+
+       The directive `%pop', 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.
+
+ 4.7.2 Context-Local Labels
+
+       Just as the usage `%%foo' defines a label which is local to the
+       particular macro call in which it is used, the usage `%$foo' is used
+       to define a label which is local to the context on the top of the
+       context stack. So the `REPEAT' and `UNTIL' example given above could
+       be implemented by means of:
+
+       %macro repeat 0 
+       
+           %push   repeat 
+           %$begin: 
+       
+       %endmacro 
+       
+       %macro until 1 
+       
+               j%-1    %$begin 
+           %pop 
+       
+       %endmacro
+
+       and invoked by means of, for example,
+
+               mov     cx,string 
+               repeat 
+               add     cx,3 
+               scasb 
+               until   e
+
+       which would scan every fourth byte of a string in search of the byte
+       in `AL'.
+
+       If you need to define, or access, labels local to the context
+       _below_ the top one on the stack, you can use `%$$foo', or `%$$$foo'
+       for the context below that, and so on.
+
+ 4.7.3 Context-Local Single-Line Macros
+
+       NASM also allows you to define single-line macros which are local to
+       a particular context, in just the same way:
+
+       %define %$localmac 3
+
+       will define the single-line macro `%$localmac' to be local to the
+       top context on the stack. Of course, after a subsequent `%push', it
+       can then still be accessed by the name `%$$localmac'.
+
+ 4.7.4 `%repl': Renaming a Context
+
+       If you need to change the name of the top context on the stack (in
+       order, for example, to have it respond differently to `%ifctx'), you
+       can execute a `%pop' followed by a `%push'; but this will have the
+       side effect of destroying all context-local labels and macros
+       associated with the context that was just popped.
+
+       NASM provides the directive `%repl', which _replaces_ a context with
+       a different name, without touching the associated macros and labels.
+       So you could replace the destructive code
+
+       %pop 
+       %push   newname
+
+       with the non-destructive version `%repl newname'.
+
+ 4.7.5 Example Use of the Context Stack: Block IFs
+
+       This example makes use of almost all the context-stack features,
+       including the conditional-assembly construct `%ifctx', to implement
+       a block IF statement as a set of macros.
+
+       %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
+
+       This code is more robust than the `REPEAT' and `UNTIL' macros given
+       in section 4.7.2, because it uses conditional assembly to check that
+       the macros are issued in the right order (for example, not calling
+       `endif' before `if') and issues a `%error' if they're not.
+
+       In addition, the `endif' macro has to be able to cope with the two
+       distinct cases of either directly following an `if', or following an
+       `else'. It achieves this, again, by using conditional assembly to do
+       different things depending on whether the context on top of the
+       stack is `if' or `else'.
+
+       The `else' macro has to preserve the context on the stack, in order
+       to have the `%$ifnot' referred to by the `if' macro be the same as
+       the one defined by the `endif' macro, but has to change the
+       context's name so that `endif' will know there was an intervening
+       `else'. It does this by the use of `%repl'.
+
+       A sample usage of these macros might look like:
+
+               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
+
+       The block-`IF' macros handle nesting quite happily, by means of
+       pushing another context, describing the inner `if', on top of the
+       one describing the outer `if'; thus `else' and `endif' always refer
+       to the last unmatched `if' or `else'.
+
+   4.8 Stack Relative Preprocessor Directives
+
+       The following preprocessor directives provide a way to use labels to
+       refer to local variables allocated on the stack.
+
+       (*) `%arg' (see section 4.8.1)
+
+       (*) `%stacksize' (see section 4.8.2)
+
+       (*) `%local' (see section 4.8.3)
+
+ 4.8.1 `%arg' Directive
+
+       The `%arg' 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.
+
+       While NASM has macros which attempt to duplicate this functionality
+       (see section 8.4.5), the syntax is not particularly convenient to
+       use. and is not TASM compatible. Here is an example which shows the
+       use of `%arg' without any external macros:
+
+       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
+
+       This is similar to the procedure defined in section 8.4.5 and adds
+       the value in i to the value pointed to by j_ptr and returns the sum
+       in the ax register. See section 4.7.1 for an explanation of `push'
+       and `pop' and the use of context stacks.
+
+ 4.8.2 `%stacksize' Directive
+
+       The `%stacksize' directive is used in conjunction with the `%arg'
+       (see section 4.8.1) and the `%local' (see section 4.8.3) directives.
+       It tells NASM the default size to use for subsequent `%arg' and
+       `%local' directives. The `%stacksize' directive takes one required
+       argument which is one of `flat', `flat64', `large' or `small'.
+
+       %stacksize flat
+
+       This form causes NASM to use stack-based parameter addressing
+       relative to `ebp' and it assumes that a near form of call was used
+       to get to this label (i.e. that `eip' is on the stack).
+
+       %stacksize flat64
+
+       This form causes NASM to use stack-based parameter addressing
+       relative to `rbp' and it assumes that a near form of call was used
+       to get to this label (i.e. that `rip' is on the stack).
+
+       %stacksize large
+
+       This form uses `bp' to do stack-based parameter addressing and
+       assumes that a far form of call was used to get to this address
+       (i.e. that `ip' and `cs' are on the stack).
+
+       %stacksize small
+
+       This form also uses `bp' to address stack parameters, but it is
+       different from `large' because it also assumes that the old value of
+       bp is pushed onto the stack (i.e. it expects an `ENTER'
+       instruction). In other words, it expects that `bp', `ip' and `cs'
+       are on the top of the stack, underneath any local space which may
+       have been allocated by `ENTER'. This form is probably most useful
+       when used in combination with the `%local' directive (see section
+       4.8.3).
+
+ 4.8.3 `%local' Directive
+
+       The `%local' 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
+       `%local' directive is most useful when used with the `%stacksize'
+       (see section 4.8.2 and is also compatible with the `%arg' directive
+       (see section 4.8.1). It allows simplified reference to variables on
+       the stack which have been allocated typically by using the `ENTER'
+       instruction. An example of its use is the following:
+
+       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 & bx 
+               mov     [old_dx],dx     ; and swap dx & cx 
+               mov     ax,bx 
+               mov     dx,cx 
+               mov     bx,[old_ax] 
+               mov     cx,[old_dx] 
+               leave                   ; restore old bp 
+               ret                     ; 
+       
+           %pop                        ; restore original context
+
+       The `%$localsize' variable is used internally by the `%local'
+       directive and _must_ be defined within the current context before
+       the `%local' directive may be used. Failure to do so will result in
+       one expression syntax error for each `%local' variable declared. It
+       then may be used in the construction of an appropriately sized ENTER
+       instruction as shown in the example.
+
+   4.9 Reporting User-Defined Errors: `%error', `%warning', `%fatal'
+
+       The preprocessor directive `%error' 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:
+
+       %ifdef F1 
+           ; do some setup 
+       %elifdef F2 
+           ; do some different setup 
+       %else 
+           %error "Neither F1 nor F2 was defined." 
+       %endif
+
+       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.
+
+       Similarly, `%warning' issues a warning, but allows assembly to
+       continue:
+
+       %ifdef F1 
+           ; do some setup 
+       %elifdef F2 
+           ; do some different setup 
+       %else 
+           %warning "Neither F1 nor F2 was defined, assuming F1." 
+           %define F1 
+       %endif
+
+       `%error' and `%warning' are issued only on the final assembly pass.
+       This makes them safe to use in conjunction with tests that depend on
+       symbol values.
+
+       `%fatal' 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.
+
+       It is optional for the message string after `%error', `%warning' or
+       `%fatal' to be quoted. If it is _not_, then single-line macros are
+       expanded in it, which can be used to display more information to the
+       user. For example:
+
+       %if foo > 64 
+           %assign foo_over foo-64 
+           %error foo is foo_over bytes too large 
+       %endif
+
+  4.10 Other Preprocessor Directives
+
+       NASM also has preprocessor directives which allow access to
+       information from external sources. Currently they include:
+
+       (*) `%line' enables NASM to correctly handle the output of another
+           preprocessor (see section 4.10.1).
+
+       (*) `%!' enables NASM to read in the value of an environment
+           variable, which can then be used in your program (see section
+           4.10.2).
+
+4.10.1 `%line' Directive
+
+       The `%line' 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 `%line'
+       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.
+
+       This preprocessor directive is not generally of use to programmers,
+       by may be of interest to preprocessor authors. The usage of the
+       `%line' preprocessor directive is as follows:
+
+       %line nnn[+mmm] [filename]
+
+       In this directive, `nnn' identifies the line of the original source
+       file which this line corresponds to. `mmm' is an optional parameter
+       which specifies a line increment value; each line of the input file
+       read in is considered to correspond to `mmm' lines of the original
+       source file. Finally, `filename' is an optional parameter which
+       specifies the file name of the original source file.
+
+       After reading a `%line' preprocessor directive, NASM will report all
+       file name and line numbers relative to the values specified therein.
+
+4.10.2 `%!'`<env>': Read an environment variable.
+
+       The `%!<env>' 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.
+
+       For example, suppose that you have an environment variable `FOO',
+       and you want the contents of `FOO' to be embedded in your program.
+       You could do that as follows:
+
+       %defstr FOO    %!FOO
+
+       See section 4.1.8 for notes on the `%defstr' directive.
+
+  4.11 Standard Macros
+
+       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
+       `%clear' directive to empty the preprocessor of everything but
+       context-local preprocessor variables and single-line macros.
+
+       Most user-level assembler directives (see chapter 6) are implemented
+       as macros which invoke primitive directives; these are described in
+       chapter 6. The rest of the standard macro set is described here.
+
+4.11.1 NASM Version Macros
+
+       The single-line macros `__NASM_MAJOR__', `__NASM_MINOR__',
+       `__NASM_SUBMINOR__' and `___NASM_PATCHLEVEL__' 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, `__NASM_MAJOR__'
+       would be defined to be 0, `__NASM_MINOR__' would be defined as 98,
+       `__NASM_SUBMINOR__' would be defined to 32, and
+       `___NASM_PATCHLEVEL__' would be defined as 1.
+
+       Additionally, the macro `__NASM_SNAPSHOT__' is defined for
+       automatically generated snapshot releases _only_.
+
+4.11.2 `__NASM_VERSION_ID__': NASM Version ID
+
+       The single-line macro `__NASM_VERSION_ID__' expands to a dword
+       integer representing the full version number of the version of nasm
+       being used. The value is the equivalent to `__NASM_MAJOR__',
+       `__NASM_MINOR__', `__NASM_SUBMINOR__' and `___NASM_PATCHLEVEL__'
+       concatenated to produce a single doubleword. Hence, for 0.98.32p1,
+       the returned number would be equivalent to:
+
+               dd      0x00622001
+
+       or
+
+               db      1,32,98,0
+
+       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.
+
+4.11.3 `__NASM_VER__': NASM Version string
+
+       The single-line macro `__NASM_VER__' expands to a string which
+       defines the version number of nasm being used. So, under NASM
+       0.98.32 for example,
+
+               db      __NASM_VER__
+
+       would expand to
+
+               db      "0.98.32"
+
+4.11.4 `__FILE__' and `__LINE__': File Name and Line Number
+
+       Like the C preprocessor, NASM allows the user to find out the file
+       name and line number containing the current instruction. The macro
+       `__FILE__' expands to a string constant giving the name of the
+       current input file (which may change through the course of assembly
+       if `%include' directives are used), and `__LINE__' expands to a
+       numeric constant giving the current line number in the input file.
+
+       These macros could be used, for example, to communicate debugging
+       information to a macro, since invoking `__LINE__' inside a macro
+       definition (either single-line or multi-line) will return the line
+       number of the macro _call_, rather than _definition_. So to
+       determine where in a piece of code a crash is occurring, for
+       example, one could write a routine `stillhere', which is passed a
+       line number in `EAX' and outputs something like `line 155: still
+       here'. You could then write a macro
+
+       %macro  notdeadyet 0 
+       
+               push    eax 
+               mov     eax,__LINE__ 
+               call    stillhere 
+               pop     eax 
+       
+       %endmacro
+
+       and then pepper your code with calls to `notdeadyet' until you find
+       the crash point.
+
+4.11.5 `__BITS__': Current BITS Mode
+
+       The `__BITS__' standard macro is updated every time that the BITS
+       mode is set using the `BITS XX' or `[BITS XX]' directive, where XX
+       is a valid mode number of 16, 32 or 64. `__BITS__' receives the
+       specified mode number and makes it globally available. This can be
+       very useful for those who utilize mode-dependent macros.
+
+4.11.6 `__OUTPUT_FORMAT__': Current Output Format
+
+       The `__OUTPUT_FORMAT__' standard macro holds the current Output
+       Format, as given by the `-f' option or NASM's default. Type
+       `nasm -hf' for a list.
+
+       %ifidn __OUTPUT_FORMAT__, win32 
+        %define NEWLINE 13, 10 
+       %elifidn __OUTPUT_FORMAT__, elf32 
+        %define NEWLINE 10 
+       %endif
+
+4.11.7 Assembly Date and Time Macros
+
+       NASM provides a variety of macros that represent the timestamp of
+       the assembly session.
+
+       (*) The `__DATE__' and `__TIME__' macros give the assembly date and
+           time as strings, in ISO 8601 format (`"YYYY-MM-DD"' and
+           `"HH:MM:SS"', respectively.)
+
+       (*) The `__DATE_NUM__' and `__TIME_NUM__' macros give the assembly
+           date and time in numeric form; in the format `YYYYMMDD' and
+           `HHMMSS' respectively.
+
+       (*) The `__UTC_DATE__' and `__UTC_TIME__' macros give the assembly
+           date and time in universal time (UTC) as strings, in ISO 8601
+           format (`"YYYY-MM-DD"' and `"HH:MM:SS"', respectively.) If the
+           host platform doesn't provide UTC time, these macros are
+           undefined.
+
+       (*) The `__UTC_DATE_NUM__' and `__UTC_TIME_NUM__' macros give the
+           assembly date and time universal time (UTC) in numeric form; in
+           the format `YYYYMMDD' and `HHMMSS' respectively. If the host
+           platform doesn't provide UTC time, these macros are undefined.
+
+       (*) The `__POSIX_TIME__' 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.
+
+       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:
+
+             __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
+
+4.11.8 `__USE_'_package_`__': Package Include Test
+
+       When a standard macro package (see chapter 5) is included with the
+       `%use' directive (see section 4.6.4), a single-line macro of the
+       form `__USE_'_package_`__' is automatically defined. This allows
+       testing if a particular package is invoked or not.
+
+       For example, if the `altreg' package is included (see section 5.1),
+       then the macro `__USE_ALTREG__' is defined.
+
+4.11.9 `__PASS__': Assembly Pass
+
+       The macro `__PASS__' is defined to be `1' on preparatory passes, and
+       `2' on the final pass. In preprocess-only mode, it is set to `3',
+       and when running only to generate dependencies (due to the `-M' or
+       `-MG' option, see section 2.1.4) it is set to `0'.
+
+       _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._
+
+4.11.10 `STRUC' and `ENDSTRUC': Declaring Structure Data Types
+
+       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
+       `STRUC' and `ENDSTRUC' are used to define a structure data type.
+
+       `STRUC' 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 `_size' appended to it is defined as an `EQU' giving
+       the size of the structure. Once `STRUC' has been issued, you are
+       defining the structure, and should define fields using the `RESB'
+       family of pseudo-instructions, and then invoke `ENDSTRUC' to finish
+       the definition.
+
+       For example, to define a structure called `mytype' containing a
+       longword, a word, a byte and a string of bytes, you might code
+
+       struc   mytype 
+       
+         mt_long:      resd    1 
+         mt_word:      resw    1 
+         mt_byte:      resb    1 
+         mt_str:       resb    32 
+       
+       endstruc
+
+       The above code defines six symbols: `mt_long' as 0 (the offset from
+       the beginning of a `mytype' structure to the longword field),
+       `mt_word' as 4, `mt_byte' as 6, `mt_str' as 7, `mytype_size' as 39,
+       and `mytype' itself as zero.
+
+       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:
+
+       struc mytype 
+       
+         .long:        resd    1 
+         .word:        resw    1 
+         .byte:        resb    1 
+         .str:         resb    32 
+       
+       endstruc
+
+       This defines the offsets to the structure fields as `mytype.long',
+       `mytype.word', `mytype.byte' and `mytype.str'.
+
+       NASM, since it has no _intrinsic_ 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 `mov ax,[mystruc.mt_word]' is not valid. `mt_word'
+       is a constant just like any other constant, so the correct syntax is
+       `mov ax,[mystruc+mt_word]' or `mov ax,[mystruc+mytype.word]'.
+
+       Sometimes you only have the address of the structure displaced by an
+       offset. For example, consider this standard stack frame setup:
+
+       push ebp 
+       mov ebp, esp 
+       sub esp, 40
+
+       In this case, you could access an element by subtracting the offset:
+
+       mov [ebp - 40 + mytype.word], ax
+
+       However, if you do not want to repeat this offset, you can use -40
+       as a base offset:
+
+       struc mytype, -40
+
+       And access an element this way:
+
+       mov [ebp + mytype.word], ax
+
+4.11.11 `ISTRUC', `AT' and `IEND': Declaring Instances of Structures
+
+       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 `ISTRUC'
+       mechanism. To declare a structure of type `mytype' in a program, you
+       code something like this:
+
+       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
+
+       The function of the `AT' macro is to make use of the `TIMES' 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.
+
+       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 `AT' line. For example:
+
+               at mt_str,  db      123,134,145,156,167,178,189 
+                           db      190,100,0
+
+       Depending on personal taste, you can also omit the code part of the
+       `AT' line completely, and start the structure field on the next
+       line:
+
+               at mt_str 
+                       db      'hello, world' 
+                       db      13,10,0
+
+4.11.12 `ALIGN' and `ALIGNB': Data Alignment
+
+       The `ALIGN' and `ALIGNB' macros provides a convenient way to align
+       code or data on a word, longword, paragraph or other boundary. (Some
+       assemblers call this directive `EVEN'.) The syntax of the `ALIGN'
+       and `ALIGNB' macros is
+
+               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
+
+       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 `TIMES' prefix to their second argument to
+       perform the alignment.
+
+       If the second argument is not specified, the default for `ALIGN' is
+       `NOP', and the default for `ALIGNB' is `RESB 1'. So if the second
+       argument is specified, the two macros are equivalent. Normally, you
+       can just use `ALIGN' in code and data sections and `ALIGNB' in BSS
+       sections, and never need the second argument except for special
+       purposes.
+
+       `ALIGN' and `ALIGNB', 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.
+
+       `ALIGNB' (or `ALIGN' with a second argument of `RESB 1') can be used
+       within structure definitions:
+
+       struc mytype2 
+       
+         mt_byte: 
+               resb 1 
+               alignb 2 
+         mt_word: 
+               resw 1 
+               alignb 4 
+         mt_long: 
+               resd 1 
+         mt_str: 
+               resb 32 
+       
+       endstruc
+
+       This will ensure that the structure members are sensibly aligned
+       relative to the base of the structure.
+
+       A final caveat: `ALIGN' and `ALIGNB' work relative to the beginning
+       of the _section_, 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
+       `ALIGN' or `ALIGNB'.
+
+       See also the `smartalign' standard macro package, section 5.2.
+
+Chapter 5: Standard Macro Packages
+----------------------------------
+
+       The `%use' directive (see section 4.6.4) includes one of the
+       standard macro packages included with the NASM distribution and
+       compiled into the NASM binary. It operates like the `%include'
+       directive (see section 4.6.1), but the included contents is provided
+       by NASM itself.
+
+       The names of standard macro packages are case insensitive, and can
+       be quoted or not.
+
+   5.1 `altreg': Alternate Register Names
+
+       The `altreg' standard macro package provides alternate register
+       names. It provides numeric register names for all registers (not
+       just `R8'-`R15'), the Intel-defined aliases `R8L'-`R15L' for the low
+       bytes of register (as opposed to the NASM/AMD standard names `R8B'-
+       `R15B'), and the names `R0H'-`R3H' (by analogy with `R0L'-`R3L') for
+       `AH', `CH', `DH', and `BH'.
+
+       Example use:
+
+       %use altreg 
+       
+       proc: 
+             mov r0l,r3h                    ; mov al,bh 
+             ret
+
+       See also section 11.1.
+
+   5.2 `smartalign': Smart `ALIGN' Macro
+
+       The `smartalign' standard macro package provides for an `ALIGN'
+       macro which is more powerful than the default (and backwards-
+       compatible) one (see section 4.11.12). When the `smartalign' package
+       is enabled, when `ALIGN' is used without a second argument, NASM
+       will generate a sequence of instructions more efficient than a
+       series of `NOP'. Furthermore, if the padding exceeds a specific
+       threshold, then NASM will generate a jump over the entire padding
+       sequence.
+
+       The specific instructions generated can be controlled with the new
+       `ALIGNMODE' macro. This macro takes two parameters: one mode, and an
+       optional jump threshold override. The modes are as follows:
+
+       (*) `generic': Works on all x86 CPUs and should have reasonable
+           performance. The default jump threshold is 8. This is the
+           default.
+
+       (*) `nop': Pad out with `NOP' instructions. The only difference
+           compared to the standard `ALIGN' macro is that NASM can still
+           jump over a large padding area. The default jump threshold is
+           16.
+
+       (*) `k7': Optimize for the AMD K7 (Athlon/Althon XP). These
+           instructions should still work on all x86 CPUs. The default jump
+           threshold is 16.
+
+       (*) `k8': Optimize for the AMD K8 (Opteron/Althon 64). These
+           instructions should still work on all x86 CPUs. The default jump
+           threshold is 16.
+
+       (*) `p6': Optimize for Intel CPUs. This uses the long `NOP'
+           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.
+
+       The macro `__ALIGNMODE__' is defined to contain the current
+       alignment mode. A number of other macros beginning with `__ALIGN_'
+       are used internally by this macro package.
+
+Chapter 6: Assembler Directives
+-------------------------------
+
+       NASM, though it attempts to avoid the bureaucracy of assemblers like
+       MASM and TASM, is nevertheless forced to support a _few_ directives.
+       These are described in this chapter.
+
+       NASM's directives come in two types: _user-level_ directives and
+       _primitive_ 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.
+
+       Primitive directives are enclosed in square brackets; user-level
+       directives are not.
+
+       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
+       _format-specific_ directives are documented along with the formats
+       that implement them, in chapter 7.
+
+   6.1 `BITS': Specifying Target Processor Mode
+
+       The `BITS' 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 `BITS XX', where XX is 16, 32 or 64.
+
+       In most cases, you should not need to use `BITS' explicitly. The
+       `aout', `coff', `elf', `macho', `win32' and `win64' 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 `obj' object format allows you to specify each segment
+       you define as either `USE16' or `USE32', and NASM will set its
+       operating mode accordingly, so the use of the `BITS' directive is
+       once again unnecessary.
+
+       The most likely reason for using the `BITS' directive is to write
+       32-bit or 64-bit code in a flat binary file; this is because the
+       `bin' output format defaults to 16-bit mode in anticipation of it
+       being used most frequently to write DOS `.COM' programs, DOS `.SYS'
+       device drivers and boot loader software.
+
+       You do _not_ need to specify `BITS 32' 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.
+
+       When NASM is in `BITS 16' 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 `BITS 32' 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.
+
+       When NASM is in `BITS 64' mode, most instructions operate the same
+       as they do for `BITS 32' mode. However, there are 8 more general and
+       SSE registers, and 16-bit addressing is no longer supported.
+
+       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
+       `REX' prefix is used both to select 64-bit operand size, and to
+       access the new registers. NASM automatically inserts REX prefixes
+       when necessary.
+
+       When the `REX' 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.
+
+       The `BITS' directive has an exactly equivalent primitive form,
+       `[BITS 16]', `[BITS 32]' and `[BITS 64]'. The user-level form is a
+       macro which has no function other than to call the primitive form.
+
+       Note that the space is neccessary, e.g. `BITS32' will _not_ work!
+
+ 6.1.1 `USE16' & `USE32': Aliases for BITS
+
+       The ``USE16'' and ``USE32'' directives can be used in place of
+       ``BITS 16'' and ``BITS 32'', for compatibility with other
+       assemblers.
+
+   6.2 `DEFAULT': Change the assembler defaults
+
+       The `DEFAULT' 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.
+
+       Currently, the only `DEFAULT' that is settable is whether or not
+       registerless instructions in 64-bit mode are `RIP'-relative or not.
+       By default, they are absolute unless overridden with the `REL'
+       specifier (see section 3.3). However, if `DEFAULT REL' is specified,
+       `REL' is default, unless overridden with the `ABS' specifier,
+       _except when used with an FS or GS segment override_.
+
+       The special handling of `FS' and `GS' 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 `RIP'-relative
+       addresses would be extremely confusing.
+
+       `DEFAULT REL' is disabled with `DEFAULT ABS'.
+
+   6.3 `SECTION' or `SEGMENT': Changing and Defining Sections
+
+       The `SECTION' directive (`SEGMENT' 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 `SECTION' 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.
+
+       The Unix object formats, and the `bin' object format (but see
+       section 7.1.3, all support the standardized section names `.text',
+       `.data' and `.bss' for the code, data and uninitialized-data
+       sections. The `obj' 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.
+
+ 6.3.1 The `__SECT__' Macro
+
+       The `SECTION' directive is unusual in that its user-level form
+       functions differently from its primitive form. The primitive form,
+       `[SECTION xyz]', simply switches the current target section to the
+       one given. The user-level form, `SECTION xyz', however, first
+       defines the single-line macro `__SECT__' to be the primitive
+       `[SECTION]' directive which it is about to issue, and then issues
+       it. So the user-level directive
+
+               SECTION .text
+
+       expands to the two lines
+
+       %define __SECT__        [SECTION .text] 
+               [SECTION .text]
+
+       Users may find it useful to make use of this in their own macros.
+       For example, the `writefile' macro defined in section 4.3.4 can be
+       usefully rewritten in the following more sophisticated form:
+
+       %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
+
+       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 `SECTION' directive so as not to modify
+       `__SECT__'. It then declares its string in the data section, and
+       then invokes `__SECT__' to switch back to _whichever_ section the
+       user was previously working in. It thus avoids the need, in the
+       previous version of the macro, to include a `JMP' instruction to
+       jump over the data, and also does not fail if, in a complicated
+       `OBJ' format module, the user could potentially be assembling the
+       code in any of several separate code sections.
+
+   6.4 `ABSOLUTE': Defining Absolute Labels
+
+       The `ABSOLUTE' directive can be thought of as an alternative form of
+       `SECTION': 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 `RESB' family.
+
+       `ABSOLUTE' is used as follows:
+
+       absolute 0x1A 
+       
+           kbuf_chr    resw    1 
+           kbuf_free   resw    1 
+           kbuf        resw    16
+
+       This example describes a section of the PC BIOS data area, at
+       segment address 0x40: the above code defines `kbuf_chr' to be 0x1A,
+       `kbuf_free' to be 0x1C, and `kbuf' to be 0x1E.
+
+       The user-level form of `ABSOLUTE', like that of `SECTION', redefines
+       the `__SECT__' macro when it is invoked.
+
+       `STRUC' and `ENDSTRUC' are defined as macros which use `ABSOLUTE'
+       (and also `__SECT__').
+
+       `ABSOLUTE' doesn't have to take an absolute constant as an argument:
+       it can take an expression (actually, a critical expression: see
+       section 3.8) 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:
+
+               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:
+
+       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.
+
+   6.5 `EXTERN': Importing Symbols from Other Modules
+
+       `EXTERN' is similar to the MASM directive `EXTRN' and the C keyword
+       `extern': 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 `bin'
+       format cannot.
+
+       The `EXTERN' directive takes as many arguments as you like. Each
+       argument is the name of a symbol:
+
+       extern  _printf 
+       extern  _sscanf,_fscanf
+
+       Some object-file formats provide extra features to the `EXTERN'
+       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 `obj' format allows you to declare that the default
+       segment base of an external should be the group `dgroup' by means of
+       the directive
+
+       extern  _variable:wrt dgroup
+
+       The primitive form of `EXTERN' 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.
+
+       You can declare the same variable as `EXTERN' more than once: NASM
+       will quietly ignore the second and later redeclarations. You can't
+       declare a variable as `EXTERN' as well as something else, though.
+
+   6.6 `GLOBAL': Exporting Symbols to Other Modules
+
+       `GLOBAL' is the other end of `EXTERN': if one module declares a
+       symbol as `EXTERN' and refers to it, then in order to prevent linker
+       errors, some other module must actually _define_ the symbol and
+       declare it as `GLOBAL'. Some assemblers use the name `PUBLIC' for
+       this purpose.
+
+       The `GLOBAL' directive applying to a symbol must appear _before_ the
+       definition of the symbol.
+
+       `GLOBAL' uses the same syntax as `EXTERN', except that it must refer
+       to symbols which _are_ defined in the same module as the `GLOBAL'
+       directive. For example:
+
+       global _main 
+       _main: 
+               ; some code
+
+       `GLOBAL', like `EXTERN', allows object formats to define private
+       extensions by means of a colon. The `elf' object format, for
+       example, lets you specify whether global data items are functions or
+       data:
+
+       global  hashlookup:function, hashtable:data
+
+       Like `EXTERN', the primitive form of `GLOBAL' differs from the user-
+       level form only in that it can take only one argument at a time.
+
+   6.7 `COMMON': Defining Common Data Areas
+
+       The `COMMON' directive is used to declare _common variables_. A
+       common variable is much like a global variable declared in the
+       uninitialized data section, so that
+
+       common  intvar  4
+
+       is similar in function to
+
+       global  intvar 
+       section .bss 
+       
+       intvar  resd    1
+
+       The difference is that if more than one module defines the same
+       common variable, then at link time those variables will be _merged_,
+       and references to `intvar' in all modules will point at the same
+       piece of memory.
+
+       Like `GLOBAL' and `EXTERN', `COMMON' supports object-format specific
+       extensions. For example, the `obj' format allows common variables to
+       be NEAR or FAR, and the `elf' format allows you to specify the
+       alignment requirements of a common variable:
+
+       common  commvar  4:near  ; works in OBJ 
+       common  intarray 100:4   ; works in ELF: 4 byte aligned
+
+       Once again, like `EXTERN' and `GLOBAL', the primitive form of
+       `COMMON' differs from the user-level form only in that it can take
+       only one argument at a time.
+
+   6.8 `CPU': Defining CPU Dependencies
+
+       The `CPU' directive restricts assembly to those instructions which
+       are available on the specified CPU.
+
+       Options are:
+
+       (*) `CPU 8086' Assemble only 8086 instruction set
+
+       (*) `CPU 186' Assemble instructions up to the 80186 instruction set
+
+       (*) `CPU 286' Assemble instructions up to the 286 instruction set
+
+       (*) `CPU 386' Assemble instructions up to the 386 instruction set
+
+       (*) `CPU 486' 486 instruction set
+
+       (*) `CPU 586' Pentium instruction set
+
+       (*) `CPU PENTIUM' Same as 586
+
+       (*) `CPU 686' P6 instruction set
+
+       (*) `CPU PPRO' Same as 686
+
+       (*) `CPU P2' Same as 686
+
+       (*) `CPU P3' Pentium III (Katmai) instruction sets
+
+       (*) `CPU KATMAI' Same as P3
+
+       (*) `CPU P4' Pentium 4 (Willamette) instruction set
+
+       (*) `CPU WILLAMETTE' Same as P4
+
+       (*) `CPU PRESCOTT' Prescott instruction set
+
+       (*) `CPU X64' x86-64 (x64/AMD64/Intel 64) instruction set
+
+       (*) `CPU IA64' IA64 CPU (in x86 mode) instruction set
+
+       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.
+
+   6.9 `FLOAT': Handling of floating-point constants
+
+       By default, floating-point constants are rounded to nearest, and
+       IEEE denormals are supported. The following options can be set to
+       alter this behaviour:
+
+       (*) `FLOAT DAZ' Flush denormals to zero
+
+       (*) `FLOAT NODAZ' Do not flush denormals to zero (default)
+
+       (*) `FLOAT NEAR' Round to nearest (default)
+
+       (*) `FLOAT UP' Round up (toward +Infinity)
+
+       (*) `FLOAT DOWN' Round down (toward -Infinity)
+
+       (*) `FLOAT ZERO' Round toward zero
+
+       (*) `FLOAT DEFAULT' Restore default settings
+
+       The standard macros `__FLOAT_DAZ__', `__FLOAT_ROUND__', and
+       `__FLOAT__' contain the current state, as long as the programmer has
+       avoided the use of the brackeded primitive form, (`[FLOAT]').
+
+       `__FLOAT__' contains the full set of floating-point settings; this
+       value can be saved away and invoked later to restore the setting.
+
+Chapter 7: Output Formats
+-------------------------
+
+       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 `-f' option on the
+       NASM command line. Each of these formats, along with its extensions
+       to the base NASM syntax, is detailed in this chapter.
+
+       As stated in section 2.1.1, 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 (`.asm',
+       `.s', 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.
+
+   7.1 `bin': Flat-Form Binary Output
+
+       The `bin' 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: `.COM' executables and `.SYS' device
+       drivers are pure binary files. Pure binary output is also useful for
+       operating system and boot loader development.
+
+       The `bin' format supports multiple section names. For details of how
+       NASM handles sections in the `bin' format, see section 7.1.3.
+
+       Using the `bin' format puts NASM by default into 16-bit mode (see
+       section 6.1). In order to use `bin' to write 32-bit or 64-bit code,
+       such as an OS kernel, you need to explicitly issue the `BITS 32' or
+       `BITS 64' directive.
+
+       `bin' 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 `binprog.asm'
+       into a binary file called `binprog'.
+
+ 7.1.1 `ORG': Binary File Program Origin
+
+       The `bin' format provides an additional directive to the list given
+       in chapter 6: `ORG'. The function of the `ORG' directive is to
+       specify the origin address which NASM will assume the program begins
+       at when it is loaded into memory.
+
+       For example, the following code will generate the longword
+       `0x00000104':
+
+               org     0x100 
+               dd      label 
+       label:
+
+       Unlike the `ORG' 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 `ORG' does exactly what the
+       directive says: _origin_. 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 section 12.1.3 for further comments.
+
+ 7.1.2 `bin' Extensions to the `SECTION' Directive
+
+       The `bin' output format extends the `SECTION' (or `SEGMENT')
+       directive to allow you to specify the alignment requirements of
+       segments. This is done by appending the `ALIGN' qualifier to the end
+       of the section-definition line. For example,
+
+       section .data   align=16
+
+       switches to the section `.data' and also specifies that it must be
+       aligned on a 16-byte boundary.
+
+       The parameter to `ALIGN' 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.
+
+ 7.1.3 Multisection Support for the `bin' Format
+
+       The `bin' format allows the use of multiple sections, of arbitrary
+       names, besides the "known" `.text', `.data', and `.bss' names.
+
+       (*) Sections may be designated `progbits' or `nobits'. Default is
+           `progbits' (except `.bss', which defaults to `nobits', of
+           course).
+
+       (*) Sections can be aligned at a specified boundary following the
+           previous section with `align=', or at an arbitrary byte-granular
+           position with `start='.
+
+       (*) Sections can be given a virtual start address, which will be
+           used for the calculation of all memory references within that
+           section with `vstart='.
+
+       (*) Sections can be ordered using `follows='`<section>' or
+           `vfollows='`<section>' as an alternative to specifying an
+           explicit start address.
+
+       (*) Arguments to `org', `start', `vstart', and `align=' are critical
+           expressions. See section 3.8. E.g. `align=(1 << ALIGN_SHIFT)' -
+           `ALIGN_SHIFT' must be defined before it is used here.
+
+       (*) Any code which comes before an explicit `SECTION' directive is
+           directed by default into the `.text' section.
+
+       (*) If an `ORG' statement is not given, `ORG 0' is used by default.
+
+       (*) The `.bss' section will be placed after the last `progbits'
+           section, unless `start=', `vstart=', `follows=', or `vfollows='
+           has been specified.
+
+       (*) All sections are aligned on dword boundaries, unless a different
+           alignment has been specified.
+
+       (*) Sections may not overlap.
+
+       (*) NASM creates the `section.<secname>.start' for each section,
+           which may be used in your code.
+
+ 7.1.4 Map Files
+
+       Map files can be generated in `-f bin' format by means of the
+       `[map]' option. Map types of `all' (default), `brief', `sections',
+       `segments', or `symbols' may be specified. Output may be directed to
+       `stdout' (default), `stderr', or a specified file. E.g.
+       `[map symbols myfile.map]'. No "user form" exists, the square
+       brackets must be used.
+
+   7.2 `ith': Intel Hex Output
+
+       The `ith' file format produces Intel hex-format files. Just as the
+       `bin' 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.
+
+       All extensions supported by the `bin' file format is also supported
+       by the `ith' file format.
+
+       `ith' provides a default output file-name extension of `.ith'.
+
+   7.3 `srec': Motorola S-Records Output
+
+       The `srec' file format produces Motorola S-records files. Just as
+       the `bin' 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.
+
+       All extensions supported by the `bin' file format is also supported
+       by the `srec' file format.
+
+       `srec' provides a default output file-name extension of `.srec'.
+
+   7.4 `obj': Microsoft OMF Object Files
+
+       The `obj' file format (NASM calls it `obj' rather than `omf' for
+       historical reasons) is the one produced by MASM and TASM, which is
+       typically fed to 16-bit DOS linkers to produce `.EXE' files. It is
+       also the format used by OS/2.
+
+       `obj' provides a default output file-name extension of `.obj'.
+
+       `obj' is not exclusively a 16-bit format, though: NASM has full
+       support for the 32-bit extensions to the format. In particular, 32-
+       bit `obj' format files are used by Borland's Win32 compilers,
+       instead of using Microsoft's newer `win32' object file format.
+
+       The `obj' format does not define any special segment names: you can
+       call your segments anything you like. Typical names for segments in
+       `obj' format files are `CODE', `DATA' and `BSS'.
+
+       If your source file contains code before specifying an explicit
+       `SEGMENT' directive, then NASM will invent its own segment called
+       `__NASMDEFSEG' for you.
+
+       When you define a segment in an `obj' 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:
+
+       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
+
+       The `obj' format also enables the use of the `SEG' and `WRT'
+       operators, so that you can write code which does things like
+
+       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
+
+ 7.4.1 `obj' Extensions to the `SEGMENT' Directive
+
+       The `obj' output format extends the `SEGMENT' (or `SECTION')
+       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,
+
+       segment code private align=16
+
+       defines the segment `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.
+
+       The available qualifiers are:
+
+       (*) `PRIVATE', `PUBLIC', `COMMON' and `STACK' specify the
+           combination characteristics of the segment. `PRIVATE' segments
+           do not get combined with any others by the linker; `PUBLIC' and
+           `STACK' segments get concatenated together at link time; and
+           `COMMON' segments all get overlaid on top of each other rather
+           than stuck end-to-end.
+
+       (*) `ALIGN' 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.
+
+       (*) `CLASS' 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. `CLASS=CODE'.
+
+       (*) `OVERLAY', like `CLASS', is specified with an arbitrary word as
+           an argument, and provides overlay information to an overlay-
+           capable linker.
+
+       (*) Segments can be declared as `USE16' or `USE32', 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.
+
+       (*) When writing OS/2 object files, you should declare 32-bit
+           segments as `FLAT', which causes the default segment base for
+           anything in the segment to be the special group `FLAT', and also
+           defines the group if it is not already defined.
+
+       (*) The `obj' 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 `SEGMENT SCREEN ABSOLUTE=0xB800' if you need to. The
+           `ABSOLUTE' and `ALIGN' keywords are mutually exclusive.
+
+       NASM's default segment attributes are `PUBLIC', `ALIGN=1', no class,
+       no overlay, and `USE16'.
+
+ 7.4.2 `GROUP': Defining Groups of Segments
+
+       The `obj' 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 `GROUP' directive, whereby you
+       can code
+
+       segment data 
+       
+               ; some data 
+       
+       segment bss 
+       
+               ; some uninitialized data 
+       
+       group dgroup data bss
+
+       which will define a group called `dgroup' to contain the segments
+       `data' and `bss'. Like `SEGMENT', `GROUP' causes the group name to
+       be defined as a symbol, so that you can refer to a variable `var' in
+       the `data' segment as `var wrt data' or as `var wrt dgroup',
+       depending on which segment value is currently in your segment
+       register.
+
+       If you just refer to `var', however, and `var' is declared in a
+       segment which is part of a group, then NASM will default to giving
+       you the offset of `var' from the beginning of the _group_, not the
+       _segment_. Therefore `SEG var', also, will return the group base
+       rather than the segment base.
+
+       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.
+
+       A group does not have to contain any segments; you can still make
+       `WRT' references to a group which does not contain the variable you
+       are referring to. OS/2, for example, defines the special group
+       `FLAT' with no segments in it.
+
+ 7.4.3 `UPPERCASE': Disabling Case Sensitivity in Output
+
+       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 `UPPERCASE' 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.
+
+       `UPPERCASE' is used alone on a line; it requires no parameters.
+
+ 7.4.4 `IMPORT': Importing DLL Symbols
+
+       The `IMPORT' 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 `EXTERN' as
+       well as using the `IMPORT' directive.
+
+       The `IMPORT' 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:
+
+           import  WSAStartup wsock32.dll
+
+       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:
+
+           import  asyncsel wsock32.dll WSAAsyncSelect
+
+ 7.4.5 `EXPORT': Exporting DLL Symbols
+
+       The `EXPORT' 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 `GLOBAL' as well as using
+       the `EXPORT' directive.
+
+       `EXPORT' 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 _external_ 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.
+
+       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:
+
+       (*) `resident' 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.
+
+       (*) `nodata' indicates that the exported symbol is a function which
+           does not make use of any initialized data.
+
+       (*) `parm=NNN', where `NNN' 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.
+
+       (*) An attribute which is just a number indicates that the symbol
+           should be exported with an identifying number (ordinal), and
+           gives the desired number.
+
+       For example:
+
+           export  myfunc 
+           export  myfunc TheRealMoreFormalLookingFunctionName 
+           export  myfunc myfunc 1234  ; export by ordinal 
+           export  myfunc myfunc resident parm=23 nodata
+
+ 7.4.6 `..start': Defining the Program Entry Point
+
+       `OMF' 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 `..start' at the point where you wish execution
+       to begin.
+
+ 7.4.7 `obj' Extensions to the `EXTERN' Directive
+
+       If you declare an external symbol with the directive
+
+           extern  foo
+
+       then references such as `mov ax,foo' will give you the offset of
+       `foo' from its preferred segment base (as specified in whichever
+       module `foo' is actually defined in). So to access the contents of
+       `foo' you will usually need to do something like
+
+               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
+
+       This is a little unwieldy, particularly if you know that an external
+       is going to be accessible from a given segment or group, say
+       `dgroup'. So if `DS' already contained `dgroup', you could simply
+       code
+
+               mov     ax,[foo wrt dgroup]
+
+       However, having to type this every time you want to access `foo' can
+       be a pain; so NASM allows you to declare `foo' in the alternative
+       form
+
+           extern  foo:wrt dgroup
+
+       This form causes NASM to pretend that the preferred segment base of
+       `foo' is in fact `dgroup'; so the expression `seg foo' will now
+       return `dgroup', and the expression `foo' is equivalent to
+       `foo wrt dgroup'.
+
+       This default-`WRT' 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 section 7.4.8.
+
+ 7.4.8 `obj' Extensions to the `COMMON' Directive
+
+       The `obj' 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
+
+       common  nearvar 2:near   ; `nearvar' is a near common 
+       common  farvar  10:far   ; and `farvar' is far
+
+       Far common variables may be greater in size than 64Kb, and so the
+       OMF specification says that they are declared as a number of
+       _elements_ 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.
+
+       Some `OMF' 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:
+
+       common  c_5by2  10:far 5        ; two five-byte elements 
+       common  c_2by5  10:far 2        ; five two-byte elements
+
+       If no element size is specified, the default is 1. Also, the `FAR'
+       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
+
+       common  c_5by2  10:5            ; two five-byte elements 
+       common  c_2by5  10:2            ; five two-byte elements
+
+       In addition to these extensions, the `COMMON' directive in `obj'
+       also supports default-`WRT' specification like `EXTERN' does
+       (explained in section 7.4.7). So you can also declare things like
+
+       common  foo     10:wrt dgroup 
+       common  bar     16:far 2:wrt data 
+       common  baz     24:wrt data:6
+
+   7.5 `win32': Microsoft Win32 Object Files
+
+       The `win32' 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 `obj'
+       instead (see section 7.4).
+
+       `win32' provides a default output file-name extension of `.obj'.
+
+       Note that although Microsoft say that Win32 object files follow the
+       `COFF' (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 `coff' output
+       format; conversely, the `coff' format does not produce object files
+       that Win32 linkers can generate correct output from.
+
+ 7.5.1 `win32' Extensions to the `SECTION' Directive
+
+       Like the `obj' format, `win32' allows you to specify additional
+       information on the `SECTION' 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
+       `.text', `.data' and `.bss', but may still be overridden by these
+       qualifiers.
+
+       The available qualifiers are:
+
+       (*) `code', or equivalently `text', 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.
+
+       (*) `data' and `bss' define the section to be a data section,
+           analogously to `code'. Data sections are marked as readable and
+           writable, but not executable. `data' declares an initialized
+           data section, whereas `bss' declares an uninitialized data
+           section.
+
+       (*) `rdata' declares an initialized data section that is readable
+           but not writable. Microsoft compilers use this section to place
+           constants in it.
+
+       (*) `info' 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 _to_ the linker. For example,
+           declaring an `info'-type section called `.drectve' causes the
+           linker to interpret the contents of the section as command-line
+           options.
+
+       (*) `align=', used with a trailing number as in `obj', 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.
+
+       The defaults assumed by NASM if you do not specify the above
+       qualifiers are:
+
+       section .text    code  align=16 
+       section .data    data  align=4 
+       section .rdata   rdata align=8 
+       section .bss     bss   align=4
+
+       Any other section name is treated by default like `.text'.
+
+ 7.5.2 `win32': Safe Structured Exception Handling
+
+       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 `/safeseh' command line option.
+
+       Without regard to this run-time check merits it's natural to expect
+       NASM to be capable of generating modules suitable for `/safeseh'
+       linking. From developer's viewpoint the problem is two-fold:
+
+       (*) how to adapt modules not deploying exception handlers of their
+           own;
+
+       (*) how to adapt/develop modules utilizing custom exception
+           handling;
+
+       Former can be easily achieved with any NASM version by adding
+       following line to source code:
+
+       $@feat.00 equ 1
+
+       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.
+
+       Registering custom exception handler on the other hand requires
+       certain "magic." As of version 2.03 additional directive is
+       implemented, `safeseh', which instructs the assembler to produce
+       appropriately formatted input data for above mentioned "safe
+       exception handler table." Its typical use would be:
+
+       section .text 
+       extern  _MessageBoxA@16 
+       %if     __NASM_VERSION_ID__ >= 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 '
+
+       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
+       `[fs:0]' 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 `safeseh' 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.
+
+       Finally, all mentions of linker in this paragraph refer to Microsoft
+       linker version 7.x and later. Presence of `@feat.00' 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.
+
+   7.6 `win64': Microsoft Win64 Object Files
+
+       The `win64' output format generates Microsoft Win64 object files,
+       which is nearly 100% identical to the `win32' object format (section
+       7.5) 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 `win32' object format (section 7.5), in NASM, with
+       regard to this exception.
+
+ 7.6.1 `win64': Writing Position-Independent Code
+
+       While `REL' 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:
+
+               jmp     QWORD[dsptch+rax*8] 
+               ... 
+       dsptch: dq      case0 
+               dq      case1 
+               ...
+
+       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
+       "`'ADDR32' relocation to '.text' invalid without /LARGEADDRESSAWARE:NO'".
+       So [s]he will have to split jmp instruction as following:
+
+               lea     rbx,[rel dsptch] 
+               jmp     QWORD[rbx+rax*8]
+
+       What happens behind the scene is that effective address in `lea' 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 `caseN' 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:
+
+               lea     rbx,[rel dsptch] 
+               add     rbx,QWORD[rbx+rax*8] 
+               jmp     rbx 
+               ... 
+       dsptch: dq      case0-dsptch 
+               dq      case1-dsptch 
+               ...
+
+       NASM version 2.03 and later provides another alternative,
+       `wrt ..imagebase' 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 `IMAGE_DOS_HEADER' structure. Here is how to implement switch
+       with these image-relative references:
+
+               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
+
+       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 `wrt ..imagebase' will
+       become apparent in next paragraph.
+
+       It should be noted that `wrt ..imagebase' is defined as 32-bit
+       operand only:
+
+               dd      label wrt ..imagebase           ; ok 
+               dq      label wrt ..imagebase           ; bad 
+               mov     eax,label wrt ..imagebase       ; ok 
+               mov     rax,label wrt ..imagebase       ; bad
+
+ 7.6.2 `win64': Structured Exception Handling
+
+       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 `UNWIND_INFO' 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 _nor_ 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.
+
+       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
+       `UNWIND_INFO' 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.
+
+       Now, when we understand significance of the `UNWIND_INFO' 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"), _or_ rest of `UNWIND_INFO' 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 `UNWIND_INFO'
+       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.
+
+       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:
+
+       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 '
+
+       What you see in `.pdata' section is element of the "table comprising
+       start and end addresses of function" along with reference to
+       associated `UNWIND_INFO' structure. And what you see in `.xdata'
+       section is `UNWIND_INFO' structure describing function with no
+       frame, but with designated exception handler. References are
+       _required_ to be image-relative (which is the real reason for
+       implementing `wrt ..imagebase' operator). It should be noted that
+       `rdata align=n', as well as `wrt ..imagebase', are optional in these
+       two segments' contexts, i.e. can be omitted. Latter means that _all_
+       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
+       `UNWIND_INFO' 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.
+
+       As already mentioned, in Win64 terms leaf function is one that does
+       not call any other function _nor_ 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 `UNWIND_INFO' 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:
+
+       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
+
+       The keyword is that up to `magic_point' original `rsp' value remains
+       in chosen volatile register and no non-volatile register, except for
+       `rsp', is modified. While past `magic_point' `rsp' remains constant
+       till the very end of the `function'. In this case custom language-
+       specific exception handler would look like this:
+
+       EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, 
+               CONTEXT *context,DISPATCHER_CONTEXT *disp) 
+       {   ULONG64 *rsp; 
+           if (context->Rip<(ULONG64)magic_point) 
+               rsp = (ULONG64 *)context->Rax; 
+           else 
+           {   rsp = ((ULONG64 **)context->Rsp)[0]; 
+               context->Rbp = rsp[-3]; 
+               context->Rbx = rsp[-2]; 
+               context->R15 = rsp[-1]; 
+           } 
+           context->Rsp = (ULONG64)rsp; 
+       
+           memcpy (disp->ContextRecord,context,sizeof(CONTEXT)); 
+           RtlVirtualUnwind(UNW_FLAG_NHANDLER,disp->ImageBase, 
+               dips->ControlPc,disp->FunctionEntry,disp->ContextRecord, 
+               &disp->HandlerData,&disp->EstablisherFrame,NULL); 
+           return ExceptionContinueSearch; 
+       }
+
+       As custom handler mimics leaf function, corresponding `UNWIND_INFO'
+       structure does not have to contain any information about stack frame
+       and its layout.
+
+   7.7 `coff': Common Object File Format
+
+       The `coff' output type produces `COFF' object files suitable for
+       linking with the DJGPP linker.
+
+       `coff' provides a default output file-name extension of `.o'.
+
+       The `coff' format supports the same extensions to the `SECTION'
+       directive as `win32' does, except that the `align' qualifier and the
+       `info' section type are not supported.
+
+   7.8 `macho32' and `macho64': Mach Object File Format
+
+       The `macho32' and `macho64' output formts produces `Mach-O' object
+       files suitable for linking with the MacOS X linker. `macho' is a
+       synonym for `macho32'.
+
+       `macho' provides a default output file-name extension of `.o'.
+
+   7.9 `elf32' and `elf64': Executable and Linkable Format Object Files
+
+       The `elf32' and `elf64' output formats generate `ELF32 and ELF64'
+       (Executable and Linkable Format) object files, as used by Linux as
+       well as Unix System V, including Solaris x86, UnixWare and SCO Unix.
+       `elf' provides a default output file-name extension of `.o'. `elf'
+       is a synonym for `elf32'.
+
+ 7.9.1 ELF specific directive `osabi'
+
+       The ELF header specifies the application binary interface for the
+       target operating system (OSABI). This field can be set by using the
+       `osabi' 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.
+
+ 7.9.2 `elf' Extensions to the `SECTION' Directive
+
+       Like the `obj' format, `elf' allows you to specify additional
+       information on the `SECTION' 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.
+
+       The available qualifiers are:
+
+       (*) `alloc' defines the section to be one which is loaded into
+           memory when the program is run. `noalloc' defines it to be one
+           which is not, such as an informational or comment section.
+
+       (*) `exec' defines the section to be one which should have execute
+           permission when the program is run. `noexec' defines it as one
+           which should not.
+
+       (*) `write' defines the section to be one which should be writable
+           when the program is run. `nowrite' defines it as one which
+           should not.
+
+       (*) `progbits' defines the section to be one with explicit contents
+           stored in the object file: an ordinary code or data section, for
+           example, `nobits' defines the section to be one with no explicit
+           contents given, such as a BSS section.
+
+       (*) `align=', used with a trailing number as in `obj', gives the
+           alignment requirements of the section.
+
+       (*) `tls' defines the section to be one which contains thread local
+           variables.
+
+       The defaults assumed by NASM if you do not specify the above
+       qualifiers are:
+
+
+       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
+
+       (Any section name other than those in the above table is treated by
+       default like `other' in the above table. Please note that section
+       names are case sensitive.)
+
+ 7.9.3 Position-Independent Code: `elf' Special Symbols and `WRT'
+
+       The `ELF' 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.
+
+       Since `ELF' does not support segment-base references, the `WRT'
+       operator is not used for its normal purpose; therefore NASM's `elf'
+       output format makes use of `WRT' for a different purpose, namely the
+       PIC-specific relocation types.
+
+       `elf' defines five special symbols which you can use as the right-
+       hand side of the `WRT' operator to obtain PIC relocation types. They
+       are `..gotpc', `..gotoff', `..got', `..plt' and `..sym'. Their
+       functions are summarized here:
+
+       (*) Referring to the symbol marking the global offset table base
+           using `wrt ..gotpc' will end up giving the distance from the
+           beginning of the current section to the global offset table.
+           (`_GLOBAL_OFFSET_TABLE_' is the standard symbol name used to
+           refer to the GOT.) So you would then need to add `$$' to the
+           result to get the real address of the GOT.
+
+       (*) Referring to a location in one of your own sections using
+           `wrt ..gotoff' 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.
+
+       (*) Referring to an external or global symbol using `wrt ..got'
+           causes the linker to build an entry _in_ 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.
+
+       (*) Referring to a procedure name using `wrt ..plt' 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 `CALL' or
+           `JMP'), since ELF contains no relocation type to refer to PLT
+           entries absolutely.
+
+       (*) Referring to a symbol name using `wrt ..sym' 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.
+
+       A fuller explanation of how to use these relocation types to write
+       shared libraries entirely in NASM is given in section 9.2.
+
+ 7.9.4 Thread Local Storage: `elf' Special Symbols and `WRT'
+
+       (*) In ELF32 mode, referring to an external or global symbol using
+           `wrt ..tlsie'  causes the linker to build an entry _in_ 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:
+
+              mov  eax,[tid wrt ..tlsie] 
+              mov  [gs:eax],ebx
+
+       (*) In ELF64 mode, referring to an external or global symbol using
+           `wrt ..gottpoff'  causes the linker to build an entry _in_ 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:
+
+              mov   rax,[rel tid wrt ..gottpoff] 
+              mov   rcx,[fs:rax]
+
+ 7.9.5 `elf' Extensions to the `GLOBAL' Directive
+
+       `ELF' 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 `GLOBAL' directive, allowing you to specify these features.
+
+       You can specify whether a global variable is a function or a data
+       object by suffixing the name with a colon and the word `function' or
+       `data'. (`object' is a synonym for `data'.) For example:
+
+       global   hashlookup:function, hashtable:data
+
+       exports the global symbol `hashlookup' as a function and `hashtable'
+       as a data object.
+
+       Optionally, you can control the ELF visibility of the symbol. Just
+       add one of the visibility keywords: `default', `internal', `hidden',
+       or `protected'. The default is `default' of course. For example, to
+       make `hashlookup' hidden:
+
+       global   hashlookup:function hidden
+
+       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:
+
+       global  hashtable:data (hashtable.end - hashtable) 
+       
+       hashtable: 
+               db this,that,theother  ; some data here 
+       .end:
+
+       This makes NASM automatically calculate the length of the table and
+       place that information into the `ELF' symbol table.
+
+       Declaring the type and size of global symbols is necessary when
+       writing shared library code. For more information, see section
+       9.2.4.
+
+ 7.9.6 `elf' Extensions to the `COMMON' Directive 
+
+       `ELF' 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:
+
+       common  dwordarray 128:4
+
+       This declares the total size of the array to be 128 bytes, and
+       requires that it be aligned on a 4-byte boundary.
+
+ 7.9.7 16-bit code and ELF 
+
+       The `ELF32' specification doesn't provide relocations for 8- and 16-
+       bit values, but the GNU `ld' linker adds these as an extension. NASM
+       can generate GNU-compatible relocations, to allow 16-bit code to be
+       linked as ELF using GNU `ld'. If NASM is used with the
+       `-w+gnu-elf-extensions' option, a warning is issued when one of
+       these relocations is generated.
+
+ 7.9.8 Debug formats and ELF 
+
+       `ELF32' and `ELF64' provide debug information in `STABS' and `DWARF'
+       formats. Line number information is generated for all executable
+       sections, but please note that only the ".text" section is
+       executable by default.
+
+  7.10 `aout': Linux `a.out' Object Files
+
+       The `aout' format generates `a.out' object files, in the form used
+       by early Linux systems (current Linux systems use ELF, see section
+       7.9.) These differ from other `a.out' object files in that the magic
+       number in the first four bytes of the file is different; also, some
+       implementations of `a.out', for example NetBSD's, support position-
+       independent code, which Linux's implementation does not.
+
+       `a.out' provides a default output file-name extension of `.o'.
+
+       `a.out' is a very simple object format. It supports no special
+       directives, no special symbols, no use of `SEG' or `WRT', and no
+       extensions to any standard directives. It supports only the three
+       standard section names `.text', `.data' and `.bss'.
+
+  7.11 `aoutb': NetBSD/FreeBSD/OpenBSD `a.out' Object Files
+
+       The `aoutb' format generates `a.out' object files, in the form used
+       by the various free `BSD Unix' clones, `NetBSD', `FreeBSD' and
+       `OpenBSD'. For simple object files, this object format is exactly
+       the same as `aout' except for the magic number in the first four
+       bytes of the file. However, the `aoutb' format supports
+       position-independent code in the same way as the `elf' format, so
+       you can use it to write `BSD' shared libraries.
+
+       `aoutb' provides a default output file-name extension of `.o'.
+
+       `aoutb' supports no special directives, no special symbols, and only
+       the three standard section names `.text', `.data' and `.bss'.
+       However, it also supports the same use of `WRT' as `elf' does, to
+       provide position-independent code relocation types. See section
+       7.9.3 for full documentation of this feature.
+
+       `aoutb' also supports the same extensions to the `GLOBAL' directive
+       as `elf' does: see section 7.9.5 for documentation of this.
+
+  7.12 `as86': Minix/Linux `as86' Object Files
+
+       The Minix/Linux 16-bit assembler `as86' has its own non-standard
+       object file format. Although its companion linker `ld86' produces
+       something close to ordinary `a.out' binaries as output, the object
+       file format used to communicate between `as86' and `ld86' is not
+       itself `a.out'.
+
+       NASM supports this format, just in case it is useful, as `as86'.
+       `as86' provides a default output file-name extension of `.o'.
+
+       `as86' is a very simple object format (from the NASM user's point of
+       view). It supports no special directives, no use of `SEG' or `WRT',
+       and no extensions to any standard directives. It supports only the
+       three standard section names `.text', `.data' and `.bss'. The only
+       special symbol supported is `..start'.
+
+  7.13 `rdf': Relocatable Dynamic Object File Format
+
+       The `rdf' output format produces `RDOFF' object files. `RDOFF'
+       (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.
+
+       `RDOFF' is not used by any well-known operating systems. Those
+       writing their own systems, however, may well wish to use `RDOFF' as
+       their object format, on the grounds that it is designed primarily
+       for simplicity and contains very little file-header bureaucracy.
+
+       The Unix NASM archive, and the DOS archive which includes sources,
+       both contain an `rdoff' subdirectory holding a set of RDOFF
+       utilities: an RDF linker, an `RDF' static-library manager, an RDF
+       file dump utility, and a program which will load and execute an RDF
+       executable under Linux.
+
+       `rdf' supports only the standard section names `.text', `.data' and
+       `.bss'.
+
+7.13.1 Requiring a Library: The `LIBRARY' Directive
+
+       `RDOFF' 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 `LIBRARY' directive, which takes one argument
+       which is the name of the module:
+
+           library  mylib.rdl
+
+7.13.2 Specifying a Module Name: The `MODULE' Directive
+
+       Special `RDOFF' 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. `MODULE' directive takes one argument which is the
+       name of current module:
+
+           module  mymodname
+
+       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 `$', like:
+
+           module  $kernel.core
+
+7.13.3 `rdf' Extensions to the `GLOBAL' Directive
+
+       `RDOFF' 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 `ELF', you can also specify whether an exported symbol
+       is a procedure (function) or data object.
+
+       Suffixing the name with a colon and the word `export' you make the
+       symbol exported:
+
+           global  sys_open:export
+
+       To specify that exported symbol is a procedure (function), you add
+       the word `proc' or `function' after declaration:
+
+           global  sys_open:export proc
+
+       Similarly, to specify exported data object, add the word `data' or
+       `object' to the directive:
+
+           global  kernel_ticks:export data
+
+7.13.4 `rdf' Extensions to the `EXTERN' Directive
+
+       By default the `EXTERN' directive in `RDOFF' 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, `RDOFF' offers an
+       additional `import' modifier. As in `GLOBAL', you can also specify
+       whether an imported symbol is a procedure (function) or data object.
+       For example:
+
+           library $libc 
+           extern  _open:import 
+           extern  _printf:import proc 
+           extern  _errno:import data
+
+       Here the directive `LIBRARY' is also included, which gives the
+       dynamic linker a hint as to where to find requested symbols.
+
+  7.14 `dbg': Debugging Format
+
+       The `dbg' 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 `OF_DBG' in `output/outform.h' or on the
+       compiler command line, and obtain the `dbg' output format.
+
+       The `dbg' 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.
+
+       For simple files, one can easily use the `dbg' format like this:
+
+       nasm -f dbg filename.asm
+
+       which will generate a diagnostic file called `filename.dbg'.
+       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 `dbg' format. Therefore it can be useful
+       to run NASM twice, in order to do the preprocessing with the native
+       object format selected:
+
+       nasm -e -f rdf -o rdfprog.i rdfprog.asm 
+       nasm -a -f dbg rdfprog.i
+
+       This preprocesses `rdfprog.asm' into `rdfprog.i', keeping the `rdf'
+       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 `dbg' format to generate the final
+       diagnostic output.
+
+       This workaround will still typically not work for programs intended
+       for `obj' format, because the `obj' `SEGMENT' and `GROUP' directives
+       have side effects of defining the segment and group names as
+       symbols; `dbg' will not do this, so the program will not assemble.
+       You will have to work around that by defining the symbols yourself
+       (using `EXTERN', for example) if you really need to get a `dbg'
+       trace of an `obj'-specific source file.
+
+       `dbg' accepts any section name and any directives at all, and logs
+       them all to its output file.
+
+Chapter 8: Writing 16-bit Code (DOS, Windows 3/3.1)
+---------------------------------------------------
+
+       This chapter attempts to cover some of the common issues encountered
+       when writing 16-bit code to run under `MS-DOS' or `Windows 3.x'. It
+       covers how to link programs to produce `.EXE' or `.COM' files, how
+       to write `.SYS' device drivers, and how to interface assembly
+       language code with 16-bit C compilers and with Borland Pascal.
+
+   8.1 Producing `.EXE' Files
+
+       Any large program written under DOS needs to be built as a `.EXE'
+       file: only `.EXE' files have the necessary internal structure
+       required to span more than one 64K segment. Windows programs, also,
+       have to be built as `.EXE' files, since Windows does not support the
+       `.COM' format.
+
+       In general, you generate `.EXE' files by using the `obj' output
+       format to produce one or more `.OBJ' files, and then linking them
+       together using a linker. However, NASM also supports the direct
+       generation of simple DOS `.EXE' files using the `bin' output format
+       (by using `DB' and `DW' to construct the `.EXE' file header), and a
+       macro package is supplied to do this. Thanks to Yann Guidon for
+       contributing the code for this.
+
+       NASM may also support `.EXE' natively as another output format in
+       future releases.
+
+ 8.1.1 Using the `obj' Format To Generate `.EXE' Files
+
+       This section describes the usual method of generating `.EXE' files
+       by linking `.OBJ' files together.
+
+       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 `LZH' archive format from `x2ftp.oulu.fi'. An LZH
+       archiver can be found at `ftp.simtel.net'. There is another `free'
+       linker (though this one doesn't come with sources) called FREELINK,
+       available from `www.pcorner.com'. A third, `djlink', written by DJ
+       Delorie, is available at `www.delorie.com'. A fourth linker,
+       `ALINK', written by Anthony A.J. Williams, is available at
+       `alink.sourceforge.net'.
+
+       When linking several `.OBJ' files into a `.EXE' file, you should
+       ensure that exactly one of them has a start point defined (using the
+       `..start' special symbol defined by the `obj' format: see section
+       7.4.6). 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
+       _which_ value to use.
+
+       An example of a NASM source file which can be assembled to a `.OBJ'
+       file and linked on its own to a `.EXE' 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 `test' subdirectory of the NASM archives, under
+       the name `objexe.asm'.
+
+       segment code 
+       
+       ..start: 
+               mov     ax,data 
+               mov     ds,ax 
+               mov     ax,stack 
+               mov     ss,ax 
+               mov     sp,stacktop
+
+       This initial piece of code sets up `DS' to point to the data
+       segment, and initializes `SS' and `SP' to point to the top of the
+       provided stack. Notice that interrupts are implicitly disabled for
+       one instruction after a move into `SS', precisely for this
+       situation, so that there's no chance of an interrupt occurring
+       between the loads of `SS' and `SP' and not having a stack to execute
+       on.
+
+       Note also that the special symbol `..start' is defined at the
+       beginning of this code, which means that will be the entry point
+       into the resulting executable file.
+
+               mov     dx,hello 
+               mov     ah,9 
+               int     0x21
+
+       The above is the main program: load `DS:DX' with a pointer to the
+       greeting message (`hello' is implicitly relative to the segment
+       `data', which was loaded into `DS' in the setup code, so the full
+       pointer is valid), and call the DOS print-string function.
+
+               mov     ax,0x4c00 
+               int     0x21
+
+       This terminates the program using another DOS system call.
+
+       segment data 
+       
+       hello:  db      'hello, world', 13, 10, '$'
+
+       The data segment contains the string we want to display.
+
+       segment stack stack 
+               resb 64 
+       stacktop:
+
+       The above code declares a stack segment containing 64 bytes of
+       uninitialized stack space, and points `stacktop' at the top of it.
+       The directive `segment stack stack' defines a segment _called_
+       `stack', and also of _type_ `STACK'. 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 `STACK'.
+
+       The above file, when assembled into a `.OBJ' file, will link on its
+       own to a valid `.EXE' file, which when run will print `hello, world'
+       and then exit.
+
+ 8.1.2 Using the `bin' Format To Generate `.EXE' Files
+
+       The `.EXE' file format is simple enough that it's possible to build
+       a `.EXE' 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 `DB' and `DW' commands by NASM itself, so that
+       you can use the `bin' output format to directly generate `.EXE'
+       files.
+
+       Included in the NASM archives, in the `misc' subdirectory, is a file
+       `exebin.mac' of macros. It defines three macros: `EXE_begin',
+       `EXE_stack' and `EXE_end'.
+
+       To produce a `.EXE' file using this method, you should start by
+       using `%include' to load the `exebin.mac' macro package into your
+       source file. You should then issue the `EXE_begin' macro call (which
+       takes no arguments) to generate the file header data. Then write
+       code as normal for the `bin' format - you can use all three standard
+       sections `.text', `.data' and `.bss'. At the end of the file you
+       should call the `EXE_end' macro (again, no arguments), which defines
+       some symbols to mark section sizes, and these symbols are referred
+       to in the header code generated by `EXE_begin'.
+
+       In this model, the code you end up writing starts at `0x100', just
+       like a `.COM' file - in fact, if you strip off the 32-byte header
+       from the resulting `.EXE' file, you will have a valid `.COM'
+       program. All the segment bases are the same, so you are limited to a
+       64K program, again just like a `.COM' file. Note that an `ORG'
+       directive is issued by the `EXE_begin' macro, so you should not
+       explicitly issue one of your own.
+
+       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 `CS' instead.
+
+       On entry to your `.EXE' file, `SS:SP' 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 `EXE_stack' macro. For example, to change the stack
+       size of your program to 64 bytes, you would call `EXE_stack 64'.
+
+       A sample program which generates a `.EXE' file in this way is given
+       in the `test' subdirectory of the NASM archive, as `binexe.asm'.
+
+   8.2 Producing `.COM' Files
+
+       While large DOS programs must be written as `.EXE' files, small ones
+       are often better written as `.COM' files. `.COM' files are pure
+       binary, and therefore most easily produced using the `bin' output
+       format.
+
+ 8.2.1 Using the `bin' Format To Generate `.COM' Files
+
+       `.COM' files expect to be loaded at offset `100h' into their segment
+       (though the segment may change). Execution then begins at `100h',
+       i.e. right at the start of the program. So to write a `.COM'
+       program, you would create a source file looking like
+
+               org 100h 
+       
+       section .text 
+       
+       start: 
+               ; put your code here 
+       
+       section .data 
+       
+               ; put data items here 
+       
+       section .bss 
+       
+               ; put uninitialized data here
+
+       The `bin' format puts the `.text' 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.
+
+       The BSS (uninitialized data) section does not take up space in the
+       `.COM' 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.
+
+       To assemble the above program, you should use a command line like
+
+       nasm myprog.asm -fbin -o myprog.com
+
+       The `bin' format would produce a file called `myprog' if no explicit
+       output file name were specified, so you have to override it and give
+       the desired file name.
+
+ 8.2.2 Using the `obj' Format To Generate `.COM' Files
+
+       If you are writing a `.COM' program as more than one module, you may
+       wish to assemble several `.OBJ' files and link them together into a
+       `.COM' program. You can do this, provided you have a linker capable
+       of outputting `.COM' files directly (TLINK does this), or
+       alternatively a converter program such as `EXE2BIN' to transform the
+       `.EXE' file output from the linker into a `.COM' file.
+
+       If you do this, you need to take care of several things:
+
+       (*) The first object file containing code should start its code
+           segment with a line like `RESB 100h'. This is to ensure that the
+           code begins at offset `100h' 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 `.COM' file. Other assemblers use an `ORG'
+           directive for this purpose, but `ORG' in NASM is a format-
+           specific directive to the `bin' output format, and does not mean
+           the same thing as it does in MASM-compatible assemblers.
+
+       (*) You don't need to define a stack segment.
+
+       (*) 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
+           `.COM' file is loaded, all the segment registers contain the
+           same value.
+
+   8.3 Producing `.SYS' Files
+
+       MS-DOS device drivers - `.SYS' files - are pure binary files,
+       similar to `.COM' files, except that they start at origin zero
+       rather than `100h'. Therefore, if you are writing a device driver
+       using the `bin' format, you do not need the `ORG' directive, since
+       the default origin for `bin' is zero. Similarly, if you are using
+       `obj', you do not need the `RESB 100h' at the start of your code
+       segment.
+
+       `.SYS' 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.
+
+       For more information on the format of `.SYS' 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
+       `comp.os.msdos.programmer'.
+
+   8.4 Interfacing to 16-bit C Programs
+
+       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 `.OBJ' file, and link it
+       with your C modules to produce a mixed-language program.
+
+ 8.4.1 External Symbol Names
+
+       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 `printf' appears
+       to an assembly language programmer as `_printf'. 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.
+
+       If you find the underscores inconvenient, you can define macros to
+       replace the `GLOBAL' and `EXTERN' directives as follows:
+
+       %macro  cglobal 1 
+       
+         global  _%1 
+         %define %1 _%1 
+       
+       %endmacro 
+       
+       %macro  cextern 1 
+       
+         extern  _%1 
+         %define %1 _%1 
+       
+       %endmacro
+
+       (These forms of the macros only take one argument at a time; a
+       `%rep' construct could solve this.)
+
+       If you then declare an external like this:
+
+       cextern printf
+
+       then the macro will expand it as
+
+       extern  _printf 
+       %define printf _printf
+
+       Thereafter, you can reference `printf' as if it was a symbol, and
+       the preprocessor will put the leading underscore on where necessary.
+
+       The `cglobal' macro works similarly. You must use `cglobal' before
+       defining the symbol in question, but you would have had to do that
+       anyway if you used `GLOBAL'.
+
+       Also see section 2.1.27.
+
+ 8.4.2 Memory Models
+
+       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:
+
+       (*) 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 `CS' register never changes its value, and always gives the
+           segment part of the full function address), and that functions
+           are called using ordinary near `CALL' instructions and return
+           using `RETN' (which, in NASM, is synonymous with `RET' anyway).
+           This means both that you should write your own routines to
+           return with `RETN', and that you should call external C routines
+           with near `CALL' instructions.
+
+       (*) 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 `CALL FAR' (or
+           `CALL seg:offset') and return using `RETF'. Again, you should
+           therefore write your own routines to return with `RETF' and use
+           `CALL FAR' to call external routines.
+
+       (*) In models using a single data segment (tiny, small and medium),
+           data pointers are 16 bits long, containing only an offset field
+           (the `DS' register doesn't change its value, and always gives
+           the segment part of the full data item address).
+
+       (*) 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 `DS' in your routines without restoring it
+           afterwards, but `ES' is free for you to use to access the
+           contents of 32-bit data pointers you are passed.
+
+       (*) 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.
+
+       (*) In most memory models, there is a _default_ data segment, whose
+           segment address is kept in `DS' throughout the program. This
+           data segment is typically the same segment as the stack, kept in
+           `SS', so that functions' local variables (which are stored on
+           the stack) and global data items can both be accessed easily
+           without changing `DS'. Particularly large data items are
+           typically stored in other segments. However, some memory models
+           (though not the standard ones, usually) allow the assumption
+           that `SS' and `DS' hold the same value to be removed. Be careful
+           about functions' local variables in this latter case.
+
+       In models with a single code segment, the segment is called `_TEXT',
+       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
+       `_DATA'.
+
+ 8.4.3 Function Definitions and Function Calls
+
+       The C calling convention in 16-bit programs is as follows. In the
+       following description, the words _caller_ and _callee_ are used to
+       denote the function doing the calling and the function which gets
+       called.
+
+       (*) 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).
+
+       (*) The caller then executes a `CALL' instruction to pass control to
+           the callee. This `CALL' is either near or far depending on the
+           memory model.
+
+       (*) 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 `SP' in `BP' so
+           as to be able to use `BP' 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 `BP'
+           must be preserved by any C function. Hence the callee, if it is
+           going to set up `BP' as a _frame pointer_, must push the
+           previous value first.
+
+       (*) The callee may then access its parameters relative to `BP'. The
+           word at `[BP]' holds the previous value of `BP' as it was
+           pushed; the next word, at `[BP+2]', holds the offset part of the
+           return address, pushed implicitly by `CALL'. In a small-model
+           (near) function, the parameters start after that, at `[BP+4]';
+           in a large-model (far) function, the segment part of the return
+           address lives at `[BP+4]', and the parameters begin at `[BP+6]'.
+           The leftmost parameter of the function, since it was pushed
+           last, is accessible at this offset from `BP'; the others follow,
+           at successively greater offsets. Thus, in a function such as
+           `printf' 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.
+
+       (*) The callee may also wish to decrease `SP' further, so as to
+           allocate space on the stack for local variables, which will then
+           be accessible at negative offsets from `BP'.
+
+       (*) The callee, if it wishes to return a value to the caller, should
+           leave the value in `AL', `AX' or `DX:AX' depending on the size
+           of the value. Floating-point results are sometimes (depending on
+           the compiler) returned in `ST0'.
+
+       (*) Once the callee has finished processing, it restores `SP' from
+           `BP' if it had allocated local stack space, then pops the
+           previous value of `BP', and returns via `RETN' or `RETF'
+           depending on memory model.
+
+       (*) When the caller regains control from the callee, the function
+           parameters are still on the stack, so it typically adds an
+           immediate constant to `SP' to remove them (instead of executing
+           a number of slow `POP' 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 _knows_ how many
+           parameters it pushed, does the removing.
+
+       It is instructive to compare this calling convention with that for
+       Pascal programs (described in section 8.5.1). 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 `RET' or `RETF' 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.
+
+       Thus, you would define a function in C style in the following way.
+       The following example is for small model:
+
+       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
+
+       For a large-model function, you would replace `RET' by `RETF', and
+       look for the first parameter at `[BP+6]' instead of `[BP+4]'. Of
+       course, if one of the parameters is a pointer, then the offsets of
+       _subsequent_ 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.
+
+       At the other end of the process, to call a C function from your
+       assembly code, you would do something like this:
+
+       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 -> %d <- should be 1234',10,0
+
+       This piece of code is the small-model assembly equivalent of the C
+       code
+
+           int myint = 1234; 
+           printf("This number -> %d <- should be 1234\n", myint);
+
+       In large model, the function-call code might look more like this. In
+       this example, it is assumed that `DS' already holds the segment base
+       of the segment `_DATA'. If not, you would have to initialize it
+       first.
+
+             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
+
+       The integer value still takes up one word on the stack, since large
+       model does not affect the size of the `int' data type. The first
+       argument (pushed last) to `printf', 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, `PUSH DS' would have been a shorter instruction
+       than `PUSH WORD SEG mystring', if `DS' 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 `SP' has to be
+       increased by 6 rather than 4 afterwards to make up for the extra
+       word of parameters.
+
+ 8.4.4 Accessing Data Items
+
+       To get at the contents of C variables, or to declare variables which
+       C can access, you need only declare the names as `GLOBAL' or
+       `EXTERN'. (Again, the names require leading underscores, as stated
+       in section 8.4.1.) Thus, a C variable declared as `int i' can be
+       accessed from assembler as
+
+       extern _i 
+       
+               mov ax,[_i]
+
+       And to declare your own integer variable which C programs can access
+       as `extern int j', you do this (making sure you are assembling in
+       the `_DATA' segment, if necessary):
+
+       global  _j 
+       
+       _j      dw      0
+
+       To access a C array, you need to know the size of the components of
+       the array. For example, `int' variables are two bytes long, so if a
+       C program declares an array as `int a[10]', you can access `a[3]' by
+       coding `mov ax,[_a+6]'. (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 `char', 2 for `short' and `int', 4 for `long' and `float', and
+       8 for `double'.
+
+       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 `STRUC'), or by calculating the one
+       offset and using just that.
+
+       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 `STRUC' macro, so you have
+       to specify alignment yourself if the C compiler generates it.
+       Typically, you might find that a structure like
+
+       struct { 
+           char c; 
+           int i; 
+       } foo;
+
+       might be four bytes long rather than three, since the `int' 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 `#pragma' lines, so you have to find
+       out how your own compiler does it.
+
+ 8.4.5 `c16.mac': Helper Macros for the 16-bit C Interface
+
+       Included in the NASM archives, in the `misc' directory, is a file
+       `c16.mac' of macros. It defines three macros: `proc', `arg' and
+       `endproc'. 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.
+
+       (An alternative, TASM compatible form of `arg' is also now built
+       into NASM's preprocessor. See section 4.8 for details.)
+
+       An example of an assembly function using the macro set is given
+       here:
+
+       proc    _nearproc 
+       
+       %$i     arg 
+       %$j     arg 
+               mov     ax,[bp + %$i] 
+               mov     bx,[bp + %$j] 
+               add     ax,[bx] 
+       
+       endproc
+
+       This defines `_nearproc' to be a procedure taking two arguments, the
+       first (`i') an integer and the second (`j') a pointer to an integer.
+       It returns `i + *j'.
+
+       Note that the `arg' macro has an `EQU' 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 `EQU' works, defining
+       `%$i' to be an offset from `BP'. A context-local variable is used,
+       local to the context pushed by the `proc' macro and popped by the
+       `endproc' macro, so that the same argument name can be used in later
+       procedures. Of course, you don't _have_ to do that.
+
+       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
+       `%define FARCODE'. This changes the kind of return instruction
+       generated by `endproc', 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.
+
+       `arg' 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 `int'.
+
+       The large-model equivalent of the above function would look like
+       this:
+
+       %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
+
+       This makes use of the argument to the `arg' macro to define a
+       parameter of size 4, because `j' is now a far pointer. When we load
+       from `j', we must load a segment and an offset.
+
+   8.5 Interfacing to Borland Pascal Programs
+
+       Interfacing to Borland Pascal programs is similar in concept to
+       interfacing to 16-bit C programs. The differences are:
+
+       (*) The leading underscore required for interfacing to C programs is
+           not required for Pascal.
+
+       (*) 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 `DS' 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 _pointers_, however, are far.
+
+       (*) The function calling convention is different - described below.
+
+       (*) Some data types, such as strings, are stored differently.
+
+       (*) 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.
+
+ 8.5.1 The Pascal Calling Convention
+
+       The 16-bit Pascal calling convention is as follows. In the following
+       description, the words _caller_ and _callee_ are used to denote the
+       function doing the calling and the function which gets called.
+
+       (*) 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).
+
+       (*) The caller then executes a far `CALL' instruction to pass
+           control to the callee.
+
+       (*) 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 `SP' in `BP' so
+           as to be able to use `BP' 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 `BP'
+           must be preserved by any function. Hence the callee, if it is
+           going to set up `BP' as a frame pointer, must push the previous
+           value first.
+
+       (*) The callee may then access its parameters relative to `BP'. The
+           word at `[BP]' holds the previous value of `BP' as it was
+           pushed. The next word, at `[BP+2]', holds the offset part of the
+           return address, and the next one at `[BP+4]' the segment part.
+           The parameters begin at `[BP+6]'. The rightmost parameter of the
+           function, since it was pushed last, is accessible at this offset
+           from `BP'; the others follow, at successively greater offsets.
+
+       (*) The callee may also wish to decrease `SP' further, so as to
+           allocate space on the stack for local variables, which will then
+           be accessible at negative offsets from `BP'.
+
+       (*) The callee, if it wishes to return a value to the caller, should
+           leave the value in `AL', `AX' or `DX:AX' depending on the size
+           of the value. Floating-point results are returned in `ST0'.
+           Results of type `Real' (Borland's own custom floating-point data
+           type, not handled directly by the FPU) are returned in
+           `DX:BX:AX'. To return a result of type `String', 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 `RETF' instruction.
+
+       (*) Once the callee has finished processing, it restores `SP' from
+           `BP' if it had allocated local stack space, then pops the
+           previous value of `BP', and returns via `RETF'. It uses the form
+           of `RETF' 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.
+
+       (*) 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.
+
+       Thus, you would define a function in Pascal style, taking two
+       `Integer'-type parameters, in the following way:
+
+       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
+
+       At the other end of the process, to call a Pascal function from your
+       assembly code, you would do something like this:
+
+       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
+
+       This is equivalent to the Pascal code
+
+       procedure SomeFunc(String: PChar; Int: Integer); 
+           SomeFunc(@mystring, myint);
+
+ 8.5.2 Borland Pascal Segment Name Restrictions
+
+       Since Borland Pascal's internal unit file format is completely
+       different from `OBJ', it only makes a very sketchy job of actually
+       reading and understanding the various information contained in a
+       real `OBJ' file when it links that in. Therefore an object file
+       intended to be linked to a Pascal program must obey a number of
+       restrictions:
+
+       (*) Procedures and functions must be in a segment whose name is
+           either `CODE', `CSEG', or something ending in `_TEXT'.
+
+       (*) initialized data must be in a segment whose name is either
+           `CONST' or something ending in `_DATA'.
+
+       (*) Uninitialized data must be in a segment whose name is either
+           `DATA', `DSEG', or something ending in `_BSS'.
+
+       (*) Any other segments in the object file are completely ignored.
+           `GROUP' directives and segment attributes are also ignored.
+
+ 8.5.3 Using `c16.mac' With Pascal Programs
+
+       The `c16.mac' macro package, described in section 8.4.5, can also be
+       used to simplify writing functions to be called from Pascal
+       programs, if you code `%define PASCAL'. This definition ensures that
+       functions are far (it implies `FARCODE'), and also causes procedure
+       return instructions to be generated with an operand.
+
+       Defining `PASCAL' does not change the code which calculates the
+       argument offsets; you must declare your function's arguments in
+       reverse order. For example:
+
+       %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
+
+       This defines the same routine, conceptually, as the example in
+       section 8.4.5: 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 `PASCAL' is defined
+       instead of `FARCODE', and that the arguments are declared in reverse
+       order.
+
+Chapter 9: Writing 32-bit Code (Unix, Win32, DJGPP)
+---------------------------------------------------
+
+       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.
+
+       Almost all 32-bit code, and in particular all code running under
+       `Win32', `DJGPP' or any of the PC Unix variants, runs in _flat_
+       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
+       `CALL' and `JMP' 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.
+
+   9.1 Interfacing to 32-bit C Programs
+
+       A lot of the discussion in section 8.4, 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.
+
+ 9.1.1 External Symbol Names
+
+       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 `ELF'
+       specification states that C symbols do _not_ have a leading
+       underscore on their assembly-language names.
+
+       The older Linux `a.out' C compiler, all `Win32' compilers, `DJGPP',
+       and `NetBSD' and `FreeBSD', all use the leading underscore; for
+       these compilers, the macros `cextern' and `cglobal', as given in
+       section 8.4.1, will still work. For `ELF', though, the leading
+       underscore should not be used.
+
+       See also section 2.1.27.
+
+ 9.1.2 Function Definitions and Function Calls
+
+       The C calling convention in 32-bit programs is as follows. In the
+       following description, the words _caller_ and _callee_ are used to
+       denote the function doing the calling and the function which gets
+       called.
+
+       (*) 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).
+
+       (*) The caller then executes a near `CALL' instruction to pass
+           control to the callee.
+
+       (*) 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 `ESP' in `EBP'
+           so as to be able to use `EBP' 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 `EBP'
+           must be preserved by any C function. Hence the callee, if it is
+           going to set up `EBP' as a frame pointer, must push the previous
+           value first.
+
+       (*) The callee may then access its parameters relative to `EBP'. The
+           doubleword at `[EBP]' holds the previous value of `EBP' as it
+           was pushed; the next doubleword, at `[EBP+4]', holds the return
+           address, pushed implicitly by `CALL'. The parameters start after
+           that, at `[EBP+8]'. The leftmost parameter of the function,
+           since it was pushed last, is accessible at this offset from
+           `EBP'; the others follow, at successively greater offsets. Thus,
+           in a function such as `printf' 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.
+
+       (*) The callee may also wish to decrease `ESP' further, so as to
+           allocate space on the stack for local variables, which will then
+           be accessible at negative offsets from `EBP'.
+
+       (*) The callee, if it wishes to return a value to the caller, should
+           leave the value in `AL', `AX' or `EAX' depending on the size of
+           the value. Floating-point results are typically returned in
+           `ST0'.
+
+       (*) Once the callee has finished processing, it restores `ESP' from
+           `EBP' if it had allocated local stack space, then pops the
+           previous value of `EBP', and returns via `RET' (equivalently,
+           `RETN').
+
+       (*) When the caller regains control from the callee, the function
+           parameters are still on the stack, so it typically adds an
+           immediate constant to `ESP' to remove them (instead of executing
+           a number of slow `POP' 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 _knows_ how many
+           parameters it pushed, does the removing.
+
+       There is an alternative calling convention used by Win32 programs
+       for Windows API calls, and also for functions called _by_ the
+       Windows API such as window procedures: they follow what Microsoft
+       calls the `__stdcall' convention. This is slightly closer to the
+       Pascal convention, in that the callee clears the stack by passing a
+       parameter to the `RET' instruction. However, the parameters are
+       still pushed in right-to-left order.
+
+       Thus, you would define a function in C style in the following way:
+
+       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
+
+       At the other end of the process, to call a C function from your
+       assembly code, you would do something like this:
+
+       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 -> %d <- should be 1234',10,0
+
+       This piece of code is the assembly equivalent of the C code
+
+           int myint = 1234; 
+           printf("This number -> %d <- should be 1234\n", myint);
+
+ 9.1.3 Accessing Data Items
+
+       To get at the contents of C variables, or to declare variables which
+       C can access, you need only declare the names as `GLOBAL' or
+       `EXTERN'. (Again, the names require leading underscores, as stated
+       in section 9.1.1.) Thus, a C variable declared as `int i' can be
+       accessed from assembler as
+
+                 extern _i 
+                 mov eax,[_i]
+
+       And to declare your own integer variable which C programs can access
+       as `extern int j', you do this (making sure you are assembling in
+       the `_DATA' segment, if necessary):
+
+                 global _j 
+       _j        dd 0
+
+       To access a C array, you need to know the size of the components of
+       the array. For example, `int' variables are four bytes long, so if a
+       C program declares an array as `int a[10]', you can access `a[3]' by
+       coding `mov ax,[_a+12]'. (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 `char', 2 for `short', 4 for `int', `long' and `float', and 8
+       for `double'. Pointers, being 32-bit addresses, are also 4 bytes
+       long.
+
+       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 `STRUC'), or by calculating the one
+       offset and using just that.
+
+       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 `STRUC' macro, so you have
+       to specify alignment yourself if the C compiler generates it.
+       Typically, you might find that a structure like
+
+       struct { 
+           char c; 
+           int i; 
+       } foo;
+
+       might be eight bytes long rather than five, since the `int' 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 `#pragma' lines, so you have to find
+       out how your own compiler does it.
+
+ 9.1.4 `c32.mac': Helper Macros for the 32-bit C Interface
+
+       Included in the NASM archives, in the `misc' directory, is a file
+       `c32.mac' of macros. It defines three macros: `proc', `arg' and
+       `endproc'. 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.
+
+       An example of an assembly function using the macro set is given
+       here:
+
+       proc    _proc32 
+       
+       %$i     arg 
+       %$j     arg 
+               mov     eax,[ebp + %$i] 
+               mov     ebx,[ebp + %$j] 
+               add     eax,[ebx] 
+       
+       endproc
+
+       This defines `_proc32' to be a procedure taking two arguments, the
+       first (`i') an integer and the second (`j') a pointer to an integer.
+       It returns `i + *j'.
+
+       Note that the `arg' macro has an `EQU' 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 `EQU' works, defining
+       `%$i' to be an offset from `BP'. A context-local variable is used,
+       local to the context pushed by the `proc' macro and popped by the
+       `endproc' macro, so that the same argument name can be used in later
+       procedures. Of course, you don't _have_ to do that.
+
+       `arg' 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 `int' or pointers.
+
+   9.2 Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries
+
+       `ELF' replaced the older `a.out' object file format under Linux
+       because it contains support for position-independent code (PIC),
+       which makes writing shared libraries much easier. NASM supports the
+       `ELF' position-independent code features, so you can write Linux
+       `ELF' shared libraries in NASM.
+
+       NetBSD, and its close cousins FreeBSD and OpenBSD, take a different
+       approach by hacking PIC support into the `a.out' format. NASM
+       supports this as the `aoutb' output format, so you can write BSD
+       shared libraries in NASM too.
+
+       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.
+
+       Therefore, you cannot get at your variables by writing code like
+       this:
+
+               mov     eax,[myvar]             ; WRONG
+
+       Instead, the linker provides an area of memory called the _global
+       offset table_, 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 `CALL' and `POP'
+       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.
+
+       The _data_ 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 section 9.2.4 for a caveat).
+
+ 9.2.1 Obtaining the Address of the GOT
+
+       Each code module in your shared library should define the GOT as an
+       external symbol:
+
+       extern  _GLOBAL_OFFSET_TABLE_   ; in ELF 
+       extern  __GLOBAL_OFFSET_TABLE_  ; in BSD a.out
+
+       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:
+
+       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
+
+       (For BSD, again, the symbol `_GLOBAL_OFFSET_TABLE' requires a second
+       leading underscore.)
+
+       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 `EBX' register, because PIC shared
+       libraries use this register to store the address of the GOT.
+
+       The interesting bit is the `CALL' instruction and the following two
+       lines. The `CALL' and `POP' combination obtains the address of the
+       label `.get_GOT', without having to know in advance where the
+       program was loaded (since the `CALL' instruction is encoded relative
+       to the current position). The `ADD' instruction makes use of one of
+       the special PIC relocation types: GOTPC relocation. With the
+       `WRT ..gotpc' qualifier specified, the symbol referenced (here
+       `_GLOBAL_OFFSET_TABLE_', the special symbol assigned to the GOT) is
+       given as an offset from the beginning of the section. (Actually,
+       `ELF' encodes it as the offset from the operand field of the `ADD'
+       instruction, but NASM simplifies this deliberately, so you do things
+       the same way for both `ELF' and `BSD'.) So the instruction then
+       _adds_ the beginning of the section, to get the real address of the
+       GOT, and subtracts the value of `.get_GOT' which it knows is in
+       `EBX'. Therefore, by the time that instruction has finished, `EBX'
+       contains the address of the GOT.
+
+       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:
+
+       %macro  get_GOT 0 
+       
+               call    %%getgot 
+         %%getgot: 
+               pop     ebx 
+               add     ebx,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc 
+       
+       %endmacro
+
+ 9.2.2 Finding Your Local Data Items
+
+       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 `..gotoff' special `WRT'
+       type. The way this works is like this:
+
+               lea     eax,[ebx+myvar wrt ..gotoff]
+
+       The expression `myvar wrt ..gotoff' is calculated, when the shared
+       library is linked, to be the offset to the local variable `myvar'
+       from the beginning of the GOT. Therefore, adding it to `EBX' as
+       above will place the real address of `myvar' in `EAX'.
+
+       If you declare variables as `GLOBAL' 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
+       `..gotoff' mechanism.
+
+       Note that due to a peculiarity of the way BSD `a.out' 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.
+
+ 9.2.3 Finding External and Common Data Items
+
+       If your library needs to get at an external variable (external to
+       the _library_, not just to one of the modules within it), you must
+       use the `..got' type to get at it. The `..got' 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 _entry_ 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 `extvar' in `EAX', you would code
+
+               mov     eax,[ebx+extvar wrt ..got]
+
+       This loads the address of `extvar' out of an entry in the GOT. The
+       linker, when it builds the shared library, collects together every
+       relocation of type `..got', and builds the GOT so as to ensure it
+       has every necessary entry present.
+
+       Common variables must also be accessed in this way.
+
+ 9.2.4 Exporting Symbols to the Library User
+
+       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.
+
+       So to export a function to users of the library, you must use
+
+       global  func:function           ; declare it as a function 
+       
+       func:   push    ebp 
+       
+               ; etc.
+
+       And to export a data item such as an array, you would have to code
+
+       global  array:data array.end-array      ; give the size too 
+       
+       array:  resd    128 
+       .end:
+
+       Be careful: If you export a variable to the library user, by
+       declaring it as `GLOBAL' 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 `..got' mechanism rather
+       than `..gotoff', as if it were external (which, effectively, it has
+       become).
+
+       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:
+
+       dataptr:        dd      global_data_item        ; WRONG
+
+       NASM will interpret this code as an ordinary relocation, in which
+       `global_data_item' is merely an offset from the beginning of the
+       `.data' section (or whatever); so this reference will end up
+       pointing at your data section instead of at the exported global
+       which resides elsewhere.
+
+       Instead of the above code, then, you must write
+
+       dataptr:        dd      global_data_item wrt ..sym
+
+       which makes use of the special `WRT' type `..sym' to instruct NASM
+       to search the symbol table for a particular symbol at that address,
+       rather than just relocating by section base.
+
+       Either method will work for functions: referring to one of your
+       functions by means of
+
+       funcptr:        dd      my_function
+
+       will give the user the address of the code you wrote, whereas
+
+       funcptr:        dd      my_function wrt .sym
+
+       will give the address of the procedure linkage table for the
+       function, which is where the calling program will _believe_ the
+       function lives. Either address is a valid way to call the function.
+
+ 9.2.5 Calling Procedures Outside the Library
+
+       Calling procedures outside your shared library has to be done by
+       means of a _procedure linkage table_, 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.
+
+       To call an external routine, you must use another special PIC
+       relocation type, `WRT ..plt'. This is much easier than the GOT-based
+       ones: you simply replace calls such as `CALL printf' with the PLT-
+       relative version `CALL printf WRT ..plt'.
+
+ 9.2.6 Generating the Library File
+
+       Having written some code modules and assembled them to `.o' files,
+       you then generate your shared library with a command such as
+
+       ld -shared -o library.so module1.o module2.o       # for ELF 
+       ld -Bshareable -o library.so module1.o module2.o   # for BSD
+
+       For ELF, if your shared library is going to reside in system
+       directories such as `/usr/lib' or `/lib', it is usually worth using
+       the `-soname' flag to the linker, to store the final library file
+       name, with a version number, into the library:
+
+       ld -shared -soname library.so.1 -o library.so.1.2 *.o
+
+       You would then copy `library.so.1.2' into the library directory, and
+       create `library.so.1' as a symbolic link to it.
+
+Chapter 10: Mixing 16 and 32 Bit Code
+-------------------------------------
+
+       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.
+
+  10.1 Mixed-Size Jumps
+
+       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 _only_ 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.
+
+       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,
+
+               jmp     0x1234:0x56789ABC       ; wrong!
+
+       will not work, since the offset part of the address will be
+       truncated to `0x9ABC' and the jump will be an ordinary 16-bit far
+       one.
+
+       The Linux kernel setup code gets round the inability of `as86' to
+       generate the required instruction by coding it manually, using `DB'
+       instructions. NASM can go one better than that, by actually
+       generating the right instruction itself. Here's how to do it right:
+
+               jmp     dword 0x1234:0x56789ABC         ; right
+
+       The `DWORD' prefix (strictly speaking, it should come _after_ the
+       colon, since it is declaring the _offset_ 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.
+
+       You can do the reverse operation, jumping from a 32-bit segment to a
+       16-bit one, by means of the `WORD' prefix:
+
+               jmp     word 0x8765:0x4321      ; 32 to 16 bit
+
+       If the `WORD' prefix is specified in 16-bit mode, or the `DWORD'
+       prefix in 32-bit mode, they will be ignored, since each is
+       explicitly forcing NASM into a mode it was in anyway.
+
+  10.2 Addressing Between Different-Size Segments
+
+       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.
+
+       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.
+
+       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
+
+               mov     eax,offset_into_32_bit_segment_specified_by_fs 
+               mov     dword [fs:eax],0x11223344
+
+       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?
+
+       It can. As in section 10.1, you need only prefix the address with
+       the `DWORD' keyword, and it will be forced to be a 32-bit address:
+
+               mov     dword [fs:dword my_offset],0x11223344
+
+       Also as in section 10.1, NASM is not fussy about whether the `DWORD'
+       prefix comes before or after the segment override, so arguably a
+       nicer-looking way to code the above instruction is
+
+               mov     dword [dword fs:my_offset],0x11223344
+
+       Don't confuse the `DWORD' prefix _outside_ the square brackets,
+       which controls the size of the data stored at the address, with the
+       one `inside' the square brackets which controls the length of the
+       address itself. The two can quite easily be different:
+
+               mov     word [dword 0x12345678],0x9ABC
+
+       This moves 16 bits of data to an address specified by a 32-bit
+       offset.
+
+       You can also specify `WORD' or `DWORD' prefixes along with the `FAR'
+       prefix to indirect far jumps or calls. For example:
+
+               call    dword far [fs:word 0x4321]
+
+       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.
+
+  10.3 Other Mixed-Size Instructions
+
+       The other way you might want to access data might be using the
+       string instructions (`LODSx', `STOSx' and so on) or the `XLATB'
+       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.
+
+       This is the purpose of NASM's `a16', `a32' and `a64' prefixes. If
+       you are coding `LODSB' 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 `ESI' and then code
+
+               a32     lodsb
+
+       The prefix forces the addressing size to 32 bits, meaning that
+       `LODSB' loads from `[DS:ESI]' instead of `[DS:SI]'. To access a
+       string in a 16-bit segment when coding in a 32-bit one, the
+       corresponding `a16' prefix can be used.
+
+       The `a16', `a32' and `a64' 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: `CMPSx',
+       `SCASx', `LODSx', `STOSx', `MOVSx', `INSx', `OUTSx', and `XLATB'.
+       Also, the various push and pop instructions (`PUSHA' and `POPF' as
+       well as the more usual `PUSH' and `POP') can accept `a16', `a32' or
+       `a64' prefixes to force a particular one of `SP', `ESP' or `RSP' to
+       be used as a stack pointer, in case the stack segment in use is a
+       different size from the code segment.
+
+       `PUSH' and `POP', 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 `o16':
+
+               o16 push    ss 
+               o16 push    ds
+
+       This code saves a doubleword of stack space by fitting two segment
+       registers into the space which would normally be consumed by pushing
+       one.
+
+       (You can also use the `o32' prefix to force the 32-bit behaviour
+       when in 16-bit mode, but this seems less useful.)
+
+Chapter 11: Writing 64-bit Code (Unix, Win64)
+---------------------------------------------
+
+       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.
+
+       All 64-bit code uses a flat memory model, since segmentation is not
+       available in 64-bit mode. The one exception is the `FS' and `GS'
+       registers, which still add their bases.
+
+       Position independence in 64-bit mode is significantly simpler, since
+       the processor supports `RIP'-relative addressing directly; see the
+       `REL' keyword (section 3.3). On most 64-bit platforms, it is
+       probably desirable to make that the default, using the directive
+       `DEFAULT REL' (section 6.2).
+
+       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.
+
+       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 `<inttypes.h>'.
+
+       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.
+
+  11.1 Register Names in 64-bit Mode
+
+       NASM uses the following names for general-purpose registers in 64-
+       bit mode, for 8-, 16-, 32- and 64-bit references, respecitively:
+
+            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
+
+       This is consistent with the AMD documentation and most other
+       assemblers. The Intel documentation, however, uses the names
+       `R8L-R15L' 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 `altreg' (see section
+       5.1) can be used for this purpose.
+
+  11.2 Immediates and Displacements in 64-bit Mode
+
+       In 64-bit mode, immediates and displacements are generally only 32
+       bits wide. NASM will therefore truncate most displacements and
+       immediates to 32 bits.
+
+       The only instruction which takes a full 64-bit immediate is:
+
+            MOV reg64,imm64
+
+       NASM will produce this instruction whenever the programmer uses
+       `MOV' 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 `DWORD':
+
+            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
+
+       The length of these instructions are 10, 5 and 7 bytes,
+       respectively.
+
+       The only instructions which take a full 64-bit _displacement_ is
+       loading or storing, using `MOV', `AL', `AX', `EAX' or `RAX' (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 `QWORD':
+
+            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
+
+       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.
+
+  11.3 Interfacing to 64-bit C Programs (Unix)
+
+       On Unix, the 64-bit ABI is defined by the document:
+
+       `http://www.x86-64.org/documentation/abi.pdf'
+
+       Although written for AT&T-syntax assembly, the concepts apply
+       equally well for NASM-style assembly. What follows is a simplified
+       summary.
+
+       The first six integer arguments (from the left) are passed in `RDI',
+       `RSI', `RDX', `RCX', `R8', and `R9', in that order. Additional
+       integer arguments are passed on the stack. These registers, plus
+       `RAX', `R10' and `R11' are destroyed by function calls, and thus are
+       available for use by the function without saving.
+
+       Integer return values are passed in `RAX' and `RDX', in that order.
+
+       Floating point is done using SSE registers, except for
+       `long double'. Floating-point arguments are passed in `XMM0' to
+       `XMM7'; return is `XMM0' and `XMM1'. `long double' are passed on the
+       stack, and returned in `ST0' and `ST1'.
+
+       All SSE and x87 registers are destroyed by function calls.
+
+       On 64-bit Unix, `long' is 64 bits.
+
+       Integer and SSE register arguments are counted separately, so for
+       the case of
+
+            void foo(long a, double b, int c)
+
+       `a' is passed in `RDI', `b' in `XMM0', and `c' in `ESI'.
+
+  11.4 Interfacing to 64-bit C Programs (Win64)
+
+       The Win64 ABI is described at:
+
+       `http://msdn2.microsoft.com/en-gb/library/ms794533.aspx'
+
+       What follows is a simplified summary.
+
+       The first four integer arguments are passed in `RCX', `RDX', `R8'
+       and `R9', in that order. Additional integer arguments are passed on
+       the stack. These registers, plus `RAX', `R10' and `R11' are
+       destroyed by function calls, and thus are available for use by the
+       function without saving.
+
+       Integer return values are passed in `RAX' only.
+
+       Floating point is done using SSE registers, except for
+       `long double'. Floating-point arguments are passed in `XMM0' to
+       `XMM3'; return is `XMM0' only.
+
+       On Win64, `long' is 32 bits; `long long' or `_int64' is 64 bits.
+
+       Integer and SSE register arguments are counted together, so for the
+       case of
+
+            void foo(long long a, double b, int c)
+
+       `a' is passed in `RCX', `b' in `XMM1', and `c' in `R8D'.
+
+Chapter 12: Troubleshooting
+---------------------------
+
+       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.
+
+  12.1 Common Problems
+
+12.1.1 NASM Generates Inefficient Code
+
+       We sometimes get `bug' reports about NASM generating inefficient, or
+       even `wrong', code on instructions such as `ADD ESP,8'. This is a
+       deliberate design feature, connected to predictability of output:
+       NASM, on seeing `ADD ESP,8', will generate the form of the
+       instruction which leaves room for a 32-bit offset. You need to code
+       `ADD ESP,BYTE 8' 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 `-O' option (see section 2.1.22).
+
+12.1.2 My Jumps are Out of Range
+
+       Similarly, people complain that when they issue conditional jumps
+       (which are `SHORT' by default) that try to jump too far, NASM
+       reports `short jump out of range' instead of making the jumps
+       longer.
+
+       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 `Jcc NEAR' 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 `JNE'
+       instruction with a very short `JE' instruction that jumps over a
+       `JMP NEAR'; this is a sensible solution for processors below a 386,
+       but hardly efficient on processors which have good branch prediction
+       _and_ could have used `JNE NEAR' instead. So, once again, it's up to
+       the user, not the assembler, to decide what instructions should be
+       generated. See section 2.1.22.
+
+12.1.3 `ORG' Doesn't Work
+
+       People writing boot sector programs in the `bin' format often
+       complain that `ORG' doesn't work the way they'd like: in order to
+       place the `0xAA55' signature word at the end of a 512-byte boot
+       sector, people who are used to MASM tend to code
+
+               ORG 0 
+       
+               ; some boot sector code 
+       
+               ORG 510 
+               DW 0xAA55
+
+       This is not the intended use of the `ORG' directive in NASM, and
+       will not work. The correct way to solve this problem in NASM is to
+       use the `TIMES' directive, like this:
+
+               ORG 0 
+       
+               ; some boot sector code 
+       
+               TIMES 510-($-$$) DB 0 
+               DW 0xAA55
+
+       The `TIMES' 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.
+
+12.1.4 `TIMES' Doesn't Work
+
+       The other common problem with the above code is people who write the
+       `TIMES' line as
+
+               TIMES 510-$ DB 0
+
+       by reasoning that `$' should be a pure number, just like 510, so the
+       difference between them is also a pure number and can happily be fed
+       to `TIMES'.
+
+       NASM is a _modular_ assembler: the various component parts are
+       designed to be easily separable for re-use, so they don't exchange
+       information unnecessarily. In consequence, the `bin' output format,
+       even though it has been told by the `ORG' directive that the `.text'
+       section should start at 0, does not pass that information back to
+       the expression evaluator. So from the evaluator's point of view, `$'
+       isn't a pure number: it's an offset from a section base. Therefore
+       the difference between `$' and 510 is also not a pure number, but
+       involves a section base. Values involving section bases cannot be
+       passed as arguments to `TIMES'.
+
+       The solution, as in the previous section, is to code the `TIMES'
+       line in the form
+
+               TIMES 510-($-$$) DB 0
+
+       in which `$' and `$$' are offsets from the same section base, and so
+       their difference is a pure number. This will solve the problem and
+       generate sensible code.
+
+  12.2 Bugs
+
+       We have never yet released a version of NASM with any _known_ 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
+       `bugtracker' at `https://sourceforge.net/projects/nasm/' (click on
+       "Bugs"), or if that fails then through one of the contacts in
+       section 1.2.
+
+       Please read section 2.2 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
+       section 12.1, and don't bother reporting the bug if it's listed
+       there.
+
+       If you do report a bug, _please_ give us all of the following
+       information:
+
+       (*) What operating system you're running NASM under. DOS, Linux,
+           NetBSD, Win16, Win32, VMS (I'd be impressed), whatever.
+
+       (*) 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.
+
+       (*) Which version of NASM you're using, and exactly how you invoked
+           it. Give us the precise command line, and the contents of the
+           `NASMENV' environment variable if any.
+
+       (*) 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.)
+
+       (*) 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 _only_ 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 _not_ to be mailed large chunks of code anyway. The
+           smaller the file, the better. A three-line sample file that does
+           nothing useful _except_ demonstrate the problem is much easier
+           to work with than a fully fledged ten-thousand-line program. (Of
+           course, some errors _do_ only crop up in large files, so this
+           may not be possible.)
+
+       (*) A description of what the problem actually _is_. `It doesn't
+           work' is _not_ 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 _should_ 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'.
+
+       (*) 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.
+
+       (*) 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 _both_ object files, so we can see what
+           TASM is doing differently from us.
+
+Appendix A: Ndisasm
+-------------------
+
+       The Netwide Disassembler, NDISASM
+
+   A.1 Introduction
+
+       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.
+
+       The Netwide Disassembler does nothing except to produce
+       disassemblies of _binary_ source files. NDISASM does not have any
+       understanding of object file formats, like `objdump', and it will
+       not understand `DOS .EXE' files like `debug' will. It just
+       disassembles.
+
+   A.2 Getting Started: Installation
+
+       See section 1.3 for installation instructions. NDISASM, like NASM,
+       has a `man page' which you may want to put somewhere useful, if you
+       are on a Unix system.
+
+   A.3 Running NDISASM
+
+       To disassemble a file, you will typically use a command of the form
+
+              ndisasm -b {16|32|64} filename
+
+       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 `-b' switch is present, NDISASM works in 16-bit mode by
+       default. The `-u' switch (for USE32) also invokes 32-bit mode.
+
+       Two more command line options are `-r' which reports the version
+       number of NDISASM you are running, and `-h' which gives a short
+       summary of command line options.
+
+ A.3.1 COM Files: Specifying an Origin
+
+       To disassemble a `DOS .COM' file correctly, a disassembler must
+       assume that the first instruction in the file is loaded at address
+       `0x100', 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.
+
+       The `-o' 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
+       ``$'' or ``0x'' or ends in ``H'' it's `hex', if it ends in ``Q''
+       it's `octal', and if it ends in ``B'' it's `binary'.
+
+       Hence, to disassemble a `.COM' file:
+
+              ndisasm -o100h filename.com
+
+       will do the trick.
+
+ A.3.2 Code Following Data: Synchronisation
+
+       Suppose you are disassembling a file which contains some data which
+       isn't machine code, and _then_ 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.
+       ``FS OR AX,0x240A''), and generating `DB' instructions ever so often
+       if it's totally stumped. Then it will reach the code section.
+
+       Supposing NDISASM has just finished generating a strange machine
+       instruction from part of the data section, and its file position is
+       now one byte _before_ 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.
+
+       To avoid this, you can specify a ``synchronisation'' 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 ``db'' instead. So it _will_
+       start disassembly exactly from the sync point, and so you _will_ see
+       all the instructions in your code section.
+
+       Sync points are specified using the `-s' 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 `.COM' file, you would have
+       to do
+
+              ndisasm -o100h -s120h file.com
+
+       rather than
+
+              ndisasm -o100h -s20h file.com
+
+       As stated above, you can specify multiple sync markers if you need
+       to, just by repeating the `-s' option.
+
+ A.3.3 Mixed Code and Data: Automatic (Intelligent) Synchronisation 
+
+       Suppose you are disassembling the boot sector of a `DOS' 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 `JMP' instruction, then some data, then the rest
+       of the code. So there is a very good chance of NDISASM being
+       _misaligned_ when the data ends and the code begins. Hence a sync
+       point is needed.
+
+       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 `JMP' instruction, and then to use
+       its target address as a sync point. So can NDISASM do that for you?
+
+       The answer, of course, is yes: using either of the synonymous
+       switches `-a' (for automatic sync) or `-i' (for intelligent sync)
+       will enable `auto-sync' 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...)
+
+       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).
+
+       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 _not_ guaranteed to catch all the sync points, and you
+       may still have to place some manually.
+
+       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 `-i' _and_ some `-s'
+       options.
+
+       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 `-k' option (documented below) to
+       suppress disassembly of the data area.
+
+ A.3.4 Other Options
+
+       The `-e' option skips a header on the file, by ignoring the first N
+       bytes. This means that the header is _not_ counted towards the
+       disassembly offset: if you give `-e10 -o10', disassembly will start
+       at byte 10 in the file, and this will be given offset 10, not 20.
+
+       The `-k' 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 _will_ 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.
+
+   A.4 Bugs and Improvements
+
+       There are no known bugs. However, any you find, with patches if
+       possible, should be sent to `nasm-bugs@lists.sourceforge.net', or to
+       the developer's site at `https://sourceforge.net/projects/nasm/' and
+       we'll try to fix them. Feel free to send contributions and new
+       features as well.
+
+Appendix B: Instruction List
+----------------------------
+
+   B.1 Introduction
+
+       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.
+
+ B.1.1 Special instructions...
+
+       DB                                         
+       DW                                         
+       DD                                         
+       DQ                                         
+       DT                                         
+       DO                                         
+       DY                                         
+       RESB             imm                      8086 
+       RESW                                       
+       RESD                                       
+       RESQ                                       
+       REST                                       
+       RESO                                       
+       RESY                                      
+
+ B.1.2 Conventional instructions
+
+       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
+
+ B.1.3 Katmai Streaming SIMD instructions (SSE -- a.k.a. KNI, XMM, MMX2)
+
+       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
+
+ B.1.4 Introduced in Deschutes but necessary for SSE support
+
+       FXRSTOR          mem                      P6,SSE,FPU 
+       FXSAVE           mem                      P6,SSE,FPU
+
+ B.1.5 XSAVE group (AVX and extended state)
+
+       XGETBV                                    NEHALEM 
+       XSETBV                                    NEHALEM,PRIV 
+       XSAVE            mem                      NEHALEM 
+       XRSTOR           mem                      NEHALEM
+
+ B.1.6 Generic memory operations
+
+       PREFETCHNTA      mem                      KATMAI 
+       PREFETCHT0       mem                      KATMAI 
+       PREFETCHT1       mem                      KATMAI 
+       PREFETCHT2       mem                      KATMAI 
+       SFENCE                                    KATMAI
+
+ B.1.7 New MMX instructions introduced in Katmai
+
+       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
+
+ B.1.8 AMD Enhanced 3DNow! (Athlon) instructions
+
+       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
+
+ B.1.9 Willamette SSE2 Cacheability Instructions
+
+       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
+
+B.1.10 Willamette MMX instructions (SSE2 SIMD Integer Instructions)
+
+       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
+
+B.1.11 Willamette Streaming SIMD instructions (SSE2)
+
+       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
+
+B.1.12 Prescott New Instructions (SSE3)
+
+       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
+
+B.1.13 VMX Instructions
+
+       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
+
+B.1.14 Extended Page Tables VMX instructions
+
+       INVEPT           reg32,mem                VMX,SO,NOLONG 
+       INVEPT           reg64,mem                VMX,SO,LONG 
+       INVVPID          reg32,mem                VMX,SO,NOLONG 
+       INVVPID          reg64,mem                VMX,SO,LONG
+
+B.1.15 Tejas New Instructions (SSSE3)
+
+       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
+
+B.1.16 AMD SSE4A
+
+       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
+
+B.1.17 New instructions in Barcelona
+
+       LZCNT            reg16,rm16               P6,AMD 
+       LZCNT            reg32,rm32               P6,AMD 
+       LZCNT            reg64,rm64               X64,AMD
+
+B.1.18 Penryn New Instructions (SSE4.1)
+
+       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
+
+B.1.19 Nehalem New Instructions (SSE4.2)
+
+       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
+
+B.1.20 Intel SMX
+
+       GETSEC                                    KATMAI
+
+B.1.21 Geode (Cyrix) 3DNow! additions
+
+       PFRCPV           mmxreg,mmxrm             PENT,3DNOW,CYRIX 
+       PFRSQRTV         mmxreg,mmxrm             PENT,3DNOW,CYRIX
+
+B.1.22 Intel new instructions in ???
+
+       MOVBE            reg16,mem16              NEHALEM 
+       MOVBE            reg32,mem32              NEHALEM 
+       MOVBE            reg64,mem64              NEHALEM 
+       MOVBE            mem16,reg16              NEHALEM 
+       MOVBE            mem32,reg32              NEHALEM 
+       MOVBE            mem64,reg64              NEHALEM
+
+B.1.23 Intel AES instructions
+
+       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
+
+B.1.24 Intel AVX AES instructions
+
+       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
+
+B.1.25 Intel AVX instructions
+
+       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
+
+B.1.26 Intel Carry-Less Multiplication instructions (CLMUL)
+
+       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
+
+B.1.27 Intel AVX Carry-Less Multiplication instructions (CLMUL)
+
+       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
+
+B.1.28 Intel Fused Multiply-Add instructions (FMA)
+
+       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
+
+B.1.29 VIA (Centaur) security instructions
+
+       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
+
+B.1.30 AMD Lightweight Profiling (LWP) instructions
+
+       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
+
+B.1.31 AMD XOP, FMA4 and CVT16 instructions (SSE5)
+
+       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
+
+B.1.32 Systematic names for the hinting nop instructions
+
+       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
+
+Appendix C: NASM Version History
+--------------------------------
+
+   C.1 NASM 2 Series
+
+       The NASM 2 series support x86-64, and is the production version of
+       NASM since 2007.
+
+ C.1.1 Version 2.08
+
+       (*) A number of enhancements/fixes in macros area.
+
+       (*) Support for arbitrarily terminating macro expansions
+           `%exitmacro'. See section 4.3.12.
+
+       (*) Support for recursive macro expansion `%rmacro/irmacro'. See
+           section 4.3.1.
+
+       (*) Support for converting strings to tokens. See section 4.1.9.
+
+       (*) Fuzzy operand size logic introduced.
+
+       (*) Fix COFF stack overrun on too long export identifiers.
+
+       (*) Fix Macho-O alignment bug.
+
+       (*) Fix crashes with -fwin32 on file with many exports.
+
+       (*) Fix stack overrun for too long [DEBUG id].
+
+       (*) Fix incorrect sbyte usage in IMUL (hit only if optimization flag
+           passed).
+
+       (*) Append ending token for `.stabs' records in the ELF output
+           format.
+
+       (*) New NSIS script which uses ModernUI and MultiUser approach.
+
+       (*) Visual Studio 2008 NASM integration (rules file).
+
+       (*) Warn a user if a constant is too long (and as result will be
+           stripped).
+
+       (*) The obsoleted pre-XOP AMD SSE5 instruction set which was never
+           actualized was removed.
+
+       (*) Fix stack overrun on too long error file name passed from the
+           command line.
+
+       (*) Bind symbols to the .text section by default (ie in case if
+           SECTION directive was omitted) in the ELF output format.
+
+       (*) Fix sync points array index wrapping.
+
+       (*) A few fixes for FMA4 and XOP instruction templates.
+
+       (*) Add AMD Lightweight Profiling (LWP) instructions.
+
+ C.1.2 Version 2.07
+
+       (*) NASM is now under the 2-clause BSD license. See section 1.1.2.
+
+       (*) Fix the section type for the `.strtab' section in the `elf64'
+           output format.
+
+       (*) Fix the handling of `COMMON' directives in the `obj' output
+           format.
+
+       (*) New `ith' and `srec' output formats; these are variants of the
+           `bin' output format which output Intel hex and Motorola S-
+           records, respectively. See section 7.2 and section 7.3.
+
+       (*) `rdf2ihx' replaced with an enhanced `rdf2bin', which can output
+           binary, COM, Intel hex or Motorola S-records.
+
+       (*) The Windows installer now puts the NASM directory first in the
+           `PATH' of the "NASM Shell".
+
+       (*) Revert the early expansion behavior of `%+' to pre-2.06
+           behavior: `%+' is only expanded late.
+
+       (*) Yet another Mach-O alignment fix.
+
+       (*) Don't delete the list file on errors. Also, include error and
+           warning information in the list file.
+
+       (*) Support for 64-bit Mach-O output, see section 7.8.
+
+       (*) Fix assert failure on certain operations that involve strings
+           with high-bit bytes.
+
+ C.1.3 Version 2.06
+
+       (*) This release is dedicated to the memory of Charles A. Crayne,
+           long time NASM developer as well as moderator of
+           `comp.lang.asm.x86' and author of the book _Serious Assembler_.
+           We miss you, Chuck.
+
+       (*) Support for indirect macro expansion (`%[...]'). See section
+           4.1.3.
+
+       (*) `%pop' can now take an argument, see section 4.7.1.
+
+       (*) The argument to `%use' is no longer macro-expanded. Use `%[...]'
+           if macro expansion is desired.
+
+       (*) Support for thread-local storage in ELF32 and ELF64. See section
+           7.9.4.
+
+       (*) Fix crash on `%ifmacro' without an argument.
+
+       (*) Correct the arguments to the `POPCNT' instruction.
+
+       (*) Fix section alignment in the Mach-O format.
+
+       (*) Update AVX support to version 5 of the Intel specification.
+
+       (*) Fix the handling of accesses to context-local macros from higher
+           levels in the context stack.
+
+       (*) Treat `WAIT' as a prefix rather than as an instruction, thereby
+           allowing constructs like `O16 FSAVE' to work correctly.
+
+       (*) Support for structures with a non-zero base offset. See section
+           4.11.10.
+
+       (*) Correctly handle preprocessor token concatenation (see section
+           4.3.8) involving floating-point numbers.
+
+       (*) The `PINSR' series of instructions have been corrected and
+           rationalized.
+
+       (*) Removed AMD SSE5, replaced with the new XOP/FMA4/CVT16 (rev
+           3.03) spec.
+
+       (*) The ELF backends no longer automatically generate a `.comment'
+           section.
+
+       (*) Add additional "well-known" ELF sections with default
+           attributes. See section 7.9.2.
+
+ C.1.4 Version 2.05.01
+
+       (*) Fix the `-w'/`-W' option parsing, which was broken in NASM 2.05.
+
+ C.1.5 Version 2.05
+
+       (*) Fix redundant REX.W prefix on `JMP reg64'.
+
+       (*) Make the behaviour of `-O0' match NASM 0.98 legacy behavior. See
+           section 2.1.22.
+
+       (*) `-w-user' can be used to suppress the output of `%warning'
+           directives. See section 2.1.24.
+
+       (*) Fix bug where `ALIGN' would issue a full alignment datum instead
+           of zero bytes.
+
+       (*) Fix offsets in list files.
+
+       (*) Fix `%include' inside multi-line macros or loops.
+
+       (*) Fix error where NASM would generate a spurious warning on valid
+           optimizations of immediate values.
+
+       (*) Fix arguments to a number of the `CVT' SSE instructions.
+
+       (*) Fix RIP-relative offsets when the instruction carries an
+           immediate.
+
+       (*) Massive overhaul of the ELF64 backend for spec compliance.
+
+       (*) Fix the Geode `PFRCPV' and `PFRSQRTV' instruction.
+
+       (*) Fix the SSE 4.2 `CRC32' instruction.
+
+ C.1.6 Version 2.04
+
+       (*) Sanitize macro handing in the `%error' directive.
+
+       (*) New `%warning' directive to issue user-controlled warnings.
+
+       (*) `%error' directives are now deferred to the final assembly
+           phase.
+
+       (*) New `%fatal' directive to immediately terminate assembly.
+
+       (*) New `%strcat' directive to join quoted strings together.
+
+       (*) New `%use' macro directive to support standard macro directives.
+           See section 4.6.4.
+
+       (*) Excess default parameters to `%macro' now issues a warning by
+           default. See section 4.3.
+
+       (*) Fix `%ifn' and `%elifn'.
+
+       (*) Fix nested `%else' clauses.
+
+       (*) Correct the handling of nested `%rep's.
+
+       (*) New `%unmacro' directive to undeclare a multi-line macro. See
+           section 4.3.11.
+
+       (*) Builtin macro `__PASS__' which expands to the current assembly
+           pass. See section 4.11.9.
+
+       (*) `__utf16__' and `__utf32__' operators to generate UTF-16 and
+           UTF-32 strings. See section 3.4.5.
+
+       (*) Fix bug in case-insensitive matching when compiled on platforms
+           that don't use the `configure' script. Of the official release
+           binaries, that only affected the OS/2 binary.
+
+       (*) Support for x87 packed BCD constants. See section 3.4.7.
+
+       (*) Correct the `LTR' and `SLDT' instructions in 64-bit mode.
+
+       (*) Fix unnecessary REX.W prefix on indirect jumps in 64-bit mode.
+
+       (*) Add AVX versions of the AES instructions (`VAES'...).
+
+       (*) Fix the 256-bit FMA instructions.
+
+       (*) Add 256-bit AVX stores per the latest AVX spec.
+
+       (*) VIA XCRYPT instructions can now be written either with or
+           without `REP', apparently different versions of the VIA spec
+           wrote them differently.
+
+       (*) Add missing 64-bit `MOVNTI' instruction.
+
+       (*) Fix the operand size of `VMREAD' and `VMWRITE'.
+
+       (*) Numerous bug fixes, especially to the AES, AVX and VTX
+           instructions.
+
+       (*) 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.
+
+       (*) `%push' no longer needs a context identifier; omitting the
+           context identifier results in an anonymous context.
+
+ C.1.7 Version 2.03.01
+
+       (*) Fix buffer overflow in the listing module.
+
+       (*) Fix the handling of hexadecimal escape codes in `...` strings.
+
+       (*) The Postscript/PDF documentation has been reformatted.
+
+       (*) The `-F' option now implies `-g'.
+
+ C.1.8 Version 2.03
+
+       (*) Add support for Intel AVX, CLMUL and FMA instructions, including
+           YMM registers.
+
+       (*) `dy', `resy' and `yword' for 32-byte operands.
+
+       (*) Fix some SSE5 instructions.
+
+       (*) Intel `INVEPT', `INVVPID' and `MOVBE' instructions.
+
+       (*) Fix checking for critical expressions when the optimizer is
+           enabled.
+
+       (*) Support the DWARF debugging format for ELF targets.
+
+       (*) Fix optimizations of signed bytes.
+
+       (*) Fix operation on bigendian machines.
+
+       (*) Fix buffer overflow in the preprocessor.
+
+       (*) `SAFESEH' support for Win32, `IMAGEREL' for Win64 (SEH).
+
+       (*) `%?' and `%??' to refer to the name of a macro itself. In
+           particular, `%idefine keyword $%?' can be used to make a keyword
+           "disappear".
+
+       (*) New options for dependency generation: `-MD', `-MF', `-MP',
+           `-MT', `-MQ'.
+
+       (*) New preprocessor directives `%pathsearch' and `%depend'; INCBIN
+           reimplemented as a macro.
+
+       (*) `%include' now resolves macros in a sane manner.
+
+       (*) `%substr' can now be used to get other than one-character
+           substrings.
+
+       (*) New type of character/string constants, using backquotes
+           (``...`'), which support C-style escape sequences.
+
+       (*) `%defstr' and `%idefstr' to stringize macro definitions before
+           creation.
+
+       (*) Fix forward references used in `EQU' statements.
+
+ C.1.9 Version 2.02
+
+       (*) Additional fixes for MMX operands with explicit `qword', as well
+           as (hopefully) SSE operands with `oword'.
+
+       (*) Fix handling of truncated strings with `DO'.
+
+       (*) Fix segfaults due to memory overwrites when floating-point
+           constants were used.
+
+       (*) Fix segfaults due to missing include files.
+
+       (*) Fix OpenWatcom Makefiles for DOS and OS/2.
+
+       (*) Add autogenerated instruction list back into the documentation.
+
+       (*) ELF: Fix segfault when generating stabs, and no symbols have
+           been defined.
+
+       (*) ELF: Experimental support for DWARF debugging information.
+
+       (*) New compile date and time standard macros.
+
+       (*) `%ifnum' now returns true for negative numbers.
+
+       (*) New `%iftoken' test for a single token.
+
+       (*) New `%ifempty' test for empty expansion.
+
+       (*) Add support for the `XSAVE' instruction group.
+
+       (*) Makefile for Netware/gcc.
+
+       (*) Fix issue with some warnings getting emitted way too many times.
+
+       (*) Autogenerated instruction list added to the documentation.
+
+C.1.10 Version 2.01
+
+       (*) Fix the handling of MMX registers with explicit `qword' tags on
+           memory (broken in 2.00 due to 64-bit changes.)
+
+       (*) Fix the PREFETCH instructions.
+
+       (*) Fix the documentation.
+
+       (*) Fix debugging info when using `-f elf' (backwards compatibility
+           alias for `-f elf32').
+
+       (*) Man pages for rdoff tools (from the Debian project.)
+
+       (*) ELF: handle large numbers of sections.
+
+       (*) Fix corrupt output when the optimizer runs out of passes.
+
+C.1.11 Version 2.00
+
+       (*) Added c99 data-type compliance.
+
+       (*) Added general x86-64 support.
+
+       (*) Added win64 (x86-64 COFF) output format.
+
+       (*) Added `__BITS__' standard macro.
+
+       (*) Renamed the `elf' output format to `elf32' for clarity.
+
+       (*) Added `elf64' and `macho' (MacOS X) output formats.
+
+       (*) Added Numeric constants in `dq' directive.
+
+       (*) Added `oword', `do' and `reso' pseudo operands.
+
+       (*) Allow underscores in numbers.
+
+       (*) Added 8-, 16- and 128-bit floating-point formats.
+
+       (*) Added binary, octal and hexadecimal floating-point.
+
+       (*) Correct the generation of floating-point constants.
+
+       (*) Added floating-point option control.
+
+       (*) Added Infinity and NaN floating point support.
+
+       (*) Added ELF Symbol Visibility support.
+
+       (*) Added setting OSABI value in ELF header directive.
+
+       (*) Added Generate Makefile Dependencies option.
+
+       (*) Added Unlimited Optimization Passes option.
+
+       (*) Added `%IFN' and `%ELIFN' support.
+
+       (*) Added Logical Negation Operator.
+
+       (*) Enhanced Stack Relative Preprocessor Directives.
+
+       (*) Enhanced ELF Debug Formats.
+
+       (*) Enhanced Send Errors to a File option.
+
+       (*) Added SSSE3, SSE4.1, SSE4.2, SSE5 support.
+
+       (*) Added a large number of additional instructions.
+
+       (*) Significant performance improvements.
+
+       (*) `-w+warning' and `-w-warning' can now be written as -Wwarning
+           and -Wno-warning, respectively. See section 2.1.24.
+
+       (*) Add `-w+error' to treat warnings as errors. See section 2.1.24.
+
+       (*) Add `-w+all' and `-w-all' to enable or disable all suppressible
+           warnings. See section 2.1.24.
+
+   C.2 NASM 0.98 Series
+
+       The 0.98 series was the production versions of NASM from 1999 to
+       2007.
+
+ C.2.1 Version 0.98.39
+
+       (*) fix buffer overflow
+
+       (*) fix outas86's `.bss' handling
+
+       (*) "make spotless" no longer deletes config.h.in.
+
+       (*) `%(el)if(n)idn' insensitivity to string quotes difference
+           (#809300).
+
+       (*) (nasm.c)`__OUTPUT_FORMAT__' changed to string value instead of
+           symbol.
+
+ C.2.2 Version 0.98.38
+
+       (*) Add Makefile for 16-bit DOS binaries under OpenWatcom, and
+           modify `mkdep.pl' to be able to generate completely pathless
+           dependencies, as required by OpenWatcom wmake (it supports path
+           searches, but not explicit paths.)
+
+       (*) Fix the `STR' instruction.
+
+       (*) Fix the ELF output format, which was broken under certain
+           circumstances due to the addition of stabs support.
+
+       (*) Quick-fix Borland format debug-info for `-f obj'
+
+       (*) Fix for `%rep' with no arguments (#560568)
+
+       (*) Fix concatenation of preprocessor function call (#794686)
+
+       (*) Fix long label causes coredump (#677841)
+
+       (*) Use autoheader as well as autoconf to keep configure from
+           generating ridiculously long command lines.
+
+       (*) Make sure that all of the formats which support debugging output
+           actually will suppress debugging output when `-g' not specified.
+
+ C.2.3 Version 0.98.37
+
+       (*) Paths given in `-I' switch searched for `incbin'-ed as well as
+           `%include'-ed files.
+
+       (*) Added stabs debugging for the ELF output format, patch from
+           Martin Wawro.
+
+       (*) Fix `output/outbin.c' to allow origin > 80000000h.
+
+       (*) Make `-U' switch work.
+
+       (*) Fix the use of relative offsets with explicit prefixes, e.g.
+           `a32 loop foo'.
+
+       (*) Remove `backslash()'.
+
+       (*) Fix the `SMSW' and `SLDT' instructions.
+
+       (*) `-O2' and `-O3' are no longer aliases for `-O10' and `-O15'. If
+           you mean the latter, please say so! :)
+
+ C.2.4 Version 0.98.36
+
+       (*) Update rdoff - librarian/archiver - common rec - docs!
+
+       (*) Fix signed/unsigned problems.
+
+       (*) Fix `JMP FAR label' and `CALL FAR label'.
+
+       (*) Add new multisection support - map files - fix align bug
+
+       (*) Fix sysexit, movhps/movlps reg,reg bugs in insns.dat
+
+       (*) `Q' or `O' suffixes indicate octal
+
+       (*) Support Prescott new instructions (PNI).
+
+       (*) Cyrix `XSTORE' instruction.
+
+ C.2.5 Version 0.98.35
+
+       (*) Fix build failure on 16-bit DOS (Makefile.bc3 workaround for
+           compiler bug.)
+
+       (*) Fix dependencies and compiler warnings.
+
+       (*) Add "const" in a number of places.
+
+       (*) Add -X option to specify error reporting format (use -Xvc to
+           integrate with Microsoft Visual Studio.)
+
+       (*) Minor changes for code legibility.
+
+       (*) Drop use of tmpnam() in rdoff (security fix.)
+
+ C.2.6 Version 0.98.34
+
+       (*) Correct additional address-size vs. operand-size confusions.
+
+       (*) Generate dependencies for all Makefiles automatically.
+
+       (*) 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.
+
+       (*) Correct some disassembler bugs related to redundant address-size
+           prefixes. Some work still remains in this area.
+
+       (*) Correctly generate an error for things like "SEG eax".
+
+       (*) Add the JMPE instruction, enabled by "CPU IA64".
+
+       (*) Correct compilation on newer gcc/glibc platforms.
+
+       (*) Issue an error on things like "jmp far eax".
+
+ C.2.7 Version 0.98.33
+
+       (*) 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).
+
+       (*) New keyword "strict" to disable the optimization of specific
+           operands.
+
+       (*) Fix the handing of size overrides with JMP instructions
+           (instructions such as "jmp dword foo".)
+
+       (*) Fix the handling of "ABSOLUTE label", where "label" points into
+           a relocatable segment.
+
+       (*) Fix OBJ output format with lots of externs.
+
+       (*) More documentation updates.
+
+       (*) Add -Ov option to get verbose information about optimizations.
+
+       (*) Undo a braindead change which broke `%elif' directives.
+
+       (*) Makefile updates.
+
+ C.2.8 Version 0.98.32
+
+       (*) Fix NASM crashing when `%macro' directives were left
+           unterminated.
+
+       (*) Lots of documentation updates.
+
+       (*) Complete rewrite of the PostScript/PDF documentation generator.
+
+       (*) The MS Visual C++ Makefile was updated and corrected.
+
+       (*) Recognize .rodata as a standard section name in ELF.
+
+       (*) Fix some obsolete Perl4-isms in Perl scripts.
+
+       (*) Fix configure.in to work with autoconf 2.5x.
+
+       (*) Fix a couple of "make cleaner" misses.
+
+       (*) Make the normal "./configure && make" work with Cygwin.
+
+ C.2.9 Version 0.98.31
+
+       (*) Correctly build in a separate object directory again.
+
+       (*) Derive all references to the version number from the version
+           file.
+
+       (*) New standard macros __NASM_SUBMINOR__ and __NASM_VER__ macros.
+
+       (*) Lots of Makefile updates and bug fixes.
+
+       (*) New `%ifmacro' directive to test for multiline macros.
+
+       (*) Documentation updates.
+
+       (*) Fixes for 16-bit OBJ format output.
+
+       (*) Changed the NASM environment variable to NASMENV.
+
+C.2.10 Version 0.98.30
+
+       (*) Changed doc files a lot: completely removed old READMExx and
+           Wishlist files, incorporating all information in CHANGES and
+           TODO.
+
+       (*) I waited a long time to rename zoutieee.c to (original)
+           outieee.c
+
+       (*) moved all output modules to output/ subdirectory.
+
+       (*) Added 'make strip' target to strip debug info from nasm &
+           ndisasm.
+
+       (*) Added INSTALL file with installation instructions.
+
+       (*) Added -v option description to nasm man.
+
+       (*) Added dist makefile target to produce source distributions.
+
+       (*) 16-bit support for ELF output format (GNU extension, but
+           useful.)
+
+C.2.11 Version 0.98.28
+
+       (*) 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.
+
+C.2.12 Version 0.98.26
+
+       (*) Reorganised files even better from 0.98.25alt
+
+C.2.13 Version 0.98.25alt
+
+       (*) Prettified the source tree. Moved files to more reasonable
+           places.
+
+       (*) Added findleak.pl script to misc/ directory.
+
+       (*) Attempted to fix doc.
+
+C.2.14 Version 0.98.25
+
+       (*) Line continuation character `\'.
+
+       (*) Docs inadvertantly reverted - "dos packaging".
+
+C.2.15 Version 0.98.24p1
+
+       (*) FIXME: Someone, document this please.
+
+C.2.16 Version 0.98.24
+
+       (*) Documentation - Ndisasm doc added to Nasm.doc.
+
+C.2.17 Version 0.98.23
+
+       (*) Attempted to remove rdoff version1
+
+       (*) Lino Mastrodomenico's patches to preproc.c (%$$ bug?).
+
+C.2.18 Version 0.98.22
+
+       (*) Update rdoff2 - attempt to remove v1.
+
+C.2.19 Version 0.98.21
+
+       (*) Optimization fixes.
+
+C.2.20 Version 0.98.20
+
+       (*) Optimization fixes.
+
+C.2.21 Version 0.98.19
+
+       (*) H. J. Lu's patch back out.
+
+C.2.22 Version 0.98.18
+
+       (*) Added ".rdata" to "-f win32".
+
+C.2.23 Version 0.98.17
+
+       (*) H. J. Lu's "bogus elf" patch. (Red Hat problem?)
+
+C.2.24 Version 0.98.16
+
+       (*) Fix whitespace before "[section ..." bug.
+
+C.2.25 Version 0.98.15
+
+       (*) Rdoff changes (?).
+
+       (*) Fix fixes to memory leaks.
+
+C.2.26 Version 0.98.14
+
+       (*) Fix memory leaks.
+
+C.2.27 Version 0.98.13
+
+       (*) There was no 0.98.13
+
+C.2.28 Version 0.98.12
+
+       (*) Update optimization (new function of "-O1")
+
+       (*) Changes to test/bintest.asm (?).
+
+C.2.29 Version 0.98.11
+
+       (*) Optimization changes.
+
+       (*) Ndisasm fixed.
+
+C.2.30 Version 0.98.10
+
+       (*) There was no 0.98.10
+
+C.2.31 Version 0.98.09
+
+       (*) Add multiple sections support to "-f bin".
+
+       (*) Changed GLOBAL_TEMP_BASE in outelf.c from 6 to 15.
+
+       (*) Add "-v" as an alias to the "-r" switch.
+
+       (*) Remove "#ifdef" from Tasm compatibility options.
+
+       (*) Remove redundant size-overrides on "mov ds, ex", etc.
+
+       (*) Fixes to SSE2, other insns.dat (?).
+
+       (*) Enable uppercase "I" and "P" switches.
+
+       (*) Case insinsitive "seg" and "wrt".
+
+       (*) Update install.sh (?).
+
+       (*) Allocate tokens in blocks.
+
+       (*) Improve "invalid effective address" messages.
+
+C.2.32 Version 0.98.08
+
+       (*) Add "`%strlen'" and "`%substr'" macro operators
+
+       (*) Fixed broken c16.mac.
+
+       (*) Unterminated string error reported.
+
+       (*) Fixed bugs as per 0.98bf
+
+C.2.33 Version 0.98.09b with John Coffman patches released 28-Oct-2001
+
+       Changes from 0.98.07 release to 98.09b as of 28-Oct-2001
+
+       (*) 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.
+
+       (*) 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).
+
+       (*) Changed definition of the optimization flag:
+
+       -O0 strict two-pass assembly, JMP and Jcc are handled more like
+       0.98, except that back- ward JMPs are short, if possible.
+
+       -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.
+
+       -O2 multi-pass optimization, minimize branch offsets; also will
+       minimize signed immed- iate bytes, overriding size specification.
+
+       -O3 like -O2, but more passes taken, if needed
+
+C.2.34 Version 0.98.07 released 01/28/01
+
+       (*) 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"
+
+       01/28/01
+
+       (*) Cosmetic modifications to nasm.c, nasm.h, AUTHORS, MODIFIED
+
+C.2.35 Version 0.98.06f released 01/18/01
+
+       (*) - Add "metalbrain"s jecxz bug fix in insns.dat - alter
+           nasmdoc.src to match - version "0.98.06f"
+
+C.2.36 Version 0.98.06e released 01/09/01
+
+       (*) Removed the "outforms.h" file - it appears to be someone's old
+           backup of "outform.h". version "0.98.06e"
+
+       01/09/01
+
+       (*) 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...
+
+       (*) Nelson Rush resigns from the group. Big thanks to Nelson for his
+           leadership and enthusiasm in getting these changes incorporated
+           into Nasm!
+
+       (*) fbk - [list +], [list -] directives - ineptly implemented,
+           should be re-written or removed, perhaps.
+
+       (*) Brian Raiter / fbk - "elfso bug" fix - applied to aoutb format
+           as well - testing might be desirable...
+
+       08/07/00
+
+       (*) James Seter - -postfix, -prefix command line switches.
+
+       (*) Yuri Zaporogets - rdoff utility changes.
+
+C.2.37 Version 0.98p1
+
+       (*) GAS-like palign (Panos Minos)
+
+       (*) FIXME: Someone, fill this in with details
+
+C.2.38 Version 0.98bf (bug-fixed)
+
+       (*) Fixed - elf and aoutb bug - shared libraries - multiple
+           "%include" bug in "-f obj" - jcxz, jecxz bug - unrecognized
+           option bug in ndisasm
+
+C.2.39 Version 0.98.03 with John Coffman's changes released 27-Jul-2000
+
+       (*) 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.
+
+       (*) 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.
+
+       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.
+
+       (*) 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'.
+
+       (*) 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)
+
+       (*) 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)
+
+C.2.40 Version 0.98.03
+
+       "Integrated patchfile 0.98-0.98.01. I call this version 0.98.03 for
+       historical reasons: 0.98.02 was trashed." --John Coffman
+       <johninsd@san.rr.com>, 27-Jul-2000
+
+       (*) Kendall Bennett's SciTech MGL changes
+
+       (*) Note that you must define "TASM_COMPAT" at compile-time to get
+           the Tasm Ideal Mode compatibility.
+
+       (*) 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.
+
+       (*) standard.mac, macros.c: Added macros to ignore TASM directives
+           before first include
+
+       (*) nasm.h: Added extern declaration for tasm_compatible_mode
+
+       (*) nasm.c: Added global variable tasm_compatible_mode
+
+       (*) Added command line switch for TASM compatible mode (-t)
+
+       (*) Changed version command line to reflect when compiled with TASM
+           additions
+
+       (*) Added response file processing to allow all arguments on a
+           single line (response file is @resp rather than -@resp for NASM
+           format).
+
+       (*) labels.c: Changes islocal() macro to support TASM style @@local
+           labels.
+
+       (*) Added islocalchar() macro to support TASM style @@local labels.
+
+       (*) parser.c: Added support for TASM style memory references (ie:
+           mov [DWORD eax],10 rather than the NASM style mov DWORD
+           [eax],10).
+
+       (*) preproc.c: Added new directives, `%arg', `%local', `%stacksize'
+           to directives table
+
+       (*) Added support for TASM style directives without a leading %
+           symbol.
+
+       (*) Integrated a block of changes from Andrew Zabolotny
+           <bit@eltech.ru>:
+
+       (*) A new keyword `%xdefine' and its case-insensitive counterpart
+           `%ixdefine'. They work almost the same way as `%define' and
+           `%idefine' but expand the definition immediately, not on the
+           invocation. Something like a cross between `%define' and
+           `%assign'. The "x" suffix stands for "eXpand", so "xdefine" can
+           be deciphered as "expand-and-define". Thus you can do things
+           like this:
+
+            %assign ofs     0 
+       
+            %macro  arg     1 
+                    %xdefine %1 dword [esp+ofs] 
+                    %assign ofs ofs+4 
+            %endmacro
+
+       (*) 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:
+
+            %macro  abc     1 
+                    %define %1 hello 
+            %endm 
+       
+            abc     %$here 
+            %$here
+
+       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.
+
+       (*) Added a check for "cstk" in smacro_defined() before calling
+           get_ctx() - this allows for things like:
+
+            %ifdef %$abc 
+            %endif
+
+       to work without warnings even in no context.
+
+       (*) Added a check for "cstk" in %if*ctx and %elif*ctx directives -
+           this allows to use `%ifctx' without excessive warnings. If there
+           is no active context, `%ifctx' goes through "false" branch.
+
+       (*) Removed "user error: " prefix with `%error' 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.
+
+       (*) Added expansion of string that is output by `%error' directive.
+           Now you can do things like:
+
+            %define hello(x) Hello, x! 
+       
+            %define %$name andy 
+            %error "hello(%$name)"
+
+       Same happened with `%include' directive.
+
+       (*) 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
+
+            %define %$abc hello 
+            %define __%$abc goodbye 
+            __%$abc
+
+       would produce "incorrect" output: last line will expand to
+
+            hello goodbyehello
+
+       Not quite what you expected, eh? :-) The answer is that preprocessor
+       treats the `%define' construct as if it would be
+
+            %define __ %$abc goodbye
+
+       (note the white space between __ and %$abc). After my "fix" it will
+       "correctly" expand into
+
+            goodbye
+
+       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 :-).
+
+       Same change was applied to:
+       `%push',`%macro',`%imacro',`%define',`%idefine',`%xdefine',`%ixdefine',
+       `%assign',`%iassign',`%undef'
+
+       (*) 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).
+
+       (*) 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:
+
+              [WARNING macro-selfref] 
+       
+              %macro          push    1-* 
+                      %rep    %0 
+                              push    %1 
+                              %rotate 1 
+                      %endrep 
+              %endmacro 
+       
+                              push    eax,ebx,ecx
+
+       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).
+
+       (*) 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.
+
+       (*) Added the %+ operator in single-line macros for concatenating
+           two identifiers. Usage example:
+
+              %define _myfunc _otherfunc 
+              %define cextern(x) _ %+ x 
+              cextern (myfunc)
+
+       After first expansion, third line will become "_myfunc". After this
+       expansion is performed again so it becomes "_otherunc".
+
+       (*) Now if preprocessor is in a non-emitting state, no warning or
+           error will be emitted. Example:
+
+              %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
+
+       (*) Context-local variables on expansion as a last resort are looked
+           up in outer contexts. For example, the following piece:
+
+              %push   outer 
+              %define %$a [esp] 
+       
+                      %push   inner 
+                      %$a 
+                      %pop 
+              %pop
+
+       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 `%ifdef' won't look in outer
+       contexts.
+
+       This behaviour is needed because we don't want nested contexts to
+       act on already defined local macros. Example:
+
+              %define %$arg1  [esp+4] 
+              test    eax,eax 
+              if      nz 
+                      mov     eax,%$arg1 
+              endif
+
+       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.
+
+       (*) Fixed memory leak in `%undef'. The origline wasn't freed before
+           exiting on success.
+
+       (*) Fixed trap in preprocessor when line expanded to empty set of
+           tokens. This happens, for example, in the following case:
+
+              #define SOMETHING 
+              SOMETHING
+
+C.2.41 Version 0.98
+
+       All changes since NASM 0.98p3 have been produced by H. Peter Anvin
+       <hpa@zytor.com>.
+
+       (*) The documentation comment delimiter is
+
+       (*) Allow EQU definitions to refer to external labels; reported by
+           Pedro Gimeno.
+
+       (*) Re-enable support for RDOFF v1; reported by Pedro Gimeno.
+
+       (*) Updated License file per OK from Simon and Julian.
+
+C.2.42 Version 0.98p9
+
+       (*) Update documentation (although the instruction set reference
+           will have to wait; I don't want to hold up the 0.98 release for
+           it.)
+
+       (*) 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.
+
+       (*) Fix handling of implicit sizes in PSHUFW and PINSRW, reported by
+           Stefan Hoffmeister.
+
+       (*) Resurrect the -s option, which was removed when changing the
+           diagnostic output to stdout.
+
+C.2.43 Version 0.98p8
+
+       (*) Fix for "DB" when NASM is running on a bigendian machine.
+
+       (*) Invoke insns.pl once for each output script, making Makefile.in
+           legal for "make -j".
+
+       (*) Improve the Unix configure-based makefiles to make package
+           creation easier.
+
+       (*) Included an RPM .spec file for building RPM (RedHat Package
+           Manager) packages on Linux or Unix systems.
+
+       (*) Fix Makefile dependency problems.
+
+       (*) Change src/rdsrc.pl to include sectioning information in info
+           output; required for install-info to work.
+
+       (*) Updated the RDOFF distribution to version 2 from Jules; minor
+           massaging to make it compile in my environment.
+
+       (*) Split doc files that can be built by anyone with a Perl
+           interpreter off into a separate archive.
+
+       (*) "Dress rehearsal" release!
+
+C.2.44 Version 0.98p7
+
+       (*) Fixed opcodes with a third byte-sized immediate argument to not
+           complain if given "byte" on the immediate.
+
+       (*) Allow `%undef' to remove single-line macros with arguments. This
+           matches the behaviour of #undef in the C preprocessor.
+
+       (*) 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.
+
+       (*) Minor cleanups.
+
+       (*) Went through the list of Katmai instructions and hopefully fixed
+           the (rather few) mistakes in it.
+
+       (*) (Hopefully) fixed a number of disassembler bugs related to
+           ambiguous instructions (disambiguated by -p) and SSE
+           instructions with REP.
+
+       (*) Fix for bug reported by Mark Junger: "call dword 0x12345678"
+           should work and may add an OSP (affected CALL, JMP, Jcc).
+
+       (*) Fix for environments when "stderr" isn't a compile-time
+           constant.
+
+C.2.45 Version 0.98p6
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) Recognize "idt" or "centaur" for the -p option to ndisasm.
+
+       (*) Changed error messages back to stderr where they belong, but add
+           an -E option to redirect them elsewhere (the DOS shell cannot
+           redirect stderr.)
+
+       (*) -M option to generate Makefile dependencies (based on code from
+           Alex Verstak.)
+
+       (*) `%undef' preprocessor directive, and -u option, that undefines a
+           single-line macro.
+
+       (*) OS/2 Makefile (Mkfiles/Makefile.os2) for Borland under OS/2;
+           from Chuck Crayne.
+
+       (*) Various minor bugfixes (reported by): - Dangling `%s' in
+           preproc.c (Martin Junker)
+
+       (*) 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.
+
+       (*) Updated the License file per agreement with Simon and Jules to
+           include a GPL distribution clause.
+
+C.2.46 Version 0.98p3.7
+
+       (*) (Hopefully) fixed the canned Makefiles to include the outrdf2
+           and zoutieee modules.
+
+       (*) Renamed changes.asm to changed.asm.
+
+C.2.47 Version 0.98p3.6
+
+       (*) 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.
+
+C.2.48 Version 0.98p3.5
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) Added AMD-only SYSCALL and SYSRET instructions.
+
+       (*) Make SSE actually work, and add new Katmai MMX instructions.
+
+       (*) Added a -p (preferred vendor) option to ndisasm so that it can
+           distinguish e.g. Cyrix opcodes also used in SSE. For example:
+
+            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]
+
+       (*) Added a bunch of Cyrix-specific instructions.
+
+C.2.49 Version 0.98p3.4
+
+       (*) 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.
+
+       (*) DOS DJGPP+"Opus Make" Makefile from John S. Fine.
+
+       (*) changes.asm changes from John S. Fine.
+
+C.2.50 Version 0.98p3.3
+
+       (*) Patch from Conan Brink to allow nesting of `%rep' directives.
+
+       (*) 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.
+
+       (*) Updated changes.asm to include the latest changes.
+
+       (*) Tried to clean up the <CR>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.
+
+       (*) We would silently generate broken tools if insns.dat wasn't
+           sorted properly. Change insns.pl so that the order doesn't
+           matter.
+
+       (*) 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".
+
+C.2.51 Version 0.98p3.2
+
+       (*) Merged in John S. Fine's changes from his 0.98-J4 prerelease;
+           see http://www.csoft.net/cz/johnfine/
+
+       (*) 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.
+
+       (*) Removed BASIC programs from distribution. Get a Perl interpreter
+           instead (see below.)
+
+       (*) Calling this "pre-release 3.2" rather than "p3-hpa2" because of
+           John's contributions.
+
+       (*) 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".
+
+C.2.52 Version 0.98p3-hpa
+
+       (*) Merged nasm098p3.zip with nasm-0.97.tar.gz to create a fully
+           buildable version for Unix systems (Makefile.in updates, etc.)
+
+       (*) 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.
+
+       (*) 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.)
+
+       (*) MAX_SYMBOL was defined to be 9, but LOADALL286 and LOADALL386
+           are 10 characters long. Now MAX_SYMBOL is derived from
+           insns.dat.
+
+       (*) 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 http://www.cpan.org/ports/index.html.
+
+C.2.53 Version 0.98 pre-release 3
+
+       (*) added response file support, improved command line handling, new
+           layout help screen
+
+       (*) fixed limit checking bug, 'OUT byte nn, reg' bug, and a couple
+           of rdoff related bugs, updated Wishlist; 0.98 Prerelease 3.
+
+C.2.54 Version 0.98 pre-release 2
+
+       (*) 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
+
+C.2.55 Version 0.98 pre-release 1
+
+       (*) Fixed a bug whereby STRUC didn't work at all in RDF.
+
+       (*) Fixed a problem with group specification in PUBDEFs in OBJ.
+
+       (*) Improved ease of adding new output formats. Contribution due to
+           Fox Cutter.
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) Fixed a stale-pointer bug in the handling of the NASM
+           environment variable. Thanks to Thomas McWilliams.
+
+       (*) ELF had a hard limit on the number of sections which caused
+           segfaults when transgressed. Fixed.
+
+       (*) Added ability for ndisasm to read from stdin by using `-' as the
+           filename.
+
+       (*) ndisasm wasn't outputting the TO keyword. Fixed.
+
+       (*) Fixed error cascade on bogus expression in `%if' - an error in
+           evaluation was causing the entire `%if' to be discarded, thus
+           creating trouble later when the `%else' or `%endif' was
+           encountered.
+
+       (*) 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.
+
+       (*) All messages now appear on stdout, as sending them to stderr
+           serves no useful purpose other than to make redirection
+           difficult.
+
+       (*) Fixed the problem with EQUs pointing to an external symbol -
+           this now generates an error message.
+
+       (*) Allowed multiple size prefixes to an operand, of which only the
+           first is taken into account.
+
+       (*) 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.
+
+       (*) Reformatted a lot of the source code to be more readable.
+           Included 'coding.txt' as a guideline for how to format code for
+           contributors.
+
+       (*) Stopped nested `%reps' causing a panic - they now cause a
+           slightly more friendly error message instead.
+
+       (*) Fixed floating point constant problems (patch by Pedro Gimeno)
+
+       (*) Fixed the return value of insn_size() not being checked for -1,
+           indicating an error.
+
+       (*) Incorporated 3Dnow! instructions.
+
+       (*) Fixed the 'mov eax, eax + ebx' bug.
+
+       (*) Fixed the GLOBAL EQU bug in ELF. Released developers release 3.
+
+       (*) Incorporated John Fine's command line parsing changes
+
+       (*) Incorporated David Lindauer's OMF debug support
+
+       (*) Made changes for LCC 4.0 support (`__NASM_CDecl__', removed
+           register size specification warning when sizes agree).
+
+   C.3 NASM 0.9 Series
+
+       Revisions before 0.98.
+
+ C.3.1 Version 0.97 released December 1997
+
+       (*) This was entirely a bug-fix release to 0.96, which seems to have
+           got cursed. Silly me.
+
+       (*) Fixed stupid mistake in OBJ which caused `MOV EAX,<constant>' to
+           fail. Caused by an error in the `MOV EAX,<segment>' support.
+
+       (*) ndisasm hung at EOF when compiled with lcc on Linux because lcc
+           on Linux somehow breaks feof(). ndisasm now does not rely on
+           feof().
+
+       (*) A heading in the documentation was missing due to a markup error
+           in the indexing. Fixed.
+
+       (*) 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,...'
+
+       (*) 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.
+
+       (*) Added internal.doc back in to the distribution archives - it was
+           missing in 0.96 *blush*
+
+       (*) Fixed bug causing 0.96 to be unable to assemble its own test
+           files, specifically objtest.asm. *blush again*
+
+       (*) Fixed seg-faults and bogus error messages caused by mismatching
+           `%rep' and `%endrep' within multi-line macro definitions.
+
+       (*) Fixed a problem with buffer overrun in OBJ, which was causing
+           corruption at ends of long PUBDEF records.
+
+       (*) Separated DOS archives into main-program and documentation to
+           reduce download size.
+
+ C.3.2 Version 0.96 released November 1997
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) 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'.
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) Fixed some buffer overrun problems with large OBJ output files.
+           Thanks to DJ Delorie for the bug report and fix.
+
+       (*) Made preprocess-only mode actually listen to the `%line' markers
+           as it prints them, so that it can report errors more sanely.
+
+       (*) Re-designed the evaluator to keep more sensible track of
+           expressions involving forward references: can now cope with
+           previously-nightmare situations such as:
+
+         mov ax,foo | bar 
+         foo equ 1 
+         bar equ 2
+
+       (*) Added the ALIGN and ALIGNB standard macros.
+
+       (*) Added PIC support in ELF: use of WRT to obtain the four extra
+           relocation types needed.
+
+       (*) Added the ability for output file formats to define their own
+           extensions to the GLOBAL, COMMON and EXTERN directives.
+
+       (*) Implemented common-variable alignment, and global-symbol type
+           and size declarations, in ELF.
+
+       (*) Implemented NEAR and FAR keywords for common variables, plus
+           far-common element size specification, in OBJ.
+
+       (*) Added a feature whereby EXTERNs and COMMONs in OBJ can be given
+           a default WRT specification (either a segment or a group).
+
+       (*) Transformed the Unix NASM archive into an auto-configuring
+           package.
+
+       (*) 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.
+
+       (*) Added the ability, in OBJ format, to deal with `MOV
+           EAX,<segment>' 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.
+
+       (*) Added the ability to specify sections' alignment requirements in
+           Win32 object files and pure binary files.
+
+       (*) Added preprocess-time expression evaluation: the `%assign' (and
+           `%iassign') directive and the bare `%if' (and `%elif')
+           conditional. Added relational operators to the evaluator, for
+           use only in `%if' constructs: the standard relationals = < > <=
+           >= <> (and C-like synonyms == and !=) plus low-precedence
+           logical operators &&, ^^ and ||.
+
+       (*) Added a preprocessor repeat construct: `%rep' / `%exitrep' /
+           `%endrep'.
+
+       (*) Added the __FILE__ and __LINE__ standard macros.
+
+       (*) Added a sanity check for number constants being greater than
+           0xFFFFFFFF. The warning can be disabled.
+
+       (*) Added the %0 token whereby a variadic multi-line macro can tell
+           how many parameters it's been given in a specific invocation.
+
+       (*) Added `%rotate', allowing multi-line macro parameters to be
+           cycled.
+
+       (*) Added the `*' option for the maximum parameter count on multi-
+           line macros, allowing them to take arbitrarily many parameters.
+
+       (*) Added the ability for the user-level forms of EXTERN, GLOBAL and
+           COMMON to take more than one argument.
+
+       (*) Added the IMPORT and EXPORT directives in OBJ format, to deal
+           with Windows DLLs.
+
+       (*) Added some more preprocessor `%if' constructs: `%ifidn' /
+           `%ifidni' (exact textual identity), and `%ifid' / `%ifnum' /
+           `%ifstr' (token type testing).
+
+       (*) 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).
+
+       (*) Added NetBSD/FreeBSD/OpenBSD's variant of a.out format, complete
+           with PIC shared library features.
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) Added the ability for a variable to be declared as EXTERN
+           multiple times, and the subsequent definitions are just ignored.
+
+       (*) We now allow instruction prefixes (CS, DS, LOCK, REPZ etc) to be
+           alone on a line (without a following instruction).
+
+       (*) Improved sanity checks on whether the arguments to EXTERN,
+           GLOBAL and COMMON are valid identifiers.
+
+       (*) 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.
+
+       (*) ndisasm forgot to check whether the input file had been
+           successfully opened. Now it does. Doh!
+
+       (*) Added the Cyrix extensions to the MMX instruction set.
+
+       (*) 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.
+
+       (*) Added support for the PharLap OMF extension for 4096-byte
+           segment alignment.
+
+ C.3.3 Version 0.95 released July 1997
+
+       (*) 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.
+
+       (*) Added makefiles (for NASM and the RDF tools) to build Win32
+           console apps under Symantec C++. Donated by Mark Junker.
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) Added `@' to the list of valid characters to begin an identifier
+           with.
+
+       (*) Documentary changes, notably the addition of the `Common
+           Problems' section in nasm.doc.
+
+       (*) Fixed a bug relating to 32-bit PC-relative fixups in OBJ.
+
+       (*) Fixed a bug in perm_copy() in labels.c which was causing
+           exceptions in cleanup_labels() on some systems.
+
+       (*) Positivity sanity check in TIMES argument changed from a warning
+           to an error following a further complaint.
+
+       (*) Changed the acceptable limits on byte and word operands to allow
+           things like `~10111001b' to work.
+
+       (*) Fixed a major problem in the preprocessor which caused seg-
+           faults if macro definitions contained blank lines or comment-
+           only lines.
+
+       (*) Fixed inadequate error checking on the commas separating the
+           arguments to `db', `dw' etc.
+
+       (*) Fixed a crippling bug in the handling of macros with operand
+           counts defined with a `+' modifier.
+
+       (*) 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.
+
+       (*) Removed [INC] and [INCLUDE] support for good, since they were
+           obsolete anyway.
+
+       (*) 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.
+
+       (*) Added, tentatively, OS/2 object file support (as a minor variant
+           on OBJ).
+
+       (*) Updates to Fox Cutter's Borland C makefile, Makefile.bc2.
+
+       (*) Removed a spurious second fclose() on the output file.
+
+       (*) Added the `-s' command line option to redirect all messages
+           which would go to stderr (errors, help text) to stdout instead.
+
+       (*) Added the `-w' command line option to selectively suppress some
+           classes of assembly warning messages.
+
+       (*) Added the `-p' pre-include and `-d' pre-define command-line
+           options.
+
+       (*) Added an include file search path: the `-i' command line option.
+
+       (*) Fixed a silly little preprocessor bug whereby starting a line
+           with a `%!' environment-variable reference caused an `unknown
+           directive' error.
+
+       (*) Added the long-awaited listing file support: the `-l' command
+           line option.
+
+       (*) 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.
+
+       (*) Added the NASM environment variable.
+
+       (*) 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.
+
+       (*) Added `return 0;' to test/objlink.c to prevent compiler
+           warnings.
+
+       (*) Added the __NASM_MAJOR__ and __NASM_MINOR__ standard defines.
+
+       (*) Added an alternative memory-reference syntax in which prefixing
+           an operand with `&' is equivalent to enclosing it in square
+           brackets, at the request of Fox Cutter.
+
+       (*) Errors in pass two now cause the program to return a non-zero
+           error code, which they didn't before.
+
+       (*) 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.
+
+       (*) 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.
+
+ C.3.4 Version 0.94 released April 1997
+
+       (*) Major item: added the macro processor.
+
+       (*) 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.
+
+       (*) Fixed two more stupid bugs in ELF, which were causing `ld' to
+           continue to seg-fault in a lot of non-trivial cases.
+
+       (*) Fixed a seg-fault in the label manager.
+
+       (*) Stopped FBLD and FBSTP from _requiring_ the TWORD keyword, which
+           is the only option for BCD loads/stores in any case.
+
+       (*) 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.
+
+       (*) 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...
+
+       (*) Another minor phase error (insofar as a phase error can _ever_
+           be minor) fixed, this one occurring in code of the form
+
+         rol ax,forward_reference 
+         forward_reference equ 1
+
+       (*) 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).
+
+       (*) Added Watcom C makefiles, and misc/pmw.bat, donated by Dominik
+           Behr.
+
+       (*) Added the INCBIN pseudo-opcode.
+
+       (*) 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.
+
+       (*) Fixed a bug in OBJ format, which caused incorrect object records
+           to be output when absolute labels were made global.
+
+       (*) Updates to RDOFF subdirectory, and changes to outrdf.c.
+
+ C.3.5 Version 0.93 released January 1997
+
+       This release went out in a great hurry after semi-crippling bugs
+       were found in 0.92.
+
+       (*) Really _did_ fix the stack overflows this time. *blush*
+
+       (*) 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.
+
+       (*) 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.
+
+       (*) Included a new Borland C makefile, Makefile.bc2, donated by Fox
+           Cutter <lmb@comtch.iea.com>.
+
+ C.3.6 Version 0.92 released January 1997
+
+       (*) The FDIVP/FDIVRP and FSUBP/FSUBRP pairs had been inverted: this
+           was fixed. This also affected the LCC driver.
+
+       (*) Fixed a bug regarding 32-bit effective addresses of the form
+           `[other_register+ESP]'.
+
+       (*) Documentary changes, notably documentation of the fact that
+           Borland Win32 compilers use `obj' rather than `win32' object
+           format.
+
+       (*) Fixed the COMENT record in OBJ files, which was formatted
+           incorrectly.
+
+       (*) Fixed a bug causing segfaults in large RDF files.
+
+       (*) OBJ format now strips initial periods from segment and group
+           definitions, in order to avoid complications with the local
+           label syntax.
+
+       (*) Fixed a bug in disassembling far calls and jumps in NDISASM.
+
+       (*) Added support for user-defined sections in COFF and ELF files.
+
+       (*) Compiled the DOS binaries with a sensible amount of stack, to
+           prevent stack overflows on any arithmetic expression containing
+           parentheses.
+
+       (*) Fixed a bug in handling of files that do not terminate in a
+           newline.
+
+ C.3.7 Version 0.91 released November 1996
+
+       (*) Loads of bug fixes.
+
+       (*) Support for RDF added.
+
+       (*) Support for DBG debugging format added.
+
+       (*) Support for 32-bit extensions to Microsoft OBJ format added.
+
+       (*) Revised for Borland C: some variable names changed, makefile
+           added.
+
+       (*) LCC support revised to actually work.
+
+       (*) JMP/CALL NEAR/FAR notation added.
+
+       (*) `a16', `o16', `a32' and `o32' prefixes added.
+
+       (*) Range checking on short jumps implemented.
+
+       (*) MMX instruction support added.
+
+       (*) Negative floating point constant support added.
+
+       (*) Memory handling improved to bypass 64K barrier under DOS.
+
+       (*) `$' prefix to force treatment of reserved words as identifiers
+           added.
+
+       (*) Default-size mechanism for object formats added.
+
+       (*) Compile-time configurability added.
+
+       (*) `#', `@', `~' and c{?} are now valid characters in labels.
+
+       (*) `-e' and `-k' options in NDISASM added.
+
+ C.3.8 Version 0.90 released October 1996
+
+       First release version. First support for object file output. Other
+       changes from previous version (0.3x) too numerous to document.
diff --git a/packaging/nasm-2.08rc7-xdoc.tar.bz2 b/packaging/nasm-2.08rc7-xdoc.tar.bz2
new file mode 100644 (file)
index 0000000..4b963c7
Binary files /dev/null and b/packaging/nasm-2.08rc7-xdoc.tar.bz2 differ
diff --git a/packaging/nasm.sh b/packaging/nasm.sh
new file mode 100644 (file)
index 0000000..9138608
--- /dev/null
@@ -0,0 +1 @@
+export enable_nasm=set
diff --git a/packaging/nasm.spec b/packaging/nasm.spec
new file mode 100644 (file)
index 0000000..b3a5f43
--- /dev/null
@@ -0,0 +1,169 @@
+# -*- coding: utf-8 -*-
+Summary: A portable x86 assembler which uses Intel-like syntax
+Name: nasm
+Version: 2.08rc7
+Release: 2.16
+License: simplified BSD license
+Group: Development/Languages
+URL: http://nasm.sourceforge.net/
+Source0: nasm-%{version}.tar.bz2
+Source1: nasm-%{version}-xdoc.tar.bz2
+Source2: nasm.sh
+# >> gbp-patch-tags         # auto-added by gbp
+# << gbp-patch-tags         # auto-added by gbp
+BuildRequires: perl
+
+%package rdoff
+Summary: Tools for the RDOFF binary format, sometimes used with NASM
+Group: Development/Tools
+
+%description
+NASM is the Netwide Assembler, a free portable assembler for the Intel
+80x86 microprocessor series, using primarily the traditional Intel
+instruction mnemonics and syntax.
+
+%description rdoff
+Tools for the operating-system independent RDOFF binary format, which
+is sometimes used with the Netwide Assembler (NASM). These tools
+include linker, library manager, loader, and information dump.
+
+%prep
+%setup -q
+# >> gbp-apply-patches    # auto-added by gbp
+# << gbp-apply-patches    # auto-added by gbp
+tar xjf %{SOURCE1} --strip-components 1
+
+%build
+%configure
+make all
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT%{_bindir}
+mkdir -p $RPM_BUILD_ROOT/%{_mandir}/man1
+make INSTALLROOT=$RPM_BUILD_ROOT install install_rdf
+install -d $RPM_BUILD_ROOT/etc/profile.d
+cp %{SOURCE2} $RPM_BUILD_ROOT/etc/profile.d/ 
+
+
+%remove_docs
+
+%files
+%{_bindir}/nasm
+%{_bindir}/ndisasm
+/etc/profile.d/nasm.sh
+
+
+%files rdoff
+%defattr(-,root,root)
+%{_bindir}/ldrdf
+%{_bindir}/rdf2bin
+%{_bindir}/rdf2ihx
+%{_bindir}/rdf2com
+%{_bindir}/rdfdump
+%{_bindir}/rdflib
+%{_bindir}/rdx
+%{_bindir}/rdf2ith
+%{_bindir}/rdf2srec
+
+%changelog
+* Sat Apr 10 2010 Anas Nashif <anas.nashif@intel.com> - 2.08rc7
+- Fixed rpmlint errors
+* Tue Feb  9 2010 Arjan van de Ven <arjan@linux.intel.com> 2.08rc5
+- add nasm env variable script
+* Mon Feb  8 2010 Austin Zhang <austin.zhang@intel.com> 2.08rc7
+- Update to 2.08rc7
+* Tue Nov  3 2009 Austin Zhang <austin.zhang@intel.com> 2.08rc5
+- Update to 2.08rc5
+* Wed Sep  9 2009 Passion Zhao <passion.zhao@intel.com> - 2.0.7-1
+- Update to 2.0.7 to address CVE-2008-7177
+- Remove upstreamed patch: nasm-CVE-2008-2719.patch
+* Thu Jan 22 2009 Passion Zhao <passion.zhao@intel.com> 2.01-2
+- Fix CVE-2008-2719
+* Thu Sep 18 2008 Austin Zhang <austin.zhang@intel.com> 2.01
+- add check for the info file before installation
+* Tue Feb 19 2008 Fedora Release Engineering <rel-eng@fedoraproject.org> - 2.01-2
+- Autorebuild for GCC 4.3
+* Tue Jan 29 2008 Petr Machata <pmachata@redhat.com> - 2.01-1
+- rebase to a new stable upstream version 2.01
+* Wed Feb  7 2007 Petr Machata <pmachata@redhat.com> - 0.98.39-5
+- tidy up the specfile per rpmlint comments
+- use utf-8 and fix national characters in contributor's names
+- port bogus elf patch to new nasm version and turn it on again
+* Thu Jan 25 2007 Petr Machata <pmachata@redhat.com> - 0.98.39-4
+- Ville Skyttä: patch for non-failing %%%%post, %%%%preun
+- Resolves: #223714
+* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 0.98.39-3.2.2
+- rebuild
+* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - 0.98.39-3.2.1
+- bump again for double-long bug on ppc(64)
+* Tue Feb  7 2006 Jesse Keating <jkeating@redhat.com> - 0.98.39-3.2
+- rebuilt for new gcc4.1 snapshot and glibc changes
+* Fri Dec  9 2005 Jesse Keating <jkeating@redhat.com>
+- rebuilt
+* Mon Apr  4 2005 Jeremy Katz <katzj@redhat.com> - 0.98.39-3
+- pdf docs are duplication of html, txt and postscript
+* Fri Apr  1 2005 Jindrich Novy <jnovy@redhat.com> 0.98.39-2
+- fix yet another vsprintf buffer overflow (#152963)
+* Thu Mar 31 2005 Jindrich Novy <jnovy@redhat.com> 0.98.39-1
+- update to 0.98.39
+- add BuildRequires ghostscript, texinfo to doc subpackage (#110584)
+- generate also PDF documentation for nasm (#88431)
+- new release fixes CAN-2004-1287 (#143052)
+* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+* Fri Feb 13 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+* Fri Sep 26 2003 Florian La Roche <Florian.LaRoche@redhat.de>
+- update to 0.98.38 and specfile cleanup
+* Wed Jun  4 2003 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+* Wed Jan 22 2003 Tim Powers <timp@redhat.com>
+- rebuilt
+* Tue Dec 17 2002 Phil Knirsch <pknirsch@redhat.com> 0.98.35-2
+- Removed ExclusiveArch tag.
+- Fixed typo in homepage URL.
+* Wed Dec 11 2002 Thomas Woerner <twoerner@redhat.com> 0.98.35-1
+- new version 0.98.35
+- nasm has new homepage (#77323)
+* Fri Nov 29 2002 Tim Powers <timp@redhat.com> 0.98.34-2
+- fix %%%%doc list
+- remove unpackaged files from the buildroot
+* Mon Sep 16 2002 Jeremy Katz <katzj@redhat.com> 0.98.34-1hammer
+- add x86_64 to ExclusiveArch list
+* Tue Jul 23 2002 Trond Eivind Glomsrød <teg@redhat.com> 0.98.34-1
+- 0.98.34
+* Fri Jun 21 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+* Sun May 26 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+* Tue May 21 2002 Trond Eivind Glomsrød <teg@redhat.com> 0.98.32-1
+- 0.98.32
+- Various doc files have changed names/been removed/added
+- New download location (after the license change, it's at sourceforge)
+- The new version is LGPL
+- Only build on x86 (#65255)
+* Tue Feb 26 2002 Trond Eivind Glomsrød <teg@redhat.com> 0.98.22-2
+- Rebuild
+* Mon Jan 21 2002 Bernhard Rosenkraenzer <bero@redhat.com>
+- Update to 0.98.22 to fix bogus code generation in SDL
+- Fix spec file, handle RPM_OPT_FLAGS
+* Wed Jan  9 2002 Tim Powers <timp@redhat.com>
+- automated rebuild
+* Tue Aug  7 2001 Trond Eivind Glomsrød <teg@redhat.com>
+- Updated patch from H.J. Lu for bogus elf generation (#45986,
+  verified by reporter)
+* Thu Apr 26 2001 Trond Eivind Glomsrød <teg@redhat.com>
+- Updated patch for bogus elf generation from hjl@gnu.org
+* Tue Feb 13 2001 Trond Eivind Glomsrød <teg@redhat.com>
+- Add patch from H.J. Lu to avoid creating bogus elf objects (#27489)
+* Wed Jul 12 2000 Prospector <bugzilla@redhat.com>
+- automatic rebuild
+* Tue Jun 13 2000 Trond Eivind Glomsrød <teg@redhat.com>
+- rewrote almost everything. The old specfile was bad, bad, bad.
+  Really Bad.
+* Tue Apr  4 2000 Erik Troan <ewt@redhat.com>
+- moved to distribution (syslinux needs it)
+- gzipped man pages
+* Thu Dec  2 1999 Preston Brown <pbrown@redhat.com>
+- adopted from one of the best .spec files I have seen in a long time. :)