FIX: Bad Jump Calculated in Function Containing an _asm Block

ID: Q102162

7.00 | 1.00 MS-DOS | WINDOWS kbtool kbfixlist kbbuglist

The information in this article applies to:

SYMPTOMS

An attempt to run an application fails. When the application runs in the Microsoft Windows operating system, a General Protection (GP) fault occurs. In the MS-DOS operating system, the application may hang or cause the system to crash.

CAUSE

The C++ optimizing compiler generates a bad jump target in the return of a function when the function includes an _asm block that contains floating-point instructions.

RESOLUTION

There are two methods to work around this problem:

STATUS

Microsoft has confirmed this to be a bug in the products listed above. This problem was corrected in Visual C++ for Windows, version 1.5.

This problem does not occur in Visual C++, 32-bit Edition, version 1.0.

MORE INFORMATION

The following code example demonstrates this problem:

Sample Code

/*
 * Compiler options needed: /f- /AL to demonstrate problem
 * Optional additional options: /Od /Zi
 */ 

void tdt(double x)
{
   _asm
   {
      fld x
      f2xm1
      ; fptan also causes a bad jmp calculation
      fwait
   }      // Bad JMP instruction
}
void main()
{
   double x1 = 0.4;

   tdt(x1);
}

Additional reference words: 1.00 7.00 8.00 KBCategory: kbtool kbfixlist kbbuglist KBSubcategory: CLIss

Keywords          : kb16bitonly kbCompiler kbbuglist kbfixlist
Version           : 7.00   | 1.00
Platform          : MS-DOS WINDOWS
Solution Type     : kbfix

Last Reviewed: September 20, 1997