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