BUG: Cannot Access Static Data Members in Inline Assembly

ID: Q88092


The information in this article applies to:
  • The C/C++ Compiler (CL.EXE), used with:
    • Microsoft C/C++ for MS-DOS, version 7.0
    • Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5
    • Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 2.1, 4.0, 4.1, 4.2, 5.0, 6.0


SYMPTOMS

When trying to access static data members in a C++ program with inline assembly, the compiler may report the following errors:

error C2420: 'identifier' : illegal symbol in first operand 1
error C2415: improper operand type
The inline assembler cannot access static data members within a class member function. The sample code below demonstrates the problem.


STATUS

Microsoft has confirmed this to be a problem in the Microsoft products listed at the beginning of this article.


MORE INFORMATION

To access the static data member, assign the address of the data member to a temporary variable. The inline assembler can then access the data by loading the address from the temporary variable.

Below is code that demonstrates the problem and workaround.

Sample Code


   /* Compile options needed: /AS  for 16-bit
   *                          none for 32-bit
   */ 

   #include <stdio.h>

   class sample
   {
   public:

      static int value;
      sample();

   };

   int sample::value = 9;

   sample::sample()
   {

        __asm mov value,3             // C2420 and C2415 here
        __asm mov sample::value,ax    // C2420, C2414, C2400 on
                                      // this line

   //  For 16-bit workaround, uncomment next three lines.
   //     void * valueptr=&value;
   //     __asm mov bx, valueptr
   //     __asm mov [bx],3

   //  For 32-bit workaround, uncomment next three lines.
   //     void * valueptr=&value;
   //     __asm mov ebx, valueptr
   //     __asm mov [ebx],3
   }

   int main( void )
   {
      sample aSample;
      printf( "aSample.value = %d.\n", aSample.value );
      return 0;
   } 

Additional query words: 8.00 8.00c 9.00 10.00 10.10 10.20

Keywords : kbVC100bug kbVC150bug kbVC200bug kbVC210bug kbVC400bug kbVC410bug kbVC500bug kbVC600bug
Version : winnt:1.0,2.0,2.1,4.0,4.1,4.2,5.0,6.0
Platform : winnt
Issue type : kbbug


Last Reviewed: March 27, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.