changed.asm
资源名称:nasm-0.98.zip [点击查看]
上传用户:yuppie_zhu
上传日期:2007-01-08
资源大小:535k
文件大小:11k
源码类别:
编译器/解释器
开发平台:
C/C++
- ;This file demonstrates many of the differences between NASM version X and NASM
- ;version 0.97
- ;
- ; changed.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 changed.asm -l changed.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 changed.asm -l changed.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 changed.asm -l changed.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 changed.asm -l changed.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
- ;-----------------------------------------------------------------------------
- ; Bug added by John in preproc.c 0.98-J4, removed by John in 0.98-J5
- ;
- ; Tested here to make sure it stays removed
- ;
- %macro TestElse 1
- %if %1=0
- %elif %1=1
- nop
- %endif
- %endmacro
- TestElse 1
- %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.
- ;-----------------------------------------------------------------------------
- ; Enhancement by hpa in insns.dat et al
- ;
- ; Simplified adding new instructions, and added some missing instructions
- ;
- int03 ; Instead of INT3
- ud1 ; No documented mnemonic for this one
- ud2
- sysenter
- sysexit
- syscall
- sysret
- fxsave [ebx]
- fxrstor [es:ebx+esi*4+0x3000]
- ;-----------------------------------------------------------------------------
- ; Enhancement by hpa in insns.dat et al
- ;
- ; Actually make SSE work, and use the -p option to ndisasm to select
- ; one of several aliased opcodes
- ;
- 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
- ;-----------------------------------------------------------------------------
- ; Bug fix by hpa in insns.dat
- ;
- ; PSHUFW and PINSRW weren't handling the implicit sizes correctly; all of
- ; the entries below are (or should be) legal
- ;
- pshufw mm2, mm1, 3
- pshufw mm3,[ebx],2
- pshufw mm7,[0+edi*8],1
- pshufw mm2, mm1, byte 3
- pshufw mm3,[ebx],byte 2
- pshufw mm7,[0+edi*8],byte 1
- pshufw mm2, mm1, 3
- pshufw mm3, qword [ebx], 2
- pshufw mm7, qword [0+edi*8], 1
- pshufw mm2, mm1, byte 3
- pshufw mm3, qword [ebx], byte 2
- pshufw mm7, qword [0+edi*8], byte 1
- pinsrw mm1, [esi], 1
- pinsrw mm1, word [esi], 1
- pinsrw mm1, [esi], byte 1
- pinsrw mm1, word [esi], byte 1
- %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___
- ;-----------------------------------------------------------------------------
- ; 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
- ;-----------------------------------------------------------------------------
- ; Enhancement by Conan Brink in preproc.c
- ;
- ; Allow %rep to be nested
- ;
- %rep 4
- %rep 5
- nop
- %endrep
- %endrep
- %endif