diff options
Diffstat (limited to 'changes.asm')
-rw-r--r-- | changes.asm | 608 |
1 files changed, 316 insertions, 292 deletions
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 |