ID Number: Q65743
6.00 | 6.00
MS-DOS | OS/2
buglist6.00 fixlist6.00a
Summary:
The Microsoft C version 6.00 compiler can generate incorrect offsets
for jmp instructions following the termination of in-line assembly
blocks in certain situations.
More Information:
The sample code below will generate the incorrect offset for the
return statement following the termination of its in-line assembly
block. The only known workaround is to compile with the /qc option,
thus invoking the quick compiler.
If the optimize pragma is removed from this code, it will generate the
following error with any command-line optimization switch.
fatal error C1001: Internal Compiler Error
(compiler file '@(#)main.c:1.176', line 807)
Contact Microsoft Product Support Services
Sample Code
-----------
#pragma optimize("",off)
#include<stdio.h>
long double asin(long double f_in)
{
_asm
{
fld f_in
fld st
fmul st,st
fld1
fcom st(1)
fstsw ax
sahf
jc toobig
fsubr
fsqrt
/* fxch st(1) uncomment for acos */
fpatan
jmp done
toobig:
fstp st
fstp st
fabs
fchs
fsqrt
done:
fstp f_in
}
return f_in;
}
main()
{
char s[200];
long double f_in,f_out;
f_in=0.0;
while(gets(s)!=NULL)
{
if (sscanf(s,"%Lf",&f_in)==1)
{
f_out=asin(f_in);
printf("in %Lf asin %Lf\n",f_in,f_out);
}
}
exit(0);
}
The following is incorrect code generated as viewed from within
CodeView's mixed source/assembly mode (compiled with cl /Od /Zi
file.c):
29: fstp f_in
0047:004C 9B WAIT
0047:004D DB7E04 FSTP TByte Ptr [BP+04]
30: }
31: return f_in;
0047:0050 9B WAIT
0047:0051 DB6E04 FLD TByte Ptr [BP+04]
0047:0054 9B WAIT
0047:0055 D9C0 FLD ST(0) ; different from below
0047:0057 9B WAIT
0047:0058 DDD9 FSTP ST(1) ; perhaps repetitive
0047:005A 90 NOP
0047:005B 9B WAIT
0047:005C E9FAFF JMP 0059 ;notice incorrect offset here
32: }
0047:005F 5E POP SI
0047:0060 5F POP DI
0047:0061 8BE5 MOV SP,BP
0047:0063 5D POP BP
0047:0064 C3 RET
33:
The following is correct code (compiled with cl /qc /Od /Zi file.c):
0047:004C 9B WAIT
0047:004D DB7E04 FSTP TByte Ptr [BP+04]
30: }
31: return f_in;
0047:0050 9B WAIT
0047:0051 DB6E04 FLD TByte Ptr [BP+04]
0047:0054 90 NOP
0047:0055 9B WAIT
0047:0056 E90000 JMP 0059 ; offset correct here
32: }
0047:0059 5F POP DI
0047:005A 5E POP SI
0047:005B 8BE5 MOV SP,BP
0047:005D 5D POP BP
0047:005E C3 RET
33:
Microsoft has confirmed this to be a problem in C version 6.00. We are
researching this problem and will post new information here as it
becomes available.