summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MODIFIED27
-rw-r--r--Makefile.in2
-rw-r--r--changes.asm608
-rw-r--r--insns.dat43
-rw-r--r--insns.pl63
-rw-r--r--nasm.h2
-rw-r--r--preproc.c31
-rw-r--r--rdoff/Makefile.in2
8 files changed, 398 insertions, 380 deletions
diff --git a/MODIFIED b/MODIFIED
index b91f956e..4e7b5ab2 100644
--- a/MODIFIED
+++ b/MODIFIED
@@ -2,22 +2,34 @@ This is a modified version of NASM, modified and released by H. Peter
Anvin <hpa@zytor.com>; it is not the original form released by the
NASM authors.
+For release 0.98p3.3:
-For release 0.98.3.2:
+* Patch from Conan Brink to allow nesting of %rep directives.
+* If we're going to allow INT01 as an alias for INT1/ICEBP (one of
+ John's J4 changes), then we should allow INT03 as an alias for INT3
+ as well.
+* Updated changes.asm to include the latest changes.
+* Tried to clean up the <CR>s that had snuck in from a DOS/Windows
+ environment into my Unix environment, and try to make sure than
+ DOS/Windows users get them back.
+* We would silently generate broken tools if insns.dat wasn't sorted
+ properly. Change insns.pl so that the order doesn't matter.
+* Fix bug in insns.pl (introduced by me) which would cause conditional
+ instructions to have an extra "cc" in disassembly, e.g. "jnz"
+ disassembled as "jccnz".
+
+
+For release 0.98p3.2:
* Merged in John S. Fine's changes from his 0.98-J4 prerelease; see
http://www.csoft.net/cz/johnfine/
-
* Changed previous "spotless" Makefile target (appropriate for distribution)
to "distclean", and added "cleaner" target which is same as "clean"
except deletes files generated by Perl scripts; "spotless" is union.
-
* Removed BASIC programs from distribution. Get a Perl interpreter
instead (see below.)
-
* Calling this "pre-release 3.2" rather than "p3-hpa2" because of
John's contributions.
-
* Actually link in the IEEE output format (zoutieee.c); fix a bunch of
compiler warnings in that file. Note I don't know what IEEE output
is supposed to look like, so these changes were made "blind".
@@ -27,17 +39,16 @@ For release 0.98p3-hpa:
* Merged nasm098p3.zip with nasm-0.97.tar.gz to create a fully
buildable version for Unix systems (Makefile.in updates, etc.)
-
* Changed insns.pl to create the instruction tables in nasm.h and
names.c, so that a new instruction can be added by adding it *only*
to insns.dat.
-
* Added the following new instructions: SYSENTER, SYSEXIT, FXSAVE,
FXRSTOR, UD1, UD2 (the latter two are two opcodes that Intel
guarantee will never be used; one of them is documented as UD2 in
Intel documentation, the other one just as "Undefined Opcode" --
calling it UD1 seemed to make sense.)
-
+* MAX_SYMBOL was defined to be 9, but LOADALL286 and LOADALL386 are 10
+ characters long. Now MAX_SYMBOL is derived from insns.dat.
* A note on the BASIC programs included: forget them. insns.bas is
already out of date. Get yourself a Perl interpreter for your
platform of choice at:
diff --git a/Makefile.in b/Makefile.in
index 750eb8a3..ce7b47d4 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -91,7 +91,7 @@ clean:
cd rdoff; $(MAKE) clean
distclean: clean
- rm -f config.* Makefile *~
+ rm -f config.* Makefile *~ *.bak changes.lst changes.bin
cd rdoff; $(MAKE) distclean
cleaner: clean
diff --git a/changes.asm b/changes.asm
index 3ae24edf..3c2edfdf 100644
--- a/changes.asm
+++ b/changes.asm
@@ -1,292 +1,316 @@
-;This file demonstrates many of the differences between NASM version X and NASM
-;version 0.97
-;
-; changes.asm is copyright (C) 1998 John S. Fine
-;
-; It may be redistributed under the same conditions as NASM as described in
-; Licence file in the NASM archive
-;_________________________________
-;
-; nasm changes.asm -l changes.lst
-;
-; When assembled without any -d switches, it includes examples which:
-; Work correctly in version X
-; and Work incorrectly and/or display warnings in version 0.97
-; and Do not prevent the generation of output in version 0.97
-;
-; Not all the differences can be seen in the .lst file. I suggest that you use
-; "ndisasm changes" to examine the code actually generated.
-;_________________________________
-;
-; nasm changes.asm -l changes.lst -doldmsg
-;
-; When assembled with -doldmsg, it adds examples which:
-; Work correctly in version X
-; and Generate error messages in version 0.97 and do not generate output
-;_________________________________
-;
-; nasm changes.asm -l changes.lst -doldcrash
-;
-; When assembled with -doldcrash, it adds examples which:
-; Work correctly in version X
-; and Cause NASM to crash in version 0.97
-;_________________________________
-;
-; nasm changes.asm -l changes.lst -dnewmsg
-;
-; When assembled with -dnewmsg, it adds examples which:
-; Generate error messages in version X
-; and Generate wrong output without warning or error message in version 0.97
-;-----------------------------------------------------------------------------
-
-; Please note that I have reported the name of the person who made the
-; correction based on very limited information. In several cases, I am sure I
-; will identify the wrong author. Please send me any corrections; I don't
-; intend to insult or exclude anyone.
-
-;-----------------------------------------------------------------------------
-; Bug fixed by Simon in assemble()
-;
-; The following generated "call next" / "call next-1" instead of
-; two copies of "call next"
-;
- times 2 a16 call next
-next:
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in parse_line() (and other routines)
-;
-; This used to jmp to prior.1, when it should be here.1
-;
-prior:
-.1:
-here: jmp .1
-.1:
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in assemble()
-;
-; Strings used in dq and dt were not zero filled correctly
-;
- dq 'b'
-
-
-;-----------------------------------------------------------------------------
-; Bug fixed by Simon in isn_names[]
-;
-; Was not recognised as an instruction
-;
- int01
-
-;-----------------------------------------------------------------------------
-; Bug fixed by Jim Hague in ???
-;
-; Forward references were instruction level rather than per operand
-;
- shr word [forwardref],1
-forwardref:
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in preproc.c
-;
-; It used to silently discard id characters appended to a multi-line
-; macro parameter (such as the x in %1x below).
-;
-%macro xxx 1
-%1: nop
-%{1}x: jmp %1x
-%endmacro
-xxx yyy
-
-%ifdef oldmsg
-;***************************************************************
-;
-; The following examples will generate error messages in 0.97 and will generate
-; correct output in the new version.
-
-;-----------------------------------------------------------------------------
-; Bug fixed by Simon in isns.dat
-;
-; The optional "near" was not permitted on JMP and CALL
-;
- jmp near here
-
-;-----------------------------------------------------------------------------
-; Feature added by Simon in stdscan()
-;
-; You can now use the numeric value of strings in %assign
-;
-%assign xxx 'ABCD'
- dd xxx
-
-;-----------------------------------------------------------------------------
-; Feature added by John in add_vectors()
-;
-; Stranger address expressions are now supported as long as they resolve to
-; something valid.
-;
- mov ax, [eax + ebx + ecx - eax]
-
-;-----------------------------------------------------------------------------
-; Bug fixed by Simon in ???
-;
-; The EQU directive affected local labels in a way that was inconsistent
-; between passes
-;
-.local:
-neither equ $
- jmp .local
-
-;-----------------------------------------------------------------------------
-; Feature added by Jules in parse_line
-;
-; You can override a size specifier
-;
-%define arg1 dword [bp+4]
- cmp word arg1, 2
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in preproc.c
-;
-; You could not use a label on the same line with a macro invocation, if the
-; macro definition began with a preprocessor directive.
-;
- struc mytype
-.long resd 1
- endstruc
-
-lbl istruc mytype
- at mytype.long, dd 'ABCD'
- iend
-
-;-----------------------------------------------------------------------------
-; Warning removed by John in preproc.c
-;
-; In order to allow macros that extend the definition of instructions, I
-; disabled the warning on a multi-line macro referencing itself.
-;
-%endif ;NASM 0.97 doesn't handle %0 etc. inside false %if
-%macro push 1-* ;
-%rep %0 ;
-push %1 ;
-%rotate 1 ;
-%endrep ;
-%endmacro ;
-%ifdef oldmsg ;
-
- push ax,bx
-
-;-----------------------------------------------------------------------------
-; Warning removed by John in preproc.c
-;
-; To support other types of macros that extend the definition of instructions,
-; I disabled the warning on a multi-line macro called with the wrong number of
-; parameters. PUSH and POP can be extended equally well by either method, but
-; other intruction extensions may need one method or the other, so I made both
-; work.
-;
-; Note that neither of these warnings was really needed, because a later stage
-; of NASM would almost always give an adequate error message if the macro use
-; really was wrong.
-;
-%endif
-%macro pop 2-*
-%rep %0
-pop %1
-%rotate 1
-%endrep
-%endmacro
-%ifdef oldmsg
-
- pop ax,bx
-%endif
-
-
-%ifdef newmsg ;***************************************************************
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in parse_line() (and other routines)
-;
-; This invalid code used to assemble without errors
-;
-myself equ myself+1
- jmp myself
-
-;-----------------------------------------------------------------------------
-; Change made by John in preproc.c
-;
-; In 0.97, an id that appears as a label on a macro invocation was always
-; prepended to the first line of the macro expansion. That caused several
-; bugs, but also could be used in tricks like the arg macro in c16.mac and
-; c32.mac.
-;
-; In version X, an id that appears as a label on a macro invocation will
-; normally be defined as a label for the address at which the macro is
-; invoked, regardless of whether the first line of the macro expansion is
-; something that can take a label. The new token %00 may be used for any
-; of the situations in which the old prepend behavior was doing something
-; tricky but useful. %00 can also be used more than once and in places
-; other than the start of the expansion.
-;
-%endif
-%assign arg_off 0
-
-%imacro arg 0-1 2 ;arg defined the old way
- equ arg_off
-%assign arg_off %1+arg_off
-%endmacro
-
-%ifdef newmsg
-arg_example arg
-%endif
-
-%imacro arg2 0-1 2 ;arg defined the new way
-%00 equ arg_off
-%assign arg_off %1+arg_off
-%endmacro
-
-%ifdef oldmsg
-arg_example2 arg2
-
-;-----------------------------------------------------------------------------
-; Change made by Jules and John in INSNS.DAT
-;
-; Various instruction in which the size of an immediate is built-in to the
-; instruction set, now allow you to redundantly specify that size as long
-; as you specify it correctly
-;
- AAD byte 5
- AAM byte 5
- BT bx, byte 3
- BTC cx, byte 4
- BTR dx, byte 5
- BTS si, byte 6
- IN eax, byte 0x40
- INT byte 21h
- OUT byte 70h, ax
- RET word 2
- RETN word 2
- RETF word 4
-
-; note "ENTER" has not been changed yet.
-
-%endif
-
-%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___
-
-;-----------------------------------------------------------------------------
-; Bug fixed by John in preproc.c
-;
-; Builds of NASM that prohibit dereferencing a NULL pointer used to crash if a
-; macro that started with a blank line was invoked with a label
-;
-%macro empty_macro 0
-
-%endm
-
-emlabel empty_macro
- jmp emlabel
-
-%endif
+;This file demonstrates many of the differences between NASM version X and NASM
+;version 0.97
+;
+; changes.asm is copyright (C) 1998 John S. Fine
+;
+; It may be redistributed under the same conditions as NASM as described in
+; Licence file in the NASM archive
+;_________________________________
+;
+; nasm changes.asm -l changes.lst
+;
+; When assembled without any -d switches, it includes examples which:
+; Work correctly in version X
+; and Work incorrectly and/or display warnings in version 0.97
+; and Do not prevent the generation of output in version 0.97
+;
+; Not all the differences can be seen in the .lst file. I suggest that you use
+; "ndisasm changes" to examine the code actually generated.
+;_________________________________
+;
+; nasm changes.asm -l changes.lst -doldmsg
+;
+; When assembled with -doldmsg, it adds examples which:
+; Work correctly in version X
+; and Generate error messages in version 0.97 and do not generate output
+;_________________________________
+;
+; nasm changes.asm -l changes.lst -doldcrash
+;
+; When assembled with -doldcrash, it adds examples which:
+; Work correctly in version X
+; and Cause NASM to crash in version 0.97
+;_________________________________
+;
+; nasm changes.asm -l changes.lst -dnewmsg
+;
+; When assembled with -dnewmsg, it adds examples which:
+; Generate error messages in version X
+; and Generate wrong output without warning or error message in version 0.97
+;-----------------------------------------------------------------------------
+
+; Please note that I have reported the name of the person who made the
+; correction based on very limited information. In several cases, I am sure I
+; will identify the wrong author. Please send me any corrections; I don't
+; intend to insult or exclude anyone.
+
+;-----------------------------------------------------------------------------
+; Bug fixed by Simon in assemble()
+;
+; The following generated "call next" / "call next-1" instead of
+; two copies of "call next"
+;
+ times 2 a16 call next
+next:
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in parse_line() (and other routines)
+;
+; This used to jmp to prior.1, when it should be here.1
+;
+prior:
+.1:
+here: jmp .1
+.1:
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in assemble()
+;
+; Strings used in dq and dt were not zero filled correctly
+;
+ dq 'b'
+
+
+;-----------------------------------------------------------------------------
+; Bug fixed by Simon in isn_names[]
+;
+; Was not recognised as an instruction
+;
+ int01 ; Instead of INT1
+
+;-----------------------------------------------------------------------------
+; Bug fixed by Jim Hague in ???
+;
+; Forward references were instruction level rather than per operand
+;
+ shr word [forwardref],1
+forwardref:
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in preproc.c
+;
+; It used to silently discard id characters appended to a multi-line
+; macro parameter (such as the x in %1x below).
+;
+%macro xxx 1
+%1: nop
+%{1}x: jmp %1x
+%endmacro
+xxx yyy
+
+%ifdef oldmsg
+;***************************************************************
+;
+; The following examples will generate error messages in 0.97 and will generate
+; correct output in the new version.
+
+;-----------------------------------------------------------------------------
+; Bug fixed by Simon in isns.dat
+;
+; The optional "near" was not permitted on JMP and CALL
+;
+ jmp near here
+
+;-----------------------------------------------------------------------------
+; Feature added by Simon in stdscan()
+;
+; You can now use the numeric value of strings in %assign
+;
+%assign xxx 'ABCD'
+ dd xxx
+
+;-----------------------------------------------------------------------------
+; Feature added by John in add_vectors()
+;
+; Stranger address expressions are now supported as long as they resolve to
+; something valid.
+;
+ mov ax, [eax + ebx + ecx - eax]
+
+;-----------------------------------------------------------------------------
+; Bug fixed by Simon in ???
+;
+; The EQU directive affected local labels in a way that was inconsistent
+; between passes
+;
+.local:
+neither equ $
+ jmp .local
+
+;-----------------------------------------------------------------------------
+; Feature added by Jules in parse_line
+;
+; You can override a size specifier
+;
+%define arg1 dword [bp+4]
+ cmp word arg1, 2
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in preproc.c
+;
+; You could not use a label on the same line with a macro invocation, if the
+; macro definition began with a preprocessor directive.
+;
+ struc mytype
+.long resd 1
+ endstruc
+
+lbl istruc mytype
+ at mytype.long, dd 'ABCD'
+ iend
+
+;-----------------------------------------------------------------------------
+; Warning removed by John in preproc.c
+;
+; In order to allow macros that extend the definition of instructions, I
+; disabled the warning on a multi-line macro referencing itself.
+;
+%endif ;NASM 0.97 doesn't handle %0 etc. inside false %if
+%macro push 1-* ;
+%rep %0 ;
+push %1 ;
+%rotate 1 ;
+%endrep ;
+%endmacro ;
+%ifdef oldmsg ;
+
+ push ax,bx
+
+;-----------------------------------------------------------------------------
+; Warning removed by John in preproc.c
+;
+; To support other types of macros that extend the definition of instructions,
+; I disabled the warning on a multi-line macro called with the wrong number of
+; parameters. PUSH and POP can be extended equally well by either method, but
+; other intruction extensions may need one method or the other, so I made both
+; work.
+;
+; Note that neither of these warnings was really needed, because a later stage
+; of NASM would almost always give an adequate error message if the macro use
+; really was wrong.
+;
+%endif
+%macro pop 2-*
+%rep %0
+pop %1
+%rotate 1
+%endrep
+%endmacro
+%ifdef oldmsg
+
+ pop ax,bx
+%endif
+
+
+%ifdef newmsg ;***************************************************************
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in parse_line() (and other routines)
+;
+; This invalid code used to assemble without errors
+;
+myself equ myself+1
+ jmp myself
+
+;-----------------------------------------------------------------------------
+; Change made by John in preproc.c
+;
+; In 0.97, an id that appears as a label on a macro invocation was always
+; prepended to the first line of the macro expansion. That caused several
+; bugs, but also could be used in tricks like the arg macro in c16.mac and
+; c32.mac.
+;
+; In version X, an id that appears as a label on a macro invocation will
+; normally be defined as a label for the address at which the macro is
+; invoked, regardless of whether the first line of the macro expansion is
+; something that can take a label. The new token %00 may be used for any
+; of the situations in which the old prepend behavior was doing something
+; tricky but useful. %00 can also be used more than once and in places
+; other than the start of the expansion.
+;
+%endif
+%assign arg_off 0
+
+%imacro arg 0-1 2 ;arg defined the old way
+ equ arg_off
+%assign arg_off %1+arg_off
+%endmacro
+
+%ifdef newmsg
+arg_example arg
+%endif
+
+%imacro arg2 0-1 2 ;arg defined the new way
+%00 equ arg_off
+%assign arg_off %1+arg_off
+%endmacro
+
+%ifdef oldmsg
+arg_example2 arg2
+
+;-----------------------------------------------------------------------------
+; Change made by Jules and John in INSNS.DAT
+;
+; Various instruction in which the size of an immediate is built-in to the
+; instruction set, now allow you to redundantly specify that size as long
+; as you specify it correctly
+;
+ AAD byte 5
+ AAM byte 5
+ BT bx, byte 3
+ BTC cx, byte 4
+ BTR dx, byte 5
+ BTS si, byte 6
+ IN eax, byte 0x40
+ INT byte 21h
+ OUT byte 70h, ax
+ RET word 2
+ RETN word 2
+ RETF word 4
+
+; note "ENTER" has not been changed yet.
+
+%endif
+
+%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___
+
+;-----------------------------------------------------------------------------
+; Bug fixed by John in preproc.c
+;
+; Builds of NASM that prohibit dereferencing a NULL pointer used to crash if a
+; macro that started with a blank line was invoked with a label
+;
+%macro empty_macro 0
+
+%endm
+
+emlabel empty_macro
+ jmp emlabel
+
+%endif
+
+;-----------------------------------------------------------------------------
+; Enhancement by hpa in insns.dat et al
+;
+; Simplified added new instructions, and added some missing instructions
+;
+ int03 ; Instead of INT3
+ ud1 ; No documented mnemonic for this one
+ ud2
+ sysenter
+ sysexit
+ fxsave [ebx]
+ fxrstor [es:ebx+esi*4+0x3000]
+
+;-----------------------------------------------------------------------------
+; Enhancement by Conan Brink in preproc.c
+;
+; Allow %rep to be nested
+;
+%rep 4
+%rep 5
+ nop
+%endrep
+%endrep
diff --git a/insns.dat b/insns.dat
index 1e5b9d62..425d0a82 100644
--- a/insns.dat
+++ b/insns.dat
@@ -12,9 +12,9 @@
AAA void \1\x37 8086
AAD void \2\xD5\x0A 8086
-AAD imm \1\xD5\24 8086,SB
+AAD imm \1\xD5\24 8086,SB
AAM void \2\xD4\x0A 8086
-AAM imm \1\xD4\24 8086,SB
+AAM imm \1\xD4\24 8086,SB
AAS void \1\x3F 8086
ADC mem,reg8 \300\1\x10\101 8086,SM
ADC reg8,reg8 \300\1\x10\101 8086
@@ -102,26 +102,26 @@ BT mem,reg16 \320\300\2\x0F\xA3\101 386,SM
BT reg16,reg16 \320\300\2\x0F\xA3\101 386
BT mem,reg32 \321\300\2\x0F\xA3\101 386,SM
BT reg32,reg32 \321\300\2\x0F\xA3\101 386
-BT rm16,imm \320\300\2\x0F\xBA\204\25 386,SB
-BT rm32,imm \321\300\2\x0F\xBA\204\25 386,SB
+BT rm16,imm \320\300\2\x0F\xBA\204\25 386,SB
+BT rm32,imm \321\300\2\x0F\xBA\204\25 386,SB
BTC mem,reg16 \320\300\2\x0F\xBB\101 386,SM
BTC reg16,reg16 \320\300\2\x0F\xBB\101 386
BTC mem,reg32 \321\300\2\x0F\xBB\101 386,SM
BTC reg32,reg32 \321\300\2\x0F\xBB\101 386
-BTC rm16,imm \320\300\2\x0F\xBA\207\25 386,SB
-BTC rm32,imm \321\300\2\x0F\xBA\207\25 386,SB
+BTC rm16,imm \320\300\2\x0F\xBA\207\25 386,SB
+BTC rm32,imm \321\300\2\x0F\xBA\207\25 386,SB
BTR mem,reg16 \320\300\2\x0F\xB3\101 386,SM
BTR reg16,reg16 \320\300\2\x0F\xB3\101 386
BTR mem,reg32 \321\300\2\x0F\xB3\101 386,SM
BTR reg32,reg32 \321\300\2\x0F\xB3\101 386
-BTR rm16,imm \320\300\2\x0F\xBA\206\25 386,SB
-BTR rm32,imm \321\300\2\x0F\xBA\206\25 386,SB
+BTR rm16,imm \320\300\2\x0F\xBA\206\25 386,SB
+BTR rm32,imm \321\300\2\x0F\xBA\206\25 386,SB
BTS mem,reg16 \320\300\2\x0F\xAB\101 386,SM
BTS reg16,reg16 \320\300\2\x0F\xAB\101 386
BTS mem,reg32 \321\300\2\x0F\xAB\101 386,SM
BTS reg32,reg32 \321\300\2\x0F\xAB\101 386
-BTS rm16,imm \320\300\2\x0F\xBA\205\25 386,SB
-BTS rm32,imm \321\300\2\x0F\xBA\205\25 386,SB
+BTS rm16,imm \320\300\2\x0F\xBA\205\25 386,SB
+BTS rm32,imm \321\300\2\x0F\xBA\205\25 386,SB
CALL imm \322\1\xE8\64 8086
CALL imm|near \322\1\xE8\64 8086
CALL imm|far \322\1\x9A\34\37 8086,ND
@@ -397,7 +397,7 @@ IBTS mem,reg16 \320\300\2\x0F\xA7\101 386,SW,UNDOC,ND
IBTS reg16,reg16 \320\300\2\x0F\xA7\101 386,UNDOC,ND
IBTS mem,reg32 \321\300\2\x0F\xA7\101 386,SD,UNDOC,ND
IBTS reg32,reg32 \321\300\2\x0F\xA7\101 386,UNDOC,ND
-ICEBP void \1\xF1 P6,ND
+ICEBP void \1\xF1 386,ND
IDIV rm8 \300\1\xF6\207 8086
IDIV rm16 \320\300\1\xF7\207 8086
IDIV rm32 \321\300\1\xF7\207 386
@@ -420,9 +420,9 @@ IMUL reg16,imm8 \320\1\x6B\100\15 286
IMUL reg16,imm \320\1\x69\100\31 286,SM
IMUL reg32,imm8 \321\1\x6B\100\15 386
IMUL reg32,imm \321\1\x69\100\41 386,SM
-IN reg_al,imm \1\xE4\25 8086,SB
-IN reg_ax,imm \320\1\xE5\25 8086,SB
-IN reg_eax,imm \321\1\xE5\25 386,SB
+IN reg_al,imm \1\xE4\25 8086,SB
+IN reg_ax,imm \320\1\xE5\25 8086,SB
+IN reg_eax,imm \321\1\xE5\25 386,SB
IN reg_al,reg_dx \1\xEC 8086
IN reg_ax,reg_dx \320\1\xED 8086
IN reg_eax,reg_dx \321\1\xED 386
@@ -435,9 +435,10 @@ INCBIN ignore ignore ignore
INSB void \1\x6C 186
INSD void \321\1\x6D 386
INSW void \320\1\x6D 186
-INT imm \1\xCD\24 8086,SB
-INT01 void \1\xF1 P6,ND
-INT1 void \1\xF1 P6
+INT imm \1\xCD\24 8086,SB
+INT01 void \1\xF1 386,ND
+INT1 void \1\xF1 386
+INT03 void \1\xCC 8086,ND
INT3 void \1\xCC 8086
INTO void \1\xCE 8086
INVD void \2\x0F\x08 486
@@ -840,11 +841,11 @@ RESQ ignore ignore ignore
REST ignore ignore ignore
RESW ignore ignore ignore
RET void \1\xC3 8086
-RET imm \1\xC2\30 8086,SW
+RET imm \1\xC2\30 8086,SW
RETF void \1\xCB 8086
-RETF imm \1\xCA\30 8086,SW
+RETF imm \1\xCA\30 8086,SW
RETN void \1\xC3 8086
-RETN imm \1\xC2\30 8086,SW
+RETN imm \1\xC2\30 8086,SW
ROL rm8,unity \300\1\xD0\200 8086
ROL rm8,reg_cl \300\1\xD2\200 8086
ROL rm8,imm \300\1\xC0\200\25 186,SB
@@ -1005,7 +1006,7 @@ TEST rm32,imm \321\300\1\xF7\200\41 386,SM
TEST mem,imm8 \300\1\xF6\200\21 8086,SM
TEST mem,imm16 \320\300\1\xF7\200\31 8086,SM
TEST mem,imm32 \321\300\1\xF7\200\41 386,SM
-UD1 void \2\x0F\xB9 286
+UD1 void \2\x0F\xB9 286,UNDOC
UD2 void \2\x0F\x0B 286
UMOV mem,reg8 \300\2\x0F\x10\101 386,UNDOC,SM
UMOV reg8,reg8 \300\2\x0F\x10\101 386,UNDOC
diff --git a/insns.pl b/insns.pl
index 8e2ac1e0..a61f6f98 100644
--- a/insns.pl
+++ b/insns.pl
@@ -13,7 +13,6 @@ $fname = "insns.dat" unless $fname = $ARGV[0];
open (F, $fname) || die "unable to open $fname";
$line = 0;
-$opcodes = 0;
$insns = 0;
while (<F>) {
$line++;
@@ -28,7 +27,12 @@ while (<F>) {
$aname = "aa_$_[0]";
push @$aname, $formatted;
}
- $opcodes[$opcodes++] = $_[0], $done{$_[0]} = 1 if !$done{$_[0]};
+ if ( $_[0] =~ /cc$/ ) {
+ $k_opcodes_cc{$_[0]}++;
+ } else {
+ $k_opcodes{$_[0]}++;
+ }
+ $done{$_[0]} = 1 if !$done{$_[0]};
if ($formatted && !$nd) {
push @big, $formatted;
foreach $i (&startbyte($_[2])) {
@@ -40,6 +44,9 @@ while (<F>) {
close F;
+@opcodes = sort keys(%k_opcodes); # Unconditional instructions
+@opcodes_cc = sort keys(%k_opcodes_cc); # Conditional instructions
+
print STDERR "Writing insnsa.c...\n";
open A, ">insnsa.c";
@@ -51,7 +58,7 @@ print A "#include \"nasm.h\"\n";
print A "#include \"insns.h\"\n";
print A "\n";
-foreach $i (@opcodes) {
+foreach $i (@opcodes, @opcodes_cc) {
print A "static struct itemplate instrux_${i}[] = {\n";
$aname = "aa_$i";
foreach $j (@$aname) {
@@ -60,7 +67,7 @@ foreach $i (@opcodes) {
print A " {-1}\n};\n\n";
}
print A "struct itemplate *nasm_instructions[] = {\n";
-foreach $i (@opcodes) {
+foreach $i (@opcodes, @opcodes_cc) {
print A " instrux_${i},\n";
}
print A "};\n";
@@ -107,14 +114,14 @@ print STDERR "Writing insnsi.h...\n";
open I, ">insnsi.h";
print I "/* This file is auto-generated from insns.dat by insns.pl" .
- " - don't exit it */\n\n";
+ " - don't edit it */\n\n";
print I "/* This file in included by nasm.h */\n\n";
print I "/* Instruction names */\n";
print I "enum {";
$first = 1;
$maxlen = 0;
-foreach $i (@opcodes) {
+foreach $i (@opcodes, @opcodes_cc) {
print I "," if ( !$first );
$first = 0;
print I "\n\tI_${i}";
@@ -132,49 +139,39 @@ print STDERR "Writing insnsn.c...\n";
open N, ">insnsn.c";
print N "/* This file is auto-generated from insns.dat by insns.pl" .
- " - don't exit it */\n\n";
+ " - don't edit it */\n\n";
print N "/* This file in included by names.c */\n\n";
print N "static char *insn_names[] = {";
$first = 1;
foreach $i (@opcodes) {
- # Don't include conditional instructions
- if ( $i !~ /cc$/ ) {
- print N "," if ( !$first );
- $first = 0;
- $ilower = $i;
- $ilower =~ tr/A-Z/a-z/;
- print N "\n\t\"${ilower}\"";
- }
+ print N "," if ( !$first );
+ $first = 0;
+ $ilower = $i;
+ $ilower =~ tr/A-Z/a-z/; # Change to lower case (Perl 4 compatible)
+ print N "\n\t\"${ilower}\"";
}
print N "\n};\n\n";
print N "/* Conditional instructions */\n";
print N "static char *icn[] = {";
$first = 1;
-foreach $i (@opcodes) {
- # Only conditional instructions
- if ( $i =~ /cc$/ ) {
- $ins = $`; # Skip cc suffix
- print N "," if ( !$first );
- $first = 0;
- $ilower = $i;
- $ilower =~ tr/A-Z/a-z/;
- print N "\n\t\"${ilower}\"";
- }
+foreach $i (@opcodes_cc) {
+ print N "," if ( !$first );
+ $first = 0;
+ $ilower = $i;
+ $ilower =~ s/cc$//; # Skip cc suffix
+ $ilower =~ tr/A-Z/a-z/; # Change to lower case (Perl 4 compatible)
+ print N "\n\t\"${ilower}\"";
}
print N "\n};\n\n";
print N "/* and the corresponding opcodes */\n";
print N "static int ico[] = {";
$first = 1;
-foreach $i (@opcodes) {
- # Only conditional instructions
- if ( $i =~ /cc$/ ) {
- $ins = $`; # Skip cc suffix
- print N "," if ( !$first );
- $first = 0;
- print N "\n\tI_$i";
- }
+foreach $i (@opcodes_cc) {
+ print N "," if ( !$first );
+ $first = 0;
+ print N "\n\tI_$i";
}
print N "\n};\n";
diff --git a/nasm.h b/nasm.h
index e73d8a6f..833e68d6 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.2"
+#define NASM_VER "0.98 pre-release 3.3"
#ifndef NULL
#define NULL 0
diff --git a/preproc.c b/preproc.c
index 291b57ec..e16432a5 100644
--- a/preproc.c
+++ b/preproc.c
@@ -75,6 +75,7 @@ struct MMacro {
Line *expansion;
MMacro *next_active;
+ MMacro *rep_nest; /* used for nesting %rep */
Token **params; /* actual parameters */
Token *iline; /* invocation line */
int nparam, rotate, *paramlen;
@@ -1156,6 +1157,7 @@ static int do_directive (Token *tline)
Line *l;
struct tokenval tokval;
expr *evalresult;
+ MMacro *tmp_defining; /* Used when manipulating rep_nest */
origline = tline;
@@ -1472,6 +1474,7 @@ static int do_directive (Token *tline)
defining->plus = FALSE;
defining->nolist = FALSE;
defining->in_progress = FALSE;
+ defining->rep_nest = NULL;
tline = tline->next;
skip_white_(tline);
if (!tok_type_(tline, TOK_NUMBER)) {
@@ -1590,24 +1593,6 @@ static int do_directive (Token *tline)
return 1;
case PP_REP:
- if (defining) {
- /*
- * We don't allow nested %reps, because of a strange bug
- * that was causing a panic. The cause of the bug appears to be
- * that the nested %rep isn't taken into account when matching
- * against the %endreps, so some mechanism to count the
- * %reps in and the %endreps out may well work here.
- *
- * That's for experimentation with later, though.
- * For informations sake, the panic produced by
- * nesting %reps was:
- *
- * istk->mstk has no name but defining is set at end
- * of expansion
- */
- error(ERR_NONFATAL, "nested `%%rep' invocation not allowed");
- break;
- }
nolist = FALSE;
tline = tline->next;
if (tline->next && tline->next->type == TOK_WHITESPACE)
@@ -1635,6 +1620,7 @@ static int do_directive (Token *tline)
"non-constant value given to `%%rep'");
return 3;
}
+ tmp_defining = defining;
defining = nasm_malloc(sizeof(MMacro));
defining->name = NULL; /* flags this macro as a %rep block */
defining->casesense = 0;
@@ -1646,6 +1632,7 @@ static int do_directive (Token *tline)
defining->dlist = NULL;
defining->expansion = NULL;
defining->next_active = istk->mstk;
+ defining->rep_nest = tmp_defining;
return 1;
case PP_ENDREP:
@@ -1675,7 +1662,8 @@ static int do_directive (Token *tline)
istk->mstk = defining;
list->uplevel (defining->nolist ? LIST_MACRO_NOLIST : LIST_MACRO);
- defining = NULL;
+ tmp_defining = defining;
+ defining = defining->rep_nest;
free_tlist (origline);
return 1;
@@ -2796,10 +2784,7 @@ static char *pp_getline (void)
if (defining->name)
error (ERR_PANIC,
"defining with name in expansion");
- else if (!istk->mstk->name)
- error (ERR_PANIC, "istk->mstk has no name but"
- " defining is set at end of expansion");
- else
+ else if (istk->mstk->name)
error (ERR_FATAL, "`%%rep' without `%%endrep' within"
" expansion of macro `%s'", istk->mstk->name);
}
diff --git a/rdoff/Makefile.in b/rdoff/Makefile.in
index ed66fc4f..d9a93111 100644
--- a/rdoff/Makefile.in
+++ b/rdoff/Makefile.in
@@ -63,7 +63,7 @@ clean:
rm -f *.o rdfdump ldrdf rdx rdflib rdf2bin rdf2com
distclean: clean
- rm -f Makefile
+ rm -f Makefile *~ *.bak
cleaner: clean