BUG: Cannot Access Static Data Members in Inline Assembly (88092)



The information in this article applies to:

  • Microsoft C/C++ for MS-DOS 7.0
  • Microsoft Visual C++ for Windows, 16-bit edition 1.0
  • Microsoft Visual C++ for Windows, 16-bit edition 1.5
  • Microsoft Visual C++, 32-bit Editions 1.0
  • Microsoft Visual C++, 32-bit Editions 2.0
  • Microsoft Visual C++, 32-bit Editions 2.1
  • Microsoft Visual C++, 32-bit Editions 4.0
  • Microsoft Visual C++, 32-bit Editions 4.1
  • Microsoft Visual C++, 32-bit Editions 4.2
  • Microsoft Visual C++, 32-bit Editions 5.0
  • Microsoft Visual C++, 32-bit Editions 6.0

This article was previously published under Q88092

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 that this is a problem in the Microsoft products that are 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;
   }
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbBug KB88092