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