changed.asm
上传用户:yuppie_zhu
上传日期:2007-01-08
资源大小:535k
文件大小:11k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. ;This file demonstrates many of the differences between NASM version X and NASM
  2. ;version 0.97
  3. ;
  4. ; changed.asm is copyright (C) 1998 John S. Fine
  5. ;
  6. ;  It may be redistributed under the same conditions as NASM as described in
  7. ;  Licence file in the NASM archive
  8. ;_________________________________
  9. ;
  10. ;  nasm changed.asm -l changed.lst
  11. ;
  12. ; When assembled without any -d switches, it includes examples which:
  13. ;       Work correctly in version X
  14. ;  and  Work incorrectly and/or display warnings in version 0.97
  15. ;  and  Do not prevent the generation of output in version 0.97
  16. ;
  17. ; Not all the differences can be seen in the .lst file.  I suggest that you use
  18. ; "ndisasm changes"  to examine the code actually generated.
  19. ;_________________________________
  20. ;
  21. ;  nasm changed.asm -l changed.lst -doldmsg
  22. ;
  23. ; When assembled with -doldmsg, it adds examples which:
  24. ;       Work correctly in version X
  25. ;  and  Generate error messages in version 0.97 and do not generate output
  26. ;_________________________________
  27. ;
  28. ;  nasm changed.asm -l changed.lst -doldcrash
  29. ;
  30. ; When assembled with -doldcrash, it adds examples which:
  31. ;       Work correctly in version X
  32. ;  and  Cause NASM to crash in version 0.97
  33. ;_________________________________
  34. ;
  35. ;  nasm changed.asm -l changed.lst -dnewmsg
  36. ;
  37. ; When assembled with -dnewmsg, it adds examples which:
  38. ;       Generate error messages in version X
  39. ;  and  Generate wrong output without warning or error message in version 0.97
  40. ;-----------------------------------------------------------------------------
  41. ; Please note that I have reported the name of the person who made the
  42. ; correction based on very limited information.  In several cases, I am sure I
  43. ; will identify the wrong author.  Please send me any corrections;  I don't
  44. ; intend to insult or exclude anyone.
  45. ;-----------------------------------------------------------------------------
  46. ; Bug fixed by Simon in assemble()
  47. ;
  48. ; The following generated "call next" / "call next-1" instead of
  49. ; two copies of "call next"
  50. ;
  51. times 2 a16 call next
  52. next:
  53. ;-----------------------------------------------------------------------------
  54. ; Bug fixed by John in parse_line()  (and other routines)
  55. ;
  56. ; This used to jmp to prior.1, when it should be here.1
  57. ;
  58. prior:
  59. .1:
  60. here: jmp .1
  61. .1:
  62. ;-----------------------------------------------------------------------------
  63. ; Bug fixed by John in assemble()
  64. ;
  65. ; Strings used in dq and dt were not zero filled correctly
  66. ;
  67. dq 'b'
  68. ;-----------------------------------------------------------------------------
  69. ; Bug fixed by Simon in isn_names[]
  70. ;
  71. ; Was not recognised as an instruction
  72. ;
  73. int01 ; Instead of INT1
  74. ;-----------------------------------------------------------------------------
  75. ; Bug fixed by Jim Hague in ???
  76. ;
  77. ; Forward references were instruction level rather than per operand
  78. ;
  79. shr word [forwardref],1
  80. forwardref:
  81. ;-----------------------------------------------------------------------------
  82. ; Bug fixed by John in preproc.c
  83. ;
  84. ; It used to silently discard id characters appended to a multi-line
  85. ; macro parameter (such as the x in %1x below).
  86. ;
  87. %macro xxx 1
  88. %1: nop
  89. %{1}x: jmp %1x
  90. %endmacro
  91. xxx yyy
  92. ;-----------------------------------------------------------------------------
  93. ; Bug added by John in preproc.c 0.98-J4, removed by John in 0.98-J5
  94. ;
  95. ; Tested here to make sure it stays removed
  96. ;
  97. %macro TestElse 1
  98. %if %1=0
  99. %elif %1=1
  100. nop
  101. %endif
  102. %endmacro
  103. TestElse 1
  104. %ifdef oldmsg
  105. ;***************************************************************
  106. ;
  107. ; The following examples will generate error messages in 0.97 and will generate
  108. ; correct output in the new version.
  109. ;-----------------------------------------------------------------------------
  110. ; Bug fixed by Simon in isns.dat
  111. ;
  112. ; The optional "near" was not permitted on JMP and CALL
  113. ;
  114. jmp near here
  115. ;-----------------------------------------------------------------------------
  116. ; Feature added by Simon in stdscan()
  117. ;
  118. ; You can now use the numeric value of strings in %assign
  119. ;
  120. %assign xxx 'ABCD'
  121. dd xxx
  122. ;-----------------------------------------------------------------------------
  123. ; Feature added by John in add_vectors()
  124. ;
  125. ; Stranger address expressions are now supported as long as they resolve to
  126. ; something valid.
  127. ;
  128. mov ax, [eax + ebx + ecx - eax]
  129. ;-----------------------------------------------------------------------------
  130. ; Bug fixed by Simon in ???
  131. ;
  132. ; The EQU directive affected local labels in a way that was inconsistent
  133. ; between passes
  134. ;
  135. .local:
  136. neither equ $
  137. jmp .local
  138. ;-----------------------------------------------------------------------------
  139. ; Feature added by Jules in parse_line
  140. ;
  141. ; You can override a size specifier
  142. ;
  143. %define arg1 dword [bp+4]
  144. cmp word arg1, 2
  145. ;-----------------------------------------------------------------------------
  146. ; Bug fixed by John in preproc.c
  147. ;
  148. ; You could not use a label on the same line with a macro invocation, if the
  149. ; macro definition began with a preprocessor directive.
  150. ;
  151. struc mytype
  152. .long resd 1
  153. endstruc
  154. lbl istruc mytype
  155. at mytype.long, dd 'ABCD'
  156. iend
  157. ;-----------------------------------------------------------------------------
  158. ; Warning removed by John in preproc.c
  159. ;
  160. ; In order to allow macros that extend the definition of instructions, I
  161. ; disabled the warning on a multi-line macro referencing itself.
  162. ;
  163. %endif ;NASM 0.97 doesn't handle %0 etc. inside false %if
  164. %macro push 1-* ;
  165. %rep %0 ;
  166. push %1 ;
  167. %rotate 1 ;
  168. %endrep ;
  169. %endmacro ;
  170. %ifdef oldmsg ;
  171. push ax,bx
  172. ;-----------------------------------------------------------------------------
  173. ; Warning removed by John in preproc.c
  174. ;
  175. ; To support other types of macros that extend the definition of instructions,
  176. ; I disabled the warning on a multi-line macro called with the wrong number of
  177. ; parameters.  PUSH and POP can be extended equally well by either method, but
  178. ; other intruction extensions may need one method or the other, so I made both
  179. ; work.
  180. ;
  181. ; Note that neither of these warnings was really needed, because a later stage
  182. ; of NASM would almost always give an adequate error message if the macro use
  183. ; really was wrong.
  184. ;
  185. %endif
  186. %macro pop 2-*
  187. %rep %0
  188. pop %1
  189. %rotate 1
  190. %endrep
  191. %endmacro
  192. %ifdef oldmsg
  193. pop ax,bx
  194. %endif
  195. %ifdef newmsg  ;***************************************************************
  196. ;-----------------------------------------------------------------------------
  197. ; Bug fixed by John in parse_line()  (and other routines)
  198. ;
  199. ; This invalid code used to assemble without errors
  200. ;
  201. myself equ myself+1
  202. jmp myself
  203. ;-----------------------------------------------------------------------------
  204. ; Change made by John in preproc.c
  205. ;
  206. ; In 0.97, an id that appears as a label on a macro invocation was always
  207. ; prepended to the first line of the macro expansion.  That caused several
  208. ; bugs, but also could be used in tricks like the arg macro in c16.mac and
  209. ; c32.mac.
  210. ;
  211. ; In version X, an id that appears as a label on a macro invocation will
  212. ; normally be defined as a label for the address at which the macro is
  213. ; invoked, regardless of whether the first line of the macro expansion is
  214. ; something that can take a label.  The new token %00 may be used for any
  215. ; of the situations in which the old prepend behavior was doing something
  216. ; tricky but useful.  %00 can also be used more than once and in places
  217. ; other than the start of the expansion.
  218. ;
  219. %endif
  220. %assign arg_off 0
  221. %imacro arg 0-1 2 ;arg defined the old way
  222.   equ arg_off
  223. %assign arg_off %1+arg_off
  224. %endmacro
  225. %ifdef newmsg
  226. arg_example arg
  227. %endif
  228. %imacro arg2 0-1 2 ;arg defined the new way
  229. %00   equ arg_off
  230. %assign arg_off %1+arg_off
  231. %endmacro
  232. %ifdef oldmsg
  233. arg_example2 arg2
  234. ;-----------------------------------------------------------------------------
  235. ; Change made by Jules and John in INSNS.DAT
  236. ;
  237. ; Various instruction in which the size of an immediate is built-in to the
  238. ; instruction set, now allow you to redundantly specify that size as long
  239. ; as you specify it correctly
  240. ;
  241. AAD byte 5
  242. AAM byte 5
  243. BT bx, byte 3
  244. BTC cx, byte 4
  245. BTR dx, byte 5
  246. BTS si, byte 6
  247. IN eax, byte 0x40
  248. INT byte 21h
  249. OUT byte 70h, ax
  250. RET word 2
  251. RETN word 2
  252. RETF word 4
  253. ; note "ENTER" has not been changed yet.
  254. ;-----------------------------------------------------------------------------
  255. ; Enhancement by hpa in insns.dat et al
  256. ;
  257. ; Simplified adding new instructions, and added some missing instructions
  258. ;
  259. int03 ; Instead of INT3
  260. ud1 ; No documented mnemonic for this one
  261. ud2
  262. sysenter
  263. sysexit
  264. syscall
  265. sysret
  266. fxsave [ebx]
  267. fxrstor [es:ebx+esi*4+0x3000]
  268. ;-----------------------------------------------------------------------------
  269. ; Enhancement by hpa in insns.dat et al
  270. ;
  271. ; Actually make SSE work, and use the -p option to ndisasm to select
  272. ; one of several aliased opcodes
  273. ;
  274. sqrtps xmm0,[ebx+10] ; SSE opcode
  275. paddsiw mm0,[ebx+10] ; Cyrix opcode with the same byte seq.
  276. ;-----------------------------------------------------------------------------
  277. ; Enhancement by hpa in preproc.c
  278. ;
  279. ; Support %undef to remoce a single-line macro
  280. ;
  281. %define TEST_ME 42
  282. %ifndef TEST_ME
  283. %error "TEST_ME not defined after %define"
  284. %endif
  285. %undef  TEST_ME
  286. %ifdef  TEST_ME
  287. %error "TEST_ME defined after %undef"
  288. %endif
  289. ;-----------------------------------------------------------------------------
  290. ; Bug fix by hpa in insns.dat
  291. ;
  292. ; PSHUFW and PINSRW weren't handling the implicit sizes correctly; all of
  293. ; the entries below are (or should be) legal
  294. ;
  295. pshufw mm2, mm1, 3
  296. pshufw mm3,[ebx],2
  297. pshufw mm7,[0+edi*8],1
  298. pshufw mm2, mm1, byte 3
  299. pshufw mm3,[ebx],byte 2
  300. pshufw mm7,[0+edi*8],byte 1
  301. pshufw mm2, mm1, 3
  302. pshufw mm3, qword [ebx], 2
  303. pshufw mm7, qword [0+edi*8], 1
  304. pshufw mm2, mm1, byte 3
  305. pshufw mm3, qword [ebx], byte 2
  306. pshufw mm7, qword [0+edi*8], byte 1
  307. pinsrw mm1, [esi], 1
  308. pinsrw mm1, word [esi], 1
  309. pinsrw mm1, [esi], byte 1
  310. pinsrw mm1, word [esi], byte 1
  311. %endif ; oldmsg
  312. %ifdef oldcrash  ;*************************************************************
  313. 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___
  314. ;-----------------------------------------------------------------------------
  315. ; Bug fixed by John in preproc.c
  316. ;
  317. ; Builds of NASM that prohibit dereferencing a NULL pointer used to crash if a
  318. ; macro that started with a blank line was invoked with a label
  319. ;
  320. %macro empty_macro 0
  321. %endm
  322. emlabel empty_macro
  323. jmp emlabel
  324. ;-----------------------------------------------------------------------------
  325. ; Enhancement by Conan Brink in preproc.c
  326. ;
  327. ; Allow %rep to be nested
  328. ;
  329. %rep 4
  330. %rep 5
  331. nop
  332. %endrep
  333. %endrep
  334. %endif