Microsoft KB Archive/88092

= BUG: Cannot Access Static Data Members in Inline Assembly =

Article ID: 88092

Article Last Modified on 7/5/2005

-

APPLIES TO


 * Microsoft C/C++ Professional Development System 7.0
 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 1.5 Professional Edition
 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 2.0 Professional Edition
 * Microsoft Visual C++ 2.1
 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 4.1 Subscription
 * Microsoft Visual C++ 4.2 Professional Edition
 * Microsoft Visual C++ 5.0 Standard Edition
 * Microsoft Visual C++ 6.0 Service Pack 5

-



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 

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( &quot;aSample.value = %d.\n&quot;, aSample.value ); return 0; }

Additional query words: 8.00 8.00c 9.00 10.00 10.10 10.20

Keywords: kbbug KB88092

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.