mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-04-24 19:00:23 +08:00
NASM 0.98p3.3
This commit is contained in:
parent
ce14ce6fc4
commit
b64535fd4e
27
MODIFIED
27
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:
|
||||
|
@ -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
|
||||
|
608
changes.asm
608
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
|
||||
|
43
insns.dat
43
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
|
||||
|
63
insns.pl
63
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";
|
||||
|
2
nasm.h
2
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
|
||||
|
31
preproc.c
31
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);
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user