-
Notifications
You must be signed in to change notification settings - Fork 24
/
History.txt
2453 lines (2334 loc) · 134 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
Changelog
__.__.____, v2.19:
Bugfixes:
- format mz: stack segment was never written - a fault if it isn't
located at the end of the binary; see stack1.asm.
- format mz,pe: start offset for first segment may have resulted in
an invalid binary; see org1.asm & org2.asm.
- fastcall 32-bit (MS style): registers may have hold float arguments.
- no 'implicit far jmp/call to near label' error in pass one; see
group7.asm.
- option -D: accept white spaces if option is enclosed in double quotes
( Masm compatible ).
- subtraction of 2 labels may have caused error "constant value too large";
see minus1.asm.
- if .model wasn't flat, but segments with flat attribute existed, they
may not have been listed in symbol table.
- regression in v2.05-v2.18, DUP operator: if an undefined symbol was
contained in first operand, error message may have been omitted; see
struct43.asm.
- local labels were accepted by PUBLIC directive without -Zm being set;
see public3.asm.
- omf format: incorrect special handling of assembly-time variable fixups
removed; see label9.asm.
Other changes:
- write listing reworked.
- option -pe: add segments with combine type stack - they may contain
initialized data.
- JWasmr.exe: option -Sz removed.
- PUSHW will emit warning "magnitude of offset exceeds 16-bit" if
operand is a 32-bit offset.
- using 'option oldmacros' will cause a warning only.
- option -pe: info section ".drectve" will be scanned and some linker
options are recognized and handled.
- PUBLIC directive extended to allow setting the export attribute.
- PAGE directive: syntax check added.
- .model flat: ensure variables in 16-bit segments can be accessed
directly if segment register is assumed flat ( Masm compatible );
see flat2.asm.
09.06.2024, v2.18:
Bugfixes:
- omffixup.c, debug version only: a superfluous %s in a debug display
may have caused an exception for output format omf.
- invoke directive: vararg parameter now rejected if used as argument;
see vararg1.asm.
- don't add "assume cs:dgroup" in tiny model if format is coff/elf or
model is flat; see tiny3.asm.
- default fastcall for 32-bit (MS style) caused a GPF for non-proc
symbols; see fastcms.asm.
- listing: when segment directive created a list entry, the offset size
may have been wrong.
- omf format: externdef may have caused a PUBDEF record to be written
in pass 2, resulting in an invalid object module.
- invoke directive: if cpu was 8086, and the argument was a constant 0,
a wrong value may have been pushed; see invoke56.asm.
- jwasm may have entered an infinite loop if a structured variable wasn't
defined (yet), but a member name matched a local name; see undef2.asm.
Other changes:
- output format -djgpp: support added for 16-bit offset fixups.
- in listings, for directives, offset of 16-bit segments displayed with
width 4.
- OWDOS32.mak added. Creates a 32-bit version that uses the native Open
Watcom runtime for extended DOS. Open Watcom 2.0 is recommended to
create this variant.
- listing: relocations in code marked with lowercase letters.
25.03.2023, v2.17:
Bugfixes:
- option renamekeyword: if the keyword was renamed multiple times it
did work only if the first occurance of this option was after an
instruction or directive that triggered "fastpass"; see renkeyw.asm.
- option renamekeyword: keywords weren't restored to their default at
end of pass; see renkeyw2.asm.
- option renamekeyword: renaming an already renamed keyword may have
caused an infinite loop; see renkeyw3.asm.
- size operand of DUP operator was checked to be positive, but wasn't
checked for 32-bit overflow; see constnt3.asm.
- direct memory access with flat override ( for constant addresses )
may have generated error "cannot access label through segment registers";
see flatgrp3.asm.
- regression in v2.16: invoke may have generated a "PUSHD" in 64-bit code
if .model wasn't flat; see invoke54.asm.
- FLAT: override may have suppressed address size prefix; see
flatgrp4.asm.
- invoke, 64-bit, non-win64, vararg: 32-bit registers were rejected as
arguments; see invoke55.asm.
- display of assembly-time was correct only if CLOCKS_PER_SEC was 1000.
- listing of embedded structs/unions: the printed start offset was wrong
if the struct/union wasn't located before any code/data lines; see
struct42.asm.
- djgpp output format was broken.
- COMM directive: if a type was given instead of a size, the type wasn't
stored in the symbol and hence couldn't be used in expressions; see
comm7.asm.
Other changes:
- option stackbase: may be used in conjunction with "assume ss" to
define a PROC where CS and SS differ in offset magnitude ( 16-bit
code with 32-bit stack and vice versa ); see stkbase1.asm, stkbase2.asm.
- format -pe: 64-bit segments defined with USE64 are added to internal
"flat" group if model is flat. Allows to mix 32- and 64-bit segments in
.model FLAT; see flatgrp5.asm & flatgrp6.asm.
- simplified segment directive .code with name argument in tiny model
always added the segment to dgroup. Now this is done only if segment's
offset size matches the model's offset size; see tiny2.asm.
- RETs inside PROCs will now show up in listing file like in Masm; see
lst3.asm.
- in listings, offset of 16-bit segments now displayed with width 4.
- offsets/displacements that are too large will now always cause error
"constant value too large"; see offset17/18/19.asm.
- output format -djgpp ( special coff variant ), previously optional only,
is now activated as default.
14.11.2022, v2.16:
Bugfixes:
- format mz: in the binary map of listings, the RVA of segments belonging
to a group may have been incorrect, since the group's align adjustment
was ignored; see grpalign.asm.
- symbol $ is internally marked as assembly-time variable - this caused
fixup problems in OMF format; see fixup6.asm.
- invoke directive, 32-bit code, "ADDR": if the address of a symbol
in a 16-bit segment was to be pushed, just a WORD was pushed ( Masm is
buggy, pushes a DWORD, then a WORD ); see invoke41.asm.
In the "reverse" case, that is, if the address of a symbol in a 32-bit
segment was to be pushed as a WORD in a 16-bit code segment, a DWORD
was pushed instead; see invoke43.asm.
- invoke directive, 32-bit code, "OFFSET": if the address of a symbol
in a 16-bit segment was to be pushed, just a WORD was pushed ( Masm emits
an error in this case - this is now done as well ); see invoke42.asm.
The "reverse" case ( 16-bit code, address of a symbol in a 32-bit
segment to be pushed ) must also be rejected; see invoke44.asm.
- invoke directive, "ADDR", "far ptr" modifier for vararg arguments: the
modifier was ignored, so that no segment part was pushed; see
invoke45.asm & invoke46.asm.
- invoke directive, ptr types: invoke might have emitted error "argument
type mismatch" for arguments of type MT_PTR if their distance didn't
match the one from the memory model; see invoke47.asm - invoke52.asm.
- externdef directive: if the symbol was already defined but neither
internal nor external, no error was emitted; see extern16.asm.
- pointer to data did ignore default distance of memory model; see
dsize.asm.
- option -pe: .data and .data? sections weren't merged; see pe11.asm.
- option -pe: if a section with initialized data (.reloc) followed a .data?
section, space for the .data? section was reserved in the binary; see
pe11.asm.
- if the difference of 2 labels ( at least one is a forward reference ) is
used as operand for another op ( shift ), error 'constant is expected'
may have occured; see forward9.asm.
- option -pe: binary without relocations got too long because the (empty)
.reloc section wasn't removed; see pe12.asm.
Other changes:
- option -pe: allow imports by number; see pe10.asm.
- option -Zg: increased Masm compatible codegen for hll expressions; see
hll4.asm.
- warning "Prologue not at PROC start" (level 3) added if the procedure's
prologue isn't generated at the procedure's start address; see
invoke53.asm.
- option -pe: default image bases changed to 0x10000000 for PE32 dlls,
0x140000000 for PE64 exes, 0x180000000 for PE64 dlls (MS link compat).
- error 2058 ( "magnitude of offset exceeds 16-bit" ) changed to a warning
( level 3 ); see offset15.asm & offset16.asm.
- if option -Zg is on, OPATTR is to return language bits for procs/protos
only; see opattr10.asm.
09.04.2022, v2.15:
Bugfixes:
- format bin, mz, omf, pe: fixup created by direct addressing without
symbol ( _DATA:1234h ) was still not always correct if segment was in a
group; see lea2.asm.
- invoke directive: a missing left square bracket for indirect addressing
may have been accepted if the size of the register matched the expected
size; see invoke4.asm.
- using long instead of intptr_t to hold result of _findfirst() caused a
GPF in Win64 version; see main.c.
- erroneously emitted error 'Magnitude of offset exceeds 16-bit' in direct
addressing mode without symbol if segment register had no assume, segment
was 32-bit and default word size was 16-bit only; see offset14.asm.
- <loadds> prologue argument was ignored if procedure had no parameters and
locals; see loadds.asm.
- text macro and macro function expansion might have caused a buffer
overflow if expanded line got too long; see expans42.asm & expans44.asm.
- macro function expansion inside text macros had swallowed trailing white
spaces behind the macro invokation, sometimes resulting in errors; see
expans43.asm.
- a constant defined via EQU could have been changed to an assembly-time
variable if the value didn't change; see equate30.asm.
- if two relocatable items belonging to different segments were
subtracted in an expression on the right side of EQU, strange error
"symbol redefinition" was emitted when that symbol was used later; see
equate31.asm.
- assembly-time variables: if the expression on the right side of the
equal sign contained an undefined symbol, it might have been ignored;
see expr7.asm.
- -pe option: the name in the export directory may have started with a
slash/backslash.
Other changes:
- error "too many segments/sections defined..." emitted for omf and coff
if the number of segments/sections cannot be handled by those formats.
- warning "64-bit label referenced with 32-bit fixup", introduced in v2.14,
will be emitted at level 4 only if the code referencing the label isn't
64-bit.
- format coff: warning "Output format doesn't support anonymous fixups..."
displayed if a segment override other than FLAT: is used without symbol.
- .model flat directive in 64-bit is now rejected in omf format.
- warning displayed in binary formats if a linker directive section is
detected.
- warning displayed for PUSHW/PUSHD if operand is a segment register and
the size suffix doesn't match the current mode; see pushwsr.asm and
pushdsr.asm.
- if user-defined prologue returns 0, offsets of local variables are no
longer "adjusted". This is undocumented Masm behavior; see prolog3.asm.
- directive OPTION READONLY will no longer cause an error, just a warning
that it's ignored.
20.12.2020, v2.14:
Bugfixes:
- regression in v2.13: if a not yet defined segment was added to a group,
it got the current offset size, which caused an error if this wasn't the
offset size when the segment was created; see group5.asm.
- there was still the possibility that segments with different offset
sizes were added to the same group; see group6.asm.
- string operation MOVSx with operands: if destination got an override
(ES:), a source without override was rejected; see string4.asm.
- string operation MOVSx with operands: destination with override
!= ES wasn't rejected; see string5.asm.
- string operations with symbolic memory operands did ignore assumes, thus
no segment prefix was created; see string8.asm.
- comment behind MACRO directive was appended to all lines inside the
macro; see lst2.asm.
- jwasmr.exe: memory corruption may have caused a system crash if pass one
ended with an error.
- some errors occured in LP64 systems (linux, unix) because LONG_MAX and
LONG_MIN were used inadequately.
- INVLPG with direct address >= 0x10000 in 16-bit code was rejected, even
if preceded by 'assume ds:flat'; see invlpg2.asm.
- using direct addresses without symbol ( i.e. flat:[1234h] ) may have
caused a GPF if used in math opcodes ( CMP, OR, ...); see flatgrp2.asm.
- option -bin: using direct addressing without symbol ( _DATA:1234h )
didn't store the offset in the binary; see data1.asm.
Other changes:
- jfc.asm translated to jfc.c so it can be used in both 32- and 64-bit
unix systems.
- added runtest.sh, clrdir.sh and compress.sh to allow regression test in
unix systems. A few tests are skipped, since jwasmr.exe and MS link.exe
won't run in those systems.
- DJGPP: djgpp apparently doesn't know "_stat", needs "stat" instead; see
omf.c
- error "ADDR32 fixup to <xxx> at location ..." emitted if 64-bit PE is
created and 32-bit fixup target address is >= 0x80000000; see pe7.asm.
- warning "64-bit label referenced with 32-bit fixup" ( warning level 3 )
emitted if 32-bit address used for 64-bit target.
- translation for 8/16/32-bit register arguments for INVOKE in 64-bit if
they are to be pushed; see invok64d.asm.
03/14/2020, v2.13:
Bugfixes:
- regression in v2.12: option -bin didn't work if binary started with
ORG != 0 ( i.e. DOS COM file format ); see bintest2.asm.
- option -mz,-bin: invalid binary was written if a .bss or .stack segment
was followed by a segment with initialized data; see mz2.asm.
- options -mz,-bin,-omf: a segment override may have caused a group
association to be ignored; see fixup5.asm.
- options -mz,-bin: simplified segment directives now generate an assume
for CS that refers to the group (if the segment is in a group).
This solves some fixup problems; see fixup5a.asm.
- INVOKE directive, 64-bit: if the calling convention wasn't win64
(=fastcall), an address argument was translated to a "push offset <arg>",
which didn't work in 64-bit code; see invok64c.asm.
- option -pe: if a DOS stub was added in the source (section .hdr$1), it
got the wrong segtype, resulting in an invalid binary; see pe4.asm.
- stack offsets may have caused an error in 64-bit mode or a warning in
the other modes if an overflow occured; see stkdisp1.asm.
- option -pe,-bin: relative fixups weren't handled correctly in all cases;
was relevant for 64-bit only; see pe5.asm.
- if an 'undefined symbol' error was displayed, a wrong source file was
given if the error occured in a macro and the line was the first 'real'
code line; see undef1.asm.
- a qword-sized parameter in an invoke wasn't pushed correctly if a .x64
directive was in the source, although the current mode was not 64-bit;
see invoke40.asm.
- equates in listing weren't always displayed correctly if value exceeded
32-bit; see lst1.asm.
- ensured that if cpu is 64-bit, .model is restricted to flat.
- TYPE operator didn't work with register operands inside square brackets;
see types16.asm & types17.asm.
- in 64-bit mode, 16-bit index register wasn't rejected; see expr6.asm.
- assembly-time variables modified by directives SIZESTR/INSTR did set
the lower 32-bits of the value only; see equate29.asm.
- option -pe: when arranging segments to sections, the segment names
defined in the source were used; this may have given unexpected results
if segment names were translated to section names ("_TEXT" to ".text" );
see pe6.asm.
- hll directives: an internally created label was "swallowed" in some cases
if operators && and || were used in combination with brackets; see
rtcond10.asm - rtcond16.asm.
- check for segment word size change wasn't as strict as Masm's. If a not
yet defined segment was added to a group, no consistency check was done
later when the segment was actually defined; see group4.asm.
- 32-bit relative fixups were created only when the target was 64-bit. Now
they were created generally when the current segment is 64-bit. This
makes a difference for mixed-mode binaries ( -mz and -bin format ),
because it simplifies access of variables in 16-/32-bit segments from
64-bit; see relfix64.asm.
Other changes:
- project tree changed so all generated files are located in 'build'
subtree, and source files are in 'src'.
- -Sz cmdline option added to suppress assembly result in listing. This
was mostly done to simplify comparing listing files in regression tests.
08/19/2018, v2.12:
Bugfixes:
- COMM directive: there was no check that numeric arguments 'size' or
'count' did fit into 32-bits; see comm06.asm.
- 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.asm.
- 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.asm.
- procedure equates didn't inherit the language type; subsequently, if
used with INVOKE, the arguments might have been pushed in incorrect
order.
- operator HIGHWORD didn't work correctly with negative constants.
See SF bug #298.
- regression in v2.09-2.11: '!' disappeared in macro arguments if the
argument was enclosed in angle brackets (see expans41.asm).
- regression in v2.05-2.11: 'push lowword offset label32' did push a
dword instead of a word only (see lowword.asm and also the comment in
offset10.asm).
- warning 'for -coff leading underscore required for start label' is no
longer emitted if coff format is 64-bit.
- [] operator didn't work correctly if located between a struct name and
a member name; see dotop6.asm.
- option -mz: if a "nongroup"-segment was located between 2 segments of
a group, the offsets of the second "group"-segment were calculated
wrong. See group2.asm & group3.asm.
- if direct addressing without symbol was used ( ds:[0] ) in a mixed
32-/64-bit module, error 'magnitude of offset exceeds 16 bit' may have
been generated. See mixed2.asm & mixed3.asm.
- option -mz: size of a bss segment was not taken into account for further
segment calculations if the bss segment was not part of a group. See
mz1.asm.
- option -mz: no warning was displayed when start label was not located
in a 16-bit segment. See text32.asm.
Other changes:
- OPTION WIN64:4 added.
- cleaned the source code a bit so CLang v5 can compile it without
warning. Added CLUnix.mak, CLang.mak renamed to CLWin.mak.
- option -pe: 16-bit code sections are now separated from 32-bit sections.
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.asm.
- 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.asm.
- 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.asm.
- empty quoted strings were accepted as instruction operands; see
quotstr2.asm ).
- 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.asm.
- OMF format, options -Zd, -Zi: the size of line number records may have
exceeded 1024; see linnum.asm.
- OMF format, option -Cu: names of communals and exports weren't converted
to uppercase; see casemap1.asm.
- 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.asm.
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.asm.
- 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.asm.
- -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.asm and
proc5.asm.
- -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.asm.
- 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.asm.
- 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.asm.
- 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.asm.
- 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.asm.
- 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.asm.
- 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.asm).
- 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.asm ).
- 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.asm ).
- 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