0
0
mirror of https://github.com/netwide-assembler/nasm.git synced 2025-10-10 00:25:06 -04:00

Merge remote-tracking branch 'github/nasm-2.15.xx'

Resolved Conflicts:
	version

Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
This commit is contained in:
H. Peter Anvin (Intel)
2020-06-30 17:14:36 -07:00
23 changed files with 515 additions and 245 deletions

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
/version -merge

View File

@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------- *
*
* Copyright 1996-2019 The NASM Authors - All Rights Reserved
* Copyright 1996-2020 The NASM Authors - All Rights Reserved
* See the file AUTHORS included with the NASM distribution for
* the specific copyright holders.
*
@@ -276,8 +276,13 @@ static void list_output(const struct out_data *data)
break;
case OUT_RESERVE:
{
if (size)
if (size > 8) {
list_size(offset, "res", size);
} else {
memset(q, '?', size << 1);
q[size << 1] = '\0';
list_out(offset, q);
}
break;
}
default:

View File

@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------- *
*
* Copyright 1996-2019 The NASM Authors - All Rights Reserved
* Copyright 1996-2020 The NASM Authors - All Rights Reserved
* See the file AUTHORS included with the NASM distribution for
* the specific copyright holders.
*
@@ -234,7 +234,8 @@ static bool parse_braces(decoflags_t *decoflags)
}
}
static inline const expr *next_expr(const expr *e, const expr **next_list)
static inline unused
const expr *next_expr(const expr *e, const expr **next_list)
{
e++;
if (!e->type) {
@@ -830,7 +831,14 @@ restart_parse:
/* DB et al */
result->operands = oper_num;
if (oper_num == 0)
nasm_warn(WARN_OTHER, "no operand for data declaration");
/*!
*!db-empty [on] no operand for data declaration
*! warns about a \c{DB}, \c{DW}, etc declaration
*! with no operands, producing no output.
*! This is permitted, but often indicative of an error.
*! See \k{db}.
*/
nasm_warn(WARN_DB_EMPTY, "no operand for data declaration");
}
return result;
}

View File

@@ -223,19 +223,19 @@ if ($what eq 'c') {
# Put a large value in unused slots. This makes it extremely unlikely
# that any combination that involves unused slot will pass the range test.
# This speeds up rejection of unrecognized tokens, i.e. identifiers.
print OUT "#define UNUSED (65535/3)\n";
print OUT "#define UNUSED_HASH_ENTRY (65535/3)\n";
print OUT " static const int16_t hash1[$n] = {\n";
for ($i = 0; $i < $n; $i++) {
my $h = ${$g}[$i*2+0];
print OUT " ", defined($h) ? $h : 'UNUSED', ",\n";
print OUT " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n";
}
print OUT " };\n";
print OUT " static const int16_t hash2[$n] = {\n";
for ($i = 0; $i < $n; $i++) {
my $h = ${$g}[$i*2+1];
print OUT " ", defined($h) ? $h : 'UNUSED', ",\n";
print OUT " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n";
}
print OUT " };\n";

View File

@@ -345,7 +345,8 @@ static inline bool tok_text_match(const struct Token *a, const struct Token *b)
return a->len == b->len && !memcmp(tok_text(a), tok_text(b), a->len);
}
static inline bool tok_match(const struct Token *a, const struct Token *b)
static inline unused bool
tok_match(const struct Token *a, const struct Token *b)
{
return a->type == b->type && tok_text_match(a, b);
}
@@ -763,7 +764,8 @@ static const char *unquote_token_cstr(Token *t)
* TOK_STRING tokens.
*/
static Token *quote_any_token(Token *t);
static inline Token *quote_token(Token *t)
static inline unused
Token *quote_token(Token *t)
{
if (likely(!tok_is(t, TOK_INTERNAL_STRING)))
return t;
@@ -4886,17 +4888,15 @@ static int mmac_rotate(const MMacro *mac, unsigned int n)
/*
* expands to a list of tokens from %{x:y}
*/
static Token *expand_mmac_params_range(MMacro *mac, Token *tline, Token ***last)
void expand_mmac_params_range(MMacro *mac, Token *tline, Token ***tail)
{
Token *t = tline, **tt, *tm, *head;
char *pos;
int fst, lst, j, i;
Token *t;
const char *arg = tok_text(tline) + 1;
int fst, lst, incr, n;
int parsed;
pos = strchr(tok_text(tline), ':');
nasm_assert(pos);
lst = atoi(pos + 1);
fst = atoi(tok_text(tline) + 1);
parsed = sscanf(arg, "%d:%d", &fst, &lst);
nasm_assert(parsed == 2);
/*
* only macros params are accounted so
@@ -4914,56 +4914,28 @@ static Token *expand_mmac_params_range(MMacro *mac, Token *tline, Token ***last)
fst = fst < 0 ? fst + (int)mac->nparam + 1: fst;
lst = lst < 0 ? lst + (int)mac->nparam + 1: lst;
/* count from zero */
fst--, lst--;
/*
* It will be at least one token. Note we
* need to scan params until separator, otherwise
* only first token will be passed.
* It will be at least one parameter, as we can loop
* in either direction.
*/
j = (fst + mac->rotate) % mac->nparam;
tm = mac->params[j+1];
if (!tm)
goto err;
head = dup_Token(NULL, tm);
tt = &head->next, tm = tm->next;
while (tok_isnt(tm, ',')) {
t = dup_Token(NULL, tm);
*tt = t, tt = &t->next, tm = tm->next;
incr = (fst < lst) ? 1 : -1;
while (true) {
n = mmac_rotate(mac, fst);
dup_tlistn(mac->params[n], mac->paramlen[n], tail);
if (fst == lst)
break;
t = make_tok_char(NULL, ',');
**tail = t;
*tail = &t->next;
fst += incr;
}
if (fst < lst) {
for (i = fst + 1; i <= lst; i++) {
t = make_tok_char(NULL, ',');
*tt = t, tt = &t->next;
j = (i + mac->rotate) % mac->nparam;
tm = mac->params[j+1];
while (tok_isnt(tm, ',')) {
t = dup_Token(NULL, tm);
*tt = t, tt = &t->next, tm = tm->next;
}
}
} else {
for (i = fst - 1; i >= lst; i--) {
t = make_tok_char(NULL, ',');
*tt = t, tt = &t->next;
j = (i + mac->rotate) % mac->nparam;
tm = mac->params[j+1];
while (!tok_isnt(tm, ',')) {
t = dup_Token(NULL, tm);
*tt = t, tt = &t->next, tm = tm->next;
}
}
}
*last = tt;
return head;
return;
err:
nasm_nonfatal("`%%{%s}': macro parameters out of range",
tok_text(tline) + 1);
return NULL;
nasm_nonfatal("`%%{%s}': macro parameters out of range", arg);
return;
}
/*
@@ -5014,16 +4986,9 @@ static Token *expand_mmac_params(Token * tline)
}
if (strchr(text, ':')) {
/*
* seems we have a parameters range here
*/
Token *head, **last;
head = expand_mmac_params_range(mac, t, &last);
if (head) {
*tail = head;
*last = tline;
text = NULL;
}
/* It is a range */
expand_mmac_params_range(mac, t, &tail);
text = NULL;
break;
}
@@ -5999,7 +5964,7 @@ static MMacro *is_mmacro(Token * tline, int *nparamp, Token ***paramsp)
*! The legacy behavior is quite strange and highly context-dependent,
*! and can be disabled with:
*!-
*! \c %pragma preproc sane_empty_expansion true
*! \c %pragma preproc sane_empty_expansion true
*!-
*! It is highly recommended to use this option in new code.
*/

View File

@@ -164,7 +164,7 @@ int stdscan(void *private_data, struct tokenval *tv)
*!ptr [on] non-NASM keyword used in other assemblers
*! warns about keywords used in other assemblers that might
*! indicate a mistake in the source code. Currently only the MASM
*! \c{PTR} keyword is recognized.
*! \c{PTR} keyword is recognized. See also \k{pkg_masm}.
*/
nasm_warn(WARN_PTR, "`%s' is not a NASM keyword",
tv->t_charptr);

View File

@@ -234,19 +234,19 @@ if ($output eq 'h') {
# Put a large value in unused slots. This makes it extremely unlikely
# that any combination that involves unused slot will pass the range test.
# This speeds up rejection of unrecognized tokens, i.e. identifiers.
print "#define UNUSED (65535/3)\n";
print "#define UNUSED_HASH_ENTRY (65535/3)\n";
print " static const int16_t hash1[$n] = {\n";
for ($i = 0; $i < $n; $i++) {
my $h = ${$g}[$i*2+0];
print " ", defined($h) ? $h : 'UNUSED', ",\n";
print " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n";
}
print " };\n";
print " static const int16_t hash2[$n] = {\n";
for ($i = 0; $i < $n; $i++) {
my $h = ${$g}[$i*2+1];
print " ", defined($h) ? $h : 'UNUSED', ",\n";
print " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n";
}
print " };\n";

View File

@@ -253,7 +253,18 @@ if ($what eq 'c') {
} else {
my $docdef = $whatdef{$warn->{def}};
@doc = @{$warn->{doc}};
my $newpara = 0;
foreach my $l (@{$warn->{doc}}) {
if ($l =~ /^\s*$/) {
$newpara = 1;
} else {
if ($newpara && $l !~ /^\\c\s+/) {
$l = '\> ' . $l;
}
$newpara = 0;
}
push(@doc, $l);
}
if (defined($docdef)) {
push(@doc, "\n", "\\> $docdef by default.\n");
}

View File

@@ -60,6 +60,12 @@
/* Define to 1 if compiled with the `-Wc90-c99-compat' compiler flag */
/* #undef CFLAGS_WC90_C99_COMPAT */
/* Define to 1 if compiled with the `-Wc99-compat' compiler flag */
/* #undef CFLAGS_WC99_COMPAT */
/* Define to 1 if compiled with the `-Wc99-extensions' compiler flag */
/* #undef CFLAGS_WC99_EXTENSIONS */
/* Define to 1 if compiled with the `-Werror' compiler flag */
/* #undef CFLAGS_WERROR */
@@ -225,6 +231,10 @@
functions */
/* #undef HAVE_FUNC_ATTRIBUTE_SENTINEL */
/* Define to 1 if your compiler supports __attribute__((unused)) on functions
*/
/* #undef HAVE_FUNC_ATTRIBUTE_UNUSED */
/* Define to 1 if your compiler supports __attribute__((alloc_size)) on
function pointers */
/* #undef HAVE_FUNC_PTR_ATTRIBUTE1_ALLOC_SIZE */
@@ -265,6 +275,10 @@
pointers */
/* #undef HAVE_FUNC_PTR_ATTRIBUTE_SENTINEL */
/* Define to 1 if your compiler supports __attribute__((unused)) on function
pointers */
/* #undef HAVE_FUNC_PTR_ATTRIBUTE_UNUSED */
/* Define to 1 if you have the `getgid' function. */
/* #undef HAVE_GETGID */
@@ -714,6 +728,22 @@
# endif
#endif
#ifndef unused_func
# ifdef HAVE_FUNC_ATTRIBUTE_UNUSED
# define unused_func __attribute__((unused))
# else
# define unused_func
# endif
#endif
#ifndef unused_func_ptr
# ifdef HAVE_FUNC_PTR_ATTRIBUTE_UNUSED
# define unused_func_ptr __attribute__((unused))
# else
# define unused_func_ptr
# endif
#endif
#ifndef never_null
# ifdef HAVE_FUNC_ATTRIBUTE_RETURNS_NONNULL
# define never_null __attribute__((returns_nonnull))

View File

@@ -23,12 +23,6 @@ AC_USE_SYSTEM_EXTENSIONS
AC_SYS_LARGEFILE
AC_PROG_CC
AC_PROG_CC_STDC
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_INSTALL
AC_PROG_MKDIR_P
pa_no_optimize=false
dnl If the user did not specify a CFLAGS default, change default
dnl to -O0 for debugging
@@ -36,6 +30,19 @@ PA_ARG_DISABLED([optimization],
[compile without optimization (-O0) to help debugging],
[pa_no_optimize=true])
dnl LLVM doesn't error out on invalid -W options unless this option is
dnl specified first. Enable this so this script can actually discover
dnl which -W options are possible for this compiler.
PA_ADD_CFLAGS([-Werror=unknown-warning-option])
dnl Other programs
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_INSTALL
AC_PROG_MKDIR_P
pa_no_optimize=false
dnl Compile and link with dwarf debug
PA_ARG_ENABLED([gdb],
[disable optimization and compile with extra debug information for GDB debugger],
@@ -282,6 +289,7 @@ PA_FUNC_ATTRIBUTE(format, [printf,1,2], int, [const char *, ...], ["%d",1])
PA_FUNC_ATTRIBUTE(const)
PA_FUNC_ATTRIBUTE(pure)
PA_FUNC_ATTRIBUTE(cold,,,,,unlikely_func)
PA_FUNC_ATTRIBUTE(unused)
PA_FUNC_ATTRIBUTE_ERROR
dnl
@@ -320,22 +328,25 @@ PA_ARG_ENABLED([sanitizer],
dnl
dnl Don't make symbols visible, there is no point and it just
dnl makes the code slower.
dnl makes the code slower. This mainly affects ELF.
dnl
PA_ADD_CFLAGS([-fvisibility=hidden])
dnl If we have gcc, add appropriate code cleanliness options
dnl
dnl If we have gcc, add appropriate code cleanliness options. Do this
dnl here at the end, because configure relies on being able to use
dnl some very, very old C constructs.
dnl
PA_ADD_CFLAGS([-Wall])
PA_ARG_DISABLED([pedantic],
[disable some extra paranoid compiler warnings],
[],
[PA_ADD_CFLAGS([-W])
PA_ADD_CFLAGS([-pedantic])
PA_ADD_CFLAGS([-Wc90-c99-compat])])
dnl LLVM doesn't error out on invalid -W options unless this option is
dnl specified first. Enable this so this script can actually discover
dnl which -W options are possible for this compiler.
PA_ADD_CFLAGS([-Werror=unknown-warning-option])
PA_ADD_CFLAGS([-Wc90-c99-compat])
PA_ADD_CFLAGS([-Wc99-compat])
PA_ADD_CFLAGS([-Wc99-extensions])
])
dnl Suppress format warning on Windows targets due to their <inttypes.h>
PA_ADD_CFLAGS([-Wpedantic-ms-format],[-Wno-pedantic-ms-format])
PA_ADD_CFLAGS([-Wlong-long],[-Wno-long-long])
@@ -347,6 +358,7 @@ dnl on compilers with gcc-like command line syntax we pass the -fwrapv
dnl option for exactly that reason.
PA_ADD_CFLAGS([-Wshift-negative-value],[-Wno-shift-negative-value])
dnl Want to turn this on at some point...
dnl PA_ADD_CFLAGS([-Wwrite-strings])
PA_ARG_ENABLED([werror],
[compile with -Werror to error out on any warning],

View File

@@ -7,6 +7,17 @@
The NASM 2 series supports x86-64, and is the production version of NASM
since 2007.
\S{cl-2.15.02} Version 2.15.02
\b Fix miscompilation when building with \c{clang}.
\b Add \c{db-empty} warning class, see \k{opt-w}.
\b Some documentation improvements and cleanups.
\b Fix the handling of macro parameter ranges (\c{%\{:\}}), including
with brace-enclosed original arguments.
\S{cl-2.15.01} Version 2.15.01
\b Fix building the documentation from the release archive. For 2.15,

View File

@@ -1,7 +1,7 @@
#!/usr/bin/perl
## --------------------------------------------------------------------------
##
## Copyright 1996-2017 The NASM Authors - All Rights Reserved
## Copyright 1996-2020 The NASM Authors - All Rights Reserved
## See the file AUTHORS included with the NASM distribution for
## the specific copyright holders.
##
@@ -775,7 +775,7 @@ sub ps_break_lines($$) {
my $p;
# Code paragraph; each chunk is a line
foreach $p ( @data ) {
push(@ls, [[$ptype,0,undef,\%BodyFont,0,0],[$p]]);
push(@ls, [[$ptype,0,undef,\%CodeFont,0,0],[$p]]);
}
$ls[0]->[0]->[1] |= 1; # First in para
$ls[-1]->[0]->[1] |= 2; # Last in para

View File

@@ -246,10 +246,10 @@
/norm2 { lmarg exch moveto bfont showstream } def
/norm3 { lmarg exch moveto bfont showstream } def
/code0 { lmarg exch moveto bfont showstream } def
/code1 { lmarg exch moveto bfont showstream } def
/code2 { lmarg exch moveto bfont showstream } def
/code3 { lmarg exch moveto bfont showstream } def
/code0 { lmarg exch moveto xfont showstream } def
/code1 { lmarg exch moveto xfont showstream } def
/code2 { lmarg exch moveto xfont showstream } def
/code3 { lmarg exch moveto xfont showstream } def
/bull0 { bullmarg exch moveto bfont bwidth showstreamjust } def
/bull1 { dup lmarg exch moveto bullet bfont showstream

View File

@@ -18,6 +18,7 @@ span.subtitle {
}
code, pre {
font-family: "source code pro", "liberation mono", "monospace";
font-size: 80%;
}
pre, blockquote {
margin-left: 4em;

View File

@@ -126,7 +126,13 @@
\IR{+ modifier} \c{+} modifier
\IR{- opsubtraction} \c{-} operator, binary
\IR{- opunary} \c{-} operator, unary
\IR{! opunary} \c{!} operator, unary
\IR{! opunary} \c{!} operator
\IA{A16}{a16}
\IA{A32}{a32}
\IA{A64}{a64}
\IA{O16}{o16}
\IA{O32}{o32}
\IA{O64}{o64}
\IR{alignment, in bin sections} alignment, in \c{bin} sections
\IR{alignment, in elf sections} alignment, in ELF sections
\IR{alignment, in win32 sections} alignment, in \c{win32} sections
@@ -152,10 +158,9 @@ variables
\IA{case-sensitive}{case sensitive}
\IA{case-insensitive}{case sensitive}
\IA{character constants}{character constant}
\IR{codeview} CodeView debugging format
\IR{codeview debugging format} CodeView debugging format
\IR{common object file format} Common Object File Format
\IR{common variables, alignment in elf} common variables, alignment
in ELF
\IR{common variables, alignment in elf} common variables, alignment in ELF
\IR{common, elf extensions to} \c{COMMON}, ELF extensions to
\IR{common, obj extensions to} \c{COMMON}, \c{obj} extensions to
\IR{declaring structure} declaring structures
@@ -165,15 +170,12 @@ in ELF
\IR{dll symbols, exporting} DLL symbols, exporting
\IR{dll symbols, importing} DLL symbols, importing
\IR{dos} DOS
\IR{dos archive} DOS archive
\IR{dos source archive} DOS source archive
\IR{dup} \c{DUP}
\IA{effective address}{effective addresses}
\IA{effective-address}{effective addresses}
\IR{elf} ELF
\IR{elf, 16-bit code} ELF, 16-bit code
\IR{elf, debug formats} ELF, debug formats
\IR{elf shared libraries} ELF, shared libraries
\IR{elf shared library} ELF, shared libraries
\IR{elf32} \c{elf32}
\IR{elf64} \c{elf64}
\IR{elfx32} \c{elfx32}
@@ -186,8 +188,7 @@ in ELF
\IR{freebsd} FreeBSD
\IR{freelink} FreeLink
\IR{functions, c calling convention} functions, C calling convention
\IR{functions, pascal calling convention} functions, Pascal calling
convention
\IR{functions, pascal calling convention} functions, \c{PASCAL} calling convention
\IR{global, aoutb extensions to} \c{GLOBAL}, \c{aoutb} extensions to
\IR{global, elf extensions to} \c{GLOBAL}, ELF extensions to
\IR{global, rdf extensions to} \c{GLOBAL}, \c{rdf} extensions to
@@ -199,9 +200,6 @@ convention
\IR{linux, elf} Linux, ELF
\IR{linux, a.out} Linux, \c{a.out}
\IR{linux, as86} Linux, \c{as86}
\IR{logical and} logical AND
\IR{logical or} logical OR
\IR{logical xor} logical XOR
\IR{mach object file format} Mach, object file format
\IA{mach-o}{macho}
\IR{mach-o} Mach-O, object file format
@@ -215,24 +213,30 @@ convention
\IA{misc directory}{misc subdirectory}
\IR{misc subdirectory} \c{misc} subdirectory
\IR{microsoft omf} Microsoft OMF
\IR{mmx registers} MMX registers
\IA{modr/m}{modr/m byte}
\IR{modr/m byte} ModR/M byte
\IR{ms-dos} MS-DOS
\IR{ms-dos device drivers} MS-DOS device drivers
\IR{multipush} \c{multipush} macro
\IR{nan} NaN
\IR{nasm version} NASM version
\IR{nasm version history} NASM version, history
\IR{nasm version macros} NASM version, macros
\IR{nasm version id} NASM version, ID macro
\IR{nasm version string} NASM version, string macro
\IR{arithmetic negation} negation, arithmetic
\IR{bitwise negation} negation, bitwise
\IR{boolean negation} negation, boolean
\IR{boolean and} boolean, AND
\IR{boolean or} boolean, OR
\IR{boolean xor} boolean, XOR
\IR{netbsd} NetBSD
\IR{nsis} NSIS
\IR{nullsoft scriptable installer} Nullsoft Scriptable Installer
\IA{.OBJ}{.obj}
\IR{omf} OMF
\IR{openbsd} OpenBSD
\IR{operating system} operating system
\IR{os/2} OS/2
\IR{pascal calling convention}Pascal calling convention
\IR{passes} passes, assembly
\IR{perl} Perl
\IR{pascal calling convention} Pascal calling convention
\IR{pic} PIC
\IR{pharlap} PharLap
\IR{plt} PLT
@@ -253,14 +257,16 @@ Object File Format
\IR{section alignment, in win32} section alignment, in \c{win32}
\IR{section, elf extensions to} \c{SECTION}, ELF extensions to
\IR{section, macho extensions to} \c{SECTION}, \c{macho} extensions to
\IR{section, win32 extensions to} \c{SECTION}, \c{win32} extensions to
\IR{section, windows extensions to} \c{SECTION}, Windows extensions to
\IR{segment alignment, in bin} segment alignment, in \c{bin}
\IR{segment alignment, in obj} segment alignment, in \c{obj}
\IR{segment, obj extensions to} \c{SEGMENT}, ELF extensions to
\IR{segment, obj extensions to} \c{SEGMENT}, \c{obj} extensions to
\IR{segment names, borland pascal} segment names, Borland Pascal
\IR{shift command} \c{shift} command
\IA{sib}{sib byte}
\IR{sib byte} SIB byte
\IA{string constant}{string constants}
\IR{string constants} string, constants
\IR{string length} string, length
\IR{string manipulation in macros} string, manipulation in macros
\IR{align, smart} \c{ALIGN}, smart
\IA{sectalign}{sectalign}
\IR{solaris x86} Solaris x86
@@ -271,7 +277,9 @@ Object File Format
\IR{thread local storage in elf} thread local storage, in ELF
\IR{thread local storage in mach-o} thread local storage, in \c{macho}
\IR{tlink} \c{TLINK}
\IR{unconditionally importing symbols} importing symbols, unconditionally
\IR{underscore, in c symbols} underscore, in C symbols
\IA{uninitialized storage}{storage, uninitialized}
\IR{unicode} Unicode
\IR{unix} Unix
\IR{utf-8} UTF-8
@@ -279,20 +287,16 @@ Object File Format
\IR{utf-32} UTF-32
\IA{sco unix}{unix, sco}
\IR{unix, sco} Unix, SCO
\IA{unix source archive}{unix, source archive}
\IR{unix, source archive} Unix, source archive
\IA{unix system v}{unix, system v}
\IR{unix, system v} Unix, System V
\IR{unixware} UnixWare
\IR{val} VAL
\IR{version number of nasm} version number of NASM
\IA{version number of nasm}{nasm, version}
\IR{visual c++} Visual C++
\IR{www page} WWW page
\IR{win32} Win32
\IR{win32} Win64
\IR{win64} Win64
\IR{windows} Windows
\IR{windows 95} Windows 95
\IR{windows nt} Windows NT
\IR{windows debugging formats} Windows, debugging formats
\# \IC{program entry point}{entry point, program}
\# \IC{program entry point}{start point, program}
\# \IC{MS-DOS device drivers}{device drivers, MS-DOS}
@@ -433,7 +437,7 @@ an intervening space. For example:
\c nasm -f bin driver.asm -odriver.sys
Note that this is a small o, and is different from a capital O , which
is used to specify the number of optimisation passes required. See \k{opt-O}.
is used to specify the number of optimization passes required. See \k{opt-O}.
\S{opt-f} The \i\c{-f} Option: Specifying the \i{Output File Format}
@@ -1195,21 +1199,21 @@ defines a symbol called \c{eax}, you can refer to \c{$eax} in NASM
code to distinguish the symbol from the register. Maximum length of
an identifier is 4095 characters.
The instruction field may contain any machine instruction: Pentium
and P6 instructions, FPU instructions, MMX instructions and even
The instruction field may contain any machine instruction: Pentium and
P6 instructions, FPU instructions, MMX instructions and even
undocumented instructions are all supported. The instruction may be
prefixed by \c{LOCK}, \c{REP}, \c{REPE}/\c{REPZ}, \c{REPNE}/\c{REPNZ},
\c{XACQUIRE}/\c{XRELEASE} or \c{BND}/\c{NOBND}, in the usual way. Explicit
\I{address-size prefixes}address-size and \i{operand-size prefixes} \i\c{A16},
\i\c{A32}, \i\c{A64}, \i\c{O16} and \i\c{O32}, \i\c{O64} are provided - one example of their use
is given in \k{mixsize}. You can also use the name of a \I{segment
override}segment register as an instruction prefix: coding
\c{es mov [bx],ax} is equivalent to coding \c{mov [es:bx],ax}. We
recommend the latter syntax, since it is consistent with other
syntactic features of the language, but for instructions such as
\c{LODSB}, which has no operands and yet can require a segment
override, there is no clean syntactic way to proceed apart from
\c{es lodsb}.
\c{XACQUIRE}/\c{XRELEASE} or \c{BND}/\c{NOBND}, in the usual
way. Explicit \I{address-size prefixes}address-size and
\i{operand-size prefixes} \i\c{A16}, \i\c{A32}, \i\c{A64}, \i\c{O16}
and \i\c{O32}, \i\c{O64} are provided - one example of their use is
given in \k{mixsize}. You can also use the name of a \I{segment
override}segment register as an instruction prefix: coding \c{es mov
[bx],ax} is equivalent to coding \c{mov [es:bx],ax}. We recommend the
latter syntax, since it is consistent with other syntactic features of
the language, but for instructions such as \c{LODSB}, which has no
operands and yet can require a segment override, there is no clean
syntactic way to proceed apart from \c{es lodsb}.
An instruction is not required to use a prefix: prefixes such as
\c{CS}, \c{A32}, \c{LOCK} or \c{REPE} can appear on a line by
@@ -1250,10 +1254,11 @@ Pseudo-instructions are things which, though not real x86 machine
instructions, are used in the instruction field anyway because that's
the most convenient place to put them. The current pseudo-instructions
are \i\c{DB}, \i\c{DW}, \i\c{DD}, \i\c{DQ}, \i\c{DT}, \i\c{DO},
\i\c{DY} and \i\c\{DZ}; their \i{uninitialized} counterparts
\i\c{RESB}, \i\c{RESW}, \i\c{RESD}, \i\c{RESQ}, \i\c{REST},
\i\c{RESO}, \i\c{RESY} and \i\c\{RESZ}; the \i\c{INCBIN} command, the
\i\c{EQU} command, and the \i\c{TIMES} prefix.
\i\c{DY} and \i\c\{DZ}; their \I{storage,
uninitialized}\i{uninitialized} counterparts \i\c{RESB}, \i\c{RESW},
\i\c{RESD}, \i\c{RESQ}, \i\c{REST}, \i\c{RESO}, \i\c{RESY} and
\i\c\{RESZ}; the \i\c{INCBIN} command, the \i\c{EQU} command, and the
\i\c{TIMES} prefix.
\S{db} \c{DB} and Friends: Declaring Initialized Data
@@ -1280,12 +1285,12 @@ the output file. They can be invoked in a wide range of ways:
\c{DT}, \c{DO}, \c{DY} and \c{DZ} do not accept \i{numeric constants}
as operands.
\I{masmdb} Starting in NASM 2.15, a the following MASM-like features
\I{masmdb} Starting in NASM 2.15, a the following \i{MASM}-like features
have been implemented:
\b A \I{?db}\c{?} argument to declare uninitialized data:
\b A \I{?db}\c{?} argument to declare \i{uninitialized storage}:
\c db ? ; uninitialized data
\c db ? ; uninitialized
\b A superset of the \i\c{DUP} syntax. The NASM version of this has
the following syntax specification; capital letters indicate literal
@@ -1308,7 +1313,7 @@ valid:
\c db 33
\c db (44) ; Integer expression
\c ; db (44,55) ; Invalid - error
\c ; db (44,55) ; Invalid - error
\c db %(44,55)
\c db %('XX','YY')
\c db ('AA') ; Integer expression - outputs single byte
@@ -1355,11 +1360,10 @@ the above example could also be written:
\S{incbin} \i\c{INCBIN}: Including External \i{Binary Files}
\c{INCBIN} is borrowed from the old Amiga assembler \i{DevPac}: it
includes a binary file verbatim into the output file. This can be
handy for (for example) including \i{graphics} and \i{sound} data
directly into a game executable file. It can be called in one of
these three ways:
\c{INCBIN} includes binary file data verbatim into the output
file. This can be handy for (for example) including \i{graphics} and
\i{sound} data directly into a game executable file. It can be called
in one of these three ways:
\c incbin "file.dat" ; include the whole file
\c incbin "file.dat",1024 ; skip the first 1024 bytes
@@ -1574,7 +1578,7 @@ Some examples (all producing exactly the same code):
\c mov ax,0b1100_1000 ; same binary constant yet again
\c mov ax,0y1100_1000 ; same binary constant yet again
\S{strings} \I{Strings}\i{Character Strings}
\S{strings} \I{string}\I{string constants}\i{Character Strings}
A character string consists of up to eight characters enclosed in
either single quotes (\c{'...'}), double quotes (\c{"..."}) or
@@ -1884,15 +1888,15 @@ The \c{|} operator gives a bitwise OR, exactly as performed by the
\S{expshift} \i{Bit Shift} Operators
\i\c{<<} gives a bit-shift to the left, just as it does in C. So
\c{5<<3} evaluates to 5 times 8, or 40. \i\c{>>} gives an \e{unsigned}
(logical) bit-shift to the right; the bits shifted in from the left
are set to zero.
\c{5<<3} evaluates to 5 times 8, or 40. \i\c{>>} gives an \I{unsigned,
bit shift}\e{unsigned} (logical) bit-shift to the right; the bits
shifted in from the left are set to zero.
\i\c{<<<} gives a bit-shift to the left, exactly equivalent to the
\c{<<} operator; it is included for completeness. \i\c{>>>} gives an
\e{signed} (arithmetic) bit-shift to the right; the bits shifted in
from the left are filled with copies of the most significant (sign)
bit.
\I{signed, bit shift}\e{signed} (arithmetic) bit-shift to the right;
the bits shifted in from the left are filled with copies of the most
significant (sign) bit.
\S{expplmi} \I{+ opaddition}\c{+} and \I{- opsubtraction}\c{-}:
@@ -1906,11 +1910,13 @@ subtraction.
\i\c{*} is the multiplication operator.
\i\c{/} and \i\c{//} are both division operators: \c{/} is \i{unsigned
division} and \c{//} is \i{signed division}.
\i\c{/} and \i\c{//} are both division operators: \c{/} is
\I{division, unsigned}\I{unsigned, division}unsigned division and \c{//} is
\I{division, signed}\I{signed, division}signed division.
Similarly, \i\c{%} and \i\c{%%} provide \I{unsigned modulo}\I{modulo
operators} unsigned and \i{signed modulo} operators respectively.
Similarly, \i\c{%} and \i\c{%%} provide \I{modulo,
unsigned}\I{unsigned, modulo}unsigned and \I{modulo, signed}\I{signed,
modulo}signed modulo operators respectively.
Since the \c{%} character is used extensively by the macro
\i{preprocessor}, you should ensure that both the signed and unsigned
@@ -1923,22 +1929,27 @@ the signed division operator, such that:
\c b * (a // b) + (a %% b) = a (b != 0)
\S{expmul} \i{Unary Operators}
\S{expmul} \I{operators, unary}\i{Unary Operators}
The highest-priority operators in NASM's expression grammar are those
which only apply to one argument. These are \I{+ opunary}\c{+}, \I{-
opunary}\c{-}, \i\c{~}, \I{! opunary}\c{!}, \i\c{SEG}, and the
\i{integer functions} operators.
which only apply to one argument. These are:
\c{-} negates its operand, \c{+} does nothing (it's provided for
symmetry with \c{-}), \c{~} computes the \i{one's complement} of its
operand, \c{!} is the \i{logical negation} operator.
\b \I{- opunary}\c{-} \I{arithmetic negation}negates (\i{2's complement}) its
operand.
\c{SEG} provides the \i{segment address}
of its operand (explained in more detail in \k{segwrt}).
\b \I{+ opunary}\c{+} does nothing; it's provided for symmetry with \c{-}.
A set of additional operators with leading and trailing double
underscores are used to implement the integer functions of the
\b \I{~ opunary}\c{~} computes the \I{negation, bitwise}\i{bitwise
negation} (\i{1's complement}) of its operand.
\b \I{! opunary}\c{!} is the \I{negation, boolean}\i{boolean negation}
operator. It evaluates to 1 if the argument is 0, otherwise 0.
\b \c{SEG} provides the \i{segment address} of its operand (explained in
more detail in \k{segwrt}).
\b A set of additional operators with leading and trailing double
underscores are used to implement the \c{integer functions} of the
\c{ifunc} macro package, see \k{pkg_ifunc}.
@@ -2239,7 +2250,7 @@ if the argument is never used. For example:
A single pair of parentheses is a subcase of a single, unused argument:
\c %define myreg() eax
\c mov edx,myreg()
\c mov edx,myreg()
This is similar to the behavior of the C preprocessor.
@@ -4109,10 +4120,9 @@ be assembled with no pre-defined macros, you can use the \i\c{%clear}
directive to empty the preprocessor of everything but context-local
preprocessor variables and single-line macros, see \k{clear}.
Most \i{user-level assembler directives} (see \k{directive}) are
implemented as macros which invoke primitive directives; these are
described in \k{directive}. The rest of the standard macro set is
described here.
Most \i{user-level directives} (see \k{directive}) are implemented as
macros which invoke primitive directives; these are described in
\k{directive}. The rest of the standard macro set is described here.
For compability with NASM versions before NASM 2.15, most standard
macros of the form \c{__?foo?__} have aliases of form \c{__foo__} (see
@@ -4120,15 +4130,15 @@ macros of the form \c{__?foo?__} have aliases of form \c{__foo__} (see
defalias}.
\H{stdmacver} \i{NASM Version} Macros
\H{stdmacver} \i{NASM Version Macros}
The single-line macros \i\c{__?NASM_MAJOR?__}, \i\c{__?NASM_MINOR?__},
\i\c{__?NASM_SUBMINOR?__} and \i\c{__?_NASM_PATCHLEVEL?__} expand to the
\i\c{__?NASM_SUBMINOR?__} and \i\c{__?NASM_PATCHLEVEL?__} expand to the
major, minor, subminor and patch level parts of the \i{version
number of NASM} being used. So, under NASM 0.98.32p1 for
example, \c{__?NASM_MAJOR?__} would be defined to be 0, \c{__?NASM_MINOR?__}
would be defined as 98, \c{__?NASM_SUBMINOR?__} would be defined to 32,
and \c{__?_NASM_PATCHLEVEL?__} would be defined as 1.
and \c{__?NASM_PATCHLEVEL?__} would be defined as 1.
Additionally, the macro \i\c{__?NASM_SNAPSHOT?__} is defined for
automatically generated snapshot releases \e{only}.
@@ -4139,7 +4149,7 @@ automatically generated snapshot releases \e{only}.
The single-line macro \c{__?NASM_VERSION_ID?__} expands to a dword integer
representing the full version number of the version of nasm being used.
The value is the equivalent to \c{__?NASM_MAJOR?__}, \c{__?NASM_MINOR?__},
\c{__?NASM_SUBMINOR?__} and \c{__?_NASM_PATCHLEVEL?__} concatenated to
\c{__?NASM_SUBMINOR?__} and \c{__?NASM_PATCHLEVEL?__} concatenated to
produce a single doubleword. Hence, for 0.98.32p1, the returned number
would be equivalent to:
@@ -4154,7 +4164,7 @@ line is used just to give an indication of the order that the separate
values will be present in memory.
\S{stdmacverstr} \i\c{__?NASM_VER?__}: \i{NASM Version string}
\S{stdmacverstr} \i\c{__?NASM_VER?__}: \i{NASM Version String}
The single-line macro \c{__?NASM_VER?__} expands to a string which defines
the version number of nasm being used. So, under NASM 0.98.32 for example,
@@ -4650,13 +4660,17 @@ functionality, as intended to be used primarily with machine-generated code.
It does not include any "programmer-friendly" shortcuts, nor does it in any way
support ASSUME, symbol typing, or MASM-style structures.
Currently, the MASM compatibility package emulates only the PTR keyword and
recognize syntax displacement[index] for memory operations.
Currently, the MASM compatibility package emulates only the PTR
keyword and recognize syntax displacement[index] for memory
operations.
To enable the package, use the directive:
\c{%use masm}
In addition, NASM now natively supports the MASM \c{?} and
\c{DUP} syntax for the \c{DB} etc data declaration directives,
regardless of if this package is included or not. See \k{db}.
\C{directive} \i{Assembler Directives}
@@ -4949,13 +4963,12 @@ declared as \c{EXTERN} and then defined, it will be treated as
\c{EXTERN}, it will be treated as \c{COMMON}.
\H{required} \i\c{REQUIRED}: \i{Importing Symbols} from Other Modules
\H{required} \i\c{REQUIRED}: \i{Unconditionally Importing Symbols} from Other Modules
The \c{REQUIRED} keyword is similar to \c{EXTERN} one. The difference is that
the \c{EXTERN} keyword as of version 2.15 does not generate unknown symbols, as
this behavior is highly undesirable when using common header files,
because it might cause the linker to pull in a bunch of unnecessary modules,
depending on how smart the linker is.
The \c{REQUIRED} keyword is similar to \c{EXTERN} one. The difference
is that the \c{EXTERN} keyword as of version 2.15 does not generate
unknown symbols as that prevents using common header files, as it
might cause the linker to pull in a bunch of unnecessary modules.
If the old behavior is required, use \c{REQUIRED} keyword instead.
@@ -5244,7 +5257,7 @@ does. See \k{proborg} for further comments.
\S{binseg} \c{bin} Extensions to the \c{SECTION}
Directive\I{SECTION, bin extensions to}
Directive\I{\c{SECTION}, \c{bin} extensions to}
The \c{bin} output format extends the \c{SECTION} (or \c{SEGMENT})
directive to allow you to specify the alignment requirements of
@@ -5557,7 +5570,7 @@ be specified, even if it is the same as the internal name. The
available attributes are:
\b \c{resident} indicates that the exported name is to be kept
resident by the system loader. This is an optimisation for
resident by the system loader. This is an optimization for
frequently used symbols imported by name.
\b \c{nodata} indicates that the exported symbol is a function which
@@ -5701,7 +5714,7 @@ files that Win32 linkers can generate correct output from.
\S{win32sect} \c{win32} Extensions to the \c{SECTION}
Directive\I{SECTION, win32 extensions to}
Directive\I{SECTION, Windows extensions to}
Like the \c{obj} format, \c{win32} allows you to specify additional
information on the \c{SECTION} directive line, to control the type
@@ -5847,8 +5860,8 @@ later can still be linked by earlier versions or non-Microsoft linkers.
\S{codeview} Debugging formats for Windows
\I{Windows debugging formats}
The \c{win32} and \c{win64} formats support the Microsoft CodeView
debugging format. Currently CodeView version 8 format is supported
The \c{win32} and \c{win64} formats support the Microsoft \i{CodeView
debugging format}. Currently CodeView version 8 format is supported
(\i\c{cv8}), but newer versions of the CodeView debugger should be
able to handle this format as well.
@@ -6420,14 +6433,14 @@ of the symbol with code such as:
\S{elfglob} \c{elf} Extensions to the \c{GLOBAL} Directive\I{GLOBAL,
elf extensions to}\I{GLOBAL, aoutb extensions to}
\c{ELF} object files can contain more information about a global symbol
than just its address: they can contain the \I{symbol sizes,
specifying}\I{size, of symbols}size of the symbol and its \I{symbol
types, specifying}\I{type, of symbols}type as well. These are not
merely debugger conveniences, but are actually necessary when the
program being written is a \i{shared library}. NASM therefore
supports some extensions to the \c{GLOBAL} directive, allowing you
to specify these features.
\c{ELF} object files can contain more information about a global
symbol than just its address: they can contain the \I{symbols,
specifying sizes}\I{size, of symbols}size of the symbol and its
\I{symbols, specifying types}\I{type, of symbols}type as well. These
are not merely debugger conveniences, but are actually necessary when
the program being written is a \I{elf shared library}shared
library. NASM therefore supports some extensions to the \c{GLOBAL}
directive, allowing you to specify these features.
You can specify whether a global variable is a function or a data
object by suffixing the name with a colon and the word
@@ -6731,7 +6744,7 @@ also, have to be built as \c{.EXE} files, since Windows does not
support the \c{.COM} format.
In general, you generate \c{.EXE} files by using the \c{obj} output
format to produce one or more \i\c{.OBJ} files, and then linking
format to produce one or more \i\c{.obj} files, and then linking
them together using a linker. However, NASM also supports the direct
generation of simple DOS \c{.EXE} files using the \c{bin} output
format (by using \c{DB} and \c{DW} to construct the \c{.EXE} file
@@ -8060,7 +8073,7 @@ and create \c{library.so.1} as a symbolic link to it.
This chapter tries to cover some of the issues, largely related to
unusual forms of addressing and jump instructions, encountered when
writing operating system code such as protected-mode initialisation
writing operating system code such as protected-mode initialization
routines, which require code that operates in mixed segment sizes,
such as code in a 16-bit segment trying to modify data in a 32-bit
one, or jumps between different-size segments.
@@ -8571,7 +8584,7 @@ Hence, to disassemble a \c{.COM} file:
will do the trick.
\S{ndissync} Code Following Data: Synchronisation
\S{ndissync} Code Following Data: Synchronization
Suppose you are disassembling a file which contains some data which
isn't machine code, and \e{then} contains some machine code. NDISASM
@@ -8590,8 +8603,8 @@ then the correct first instruction in the code section will not be
seen because the starting point skipped over it. This isn't really
ideal.
To avoid this, you can specify a `\i{synchronisation}' point, or indeed
as many synchronisation points as you like (although NDISASM can
To avoid this, you can specify a `\i{synchronization}' point, or indeed
as many synchronization points as you like (although NDISASM can
only handle 2147483647 sync points internally). The definition of a sync
point is this: NDISASM guarantees to hit sync points exactly during
disassembly. If it is thinking about generating an instruction which
@@ -8615,7 +8628,7 @@ As stated above, you can specify multiple sync markers if you need
to, just by repeating the \c{-s} option.
\S{ndisisync} Mixed Code and Data: Automatic (Intelligent) Synchronisation
\S{ndisisync} Mixed Code and Data: Automatic (Intelligent) Synchronization
\I\c{auto-sync}
Suppose you are disassembling the boot sector of a \c{DOS} floppy (maybe
@@ -8734,8 +8747,9 @@ the \c{git} distributed source control system. The link is available
on the website. This is recommended only to participate in the
development of NASM or to assist with testing the development code.
To build NASM from the \c{git} repository you will need a Perl and, if
building on a Unix system, GNU autoconf.
To build NASM from the \c{git} repository you will need a Perl
interpreter and, if building on a Unix system, GNU autoconf installed
on your system.
To build on a Unix system, run:
@@ -8743,6 +8757,14 @@ To build on a Unix system, run:
to create the \c{configure} script and then build as listed above.
\H{builddoc} Building the documentation
To build the documentation, you will need a Perl interpreter, a
Postscript to PDF converter such as Ghostscript, and suitable fonts
installed on your system. The recommended (and default) fonts are
Adobe's Source Sans and Source Code fonts, which are freely available
under the SIL Open Font License.
\A{contact} Contact Information
\H{website} Website

View File

@@ -21,33 +21,54 @@ my @QText = ('SourceSansPro-It', 'ClearSans-Italic', 'LiberationSans-Italic',
'Arial-Italic', 'Helvetica-Italic');
my @QBold = ('SourceSansPro-BoldIt', 'ClearSans-BoldItalic', 'LiberationSans-BoldItalic', 'Arial-Bold', 'Helvetica-BoldItalic');
my @QCode = ('SourceCodePro-Regular', 'LiberationMono', 'Courier');
my @XCode = ('SourceCodePro-Regular', 'LiberationMono', 'Courier');
# The fonts we want to use for various things
# The order is: <normal> <emphatic> <code>
my $lf = 1.2; # Leading scale factor
my $cf = 0.8; # Code size scale factor
my $st = 20;
%TitlFont = (name => 'tfont',
leading => 24,
fonts => [[20, \@TText], [20, \@TItal], [20, \@TCode]]);
leading => $st*$lf,
fonts => [[$st, \@TText], [$st, \@TItal], [$st*$cf, \@TCode]]);
my $sc = 18;
%ChapFont = (name => 'cfont',
leading => 21.6,
fonts => [[18, \@HText], [18, \@HItal], [18, \@HCode]]);
leading => $sc*$lf,
fonts => [[$sc, \@HText], [$sc, \@HItal], [$sc*$cf, \@HCode]]);
my $sh = 14;
%HeadFont = (name => 'hfont',
leading => 16.8,
fonts => [[14, \@HText], [14, \@HItal], [14, \@HCode]]);
leading => $sh*$lf,
fonts => [[$sh, \@HText], [$sh, \@HItal], [$sh*$cf, \@HCode]]);
my $ss = 12;
%SubhFont = (name => 'sfont',
leading => 14.4,
fonts => [[12, \@HText], [12, \@HItal], [12, \@HCode]]);
leading => $ss*$lf,
fonts => [[$ss, \@HText], [$ss, \@HItal], [$ss*$cf, \@HCode]]);
my $sb = 10;
%BodyFont = (name => 'bfont',
leading => 12,
fonts => [[10, \@BText], [10, \@BItal], [10, \@BCode]]);
leading => $sb*$lf,
fonts => [[$sb, \@BText], [$sb, \@BItal], [$sb*$cf, \@BCode]]);
my $sq = 9;
%BquoFont = (name => 'qfont',
leading => 10.8,
fonts => [[9, \@QText], [9, \@QBold], [9, \@QCode]]);
leading => $sq*$lf,
fonts => [[$sq, \@QText], [$sq, \@QBold], [$sq*$cf, \@QCode]]);
my $sx = $sb*$cf;
%CodeFont = (name => 'xfont',
leading => $sx*$lf,
fonts => [[$sx, \@XCode], [$sx, \@XCode], [$sx, \@XCode]]);
#
# List of all fontsets; used to compute the list of fonts needed
#
@AllFonts = ( \%TitlFont, \%ChapFont, \%HeadFont, \%SubhFont, \%BodyFont,
\%BquoFont);
\%BquoFont, \%CodeFont );
# OK
1;

View File

@@ -310,6 +310,27 @@ static inline void *mempcpy(void *dst, const void *src, size_t n)
#define printf_func(fmt, list) format_func3(printf,fmt,list)
#define printf_func_ptr(fmt, list) format_func3_ptr(printf,fmt,list)
/*
* A static [inline] function which either is currently unused but
* likely to be used in the future, or used only under some #if
* combinations. Mark with this option to suppress compiler
* warnings.
*
* This is better than #if(def) because it still lets the compiler
* analyze the function for validity, and it works even for the
* conditional use case.
*
* The macro UNUSED is set to 1 if the unused macro is meaningful,
* otherwise 0; this may be useful in some #if statements.
*/
#ifdef HAVE_FUNC_ATTRIBUTE_UNUSED
# define unused __attribute__((unused))
# define UNUSED 1
#else
# define unused
# define UNUSED 0
#endif
/* Determine probabilistically if something is a compile-time constant */
#ifdef HAVE___BUILTIN_CONSTANT_P
# if defined(__GNUC__) && (__GNUC__ >= 5)

View File

@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------- *
*
* Copyright 1996-2018 The NASM Authors - All Rights Reserved
* Copyright 1996-2020 The NASM Authors - All Rights Reserved
* See the file AUTHORS included with the NASM distribution for
* the specific copyright holders.
*
@@ -78,10 +78,10 @@ static inline size_t strlist_size(const struct strlist *list)
}
struct strlist safe_alloc *strlist_alloc(bool uniq);
const struct strlist_entry * never_null strlist_add(struct strlist *list, const char *str);
const struct strlist_entry * printf_func(2, 3) never_null
const struct strlist_entry *strlist_add(struct strlist *list, const char *str);
const struct strlist_entry * printf_func(2, 3)
strlist_printf(struct strlist *list, const char *fmt, ...);
const struct strlist_entry * never_null
const struct strlist_entry *
strlist_vprintf(struct strlist *list, const char *fmt, va_list ap);
const struct strlist_entry *
strlist_find(const struct strlist *list, const char *str);

View File

@@ -276,19 +276,19 @@ print OUT " };\n";
# Put a large value in unused slots. This makes it extremely unlikely
# that any combination that involves unused slot will pass the range test.
# This speeds up rejection of unrecognized tokens, i.e. identifiers.
print OUT "#define UNUSED (65535/3)\n";
print OUT "#define UNUSED_HASH_ENTRY (65535/3)\n";
print OUT " static const int16_t hash1[$n] = {\n";
for ($i = 0; $i < $n; $i++) {
my $h = ${$g}[$i*2+0];
print OUT " ", defined($h) ? $h : 'UNUSED', ",\n";
print OUT " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n";
}
print OUT " };\n";
print OUT " static const int16_t hash2[$n] = {\n";
for ($i = 0; $i < $n; $i++) {
my $h = ${$g}[$i*2+1];
print OUT " ", defined($h) ? $h : 'UNUSED', ",\n";
print OUT " ", defined($h) ? $h : 'UNUSED_HASH_ENTRY', ",\n";
}
print OUT " };\n";

View File

@@ -334,18 +334,18 @@ if ($output eq 'h') {
}
print F "\n};\n\n";
print F "#define UNUSED (65536/3)\n\n";
print F "#define UNUSED_HASH_ENTRY (65536/3)\n\n";
printf F "static const int16_t %s_hashvals[%d] = ", $name, $n*2;
$c = '{';
for (my $i = 0; $i < $n; $i++) {
my $h = ${$g}[$i*2+0];
print F "$c\n ", defined($h) ? $h : 'UNUSED';
print F "$c\n ", defined($h) ? $h : 'UNUSED_HASH_ENTRY';
$c = ',';
}
for (my $i = 0; $i < $n; $i++) {
my $h = ${$g}[$i*2+1];
print F "$c\n ", defined($h) ? $h : 'UNUSED';
print F "$c\n ", defined($h) ? $h : 'UNUSED_HASH_ENTRY';
$c = ',';
}
print F "\n};\n\n";

View File

@@ -1,6 +1,6 @@
/* ----------------------------------------------------------------------- *
*
* Copyright 1996-2018 The NASM Authors - All Rights Reserved
* Copyright 1996-2020 The NASM Authors - All Rights Reserved
* See the file AUTHORS included with the NASM distribution for
* the specific copyright holders.
*
@@ -102,7 +102,8 @@ strlist_add(struct strlist *list, const char *str)
const struct strlist_entry *
strlist_vprintf(struct strlist *list, const char *fmt, va_list ap)
{
struct strlist_entry *e;
/* clang miscompiles offsetin() unless e is initialized here */
struct strlist_entry *e = NULL;
struct hash_insert hi;
if (!list)

View File

@@ -19,3 +19,18 @@
dd 16 dup (0xaaaa, ?, 0xbbbbbb)
dd 64 dup (?)
resb 1
resb 2
resb 4
resb 8
resw 1
resw 2
resw 4
resw 8
resq 1
resq 2
resq 4
resq 8

View File

@@ -1 +0,0 @@
../../nasm-2.14.xx/test/emptyarg.asm

147
test/emptyarg.asm Normal file
View File

@@ -0,0 +1,147 @@
%define EMPTY
%macro bar 1
db "bar", __LINE__, %0, %1
%endmacro
%macro baz 2
db "baz", __LINE__, %0, %1, %2
%endmacro
%macro nothing 0
db "nothing", __LINE__, %0
%endmacro
%macro xyzzy 1-2
db "xyzzy", __LINE__, %0, %1, %2, %3
%endmacro
%macro vararg 0-*
db "vararg", __LINE__, %0
%assign %%i 1
%rep %0
db "vararg arg ", %%i, %1
%rotate 1
%assign %%i %%i + 1
%endrep
%endmacro
%macro defargs 1-5 def2, def3, def4, def5
db "defargs", __LINE__, %0, %1, %2, %3, %4, %5
%endmacro
%macro ivar 1
vararg %1
%endmacro
%macro foo 1-2
db "foo", __LINE__, %0, %1, %2
bar %2
bar {%2}
bar %2,
bar {%2},
baz %1,%2
baz {%1},{%2}
nothing %1
nothing %2
xyzzy "meep",%1,%2,
xyzzy "meep","meep",%1,%2
xyzzy "alpha","bravo",
xyzzy "with","empty",EMPTY
%endmacro
%macro orange 1
db %{1:1}
%endmacro
%macro prange1 2-3
db %{1:2}, 0%3
%endmacro
%macro prange2 1-3 'two', 'three'
db %{1:3}
%endmacro
db 4,
nothing
nothing 1
nothing ; foo
nothing EMPTY
flup: foo 1,2
foo 3
bar
bar EMPTY
foo 6,
foo 6, ; With space/comment
foo 6,EMPTY
baz 8,EMPTY
foo 6,{}
foo ,5
xyzzy 13,14,15,
xyzzy 13,14,15,EMPTY
xyzzy 20,21
xyzzy 22,23,
xyzzy 24,25,EMPTY
xyzzy 26,27,,
xyzzy 28,29,EMPTY,EMPTY
vararg
vararg EMPTY
vararg ,
vararg 10
vararg 11,
vararg 12,EMPTY
vararg 13,14,15,
vararg 13,14,15,EMPTY
vararg 20,21
vararg 22,23,
vararg 24,25,EMPTY
vararg 26,27,,
vararg 28,29,EMPTY,EMPTY
ivar {}
ivar {EMPTY}
ivar EMPTY
ivar ,
ivar {,}
ivar {60}
ivar {61,}
ivar {62,EMPTY}
ivar {63,64,65,}
ivar {63,64,65,EMPTY}
ivar {70,71}
ivar {72,73,}
ivar {74,75,EMPTY}
ivar {76,77,,}
ivar {78,79,EMPTY,EMPTY}
defargs EMPTY
defargs 91
defargs 91,92
defargs 91,92,93
defargs 91,92,93,94
defargs 91,92,93,94,95
defargs ,
defargs 91,
defargs 91,92,
defargs 91,92,93,
defargs 91,92,93,94,
defargs 91,92,93,94,95,
prange1 101
prange1 101, 102
prange1 101, 102, 103
prange2 121
prange2 121, 122
prange2 121, 122, 123
prange2 {121}
prange2 {121,121}
prange2 {121},{122}
prange2 {121},122,{123}
prange2 121,{122,122},123
orange 130
orange 130, 131
orange {130, 131}