From: H. Peter Anvin Date: Tue, 30 Apr 2002 20:57:38 +0000 (+0000) Subject: NASM 0.98p6 X-Git-Tag: nasm-2.11.05~2522 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=620515ab4e66b45f9440cf04a1fa61869275170f;p=platform%2Fupstream%2Fnasm.git NASM 0.98p6 --- diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..60549be --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Licence b/Licence index 5856d40..7f5f842 100644 --- a/Licence +++ b/Licence @@ -95,4 +95,14 @@ inaccurate or a failure of the Software to operate with any other programs, even if you have been advised of the possibility of such damages. +X. In addition to what this Licence provides, the Software may be +distributed in such a way as to be compliant with the GNU General +Public Licence, as published by the Free Software Foundation, +Cambridge, MA, USA; version 2, or, at your option, any later version; +incorporated herein by reference. You must include a copy of this +Licence with such distribution. Furthermore, patches sent to the +authors for the purpose of inclusion in the official release version +are considered cleared for release under the full terms of this +Licence. + END OF LICENCE AGREEMENT diff --git a/MODIFIED b/MODIFIED index eb4de36..15e4d87 100644 --- a/MODIFIED +++ b/MODIFIED @@ -1,6 +1,34 @@ This is a modified version of NASM, modified and released by H. Peter Anvin ; it is not the original form released by the -NASM authors. +NASM authors. However, as of 0.98p6 I have agreed to release the +official 0.98 version, so this is now an "official pre-release". + +For release 0.98p6: + +* Took officially over coordination of the 0.98 release; so drop + the p3.x notation. Skipped p4 and p5 to avoid confusion with John + Fine's J4 and J5 releases. +* Update the documentation; however, it still doesn't include + documentation for the various new instructions. I somehow wonder if + it makes sense to have an instruction set reference in the assembler + manual when Intel et al have PDF versions of their manuals online. +* Recognize "idt" or "centaur" for the -p option to ndisasm. +* Changed error messages back to stderr where they belong, but add an + -E option to redirect them elsewhere (the DOS shell cannot redirect + stderr.) +* -M option to generate Makefile dependencies (based on code from Alex + Verstak.) +* %undef preprocessor directive, and -u option, that undefines a + single-line macro. +* OS/2 Makefile (Mkfiles/Makefile.os2) for Borland under OS/2; from + Chuck Crayne. +* Various minor bugfixes (reported by): + - Dangling %s in preproc.c (Martin Junker) +* THERE ARE KNOWN BUGS IN SSE AND THE OTHER KATMAI INSTRUCTIONS. I am + on a trip and didn't bring the Katmai instruction reference, so I + can't work on them right now. +* Updated the License file per agreement with Simon and Jules to + include a GPL distribution clause. For release 0.98p3.7: diff --git a/Makefile.in b/Makefile.in index 35bf95c..b991991 100644 --- a/Makefile.in +++ b/Makefile.in @@ -20,6 +20,8 @@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ +NROFF = @NROFF@ + .c.o: $(CC) -c $(CFLAGS) $< @@ -30,7 +32,7 @@ NASM = nasm.o nasmlib.o float.o insnsa.o assemble.o labels.o \ NDISASM = ndisasm.o disasm.o sync.o nasmlib.o insnsd.o -all: nasm ndisasm +all: nasm ndisasm nasm.man nasm: $(NASM) $(CC) -o nasm $(NASM) @@ -80,6 +82,9 @@ insnsa.c insnsd.c insnsi.h insnsn.c: insns.dat insns.pl macros.c: standard.mac macros.pl perl $(srcdir)/macros.pl $(srcdir)/standard.mac +nasm.man: nasm.1 + $(NROFF) -man nasm.1 > nasm.man + install: nasm ndisasm $(INSTALL_PROGRAM) nasm $(bindir)/nasm $(INSTALL_PROGRAM) ndisasm $(bindir)/ndisasm @@ -95,7 +100,7 @@ distclean: clean cd rdoff; $(MAKE) distclean cleaner: clean - rm -f insnsa.c insnsd.c insnsi.h insnsn.c macros.c + rm -f insnsa.c insnsd.c insnsi.h insnsn.c macros.c nasm.man spotless: distclean cleaner diff --git a/Mkfiles/Makefile.b32 b/Mkfiles/Makefile.b32 new file mode 100644 index 0000000..d442238 --- /dev/null +++ b/Mkfiles/Makefile.b32 @@ -0,0 +1,138 @@ +# Makefile for the Netwide Assembler under 32 bit NT console +# +# The Netwide Assembler is copyright (C) 1996 Simon Tatham and +# Julian Hall. All rights reserved. The software is +# redistributable under the licence given in the file "Licence" +# distributed in the NASM archive. +# +# This Makefile is designed to build NASM with the latest +# version of Borland C++Builder and has been tested with +# Borland C++ 5.3 (Borland C++Builder 3.0) and Borland C++ 5.4 +# (Borland C++Builder 4.0) in combination with +# Borland MAKE versions 5.1 and 5.2 +# +# MAKEFILE is maintained by Stefan.Hoffmeister@Econos.de +# + + +# If "BINDIR=C:\...." has not been defined on the command line +# assume that the binary files are in the same directory as the +# MAKE utility +!message **************************************************** +!message Note: +!message ----- +!if $d(BINDIR) + !message Path to tools set to $(BINDIR) +!else + BINDIR=$(MAKEDIR) + !message Assuming path to tools to be $(BINDIR) + !message + !message You can change this assumption by specifying + !message -DBINDIR=C:\my_path + !message as a command line paramter for MAKE +!endif +!message **************************************************** + + +CC=$(BINDIR)\bcc32 +CCFLAGS=-tWC -c -O2 -A + # /-tWC: Windows console mode application + # /c: Compile, do not link + # /O2: Optimize for speed + # /A: ANSI compatible code only + +LINK=$(BINDIR)\ilink32 +LINKFLAGS=/V4.0 /x /c /ap /L$(BINDIR)\..\LIB # /L -> default LIB directory + # /V4.0: marked as Win95 / NT application in PE header + # /x: no map file + # /c: case sensitive link + # /ap: link for 32-bit console application + # /L...: path to .lib directory + + +# default libraries for Win32 console applications +LIBRARIES=cw32.lib import32.lib +# default startup code for Win32 console applications +STARTUP=c0x32.obj + +# default extension for our EXE +EXE=.exe +# default extension for OBJ files +OBJ=obj + + +SUFFIX= w# # by default, this makefile produces nasmw.exe and ndisasmw.exe + + +# Builds C files to OBJ +.c.$(OBJ): + $(CC) $(CCFLAGS) $*.c + + +NASMOBJS = nasm.$(OBJ) nasmlib.$(OBJ) float.$(OBJ) insnsa.$(OBJ) \ + assemble.$(OBJ) labels.$(OBJ) parser.$(OBJ) outform.$(OBJ) \ + outbin.$(OBJ) outaout.$(OBJ) outcoff.$(OBJ) outelf.$(OBJ) \ + outobj.$(OBJ) outas86.$(OBJ) outrdf.$(OBJ) outdbg.$(OBJ) \ + outrdf2.$(OBJ) zoutieee.$(OBJ) \ + preproc.$(OBJ) listing.$(OBJ) eval.$(OBJ) + +NDISASMOBJS = ndisasm.$(OBJ) disasm.$(OBJ) sync.$(OBJ) nasmlib.$(OBJ) \ + insnsd.$(OBJ) + + +BuildAll: nasm$(SUFFIX)$(EXE) ndisasm$(SUFFIX)$(EXE) + + +# NASM +nasm$(SUFFIX)$(EXE): $(NASMOBJS) + $(LINK) $(LINKFLAGS) @&&| #open temp response file + $(STARTUP) $** + nasm$(SUFFIX)$(EXE) + # default MAP file name for EXE + $(LIBRARIES) +| # close temp file, first column! + + +# NDISASM +ndisasm$(SUFFIX)$(EXE): $(NDISASMOBJS) + $(LINK) $(LINKFLAGS) @&&| #open temp response file + $(STARTUP) $** + ndisasm$(SUFFIX)$(EXE) + # default MAP file name for EXE + $(LIBRARIES) +| # close temp file, first column! + + +# OBJs with dependencies +assemble.$(OBJ): assemble.c nasm.h insnsi.h assemble.h insns.h +disasm.$(OBJ): disasm.c nasm.h insnsi.h disasm.h sync.h insns.h names.c insnsn.c +eval.$(OBJ): eval.c nasm.h insnsi.h nasmlib.h eval.h +float.$(OBJ): float.c nasm.h insnsi.h +insnsa.$(OBJ): insnsa.c nasm.h insnsi.h insns.h +insnsd.$(OBJ): insnsd.c nasm.h insnsi.h insns.h +labels.$(OBJ): labels.c nasm.h insnsi.h nasmlib.h +listing.$(OBJ): listing.c nasm.h insnsi.h nasmlib.h listing.h +nasm.$(OBJ): nasm.c nasm.h insnsi.h nasmlib.h parser.h assemble.h labels.h \ + listing.h outform.h +nasmlib.$(OBJ): nasmlib.c nasm.h insnsi.h nasmlib.h +ndisasm.$(OBJ): ndisasm.c nasm.h insnsi.h sync.h disasm.h +outas86.$(OBJ): outas86.c nasm.h insnsi.h nasmlib.h +outaout.$(OBJ): outaout.c nasm.h insnsi.h nasmlib.h +outbin.$(OBJ): outbin.c nasm.h insnsi.h nasmlib.h +outcoff.$(OBJ): outcoff.c nasm.h insnsi.h nasmlib.h +outdbg.$(OBJ): outdbg.c nasm.h insnsi.h nasmlib.h +outelf.$(OBJ): outelf.c nasm.h insnsi.h nasmlib.h +outobj.$(OBJ): outobj.c nasm.h insnsi.h nasmlib.h +outrdf.$(OBJ): outrdf.c nasm.h insnsi.h nasmlib.h +outrdf2.$(OBJ): outrdf2.c nasm.h insnsi.h nasmlib.h +zoutieee.$(OBJ): zoutieee.c nasm.h insnsi.h nasmlib.h +outform.$(OBJ): outform.c outform.h nasm.h insnsi.h +parser.$(OBJ): parser.c nasm.h insnsi.h nasmlib.h parser.h float.h names.c insnsn.c +preproc.$(OBJ): preproc.c macros.c preproc.h nasm.h insnsi.h nasmlib.h +sync.$(OBJ): sync.c sync.h + +clean: + del *.obj + del nasm$(SUFFIX)$(EXE) + del ndisasm$(SUFFIX)$(EXE) + diff --git a/Mkfiles/Makefile.os2 b/Mkfiles/Makefile.os2 new file mode 100644 index 0000000..3ebbac1 --- /dev/null +++ b/Mkfiles/Makefile.os2 @@ -0,0 +1,207 @@ +# Makefile for the Netwide Assembler under OS/2 (aimed at Borland C++ for OS/2) +# +# The Netwide Assembler is copyright (C) 1996 Simon Tatham and +# Julian Hall. All rights reserved. The software is +# redistributable under the licence given in the file "Licence" +# distributed in the NASM archive. +# +# This makefile is made to compile NASMOS2 and NDISASM2 +# using Borland C++ for OS/2. +# +#------------------------------------------------------------------- +# Make Directives +#------------------------------------------------------------------- +.AUTODEPEND : +.SUFFIXES : .rc .res .obj .c .cpp .asm .hlp .itl .ipf + +#------------------------------------------------------------------- +# Make Macros +#------------------------------------------------------------------- + +LIBS = c2 + os2 + +# -------------------------------------------------------------------------- +# +# c compile only +# v include full sybolic debugging information +# b force enums to be of type int +# +# -------------------------------------------------------------------------- + +CCFLAGS = /c /v /b + +CC = bcc #compiler +LINK = tlink #linker + +DCCFLAGS = /d /c /O /A #compiler flags for NDISASM + #/d=merge dupicate strings + #/c=compile only + #/O=Optimise jumps + #/A=ANSI standard C + +LINKFLAGS = /c /x #linker flags + #/c=case sIgnificance on symbols + #/x=No map file at all + +LIBRARIES = #any libaries to add, out side of the standard libary +EXE = .exe #executable file extention (keep the . as the start) +OBJ = obj #OBJ file extention + +NASM_ASM=$(CC) $(CCFLAGS) $&.c #Command line for NASM +DASM_ASM=$(CC) $(DCCFLAGS) $&.c #command line for NDISASM + +# NOTE: $& is used to create the file name, as it only gives the name it's +# self, where as using $* would have give the full path of the file it +# want's done. This becomes a problem if the OBJ files are in a seperate +# directory, becuse it will then try to find the source file in the OBJ +# dir. + +################################################################ +#The OBJ files that NASM is dependent on + +NASMOBJS = $(OBJD)nasm.$(OBJ) $(OBJD)nasmlib.$(OBJ) $(OBJD)float.$(OBJ) \ + $(OBJD)insnsa.$(OBJ) $(OBJD)assemble.$(OBJ) $(OBJD)labels.$(OBJ) \ + $(OBJD)parser.$(OBJ) $(OBJD)outform.$(OBJ) $(OBJD)preproc.$(OBJ) \ + $(OBJD)listing.$(OBJ) $(OBJD)eval.$(OBJ) $(OBJD)outrdf2.$(OBJ) $(OBJD)zoutieee.$(OBJ) + +################################################################ +#The OBJ files that NDISASM is dependent on + +NDISASMOBJS = $(OBJD)ndisasm.$(OBJ) $(OBJD)disasm.$(OBJ) $(OBJD)sync.$(OBJ) \ + $(OBJD)nasmlibd.$(OBJ) $(OBJD)insnsd.$(OBJ) + +################################################################ +#The OBJ file for the output formats. + +OUTOBJ= $(OBJD)outbin.$(OBJ) $(OBJD)outaout.$(OBJ) $(OBJD)outcoff.$(OBJ) \ + $(OBJD)outelf.$(OBJ) $(OBJD)outobj.$(OBJ) $(OBJD)outas86.$(OBJ) \ + $(OBJD)outrdf.$(OBJ) $(OBJD)outdbg.$(OBJ) + + +################################################################ +# Build everything + +all : nasmos2$(EXE) ndisasm2$(EXE) + +################################################################ +#NASM, NDISASM compile, I hope it's self explanitory + +nasmos2$(EXE): $(NASMOBJS) $(OUTOBJ) + $(LINK) $(LINKFLAGS) @&&! #command for the linker + C02 $(NASMOBJS) $(OUTOBJ) #OBJ file list + $(EXED)nasmos2$(EXE) #EXE file name + NASMOS2.MAP + $(LIBS) #Libaries needed + NASMOS2.DEF #Link Definition file +! + +ndisasm2$(EXE): $(NDISASMOBJS) + $(LINK) $(LINKFLAGS) @&&! #command for the linker + c02.obj $(NDISASMOBJS) #OBJ file list + $(EXED)ndisasm2$(EXE) #EXE file name + NDISAMS2.MAP + $(LIBS) $(LIBRARIES) #Libaries needed +! + +################################################################ +# Dependencies for all of NASM's obj files + +$(OBJD)assemble.$(OBJ): assemble.c nasm.h assemble.h insns.h + $(NASM_ASM) + +$(OBJD)float.$(OBJ): float.c nasm.h + $(NASM_ASM) + +$(OBJD)labels.$(OBJ): labels.c nasm.h nasmlib.h + $(NASM_ASM) + +$(OBJD)listing.$(OBJ): listing.c nasm.h nasmlib.h listing.h + $(NASM_ASM) + +$(OBJD)eval.$(OBJ): eval.c nasm.h nasmlib.h eval.h + $(NASM_ASM) + +$(OBJD)nasm.$(OBJ): nasm.c nasm.h nasmlib.h parser.h assemble.h labels.h \ + listing.h outform.h + $(NASM_ASM) + +$(OBJD)nasmlib.$(OBJ): nasmlib.c nasm.h nasmlib.h + $(NASM_ASM) + +$(OBJD)parser.$(OBJ): parser.c nasm.h nasmlib.h parser.h float.h names.c + $(NASM_ASM) + +$(OBJD)preproc.$(OBJ): preproc.c macros.c preproc.h nasm.h nasmlib.h + $(NASM_ASM) + +$(OBJD)insnsa.$(OBJ): insnsa.c nasm.h insns.h + $(NASM_ASM) + +################################################################ +# Dependencies for all of NDISASM's obj files + +$(OBJD)disasm.$(OBJ): disasm.c nasm.h disasm.h sync.h insns.h names.c + $(DASM_ASM) + +$(OBJD)ndisasm.$(OBJ): ndisasm.c nasm.h sync.h disasm.h + $(DASM_ASM) + +$(OBJD)sync.$(OBJ): sync.c sync.h + $(DASM_ASM) + +$(OBJD)insnsd.$(OBJ): insnsd.c nasm.h insns.h + $(DASM_ASM) + +# This is a kludge from the word go, as we can't use the nasmlib.obj compiled +# for NASM, as it's could be the wrong model size, so we have to compile it +# again as huge to make sure. +# +# So as not to overwrite the nasmlib.obj for NASM (if it did, that +# could cause all kinds of problems) it compiles it into nasmlibd.obj. +# +# the -o... switch tells it the name to compile the obj file to, right here +# $(OBJD)nasmlibd.obj + +$(OBJD)nasmlibd.$(OBJ): nasmlib.c nasm.h nasmlib.h + $(CC) $(DCCFLAGS) -o$(OBJD)nasmlibd.obj nasmlib.c + +################################################################ +# Dependencies for all of the output format's OBJ files + +$(OBJD)outas86.$(OBJ): outas86.c nasm.h nasmlib.h + $(NASM_ASM) + +$(OBJD)outaout.$(OBJ): outaout.c nasm.h nasmlib.h + $(NASM_ASM) + +$(OBJD)outbin.$(OBJ): outbin.c nasm.h nasmlib.h + $(NASM_ASM) + +$(OBJD)outcoff.$(OBJ): outcoff.c nasm.h nasmlib.h + $(NASM_ASM) + +$(OBJD)outdbg.$(OBJ): outdbg.c nasm.h nasmlib.h + $(NASM_ASM) + +$(OBJD)outelf.$(OBJ): outelf.c nasm.h nasmlib.h + $(NASM_ASM) + +$(OBJD)outobj.$(OBJ): outobj.c nasm.h nasmlib.h + $(NASM_ASM) + +$(OBJD)outrdf.$(OBJ): outrdf.c nasm.h nasmlib.h + $(NASM_ASM) + +$(OBJD)outform.$(OBJ): outform.c outform.h nasm.h + $(NASM_ASM) + +################################################################ +# A quick way to delete the OBJ files as well as the binaries. + +clean : + del $(OBJD)*.obj + del nasmos2$(EXE) + del ndisasm2$(EXE) + +# Makefile created by Chuck Crayne --05/4/99 +# Based on Makefile.bc2 by Fox Cutter --01/27/97 diff --git a/Wishlist b/Wishlist index b1529bf..4fbcbcf 100644 --- a/Wishlist +++ b/Wishlist @@ -12,13 +12,17 @@ have this done by. ? means I haven't looked at it yet. - Package the Linux Assembler HOWTO. 0.98 -- AMD 3dNow extensions need documenting. 0.98 +- 3DNow!, SSE and other extensions need documenting. 0.98 + hpa: Does it really make sense to have a whole instruction set + reference packaged with the assembler? - prototypes of lrotate don't match in test/*. Fix. 0.98 - Build djgpp binaries for 0.98 onwards. Look into PMODE/W as a stub 0.98 - it might be a lot better than CWSDPMI. It's in PMW133.ZIP. +- %undef operator that goes along with %define DONE + - Fix `%error' giving error messages twice. 0.99 Not especially important, as changes planned for 1.1x below will make the preprocessor be only called once. @@ -105,9 +109,9 @@ have this done by. ? means I haven't looked at it yet. set to be written that allows the same source files to be assembled with NASM and TASM. -- Add the UD2 instruction. ? +- Add the UD2 instruction. DONE -- Add the four instructions documented in 24368901.pdf (Intel's own ? +- Add the four instructions documented in 24368901.pdf (Intel's own DONE document). - Some means of avoiding MOV memoffs,EAX which apparently the 1.10? @@ -177,6 +181,8 @@ have this done by. ? means I haven't looked at it yet. - Arbitrary section names in `bin'. ? Is this necessary? Is it even desirable? + hpa: Desirable, yes. Necessary? Probably not, but there are + definitely cases where it becomes quite useful. - Ability to read from a pipe. Obviously not useful under dos, so 1.10 memory problems with storing entire input file aren't a problem @@ -240,8 +246,10 @@ have this done by. ? means I haven't looked at it yet. undocumented flags in the instruction table. When this happens, consider allowing PMULHRW to map to either of the Cyrix or AMD versions? + hpa: The -p option to ndisasm now uses this to some extent. - Maybe NEC V20/V30 instructions? ? + hpa: What are they? Should be trivial to implement. - Yet more object formats. * Possibly direct support for .EXE files? 1.10 @@ -262,7 +270,10 @@ have this done by. ? means I haven't looked at it yet. byte code; probably ARM/StrongARM; maybe Sparc; maybe Mips; maybe Vax. Perhaps Z80 and 6502, just for a laugh? -- Consider a 'verbose' option that prints information about the resulting ? - object file onto stdout. +- Consider a 'verbose' option that prints information about the ? + resulting object file onto stdout. +- Line numbers in the .lst file don't match the line numbers in the ? + input. They probably should, rather than the current matching + of the post-preprocessor line numbers. diff --git a/changed.asm b/changed.asm index 88255f0..b0fd424 100644 --- a/changed.asm +++ b/changed.asm @@ -307,8 +307,23 @@ arg_example2 arg2 sqrtps xmm0,[ebx+10] ; SSE opcode paddsiw mm0,[ebx+10] ; Cyrix opcode with the same byte seq. +;----------------------------------------------------------------------------- +; Enhancement by hpa in preproc.c +; +; Support %undef to remoce a single-line macro +; +%define TEST_ME 42 +%ifndef TEST_ME +%error "TEST_ME not defined after %define" +%endif + +%undef TEST_ME +%ifdef TEST_ME +%error "TEST_ME defined after %undef" %endif +%endif ; oldmsg + %ifdef oldcrash ;************************************************************* This_label_is_256_characters_long__There_used_to_be_a_bug_in_stdscan_which_made_it_crash_when_it_did_a_keyword_search_on_any_label_longer_than_255_characters__Now_anything_longer_than_MAX_KEYWORD_is_always_a_symbol__It_will_not_even_try_a_keyword_search___ diff --git a/configure.in b/configure.in index b5fb0e1..80e9b38 100644 --- a/configure.in +++ b/configure.in @@ -62,6 +62,10 @@ else fi AC_SUBST(GCCFLAGS) +dnl Look for "nroff" or "groff" +AC_CHECK_PROGS(NROFF, groff nroff, echo) +AC_SUBST(NROFF) + dnl Checks for header files. AC_HEADER_STDC if test $ac_cv_header_stdc = no; then diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..572ca57 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,28 @@ +# +# Makefile for NASM documentation + +SRCS = nasmdoc.src +OUT = nasm.info + +all: $(OUT) + +.SUFFIXES: .src .texi .info .ps .rtf .hpj .ps .txt .pl + +# Consider html, txt and src output a side effect +.src.texi: + -mkdir html + perl ./rdsrc.pl < $< + mv -f *.html html + +nasm.info: nasmdoc.texi + -mkdir info + makeinfo $< + mv -f *.info *.info-* info + +clean: + -rm -f *.rtf *.hpj *.texi + +spotless: clean + -rm -rf html info *.hlp *.txt *.ps + + diff --git a/insns.dat b/insns.dat index 4427e14..350adec 100644 --- a/insns.dat +++ b/insns.dat @@ -9,7 +9,11 @@ ; line. Hence `void' for no-operand instructions, and `\0' for such ; as EQU. If the last three fields are all `ignore', no action is ; taken except to register the opcode as being present. - +; +; For a detailed description of the code string (third field), please +; see the comment at the top of assemble.c. For a detailed description +; of the flags (fourth field), please see insns.h. +; AAA void \1\x37 8086 AAD void \2\xD5\x0A 8086 AAD imm \1\xD5\24 8086,SB @@ -1271,10 +1275,11 @@ PAVGB mmxreg,mem \301\2\x0F\xE0\110 KATMAI,MMX,SM PAVGW mmxreg,mmxreg \2\x0F\xE3\110 KATMAI,MMX PAVGW mmxreg,mem \301\2\x0F\xE3\110 KATMAI,MMX,SM PEXTRW reg32,mmxreg,imm8 \2\x0F\xC5\110\22 KATMAI,MMX -; This is documented as using a reg32, but it's really using only 16 bits -- accept either +; PINSRW is documented as using a reg32, but it's really using only 16 bit +; -- accept either PINSRW mmxreg,reg16,imm8 \2\x0F\xC4\110\22 KATMAI,MMX PINSRW mmxreg,reg32,imm8 \2\x0F\xC4\110\22 KATMAI,MMX -PINSRW mmxreg,mem16,imm8 \301\2\x0F\xC4\110\22 KATMAI,MMX,SM +PINSRW mmxreg,mem16,imm8 \301\2\x0F\xC4\110\22 KATMAI,MMX PMAXSW mmxreg,mmxreg \2\x0F\xEE\110 KATMAI,MMX PMAXSW mmxreg,mem \301\2\x0F\xEE\110 KATMAI,MMX,SM PMAXUB mmxreg,mmxreg \2\x0F\xDE\110 KATMAI,MMX diff --git a/nasm.1 b/nasm.1 index 051da48..a69723c 100644 --- a/nasm.1 +++ b/nasm.1 @@ -53,6 +53,20 @@ to preprocess the given input file, and write the output to (or the specified output file name), and not actually assemble anything. .TP +.B \-M +Causes +.B nasm +to output Makefile-style dependencies to stdout; normal output is +suppressed. +.TP +.BI \-E " filename" +Causes +.B nasm +to redirect error messages to +.IR filename . +This option exists to support operating systems on which stderr is not +easily redirected. +.TP .BI \-r Causes .B nasm diff --git a/nasm.c b/nasm.c index 1404db1..0a03c7b 100644 --- a/nasm.c +++ b/nasm.c @@ -43,6 +43,8 @@ static int globallineno; /* for forward-reference tracking */ static int pass; static struct ofmt *ofmt = NULL; +static FILE *error_file = stderr; /* Where to write error messages */ + static FILE *ofile = NULL; static int sb = 16; /* by default */ @@ -57,7 +59,12 @@ static struct SAA *forwrefs; /* keep track of forward references */ static struct forwrefinfo *forwref; static Preproc *preproc; -static int preprocess_only; +enum op_type { + op_normal, /* Preprocess and assemble */ + op_preprocess, /* Preprocess only */ + op_depend /* Generate dependencies */ +}; +static enum op_type operating_mode; /* used by error function to report location */ @@ -131,7 +138,8 @@ int main(int argc, char **argv) forwrefs = saa_init ((long)sizeof(struct forwrefinfo)); preproc = &nasmpp; - preprocess_only = FALSE; + operating_mode = op_normal; + seg_init(); @@ -151,52 +159,70 @@ int main(int argc, char **argv) parser_global_info (ofmt, &location); eval_global_info (ofmt, lookup_label, &location); - if (preprocess_only) - { + switch ( operating_mode ) { + case op_depend: + { char *line; - char *file_name = NULL; - long prior_linnum=0; - int lineinc=0; - - if (*outname) { - ofile = fopen(outname, "w"); - if (!ofile) - report_error (ERR_FATAL | ERR_NOFILE, - "unable to open output file `%s'", outname); - } else - ofile = NULL; - - location.known = FALSE; - - preproc->reset (inname, 2, report_error, evaluate, &nasmlist); - while ( (line = preproc->getline()) ) { - /* - * We generate %line directives if needed for later programs - */ - long linnum = prior_linnum += lineinc; - int altline = src_get(&linnum, &file_name); - if (altline) { - if (altline==1 && lineinc==1) - nasm_fputs("", ofile); - else { - lineinc = (altline != -1 || lineinc!=1); - fprintf(ofile ? ofile : stdout, "%%line %ld+%d %s\n", - linnum, lineinc, file_name); - } - prior_linnum = linnum; - } - nasm_fputs(line, ofile); - nasm_free (line); - } - nasm_free(file_name); + preproc->reset (inname, 0, report_error, evaluate, &nasmlist); + if (outname[0] == '\0') + ofmt->filename (inname, outname, report_error); + ofile = NULL; + printf("%s: %s", outname, inname); + while ( (line = preproc->getline()) ) + nasm_free (line); preproc->cleanup(); - if (ofile) - fclose(ofile); - if (ofile && terminate_after_phase) - remove(outname); - } - else /* NOT preprocess only */ + putc('\n', stdout); + } + break; + + case op_preprocess: { + char *line; + char *file_name = NULL; + long prior_linnum=0; + int lineinc=0; + + if (*outname) { + ofile = fopen(outname, "w"); + if (!ofile) + report_error (ERR_FATAL | ERR_NOFILE, + "unable to open output file `%s'", outname); + } else + ofile = NULL; + + location.known = FALSE; + + preproc->reset (inname, 2, report_error, evaluate, &nasmlist); + while ( (line = preproc->getline()) ) { + /* + * We generate %line directives if needed for later programs + */ + long linnum = prior_linnum += lineinc; + int altline = src_get(&linnum, &file_name); + if (altline) { + if (altline==1 && lineinc==1) + nasm_fputs("", ofile); + else { + lineinc = (altline != -1 || lineinc!=1); + fprintf(ofile ? ofile : stdout, "%%line %ld+%d %s\n", + linnum, lineinc, file_name); + } + prior_linnum = linnum; + } + nasm_fputs(line, ofile); + nasm_free (line); + } + nasm_free(file_name); + preproc->cleanup(); + if (ofile) + fclose(ofile); + if (ofile && terminate_after_phase) + remove(outname); + } + break; + + case op_normal: + { /* * We must call ofmt->filename _anyway_, even if the user * has specified their own output file, because some @@ -205,46 +231,48 @@ int main(int argc, char **argv) * file. */ ofmt->filename (inname, outname, report_error); - + ofile = fopen(outname, "wb"); if (!ofile) { - report_error (ERR_FATAL | ERR_NOFILE, - "unable to open output file `%s'", outname); + report_error (ERR_FATAL | ERR_NOFILE, + "unable to open output file `%s'", outname); } - + /* * We must call init_labels() before ofmt->init() since * some object formats will want to define labels in their * init routines. (eg OS/2 defines the FLAT group) */ init_labels (); - + ofmt->init (ofile, report_error, define_label, evaluate); - + assemble_file (inname); - + if (!terminate_after_phase) { - ofmt->cleanup (using_debug_info); - cleanup_labels (); + ofmt->cleanup (using_debug_info); + cleanup_labels (); } else { - - /* - * We had an fclose on the output file here, but we - * actually do that in all the object file drivers as well, - * so we're leaving out the one here. - * fclose (ofile); - */ - - remove(outname); - if (listname[0]) - remove(listname); + + /* + * We had an fclose on the output file here, but we + * actually do that in all the object file drivers as well, + * so we're leaving out the one here. + * fclose (ofile); + */ + + remove(outname); + if (listname[0]) + remove(listname); } + } + break; } - + if (want_usage) - usage(); - + usage(); + raa_free (offsets); saa_free (forwrefs); eval_cleanup (); @@ -303,8 +331,10 @@ static int process_arg (char *p, char *q) case 'f': case 'p': case 'd': + case 'D': case 'i': case 'l': + case 'E': case 'F': if ( !(param = get_param (p, q, &advance)) ) break; @@ -322,12 +352,22 @@ static int process_arg (char *p, char *q) ofmt->current_dfmt = ofmt->debug_formats[0]; } else if (p[1]=='p') { /* pre-include */ pp_pre_include (param); - } else if (p[1]=='d') { /* pre-define */ + } else if (p[1]=='D' || p[1]=='d') { /* pre-define */ pp_pre_define (param); + } else if (p[1]=='U' || p[1]=='u') { /* un-define */ + pp_pre_undefine (param); } else if (p[1]=='i') { /* include search path */ pp_include_path (param); } else if (p[1]=='l') { /* listing file */ strcpy (listname, param); + } else if (p[1]=='E') { /* error messages file */ + error_file = fopen(param, "wt"); + if ( !error_file ) { + error_file = stderr; /* Revert to default! */ + report_error (ERR_FATAL | ERR_NOFILE | ERR_USAGE, + "cannot open file `%s' for error messages", + param); + } } else if (p[1] == 'F') { /* specify debug format */ ofmt->current_dfmt = dfmt_find(ofmt, param); if (!ofmt->current_dfmt) { @@ -344,18 +384,20 @@ static int process_arg (char *p, char *q) case 'h': printf("usage: nasm [-@ response file] [-o outfile] [-f format] " "[-l listfile]\n" - " [options...] [--] filename\n"); - printf(" or nasm -r for version info\n\n"); - printf(" -e preprocess only (writes output to " - "stdout by default)\n" - " -a don't preprocess\n\n"); - printf(" -g enable debug info\n" - " -F format select a debugging format\n\n"); - printf(" -i adds a pathname to the include file path\n" + " [options...] [--] filename\n" + " or nasm -r for version info\n\n" + " -e preprocess only (writes output to stdout by default)\n" + " -a don't preprocess (assemble only)\n" + " -M generate Makefile dependencies on stdout\n\n" + " -E redirect error messages to file\n\n" + " -g enable debug info\n" + " -F format select a debugging format\n\n" + " -i adds a pathname to the include file path\n" " -p pre-includes a file\n" - " -d[=] pre-defines a macro\n"); - printf(" -w+foo enables warnings about foo; " - "-w-foo disables them\n where foo can be:\n"); + " -d[=] pre-defines a macro\n" + " -u undefines a macro\n" + " -w+foo enables warnings about foo; -w-foo disables them\n" + "where foo can be:\n"); for (i=1; i<=ERR_WARN_MAX; i++) printf(" %-16s%s (default %s)\n", suppressed_names[i], suppressed_what[i], @@ -388,7 +430,7 @@ static int process_arg (char *p, char *q) exit (0); /* never need usage message here */ break; case 'e': /* preprocess only */ - preprocess_only = TRUE; + operating_mode = op_preprocess; break; case 'a': /* assemble only - don't preprocess */ preproc = &no_pp; @@ -408,6 +450,9 @@ static int process_arg (char *p, char *q) "invalid option to `-w'"); } break; + case 'M': + operating_mode = op_depend; + break; default: if (!ofmt->setinfo(GI_SWITCH,&p)) report_error (ERR_NONFATAL | ERR_NOFILE | ERR_USAGE, @@ -1165,23 +1210,23 @@ static void report_error (int severity, char *fmt, ...) return; if (severity & ERR_NOFILE) - fputs ("nasm: ", stdout); + fputs ("nasm: ", error_file); else { char * currentfile = NULL; long lineno = 0; src_get (&lineno, ¤tfile); - fprintf (stdout, "%s:%ld: ", currentfile, lineno); + fprintf (error_file, "%s:%ld: ", currentfile, lineno); nasm_free (currentfile); } if ( (severity & ERR_MASK) == ERR_WARNING) - fputs ("warning: ", stdout); + fputs ("warning: ", error_file); else if ( (severity & ERR_MASK) == ERR_PANIC) - fputs ("panic: ", stdout); + fputs ("panic: ", error_file); va_start (ap, fmt); - vfprintf (stdout, fmt, ap); - fputc ('\n', stdout); + vfprintf (error_file, fmt, ap); + fputc ('\n', error_file); if (severity & ERR_USAGE) want_usage = TRUE; @@ -1203,6 +1248,7 @@ static void report_error (int severity, char *fmt, ...) exit(1); /* instantly die */ break; /* placate silly compilers */ case ERR_PANIC: + fflush(NULL); abort(); /* halt, catch fire, and dump core */ break; } @@ -1210,7 +1256,7 @@ static void report_error (int severity, char *fmt, ...) static void usage(void) { - fputs("type `nasm -h' for help\n", stdout); + fputs("type `nasm -h' for help\n", error_file); } static void register_output_formats(void) diff --git a/nasm.h b/nasm.h index 1b38ab7..eca40fb 100644 --- a/nasm.h +++ b/nasm.h @@ -13,7 +13,7 @@ #define NASM_MAJOR_VER 0 #define NASM_MINOR_VER 98 -#define NASM_VER "0.98 pre-release 3.7 (hpa)" +#define NASM_VER "0.98 pre-release 6" #ifndef NULL #define NULL 0 diff --git a/ndisasm.c b/ndisasm.c index 99e943a..79e3ad5 100644 --- a/ndisasm.c +++ b/ndisasm.c @@ -172,6 +172,9 @@ int main(int argc, char **argv) prefer = IF_AMD|IF_3DNOW; } else if ( !strcmp(v, "cyrix") ) { prefer = IF_CYRIX|IF_3DNOW; + } else if ( !strcmp(v, "idt") || !strcmp(v, "centaur") || + !strcmp(v, "winchip") ) { + prefer = IF_3DNOW; } else { fprintf(stderr, "%s: unknown vendor `%s' specified with `-p'\n", pname, v); return 1; diff --git a/preproc.c b/preproc.c index 4460907..1a4fa0d 100644 --- a/preproc.c +++ b/preproc.c @@ -268,7 +268,7 @@ static char *directives[] = { "%ifctx", "%ifdef", "%ifid", "%ifidn", "%ifidni", "%ifnctx", "%ifndef", "%ifnid", "%ifnidn", "%ifnidni", "%ifnnum", "%ifnstr", "%ifnum", "%ifstr", "%imacro", "%include", "%line", - "%macro", "%pop", "%push", "%rep", "%repl", "%rotate" + "%macro", "%pop", "%push", "%rep", "%repl", "%rotate", "%undef" }; enum { PP_ASSIGN, PP_CLEAR, PP_DEFINE, PP_ELIF, PP_ELIFCTX, PP_ELIFDEF, @@ -279,7 +279,7 @@ enum { PP_IFCTX, PP_IFDEF, PP_IFID, PP_IFIDN, PP_IFIDNI, PP_IFNCTX, PP_IFNDEF, PP_IFNID, PP_IFNIDN, PP_IFNIDNI, PP_IFNNUM, PP_IFNSTR, PP_IFNUM, PP_IFSTR, PP_IMACRO, PP_INCLUDE, PP_LINE, - PP_MACRO, PP_POP, PP_PUSH, PP_REP, PP_REPL, PP_ROTATE + PP_MACRO, PP_POP, PP_PUSH, PP_REP, PP_REPL, PP_ROTATE, PP_UNDEF }; @@ -290,7 +290,7 @@ static IncPath *ipath = NULL; static efunc error; static evalfunc evaluate; -static int pass; +static int pass; /* HACK: pass 0 = generate dependencies only */ static unsigned long unique; /* unique identifier numbers */ @@ -878,10 +878,21 @@ static FILE *inc_fopen(char *file) FILE *fp; char *prefix = "", *combine; IncPath *ip = ipath; + static int namelen = 0; while (1) { combine = nasm_strcat(prefix,file); fp = fopen(combine, "r"); + if (pass == 0 && fp) + { + namelen += strlen(combine) + 1; + if (namelen > 62) + { + printf(" \\\n "); + namelen = 2; + } + printf(" %s", combine); + } nasm_free (combine); if (fp) return fp; @@ -1060,7 +1071,8 @@ static int if_condition (Token *tline, int i) while (tok_isnt_(tt, ",")) tt = tt->next; if (!tt) { - error(ERR_NONFATAL, "`%s' expects two comma-separated arguments"); + error(ERR_NONFATAL, "`%s' expects two comma-separated arguments", + directives[i]); free_tlist (tline); return -1; } @@ -1829,6 +1841,56 @@ static int do_directive (Token *tline) free_tlist (origline); return 3; + case PP_UNDEF: + tline = tline->next; + skip_white_(tline); + if (!tline || (tline->type != TOK_ID && + (tline->type != TOK_PREPROC_ID || + tline->text[1] != '$'))) { + error (ERR_NONFATAL, + "`%%undef' expects a macro identifier"); + free_tlist (origline); + return 3; + } + mname = tline->text; + if (tline->type == TOK_ID) { + p = tline->text; + smhead = &smacros[hash(mname)]; + } else { + ctx = get_ctx (tline->text); + if (ctx == NULL) { + free_tlist (origline); + return 3; + } else { + p = tline->text+1; + p += strspn(p, "$"); + smhead = &ctx->localmac; + } + } + last = tline; + tline = tline->next; + last->next = NULL; + + if (tline) + error(ERR_WARNING, + "trailing garbage after macro name ignored"); + + /* + * We now have a macro name... go hunt for it. + */ + if (smacro_defined (mname, 0, &smac, 1) && smac) { + /* Defined, so we need to find its predecessor and nuke it */ + SMacro **s; + for ( s = smhead ; *s && *s != smac ; s = &(*s)->next ); + if ( *s ) { + *s = smac->next; + nasm_free(smac->name); + free_tlist(smac->expansion); + nasm_free(smac); + } + } + return 3; + case PP_ASSIGN: case PP_IASSIGN: tline = tline->next; @@ -3046,6 +3108,29 @@ void pp_pre_define (char *definition) predef = l; } +void pp_pre_undefine (char *definition) +{ + Token *def, *space; + Line *l; + + def = nasm_malloc(sizeof(Token)); + def->next = space = nasm_malloc(sizeof(Token)); + space->next = tokenise(definition); + + def->type = TOK_PREPROC_ID; + def->text = nasm_strdup("%undef"); + space->type = TOK_WHITESPACE; + space->text = nasm_strdup(" "); + + def->mac = space->mac = NULL; + + l = nasm_malloc(sizeof(Line)); + l->next = predef; + l->first = def; + l->finishes = FALSE; + predef = l; +} + void pp_extra_stdmac (char **macros) { extrastdmac = macros; diff --git a/preproc.h b/preproc.h index c70548f..e2756cc 100644 --- a/preproc.h +++ b/preproc.h @@ -12,6 +12,7 @@ void pp_include_path (char *); void pp_pre_include (char *); void pp_pre_define (char *); +void pp_pre_undefine (char *); void pp_extra_stdmac (char **); extern Preproc nasmpp;