summaryrefslogtreecommitdiff
path: root/doc/latex/src/changelog.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/latex/src/changelog.tex')
-rw-r--r--doc/latex/src/changelog.tex2304
1 files changed, 2304 insertions, 0 deletions
diff --git a/doc/latex/src/changelog.tex b/doc/latex/src/changelog.tex
new file mode 100644
index 00000000..4a03a6be
--- /dev/null
+++ b/doc/latex/src/changelog.tex
@@ -0,0 +1,2304 @@
+%
+% vim: ts=4 sw=4 et
+%
+\xchapter{changelog}{\textindexlc{NASM Version History}}
+
+\xsection{cl-2.xx}{NASM 2 Series}
+
+The NASM 2 series supports x86-64, and is the production version of NASM
+since 2007.
+
+\xsubsection{cl-2.15}{Version 2.15}
+
+\begin{itemize}
+ \item{The state of warnings can now be saved and restored via
+ the \code{[WARNING PUSH]} and \code{[WARNING POP]} directives.
+ See \nref{asmdir-warning}}.
+\end{itemize}
+
+\xsubsection{cl-2.14.03}{Version 2.14.03}
+
+\begin{itemize}
+ \item{Suppress nuisance "\code{label changed during code
+ generation}" messages after a real error.}
+\end{itemize}
+
+\xsubsection{cl-2.14.02}{Version 2.14.02}
+
+\begin{itemize}
+ \item{Fix crash due to multiple errors or warnings during the code
+ generation pass if a list file is specified.}
+\end{itemize}
+
+\xsubsection{cl-2.14.01}{Version 2.14.01}
+
+\begin{itemize}
+ \item{Create all system-defined macros defore processing command-line
+ given preprocessing directives (\code{-p}, \code{-d}, \code{-u}, \code{--pragma},
+ \code{--before}).}
+
+ \item{If debugging is enabled, define a \code{\_\_DEBUG\_FORMAT\_\_} predefined
+ macro. See \nref{dfmtm}.}
+
+ \item{Fix an assert for the case in the \code{obj} format when a \code{SEG}
+ operator refers to an \code{EXTERN} symbol declared further down in the
+ code.}
+
+ \item{Fix a corner case in the floating-point code where a binary, octal
+ or hexadecimal floating-point having at least 32, 11, or 8 mantissa
+ digits could produce slightly incorrect results under very specific
+ conditions.}
+
+ \item{Support \code{-MD} without a filename, for \code{gcc} compatibility.
+ \code{-MF} can be used to set the dependencies output filename.
+ See \nref{opt-MD}.}
+
+ \item{Fix \code{-E} in combination with \code{-MD}. See \nref{opt-E}.}
+
+ \item{Fix missing errors on redefined labels; would cause convergence
+ failure instead which is very slow and not easy to debug.}
+
+ \item{Duplicate definitions of the same label \emph{with the same value} is now
+ explicitly permitted (2.14 would allow it in some circumstances.)}
+
+ \item{Add the option \code{--no-line} to ignore \code{\%line} directives in the
+ source. See \nref{opt-no-line} and \nref{line}.}
+\end{itemize}
+
+\xsubsection{cl-2.14}{Version 2.14}
+
+\begin{itemize}
+ \item{Changed \code{-I} option semantics by adding a trailing path
+ separator unconditionally.}
+
+ \item{Fixed null dereference in corrupted invalid single line macros.}
+
+ \item{Fixed division by zero which may happen if source code is malformed.}
+
+ \item{Fixed out of bound access in processing of malformed segment override.}
+
+ \item{Fixed out of bound access in certain \code{EQU} parsing.}
+
+ \item{Fixed buffer underflow in float parsing.}
+
+ \item{Added \code{SGX} (Intel Software Guard Extensions) instructions.}
+
+ \item{Added \code{+n} syntax for multiple contiguous registers.}
+
+ \item{Fixed \code{subsections\_via\_symbols} for \code{macho} object format.}
+
+ \item{Added the \code{--gprefix}, \code{--gpostfix}, \code{--lprefix}, and
+ \code{--lpostfix} command line options, to allow command line base symbol
+ renaming. See \nref{opt-pfix}.}
+
+ \item{Allow label renaming to be specified by \code{\%pragma} in addition to
+ from the command line. See \nref{mangling}.}
+
+ \item{Supported generic \code{\%pragma} namespaces, \code{output} and \code{debug}.
+ See \nref{gen-namespace}.}
+
+ \item{Added the \code{--pragma} command line option to inject a \code{\%pragma}
+ directive. See \nref{opt-pragma}.}
+
+ \item{Added the \code{--before} command line option to accept preprocess
+ statement before input. See \nref{opt-before}.}
+
+ \item{Added \code{AVX512} \code{VBMI2} (Additional Bit Manipulation), \code{VNNI}
+ (Vector Neural Network), \code{BITALG} (Bit Algorithm), and \code{GFNI} (Galois
+ Field New Instruction) instructions.}
+
+ \item{Added the \code{STATIC} directive for local symbols that should be
+ renamed using global-symbol rules. See \nref{static}.}
+
+ \item{Allow a symbol to be defined as \code{EXTERN} and then later
+ overridden as \code{GLOBAL} or \code{COMMON}. Furthermore, a symbol
+ declared \code{EXTERN} and then defined will be treated as \code{GLOBAL}.
+ See \nref{extern}.}
+
+ \item{The \code{GLOBAL} directive no longer is required to precede the
+ definition of the symbol.}
+
+ \item{Support \code{private\_extern} as \code{macho} specific extension to the
+ \code{GLOBAL} directive. See \nref{macho-pext}.}
+
+ \item{Updated \code{UD0} encoding to match with the specification}
+
+ \item{Added the \code{--limit-X} command line option to set execution
+ limits. See \nref{opt-limit}.}
+
+ \item{Updated the \code{Codeview} version number to be aligned with \code{MASM}.}
+
+ \item{Added the \code{--keep-all} command line option to preserve output
+ files. See \nref{opt-keep-all}.}
+
+ \item{Added the \code{--include} command line option, an alias to \code{-P}
+ (\nref{opt-p}).}
+
+ \item{Added the \code{--help} command line option as an alias to \code{-h}
+ (\nref{syntax}).}
+
+ \item{Added \code{-W}, \code{-D}, and \code{-Q} suffix aliases for \code{RET}
+ instructions so the operand sizes of these instructions can be
+ encoded without using \code{o16}, \code{o32} or \code{o64}.}
+\end{itemize}
+
+\xsubsection{cl-2.13.03}{Version 2.13.03}
+
+\begin{itemize}
+ \item{Added AVX and AVX512 \code{VAES*} and \code{VPCLMULQDQ} instructions.}
+ \item{Fixed missing dwarf record in x32 ELF output format.}
+\end{itemize}
+
+\xsubsection{cl-2.13.02}{Version 2.13.02}
+
+\begin{itemize}
+ \item{Fix false positive in testing of numeric overflows.}
+
+ \item{Fix generation of \code{PEXTRW} instruction.}
+
+ \item{Fix \code{smartalign} package which could trigger an error during
+ optimization if the alignment code expanded too much due to
+ optimization of the previous code.}
+
+ \item{Fix a case where negative value in \code{TIMES} directive causes
+ panic instead of an error.}
+
+ \item{Always finalize \code{.debug\_abbrev} section with a null in
+ \code{dwarf} output format.}
+
+ \item{Support \code{debug} flag in section attributes for \code{macho}
+ output format. See \nref{machosect}.}
+
+ \item{Support up to 16 characters in section names for \code{macho}
+ output format.}
+
+ \item{Fix missing update of global \code{BITS} setting if \code{SECTION}
+ directive specified a bit size using output format-specific
+ extensions (e.g. \code{USE32} for the \code{obj} output format.)}
+
+ \item{Fix the incorrect generation of VEX-encoded instruction when static
+ mode decorators are specified on scalar instructions, losing the
+ decorators as they require EVEX encoding.}
+
+ \item{Option \code{-MW} to quote dependency outputs according to Watcom
+ Make conventions instead of POSIX Make conventions. See \nref{opt-MW}.}
+
+ \item{The \code{obj} output format now contains embedded dependency file
+ information, unless disabled with \code{\%pragma obj nodepend}. See
+ \nref{objdepend}.}
+
+ \item{Fix generation of dependency lists.}
+
+ \item{Fix a number of null pointer reference and memory allocation errors.}
+
+ \item{Always generate symbol-relative relocations for the \code{macho64}
+ output format; at least some versions of the XCode/LLVM linker fails
+ for section-relative relocations.}
+\end{itemize}
+
+\xsubsection{cl-2.13.01}{Version 2.13.01}
+
+\begin{itemize}
+ \item{Fix incorrect output for some types of \code{FAR} or \code{SEG}
+ references in the \code{obj} output format, and possibly other 16-bit
+ output formats.}
+
+ \item{Fix the address in the list file for an instruction containing a
+ \code{TIMES} directive.}
+
+ \item{Fix error with \code{TIMES} used together with an instruction which
+ can vary in size, e.g. \code{JMP}.}
+
+ \item{Fix breakage on some uses of the \code{DZ} pseudo-op.}
+\end{itemize}
+
+\xsubsection{cl-2.13}{Version 2.13}
+
+\begin{itemize}
+ \item{Support the official forms of the \code{UD0} and \code{UD1} instructions.}
+
+ \item{Allow self-segment-relative expressions in immediates and
+ displacements, even when combined with an external or otherwise
+ out-of-segment special symbol, e.g.:
+\begin{lstlisting}
+extern foo
+mov eax,[foo - $ + ebx] ; Now legal
+\end{lstlisting}}
+
+ \item{Handle a 64-bit origin in NDISASM.}
+
+ \item{NASM can now generate sparse output files for relevant output
+ formats, if the underlying operating system supports them.}
+
+ \item{The \code{macho} object format now supports the
+ \code{subsections\_via\_symbols} and \code{no\_dead\_strip}
+ directives, see \nref{macho-ssvs}.}
+
+ \item{The \code{macho} object format now supports the \code{no\_dead\_strip},
+ \code{live\_support} and \code{strip\_static\_syms} section flags,
+ see \nref{machosect}.}
+
+ \item{The \code{macho} object format now supports the \code{dwarf} debugging
+ format, as required by newer toolchains.}
+
+ \item{All warnings can now be suppressed if desired; warnings not
+ otherwise part of any warning class are now considered its own
+ warning class called \code{other} (e.g. \code{-w-other}). Furthermore,
+ warning-as-error can now be controlled on a per warning class
+ basis, using the syntax \code{-w+error=}\emph{warning-class} and its
+ equivalent for all other warning control options. See \nref{opt-w}
+ for the command-line options and warning classes and
+ \nref{asmdir-warning} for the \code{[WARNING]} directive.}
+
+ \item{Fix a number of bugs related to AVX-512 decorators.}
+
+ \item{Significant improvements to building NASM with Microsoft Visual
+ Studio via \code{Mkfiles/msvc.mak}. It is now possible to build the
+ full Windows installer binary as long as the necessary
+ prerequisites are installed; see \code{Mkfiles/README}}
+
+ \item{To build NASM with custom modifications (table changes) or from the
+ git tree now requires Perl 5.8 at the very minimum, quite possibly
+ a higher version (Perl 5.24.1 tested.) There is no requirement to
+ have Perl on your system at all if all you want to do is build
+ unmodified NASM from source archives.}
+
+ \item{Fix the \code{\{z\}} decorator on AVX-512 \code{VMOVDQ*}
+ instructions.}
+
+ \item{Add new warnings for certain dangerous constructs which never ought
+ to have been allowed. In particular, the \code{RESB} family of
+ instructions should have been taking a critical expression all
+ along.}
+
+ \item{Fix the EVEX (AVX-512) versions of the \code{VPBROADCAST}, \code{VPEXTR},
+ and \code{VPINSR} instructions.}
+
+ \item{Support contracted forms of additional instructions. As a general
+ rule, if an instruction has a non-destructive source immediately
+ after a destination register that isn't used as an input, NASM
+ supports omitting that source register, using the destination
+ register as that value. This among other things makes it easier to
+ convert SSE code to the equivalent AVX code:
+\begin{lstlisting}
+addps xmm1,xmm0 ; SSE instruction
+vaddps ymm1,ymm1,ymm0 ; AVX official long form
+vaddps ymm1,ymm0 ; AVX contracted form
+\end{lstlisting}}
+
+ \item{Fix Codeview malformed compiler version record.}
+
+ \item{Add the \code{CLWB} and \code{PCOMMIT} instructions. Note that the
+ \code{PCOMMIT} instruction has been deprecated and will never be
+ included in a shipping product; it is included for completeness
+ only.}
+
+ \item{Add the \code{\%pragma} preprocessor directive for
+ soft-error directives.}
+
+ \item{Add the \code{RDPID} instruction.}
+\end{itemize}
+
+\xsubsection{cl-2.12.02}{Version 2.12.02}
+
+\begin{itemize}
+ \item{Fix preprocessor errors, especially \code{\%error} and
+ \code{\%warning}, inside \code{\%if} statements.}
+
+ \item{Fix relative relocations in 32-bit Mach-O.}
+
+ \item{More Codeview debug format fixes.}
+
+ \item{If the MASM \code{PTR} keyword is encountered, issue a warning. This is
+ much more likely to indicate a MASM-ism encountered in NASM than it
+ is a valid label. This warning can be suppressed with \code{-w-ptr},
+ the \code{[warning]} directive (see \nref{opt-w}) or by the macro
+ definition \code{\%idefine ptr \$\%} (see \nref{selfref}).}
+
+ \item{When an error or a warning comes from the expansion of a multi-line
+ macro, display the file and line numbers for the expanded macros.
+ Macros defined with \code{.nolist} do not get displayed.}
+
+ \item{Add macros \code{ilog2fw()} and \code{ilog2cw()} to the \code{ifunc} macro
+ package. See \nref{ilog2}.}
+\end{itemize}
+
+\xsubsection{cl-2.12.01}{Version 2.12.01}
+
+\begin{itemize}
+ \item{Portability fixes for some platforms.}
+ \item{Fix error when not specifying a list file.}
+ \item{Correct the handling of macro-local labels in the Codeview debugging format.}
+ \item{Add \code{CLZERO}, \code{MONITORX} and \code{MWAITX} instructions.}
+\end{itemize}
+
+\xsubsection{cl-2.12}{Version 2.12}
+
+\begin{itemize}
+ \item{Major fixes to the \code{macho} backend (\nref{machofmt}); earlier versions
+ would produce invalid symbols and relocations on a regular basis.}
+
+ \item{Support for thread-local storage in Mach-O.}
+
+ \item{Support for arbitrary sections in Mach-O.}
+
+ \item{Fix wrong negative size treated as a big positive value passed into
+ backend causing NASM to crash.}
+
+ \item{Fix handling of zero-extending unsigned relocations, we have been printing
+ wrong message and forgot to assign segment with predefined value before
+ passing it into output format.}
+
+ \item{Fix potential write of oversized (with size greater than allowed in
+ output format) relative relocations.}
+
+ \item{Portability fixes for building NASM with the LLVM compiler.}
+
+ \item{Add support of Codeview version 8 (\code{cv8}) debug format for
+ \code{win32} and \code{win64} formats in the \code{COFF} backend,
+ see \nref{codeview}.}
+
+ \item{Allow 64-bit outputs in 16/32-bit only backends. Unsigned 64-bit
+ relocations are zero-extended from 32-bits with a warning
+ (suppressible via \code{-w-zext-reloc}); signed 64-bit relocations are
+ an error.}
+
+ \item{Line numbers in list files now correspond to the lines in the source
+ files, instead of simply being sequential.}
+
+ \item{There is now an official 64-bit (x64 a.k.a. x86-64) build for Windows.}
+\end{itemize}
+
+\xsubsection{cl-2.11.09}{Version 2.11.09}
+
+\begin{itemize}
+ \item{Fix potential stack overwrite in \code{macho32} backend.}
+
+ \item{Fix relocation records in \code{macho64} backend.}
+
+ \item{Fix symbol lookup computation in \code{macho64} backend.}
+
+ \item{Adjust \code{.symtab} and \code{.rela.text} sections alignments to 8 bytes
+ in \code{elf64} backed.}
+
+ \item{Fix section length computation in \code{bin} backend which leaded in incorrect
+ relocation records.}
+\end{itemize}
+
+\xsubsection{cl-2.11.08}{Version 2.11.08}
+
+\begin{itemize}
+ \item{Fix section length computation in \code{bin} backend which leaded in incorrect
+ relocation records.}
+
+ \item{Add a warning for numeric preprocessor definitions passed via command
+ line which might have unexpected results otherwise.}
+
+ \item{Add ability to specify a module name record in \code{rdoff} linker with
+ \code{-mn} option.}
+
+ \item{Increase label length capacity up to 256 bytes in \code{rdoff} backend for
+ FreePascal sake, which tends to generate very long labels for procedures.}
+
+ \item{Fix segmentation failure when rip addressing is used in \code{macho64} backend.}
+
+ \item{Fix access on out of memory when handling strings with a single
+ grave. We have sixed similar problem in previous release but not
+ all cases were covered.}
+
+ \item{Fix NULL dereference in disassembled on \code{BND} instruction.}
+\end{itemize}
+
+\xsubsection{cl-2.11.07}{Version 2.11.07}
+
+\begin{itemize}
+ \item{Fix 256 bit \code{VMOVNTPS} instruction.}
+
+ \item{Fix \code{-MD} option handling, which was rather broken in previous
+ release changing command line api.}
+
+ \item{Fix access to unitialized space when handling strings with
+ a single grave.}
+
+ \item{Fix nil dereference in handling memory reference parsing.}
+\end{itemize}
+
+\xsubsection{cl-2.11.06}{Version 2.11.06}
+
+\begin{itemize}
+ \item{Update AVX512 instructions based on the Extension Reference (319433-021 Sept 2014).}
+ \item{Fix the behavior of \code{-MF} and \code{-MD} options (Bugzilla 3392280)}
+ \item{Updated Win32 Makefile to fix issue with build}
+\end{itemize}
+
+\xsubsection{cl-2.11.05}{Version 2.11.05}
+
+\begin{itemize}
+ \item{Add \code{--v} as an alias for \code{-v} (see \nref{opt-v}), for
+ command-line compatibility with Yasm.}
+ \item{Fix a bug introduced in 2.11.03 whereby certain instructions would
+ contain multiple REX prefixes, and thus be corrupt.}
+\end{itemize}
+
+\xsubsection{cl-2.11.04}{Version 2.11.04}
+
+\begin{itemize}
+ \item{Removed an invalid error checking code. Sometimes a memref only with
+ a displacement can also set an evex flag. For example:
+\begin{lstlisting}
+vmovdqu32 [0xabcd]{k1}, zmm0
+\end{lstlisting}}
+
+ \item{Fixed a bug in disassembler that EVEX.L'L vector length was not matched
+ when EVEX.b was set because it was simply considered as EVEC.RC.
+ Separated EVEX.L'L case from EVEX.RC which is ignored in matching.}
+\end{itemize}
+
+\xsubsection{cl-2.11.03}{Version 2.11.03}
+
+\begin{itemize}
+ \item{Fix a bug there REX prefixes were missing on instructions
+ inside a \code{TIMES} statement.}
+\end{itemize}
+
+\xsubsection{cl-2.11.02}{Version 2.11.02}
+
+\begin{itemize}
+ \item{Add the \code{XSAVEC}, \code{XSAVES} and \code{XRSTORS} family instructions.}
+ \item{Add the \code{CLFLUSHOPT} instruction.}
+\end{itemize}
+
+\xsubsection{cl-2.11.01}{Version 2.11.01}
+
+\begin{itemize}
+ \item{Allow instructions which implicitly uses \code{XMM0} (\code{VBLENDVPD},
+ \code{VBLENDVPS}, \code{PBLENDVB} and \code{SHA256RNDS2}) to be specified
+ without an explicit \code{xmm0} on the assembly line. In other words,
+ the following two lines produce the same output:
+\begin{lstlisting}
+vblendvpd xmm2,xmm1,xmm0 ; Last operand is fixed xmm0
+vblendvpd xmm2,xmm1 ; Implicit xmm0 omitted
+\end{lstlisting}}
+
+ \item{In the ELF backends, don't crash the assembler if \code{section align}
+ is specified without a value.}
+\end{itemize}
+
+\xsubsection{cl-2.11}{Version 2.11}
+
+\begin{itemize}
+ \item{Add support for the Intel AVX-512 instruction set:}
+
+ \item{16 new, 512-bit SIMD registers. Total 32 \code{(ZMM0 \textasciitilde ZMM31)}}
+
+ \item{8 new opmask registers \code{(K0 \textasciitilde K7)}.
+ One of 7 registers \code{(K1 \textasciitilde K7)} can
+ be used as an opmask for conditional execution.}
+
+ \item{A new EVEX encoding prefix. EVEX is based on VEX and provides more
+ capabilities: opmasks, broadcasting, embedded rounding and compressed
+ displacements.
+\begin{lstlisting}
+; opmask: conditional vector operation
+; using opmask k1 and {z} is for zero-masking
+ VDIVPD zmm0{k1}{z}, zmm1, zmm3
+
+; broadcasting: load single-precision float and
+; replicate it 16 times. 32 * 16 = 512
+ VDIVPS zmm4, zmm5, [rbx]{1to16}
+
+; embedded rounding: round toward zero. note that
+: it is used as if a separate operand. it comes after
+; the last SIMD operand
+ VCVTSI2SD xmm6, xmm7, {rz-sae}, rax
+\end{lstlisting}}
+
+ \item{Add support for \code{ZWORD} (512 bits), \code{DZ} and \code{RESZ}.}
+
+ \item{Add support for the MPX and SHA instruction sets.}
+
+ \item{Better handling of section redefinition.}
+
+ \item{Generate manpages when running \code{'make dist'}.}
+
+ \item{Handle all token chains in mmacro params range.}
+
+ \item{Support split [base,index] effective address:
+\begin{lstlisting}
+; eax=base, ecx=index, 4=scale, 8=disp
+mov eax,[eax+8,ecx*4]
+\end{lstlisting}
+ This is expected to be most useful for the MPX instructions.}
+
+ \item{Support \code{BND} prefix for branch instructions (for MPX).}
+
+ \item{The \code{DEFAULT} directive can now take \code{BND} and \code{NOBND}
+ options to indicate whether all relevant branches should be getting
+ \code{BND} prefixes. This is expected to be the normal for use in MPX
+ code.}
+
+ \item{Add \code{{evex}}, \code{{vex3}} and \code{{vex2}} instruction prefixes to
+ have NASM encode the corresponding instruction, if possible, with an EVEX,
+ 3-byte VEX, or 2-byte VEX prefix, respectively.}
+
+ \item{Support for section names longer than 8 bytes in Win32/Win64 COFF.}
+
+ \item{The \code{NOSPLIT} directive by itself no longer forces a single
+ register to become an index register, unless it has an explicit
+ multiplier.
+\begin{lstlisting}
+mov eax,[nosplit eax] ; eax as base register
+mov eax,[nosplit eax*1] ; eax as index register
+\end{lstlisting}}
+\end{itemize}
+
+\xsubsection{cl-2.10.09}{Version 2.10.09}
+
+\begin{itemize}
+ \item{Pregenerate man pages.}
+\end{itemize}
+
+\xsubsection{cl-2.10.08}{Version 2.10.08}
+
+\begin{itemize}
+ \item{Fix \code{VMOVNTDQA}, \code{MOVNTDQA} and \code{MOVLPD} instructions.}
+ \item{Fix collision for \code{VGATHERQPS}, \code{VPGATHERQD} instructions.}
+ \item{Fix \code{VPMOVSXBQ}, \code{VGATHERQPD}, \code{VSPLLW} instructions.}
+ \item{Add a bunch of AMD TBM instructions.}
+ \item{Fix potential stack overwrite in numbers conversion.}
+ \item{Allow byte size in \code{PREFETCHTx} instructions.}
+ \item{Make manual pages up to date.}
+ \item{Make \code{F3} and \code{F2} SSE prefixes to override \code{66}.}
+ \item{Support of AMD SVM instructions in 32 bit mode.}
+ \item{Fix near offsets code generation for \code{JMP}, \code{CALL} instrictions in long mode.}
+ \item{Fix preprocessor parse regression when id is expanding to a whitespace.}
+\end{itemize}
+
+\xsubsection{cl-2.10.07}{Version 2.10.07}
+
+\begin{itemize}
+ \item{Fix line continuation parsing being broken in previous version.}
+\end{itemize}
+
+\xsubsection{cl-2.10.06}{Version 2.10.06}
+
+\begin{itemize}
+ \item{Always quote the dependency source names when using the automatic
+ dependency generation options.}
+ \item{If no dependency target name is specified via the \code{-MT} or
+ \code{-MQ} options, quote the default output name.}
+ \item{Fix assembly of shift operations in \code{CPU 8086} mode.}
+ \item{Fix incorrect generation of explicit immediate byte for shift by 1
+ under certain circumstances.}
+ \item{Fix assembly of the \code{VPCMPGTQ} instruction.}
+ \item{Fix RIP-relative relocations in the \code{macho64} backend.}
+\end{itemize}
+
+\xsubsection{cl-2.10.05}{Version 2.10.05}
+
+\begin{itemize}
+ \item{Add the \code{CLAC} and \code{STAC} instructions.}
+\end{itemize}
+
+\xsubsection{cl-2.10.04}{Version 2.10.04}
+
+\begin{itemize}
+ \item{Add back the inadvertently deleted 256-bit version of the \code{VORPD} instruction.}
+ \item{Correct disassembly of instructions starting with byte \code{82} hex.}
+ \item{Fix corner cases in token pasting, for example:
+\begin{lstlisting}
+%define N 1e%++%+ 5
+dd N, 1e+5
+\end{lstlisting}}
+\end{itemize}
+
+\xsubsection{cl-2.10.03}{Version 2.10.03}
+
+\begin{itemize}
+ \item{Correct the assembly of the instruction:
+\begin{lstlisting}
+XRELEASE MOV [absolute],AL
+\end{lstlisting}
+ Previous versions would incorrectly generate \code{F3 A2} for this
+ instruction and issue a warning; correct behavior is to emit \code{F3 88 05}.}
+\end{itemize}
+
+\xsubsection{cl-2.10.02}{Version 2.10.02}
+
+\begin{itemize}
+ \item{Add the \code{ifunc} macro package with integer functions, currently
+ only integer logarithms. See \nref{pkgifunc}.}
+ \item{Add the \code{RDSEED}, \code{ADCX} and \code{ADOX} instructions.}
+\end{itemize}
+
+\xsubsection{cl-2.10.01}{Version 2.10.01}
+
+\begin{itemize}
+ \item{Add missing VPMOVMSKB instruction with reg32, ymmreg operands.}
+\end{itemize}
+
+\xsubsection{cl-2.10}{Version 2.10}
+
+\begin{itemize}
+ \item{When optimization is enabled, \code{mov r64,imm} now optimizes to the
+ shortest form possible between:
+\begin{lstlisting}
+mov r32,imm32 ; 5 bytes
+mov r64,imm32 ; 7 bytes
+mov r64,imm64 ; 10 bytes
+\end{lstlisting}
+ To force a specific form, use the \code{STRICT} keyword, see \nref{strict}.}
+ \item{Add support for the Intel AVX2 instruction set.}
+ \item{Add support for Bit Manipulation Instructions 1 and 2.}
+ \item{Add support for Intel Transactional Synchronization Extensions (TSX).}
+ \item{Add support for x32 ELF (32-bit ELF with the CPU in 64-bit mode.) See \nref{elffmt}.}
+ \item{Add support for bigendian UTF-16 and UTF-32. See \nref{unicode}.}
+\end{itemize}
+
+\xsubsection{cl-2.09.10}{Version 2.09.10}
+
+\begin{itemize}
+ \item{Fix up NSIS script to protect uninstaller against registry keys
+ absence or corruption. It brings in a few additional questions
+ to a user during deinstallation procedure but still it is better
+ than unpredictable file removal.}
+\end{itemize}
+
+\xsubsection{cl-2.09.09}{Version 2.09.09}
+
+\begin{itemize}
+ \item{Fix initialization of section attributes of \code{bin} output format.}
+ \item{Fix \code{mach64} output format bug that crashes NASM due to NULL symbols.}
+\end{itemize}
+
+\xsubsection{cl-2.09.08}{Version 2.09.08}
+
+\begin{itemize}
+ \item{Fix \code{\_\_OUTPUT\_FORMAT\_\_} assignment when output driver alias
+ is used. For example when \code{-f elf} is used \code{\_\_OUTPUT\_FORMAT\_\_}
+ must be set to \code{elf}, if \code{-f elf32} is used \code{\_\_OUTPUT\_FORMAT\_\_}
+ must be assigned accordingly, i.e. to \code{elf32}. The rule applies to
+ all output driver aliases. See \nref{ofmtm}.}
+\end{itemize}
+
+\xsubsection{cl-2.09.07}{Version 2.09.07}
+
+\begin{itemize}
+ \item{Fix attempts to close same file several times when \code{-a} option is used.}
+ \item{Fixes for VEXTRACTF128, VMASKMOVPS encoding.}
+\end{itemize}
+
+\xsubsection{cl-2.09.06}{Version 2.09.06}
+
+\begin{itemize}
+ \item{Fix missed section attribute initialization in \code{bin} output target.}
+\end{itemize}
+
+\xsubsection{cl-2.09.05}{Version 2.09.05}
+
+\begin{itemize}
+ \item{Fix arguments encoding for VPEXTRW instruction.}
+ \item{Remove invalid form of VPEXTRW instruction.}
+ \item{Add \code{VLDDQU} as alias for \code{VLDQQU} to match specification.}
+\end{itemize}
+
+\xsubsection{cl-2.09.04}{Version 2.09.04}
+
+\begin{itemize}
+ \item{Fix incorrect labels offset for VEX intructions.}
+ \item{Eliminate bogus warning on implicit operand size override.}
+ \item{\code{\%if} term could not handle 64 bit numbers.}
+ \item{The COFF backend was limiting relocations number to 16 bits even if
+ in real there were a way more relocations.}
+\end{itemize}
+
+\xsubsection{cl-2.09.03}{Version 2.09.03}
+
+\begin{itemize}
+ \item{Print \code{\%macro} name inside \code{\%rep} blocks on error.}
+ \item{Fix preprocessor expansion behaviour. It happened sometime
+ too early and sometime simply wrong. Move behaviour back to
+ the origins (down to NASM 2.05.01).}
+ \item{Fix unitialized data dereference on OMF output format.}
+ \item{Issue warning on unterminated \code{\%\{} construct.}
+ \item{Fix for documentation typo.}
+\end{itemize}
+
+\xsubsection{cl-2.09.02}{Version 2.09.02}
+
+\begin{itemize}
+ \item{Fix reversed tokens when \code{\%deftok} produces more than one output token.}
+ \item{Fix segmentation fault on disassembling some VEX instructions.}
+ \item{Missing \code{\%endif} did not always cause error.}
+ \item{Fix typo in documentation.}
+ \item{Compound context local preprocessor single line macro identifiers
+ were not expanded early enough and as result lead to unresolved symbols.}
+\end{itemize}
+
+\xsubsection{cl-2.09.01}{Version 2.09.01}
+
+\begin{itemize}
+ \item{Fix NULL dereference on missed \code{\%deftok} second parameter.}
+ \item{Fix NULL dereference on invalid \code{\%substr} parameters.}
+\end{itemize}
+
+\xsubsection{cl-2.09}{Version 2.09}
+
+\begin{itemize}
+ \item{Fixed assignment the magnitude of \code{\%rep} counter.
+ It is limited to 62 bits now.}
+ \item{Fixed NULL dereference if argument of \code{\%strlen} resolves
+ to whitespace. For example if nonexistent macro parameter is used.}
+ \item{\code{\%ifenv}, \code{\%elifenv}, \code{\%ifnenv}, and
+ \code{\%elifnenv} directives introduced. See \nref{ifenv}.}
+ \item{Fixed NULL dereference if environment variable is missed.}
+ \item{Updates of new AVX v7 Intel instructions.}
+ \item{\code{PUSH imm32} is now officially documented.}
+ \item{Fix for encoding the LFS, LGS and LSS in 64-bit mode.}
+ \item{Fixes for compatibility with OpenWatcom compiler and DOS 8.3 file format limitation.}
+ \item{Macros parameters range expansion introduced. See \nref{mlmacrange}.}
+ \item{Backward compatibility on expanging of local sigle macros restored.}
+ \item{8 bit relocations for \code{elf} and \code{bin} output formats are introduced.}
+ \item{Short intersegment jumps are permitted now.}
+ \item{An alignment more than 64 bytes are allowed for \code{win32},
+ \code{win64} output formats.}
+ \item{\code{SECTALIGN} directive introduced. See \nref{sectalign}.}
+ \item{\code{nojmp} option introduced in \code{smartalign} package. See
+ \nref{pkgsmartalign}.}
+ \item{Short aliases \code{win}, \code{elf} and \code{macho} for output formats are
+ introduced. Each stands for \code{win32}, \code{elf32} and \code{macho32}
+ accordingly.}
+ \item{Faster handling of missing directives implemented.}
+ \item{Various small improvements in documentation.}
+ \item{No hang anymore if unable to open malloc.log file.}
+ \item{The environments without vsnprintf function are able to build nasm again.}
+ \item{AMD LWP instructions updated.}
+ \item{Tighten EA checks. We warn a user if there overflow in EA addressing.}
+ \item{Make \code{-Ox} the default optimization level. For the legacy
+ behavior, specify \code{-O0} explicitly. See \nref{opt-O}.}
+ \item{Environment variables read with \code{\%!} or tested with \code{\%ifenv}
+ can now contain non-identifier characters if surrounded by quotes.
+ See \nref{getenv}.}
+ \item{Add a new standard macro package \code{\%use fp} for floating-point
+ convenience macros. See \nref{pkgfp}.}
+\end{itemize}
+
+\xsubsection{cl-2.08.02}{Version 2.08.02}
+
+\begin{itemize}
+ \item{Fix crash under certain circumstances when using
+ the \code{\%+} operator.}
+\end{itemize}
+
+\xsubsection{cl-2.08.01}{Version 2.08.01}
+
+\begin{itemize}
+ \item{Fix the \code{\%use} statement, which was broken in 2.08.}
+\end{itemize}
+
+\xsubsection{cl-2.08}{Version 2.08}
+
+\begin{itemize}
+ \item{A number of enhancements/fixes in macros area.}
+ \item{Support for converting strings to tokens. See \nref{deftok}.}
+ \item{Fuzzy operand size logic introduced.}
+ \item{Fix COFF stack overrun on too long export identifiers.}
+ \item{Fix Macho-O alignment bug.}
+ \item{Fix crashes with \code{-fwin32} on file with many exports.}
+ \item{Fix stack overrun for too long [DEBUG id].}
+ \item{Fix incorrect sbyte usage in IMUL (hit only if optimization flag passed).}
+ \item{Append ending token for \code{.stabs} records in the ELF output format.}
+ \item{New NSIS script which uses ModernUI and MultiUser approach.}
+ \item{Visual Studio 2008 NASM integration (rules file).}
+ \item{Warn a user if a constant is too long (and as result will be stripped).}
+ \item{The obsoleted pre-XOP AMD SSE5 instruction set which was never actualized was removed.}
+ \item{Fix stack overrun on too long error file name passed from the command line.}
+ \item{Bind symbols to the .text section by default (ie in case if
+ \code{SECTION} directive was omitted) in the ELF output format.}
+ \item{Fix sync points array index wrapping.}
+ \item{A few fixes for FMA4 and XOP instruction templates.}
+ \item{Add AMD Lightweight Profiling (LWP) instructions.}
+ \item{Fix the offset for \code{\%arg} in 64-bit mode.}
+ \item{An undefined local macro (\code{\%\$}) no longer matches a global macro
+ with the same name.}
+ \item{Fix NULL dereference on too long local labels.}
+\end{itemize}
+
+\xsubsection{cl-2.07}{Version 2.07}
+
+\begin{itemize}
+ \item{NASM is now under the 2-clause BSD license. See \nref{license}.}
+ \item{Fix the section type for the \code{.strtab} section in the \code{elf64}
+ output format.}
+ \item{Fix the handling of \code{COMMON} directives in the \code{obj} output format.}
+ \item{New \code{ith} and \code{srec} output formats; these are variants of the
+ \code{bin} output format which output Intel hex and Motorola S-records,
+ respectively. See \nref{ithfmt} and \nref{srecfmt}.}
+ \item{\code{rdf2ihx} replaced with an enhanced \code{rdf2bin}, which can output
+ binary, COM, Intel hex or Motorola S-records.}
+ \item{The Windows installer now puts the NASM directory first in the
+ \code{PATH} of the ``NASM Shell''.}
+ \item{Revert the early expansion behavior of \code{\%+} to
+ pre-2.06 behavior: \code{\%+} is only expanded late.}
+ \item{Yet another Mach-O alignment fix.}
+ \item{Don't delete the list file on errors. Also, include error and
+ warning information in the list file.}
+ \item{Support for 64-bit Mach-O output, see \nref{machofmt}.}
+ \item{Fix assert failure on certain operations that involve strings with
+ high-bit bytes.}
+\end{itemize}
+
+\xsubsection{cl-2.06}{Version 2.06}
+
+\begin{itemize}
+ \item{This release is dedicated to the memory of Charles A. Crayne, long
+ time NASM developer as well as moderator of \code{comp.lang.asm.x86} and
+ author of the book \emph{Serious Assembler}. We miss you, Chuck.}
+ \item{Support for indirect macro expansion (\code{\%[...]}). See \nref{indmacro}.}
+ \item{\code{\%pop} can now take an argument, see \nref{pushpop}.}
+ \item{The argument to \code{\%use} is no longer macro-expanded. Use
+ \code{\%[...]} if macro expansion is desired.}
+ \item{Support for thread-local storage in ELF32 and ELF64. See \nref{elftls}.}
+ \item{Fix crash on \code{\%ifmacro} without an argument.}
+ \item{Correct the arguments to the \code{POPCNT} instruction.}
+ \item{Fix section alignment in the Mach-O format.}
+ \item{Update AVX support to version 5 of the Intel specification.}
+ \item{Fix the handling of accesses to context-local macros from higher
+ levels in the context stack.}
+ \item{Treat \code{WAIT} as a prefix rather than as an instruction, thereby
+ allowing constructs like \code{O16 FSAVE} to work correctly.}
+ \item{Support for structures with a non-zero base offset. See \nref{struc}.}
+ \item{Correctly handle preprocessor token concatenation (see \nref{concat})
+ involving floating-point numbers.}
+ \item{The \code{PINSR} series of instructions have been corrected and rationalized.}
+ \item{Removed AMD SSE5, replaced with the new XOP/FMA4/CVT16 (rev 3.03) spec.}
+ \item{The ELF backends no longer automatically generate a \code{.comment} section.}
+ \item{Add additional "well-known" ELF sections with default attributes. See \nref{elfsect}.}
+\end{itemize}
+
+\xsubsection{cl-2.05.01}{Version 2.05.01}
+
+\begin{itemize}
+ \item{Fix the \code{-w}/\code{-W} option parsing, which was broken in NASM 2.05.}
+\end{itemize}
+
+\xsubsection{cl-2.05}{Version 2.05}
+
+\begin{itemize}
+ \item{Fix redundant REX.W prefix on \code{JMP reg64}.}
+ \item{Make the behaviour of \code{-O0} match NASM 0.98 legacy behavior.
+ See \nref{opt-O}.}
+ \item{\code{-w-user} can be used to suppress the output of \code{\%warning} directives.
+ See \nref{opt-w}.}
+ \item{Fix bug where \code{ALIGN} would issue a full alignment datum instead of
+ zero bytes.}
+ \item{Fix offsets in list files.}
+ \item{Fix \code{\%include} inside multi-line macros or loops.}
+ \item{Fix error where NASM would generate a spurious warning on valid
+ optimizations of immediate values.}
+ \item{Fix arguments to a number of the \code{CVT} SSE instructions.}
+ \item{Fix RIP-relative offsets when the instruction carries an immediate.}
+ \item{Massive overhaul of the ELF64 backend for spec compliance.}
+ \item{Fix the Geode \code{PFRCPV} and \code{PFRSQRTV} instruction.}
+ \item{Fix the SSE 4.2 \code{CRC32} instruction.}
+\end{itemize}
+
+
+\xsubsection{cl-2.04}{Version 2.04}
+
+\begin{itemize}
+ \item{Sanitize macro handing in the \code{\%error} directive.}
+ \item{New \code{\%warning} directive to issue user-controlled warnings.}
+ \item{\code{\%error} directives are now deferred to the final assembly phase.}
+ \item{New \code{\%fatal} directive to immediately terminate assembly.}
+ \item{New \code{\%strcat} directive to join quoted strings together.}
+ \item{New \code{\%use} macro directive to support standard macro directives. See \nref{use}.}
+ \item{Excess default parameters to \code{\%macro} now issues a warning by default.
+ See \nref{mlmacro}.}
+ \item{Fix \code{\%ifn} and \code{\%elifn}.}
+ \item{Fix nested \code{\%else} clauses.}
+ \item{Correct the handling of nested \code{\%rep}s.}
+ \item{New \code{\%unmacro} directive to undeclare a multi-line macro.
+ See \nref{unmacro}.}
+ \item{Builtin macro \code{\_\_PASS\_\_} which expands to the current assembly pass.
+ See \nref{passdef}.}
+ \item{\code{\_\_utf16\_\_} and \code{\_\_utf32\_\_} operators to generate
+ UTF-16 and UTF-32 strings. See \nref{unicode}.}
+ \item{Fix bug in case-insensitive matching when compiled on platforms that
+ don't use the \code{configure} script. Of the official release binaries,
+ that only affected the OS/2 binary.}
+ \item{Support for x87 packed BCD constants. See \nref{bcdconst}.}
+ \item{Correct the \code{LTR} and \code{SLDT} instructions in 64-bit mode.}
+ \item{Fix unnecessary REX.W prefix on indirect jumps in 64-bit mode.}
+ \item{Add AVX versions of the AES instructions (\code{VAES}...).}
+ \item{Fix the 256-bit FMA instructions.}
+ \item{Add 256-bit AVX stores per the latest AVX spec.}
+ \item{VIA XCRYPT instructions can now be written either with or without
+ \code{REP}, apparently different versions of the VIA spec wrote them
+ differently.}
+ \item{Add missing 64-bit \code{MOVNTI} instruction.}
+ \item{Fix the operand size of \code{VMREAD} and \code{VMWRITE}.}
+ \item{Numerous bug fixes, especially to the AES, AVX and VTX instructions.}
+ \item{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.}
+ \item{\code{\%push} no longer needs a context identifier; omitting the context
+ identifier results in an anonymous context.}
+\end{itemize}
+
+\xsubsection{cl-2.03.01}{Version 2.03.01}
+
+\begin{itemize}
+ \item{Fix buffer overflow in the listing module.}
+ \item{Fix the handling of hexadecimal escape codes in `...` strings.}
+ \item{The Postscript/PDF documentation has been reformatted.}
+ \item{The \code{-F} option now implies \code{-g}.}
+\end{itemize}
+
+\xsubsection{cl-2.03}{Version 2.03}
+
+\begin{itemize}
+ \item{Add support for Intel AVX, CLMUL and FMA instructions,
+ including YMM registers.}
+ \item{\code{dy}, \code{resy} and \code{yword} for 32-byte operands.}
+ \item{Fix some SSE5 instructions.}
+ \item{Intel \code{INVEPT}, \code{INVVPID} and \code{MOVBE} instructions.}
+ \item{Fix checking for critical expressions when the optimizer is enabled.}
+ \item{Support the DWARF debugging format for ELF targets.}
+ \item{Fix optimizations of signed bytes.}
+ \item{Fix operation on bigendian machines.}
+ \item{Fix buffer overflow in the preprocessor.}
+ \item{\code{SAFESEH} support for Win32, \code{IMAGEREL} for Win64 (SEH).}
+ \item{\code{\%?} and \code{\%??} to refer to the name of a macro itself.
+ In particular, \code{\%idefine keyword \$\%?} can be used to make
+ a keyword "disappear".}
+ \item{New options for dependency generation: \code{-MD}, \code{-MF},
+ \code{-MP}, \code{-MT}, \code{-MQ}.}
+ \item{New preprocessor directives \code{\%pathsearch} and \code{\%depend};
+ \code{INCBIN} reimplemented as a macro.}
+ \item{\code{\%include} now resolves macros in a sane manner.}
+ \item{\code{\%substr} can now be used to get other than one-character substrings.}
+ \item{New type of character/string constants, using backquotes (\code{`...`}),
+ which support C-style escape sequences.}
+ \item{\code{\%defstr} and \code{\%idefstr} to stringize macro definitions
+ before creation.}
+ \item{Fix forward references used in \code{EQU} statements.}
+\end{itemize}
+
+\xsubsection{cl-2.02}{Version 2.02}
+
+\begin{itemize}
+ \item{Additional fixes for MMX operands with explicit \code{qword}, as well as
+ (hopefully) SSE operands with \code{oword}.}
+ \item{Fix handling of truncated strings with \code{DO}.}
+ \item{Fix segfaults due to memory overwrites when floating-point constants were used.}
+ \item{Fix segfaults due to missing include files.}
+ \item{Fix OpenWatcom Makefiles for DOS and OS/2.}
+ \item{Add autogenerated instruction list back into the documentation.}
+ \item{ELF: Fix segfault when generating stabs, and no symbols have been defined.}
+ \item{ELF: Experimental support for DWARF debugging information.}
+ \item{New compile date and time standard macros.}
+ \item{\code{\%ifnum} now returns true for negative numbers.}
+ \item{New \code{\%iftoken} test for a single token.}
+ \item{New \code{\%ifempty} test for empty expansion.}
+ \item{Add support for the \code{XSAVE} instruction group.}
+ \item{Makefile for Netware/gcc.}
+ \item{Fix issue with some warnings getting emitted way too many times.}
+ \item{Autogenerated instruction list added to the documentation.}
+\end{itemize}
+
+\xsubsection{cl-2.01}{Version 2.01}
+
+\begin{itemize}
+ \item{Fix the handling of MMX registers with explicit \code{qword} tags on
+ memory (broken in 2.00 due to 64-bit changes.)}
+ \item{Fix the PREFETCH instructions.}
+ \item{Fix the documentation.}
+ \item{Fix debugging info when using \code{-f elf}
+ (backwards compatibility alias for \code{-f elf32}).}
+ \item{Man pages for rdoff tools (from the Debian project.)}
+ \item{ELF: handle large numbers of sections.}
+ \item{Fix corrupt output when the optimizer runs out of passes.}
+\end{itemize}
+
+\xsubsection{cl-2.00}{Version 2.00}
+
+\begin{itemize}
+ \item{Added c99 data-type compliance.}
+ \item{Added general x86-64 support.}
+ \item{Added win64 (x86-64 COFF) output format.}
+ \item{Added \code{\_\_BITS\_\_} standard macro.}
+ \item{Renamed the \code{elf} output format to \code{elf32} for clarity.}
+ \item{Added \code{elf64} and \code{macho} (MacOS X) output formats.}
+ \item{Added Numeric constants in \code{dq} directive.}
+ \item{Added \code{oword}, \code{do} and \code{reso} pseudo operands.}
+ \item{Allow underscores in numbers.}
+ \item{Added 8-, 16- and 128-bit floating-point formats.}
+ \item{Added binary, octal and hexadecimal floating-point.}
+ \item{Correct the generation of floating-point constants.}
+ \item{Added floating-point option control.}
+ \item{Added Infinity and NaN floating point support.}
+ \item{Added ELF Symbol Visibility support.}
+ \item{Added setting OSABI value in ELF header directive.}
+ \item{Added Generate Makefile Dependencies option.}
+ \item{Added Unlimited Optimization Passes option.}
+ \item{Added \code{\%ifn} and \code{\%elifn} support.}
+ \item{Added Logical Negation Operator.}
+ \item{Enhanced Stack Relative Preprocessor Directives.}
+ \item{Enhanced ELF Debug Formats.}
+ \item{Enhanced Send Errors to a File option.}
+ \item{Added SSSE3, SSE4.1, SSE4.2, SSE5 support.}
+ \item{Added a large number of additional instructions.}
+ \item{Significant performance improvements.}
+ \item{\code{-w+warning} and \code{-w-warning} can now be written
+ as -Wwarning and -Wno-warning, respectively. See \nref{opt-w}.}
+ \item{Add \code{-w+error} to treat warnings as errors. See \nref{opt-w}.}
+ \item{Add \code{-w+all} and \code{-w-all} to enable or disable all suppressible
+ warnings. See \nref{opt-w}.}
+\end{itemize}
+
+\xsection{cl-0.98.xx}{NASM 0.98 Series}
+
+The 0.98 series was the production versions of NASM from 1999 to 2007.
+
+\xsubsection{cl-0.98.39}{Version 0.98.39}
+
+\begin{itemize}
+ \item{fix buffer overflow}
+ \item{fix outas86's \code{.bss} handling}
+ \item{"make spotless" no longer deletes config.h.in.}
+ \item{\code{\%(el)if(n)idn} insensitivity to string quotes difference (\#809300).}
+ \item{(nasm.c)\code{\_\_OUTPUT\_FORMAT\_\_} changed to string value instead of symbol.}
+\end{itemize}
+
+\xsubsection{cl-0.98.38}{Version 0.98.38}
+
+\begin{itemize}
+ \item{Add Makefile for 16-bit DOS binaries under OpenWatcom, and modify
+ \code{mkdep.pl} to be able to generate completely pathless dependencies, as
+ required by OpenWatcom wmake (it supports path searches, but not
+ explicit paths.)}
+ \item{Fix the \code{STR} instruction.}
+ \item{Fix the ELF output format, which was broken under certain
+ circumstances due to the addition of stabs support.}
+ \item{Quick-fix Borland format debug-info for \code{-f obj}}
+ \item{Fix for \code{\%rep} with no arguments (\#560568)}
+ \item{Fix concatenation of preprocessor function call (\#794686)}
+ \item{Fix long label causes coredump (\#677841)}
+ \item{Use autoheader as well as autoconf to keep configure from generating
+ ridiculously long command lines.}
+ \item{Make sure that all of the formats which support debugging output
+ actually will suppress debugging output when \code{-g} not specified.}
+\end{itemize}
+
+\xsubsection{cl-0.98.37}{Version 0.98.37}
+
+\begin{itemize}
+ \item{Paths given in \code{-I} switch searched for \code{incbin}-ed as
+ well as \code{\%include}-ed files.}
+ \item{Added stabs debugging for the ELF output format, patch from
+ Martin Wawro.}
+ \item{Fix \code{output/outbin.c} to allow origin > 80000000h.}
+ \item{Make \code{-U} switch work.}
+ \item{Fix the use of relative offsets with explicit prefixes, e.g.
+ \code{a32 loop foo}.}
+ \item{Remove \code{backslash()}.}
+ \item{Fix the \code{SMSW} and \code{SLDT} instructions.}
+ \item{\code{-O2} and \code{-O3} are no longer aliases for \code{-O10} and \code{-O15}.
+ If you mean the latter, please say so! :)}
+\end{itemize}
+
+\xsubsection{cl-0.98.36}{Version 0.98.36}
+
+\begin{itemize}
+ \item{Update rdoff - librarian/archiver - common rec - docs!}
+ \item{Fix signed/unsigned problems.}
+ \item{Fix \code{JMP FAR label} and \code{CALL FAR label}.}
+ \item{Add new multisection support - map files - fix align bug}
+ \item{Fix sysexit, movhps/movlps reg,reg bugs in insns.dat}
+ \item{\code{Q} or \code{O} suffixes indicate octal}
+ \item{Support Prescott new instructions (PNI).}
+ \item{Cyrix \code{XSTORE} instruction.}
+\end{itemize}
+
+
+\xsubsection{cl-0.98.35}{Version 0.98.35}
+
+\begin{itemize}
+ \item{Fix build failure on 16-bit DOS (Makefile.bc3 workaround for compiler bug.)}
+ \item{Fix dependencies and compiler warnings.}
+ \item{Add "const" in a number of places.}
+ \item{Add -X option to specify error reporting format (use -Xvc to
+ integrate with Microsoft Visual Studio.)}
+ \item{Minor changes for code legibility.}
+ \item{Drop use of tmpnam() in rdoff (security fix.)}
+\end{itemize}
+
+\xsubsection{cl-0.98.34}{Version 0.98.34}
+
+\begin{itemize}
+ \item{Correct additional address-size vs. operand-size confusions.}
+ \item{Generate dependencies for all Makefiles automatically.}
+ \item{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.}
+ \item{Correct some disassembler bugs related to redundant address-size prefixes.
+ Some work still remains in this area.}
+ \item{Correctly generate an error for things like "SEG eax".}
+ \item{Add the JMPE instruction, enabled by "CPU IA64".}
+ \item{Correct compilation on newer gcc/glibc platforms.}
+ \item{Issue an error on things like "jmp far eax".}
+\end{itemize}
+
+\xsubsection{cl-0.98.33}{Version 0.98.33}
+
+\begin{itemize}
+ \item{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).}
+ \item{New keyword "strict" to disable the optimization of specific operands.}
+ \item{Fix the handing of size overrides with JMP instructions
+ (instructions such as "jmp dword foo".)}
+ \item{Fix the handling of "ABSOLUTE label", where "label" points into a
+ relocatable segment.}
+ \item{Fix OBJ output format with lots of externs.}
+ \item{More documentation updates.}
+ \item{Add -Ov option to get verbose information about optimizations.}
+ \item{Undo a braindead change which broke \code{\%elif} directives.}
+ \item{Makefile updates.}
+\end{itemize}
+
+\xsubsection{cl-0.98.32}{Version 0.98.32}
+
+\begin{itemize}
+ \item{Fix NASM crashing when \code{\%macro} directives were left unterminated.}
+ \item{Lots of documentation updates.}
+ \item{Complete rewrite of the PostScript/PDF documentation generator.}
+ \item{The MS Visual C++ Makefile was updated and corrected.}
+ \item{Recognize .rodata as a standard section name in ELF.}
+ \item{Fix some obsolete Perl4-isms in Perl scripts.}
+ \item{Fix configure.in to work with autoconf 2.5x.}
+ \item{Fix a couple of "make cleaner" misses.}
+ \item{Make the normal "./configure \&\& make" work with Cygwin.}
+\end{itemize}
+
+\xsubsection{cl-0.98.31}{Version 0.98.31}
+
+\begin{itemize}
+ \item{Correctly build in a separate object directory again.}
+ \item{Derive all references to the version number from the version file.}
+ \item{New standard macros \code{\_\_NASM\_SUBMINOR\_\_} and
+ \code{\_\_NASM\_VER\_\_} macros.}
+ \item{Lots of Makefile updates and bug fixes.}
+ \item{New \code{\%ifmacro} directive to test for multiline macros.}
+ \item{Documentation updates.}
+ \item{Fixes for 16-bit OBJ format output.}
+ \item{Changed the NASM environment variable to NASMENV.}
+\end{itemize}
+
+\xsubsection{cl-0.98.30}{Version 0.98.30}
+
+\begin{itemize}
+ \item{Changed doc files a lot: completely removed old READMExx and
+ Wishlist files, incorporating all information in CHANGES and TODO.}
+ \item{I waited a long time to rename zoutieee.c to (original) outieee.c}
+ \item{moved all output modules to output/ subdirectory.}
+ \item{Added 'make strip' target to strip debug info from nasm \& ndisasm.}
+ \item{Added INSTALL file with installation instructions.}
+ \item{Added -v option description to nasm man.}
+ \item{Added dist makefile target to produce source distributions.}
+ \item{16-bit support for ELF output format (GNU extension, but useful.)}
+\end{itemize}
+
+
+\xsubsection{cl-0.98.28}{Version 0.98.28}
+
+\begin{itemize}
+ \item{Fastcooked this for Debian's Woody release:
+ Frank applied the \code{INCBIN} bug patch to 0.98.25alt
+ and called it 0.98.28 to not confuse poor little apt-get.}
+\end{itemize}
+
+\xsubsection{cl-0.98.26}{Version 0.98.26}
+
+\begin{itemize}
+ \item{Reorganised files even better from 0.98.25alt}
+\end{itemize}
+
+
+\xsubsection{cl-0.98.25alt}{Version 0.98.25alt}
+
+\begin{itemize}
+ \item{Prettified the source tree. Moved files to more reasonable places.}
+ \item{Added findleak.pl script to misc/ directory.}
+ \item{Attempted to fix doc.}
+\end{itemize}
+
+\xsubsection{cl-0.98.25}{Version 0.98.25}
+
+\begin{itemize}
+ \item{Line continuation character \code{\\}.}
+ \item{Docs inadvertantly reverted - "dos packaging".}
+\end{itemize}
+
+
+\xsubsection{cl-0.98.24p1}{Version 0.98.24p1}
+
+\begin{itemize}
+ \item{FIXME: Someone, document this please.}
+\end{itemize}
+
+\xsubsection{cl-0.98.24}{Version 0.98.24}
+
+\begin{itemize}
+ \item{Documentation - Ndisasm doc added to Nasm.doc.}
+\end{itemize}
+
+\xsubsection{cl-0.98.23}{Version 0.98.23}
+
+\begin{itemize}
+ \item{Attempted to remove rdoff version1}
+ \item{Lino Mastrodomenico's patches to preproc.c (\%\$\$ bug?).}
+\end{itemize}
+
+
+\xsubsection{cl-0.98.22}{Version 0.98.22}
+
+\begin{itemize}
+ \item{Update rdoff2 - attempt to remove v1.}
+\end{itemize}
+
+\xsubsection{cl-0.98.21}{Version 0.98.21}
+
+\begin{itemize}
+ \item{Optimization fixes.}
+\end{itemize}
+
+\xsubsection{cl-0.98.20}{Version 0.98.20}
+
+\begin{itemize}
+ \item{Optimization fixes.}
+\end{itemize}
+
+\xsubsection{cl-0.98.19}{Version 0.98.19}
+
+\begin{itemize}
+ \item{H. J. Lu's patch back out.}
+\end{itemize}
+
+\xsubsection{cl-0.98.18}{Version 0.98.18}
+
+\begin{itemize}
+ \item{Added ".rdata" to "-f win32".}
+\end{itemize}
+
+\xsubsection{cl-0.98.17}{Version 0.98.17}
+
+\begin{itemize}
+ \item{H. J. Lu's "bogus elf" patch. (Red Hat problem?)}
+\end{itemize}
+
+
+\xsubsection{cl-0.98.16}{Version 0.98.16}
+
+\begin{itemize}
+ \item{Fix whitespace before \code{[section \dots]} bug.}
+\end{itemize}
+
+\xsubsection{cl-0.98.15}{Version 0.98.15}
+
+\begin{itemize}
+ \item{Rdoff changes (?).}
+ \item{Fix fixes to memory leaks.}
+\end{itemize}
+
+\xsubsection{cl-0.98.14}{Version 0.98.14}
+
+\begin{itemize}
+ \item{Fix memory leaks.}
+\end{itemize}
+
+\xsubsection{cl-0.98.13}{Version 0.98.13}
+
+\begin{itemize}
+ \item{There was no 0.98.13}
+\end{itemize}
+
+
+\xsubsection{cl-0.98.12}{Version 0.98.12}
+
+\begin{itemize}
+ \item{Update optimization (new function of \code{-O1}).}
+ \item{Changes to test/bintest.asm (?).}
+\end{itemize}
+
+\xsubsection{cl-0.98.11}{Version 0.98.11}
+
+\begin{itemize}
+ \item{Optimization changes.}
+ \item{Ndisasm fixed.}
+\end{itemize}
+
+\xsubsection{cl-0.98.10}{Version 0.98.10}
+
+\begin{itemize}
+ \item{There was no 0.98.10}
+\end{itemize}
+
+\xsubsection{cl-0.98.09}{Version 0.98.09}
+
+\begin{itemize}
+ \item{Add multiple sections support to \code{-f bin}.}
+ \item{Changed \code{GLOBAL\_TEMP\_BASE} in outelf.c from 6 to 15.}
+ \item{Add \code{-v} as an alias to the \code{-r} switch.}
+ \item{Remove \code{\#ifdef} from Tasm compatibility options.}
+ \item{Remove redundant size-overrides on \code{mov ds, ex}, etc.}
+ \item{Fixes to SSE2, other insns.dat (?).}
+ \item{Enable uppercase "I" and "P" switches.}
+ \item{Case insinsitive \code{seg} and \code{wrt}.}
+ \item{Update install.sh (?).}
+ \item{Allocate tokens in blocks.}
+ \item{Improve "invalid effective address" messages.}
+\end{itemize}
+
+\xsubsection{cl-0.98.08}{Version 0.98.08}
+
+\begin{itemize}
+ \item{Add \code{\%strlen} and \code{\%substr} macro operators.}
+ \item{Fixed broken c16.mac.}
+ \item{Unterminated string error reported.}
+ \item{Fixed bugs as per 0.98bf}
+\end{itemize}
+
+\xsubsection{cl-0.98.09b}{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
+
+\begin{itemize}
+ \item{More closely compatible with 0.98 when \code{-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.}
+ \item{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).}
+ \item{Changed definition of the optimization flag
+ \begin{itemize}
+ \item{\code{-O0}: strict two-pass assembly, JMP and Jcc are
+ handled more like 0.98, except that back ward JMPs are
+ short, if possible.}
+ \item{\code{-O1}: strict two-pass assembly, but forward
+ branches are assembled with code guaranteed
+ to reach; may produce larger code than
+ \code{-O0}, but will produce successful assembly
+ more often if branch offset sizes are not
+ specified.}
+ \item{\code{-O2}: multi-pass optimization, minimize branch
+ offsets; also will minimize signed immediate bytes,
+ overriding size specification.}
+ \item{\code{-O3}: like \code{-O2}, but more passes taken,
+ if needed}
+ \end{itemize}}
+\end{itemize}
+
+\xsubsection{cl-0.98.07}{Version 0.98.07 released 01/28/01}
+
+\begin{itemize}
+ \item{Added Stepane Denis' SSE2 instructions to a \emph{working}
+ version of the code - some earlier versions were based on
+ broken code - sorry 'bout that. version "0.98.07"}
+ \item{Cosmetic modifications to nasm.c, nasm.h, AUTHORS, MODIFIED}
+\end{itemize}
+
+\xsubsection{cl-0.98.06f}{Version 0.98.06f released 01/18/01}
+
+\begin{itemize}
+ \item{Add "metalbrain"s jecxz bug fix in insns.dat}
+ \item{Alter nasmdoc.src to match - version "0.98.06f"}
+\end{itemize}
+
+\xsubsection{cl-0.98.06e}{Version 0.98.06e released 01/09/01}
+
+\begin{itemize}
+ \item{Removed the "outforms.h" file - it appears to be
+ someone's old backup of "outform.h". version "0.98.06e"}
+ \item{fbk - finally added the fix for the "multiple \code{\%include} 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...}
+ \item{Nelson Rush resigns from the group. Big thanks to Nelson for
+ his leadership and enthusiasm in getting these changes
+ incorporated into Nasm!}
+ \item{fbk - \code{[list +]}, \code{[list -]} directives - ineptly implemented,
+ should be re-written or removed, perhaps.}
+ \item{Brian Raiter / fbk - "elfso bug" fix - applied to aoutb format
+ as well - testing might be desirable...}
+ \item{James Seter - -postfix, -prefix command line switches.}
+ \item{Yuri Zaporozhets - rdoff utility changes.}
+\end{itemize}
+
+\xsubsection{cl-0.98p1}{Version 0.98p1}
+
+\begin{itemize}
+ \item{GAS-like palign (Panos Minos)}
+ \item{FIXME: Someone, fill this in with details}
+\end{itemize}
+
+\xsubsection{cl-0.98bf}{Version 0.98bf (bug-fixed)}
+
+\begin{itemize}
+ \item{Fixed - elf and aoutb bug - shared libraries}
+ \item{multiple \code{\%include} bug in "-f obj"}
+ \item{jcxz, jecxz bug}
+ \item{unrecognized option bug in ndisasm}
+\end{itemize}
+
+\xsubsection{cl-0.98.03}{Version 0.98.03 with John Coffman's changes released 27-Jul-2000}
+
+\begin{itemize}
+ \item{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.}
+ \item{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.}
+ \item{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'.}
+ \item{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)}
+ \item{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)}
+\end{itemize}
+
+\xsubsection{cl-0.98.03}{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
+
+\begin{itemize}
+ \item{Kendall Bennett's SciTech MGL changes}
+ \item{Note that you must define "TASM\_COMPAT" at compile-time
+ to get the Tasm Ideal Mode compatibility.}
+ \item{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.}
+ \item{standard.mac, macros.c: Added macros to ignore TASM directives before
+ first include}
+ \item{nasm.h: Added extern declaration for tasm\_compatible\_mode}
+ \item{nasm.c: Added global variable tasm\_compatible\_mode}
+ \item{Added command line switch for TASM compatible mode (-t)}
+ \item{Changed version command line to reflect when compiled with TASM additions}
+ \item{Added response file processing to allow all arguments on a single
+ line (response file is @resp rather than -@resp for NASM format).}
+ \item{labels.c: Changes islocal() macro to support TASM style @@local labels.}
+ \item{Added islocalchar() macro to support TASM style @@local labels.}
+ \item{parser.c: Added support for TASM style memory references (ie: mov
+ [DWORD eax],10 rather than the NASM style mov DWORD [eax],10).}
+ \item{preproc.c: Added new directives, \code{\%arg}, \code{\%local},
+ \code{\%stacksize} to directives table}
+ \item{Added support for TASM style directives without a leading \% symbol.}
+ \item{Integrated a block of changes from Andrew Zabolotny <bit@eltech.ru>:}
+ \item{A new keyword \code{\%xdefine} and its case-insensitive counterpart
+ \code{\%ixdefine}. They work almost the same way as \code{\%define} and
+ \code{\%idefine} but expand the definition immediately, not on the invocation.
+ Something like a cross between \code{\%define} and \code{\%assign}. The "x"
+ suffix stands for "eXpand", so "xdefine" can be deciphered as "expand-and-define".
+ Thus you can do things like this:
+\begin{lstlisting}
+%assign ofs 0
+
+%macro arg 1
+ %xdefine %1 dword [esp+ofs]
+ %assign ofs ofs+4
+%endmacro
+\end{lstlisting}}
+ \item{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:
+\begin{lstlisting}
+%macro abc 1
+ %define %1 hello
+%endm
+ abc %$here
+%$here
+\end{lstlisting}
+ 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.}
+
+ \item{Added a check for "cstk" in smacro\_defined() before calling get\_ctx() -
+ this allows for things like:
+\begin{lstlisting}
+%ifdef %$abc
+%endif
+\end{lstlisting}
+ work without warnings even in no context.}
+ \item{Added a check for "cstk" in \%if*ctx and \%elif*ctx directives -
+ this allows to use \code{\%ifctx} without excessive warnings. If there is
+ no active context, \code{\%ifctx} goes through "false" branch.}
+ \item{Removed "user error: " prefix with \code{\%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.}
+ \item{Added expansion of string that is output by \code{\%error} directive. Now you
+ can do things like:
+\begin{lstlisting}
+%define hello(x) Hello, x!
+
+%define %$name andy
+%error "hello(%$name)"
+\end{lstlisting}
+ Same happened with \code{\%include} directive.}
+ \item{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
+\begin{lstlisting}
+%define %$abc hello
+%define __%$abc goodbye
+__%$abc
+\end{lstlisting}
+ would produce "incorrect" output: last line will expand to
+\begin{lstlisting}
+hello goodbyehello
+\end{lstlisting}
+ Not quite what you expected, eh? :-) The answer is that preprocessor
+ treats the \code{\%define} construct as if it would be
+\begin{lstlisting}
+%define __ %$abc goodbye
+\end{lstlisting}
+ (note the white space between \_\_ and \%\$abc). After my "fix" it
+ will "correctly" expand into
+\begin{lstlisting}
+goodbye
+\end{lstlisting}
+ 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: \code{\%push},\code{\%macro},\code{\%imacro},
+ \code{\%define},\code{\%idefine},\code{\%xdefine},\code{\%ixdefine},
+ \code{\%assign},\code{\%iassign},\code{\%undef}}
+ \item{A new directive \code{[WARNING {+|-}warning-id]} have been added. It works only
+ if the assembly phase is enabled (i.e. it doesn't work with nasm -e).}
+ \item{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:
+\begin{lstlisting}
+[WARNING macro-selfref]
+%macro push 1-*
+ %rep %0
+ push %1
+ %rotate 1
+ %endrep
+%endmacro
+
+ push eax,ebx,ecx
+\end{lstlisting}
+ will produce a warning, but if we remove the first line we won't see it
+ anymore (which is The Right Thing To Do \texttrademark IMHO since C
+ preprocessor eats such constructs without warnings at all).}
+ \item{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.}
+ \item{Added the \%+ operator in single-line macros for concatenating two
+ identifiers. Usage example:
+\begin{lstlisting}
+%define _myfunc _otherfunc
+%define cextern(x) _ %+ x
+cextern (myfunc)
+\end{lstlisting}
+ After first expansion, third line will become "\_myfunc". After this
+ expansion is performed again so it becomes "\_otherunc".}
+ \item{Now if preprocessor is in a non-emitting state, no warning or error
+ will be emitted. Example:
+\begin{lstlisting}
+%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
+\end{lstlisting}}
+ \item{Context-local variables on expansion as a last resort are looked up
+ in outer contexts. For example, the following piece:
+\begin{lstlisting}
+%push outer
+%define %$a [esp]
+
+ %push inner
+ %$a
+ %pop
+%pop
+\end{lstlisting}
+ 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{\%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:
+\begin{lstlisting}
+%define %$arg1 [esp+4]
+test eax,eax
+if nz
+ mov eax,%$arg1
+endif
+\end{lstlisting}
+ 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.}
+ \item{Fixed memory leak in \code{\%undef}. The origline wasn't freed before exiting on success.}
+ \item{Fixed trap in preprocessor when line expanded to empty set of tokens.
+ This happens, for example, in the following case:
+\begin{lstlisting}
+#define SOMETHING
+SOMETHING
+\end{lstlisting}}
+\end{itemize}
+
+\xsubsection{cl-0.98}{Version 0.98}
+
+All changes since NASM 0.98p3 have been produced by H. Peter Anvin <hpa@zytor.com>.
+
+\begin{itemize}
+ \item{The documentation comment delimiter is \code{\textbackslash \#} not \code{\#}.}
+ \item{Allow EQU definitions to refer to external labels; reported by Pedro Gimeno.}
+ \item{Re-enable support for RDOFF v1; reported by Pedro Gimeno.}
+ \item{Updated License file per OK from Simon and Julian.}
+\end{itemize}
+
+\xsubsection{cl-0.98p9}{Version 0.98p9}
+
+\begin{itemize}
+ \item{Update documentation (although the instruction set reference will
+ have to wait; I don't want to hold up the 0.98 release for it.)}
+ \item{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.}
+ \item{Fix handling of implicit sizes in PSHUFW and PINSRW, reported by
+ Stefan Hoffmeister.}
+ \item{Resurrect the -s option, which was removed when changing the
+ diagnostic output to stdout.}
+\end{itemize}
+
+\xsubsection{cl-0.98p8}{Version 0.98p8}
+
+\begin{itemize}
+ \item{Fix for "DB" when NASM is running on a bigendian machine.}
+ \item{Invoke insns.pl once for each output script, making Makefile.in
+ legal for "make -j".}
+ \item{Improve the Unix configure-based makefiles to make package
+ creation easier.}
+ \item{Included an RPM .spec file for building RPM (RedHat Package Manager)
+ packages on Linux or Unix systems.}
+ \item{Fix Makefile dependency problems.}
+ \item{Change src/rdsrc.pl to include sectioning information in info
+ output; required for install-info to work.}
+ \item{Updated the RDOFF distribution to version 2 from Jules; minor
+ massaging to make it compile in my environment.}
+ \item{Split doc files that can be built by anyone with a Perl interpreter off
+ into a separate archive.}
+ \item{"Dress rehearsal" release!}
+\end{itemize}
+
+\xsubsection{cl-0.98p7}{Version 0.98p7}
+
+\begin{itemize}
+ \item{Fixed opcodes with a third byte-sized immediate argument to not
+ complain if given "byte" on the immediate.}
+ \item{Allow \code{\%undef} to remove single-line macros with arguments. This
+ matches the behaviour of \#undef in the C preprocessor.}
+ \item{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.}
+ \item{Minor cleanups.}
+ \item{Went through the list of Katmai instructions and hopefully fixed the
+ (rather few) mistakes in it.}
+ \item{(Hopefully) fixed a number of disassembler bugs related to ambiguous
+ instructions (disambiguated by -p) and SSE instructions with REP.}
+ \item{Fix for bug reported by Mark Junger: "call dword 0x12345678" should
+ work and may add an OSP (affected CALL, JMP, Jcc).}
+ \item{Fix for environments when "stderr" isn't a compile-time constant.}
+\end{itemize}
+
+\xsubsection{cl-0.98p6}{Version 0.98p6}
+
+\begin{itemize}
+ \item{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.}
+ \item{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.}
+ \item{Recognize "idt" or "centaur" for the -p option to ndisasm.}
+ \item{Changed error messages back to stderr where they belong, but add an
+ -E option to redirect them elsewhere (the DOS shell cannot redirect
+ stderr.)}
+ \item{-M option to generate Makefile dependencies (based on code from Alex Verstak.)}
+ \item{\code{\%undef} preprocessor directive, and -u option, that undefines a
+ single-line macro.}
+ \item{OS/2 Makefile (Mkfiles/Makefile.os2) for Borland under OS/2; from
+ Chuck Crayne.}
+ \item{Various minor bugfixes (reported by):
+ - Dangling \code{\%s} in preproc.c (Martin Junker)}
+ \item{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.}
+ \item{Updated the License file per agreement with Simon and Jules to
+ include a GPL distribution clause.}
+\end{itemize}
+
+\xsubsection{cl-0.98p3.7}{Version 0.98p3.7}
+
+\begin{itemize}
+ \item{(Hopefully) fixed the canned Makefiles to include the outrdf2 and
+ zoutieee modules.}
+ \item{Renamed changes.asm to changed.asm.}
+\end{itemize}
+
+\xsubsection{cl-0.98p3.6}{Version 0.98p3.6}
+
+\begin{itemize}
+ \item{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.}
+\end{itemize}
+
+\xsubsection{cl-0.98p3.5}{Version 0.98p3.5}
+
+\begin{itemize}
+ \item{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.}
+ \item{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.}
+ \item{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.}
+ \item{Added AMD-only SYSCALL and SYSRET instructions.}
+ \item{Make SSE actually work, and add new Katmai MMX instructions.}
+ \item{Added a -p (preferred vendor) option to ndisasm so that it can
+ distinguish e.g. Cyrix opcodes also used in SSE. For example:
+\begin{lstlisting}
+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]
+\end{lstlisting}}
+ \item{Added a bunch of Cyrix-specific instructions.}
+\end{itemize}
+
+\xsubsection{cl-0.98p3.4}{Version 0.98p3.4}
+
+\begin{itemize}
+ \item{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.}
+ \item{DOS DJGPP+"Opus Make" Makefile from John S. Fine.}
+ \item{changes.asm changes from John S. Fine.}
+\end{itemize}
+
+\xsubsection{cl-0.98p3.3}{Version 0.98p3.3}
+
+\begin{itemize}
+ \item{Patch from Conan Brink to allow nesting of \code{\%rep} directives.}
+ \item{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.}
+ \item{Updated changes.asm to include the latest changes.}
+ \item{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.}
+ \item{We would silently generate broken tools if insns.dat wasn't sorted
+ properly. Change insns.pl so that the order doesn't matter.}
+ \item{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".}
+\end{itemize}
+
+\xsubsection{cl-0.98p3.2}{Version 0.98p3.2}
+
+\begin{itemize}
+ \item{Merged in John S. Fine's changes from his 0.98-J4 prerelease; see
+ http://www.csoft.net/cz/johnfine/}
+ \item{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.}
+ \item{Removed BASIC programs from distribution. Get a Perl interpreter
+ instead (see below.)}
+ \item{Calling this "pre-release 3.2" rather than "p3-hpa2" because of
+ John's contributions.}
+ \item{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".}
+\end{itemize}
+
+\xsubsection{cl-0.98p3-hpa}{Version 0.98p3-hpa}
+
+\begin{itemize}
+ \item{Merged nasm098p3.zip with nasm-0.97.tar.gz to create a fully
+ buildable version for Unix systems (Makefile.in updates, etc.)}
+ \item{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.}
+ \item{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.)}
+ \item{MAX\_SYMBOL was defined to be 9, but LOADALL286 and LOADALL386 are 10
+ characters long. Now MAX\_SYMBOL is derived from insns.dat.}
+ \item{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 \href{http://www.cpan.org/ports/index.html}
+ {http://www.cpan.org/ports/index.html}.}
+\end{itemize}
+
+\xsubsection{cl-0.98p3}{Version 0.98 pre-release 3}
+
+\begin{itemize}
+ \item{added response file support, improved command line handling,
+ new layout help screen}
+ \item{fixed limit checking bug, 'OUT byte nn, reg' bug, and
+ a couple of rdoff related bugs, updated Wishlist; 0.98 Prerelease 3.}
+\end{itemize}
+
+\xsubsection{cl-0.98p2}{Version 0.98 pre-release 2}
+
+\begin{itemize}
+ \item{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}
+\end{itemize}
+
+\xsubsection{cl-0.98p1}{Version 0.98 pre-release 1}
+
+\begin{itemize}
+ \item{Fixed a bug whereby STRUC didn't work at all in RDF.}
+ \item{Fixed a problem with group specification in PUBDEFs in OBJ.}
+ \item{Improved ease of adding new output formats. Contribution due to Fox Cutter.}
+ \item{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.}
+ \item{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.}
+ \item{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.}
+ \item{Fixed a stale-pointer bug in the handling of the NASM environment
+ variable. Thanks to Thomas McWilliams.}
+ \item{ELF had a hard limit on the number of sections which caused
+ segfaults when transgressed. Fixed.}
+ \item{Added ability for ndisasm to read from stdin by using `-' as the
+ filename.}
+ \item{ndisasm wasn't outputting the TO keyword. Fixed.}
+ \item{Fixed error cascade on bogus expression in \code{\%if} - an error in
+ evaluation was causing the entire \code{\%if} to be discarded, thus creating
+ trouble later when the \code{\%else} or \code{\%endif} was encountered.}
+ \item{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.}
+ \item{All messages now appear on stdout, as sending them to stderr serves
+ no useful purpose other than to make redirection difficult.}
+ \item{Fixed the problem with EQUs pointing to an external symbol - this
+ now generates an error message.}
+ \item{Allowed multiple size prefixes to an operand, of which only the first
+ is taken into account.}
+ \item{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.}
+ \item{Reformatted a lot of the source code to be more readable. Included
+ 'coding.txt' as a guideline for how to format code for contributors.}
+ \item{Stopped nested \code{\%reps} causing a panic - they now cause a slightly more
+ friendly error message instead.}
+ \item{Fixed floating point constant problems (patch by Pedro Gimeno)}
+ \item{Fixed the return value of insn\_size() not being checked for -1, indicating
+ an error.}
+ \item{Incorporated 3Dnow! instructions.}
+ \item{Fixed the 'mov eax, eax + ebx' bug.}
+ \item{Fixed the GLOBAL EQU bug in ELF. Released developers release 3.}
+ \item{Incorporated John Fine's command line parsing changes}
+ \item{Incorporated David Lindauer's OMF debug support}
+ \item{Made changes for LCC 4.0 support (\code{\_\_NASM\_CDecl\_\_}, removed register size
+ specification warning when sizes agree).}
+\end{itemize}
+
+\xsection{cl-0.9x}{NASM 0.9 Series}
+
+Revisions before 0.98.
+
+\xsubsection{cl-0.97}{Version 0.97 released December 1997}
+
+\begin{itemize}
+ \item{This was entirely a bug-fix release to 0.96, which seems to have got
+ cursed. Silly me.}
+ \item{Fixed stupid mistake in OBJ which caused `MOV EAX,<constant>' to
+ fail. Caused by an error in the `MOV EAX,<segment>' support.}
+ \item{ndisasm hung at EOF when compiled with lcc on Linux because lcc on
+ Linux somehow breaks feof(). ndisasm now does not rely on feof().}
+ \item{A heading in the documentation was missing due to a markup error in
+ the indexing. Fixed.}
+ \item{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,...'}
+ \item{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.}
+ \item{Added internal.doc back in to the distribution archives - it was
+ missing in 0.96 *blush*}
+ \item{Fixed bug causing 0.96 to be unable to assemble its own test files,
+ specifically objtest.asm. *blush again*}
+ \item{Fixed seg-faults and bogus error messages caused by mismatching
+ \code{\%rep} and \code{\%endrep} within multi-line macro definitions.}
+ \item{Fixed a problem with buffer overrun in OBJ, which was causing
+ corruption at ends of long PUBDEF records.}
+ \item{Separated DOS archives into main-program and documentation to reduce
+ download size.}
+\end{itemize}
+
+\xsubsection{cl-0.96}{Version 0.96 released November 1997}
+
+\begin{itemize}
+ \item{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.}
+ \item{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.}
+ \item{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.}
+ \item{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.}
+ \item{Merged `os2' object file format back into `obj', after discovering
+ that `obj' \emph{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'.}
+ \item{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.}
+ \item{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.}
+ \item{Fixed some buffer overrun problems with large OBJ output files.
+ Thanks to DJ Delorie for the bug report and fix.}
+ \item{Made preprocess-only mode actually listen to the \code{\%line} markers as it
+ prints them, so that it can report errors more sanely.}
+ \item{Re-designed the evaluator to keep more sensible track of expressions
+ involving forward references: can now cope with previously-nightmare
+ situations such as:
+\begin{lstlisting}
+mov ax,foo | bar
+foo equ 1
+bar equ 2
+\end{lstlisting}}
+ \item{Added the ALIGN and ALIGNB standard macros.}
+ \item{Added PIC support in ELF: use of WRT to obtain the four extra
+ relocation types needed.}
+ \item{Added the ability for output file formats to define their own
+ extensions to the GLOBAL, COMMON and EXTERN directives.}
+ \item{Implemented common-variable alignment, and global-symbol type and
+ size declarations, in ELF.}
+ \item{Implemented NEAR and FAR keywords for common variables, plus
+ far-common element size specification, in OBJ.}
+ \item{Added a feature whereby EXTERNs and COMMONs in OBJ can be given a
+ default WRT specification (either a segment or a group).}
+ \item{Transformed the Unix NASM archive into an auto-configuring package.}
+ \item{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.}
+ \item{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.}
+ \item{Added the ability to specify sections' alignment requirements in
+ Win32 object files and pure binary files.}
+ \item{Added preprocess-time expression evaluation: the \code{\%assign} (and
+ \code{\%iassign}) directive and the bare \code{\%if} (and \code{\%elif}) conditional.
+ Added relational operators to the evaluator, for use only in \code{\%if}
+ constructs: the standard relationals = < > <= >= <> (and C-like
+ synonyms == and !=) plus low-precedence logical operators \&\&,
+ \textasciicircum \textasciicircum and ||.}
+ \item{Added a preprocessor repeat construct: \code{\%rep}, \code{\%exitrep},
+ \code{\%endrep}.}
+ \item{Added the \_\_FILE\_\_ and \_\_LINE\_\_ standard macros.}
+ \item{Added a sanity check for number constants being greater than
+ 0xFFFFFFFF. The warning can be disabled.}
+ \item{Added the \%0 token whereby a variadic multi-line macro can tell how
+ many parameters it's been given in a specific invocation.}
+ \item{Added \code{\%rotate}, allowing multi-line macro parameters to be cycled.}
+ \item{Added the `*' option for the maximum parameter count on multi-line
+ macros, allowing them to take arbitrarily many parameters.}
+ \item{Added the ability for the user-level forms of EXTERN, GLOBAL and
+ COMMON to take more than one argument.}
+ \item{Added the IMPORT and EXPORT directives in OBJ format, to deal with
+ Windows DLLs.}
+ \item{Added some more preprocessor \code{\%if} constructs: \code{\%ifidn},
+ \code{\%ifidni} (exact textual identity), and \code{\%ifid},
+ \code{\%ifnum}, \code{\%ifstr} (token type testing).}
+ \item{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).}
+ \item{Added NetBSD/FreeBSD/OpenBSD's variant of a.out format, complete
+ with PIC shared library features.}
+ \item{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.}
+ \item{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.}
+ \item{Added the ability for a variable to be declared as EXTERN multiple
+ times, and the subsequent definitions are just ignored.}
+ \item{We now allow instruction prefixes (CS, DS, LOCK, REPZ etc) to be
+ alone on a line (without a following instruction).}
+ \item{Improved sanity checks on whether the arguments to EXTERN, GLOBAL
+ and COMMON are valid identifiers.}
+ \item{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.}
+ \item{ndisasm forgot to check whether the input file had been successfully
+ opened. Now it does. Doh!}
+ \item{Added the Cyrix extensions to the MMX instruction set.}
+ \item{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.}
+ \item{Added support for the PharLap OMF extension for 4096-byte segment
+ alignment.}
+\end{itemize}
+
+\xsubsection{cl-0.95}{Version 0.95 released July 1997}
+
+\begin{itemize}
+ \item{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.}
+ \item{Added makefiles (for NASM and the RDF tools) to build Win32 console
+ apps under Symantec C++. Donated by Mark Junker.}
+ \item{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.}
+ \item{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.}
+ \item{Added `@' to the list of valid characters to begin an identifier with.}
+ \item{Documentary changes, notably the addition of the `Common Problems'
+ section in nasm.doc.}
+ \item{Fixed a bug relating to 32-bit PC-relative fixups in OBJ.}
+ \item{Fixed a bug in perm\_copy() in labels.c which was causing exceptions
+ in cleanup\_labels() on some systems.}
+ \item{Positivity sanity check in TIMES argument changed from a warning to
+ an error following a further complaint.}
+ \item{Changed the acceptable limits on byte and word operands to allow
+ things like `\textasciitilde 10111001b' to work.}
+ \item{Fixed a major problem in the preprocessor which caused seg-faults if
+ macro definitions contained blank lines or comment-only lines.}
+ \item{Fixed inadequate error checking on the commas separating the
+ arguments to `db', `dw' etc.}
+ \item{Fixed a crippling bug in the handling of macros with operand counts
+ defined with a `+' modifier.}
+ \item{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.}
+ \item{Removed [INC] and [INCLUDE] support for good, since they were
+ obsolete anyway.}
+ \item{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.}
+ \item{Added, tentatively, OS/2 object file support (as a minor variant
+ on OBJ).}
+ \item{Updates to Fox Cutter's Borland C makefile, Makefile.bc2.}
+ \item{Removed a spurious second fclose() on the output file.}
+ \item{Added the `-s' command line option to redirect all messages which
+ would go to stderr (errors, help text) to stdout instead.}
+ \item{Added the `-w' command line option to selectively suppress some
+ classes of assembly warning messages.}
+ \item{Added the `-p' pre-include and `-d' pre-define command-line options.}
+ \item{Added an include file search path: the `-i' command line option.}
+ \item{Fixed a silly little preprocessor bug whereby starting a line with a
+ `\%!' environment-variable reference caused an `unknown directive'
+ error.}
+ \item{Added the long-awaited listing file support: the `-l' command line
+ option.}
+ \item{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.}
+ \item{Added the NASM environment variable.}
+ \item{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.}
+ \item{Added `return 0;' to test/objlink.c to prevent compiler warnings.}
+ \item{Added the \_\_NASM\_MAJOR\_\_ and \_\_NASM\_MINOR\_\_ standard defines.}
+ \item{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.}
+ \item{Errors in pass two now cause the program to return a non-zero error
+ code, which they didn't before.}
+ \item{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.}
+ \item{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.}
+\end{itemize}
+
+\xsubsection{cl-0.94}{Version 0.94 released April 1997}
+
+\begin{itemize}
+ \item{Major item: added the macro processor.}
+ \item{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.}
+ \item{Fixed two more stupid bugs in ELF, which were causing `ld' to
+ continue to seg-fault in a lot of non-trivial cases.}
+ \item{Fixed a seg-fault in the label manager.}
+ \item{Stopped FBLD and FBSTP from \emph{requiring} the TWORD keyword, which is
+ the only option for BCD loads/stores in any case.}
+ \item{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.}
+ \item{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...}
+ \item{Another minor phase error (insofar as a phase error can \emph{ever} be
+ minor) fixed, this one occurring in code of the form
+\begin{lstlisting}
+rol ax,forward_reference
+forward_reference equ 1
+\end{lstlisting}}
+ \item{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).}
+ \item{Added Watcom C makefiles, and misc/pmw.bat, donated by Dominik Behr.}
+ \item{Added the INCBIN pseudo-opcode.}
+ \item{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.}
+ \item{Fixed a bug in OBJ format, which caused incorrect object records to
+ be output when absolute labels were made global.}
+ \item{Updates to RDOFF subdirectory, and changes to outrdf.c.}
+\end{itemize}
+
+\xsubsection{cl-0.93}{Version 0.93 released January 1997}
+
+This release went out in a great hurry after semi-crippling bugs
+were found in 0.92.
+
+\begin{itemize}
+ \item{Really \emph{did} fix the stack overflows this time. *blush*}
+ \item{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.}
+ \item{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.}
+ \item{Included a new Borland C makefile, Makefile.bc2, donated by Fox
+ Cutter <lmb@comtch.iea.com>.}
+\end{itemize}
+
+\xsubsection{cl-0.92}{Version 0.92 released January 1997}
+
+\begin{itemize}
+ \item{The FDIVP/FDIVRP and FSUBP/FSUBRP pairs had been inverted: this was
+ fixed. This also affected the LCC driver.}
+ \item{Fixed a bug regarding 32-bit effective addresses of the form
+ \code{[other\_register+ESP]}.}
+ \item{Documentary changes, notably documentation of the fact that Borland
+ Win32 compilers use `obj' rather than `win32' object format.}
+ \item{Fixed the COMENT record in OBJ files, which was formatted
+ incorrectly.}
+ \item{Fixed a bug causing segfaults in large RDF files.}
+ \item{OBJ format now strips initial periods from segment and group
+ definitions, in order to avoid complications with the local label
+ syntax.}
+ \item{Fixed a bug in disassembling far calls and jumps in NDISASM.}
+ \item{Added support for user-defined sections in COFF and ELF files.}
+ \item{Compiled the DOS binaries with a sensible amount of stack, to
+ prevent stack overflows on any arithmetic expression containing
+ parentheses.}
+ \item{Fixed a bug in handling of files that do not terminate in a newline.}
+\end{itemize}
+
+\xsubsection{cl-0.91}{Version 0.91 released November 1996}
+
+\begin{itemize}
+ \item{Loads of bug fixes.}
+ \item{Support for RDF added.}
+ \item{Support for DBG debugging format added.}
+ \item{Support for 32-bit extensions to Microsoft OBJ format added.}
+ \item{Revised for Borland C: some variable names changed, makefile added.}
+ \item{LCC support revised to actually work.}
+ \item{JMP/CALL NEAR/FAR notation added.}
+ \item{`a16', `o16', `a32' and `o32' prefixes added.}
+ \item{Range checking on short jumps implemented.}
+ \item{MMX instruction support added.}
+ \item{Negative floating point constant support added.}
+ \item{Memory handling improved to bypass 64K barrier under DOS.}
+ \item{\code{\$} prefix to force treatment of reserved words as identifiers added.}
+ \item{Default-size mechanism for object formats added.}
+ \item{Compile-time configurability added.}
+ \item{\code{\#}, \code{\@}, \code{\textasciitilde} and \code{?} are now valid characters in labels.}
+ \item{\code{-e} and \code{-k} options in NDISASM added.}
+\end{itemize}
+
+\xsubsection{cl-0.90} 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.