-
Notifications
You must be signed in to change notification settings - Fork 49
/
Copy pathHistory.txt
2356 lines (2199 loc) · 125 KB
/
History.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
-------------------------------------
Roadmap:
-------------------------------------
2.41
Allow PROC definitions to overload based on parameters.
Add –macho64 output format support.
-------------------------------------
Changelog:
-------------------------------------
2.40
Switch fixes for negative cases and optimisations.
Removed BND prefix from JCXZ instruction group to fix encoding issues in 16/32bit.
Fixed literal string bug in 32bit mode.
Cleaned up manual and moved history/roadmap to history.txt
2.39 I
mproved string literal handling and fixed a bug where it wouldn’t work in vararg parameters.
Added DEFINE/UNDEF built-in commands.
Optimised SWITCH generated code, moved jump tables to data sections to avoid affecting code sections/code caching and line number to offset references.
Added OPTION SWITCHSIZE
Changed architecture default from AVX to SSE for improved default compatibility.
2.38
Fixed more listing issues with binary zeroes.
Improved UTF bom check performance by moving to ProcessFile (Nidud)
Fixed an encoding issue with LEA and RIP.
Fixed IFNDEF macro generation bug.
Fixed SYSCALL, FASTCALL64 and VECTORCALL parameter order and type checking bugs.
Added new instructions: ADOX, VAESDEC, ADCX, CLAC, RDPID, CLFLUSHOPT
Fixed an index register encoding bug and improved checking for valid forms of vscatter and vgather.
2.37
Fixed listing bug causing a binary zero in output text.
Added support for implicit sizing and DS segment overrides for 32bit code generation.
Added support for new 64bit absolute immediate addressing modes.
2.36
Added automatic alignment check for all SIMD instructions which are not scalar.
Improved simd type coercion by testing variables (global/local) on size rather than type. This simplifies code and reduces the need to use type ptr when working with DWORD, BYTE or other data types.
Fixed a bug with literal string support handling \n escape.
Improved handling of PTR and VARARG for SystemV calls.
2.35
Fixed some register combination warnings for VCMPSD, VCMPEQSD and VCMPSS.
Added RP4/RP8 macros and case-sensitive conversion to macro library.
Added support for floating point comparison expression.
Add string literal support back into invoke.
2.34
Added –Sp command line switch to allow user specified segment alignment.
Added further Intel MPX extension support, including BND prefix support.
Added support to define return types on PROC/PROTO which enables the use of the new UINVOKE macro library function.
2.33
Fixed a number of regression issues, including several VEX encoded instructions which were not correct.
Fixed ebx.STRUCT style addressing.
Fixed SYSV support to allow ADDR in VARARGS.
Fixed a potential crash when running multiple input files.
2.32
Added initial UTF8 BOM Check
Rolled-back literal string support in favour of using existing CSTR/WSTR macros to ensure no legacy invoke calls are broken. Literal string support will be moved to a new invocation syntax.
2.31
Fixed 32bit MS FASTCALL issue.
Fixed encoding bug with VMOVQ.
Fixed VMOVSS/VMOVSD allowing 2 register form, when 3 registers are required for all-register mode and added error message for it.
Updated VECTORCALL, FASTCALL x64 to support 3 register VMOVSS/VMOVSD form if archAVX on.
Optimised and improved FASTCALL handlers and completely redeveloped SYSTEMV calling convention implementation.
Fixed a potential memory corruption bug in the symbol table.
Added support for Intel MPX extensions, bnd0-3 registers and new instructions.
Added custom USES to OO Library method definitions as well as providing a replaceable set of memory allocation macros to allow for OO use on OSX/Linux.
2.30
Fixed a nested path bug present from JWASM which caused strange assembly errors when working a nested path location.
Fixed MS Fastcall to support types other than DWORD and prevent incorrect warnings about incompatible types or redefinitions.
Improved Linux 64bit package and compilation to use clang as per OSX so both builds are compatible.
2.29
Finalized Delphi (Borland Register calling convention) and updated language type specifier to BORLAND.
Fixed some register overwrite issues with SystemV invoke.
Added two new Macro Library functions, MEMALLOC <size> and MEMFREE <ptr>
Added new built-in variable @Platform <0,1,2,3,4,5> which indicates the current output type of WIN32, WIN64, ELF32, ELF64, OSX to support cross-platform development.
Fixed a potential general failure crash with some evex encodings when no base-register present.
Fixed 32bit crash caused by Macro Library modifying read only string data.
2.28
Optimise SYSTEMV Invoke code generation.
Fixed register overwrite warnings for SYSTEMV invoke.
Fix long standing JWasm issue with source debugging information leaving out PROC source-lines when a procedure has no prologue.
Add OPTION PROC:NONE, OPTION PROC:DEFAULT to simplify switching on/off procedure prologue/epilogue.
OPTION PROC can also set prologue/epilogue simultaneously with:
OPTION PROC:PrologueMacro,EpilogueMacro
Change macro library OO functions names to use _ instead of $.
Added DELPHI language type for Borland 32bit fast-calling convention.
(experimental, pending further updates)
Fix SHR for macro expression evaluation (Fix supplied by Nidud).
Fix VARARG Register overwritten warning.
Added progressive assembly reporting, console updates per source file.
Added new command line option –less to reduce console output information.
2.27
Fixed the use of ADDR in invoke for SYSTEM V calls.
Disable generation of listing while processing built-in macro library.
Rename OO INTERFACE function in built-in macro library to OINTERFACE and ENDINTEFACE to ENDOINTERFACE to prevent conflicts with SDK headers.
2.26
Added support for USES ymm registers to stackbase:RBP 64bit mode.
Reduced stack usage for stackbase:RSP with win64:15 mode
Configured 64bit assembly to assume stackbase:rbp if nothing specified.
2.25
Continued improvement of align 16 in prologue, while reducing stack wastage.
Implemented OPTION REDZONE for SystemV ABI
Internal optimisation to character validation and hashing functions to yield 5% assembly time improvement.
Extend macrolib functionality and limit to 64bit.
Implement OO language extension framework.
2.24
Fixed literal strings including “ “.
Fixed stackbase:rsp overwriting locals in some cases.
Ensure stackbase:rbp works for modes with bit 1 set.
Add support for SYSTEMV ABI.
2.23
Support for STACKBASE:ESP has been fixed
(Big thanks to MASM32 forum member Nidud)
Command line switch –nomlib added to disable internal Macro Library
OSX Build supplied
Fixed INCBIN related offset bug
Fixed COFF 32bit name mangling bug
Code paths for 64bit RSP and RBP stackbase have been completely separated, refactored and optimised.
Simplification of code generation options
2.22
Added support for inline string literals in INVOKE include L”” wide character strings.
Added support for allocating wide strings in data with dw.
Automatic integer to float promotion for data declarations and struct members.
Added new union initialisation syntax.
Added built-in macro library that precompiles and adjusts to suit currently selected architecture setting (SSE/AVX).
Fixed STACKBASE:ESP parameter positions.
Fixed STACKBASE:RSP + WIN64:11 16byte alignment.
Fixed STACKBASE:RSP parameter positions.
2.21
Fixed RBP prologue and epilogue for win64:6 and 7 modes.
Added support to INVOKE allowing XMM register parameters for FLOAT type arguments (real4 and real8).
Fixed stack and local align to 16 issues.
Added OPTION ARCH:<SSE|AVX> and command line
switches –archSSE –archAVX to change code-generation to favour SSE or AVX instructions (this is particularly relevant to invoke and prologue/epilogue generation).
2.20
Fixed opcode byte 83 to be 80 when assembler needs to assume BYTE type.
Cleaned up linnum memory allocation from switch additions.
Fixed option win64:6
2.19
Fixed corruption of structures and first proc with offset 0 bug when dumping symbols to file.
More AVX, AVX512 and MMX instruction encoding fixes.
Fixed line number debugging information corruption due to compiler check for memory address allocation.
Fixed the use of label in data section which was causing an erroneous error of “USE OF REGISTER ASSUMED TO ERROR”.
Investigated custom epilogue macro expanding on a line with a label causes backwards jumps not to evaluate distance correctly. This is not being fixed but is noted, always put RET on its own line without a label when using a custom epilogue macro.
2.18
Fixed '&&' in hll (.while, .if, .for, .repeat), added additional label
Fixed wrong locals alignment in 32 bit
Fixed error reporting for overwritten registers
Changed cmp reg,0 to test reg,reg for HLL generation
2.17
AVX 3 operand warnings for missing operands.
Support for integer values to REAL4, REAL8, REAL10 and thus FP4/8/10 macros and structures. Ideal for vectors and structure initialisation like <0, 0, 0, 1> with REAL4 typing.
Simplified symbolic debug data output via new –Fs command switch (with included file format guide)
Option flat added which enables a lower-level assembly (like fasm) and removes the need for end directive
- Adds support for USE16, USE32, USE64 to switch code-generation bit mode.
- Maintains all UASM 64bit HLL features like PROC, FRAME, INVOKE, .FOR, .SWITCH, VECTORCALL etc.
- See new example flat.asm
Fixup ORG directive generation which incorrectly pads the code buffer with 0’s instead of simply applying the address change
Add support for .labelName style labels (like nasm/fasm support)
2.16
Complete re-working of AVX2 and AVX512 code generation to ensure that encodings are separated.
Complete implementation of all missing AVX2 and AVX512 instructions.
Added extensive checking to prevent misuse of register and memory operands with AVX, AVX2 and AVX512 instructions especially where mask and decorator flags are required.
All AVX512 code now tested against Intel SDE emulation libraries.
2.15 r2
Fixed AVX2 encoding bugs.
Fixed EVEX type coercion and added automatic conversion of vmovdqa to vmovdqa32/64.
Fixed legacy jwasm issue of “ADD RSP,0” in epilogue.
Fixed a number of format compatibility options for WIN64 between UASM and JWASM for WIN64:1, no WIN64, WIN64:3. Unified the stack handling between WIN64:3 and RSP and have dropped any support for WIN64:2
2.15
Allowed xmm, ymm and zmm registers to be saved at the same time with USES.
Fixed problem with the reserved stack size
Implemented VECTORCALL (R-VECTORCALL)
Implemented SSE compatibility with ML64 (automatic xmmword type promotion with switch –Zg)
Fixed the bug with MOVSS
Fixed EIP/RIP encoding bug
Added @ProcLine built-in equate which matches MASM/ML’s @Line value during user-defined prologue execution.
2.14
Added .switch support
Fixed 0x c style tokenization bug with immediate values
Fixed some bugs pertaining to stack prologue generation in 64bit.
2.13
First official release of Uasm, changes reflect enhancements to JWasm.
New instructions added: RDRAND, RDSEED, F16C(VCVTPH2PS, VCVTPS2PH), MOVQ and VMOVQ to supplement MOVD and bring instructions in line with Intel and AMD reference guides.
Removed warnings relating to alignment by 32 (as this is a requirement for AVX vectors), leads to clean builds.
Additional unsigned flag comparison predicates added for HLL syntax (ABOVE, BELOW)
Added support for AVX512F, ZMM registers and EVEX encoding.
RIP register support.
.FOR high level macro support and enhancements.
VEX encoded general purpose instructions added.
Support for more optimised stack and invoke usage as well as stack alignment and RSP stack base.
Fixed bug requiring the use of xmmword ptr and ymmword ptr.
Added OPTION EVEX to enable encoding of evex instructions and support for AVX512 registers.
Added OPTION ZEROLOCALS to clear all PROC local values to 0 on entry.
Fixed .WHILE loop issues present in JWASM.
Added VGATHERDPD, VGATHERQPD, VGATHERDPS, VGATHERQPS, VPGATHERDD, VPGATHERQD, VPGATHERDQ, VPGATHERQQ,VCMPxxPD, VCMPxxPS, VCMPxxSD, VCMPxxPD, VCMPxxSS.
Transition to Github, project taken over and renamed to UASM.
01/01/2014, v2.12:
Bugfixes:
- COMM directive: there was no check that numeric arguments 'size' or
'count' did fit into 32-bits; see comm06.aso.
- regression in v2.10-2.11: in 16-/32-bit, if a FASTCALL procedure was
first prototyped and then defined, the assembly process may have stopped
with error 'General Failure'; see proc9.asm.
- regression in v2.10-2.11, COFF format: if full segment directives were
used and a bss segment didn't have the expected class name, jwasm may
have calculated wrong file positions of section data and relocations;
see coff1.asc.
- operator OPATTR: bit 1 (=indirect memref) and language type flags of
result may have been set even if operand was an invalid reference; see
opattr9.asm.
- ELF format: object module may have been larger than necessary due to
bss section sizes that were not ignored for file offset calculations.
- GPF might have occured if a TYPE for an undefined variable was
specified in an expression; see expr5.aso.
Other changes:
- OPTION WIN64:4 added.
11/16/2013, v2.11a:
Bugfixes:
- regression in v2.11, Unix version only: _splitpath() emulation code
didn't handle correctly dots in directory part of the filename.
10/20/2013, v2.11:
Bugfixes:
- regression in v2.10: type expression may have given incorrect result
if it contained an indirect memory operand; see types14.asm.
- shift instructions with unsized memory operand as first operand were
silently assumed to have byte size; see shift4.aso.
- concatenation operator (a '\' as last non-white space character) wasn't
handled if it appeared after line expansion only; see expans38.asm.
- EXPORT or PRIVATE attributes in a PROTO directive weren't ignored;
this may have caused problems if the attribvtes differed from those in
the corresponding PROC directive.
- userdefined prologue/epilogue macros: bit 7 of flag argument (=export)
wasn't set.
- 64-bit: if OPTION FRAME:AUTO was set, the default prologue of all PROCs
with FRAME attribute did setup the RBP register, even if no params or
locals were defined.
- in v2.00-2.10, CMP instruction did not reject the LOCK prefix.
- 64-bit, CodeView debugging info: stack variables were defined via
S_BPREL32-records, which works only as long as value of RBP fits in
32-bit; changed to S_REGREL32.
- INVOKE directive: signed 16-bit arguments were zero extended if the
target's parameter was of VARARG type; see invoke24.asm.
- INVOKE directive: in 16-bit code, extending arguments to DWORD size
didn't always work correctly; see invoke25.asm & invoke26.asm.
- undefined members in critical expressions were accepted in some cases;
see struct39.aso.
- 64-bit: if more than 128 unwind codes were created inside a FRAME
procedure, a GPF may have occured.
- 64-bit: unwind codes generated by .ALLOCSTACK weren't always correct.
- 64-bit: codeview line number info was not quite correct for first line
in FRAME procs; consequently, there may have been a delay of one line
until the debugger was able to show the contents of stack variables.
- codeview debug info for symbols of type FWORD wasn't correct.
- VMOVMSKPD, VMOVMSKPS, VMOVNTDQ, VMOVNTPD, VMOVNTPS didn't accept
256-bit operands.
- INVOKE: if byte-registers AH-DH were used as arguments for a BYTE
parameter in 32-bit, the wrong register was pushed; see invoke28.asm
and invoke29.asm.
- INVOKE: register arguments were always zero-extended, even if there
was a signed type coercion; see invoke31.asm - invoke34.asm.
- INVOKE, 16-bit: "push 0" may have been generated, even if current
cpu was 8086, resulting in an assembly error.
- INVOKE, Win64: default size of integer constants was 8 - changed to 4.
- COFF: if -Zd or -Zi was set and there were multiple code sections
containing code outside of procedures, the assembler may have crashed.
- COFF: relative paths were missing in file entries of symbol table.
- runtime conditionals: constant expressions coupled with && or ||
operator may have created wrong code; see rtcond7.asm - rtcond9.asm.
- VMOVSD and VMOVSS didn't accept memory reference as second argument;
see avx6.asm.
- 64-bit: direct memory addressing with non-RIP-relative addresses didn't
work in all cases; see mov644.asm.
- overflow and underflow of real4 and real8 constants wasn't detected
reliably; see float8.aso.
- empty quoted strings were accepted as instruction operands; see
quotstr2.aso ).
- fatal errors were displayed, but did not appear in the .err-file.
- BSS segments with the COMDAT attribute caused a GPF.
- INVOKE: if the target's offset magnitude wasn't the current one ( i.e.
calling 16-bit procedure from 32-bit code ), the generated code had
problems in some cases; see invoke37.asm & invoke38.asm.
- regression in v2.09-2.10: in 16-bit code, a jump extension may have
occurred although the distance was 'short'; see forward8.asm.
- 64-bit: register names TR3-TR7 were included in reserved words table.
- COMM directive did accept NEAR/FAR types; see comm05.aso.
- OMF format, options -Zd, -Zi: the size of line number records may have
exceeded 1024; see linnum.asc.
- OMF format, option -Cu: names of communals and exports weren't converted
to uppercase; see casemap1.asc.
- ALIGN in 16-bit code segments: the 2-byte filler was different from
Masm's; see align4.asm.
- macro functions calls after directives .IF, .ELSEIF, .WHILE or .UNTIL
confused the tokenizer if one of the macro arguments was a <>-literal;
see expans39.asm.
- a macro placeholder ( argument or local ) may not have been detected if
it was preceeded by a '!'; see expans40.asm.
- jwasmd.exe: no FPU emulation code was included, causing strange errors
when jwasm run on systems without FPU ( 80386/80486SX ) and floating
point initializers were used in the assembly source.
- EXTERN directive, weak externals: an "infinite" loop may have occured;
see extern15.asc.
Other changes:
- OPTION STACKBASE added.
- macro parameter attribute VARARGML added.
- 64-bit, OPTION FRAME:AUTO: better prologue generation if XMM registers
are contained in the PROC's USES clause.
- OPTION RENAMEKEYWORD is now able to rename a keyword temporarily only.
- data labels that become public via cmdline option -Zf will be decorated.
- anonymous members in unions will be added to codeview debug info; they
get a generated name ( which is a number, prefixed by "@@" ) to make
them acceptable to the MS debug engine.
- INVOKE, 64-bit: signed/unsigned integer argument expansion added.
- OMF format: multiple THEADR records are written if line number info
is contained in more than just one source file.
- jwasmd.exe linked with updated hdpmi32 stub ( loadpex.bin ).
- precompiled binaries jwasm.exe and jwasmd.exe now linked with jwlink.
- encoding of FADD, FMUL, FDIV, FDIVR, FSUB and FSUBR with register st
as both first and second operand does now match Masm's encoding.
04/17/2013, v2.10:
Bugfixes:
- option -Zi: the CodeView symbolic debug info did contain type indices
of value 0 - which caused debuggers based on the MS debug engine to emit
a warning.
- a struct definition just after PROC or LOCAL may have triggered
prologue generation, and thus error "statement not allowed inside struct
definition" did appear.
- regression in v2.08-2.09 with option -Zne: a segment register override
may cause error 'invalid use of register'; regression test overrid3.asm.
- regression in v2.08-2.09: a float as operand behind EQU was stored as
a number (value 0), not as text; regression test equate26.asm.
- a forward reference might have caused an error if the reference was once
interpreted as a label and then as a structure name; regression test
struct34.asm.
- regression in v2.09: if the difference of two labels ( at least one must
be a forward reference ) was stored in a byte variable, an error occured
if output format was COFF; regression test data10.asc.
- ALIAS segment attribute: the alias name was likely to become "corrupted".
- operators IMAGEREL and SECTIONREL were ignored if their operand was the
displacement of an indirect memory reference; regression test coffop.asc.
- -pe: size of data directory for imports did comprise all import data.
- -pe: in object table, the entry of the internally generated .reloc
section may have been invalid.
- -pe: the exported names table wasn't sorted in ascending order.
- -coff: weak externals defined via "extern sym (altsym) ..." had
characteristics IMAGE_WEAK_EXTERN_SEARCH_ALIAS instead of
IMAGE_WEAK_EXTERN_SEARCH_LIBRARY.
- ALIAS directive: the alias name in the object module wasn't decorated.
- OMF format: a linker "pass separator" comment record was written in any
case; according to OMF docs it is NOT to be written if a starting
address is present ( Masm also omits the record then ).
- if the third argument of an instruction was a forward reference, error
'invalid instruction operands' was emitted in most cases; regression
test forward4.asm.
- strcpy() was used to copy overlapping strings when a macro was stored -
this may not work with all compilers; replaced by memmove().
- comparison of pointer types ( with or without using TYPE operator ) had
problems; regression test types7.asm.
- option -Fd without filename argument might have caused a GPF.
- if a symbol with local scope was to be defined and the name was
referenced previously ( but not defined [yet]! ), a confusing error msg
"Symbol already defined" was emitted; regression tests local2.aso and
proc5.aso.
- -bin: absolute segments weren't fully supported; regression tests
absseg2.asm and absseg3.asm.
- directives PUSHCONTEXT & POPCONTEXT did not behave exactly as in Masm;
regression test context2.asm.
- -coff: if a section contained more than 0xffff relocations, the count
in the section header was truncated and flag IMAGE_SCN_LNK_NRELOC_OVFL
wasn't set.
- comparison of GPR TYPEs did ignore ASSUME; regression test types8.asm.
- INCLUDE directive: directory part of a relative path may have been
ignored if the current source file wasn't in the current directory.
- -coff: static (=private) PROCedures weren't included into the coff
symbol table.
- it was possible to change the ALIAS segment attribute; regression test
alias2.asc.
- if OPATTR operand was an undefined struct member, an error was emitted;
regression test opattr3.asm.
- if an alias defined via '=' or EQU directives was forward-referenced,
it might have failed to trigger a necessary phase error, resulting
in a premature end of the assembly task; regression test forward5.asm.
- directive ENDP, v2.05-2.09: the matching of the labels ( PROC and
associated ENDP ) was only tested with the length of the PROC label -
which wasn't reliable; regression test proc6.aso.
- option -Zg, INVOKE directive: if an argument was to be extended from
WORD to DWORD, the hiword wasn't initialized to 0; regression test
invoke21.asc.
- type coercion inside brackets wasn't dereferenced for usage outside
the brackets; regression test ptr2.asm.
- regression in v2.05-2.09, options -Fo, -Fl,...: white spaces in filename
argument did confuse the cmdline parser.
- in v2.09, directive REP[EA]T may have triggered error 'too many arguments
in macro call' ( JWASMR.EXE only? ).
- regression in v2.09: if a struct member was an alias for another struct
or union, it was not properly initialized; regression tests struct35.asm
and struct36.aso.
- option -Zf: code labels created via '@@:' weren't sorted out.
- regression in v2.05-2.09: code label @@: at the very beginning caused
problems ("symbol not defined" ).
- regression in v2.07-2.09: if the member part in a "dot"-expression was
enclosed in (), it wasn't accepted; regression test dotop5.asm.
- regression in v2.08-2.09: variable type was overwritten by assumed type;
regression test assume10.asm.
- if a text macro expanded to a preprocessor directive and wasn't the
first token in a line, the result might have been "unexpected";
regression test equate27.asm.
- LODS[B|W|D|Q]: if optional operand contained a DS override, a DS prefix
byte was generated; regression test string3.asm.
- INVOKE may have rejected a valid argument if it was a struct type with
size 4,6 or 8; regression test invoke22.asm.
- using $ in an expression outside of segment block or struct/union was
not rejected; regression test equate28.aso.
- regression in v2.06-2.09: use of an absolute external in an arithmetic
instruction may have suppressed generation of opsize prefix; regression
test extern12.asz.
- EXITM directive inside a macro did not "fix" if-nesting-level issues
caused by the usage of GOTO; regression tests goto1.asm and goto2.asm.
- LOW32 operator in 64-bit didn't always set 32-bit address fixup;
regression tests offset9.asm, offset11.asm.
Other changes:
- CodeView symbolic debug info will contain array records.
- CodeView symbolic debug info: Anonymous structs are now "unfolded";
this is a work-around for the MS debug engine.
- Option -Zi got an optional numeric argument to control the extend
of debugging info that is emitted.
- support for register variables in CodeView debug info (FASTCALL).
- OPTION CODEVIEW added.
- -pe: field TimeDateStamp in file header and in export directory now set
to current date & time.
- -pe: some fields in optional header and section header rounded up to
alignment boundary to satisfy MS COFF specs.
- directive LABEL syntax extension: optional array size argument.
- Warning displayed if line number info is emitted for a segment without
class 'CODE' ( Masm compatible ).
- for improved Masm-compatibility, PUSH|POPCONTEXT ALL does no longer
comprise PUSH|POPCONTEXT ALIGNMENT.
- samples Win32Tls and ComDat added.
- -coff: support for COMDAT sections added.
- -coff: cmdline option -zlp added.
- if the file behind @ cmdline option cannot be opened, a FATAL error is
emitted ( Masm compatible ).
- the register swapping in indirect addressing mode, which was previously
done only if option -Zg was active, is now the standard behavior ( Masm
compatible ).
12/02/2012, v2.09:
Bugfixes:
- setting the value of an assembly-time variable to an alias didn't
reset bits 32-63 of the value (see regression test equate23.asm).
- an undefined symbol in the argument of an assembly-time variable
wasn't always flagged as error.
- the difference of two labels was assumed to be a constant, even if one
or both labels weren't defined (yet). This caused problems if the result
was used in a preprocessor expression or as argument for an
assembly-time variable (see regression test equate22.aso).
- multiple consecutive expansion operators (%) in a macro argument were
rejected.
- comparing two types for (in)equality didn't work in all cases.
- MZ format: values changed by OPTION MZ affected further modules
assembled with -mz.
- regression in v2.08(a): equates with a string value may have been stored
as text macro, althouth the string value fits in 32-bit.
- Win64: the type of expression <struct>.<member> wasn't ignored if such
an expression was used as an argument for INVOKE.
- regression in v2.7-2.08a: a type behind a dot was rejected in some cases
if it didn't match the current type; it must be handled like a type
coercion.
- a struct member with a TYPEDEF type did accept a literal as initializer
without complains. An error occured only if the struct was instanced.
Now a warning is displayed at the struct declaration.
- THIS operator didn't handle structured types correctly.
- SIZE and LENGTH operator returned wrong values if the first expression
contained DUP with an argument of more than 1 item.
- -Zd, -Zi option, COFF format: duplicate entries for static procs may
have occured in symbol table.
- regression in v2.07-2.08a: an explicit type didn't override the assumed
type if OPTION OLDSTRUCTS was set (regression test dotop4.asm).
- OMF format: both communal variables and externals with alternate names
in a module made the assembler create an invalid object module.
- "ifdef FLAT" was always true.
- current prolog and epilog settings weren't reset for each pass.
Actually, this was only a problem if FASTPASS wasn't active ( JWASMR ).
- COFF: .file entry in symbol table was name & extension only.
- 64-bit: for non-FRAME procs, OPTION WIN32:2 (introduced in v2.08) didn't
work if there were register contents to be saved via the USES phrase.
- 64-bit, OPTION WIN64:1: just fix arguments were stored in shadow space,
no "VARARG" arguments.
Other changes:
- JWASMR.EXE: now compiled without support for SSSE3.
- new output format PE and cmdline option -pe added.
- samples Win32_8, Win32_8m, Win64_8, Win64_9a and Win64_9d added.
- tool res2inc added.
- option -Gr ( fastcall calling convention ) added.
- struct initialization does no longer generate code.
- Msvc64.mak added.
- support for Intel VMX extensions added.
- support for AMD SVM (AMD-V) implemented, inactive.
09/07/2012, v2.08a:
- result of a macro function was expanded further even if the final result
was to be enclosed in <> (see regression test expans36.asm).
- expansion of EXITM argument wasn't handled fully Masm-compatible in v2.08
if it contained one or more '!' (see regression test expans37.asm).
08/29/2012, v2.08:
Bugfixes:
- forward references of structures in an expression may have failed
( regression test assume7.aso ).
- if C-style expressions in runtime conditional directives were too
complicated, the generated code may have caused 'symbol not defined'
errors ( regression tests rtcond3.asm, rtcond4.asm ).
- if the argument of the ASSUME directive was a segment register,
the accepted variants of expressions behind the colon was more
restricted than Masm's.
- expansion operator % at position 0 in a line with a macro procedure
call caused a syntax error if nothing was expanded.
- absolute externals were rejected if they were used to initialize a
1-byte variable ( regression test extern8.asz ).
- identifiers inside quoted strings were expanded if the expansion
operator % was at position 0.
- OMF, MZ format: if an assembly-time variable that contained an address
was used in code or data, and the variable's content was later changed
to a number, the assembler emitted either error "missing segment ..."
(OMF) or created wrong code (MZ).
- a text macro as label for INSTR was rejected.
- if a conditional assembly directive occured after expansion only, it
wasn't detected.
- another "corrupted listing"-bug fixed.
- macro parameters and locals weren't detected in quoted strings of macro
lines if the substitution operator & was located AFTER the name only.
- code labels in front of macro procedure invokations were parsed after
the macro arguments were evaluated.
- syntax [<reg|const>+<reg>.<type>].<member> wasn't accepted.
- FASTCALL (MS VC style): if the size of an argument to be stored in a
register didn't fit, an error occured.
- JWASMR.EXE: stack size was too small to handle deeply nested macros;
stack increased from 20 to 33 kB.
- OPTION EPILOGUE: a RET within a user-defined epilogue macro wasn't
translated to RETF if the procedure was FAR.
- JWASMR.EXE, INCBIN directive: optional arguments <offset> and <size> were
limited to 16-bit.
- -nm option: this option to set the "module name" did instead set the
name in the OMF THEADR record. Now it sets the true module name, while
the OMF THEADR record will contain the filename.
- in .IF blocks, multiple .ELSE branches weren't rejected.
- SIZEOF and LENGTHOF did return 0 for data items created with the LABEL
directive.
- values for equates were generally rejected if their magnitude exceeded
32-bits. Now the value is rejected only if it's a plain number,
values of expressions may be 64-bit wide.
- a PURGEd macro may have emitted warnings or errors about missing or too
many arguments.
- a scale factor of 1 allowed the register to be used as base register if
needed. However, any scale factor must enforce the register to be used
as index register.
- 64-bit: default type of parameters and locals was QWORD, but Masm (ML64)
uses DWORD.
- AVX: a few instructions didn't accept an unsized memory operand,
although the size should have been guessed; and a few instructions did
accept an unsized memory operand, although the size couldn't be guessed.
- regression in v2.07: option -Fd=file didn't write all necessary entries
in this version.
Other changes:
- GccWin64.mak added; makes a 64-bit JWasm Windows binary with MinGW-w64.
- IntelC32.mak, IntelC64.mak added; create 32/64-bit JWasm Windows binary
with the Intel compiler.
- optional support for assembly code generated by Intel C++ compiler.
- samples Bin2Inc.asm, Win32_6w.asm, Win32Drv.asm and Win32DrvA.asm added.
- compatibility of -Zm cmdline option ( and OPTION M510 ) improved: the
precedence of [] and () will change from 1 to 9, similar to Masm.
- %OUT directive supported.
- @CatStr 20-argument-limit removed.
- OPTION WIN64 got a new switch ( called: INVOKE Stack Space Reservation )
to autodetect stack space required by INVOKEs within a procedure.
- INVOKE of a FASTCALL (MS VC style) proc: optimization implemented to
avoid to load a register with itself (mov ax,ax).
- extended option -Zg: register are swapped in indirect addressing.
For details see option -Zg in the documentation.
07/21/2012, v2.07a:
- regression in v2.07: for absolute externals, a magnitude was assumed
that may have been too large, resulting in error 'Initializer magnitude
too large'.
- check for multiple overrides in expressions was too rigid in v2.07.
07/02/2012, v2.07:
Bugfixes:
- ELF format: size of .bss segment wasn't set.
- ELF format: segments of class "CONST" weren't marked as read-only
in the ELF module.
- segment attribute INFO wasn't handled for ELF.
- Win64: in v2.05-v2.06, VARARG didn't work for the - first 4 - register
arguments.
- when a procedure's prologue and epilogue code was generated, it was
assumed that radix was 10.
- if the size of a byte array in a structure was defined by the length
of a quoted string initializer, it wasn't marked internally as array
and hence the initialization of data items of this type may have been
wrong.
- it wasn't checked if a string initializer for a simple byte field
in a struct was too long.
- if a struct contains fields with negative offset, the struct's size
was calculated incorrectly.
- JWASMR.EXE: in a few circumstances, negative constants were rejected.
- in v2.04-2.06, it wasn't detected if a group contained an undefined
segment.
- INVOKE: if the argument for a VARARG parameter was a structure, it
was rejected in some cases.
- a line that contained both a comment and a directive which triggered
source line generation (INVOKE, hll directives, ... ) messed up the
listing.
- EQU/= directive: optional type coercions weren't stored, just the
value of the constant.
- FLAT, USE32 and USE64 segment attributes were always accepted, no
check for compatible cpu was done.
- fixups for assembly time variables wasn't correct if the variable
had type "far".
- output format MZ: there was no warning when a 16-bit group's size
exceeded 64 kB.
- OMF output format: many publics in a module may have corrupted
the object module.
- if a struct member was operand for the SEG operator, the member's
offset within the struct was used as addend for the segment fixup.
- calling convention FASTCALL for 16-bit MS C was implemented faulty.
Registers aren't CX and DX, but AX, DX and BX.
- if -Zi was set and a segment had size 0 and a label (empty proc),
the resulting coff object module had errors.
- Win64: .pdata information may have been incorrect if multiple code
sections with SEH data were defined.
- handling of standard register ASSUMEs in the expression evaluator
were not compatible with Masm.
- Win64: in v2.06, the space for local variables was calculated
incorrectly if OPTION FRAME:AUTO was set, an odd number of GPRs &
no XMM registers were included in the USES list.
Other changes:
- IF[N]DEF and .ERR[N]DEF directives: argument may be a structure and
member name, separated by a dot.
- cmdline option -Fd: filename argument for this option is no longer
mandatory for COFF output format.
- FADDP, FMULP, FDIV[R]P and FSUB[R]P variants with no arguments added.
- COFF/ELF: missing support for segment attribute ALIAS added.
- for better Masm compatibility, memory operands with size
1 (PADD[S|US]B), 2 (PADD[S|US]W), 4 (PADDD) and 8 (PADDQ) are accepted.
07/22/2011, v2.06e:
Bugfixes:
- ELF64 format: in v2.05-v2.06d, addends weren't handled correctly.
07/02/2011, v2.06d:
Bugfixes:
- 64-bit: in v2.05-v2.06c, a relocatable constant was often assumed
to have a magnitude of 32, thus accepting operands which are invalid
( "mov m64, offset label" or "push offset label" ).
06/29/2011, v2.06c:
Bugfixes:
- v2.06-v2.06b, directives DB, DW: if the result of a subtraction of
2 labels ( dw label1 - label2 ) was negative, it was rejected.
06/28/2011, v2.06b:
Bugfixes:
- struct fields that were forward referenced may have caused warnings
or errors in v2.06-v2.06a.
- in v2.04-v2.06a, if a pointer to a struct was redefined and the
redefinition used a type alias, the redefinition failed (see
regression test types5.asm)
06/26/2011, v2.06a:
Bugfixes:
- in v2.06 was a regression for IMUL with 3 operands: if the third
operand's value was 127 < x < 256, the instruction was encoded
incorrectly.
06/26/2011, v2.06:
Bugfixes:
- relative pathes for filenames containing '/' may have caused
problems in non-Unix versions.
- register "assumes" on the right side of the binary '+' operator
were ignored.
- 64-bit: in v2.05, "MOV <reg>,offset <label>" was created with a
32-bit immediate (and fixup).
- JWASMR.EXE: struct sizes > 32767 caused problems.
- for RECORD types used in an expression, the default value must be the
record's mask, not the record's size in bytes.
- offset of a struct member may have been calculated wrongly if the base
was just a type (not a variable) AND the first member also had a
struct type ("mov eax, <struct_type>.<mbr>.<mbr>").
- inside struct declarations, a '?' was accepted as initializer of struct
members.
- segment combine type COMMON was displayed as '?' in listing.
- in v2.00-v2.05, PUSH/POP of a 64-bit memory operand wasn't rejected
in 16/32-bit code.
- in v2.05, quoted filenames in the cmdline didn't work.
- division operator '/' did interpret operands as unsigned values.
- instructions BT, BTC, BTR and BTS did accept memory byte operands.
- instruction PALIGNR wasn't encoded correctly.
- OPTION RENAMEKEYWORD: restoring of the keywords failed.
- instructions INSx and OUTSx weren't encoded correctly if arguments
were given.
- INVOKE, 64-bit: float constants may have caused a GPF.
- INVOKE: size check for constants was missing.
- in v2.05, indirect addressing may have failed with 'structure field
expected' if address was in format [reg].<member>[reg].
- an erroneous redefinition of a RECORD type may have caused a GPF.
- if multiple files were assembled with different output formats,
some combinations didn't work as expected due to unwanted side
effects.
- LABEL directive: code labels (NEAR, FAR, PROC) cannot be defined
anymore if CS is assumed ERROR. Previously this check was done only
when the label was defined through a trailing colon.
- operator THIS was accepted in expressions outside segments.
- XLAT, XLATB: memory operand of any size was accepted.
- IMUL: syntax check was sloppy.
- CMOVcc: byte registers were accepted as first operand.
- if an instruction has just a memory operand, but with multiple
possible sizes, no error was emitted if size of current argument
was unspecified.
- in IF blocks, multiple ELSE branches weren't rejected.
- size of fixup for absolute externals may have been wrong in a few
cases ( i.e. second operand of BT[c|r|s] instructions ).
- check for REAL4 initializer limits was missing.
- arrays in unions weren't taken into account with their full size.
- it wasn't checked if names of fields of anonymous struct members were
already used in a struct.
- magnitude test of numbers wasn't strict enough.
- in v2.05, if the argument of EQU was a number with a
magnitude > 32 bits, the equate wasn't created as a text macro.
- operator DUP: if initial value was a quoted string and size of the
data item was > 1, every second repetition was incorrect.
- 64-bit: max. width of RECORD was 32 - changed to 64.
- 64-bit: if OPTION FRAME:AUTO was set and a XMM register was added
in the USES list or a PROC, the offsets of local variables wasn't
calculated correctly and the generated epilogue may have used a wrong
value to restore RSP.
- if a text macro, defined via cmdline option -D, was also defined in
the source and the value of both definitions was an empty string,
a GPF did occur.
- HADDPD, HADDPS, HSUBPD, HSUBPS: variant with m128 as second operand
was rejected.
- 64-bit: PEXTRQ/PINSRQ were encoded incorrectly if a m64 operand
was destination or source.
- syntax 'INVOKE <struct_name>.<mbr>[reg]' caused a GPF in v2.05 (and
didn't work in v1.96-v2.04).
- expansion of macro arguments changed so text macros are expanded
earlier ( needed in cases when a macro argument was a text macro
and the value of the text macro was a macro function call - see
macparm.asm regression test ).
Other changes:
- cmdline option -Sf added.
- OPTION RENAMEKEYWORD, OPTION MZ: syntax changed. Both options used
comma-separated values, which made it impossible to use them in a
"multiple-option" line.
- operators LOW32/HIGH32 supported.
- INVOKE: 64-bit constants (integer and floating-point) supported as
parameters.
- Value of predefined text macro @Version changed from <615> to <800>.
- OC.mak added to support the Orange C compiler (LadSoft).
- result of SHL operator is now 64-bit, same as with Masm v8+.
- OPTION DLLIMPORT added.
- cmdline option -Fd added.
- cmdline option -Fr (set error file name) changed to -Fw, since
option name -Fr is already used by Masm (limited browser info).
- instructions XSAVE, XRSTOR, XGETBV, XSETBV, XSAVEOPT supported.
- AVX instruction set supported.
03/02/2011, v2.05:
Bugfixes:
- PROC directive: it wasn't checked that VARARG parameter was last
parameter.
- ASSUME directive: using an arbitrary pointer type as argument
didn't work as expected.
- CVTSI2SD, CVTSI2SS: memory operand could be of any size. Also, if
it was m64 in 64-bit, no REX-W prefix was generated.
- MOVD: 64-bit memory operand wasn't accepted in 64-bit mode.
- PINSRW: memory operands of any size were accepted.
- in v2.04, a macro name which was located behind a '::' wasn't
expanded, which usually resulted in a syntax error.
- "undefined" types may have caused a GPF if -Zi was set.
- some errors fixed in INVOKE support of Open Watcom fastcall register
calling convention.
- most conditional error directives did emit their errors in pass one,
which was too early.
- there was a risk that macro functions in an EQU argument were
expanded (if the macro invocation was hidden in a text macro).
- check for conflicting parameter types for PROC/PROTO wasn't as
rigid as Masm's.
- EXTERN and EXTERNDEF didn't accept prototype type symbols.
- prologue code generation was triggered slightly differently compared
to Masm.
- syntax check of macro "local" lines was too sloppy.
- when searching macro parameter and local names in macro lines, the
search was always case-sensitive, ignoring current case-mapping
setting.
- ELF64 format: relocations were stored in sections of type SHT_REL.
Changed to SHT_RELA.
- in v2.04, SIZE operator might have returned wrong results for
structured variables (SIZEOF had no problems).
- in v1.93-v2.04, initialization of an array of structures may have
given a wrong result if both DUP and comma operators were used.
- check if a data definition directive was preceded by a code label
- which isn't allowed without -Zm option - wasn't fool-proved.
- the tokenizer did scan numbers not exactly like Masm does, which
caused problems if a number was immediately followed by an identifier.
- MZ format: segment fixups for a segment in a group were wrong if both
the group and the segment weren't located at 0.
- INVOKE, 16-bit code, VARARG parameter: in v2.04, if argument was a
32-bit register, register SP was adjusted wrongly after the call.
- it wasn't checked if GOTO labels inside macros were reserved words.
- INVOKE, 64-bit Windows: in v2.04, it wasn't possible to call functions
which had a VARARG parameter.
- PURGE directive: directive arguments weren't expanded.
- preprocessor directives [ELSE]IF[E] weren't always able to detect
undefined symbols in their argument.
- EXITM: syntax check of the directive's argument wasn't too strict.
- SIZESTR: the directive's label wasn't expanded.
- GOTO: a macro label placed just before the ENDM line wasn't found.
- PUSH/POP: there was no error msg when the argument was a structured
variable with an unsuitable size.
- expression evaluator was unable to handle floating-point constants.
Unary operators +, -, OPATTR and .TYPE are supposed to accept those.
- JWasm's dot operator (.) accepted arguments that Masm does only if
OPTION OLDSTRUCTS is active.
- in a few cases the end of "undelimited" strings wasn't detected.
This mostly applies to string macros (@CatStr) used as arguments
for other macros.
- "assumed" predefined types were ignored by the TYPE operator.
- in v2.03-2.04, an "empty" argument in a macro VARARG parameter list
did reset the list.
- if the expansion operator (%) was used to convert a numeric expression
to text. it was always handled. This was an error, because it is
supposed to be accepted for arguments of preprocessor directives or
macros only.
- line concatenation triggered by a comma as last token wasn't fully
Masm-compatible: if the line is an instruction, a comma should NOT
trigger the concatenation. OTOH, if the comma is a result of a
(text) macro expansion, it should trigger concatenation.
- if a source file argument wasn't the first and the file couldn't
be found, a GPF occured.
- INC/DEC: in v1.94-2.04, "unsized" memory operands were accepted.
- SHLD/SHRD: syntax check was too sloppy.
Other changes:
- cmdline option -eq added.
- cmdline option -zld added.
- INVOKE support for Open Watcom register calling convention enabled.
- OWWinDll.mak and MsvcDll.mak added to create JWasm as a Win32 dll.
- source code in listing file now starts at column 32.
10/17/2010, v2.04c:
Bugfixes:
- in v2.04-2.04b, a type coercion of NEAR or FAR for a memory operand
(sometimes used for indirect calls or jumps ) didn't work correctly.
10/08/2010, v2.04b:
Bugfixes:
- in v2.04 + v2.04a, if IMUL's second argument was a forward reference
and a third argument was also given, then error 'invalid instruction
operands' was emitted.
- an empty PROC located outside of a segment block didn't emit error
'Must be inside segment block' - and in v2.04 additionally an access
violation did occur.
- using ALIAS names in expressions was rejected in v2.04. Previously,
this wasn't rejected, but fixups were wrong, which wasn't better.
10/05/2010, v2.04a:
Bugfixes:
- in v2.04, if operator OFFSET was used in an indirect addressing
expression ( mov ax,[bx+offset var] ), the variable's type information
wasn't removed.
- in v2.04, value of assembly time variables were evaluated wrong if they
were forward referenced.
- in v2.04, error 'symbol type conflict' did occur if a type was defined
twice, first as an arbitrary type, second as a scalar type, and the
arbitrary type was just an alias of the scalar type. Example:
type1 typedef ptr
type2 typedef type1
type2 typedef ptr
- operator SEG didn't enforce the argument to have size WORD.
10/04/2010, v2.04:
Bugfixes:
- ELF fixups for 16-bit relative offsets (GNU extension) were wrong.
- PUSHCONTEXT|POPCONTEXT didn't accept multiple arguments.
- a code segment defined with simplified segment directive .CODE,
with a name argument and which was added to a group BEFORE the
definition, was created with default attributes.
- MZ format: segment fixups in the MZ header weren't always calculated
correctly.
- ALIGN, EVEN: "filler" bytes were emitted unless the segment was
"absolute" or "bss". Now this is done only when data or code was
emitted just before the directive.
- COFF format: JWasm expected to use the ".drectve" section exclusively.
If it was defined within the source, an error occured.
- COFF format: option -SAFESEH didn't emit a "@feat.00" absolute
symbol in the object module, as requested by the MS COFF specification.
- JWASMR.EXE: v2.03 often fell into an endless loop due to an error in
fixup management for backpatching.
- in v2.03, constants with -65536 < value < -32768 were not accepted
for 16-bit targets in MOVs.
- a label was accepted even when there already existed a proto with the
same name.
- operator TYPE ignored a possible coercion for a type argument.
- a duplicate RECORD definition was rejected, even if both definitions
were identical.
- an absolute external used as a byte immediate may have caused invalid
code to be generated ( extern x:abs - or al,xx ). MOV and PUSH were
not affected, though.
- in v2.00-2.03, PROTOs were listed in the "Symbols" section, not in
the "Procedures" section.