PRB: Bad Object File Generated with MASM 5.1 and 5.1a

ID Number: Q67760

5.10 5.10a | 5.10 5.10a

MS-DOS | OS/2

buglist5.10 buglist5.10a fixlist6.00

Summary:

SYMPTOMS

The following mixed-language program does not assemble properly

under the Microsoft Macro Assembler (MASM) version 5.1 and 5.1a.

CAUSE

The assembler does not generate the correct .OBJ record for the

linker to resolve the reference properly. When the .EXE is built,

the _foo variable is located in the NULL segment instead of the

_DATA segment; therefore, instead of the residing 1 byte apart,

they are actually 42h bytes apart.

RESOLUTION

Removing the ASSUME statements from the assembly code eliminates

the problem. These ASSUME statements are not necessary.

STATUS

Microsoft has confirmed this to be a problem in MASM versions 5.1

and 5.1a. This problem was corrected in MASM version 6.0.

More Information:

Sample Code #1

--------------

; Assemble options needed: none

dosseg

.model small

.data

assume ds: nothing

public _foo

_foo db 1

assume ds: @data

public _bar

_bar db 2

.code

public _func

_func proc

mov ax, offset _bar

sub ax, offset _foo

ret

_func endp

end

Sample Code #2

--------------

/* Compile options needed: none

*/

#include <stdio.h>

extern char foo;

extern char bar;

main ()

{

printf ("C distance of bar - foo = %X\n", &bar - &foo);

printf ("MASM distance of bar - foo = %X\n", func ());

}

Additional reference words: 5.10 5.10a 6.00